From a9af496221585dcb024428945bf082c26f2604c5 Mon Sep 17 00:00:00 2001 From: Zarmeena26 Date: Thu, 9 Apr 2026 17:14:33 +0500 Subject: [PATCH 01/39] Member 3: Set up GitHub Actions CI/CD Pipeline --- .../11-Blueprints/.github/workflows/ci-cd.yml | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 Python/Flask_Blog/11-Blueprints/.github/workflows/ci-cd.yml diff --git a/Python/Flask_Blog/11-Blueprints/.github/workflows/ci-cd.yml b/Python/Flask_Blog/11-Blueprints/.github/workflows/ci-cd.yml new file mode 100644 index 000000000..631a43085 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/.github/workflows/ci-cd.yml @@ -0,0 +1,26 @@ +name: DevSecOps-Pipeline + +on: + push: + branches: [ "develop", "main" ] + pull_request: + branches: [ "develop" ] + +jobs: + security-scan: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install Bandit + run: pip install bandit + + - name: Run SAST Scan (Bandit) + # This scans your code and fails the pipeline if high issues exist + run: bandit -r . -ll -ii From b5009eed7be4e00999598dbceadcce20894ca0e5 Mon Sep 17 00:00:00 2001 From: Zarmeena26 Date: Thu, 9 Apr 2026 17:31:58 +0500 Subject: [PATCH 02/39] Fix CI/CD trigger --- .../Flask_Blog/11-Blueprints/.github/workflows/ci-cd.yml | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/Python/Flask_Blog/11-Blueprints/.github/workflows/ci-cd.yml b/Python/Flask_Blog/11-Blueprints/.github/workflows/ci-cd.yml index 631a43085..f93966adc 100644 --- a/Python/Flask_Blog/11-Blueprints/.github/workflows/ci-cd.yml +++ b/Python/Flask_Blog/11-Blueprints/.github/workflows/ci-cd.yml @@ -1,10 +1,6 @@ name: DevSecOps-Pipeline -on: - push: - branches: [ "develop", "main" ] - pull_request: - branches: [ "develop" ] +on: [push, pull_request] jobs: security-scan: @@ -21,6 +17,5 @@ jobs: - name: Install Bandit run: pip install bandit - - name: Run SAST Scan (Bandit) - # This scans your code and fails the pipeline if high issues exist + - name: Run SAST Scan run: bandit -r . -ll -ii From 13e346237f6965c751ad4793ddfaad56a42f8e62 Mon Sep 17 00:00:00 2001 From: Zarmeena26 Date: Thu, 9 Apr 2026 17:35:52 +0500 Subject: [PATCH 03/39] Fix YAML indentation for Member 3 --- Python/Flask_Blog/11-Blueprints/.github/workflows/ci-cd.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Python/Flask_Blog/11-Blueprints/.github/workflows/ci-cd.yml b/Python/Flask_Blog/11-Blueprints/.github/workflows/ci-cd.yml index f93966adc..93580c713 100644 --- a/Python/Flask_Blog/11-Blueprints/.github/workflows/ci-cd.yml +++ b/Python/Flask_Blog/11-Blueprints/.github/workflows/ci-cd.yml @@ -1,6 +1,10 @@ name: DevSecOps-Pipeline -on: [push, pull_request] +on: + push: + branches: [ "feature/ci-cd-pipeline", "main", "develop" ] + pull_request: + branches: [ "feature/ci-cd-pipeline", "main", "develop" ] jobs: security-scan: From a78db4c337d426c99bad3fdf6d617807a2ee09fd Mon Sep 17 00:00:00 2001 From: Zarmeena26 Date: Thu, 9 Apr 2026 17:40:25 +0500 Subject: [PATCH 04/39] Member 3: Finalizing security fixes and CI/CD --- Python/Flask_Blog/11-Blueprints/run.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Python/Flask_Blog/11-Blueprints/run.py b/Python/Flask_Blog/11-Blueprints/run.py index d715adcd6..9d7fea29f 100644 --- a/Python/Flask_Blog/11-Blueprints/run.py +++ b/Python/Flask_Blog/11-Blueprints/run.py @@ -3,4 +3,4 @@ app = create_app() if __name__ == '__main__': - app.run(debug=True) + app.run(debug=False) From c858197d353c4ba5c572070697fbc84943b15317 Mon Sep 17 00:00:00 2001 From: Zarmeena26 Date: Thu, 9 Apr 2026 17:49:53 +0500 Subject: [PATCH 05/39] Member 3: Moving CI/CD to root --- .github/workflows/ci-cd.yml | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 .github/workflows/ci-cd.yml diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml new file mode 100644 index 000000000..93580c713 --- /dev/null +++ b/.github/workflows/ci-cd.yml @@ -0,0 +1,25 @@ +name: DevSecOps-Pipeline + +on: + push: + branches: [ "feature/ci-cd-pipeline", "main", "develop" ] + pull_request: + branches: [ "feature/ci-cd-pipeline", "main", "develop" ] + +jobs: + security-scan: + runs-on: ubuntu-latest + steps: + - name: Checkout Code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: '3.12' + + - name: Install Bandit + run: pip install bandit + + - name: Run SAST Scan + run: bandit -r . -ll -ii From f0ad0cf6ff9425bfc9bbb0664f896c90bdb09312 Mon Sep 17 00:00:00 2001 From: Zarmeena26 Date: Thu, 9 Apr 2026 18:00:44 +0500 Subject: [PATCH 06/39] Member 3: Exclude legacy examples from scan --- .github/workflows/ci-cd.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index 93580c713..2500d3af8 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -22,4 +22,4 @@ jobs: run: pip install bandit - name: Run SAST Scan - run: bandit -r . -ll -ii + run: bandit -r . -ll -x ./Python-Snippets,./venv From 81092707b0f19a41157d7367ec0597b607d43e30 Mon Sep 17 00:00:00 2001 From: Zarmeena26 Date: Thu, 9 Apr 2026 18:03:33 +0500 Subject: [PATCH 07/39] Member 3: Excluding all legacy syntax error folders --- .github/workflows/ci-cd.yml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml index 2500d3af8..d5143f6e8 100644 --- a/.github/workflows/ci-cd.yml +++ b/.github/workflows/ci-cd.yml @@ -1,10 +1,6 @@ name: DevSecOps-Pipeline -on: - push: - branches: [ "feature/ci-cd-pipeline", "main", "develop" ] - pull_request: - branches: [ "feature/ci-cd-pipeline", "main", "develop" ] +on: [push, pull_request] jobs: security-scan: @@ -22,4 +18,5 @@ jobs: run: pip install bandit - name: Run SAST Scan - run: bandit -r . -ll -x ./Python-Snippets,./venv + # This excludes the legacy folders causing syntax errors + run: bandit -r . -ll -x ./venv,./Closure,./Combinations-Permutations,./For_Else,./Generators,./Idempotence,./List_Comp,./Memoization,./Mutable,./NamedTuples,./Python,./Slicing,./Str_Repr,./String\ Interpolation From 1b0bfb027ea05ed34bf2661cdf463f36c1818c5c Mon Sep 17 00:00:00 2001 From: Zarmeena26 Date: Thu, 9 Apr 2026 18:15:31 +0500 Subject: [PATCH 08/39] Fix all Bandit Medium issues: added timeouts and updated urlopen --- BeautifulSoup/scrape.py | 2 +- Python-JSON/api.py | 8 +- Python-Unit-Testing/employee.py | 2 +- .../11-Blueprints/bandit_report.html | 57567 ++++++++++++++++ .../11-Blueprints/bandit_report_updated.html | 57346 +++++++++++++++ .../Flask_Blog/11-Blueprints/instance/site.db | Bin 0 -> 20480 bytes .../Flask_Blog/11-Blueprints/trojansource.py | 0 .../11-Blueprints/venv/bin/Activate.ps1 | 247 + .../11-Blueprints/venv/bin/activate | 70 + .../11-Blueprints/venv/bin/activate.csh | 27 + .../11-Blueprints/venv/bin/activate.fish | 69 + .../Flask_Blog/11-Blueprints/venv/bin/bandit | 8 + .../11-Blueprints/venv/bin/bandit-baseline | 8 + .../venv/bin/bandit-config-generator | 8 + .../11-Blueprints/venv/bin/email_validator | 8 + .../Flask_Blog/11-Blueprints/venv/bin/flask | 8 + .../11-Blueprints/venv/bin/markdown-it | 8 + Python/Flask_Blog/11-Blueprints/venv/bin/pip | 8 + Python/Flask_Blog/11-Blueprints/venv/bin/pip3 | 8 + .../Flask_Blog/11-Blueprints/venv/bin/pip3.12 | 8 + .../11-Blueprints/venv/bin/pygmentize | 8 + .../Flask_Blog/11-Blueprints/venv/bin/python | 1 + .../Flask_Blog/11-Blueprints/venv/bin/python3 | 1 + .../11-Blueprints/venv/bin/python3.12 | 1 + .../site/python3.12/greenlet/greenlet.h | 164 + .../Flask_Bcrypt-1.0.1.dist-info/INSTALLER | 1 + .../Flask_Bcrypt-1.0.1.dist-info/LICENSE | 31 + .../Flask_Bcrypt-1.0.1.dist-info/METADATA | 74 + .../Flask_Bcrypt-1.0.1.dist-info/RECORD | 9 + .../Flask_Bcrypt-1.0.1.dist-info/REQUESTED | 0 .../Flask_Bcrypt-1.0.1.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../Flask_Login-0.6.3.dist-info/INSTALLER | 1 + .../Flask_Login-0.6.3.dist-info/LICENSE | 22 + .../Flask_Login-0.6.3.dist-info/METADATA | 183 + .../Flask_Login-0.6.3.dist-info/RECORD | 23 + .../Flask_Login-0.6.3.dist-info/REQUESTED | 0 .../Flask_Login-0.6.3.dist-info/WHEEL | 5 + .../Flask_Login-0.6.3.dist-info/top_level.txt | 1 + .../site-packages/PIL/AvifImagePlugin.py | 294 + .../site-packages/PIL/BdfFontFile.py | 123 + .../site-packages/PIL/BlpImagePlugin.py | 498 + .../site-packages/PIL/BmpImagePlugin.py | 514 + .../site-packages/PIL/BufrStubImagePlugin.py | 72 + .../site-packages/PIL/ContainerIO.py | 173 + .../site-packages/PIL/CurImagePlugin.py | 75 + .../site-packages/PIL/DcxImagePlugin.py | 84 + .../site-packages/PIL/DdsImagePlugin.py | 625 + .../site-packages/PIL/EpsImagePlugin.py | 481 + .../python3.12/site-packages/PIL/ExifTags.py | 384 + .../site-packages/PIL/FitsImagePlugin.py | 153 + .../site-packages/PIL/FliImagePlugin.py | 184 + .../python3.12/site-packages/PIL/FontFile.py | 159 + .../site-packages/PIL/FpxImagePlugin.py | 258 + .../site-packages/PIL/FtexImagePlugin.py | 115 + .../site-packages/PIL/GbrImagePlugin.py | 103 + .../site-packages/PIL/GdImageFile.py | 103 + .../site-packages/PIL/GifImagePlugin.py | 1223 + .../site-packages/PIL/GimpGradientFile.py | 154 + .../site-packages/PIL/GimpPaletteFile.py | 75 + .../site-packages/PIL/GribStubImagePlugin.py | 72 + .../site-packages/PIL/Hdf5StubImagePlugin.py | 72 + .../site-packages/PIL/IcnsImagePlugin.py | 401 + .../site-packages/PIL/IcoImagePlugin.py | 396 + .../site-packages/PIL/ImImagePlugin.py | 390 + .../lib/python3.12/site-packages/PIL/Image.py | 4381 ++ .../site-packages/PIL/ImageChops.py | 311 + .../python3.12/site-packages/PIL/ImageCms.py | 1076 + .../site-packages/PIL/ImageColor.py | 320 + .../python3.12/site-packages/PIL/ImageDraw.py | 1035 + .../site-packages/PIL/ImageDraw2.py | 244 + .../site-packages/PIL/ImageEnhance.py | 113 + .../python3.12/site-packages/PIL/ImageFile.py | 935 + .../site-packages/PIL/ImageFilter.py | 607 + .../python3.12/site-packages/PIL/ImageFont.py | 1309 + .../python3.12/site-packages/PIL/ImageGrab.py | 231 + .../python3.12/site-packages/PIL/ImageMath.py | 314 + .../python3.12/site-packages/PIL/ImageMode.py | 85 + .../site-packages/PIL/ImageMorph.py | 317 + .../python3.12/site-packages/PIL/ImageOps.py | 746 + .../site-packages/PIL/ImagePalette.py | 290 + .../python3.12/site-packages/PIL/ImagePath.py | 20 + .../python3.12/site-packages/PIL/ImageQt.py | 219 + .../site-packages/PIL/ImageSequence.py | 88 + .../python3.12/site-packages/PIL/ImageShow.py | 362 + .../python3.12/site-packages/PIL/ImageStat.py | 167 + .../python3.12/site-packages/PIL/ImageText.py | 508 + .../python3.12/site-packages/PIL/ImageTk.py | 266 + .../site-packages/PIL/ImageTransform.py | 136 + .../python3.12/site-packages/PIL/ImageWin.py | 247 + .../site-packages/PIL/ImtImagePlugin.py | 103 + .../site-packages/PIL/IptcImagePlugin.py | 226 + .../site-packages/PIL/Jpeg2KImagePlugin.py | 460 + .../site-packages/PIL/JpegImagePlugin.py | 889 + .../site-packages/PIL/JpegPresets.py | 242 + .../site-packages/PIL/McIdasImagePlugin.py | 78 + .../site-packages/PIL/MicImagePlugin.py | 103 + .../site-packages/PIL/MpegImagePlugin.py | 84 + .../site-packages/PIL/MpoImagePlugin.py | 203 + .../site-packages/PIL/MspImagePlugin.py | 200 + .../python3.12/site-packages/PIL/PSDraw.py | 238 + .../site-packages/PIL/PaletteFile.py | 54 + .../site-packages/PIL/PalmImagePlugin.py | 217 + .../site-packages/PIL/PcdImagePlugin.py | 68 + .../site-packages/PIL/PcfFontFile.py | 258 + .../site-packages/PIL/PcxImagePlugin.py | 232 + .../site-packages/PIL/PdfImagePlugin.py | 311 + .../python3.12/site-packages/PIL/PdfParser.py | 1081 + .../site-packages/PIL/PixarImagePlugin.py | 72 + .../site-packages/PIL/PngImagePlugin.py | 1563 + .../site-packages/PIL/PpmImagePlugin.py | 375 + .../site-packages/PIL/PsdImagePlugin.py | 337 + .../site-packages/PIL/QoiImagePlugin.py | 235 + .../site-packages/PIL/SgiImagePlugin.py | 231 + .../site-packages/PIL/SpiderImagePlugin.py | 332 + .../site-packages/PIL/SunImagePlugin.py | 145 + .../lib/python3.12/site-packages/PIL/TarIO.py | 61 + .../site-packages/PIL/TgaImagePlugin.py | 280 + .../site-packages/PIL/TiffImagePlugin.py | 2353 + .../python3.12/site-packages/PIL/TiffTags.py | 566 + .../site-packages/PIL/WalImageFile.py | 129 + .../site-packages/PIL/WebPImagePlugin.py | 317 + .../site-packages/PIL/WmfImagePlugin.py | 183 + .../site-packages/PIL/XVThumbImagePlugin.py | 83 + .../site-packages/PIL/XbmImagePlugin.py | 98 + .../site-packages/PIL/XpmImagePlugin.py | 157 + .../python3.12/site-packages/PIL/__init__.py | 87 + .../python3.12/site-packages/PIL/__main__.py | 7 + .../PIL/_avif.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 91985 bytes .../python3.12/site-packages/PIL/_avif.pyi | 3 + .../python3.12/site-packages/PIL/_binary.py | 113 + .../site-packages/PIL/_deprecate.py | 72 + .../_imaging.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 3365761 bytes .../python3.12/site-packages/PIL/_imaging.pyi | 31 + ...imagingcms.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 157841 bytes .../site-packages/PIL/_imagingcms.pyi | 143 + ..._imagingft.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 331169 bytes .../site-packages/PIL/_imagingft.pyi | 70 + ...magingmath.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 167696 bytes .../site-packages/PIL/_imagingmath.pyi | 3 + ...agingmorph.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 38448 bytes .../site-packages/PIL/_imagingmorph.pyi | 3 + ..._imagingtk.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 47000 bytes .../site-packages/PIL/_imagingtk.pyi | 3 + .../site-packages/PIL/_tkinter_finder.py | 20 + .../python3.12/site-packages/PIL/_typing.py | 45 + .../lib/python3.12/site-packages/PIL/_util.py | 29 + .../python3.12/site-packages/PIL/_version.py | 4 + .../PIL/_webp.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 108849 bytes .../python3.12/site-packages/PIL/_webp.pyi | 3 + .../python3.12/site-packages/PIL/features.py | 343 + .../lib/python3.12/site-packages/PIL/py.typed | 0 .../python3.12/site-packages/PIL/report.py | 5 + .../site-packages/_yaml/__init__.py | 33 + .../bandit-1.9.4.dist-info/INSTALLER | 1 + .../bandit-1.9.4.dist-info/METADATA | 212 + .../bandit-1.9.4.dist-info/RECORD | 151 + .../bandit-1.9.4.dist-info/REQUESTED | 0 .../bandit-1.9.4.dist-info/WHEEL | 5 + .../bandit-1.9.4.dist-info/entry_points.txt | 63 + .../bandit-1.9.4.dist-info/licenses/LICENSE | 175 + .../bandit-1.9.4.dist-info/pbr.json | 1 + .../bandit-1.9.4.dist-info/top_level.txt | 1 + .../site-packages/bandit/__init__.py | 20 + .../site-packages/bandit/__main__.py | 17 + .../bandit/blacklists/__init__.py | 0 .../site-packages/bandit/blacklists/calls.py | 670 + .../bandit/blacklists/imports.py | 425 + .../site-packages/bandit/blacklists/utils.py | 17 + .../site-packages/bandit/cli/__init__.py | 0 .../site-packages/bandit/cli/baseline.py | 252 + .../bandit/cli/config_generator.py | 207 + .../site-packages/bandit/cli/main.py | 701 + .../site-packages/bandit/core/__init__.py | 15 + .../site-packages/bandit/core/blacklisting.py | 72 + .../site-packages/bandit/core/config.py | 271 + .../site-packages/bandit/core/constants.py | 40 + .../site-packages/bandit/core/context.py | 316 + .../site-packages/bandit/core/docs_utils.py | 54 + .../bandit/core/extension_loader.py | 114 + .../site-packages/bandit/core/issue.py | 245 + .../site-packages/bandit/core/manager.py | 499 + .../site-packages/bandit/core/meta_ast.py | 44 + .../site-packages/bandit/core/metrics.py | 106 + .../site-packages/bandit/core/node_visitor.py | 297 + .../bandit/core/test_properties.py | 83 + .../site-packages/bandit/core/test_set.py | 114 + .../site-packages/bandit/core/tester.py | 168 + .../site-packages/bandit/core/utils.py | 398 + .../bandit/formatters/__init__.py | 0 .../site-packages/bandit/formatters/csv.py | 82 + .../site-packages/bandit/formatters/custom.py | 161 + .../site-packages/bandit/formatters/html.py | 394 + .../site-packages/bandit/formatters/json.py | 155 + .../site-packages/bandit/formatters/sarif.py | 374 + .../site-packages/bandit/formatters/screen.py | 244 + .../site-packages/bandit/formatters/text.py | 200 + .../site-packages/bandit/formatters/utils.py | 14 + .../site-packages/bandit/formatters/xml.py | 97 + .../site-packages/bandit/formatters/yaml.py | 126 + .../site-packages/bandit/plugins/__init__.py | 0 .../site-packages/bandit/plugins/app_debug.py | 63 + .../site-packages/bandit/plugins/asserts.py | 83 + .../crypto_request_no_cert_validation.py | 75 + .../bandit/plugins/django_sql_injection.py | 155 + .../bandit/plugins/django_xss.py | 287 + .../site-packages/bandit/plugins/exec.py | 55 + .../plugins/general_bad_file_permissions.py | 99 + .../plugins/general_bind_all_interfaces.py | 52 + .../plugins/general_hardcoded_password.py | 282 + .../bandit/plugins/general_hardcoded_tmp.py | 79 + .../plugins/hashlib_insecure_functions.py | 121 + .../plugins/huggingface_unsafe_download.py | 166 + .../bandit/plugins/injection_paramiko.py | 63 + .../bandit/plugins/injection_shell.py | 706 + .../bandit/plugins/injection_sql.py | 143 + .../bandit/plugins/injection_wildcard.py | 144 + .../bandit/plugins/insecure_ssl_tls.py | 285 + .../bandit/plugins/jinja2_templates.py | 134 + .../plugins/logging_config_insecure_listen.py | 58 + .../bandit/plugins/mako_templates.py | 69 + .../bandit/plugins/markupsafe_markup_xss.py | 118 + .../bandit/plugins/pytorch_load.py | 77 + .../bandit/plugins/request_without_timeout.py | 84 + .../bandit/plugins/snmp_security_check.py | 110 + .../plugins/ssh_no_host_key_verification.py | 76 + .../bandit/plugins/tarfile_unsafe_members.py | 121 + .../bandit/plugins/trojansource.py | 82 + .../bandit/plugins/try_except_continue.py | 108 + .../bandit/plugins/try_except_pass.py | 106 + .../bandit/plugins/weak_cryptographic_key.py | 165 + .../site-packages/bandit/plugins/yaml_load.py | 76 + .../bcrypt-5.0.0.dist-info/INSTALLER | 1 + .../bcrypt-5.0.0.dist-info/METADATA | 343 + .../bcrypt-5.0.0.dist-info/RECORD | 11 + .../bcrypt-5.0.0.dist-info/WHEEL | 5 + .../bcrypt-5.0.0.dist-info/licenses/LICENSE | 201 + .../bcrypt-5.0.0.dist-info/top_level.txt | 1 + .../site-packages/bcrypt/__init__.py | 43 + .../site-packages/bcrypt/__init__.pyi | 10 + .../site-packages/bcrypt/_bcrypt.abi3.so | Bin 0 -> 631768 bytes .../python3.12/site-packages/bcrypt/py.typed | 0 .../blinker-1.9.0.dist-info/INSTALLER | 1 + .../blinker-1.9.0.dist-info/LICENSE.txt | 20 + .../blinker-1.9.0.dist-info/METADATA | 60 + .../blinker-1.9.0.dist-info/RECORD | 12 + .../blinker-1.9.0.dist-info/WHEEL | 4 + .../site-packages/blinker/__init__.py | 17 + .../site-packages/blinker/_utilities.py | 64 + .../python3.12/site-packages/blinker/base.py | 512 + .../python3.12/site-packages/blinker/py.typed | 0 .../click-8.3.2.dist-info/INSTALLER | 1 + .../click-8.3.2.dist-info/METADATA | 84 + .../click-8.3.2.dist-info/RECORD | 40 + .../site-packages/click-8.3.2.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 28 + .../site-packages/click/__init__.py | 123 + .../python3.12/site-packages/click/_compat.py | 622 + .../site-packages/click/_termui_impl.py | 852 + .../site-packages/click/_textwrap.py | 51 + .../python3.12/site-packages/click/_utils.py | 36 + .../site-packages/click/_winconsole.py | 296 + .../python3.12/site-packages/click/core.py | 3437 + .../site-packages/click/decorators.py | 551 + .../site-packages/click/exceptions.py | 308 + .../site-packages/click/formatting.py | 301 + .../python3.12/site-packages/click/globals.py | 67 + .../python3.12/site-packages/click/parser.py | 532 + .../python3.12/site-packages/click/py.typed | 0 .../site-packages/click/shell_completion.py | 667 + .../python3.12/site-packages/click/termui.py | 883 + .../python3.12/site-packages/click/testing.py | 574 + .../python3.12/site-packages/click/types.py | 1209 + .../python3.12/site-packages/click/utils.py | 627 + .../python3.12/site-packages/dns/__init__.py | 72 + .../site-packages/dns/_asyncbackend.py | 100 + .../site-packages/dns/_asyncio_backend.py | 276 + .../lib/python3.12/site-packages/dns/_ddr.py | 154 + .../python3.12/site-packages/dns/_features.py | 95 + .../site-packages/dns/_immutable_ctx.py | 76 + .../python3.12/site-packages/dns/_no_ssl.py | 61 + .../python3.12/site-packages/dns/_tls_util.py | 19 + .../site-packages/dns/_trio_backend.py | 255 + .../site-packages/dns/asyncbackend.py | 101 + .../site-packages/dns/asyncquery.py | 953 + .../site-packages/dns/asyncresolver.py | 478 + .../lib/python3.12/site-packages/dns/btree.py | 850 + .../python3.12/site-packages/dns/btreezone.py | 367 + .../python3.12/site-packages/dns/dnssec.py | 1242 + .../site-packages/dns/dnssecalgs/__init__.py | 124 + .../site-packages/dns/dnssecalgs/base.py | 89 + .../dns/dnssecalgs/cryptography.py | 68 + .../site-packages/dns/dnssecalgs/dsa.py | 108 + .../site-packages/dns/dnssecalgs/ecdsa.py | 100 + .../site-packages/dns/dnssecalgs/eddsa.py | 70 + .../site-packages/dns/dnssecalgs/rsa.py | 126 + .../site-packages/dns/dnssectypes.py | 71 + .../lib/python3.12/site-packages/dns/e164.py | 116 + .../lib/python3.12/site-packages/dns/edns.py | 591 + .../python3.12/site-packages/dns/entropy.py | 130 + .../lib/python3.12/site-packages/dns/enum.py | 113 + .../python3.12/site-packages/dns/exception.py | 169 + .../lib/python3.12/site-packages/dns/flags.py | 123 + .../python3.12/site-packages/dns/grange.py | 72 + .../python3.12/site-packages/dns/immutable.py | 68 + .../lib/python3.12/site-packages/dns/inet.py | 195 + .../lib/python3.12/site-packages/dns/ipv4.py | 76 + .../lib/python3.12/site-packages/dns/ipv6.py | 217 + .../python3.12/site-packages/dns/message.py | 1954 + .../lib/python3.12/site-packages/dns/name.py | 1289 + .../python3.12/site-packages/dns/namedict.py | 109 + .../site-packages/dns/nameserver.py | 361 + .../lib/python3.12/site-packages/dns/node.py | 358 + .../python3.12/site-packages/dns/opcode.py | 119 + .../lib/python3.12/site-packages/dns/py.typed | 0 .../lib/python3.12/site-packages/dns/query.py | 1786 + .../site-packages/dns/quic/__init__.py | 78 + .../site-packages/dns/quic/_asyncio.py | 276 + .../site-packages/dns/quic/_common.py | 344 + .../site-packages/dns/quic/_sync.py | 306 + .../site-packages/dns/quic/_trio.py | 250 + .../lib/python3.12/site-packages/dns/rcode.py | 168 + .../lib/python3.12/site-packages/dns/rdata.py | 935 + .../site-packages/dns/rdataclass.py | 118 + .../python3.12/site-packages/dns/rdataset.py | 508 + .../python3.12/site-packages/dns/rdatatype.py | 338 + .../site-packages/dns/rdtypes/ANY/AFSDB.py | 45 + .../site-packages/dns/rdtypes/ANY/AMTRELAY.py | 89 + .../site-packages/dns/rdtypes/ANY/AVC.py | 26 + .../site-packages/dns/rdtypes/ANY/CAA.py | 67 + .../site-packages/dns/rdtypes/ANY/CDNSKEY.py | 33 + .../site-packages/dns/rdtypes/ANY/CDS.py | 29 + .../site-packages/dns/rdtypes/ANY/CERT.py | 113 + .../site-packages/dns/rdtypes/ANY/CNAME.py | 28 + .../site-packages/dns/rdtypes/ANY/CSYNC.py | 68 + .../site-packages/dns/rdtypes/ANY/DLV.py | 24 + .../site-packages/dns/rdtypes/ANY/DNAME.py | 27 + .../site-packages/dns/rdtypes/ANY/DNSKEY.py | 33 + .../site-packages/dns/rdtypes/ANY/DS.py | 24 + .../site-packages/dns/rdtypes/ANY/DSYNC.py | 72 + .../site-packages/dns/rdtypes/ANY/EUI48.py | 30 + .../site-packages/dns/rdtypes/ANY/EUI64.py | 30 + .../site-packages/dns/rdtypes/ANY/GPOS.py | 126 + .../site-packages/dns/rdtypes/ANY/HINFO.py | 64 + .../site-packages/dns/rdtypes/ANY/HIP.py | 85 + .../site-packages/dns/rdtypes/ANY/ISDN.py | 78 + .../site-packages/dns/rdtypes/ANY/L32.py | 42 + .../site-packages/dns/rdtypes/ANY/L64.py | 48 + .../site-packages/dns/rdtypes/ANY/LOC.py | 347 + .../site-packages/dns/rdtypes/ANY/LP.py | 42 + .../site-packages/dns/rdtypes/ANY/MX.py | 24 + .../site-packages/dns/rdtypes/ANY/NID.py | 48 + .../site-packages/dns/rdtypes/ANY/NINFO.py | 26 + .../site-packages/dns/rdtypes/ANY/NS.py | 24 + .../site-packages/dns/rdtypes/ANY/NSEC.py | 67 + .../site-packages/dns/rdtypes/ANY/NSEC3.py | 120 + .../dns/rdtypes/ANY/NSEC3PARAM.py | 69 + .../dns/rdtypes/ANY/OPENPGPKEY.py | 53 + .../site-packages/dns/rdtypes/ANY/OPT.py | 77 + .../site-packages/dns/rdtypes/ANY/PTR.py | 24 + .../site-packages/dns/rdtypes/ANY/RESINFO.py | 24 + .../site-packages/dns/rdtypes/ANY/RP.py | 58 + .../site-packages/dns/rdtypes/ANY/RRSIG.py | 155 + .../site-packages/dns/rdtypes/ANY/RT.py | 24 + .../site-packages/dns/rdtypes/ANY/SMIMEA.py | 9 + .../site-packages/dns/rdtypes/ANY/SOA.py | 78 + .../site-packages/dns/rdtypes/ANY/SPF.py | 26 + .../site-packages/dns/rdtypes/ANY/SSHFP.py | 67 + .../site-packages/dns/rdtypes/ANY/TKEY.py | 135 + .../site-packages/dns/rdtypes/ANY/TLSA.py | 9 + .../site-packages/dns/rdtypes/ANY/TSIG.py | 160 + .../site-packages/dns/rdtypes/ANY/TXT.py | 24 + .../site-packages/dns/rdtypes/ANY/URI.py | 79 + .../site-packages/dns/rdtypes/ANY/WALLET.py | 9 + .../site-packages/dns/rdtypes/ANY/X25.py | 57 + .../site-packages/dns/rdtypes/ANY/ZONEMD.py | 64 + .../site-packages/dns/rdtypes/ANY/__init__.py | 71 + .../site-packages/dns/rdtypes/CH/A.py | 60 + .../site-packages/dns/rdtypes/CH/__init__.py | 22 + .../site-packages/dns/rdtypes/IN/A.py | 51 + .../site-packages/dns/rdtypes/IN/AAAA.py | 51 + .../site-packages/dns/rdtypes/IN/APL.py | 150 + .../site-packages/dns/rdtypes/IN/DHCID.py | 54 + .../site-packages/dns/rdtypes/IN/HTTPS.py | 9 + .../site-packages/dns/rdtypes/IN/IPSECKEY.py | 87 + .../site-packages/dns/rdtypes/IN/KX.py | 24 + .../site-packages/dns/rdtypes/IN/NAPTR.py | 109 + .../site-packages/dns/rdtypes/IN/NSAP.py | 60 + .../site-packages/dns/rdtypes/IN/NSAP_PTR.py | 24 + .../site-packages/dns/rdtypes/IN/PX.py | 73 + .../site-packages/dns/rdtypes/IN/SRV.py | 75 + .../site-packages/dns/rdtypes/IN/SVCB.py | 9 + .../site-packages/dns/rdtypes/IN/WKS.py | 100 + .../site-packages/dns/rdtypes/IN/__init__.py | 35 + .../site-packages/dns/rdtypes/__init__.py | 33 + .../site-packages/dns/rdtypes/dnskeybase.py | 83 + .../site-packages/dns/rdtypes/dsbase.py | 83 + .../site-packages/dns/rdtypes/euibase.py | 73 + .../site-packages/dns/rdtypes/mxbase.py | 87 + .../site-packages/dns/rdtypes/nsbase.py | 63 + .../site-packages/dns/rdtypes/svcbbase.py | 587 + .../site-packages/dns/rdtypes/tlsabase.py | 69 + .../site-packages/dns/rdtypes/txtbase.py | 109 + .../site-packages/dns/rdtypes/util.py | 269 + .../python3.12/site-packages/dns/renderer.py | 355 + .../python3.12/site-packages/dns/resolver.py | 2068 + .../site-packages/dns/reversename.py | 106 + .../lib/python3.12/site-packages/dns/rrset.py | 287 + .../python3.12/site-packages/dns/serial.py | 118 + .../lib/python3.12/site-packages/dns/set.py | 308 + .../python3.12/site-packages/dns/tokenizer.py | 706 + .../site-packages/dns/transaction.py | 651 + .../lib/python3.12/site-packages/dns/tsig.py | 359 + .../site-packages/dns/tsigkeyring.py | 68 + .../lib/python3.12/site-packages/dns/ttl.py | 90 + .../python3.12/site-packages/dns/update.py | 389 + .../python3.12/site-packages/dns/version.py | 42 + .../python3.12/site-packages/dns/versioned.py | 320 + .../python3.12/site-packages/dns/win32util.py | 438 + .../lib/python3.12/site-packages/dns/wire.py | 98 + .../lib/python3.12/site-packages/dns/xfr.py | 356 + .../lib/python3.12/site-packages/dns/zone.py | 1462 + .../python3.12/site-packages/dns/zonefile.py | 756 + .../python3.12/site-packages/dns/zonetypes.py | 37 + .../dnspython-2.8.0.dist-info/INSTALLER | 1 + .../dnspython-2.8.0.dist-info/METADATA | 149 + .../dnspython-2.8.0.dist-info/RECORD | 304 + .../dnspython-2.8.0.dist-info/WHEEL | 4 + .../licenses/LICENSE | 35 + .../email_validator-2.3.0.dist-info/INSTALLER | 1 + .../email_validator-2.3.0.dist-info/METADATA | 466 + .../email_validator-2.3.0.dist-info/RECORD | 28 + .../email_validator-2.3.0.dist-info/REQUESTED | 0 .../email_validator-2.3.0.dist-info/WHEEL | 5 + .../entry_points.txt | 2 + .../licenses/LICENSE | 27 + .../top_level.txt | 1 + .../site-packages/email_validator/__init__.py | 103 + .../site-packages/email_validator/__main__.py | 61 + .../email_validator/deliverability.py | 159 + .../email_validator/exceptions.py | 13 + .../site-packages/email_validator/py.typed | 0 .../email_validator/rfc_constants.py | 63 + .../site-packages/email_validator/syntax.py | 822 + .../site-packages/email_validator/types.py | 126 + .../email_validator/validate_email.py | 209 + .../site-packages/email_validator/version.py | 1 + .../flask-3.1.3.dist-info/INSTALLER | 1 + .../flask-3.1.3.dist-info/METADATA | 91 + .../flask-3.1.3.dist-info/RECORD | 58 + .../flask-3.1.3.dist-info/REQUESTED | 0 .../site-packages/flask-3.1.3.dist-info/WHEEL | 4 + .../flask-3.1.3.dist-info/entry_points.txt | 3 + .../licenses/LICENSE.txt | 28 + .../site-packages/flask/__init__.py | 61 + .../site-packages/flask/__main__.py | 3 + .../lib/python3.12/site-packages/flask/app.py | 1536 + .../site-packages/flask/blueprints.py | 128 + .../lib/python3.12/site-packages/flask/cli.py | 1135 + .../python3.12/site-packages/flask/config.py | 367 + .../lib/python3.12/site-packages/flask/ctx.py | 459 + .../site-packages/flask/debughelpers.py | 178 + .../python3.12/site-packages/flask/globals.py | 51 + .../python3.12/site-packages/flask/helpers.py | 641 + .../site-packages/flask/json/__init__.py | 170 + .../site-packages/flask/json/provider.py | 215 + .../site-packages/flask/json/tag.py | 327 + .../python3.12/site-packages/flask/logging.py | 79 + .../python3.12/site-packages/flask/py.typed | 0 .../site-packages/flask/sansio/README.md | 6 + .../site-packages/flask/sansio/app.py | 964 + .../site-packages/flask/sansio/blueprints.py | 632 + .../site-packages/flask/sansio/scaffold.py | 792 + .../site-packages/flask/sessions.py | 385 + .../python3.12/site-packages/flask/signals.py | 17 + .../site-packages/flask/templating.py | 220 + .../python3.12/site-packages/flask/testing.py | 298 + .../python3.12/site-packages/flask/typing.py | 93 + .../python3.12/site-packages/flask/views.py | 191 + .../site-packages/flask/wrappers.py | 257 + .../python3.12/site-packages/flask_bcrypt.py | 225 + .../site-packages/flask_login/__about__.py | 10 + .../site-packages/flask_login/__init__.py | 94 + .../site-packages/flask_login/config.py | 55 + .../flask_login/login_manager.py | 543 + .../site-packages/flask_login/mixins.py | 65 + .../site-packages/flask_login/signals.py | 61 + .../site-packages/flask_login/test_client.py | 19 + .../site-packages/flask_login/utils.py | 415 + .../flask_mail-0.10.0.dist-info/INSTALLER | 1 + .../flask_mail-0.10.0.dist-info/LICENSE.txt | 28 + .../flask_mail-0.10.0.dist-info/METADATA | 68 + .../flask_mail-0.10.0.dist-info/RECORD | 9 + .../flask_mail-0.10.0.dist-info/REQUESTED | 0 .../flask_mail-0.10.0.dist-info/WHEEL | 4 + .../site-packages/flask_mail/__init__.py | 660 + .../site-packages/flask_mail/py.typed | 0 .../INSTALLER | 1 + .../LICENSE.rst | 28 + .../flask_sqlalchemy-3.1.1.dist-info/METADATA | 109 + .../flask_sqlalchemy-3.1.1.dist-info/RECORD | 27 + .../REQUESTED | 0 .../flask_sqlalchemy-3.1.1.dist-info/WHEEL | 4 + .../flask_sqlalchemy/__init__.py | 26 + .../site-packages/flask_sqlalchemy/cli.py | 16 + .../flask_sqlalchemy/extension.py | 1008 + .../site-packages/flask_sqlalchemy/model.py | 330 + .../flask_sqlalchemy/pagination.py | 364 + .../site-packages/flask_sqlalchemy/py.typed | 0 .../site-packages/flask_sqlalchemy/query.py | 105 + .../flask_sqlalchemy/record_queries.py | 117 + .../site-packages/flask_sqlalchemy/session.py | 111 + .../site-packages/flask_sqlalchemy/table.py | 39 + .../flask_sqlalchemy/track_modifications.py | 88 + .../flask_wtf-1.2.2.dist-info/INSTALLER | 1 + .../flask_wtf-1.2.2.dist-info/METADATA | 72 + .../flask_wtf-1.2.2.dist-info/RECORD | 26 + .../flask_wtf-1.2.2.dist-info/REQUESTED | 0 .../flask_wtf-1.2.2.dist-info/WHEEL | 4 + .../licenses/LICENSE.rst | 28 + .../site-packages/flask_wtf/__init__.py | 16 + .../site-packages/flask_wtf/_compat.py | 11 + .../site-packages/flask_wtf/csrf.py | 329 + .../site-packages/flask_wtf/file.py | 146 + .../site-packages/flask_wtf/form.py | 127 + .../site-packages/flask_wtf/i18n.py | 47 + .../flask_wtf/recaptcha/__init__.py | 5 + .../flask_wtf/recaptcha/fields.py | 17 + .../flask_wtf/recaptcha/validators.py | 75 + .../flask_wtf/recaptcha/widgets.py | 43 + .../greenlet-3.4.0.dist-info/INSTALLER | 1 + .../greenlet-3.4.0.dist-info/METADATA | 98 + .../greenlet-3.4.0.dist-info/RECORD | 123 + .../greenlet-3.4.0.dist-info/WHEEL | 6 + .../greenlet-3.4.0.dist-info/licenses/LICENSE | 30 + .../licenses/LICENSE.PSF | 47 + .../greenlet-3.4.0.dist-info/top_level.txt | 1 + .../site-packages/greenlet/CObjects.cpp | 160 + .../site-packages/greenlet/PyGreenlet.cpp | 841 + .../site-packages/greenlet/PyGreenlet.hpp | 35 + .../greenlet/PyGreenletUnswitchable.cpp | 150 + .../site-packages/greenlet/PyModule.cpp | 309 + .../greenlet/TBrokenGreenlet.cpp | 45 + .../greenlet/TExceptionState.cpp | 62 + .../site-packages/greenlet/TGreenlet.cpp | 729 + .../site-packages/greenlet/TGreenlet.hpp | 849 + .../greenlet/TGreenletGlobals.cpp | 113 + .../site-packages/greenlet/TMainGreenlet.cpp | 163 + .../site-packages/greenlet/TPythonState.cpp | 490 + .../site-packages/greenlet/TStackState.cpp | 265 + .../site-packages/greenlet/TThreadState.hpp | 627 + .../greenlet/TThreadStateCreator.hpp | 105 + .../greenlet/TThreadStateDestroy.cpp | 217 + .../site-packages/greenlet/TUserGreenlet.cpp | 674 + .../site-packages/greenlet/__init__.py | 62 + .../_greenlet.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 1400064 bytes .../site-packages/greenlet/greenlet.cpp | 343 + .../site-packages/greenlet/greenlet.h | 164 + .../greenlet/greenlet_allocator.hpp | 76 + .../greenlet/greenlet_compiler_compat.hpp | 98 + .../greenlet/greenlet_cpython_compat.hpp | 117 + .../greenlet/greenlet_exceptions.hpp | 171 + .../greenlet/greenlet_internal.hpp | 109 + .../greenlet/greenlet_msvc_compat.hpp | 100 + .../site-packages/greenlet/greenlet_refs.hpp | 1172 + .../greenlet/greenlet_slp_switch.hpp | 103 + .../greenlet/greenlet_thread_support.hpp | 31 + .../greenlet/platform/__init__.py | 0 .../platform/setup_switch_x64_masm.cmd | 2 + .../greenlet/platform/switch_aarch64_gcc.h | 124 + .../greenlet/platform/switch_alpha_unix.h | 30 + .../greenlet/platform/switch_amd64_unix.h | 87 + .../greenlet/platform/switch_arm32_gcc.h | 79 + .../greenlet/platform/switch_arm32_ios.h | 67 + .../greenlet/platform/switch_arm64_masm.asm | 53 + .../greenlet/platform/switch_arm64_masm.obj | Bin 0 -> 746 bytes .../greenlet/platform/switch_arm64_msvc.h | 17 + .../greenlet/platform/switch_csky_gcc.h | 48 + .../platform/switch_loongarch64_linux.h | 31 + .../greenlet/platform/switch_m68k_gcc.h | 38 + .../greenlet/platform/switch_mips_unix.h | 65 + .../greenlet/platform/switch_ppc64_aix.h | 103 + .../greenlet/platform/switch_ppc64_linux.h | 105 + .../greenlet/platform/switch_ppc_aix.h | 87 + .../greenlet/platform/switch_ppc_linux.h | 84 + .../greenlet/platform/switch_ppc_macosx.h | 82 + .../greenlet/platform/switch_ppc_unix.h | 82 + .../greenlet/platform/switch_riscv_unix.h | 41 + .../greenlet/platform/switch_s390_unix.h | 87 + .../greenlet/platform/switch_sh_gcc.h | 36 + .../greenlet/platform/switch_sparc_sun_gcc.h | 92 + .../greenlet/platform/switch_x32_unix.h | 63 + .../greenlet/platform/switch_x64_masm.asm | 111 + .../greenlet/platform/switch_x64_masm.obj | Bin 0 -> 1078 bytes .../greenlet/platform/switch_x64_msvc.h | 60 + .../greenlet/platform/switch_x86_msvc.h | 326 + .../greenlet/platform/switch_x86_unix.h | 105 + .../greenlet/slp_platformselect.h | 77 + .../site-packages/greenlet/tests/__init__.py | 248 + .../greenlet/tests/_test_extension.c | 261 + ..._extension.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 17256 bytes .../greenlet/tests/_test_extension_cpp.cpp | 230 + ...ension_cpp.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 58728 bytes .../tests/fail_clearing_run_switches.py | 47 + .../greenlet/tests/fail_cpp_exception.py | 33 + .../tests/fail_initialstub_already_started.py | 78 + .../greenlet/tests/fail_slp_switch.py | 29 + .../tests/fail_switch_three_greenlets.py | 44 + .../tests/fail_switch_three_greenlets2.py | 55 + .../tests/fail_switch_two_greenlets.py | 41 + .../site-packages/greenlet/tests/leakcheck.py | 334 + .../greenlet/tests/test_contextvars.py | 282 + .../site-packages/greenlet/tests/test_cpp.py | 91 + .../tests/test_extension_interface.py | 141 + .../site-packages/greenlet/tests/test_gc.py | 86 + .../greenlet/tests/test_generator.py | 59 + .../greenlet/tests/test_generator_nested.py | 168 + .../greenlet/tests/test_greenlet.py | 1426 + .../greenlet/tests/test_greenlet_trash.py | 195 + .../tests/test_interpreter_shutdown.py | 822 + .../greenlet/tests/test_leaks.py | 478 + .../greenlet/tests/test_stack_saved.py | 19 + .../greenlet/tests/test_throw.py | 128 + .../greenlet/tests/test_tracing.py | 298 + .../greenlet/tests/test_version.py | 46 + .../greenlet/tests/test_weakref.py | 35 + .../idna-3.11.dist-info/INSTALLER | 1 + .../idna-3.11.dist-info/METADATA | 209 + .../site-packages/idna-3.11.dist-info/RECORD | 22 + .../site-packages/idna-3.11.dist-info/WHEEL | 4 + .../idna-3.11.dist-info/licenses/LICENSE.md | 31 + .../python3.12/site-packages/idna/__init__.py | 45 + .../python3.12/site-packages/idna/codec.py | 122 + .../python3.12/site-packages/idna/compat.py | 15 + .../lib/python3.12/site-packages/idna/core.py | 437 + .../python3.12/site-packages/idna/idnadata.py | 4309 ++ .../site-packages/idna/intranges.py | 57 + .../site-packages/idna/package_data.py | 1 + .../python3.12/site-packages/idna/py.typed | 0 .../site-packages/idna/uts46data.py | 8841 +++ .../itsdangerous-2.0.1.dist-info/INSTALLER | 1 + .../itsdangerous-2.0.1.dist-info/LICENSE.rst | 28 + .../itsdangerous-2.0.1.dist-info/METADATA | 96 + .../itsdangerous-2.0.1.dist-info/RECORD | 26 + .../itsdangerous-2.0.1.dist-info/REQUESTED | 0 .../itsdangerous-2.0.1.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../site-packages/itsdangerous/__init__.py | 22 + .../site-packages/itsdangerous/_json.py | 34 + .../site-packages/itsdangerous/encoding.py | 54 + .../site-packages/itsdangerous/exc.py | 107 + .../site-packages/itsdangerous/jws.py | 259 + .../site-packages/itsdangerous/py.typed | 0 .../site-packages/itsdangerous/serializer.py | 295 + .../site-packages/itsdangerous/signer.py | 257 + .../site-packages/itsdangerous/timed.py | 227 + .../site-packages/itsdangerous/url_safe.py | 80 + .../jinja2-3.1.6.dist-info/INSTALLER | 1 + .../jinja2-3.1.6.dist-info/METADATA | 84 + .../jinja2-3.1.6.dist-info/RECORD | 57 + .../jinja2-3.1.6.dist-info/WHEEL | 4 + .../jinja2-3.1.6.dist-info/entry_points.txt | 3 + .../licenses/LICENSE.txt | 28 + .../site-packages/jinja2/__init__.py | 38 + .../site-packages/jinja2/_identifier.py | 6 + .../site-packages/jinja2/async_utils.py | 99 + .../site-packages/jinja2/bccache.py | 408 + .../site-packages/jinja2/compiler.py | 1998 + .../site-packages/jinja2/constants.py | 20 + .../python3.12/site-packages/jinja2/debug.py | 191 + .../site-packages/jinja2/defaults.py | 48 + .../site-packages/jinja2/environment.py | 1672 + .../site-packages/jinja2/exceptions.py | 166 + .../python3.12/site-packages/jinja2/ext.py | 870 + .../site-packages/jinja2/filters.py | 1873 + .../site-packages/jinja2/idtracking.py | 318 + .../python3.12/site-packages/jinja2/lexer.py | 868 + .../site-packages/jinja2/loaders.py | 693 + .../python3.12/site-packages/jinja2/meta.py | 112 + .../site-packages/jinja2/nativetypes.py | 130 + .../python3.12/site-packages/jinja2/nodes.py | 1206 + .../site-packages/jinja2/optimizer.py | 48 + .../python3.12/site-packages/jinja2/parser.py | 1049 + .../python3.12/site-packages/jinja2/py.typed | 0 .../site-packages/jinja2/runtime.py | 1062 + .../site-packages/jinja2/sandbox.py | 436 + .../python3.12/site-packages/jinja2/tests.py | 256 + .../python3.12/site-packages/jinja2/utils.py | 766 + .../site-packages/jinja2/visitor.py | 92 + .../site-packages/markdown_it/__init__.py | 6 + .../site-packages/markdown_it/_compat.py | 1 + .../site-packages/markdown_it/_punycode.py | 67 + .../site-packages/markdown_it/cli/__init__.py | 0 .../site-packages/markdown_it/cli/parse.py | 110 + .../markdown_it/common/__init__.py | 0 .../markdown_it/common/entities.py | 5 + .../markdown_it/common/html_blocks.py | 69 + .../markdown_it/common/html_re.py | 39 + .../markdown_it/common/normalize_url.py | 81 + .../site-packages/markdown_it/common/utils.py | 313 + .../markdown_it/helpers/__init__.py | 6 + .../helpers/parse_link_destination.py | 83 + .../markdown_it/helpers/parse_link_label.py | 44 + .../markdown_it/helpers/parse_link_title.py | 75 + .../site-packages/markdown_it/main.py | 350 + .../site-packages/markdown_it/parser_block.py | 113 + .../site-packages/markdown_it/parser_core.py | 46 + .../markdown_it/parser_inline.py | 148 + .../site-packages/markdown_it/port.yaml | 48 + .../markdown_it/presets/__init__.py | 28 + .../markdown_it/presets/commonmark.py | 75 + .../markdown_it/presets/default.py | 36 + .../site-packages/markdown_it/presets/zero.py | 44 + .../site-packages/markdown_it/py.typed | 1 + .../site-packages/markdown_it/renderer.py | 336 + .../site-packages/markdown_it/ruler.py | 275 + .../markdown_it/rules_block/__init__.py | 27 + .../markdown_it/rules_block/blockquote.py | 299 + .../markdown_it/rules_block/code.py | 36 + .../markdown_it/rules_block/fence.py | 101 + .../markdown_it/rules_block/heading.py | 69 + .../markdown_it/rules_block/hr.py | 56 + .../markdown_it/rules_block/html_block.py | 90 + .../markdown_it/rules_block/lheading.py | 86 + .../markdown_it/rules_block/list.py | 345 + .../markdown_it/rules_block/paragraph.py | 66 + .../markdown_it/rules_block/reference.py | 235 + .../markdown_it/rules_block/state_block.py | 261 + .../markdown_it/rules_block/table.py | 250 + .../markdown_it/rules_core/__init__.py | 19 + .../markdown_it/rules_core/block.py | 13 + .../markdown_it/rules_core/inline.py | 10 + .../markdown_it/rules_core/linkify.py | 149 + .../markdown_it/rules_core/normalize.py | 19 + .../markdown_it/rules_core/replacements.py | 127 + .../markdown_it/rules_core/smartquotes.py | 202 + .../markdown_it/rules_core/state_core.py | 25 + .../markdown_it/rules_core/text_join.py | 35 + .../markdown_it/rules_inline/__init__.py | 31 + .../markdown_it/rules_inline/autolink.py | 77 + .../markdown_it/rules_inline/backticks.py | 72 + .../markdown_it/rules_inline/balance_pairs.py | 138 + .../markdown_it/rules_inline/emphasis.py | 102 + .../markdown_it/rules_inline/entity.py | 53 + .../markdown_it/rules_inline/escape.py | 93 + .../rules_inline/fragments_join.py | 43 + .../markdown_it/rules_inline/html_inline.py | 43 + .../markdown_it/rules_inline/image.py | 148 + .../markdown_it/rules_inline/link.py | 149 + .../markdown_it/rules_inline/linkify.py | 62 + .../markdown_it/rules_inline/newline.py | 44 + .../markdown_it/rules_inline/state_inline.py | 165 + .../markdown_it/rules_inline/strikethrough.py | 127 + .../markdown_it/rules_inline/text.py | 62 + .../site-packages/markdown_it/token.py | 178 + .../site-packages/markdown_it/tree.py | 333 + .../site-packages/markdown_it/utils.py | 186 + .../markdown_it_py-4.0.0.dist-info/INSTALLER | 1 + .../markdown_it_py-4.0.0.dist-info/METADATA | 219 + .../markdown_it_py-4.0.0.dist-info/RECORD | 142 + .../markdown_it_py-4.0.0.dist-info/WHEEL | 4 + .../entry_points.txt | 3 + .../licenses/LICENSE | 21 + .../licenses/LICENSE.markdown-it | 22 + .../markupsafe-3.0.3.dist-info/INSTALLER | 1 + .../markupsafe-3.0.3.dist-info/METADATA | 74 + .../markupsafe-3.0.3.dist-info/RECORD | 14 + .../markupsafe-3.0.3.dist-info/WHEEL | 7 + .../licenses/LICENSE.txt | 28 + .../markupsafe-3.0.3.dist-info/top_level.txt | 1 + .../site-packages/markupsafe/__init__.py | 396 + .../site-packages/markupsafe/_native.py | 8 + .../site-packages/markupsafe/_speedups.c | 200 + .../_speedups.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 44072 bytes .../site-packages/markupsafe/_speedups.pyi | 1 + .../site-packages/markupsafe/py.typed | 0 .../mdurl-0.1.2.dist-info/INSTALLER | 1 + .../mdurl-0.1.2.dist-info/LICENSE | 46 + .../mdurl-0.1.2.dist-info/METADATA | 32 + .../mdurl-0.1.2.dist-info/RECORD | 18 + .../site-packages/mdurl-0.1.2.dist-info/WHEEL | 4 + .../site-packages/mdurl/__init__.py | 18 + .../python3.12/site-packages/mdurl/_decode.py | 104 + .../python3.12/site-packages/mdurl/_encode.py | 85 + .../python3.12/site-packages/mdurl/_format.py | 27 + .../python3.12/site-packages/mdurl/_parse.py | 304 + .../python3.12/site-packages/mdurl/_url.py | 14 + .../python3.12/site-packages/mdurl/py.typed | 1 + .../pillow-12.2.0.dist-info/INSTALLER | 1 + .../pillow-12.2.0.dist-info/METADATA | 175 + .../pillow-12.2.0.dist-info/RECORD | 238 + .../pillow-12.2.0.dist-info/REQUESTED | 0 .../pillow-12.2.0.dist-info/WHEEL | 6 + .../pillow-12.2.0.dist-info/licenses/LICENSE | 1523 + .../sboms/auditwheel.cdx.json | 1 + .../pillow-12.2.0.dist-info/top_level.txt | 1 + .../pillow-12.2.0.dist-info/zip-safe | 1 + .../pillow.libs/libXau-154567c4.so.6.0.0 | Bin 0 -> 22081 bytes .../pillow.libs/libavif-a883386a.so.16.4.1 | Bin 0 -> 5183009 bytes .../libbrotlicommon-785b7a00.so.1.2.0 | Bin 0 -> 144425 bytes .../libbrotlidec-08d35d18.so.1.2.0 | Bin 0 -> 62337 bytes .../libfreetype-d2d71ad9.so.6.20.6 | Bin 0 -> 1459513 bytes .../libharfbuzz-ef65cc8a.so.0.61321.0 | Bin 0 -> 933009 bytes .../pillow.libs/libjpeg-8296d2fa.so.62.4.0 | Bin 0 -> 836273 bytes .../pillow.libs/liblcms2-545f6561.so.2.0.18 | Bin 0 -> 519073 bytes .../pillow.libs/liblzma-3c942967.so.5.8.3 | Bin 0 -> 266369 bytes .../pillow.libs/libopenjp2-f3576751.so.2.5.4 | Bin 0 -> 585849 bytes .../pillow.libs/libpng16-65c953c0.so.16.56.0 | Bin 0 -> 278001 bytes .../pillow.libs/libsharpyuv-0bacc318.so.0.1.2 | Bin 0 -> 46113 bytes .../pillow.libs/libtiff-f4bc73ff.so.6.2.0 | Bin 0 -> 754729 bytes .../pillow.libs/libwebp-67ee3789.so.7.2.0 | Bin 0 -> 731209 bytes .../libwebpdemux-eeb71312.so.2.0.17 | Bin 0 -> 30217 bytes .../pillow.libs/libwebpmux-20a90b09.so.3.1.2 | Bin 0 -> 58617 bytes .../pillow.libs/libxcb-bac6ebc8.so.1.1.0 | Bin 0 -> 251425 bytes .../pillow.libs/libzstd-6ea785c0.so.1.5.7 | Bin 0 -> 1800497 bytes .../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 + .../site-packages/pip/_internal/__init__.py | 18 + .../site-packages/pip/_internal/build_env.py | 311 + .../site-packages/pip/_internal/cache.py | 290 + .../pip/_internal/cli/__init__.py | 4 + .../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 + .../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 + .../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 + .../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 + .../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 + .../pip/_internal/metadata/_json.py | 84 + .../pip/_internal/metadata/base.py | 702 + .../_internal/metadata/importlib/__init__.py | 6 + .../_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 + .../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 + .../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 .../_internal/operations/build/__init__.py | 0 .../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 + .../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 + .../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 .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../_internal/resolution/legacy/resolver.py | 598 + .../resolution/resolvelib/__init__.py | 0 .../_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 .../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 + .../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 + .../pip/_vendor/cachecontrol/__init__.py | 28 + .../pip/_vendor/cachecontrol/_cmd.py | 70 + .../pip/_vendor/cachecontrol/adapter.py | 161 + .../pip/_vendor/cachecontrol/cache.py | 74 + .../_vendor/cachecontrol/caches/__init__.py | 8 + .../_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 + .../pip/_vendor/certifi/cacert.pem | 4635 ++ .../site-packages/pip/_vendor/certifi/core.py | 119 + .../pip/_vendor/chardet/__init__.py | 115 + .../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 .../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 .../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 + .../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 + .../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 + .../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 + .../pip/_vendor/distro/distro.py | 1399 + .../pip/_vendor/idna/__init__.py | 44 + .../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 + .../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 + .../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 + .../pip/_vendor/platformdirs/__init__.py | 566 + .../pip/_vendor/platformdirs/__main__.py | 53 + .../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 + .../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 + .../pip/_vendor/pygments/formatter.py | 124 + .../_vendor/pygments/formatters/__init__.py | 158 + .../_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 + .../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 + .../pip/_vendor/pygments/token.py | 213 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 330 + .../pip/_vendor/pyparsing/__init__.py | 322 + .../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 + .../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 + .../pip/_vendor/pyproject_hooks/_compat.py | 8 + .../pip/_vendor/pyproject_hooks/_impl.py | 330 + .../pyproject_hooks/_in_process/__init__.py | 18 + .../_in_process/_in_process.py | 353 + .../pip/_vendor/requests/__init__.py | 182 + .../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 + .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../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 + .../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 + .../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 + .../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 + .../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 + .../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 .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../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 .../urllib3/packages/backports/__init__.py | 0 .../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 + .../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 + .../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 + .../pygments-2.20.0.dist-info/INSTALLER | 1 + .../pygments-2.20.0.dist-info/METADATA | 57 + .../pygments-2.20.0.dist-info/RECORD | 686 + .../pygments-2.20.0.dist-info/WHEEL | 4 + .../entry_points.txt | 2 + .../licenses/AUTHORS | 292 + .../licenses/LICENSE | 25 + .../site-packages/pygments/__init__.py | 82 + .../site-packages/pygments/__main__.py | 17 + .../site-packages/pygments/cmdline.py | 668 + .../site-packages/pygments/console.py | 70 + .../site-packages/pygments/filter.py | 70 + .../pygments/filters/__init__.py | 942 + .../site-packages/pygments/formatter.py | 129 + .../pygments/formatters/__init__.py | 157 + .../pygments/formatters/_mapping.py | 23 + .../pygments/formatters/bbcode.py | 108 + .../pygments/formatters/groff.py | 170 + .../site-packages/pygments/formatters/html.py | 997 + .../site-packages/pygments/formatters/img.py | 686 + .../site-packages/pygments/formatters/irc.py | 153 + .../pygments/formatters/latex.py | 518 + .../pygments/formatters/other.py | 160 + .../pygments/formatters/pangomarkup.py | 83 + .../site-packages/pygments/formatters/rtf.py | 349 + .../site-packages/pygments/formatters/svg.py | 185 + .../pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../site-packages/pygments/lexer.py | 963 + .../site-packages/pygments/lexers/__init__.py | 362 + .../pygments/lexers/_ada_builtins.py | 103 + .../pygments/lexers/_asy_builtins.py | 1644 + .../pygments/lexers/_cl_builtins.py | 231 + .../pygments/lexers/_cocoa_builtins.py | 75 + .../pygments/lexers/_csound_builtins.py | 1780 + .../pygments/lexers/_css_builtins.py | 558 + .../pygments/lexers/_googlesql_builtins.py | 918 + .../pygments/lexers/_julia_builtins.py | 411 + .../pygments/lexers/_lasso_builtins.py | 5326 ++ .../pygments/lexers/_lilypond_builtins.py | 5184 ++ .../pygments/lexers/_lua_builtins.py | 285 + .../pygments/lexers/_luau_builtins.py | 62 + .../site-packages/pygments/lexers/_mapping.py | 603 + .../pygments/lexers/_mql_builtins.py | 1171 + .../pygments/lexers/_mysql_builtins.py | 1384 + .../pygments/lexers/_openedge_builtins.py | 2600 + .../pygments/lexers/_php_builtins.py | 3328 + .../pygments/lexers/_postgres_builtins.py | 739 + .../pygments/lexers/_qlik_builtins.py | 666 + .../pygments/lexers/_scheme_builtins.py | 1609 + .../pygments/lexers/_scilab_builtins.py | 3093 + .../pygments/lexers/_sourcemod_builtins.py | 1151 + .../pygments/lexers/_sql_builtins.py | 106 + .../pygments/lexers/_stan_builtins.py | 761 + .../pygments/lexers/_stata_builtins.py | 457 + .../pygments/lexers/_tsql_builtins.py | 1003 + .../pygments/lexers/_usd_builtins.py | 112 + .../pygments/lexers/_vbscript_builtins.py | 279 + .../pygments/lexers/_vim_builtins.py | 1938 + .../pygments/lexers/actionscript.py | 243 + .../site-packages/pygments/lexers/ada.py | 144 + .../site-packages/pygments/lexers/agile.py | 25 + .../site-packages/pygments/lexers/algebra.py | 300 + .../site-packages/pygments/lexers/ambient.py | 75 + .../site-packages/pygments/lexers/amdgpu.py | 54 + .../site-packages/pygments/lexers/ampl.py | 87 + .../site-packages/pygments/lexers/apdlexer.py | 593 + .../site-packages/pygments/lexers/apl.py | 103 + .../pygments/lexers/archetype.py | 315 + .../site-packages/pygments/lexers/arrow.py | 116 + .../site-packages/pygments/lexers/arturo.py | 249 + .../site-packages/pygments/lexers/asc.py | 55 + .../site-packages/pygments/lexers/asm.py | 1058 + .../site-packages/pygments/lexers/asn1.py | 178 + .../pygments/lexers/automation.py | 379 + .../site-packages/pygments/lexers/bare.py | 101 + .../site-packages/pygments/lexers/basic.py | 656 + .../site-packages/pygments/lexers/bdd.py | 57 + .../site-packages/pygments/lexers/berry.py | 99 + .../site-packages/pygments/lexers/bibtex.py | 159 + .../pygments/lexers/blueprint.py | 173 + .../site-packages/pygments/lexers/boa.py | 97 + .../site-packages/pygments/lexers/bqn.py | 112 + .../site-packages/pygments/lexers/business.py | 625 + .../site-packages/pygments/lexers/c_cpp.py | 415 + .../site-packages/pygments/lexers/c_like.py | 738 + .../pygments/lexers/capnproto.py | 74 + .../site-packages/pygments/lexers/carbon.py | 95 + .../site-packages/pygments/lexers/cddl.py | 172 + .../site-packages/pygments/lexers/chapel.py | 139 + .../site-packages/pygments/lexers/clean.py | 180 + .../site-packages/pygments/lexers/codeql.py | 80 + .../site-packages/pygments/lexers/comal.py | 81 + .../site-packages/pygments/lexers/compiled.py | 35 + .../site-packages/pygments/lexers/configs.py | 1433 + .../site-packages/pygments/lexers/console.py | 114 + .../site-packages/pygments/lexers/cplint.py | 43 + .../site-packages/pygments/lexers/crystal.py | 364 + .../site-packages/pygments/lexers/csound.py | 466 + .../site-packages/pygments/lexers/css.py | 632 + .../site-packages/pygments/lexers/d.py | 259 + .../site-packages/pygments/lexers/dalvik.py | 126 + .../site-packages/pygments/lexers/data.py | 763 + .../site-packages/pygments/lexers/dax.py | 135 + .../pygments/lexers/devicetree.py | 120 + .../site-packages/pygments/lexers/diff.py | 169 + .../site-packages/pygments/lexers/dns.py | 109 + .../site-packages/pygments/lexers/dotnet.py | 873 + .../site-packages/pygments/lexers/dsls.py | 970 + .../site-packages/pygments/lexers/dylan.py | 279 + .../site-packages/pygments/lexers/ecl.py | 144 + .../site-packages/pygments/lexers/eiffel.py | 68 + .../site-packages/pygments/lexers/elm.py | 123 + .../site-packages/pygments/lexers/elpi.py | 201 + .../site-packages/pygments/lexers/email.py | 132 + .../site-packages/pygments/lexers/erlang.py | 526 + .../site-packages/pygments/lexers/esoteric.py | 300 + .../site-packages/pygments/lexers/ezhil.py | 76 + .../site-packages/pygments/lexers/factor.py | 363 + .../site-packages/pygments/lexers/fantom.py | 251 + .../site-packages/pygments/lexers/felix.py | 275 + .../site-packages/pygments/lexers/fift.py | 68 + .../pygments/lexers/floscript.py | 81 + .../site-packages/pygments/lexers/forth.py | 178 + .../site-packages/pygments/lexers/fortran.py | 212 + .../site-packages/pygments/lexers/foxpro.py | 427 + .../site-packages/pygments/lexers/freefem.py | 893 + .../site-packages/pygments/lexers/func.py | 110 + .../pygments/lexers/functional.py | 21 + .../site-packages/pygments/lexers/futhark.py | 105 + .../pygments/lexers/gcodelexer.py | 35 + .../site-packages/pygments/lexers/gdscript.py | 189 + .../site-packages/pygments/lexers/gleam.py | 74 + .../site-packages/pygments/lexers/go.py | 97 + .../pygments/lexers/grammar_notation.py | 262 + .../site-packages/pygments/lexers/graph.py | 108 + .../site-packages/pygments/lexers/graphics.py | 794 + .../site-packages/pygments/lexers/graphql.py | 176 + .../site-packages/pygments/lexers/graphviz.py | 58 + .../site-packages/pygments/lexers/gsql.py | 103 + .../site-packages/pygments/lexers/hare.py | 73 + .../site-packages/pygments/lexers/haskell.py | 867 + .../site-packages/pygments/lexers/haxe.py | 941 + .../site-packages/pygments/lexers/hdl.py | 466 + .../site-packages/pygments/lexers/hexdump.py | 102 + .../site-packages/pygments/lexers/html.py | 670 + .../site-packages/pygments/lexers/idl.py | 284 + .../site-packages/pygments/lexers/igor.py | 435 + .../site-packages/pygments/lexers/inferno.py | 95 + .../pygments/lexers/installers.py | 352 + .../pygments/lexers/int_fiction.py | 1370 + .../site-packages/pygments/lexers/iolang.py | 61 + .../site-packages/pygments/lexers/j.py | 151 + .../pygments/lexers/javascript.py | 1591 + .../site-packages/pygments/lexers/jmespath.py | 69 + .../site-packages/pygments/lexers/jslt.py | 94 + .../site-packages/pygments/lexers/json5.py | 83 + .../site-packages/pygments/lexers/jsonnet.py | 169 + .../site-packages/pygments/lexers/jsx.py | 100 + .../site-packages/pygments/lexers/julia.py | 294 + .../site-packages/pygments/lexers/jvm.py | 1807 + .../site-packages/pygments/lexers/kuin.py | 332 + .../site-packages/pygments/lexers/kusto.py | 93 + .../site-packages/pygments/lexers/ldap.py | 155 + .../site-packages/pygments/lexers/lean.py | 241 + .../site-packages/pygments/lexers/lilypond.py | 225 + .../site-packages/pygments/lexers/lisp.py | 3152 + .../pygments/lexers/macaulay2.py | 1847 + .../site-packages/pygments/lexers/make.py | 212 + .../site-packages/pygments/lexers/maple.py | 291 + .../site-packages/pygments/lexers/markup.py | 1659 + .../site-packages/pygments/lexers/math.py | 21 + .../site-packages/pygments/lexers/matlab.py | 3307 + .../site-packages/pygments/lexers/maxima.py | 84 + .../site-packages/pygments/lexers/meson.py | 139 + .../site-packages/pygments/lexers/mime.py | 210 + .../pygments/lexers/minecraft.py | 392 + .../site-packages/pygments/lexers/mips.py | 130 + .../site-packages/pygments/lexers/ml.py | 958 + .../site-packages/pygments/lexers/modeling.py | 368 + .../site-packages/pygments/lexers/modula2.py | 1579 + .../site-packages/pygments/lexers/mojo.py | 707 + .../site-packages/pygments/lexers/monte.py | 203 + .../site-packages/pygments/lexers/mosel.py | 447 + .../site-packages/pygments/lexers/ncl.py | 894 + .../site-packages/pygments/lexers/nimrod.py | 199 + .../site-packages/pygments/lexers/nit.py | 63 + .../site-packages/pygments/lexers/nix.py | 144 + .../site-packages/pygments/lexers/numbair.py | 63 + .../site-packages/pygments/lexers/oberon.py | 120 + .../pygments/lexers/objective.py | 513 + .../site-packages/pygments/lexers/ooc.py | 84 + .../site-packages/pygments/lexers/openscad.py | 96 + .../site-packages/pygments/lexers/other.py | 41 + .../site-packages/pygments/lexers/parasail.py | 78 + .../site-packages/pygments/lexers/parsers.py | 798 + .../site-packages/pygments/lexers/pascal.py | 644 + .../site-packages/pygments/lexers/pawn.py | 202 + .../site-packages/pygments/lexers/pddl.py | 82 + .../site-packages/pygments/lexers/perl.py | 733 + .../site-packages/pygments/lexers/phix.py | 363 + .../site-packages/pygments/lexers/php.py | 335 + .../pygments/lexers/pointless.py | 70 + .../site-packages/pygments/lexers/pony.py | 93 + .../site-packages/pygments/lexers/praat.py | 303 + .../site-packages/pygments/lexers/procfile.py | 41 + .../site-packages/pygments/lexers/prolog.py | 318 + .../site-packages/pygments/lexers/promql.py | 176 + .../site-packages/pygments/lexers/prql.py | 251 + .../site-packages/pygments/lexers/ptx.py | 119 + .../site-packages/pygments/lexers/python.py | 1204 + .../site-packages/pygments/lexers/q.py | 187 + .../site-packages/pygments/lexers/qlik.py | 117 + .../site-packages/pygments/lexers/qvt.py | 153 + .../site-packages/pygments/lexers/r.py | 196 + .../site-packages/pygments/lexers/rdf.py | 468 + .../site-packages/pygments/lexers/rebol.py | 419 + .../site-packages/pygments/lexers/rego.py | 57 + .../site-packages/pygments/lexers/rell.py | 68 + .../site-packages/pygments/lexers/resource.py | 83 + .../site-packages/pygments/lexers/ride.py | 138 + .../site-packages/pygments/lexers/rita.py | 42 + .../site-packages/pygments/lexers/rnc.py | 66 + .../site-packages/pygments/lexers/roboconf.py | 81 + .../pygments/lexers/robotframework.py | 551 + .../site-packages/pygments/lexers/ruby.py | 518 + .../site-packages/pygments/lexers/rust.py | 222 + .../site-packages/pygments/lexers/sas.py | 227 + .../site-packages/pygments/lexers/savi.py | 171 + .../site-packages/pygments/lexers/scdoc.py | 85 + .../pygments/lexers/scripting.py | 1638 + .../site-packages/pygments/lexers/sgf.py | 59 + .../site-packages/pygments/lexers/shell.py | 902 + .../site-packages/pygments/lexers/sieve.py | 78 + .../site-packages/pygments/lexers/slash.py | 183 + .../pygments/lexers/smalltalk.py | 194 + .../site-packages/pygments/lexers/smithy.py | 77 + .../site-packages/pygments/lexers/smv.py | 78 + .../site-packages/pygments/lexers/snobol.py | 82 + .../site-packages/pygments/lexers/solidity.py | 87 + .../site-packages/pygments/lexers/soong.py | 78 + .../site-packages/pygments/lexers/sophia.py | 102 + .../site-packages/pygments/lexers/special.py | 122 + .../site-packages/pygments/lexers/spice.py | 70 + .../site-packages/pygments/lexers/sql.py | 1111 + .../site-packages/pygments/lexers/srcinfo.py | 62 + .../site-packages/pygments/lexers/stata.py | 170 + .../pygments/lexers/supercollider.py | 94 + .../site-packages/pygments/lexers/tablegen.py | 177 + .../site-packages/pygments/lexers/tact.py | 303 + .../site-packages/pygments/lexers/tal.py | 77 + .../site-packages/pygments/lexers/tcl.py | 148 + .../site-packages/pygments/lexers/teal.py | 88 + .../pygments/lexers/templates.py | 2355 + .../site-packages/pygments/lexers/teraterm.py | 335 + .../site-packages/pygments/lexers/testing.py | 209 + .../site-packages/pygments/lexers/text.py | 27 + .../site-packages/pygments/lexers/textedit.py | 205 + .../site-packages/pygments/lexers/textfmts.py | 436 + .../site-packages/pygments/lexers/theorem.py | 410 + .../site-packages/pygments/lexers/thingsdb.py | 143 + .../site-packages/pygments/lexers/tlb.py | 59 + .../site-packages/pygments/lexers/tls.py | 54 + .../site-packages/pygments/lexers/tnt.py | 270 + .../pygments/lexers/trafficscript.py | 51 + .../pygments/lexers/typoscript.py | 216 + .../site-packages/pygments/lexers/typst.py | 160 + .../site-packages/pygments/lexers/ul4.py | 309 + .../site-packages/pygments/lexers/unicon.py | 413 + .../site-packages/pygments/lexers/urbi.py | 145 + .../site-packages/pygments/lexers/usd.py | 85 + .../site-packages/pygments/lexers/varnish.py | 189 + .../pygments/lexers/verification.py | 113 + .../site-packages/pygments/lexers/verifpal.py | 65 + .../site-packages/pygments/lexers/vip.py | 150 + .../site-packages/pygments/lexers/vyper.py | 140 + .../site-packages/pygments/lexers/web.py | 24 + .../pygments/lexers/webassembly.py | 119 + .../site-packages/pygments/lexers/webidl.py | 298 + .../site-packages/pygments/lexers/webmisc.py | 1006 + .../site-packages/pygments/lexers/wgsl.py | 406 + .../site-packages/pygments/lexers/whiley.py | 115 + .../site-packages/pygments/lexers/wowtoc.py | 120 + .../site-packages/pygments/lexers/wren.py | 98 + .../site-packages/pygments/lexers/x10.py | 66 + .../site-packages/pygments/lexers/xorg.py | 38 + .../site-packages/pygments/lexers/yang.py | 103 + .../site-packages/pygments/lexers/yara.py | 69 + .../site-packages/pygments/lexers/zig.py | 125 + .../site-packages/pygments/modeline.py | 43 + .../site-packages/pygments/plugin.py | 74 + .../site-packages/pygments/regexopt.py | 102 + .../site-packages/pygments/scanner.py | 104 + .../site-packages/pygments/sphinxext.py | 247 + .../site-packages/pygments/style.py | 203 + .../site-packages/pygments/styles/__init__.py | 61 + .../site-packages/pygments/styles/_mapping.py | 54 + .../site-packages/pygments/styles/abap.py | 32 + .../site-packages/pygments/styles/algol.py | 65 + .../site-packages/pygments/styles/algol_nu.py | 65 + .../site-packages/pygments/styles/arduino.py | 100 + .../site-packages/pygments/styles/autumn.py | 67 + .../site-packages/pygments/styles/borland.py | 53 + .../site-packages/pygments/styles/bw.py | 52 + .../site-packages/pygments/styles/coffee.py | 80 + .../site-packages/pygments/styles/colorful.py | 83 + .../site-packages/pygments/styles/default.py | 76 + .../site-packages/pygments/styles/dracula.py | 90 + .../site-packages/pygments/styles/emacs.py | 75 + .../site-packages/pygments/styles/friendly.py | 76 + .../pygments/styles/friendly_grayscale.py | 80 + .../site-packages/pygments/styles/fruity.py | 47 + .../site-packages/pygments/styles/gh_dark.py | 113 + .../site-packages/pygments/styles/gruvbox.py | 118 + .../site-packages/pygments/styles/igor.py | 32 + .../site-packages/pygments/styles/inkpot.py | 72 + .../pygments/styles/lightbulb.py | 110 + .../site-packages/pygments/styles/lilypond.py | 62 + .../site-packages/pygments/styles/lovelace.py | 100 + .../site-packages/pygments/styles/manni.py | 79 + .../site-packages/pygments/styles/material.py | 124 + .../site-packages/pygments/styles/monokai.py | 112 + .../site-packages/pygments/styles/murphy.py | 82 + .../site-packages/pygments/styles/native.py | 70 + .../site-packages/pygments/styles/nord.py | 156 + .../site-packages/pygments/styles/onedark.py | 73 + .../pygments/styles/paraiso_dark.py | 124 + .../pygments/styles/paraiso_light.py | 124 + .../site-packages/pygments/styles/pastie.py | 78 + .../site-packages/pygments/styles/perldoc.py | 73 + .../pygments/styles/rainbow_dash.py | 95 + .../site-packages/pygments/styles/rrt.py | 54 + .../site-packages/pygments/styles/sas.py | 46 + .../pygments/styles/solarized.py | 144 + .../pygments/styles/staroffice.py | 31 + .../pygments/styles/stata_dark.py | 42 + .../pygments/styles/stata_light.py | 42 + .../site-packages/pygments/styles/tango.py | 143 + .../site-packages/pygments/styles/trac.py | 66 + .../site-packages/pygments/styles/vim.py | 67 + .../site-packages/pygments/styles/vs.py | 41 + .../site-packages/pygments/styles/xcode.py | 53 + .../site-packages/pygments/styles/zenburn.py | 83 + .../site-packages/pygments/token.py | 214 + .../site-packages/pygments/unistring.py | 153 + .../python3.12/site-packages/pygments/util.py | 324 + .../pyyaml-6.0.3.dist-info/INSTALLER | 1 + .../pyyaml-6.0.3.dist-info/METADATA | 59 + .../pyyaml-6.0.3.dist-info/RECORD | 43 + .../pyyaml-6.0.3.dist-info/WHEEL | 7 + .../pyyaml-6.0.3.dist-info/licenses/LICENSE | 20 + .../pyyaml-6.0.3.dist-info/top_level.txt | 2 + .../rich-14.3.3.dist-info/INSTALLER | 1 + .../rich-14.3.3.dist-info/METADATA | 480 + .../rich-14.3.3.dist-info/RECORD | 206 + .../site-packages/rich-14.3.3.dist-info/WHEEL | 4 + .../rich-14.3.3.dist-info/licenses/LICENSE | 19 + .../python3.12/site-packages/rich/__init__.py | 177 + .../python3.12/site-packages/rich/__main__.py | 245 + .../site-packages/rich/_emoji_codes.py | 3610 + .../site-packages/rich/_emoji_replace.py | 32 + .../site-packages/rich/_export_format.py | 76 + .../site-packages/rich/_extension.py | 10 + .../python3.12/site-packages/rich/_fileno.py | 24 + .../python3.12/site-packages/rich/_inspect.py | 272 + .../site-packages/rich/_log_render.py | 94 + .../python3.12/site-packages/rich/_loop.py | 43 + .../site-packages/rich/_null_file.py | 69 + .../site-packages/rich/_palettes.py | 309 + .../python3.12/site-packages/rich/_pick.py | 17 + .../python3.12/site-packages/rich/_ratio.py | 153 + .../site-packages/rich/_spinners.py | 482 + .../python3.12/site-packages/rich/_stack.py | 16 + .../python3.12/site-packages/rich/_timer.py | 19 + .../rich/_unicode_data/__init__.py | 93 + .../rich/_unicode_data/_versions.py | 23 + .../rich/_unicode_data/unicode10-0-0.py | 611 + .../rich/_unicode_data/unicode11-0-0.py | 625 + .../rich/_unicode_data/unicode12-0-0.py | 637 + .../rich/_unicode_data/unicode12-1-0.py | 636 + .../rich/_unicode_data/unicode13-0-0.py | 648 + .../rich/_unicode_data/unicode14-0-0.py | 661 + .../rich/_unicode_data/unicode15-0-0.py | 671 + .../rich/_unicode_data/unicode15-1-0.py | 670 + .../rich/_unicode_data/unicode16-0-0.py | 683 + .../rich/_unicode_data/unicode17-0-0.py | 691 + .../rich/_unicode_data/unicode4-1-0.py | 425 + .../rich/_unicode_data/unicode5-0-0.py | 430 + .../rich/_unicode_data/unicode5-1-0.py | 433 + .../rich/_unicode_data/unicode5-2-0.py | 461 + .../rich/_unicode_data/unicode6-0-0.py | 469 + .../rich/_unicode_data/unicode6-1-0.py | 480 + .../rich/_unicode_data/unicode6-2-0.py | 480 + .../rich/_unicode_data/unicode6-3-0.py | 481 + .../rich/_unicode_data/unicode7-0-0.py | 507 + .../rich/_unicode_data/unicode8-0-0.py | 515 + .../rich/_unicode_data/unicode9-0-0.py | 598 + .../site-packages/rich/_win32_console.py | 661 + .../python3.12/site-packages/rich/_windows.py | 71 + .../site-packages/rich/_windows_renderer.py | 56 + .../python3.12/site-packages/rich/_wrap.py | 93 + .../lib/python3.12/site-packages/rich/abc.py | 33 + .../python3.12/site-packages/rich/align.py | 320 + .../lib/python3.12/site-packages/rich/ansi.py | 241 + .../lib/python3.12/site-packages/rich/bar.py | 93 + .../lib/python3.12/site-packages/rich/box.py | 474 + .../python3.12/site-packages/rich/cells.py | 352 + .../python3.12/site-packages/rich/color.py | 621 + .../site-packages/rich/color_triplet.py | 38 + .../python3.12/site-packages/rich/columns.py | 187 + .../python3.12/site-packages/rich/console.py | 2684 + .../site-packages/rich/constrain.py | 37 + .../site-packages/rich/containers.py | 167 + .../python3.12/site-packages/rich/control.py | 219 + .../site-packages/rich/default_styles.py | 195 + .../python3.12/site-packages/rich/diagnose.py | 39 + .../python3.12/site-packages/rich/emoji.py | 91 + .../python3.12/site-packages/rich/errors.py | 34 + .../site-packages/rich/file_proxy.py | 57 + .../python3.12/site-packages/rich/filesize.py | 88 + .../site-packages/rich/highlighter.py | 232 + .../lib/python3.12/site-packages/rich/json.py | 139 + .../python3.12/site-packages/rich/jupyter.py | 101 + .../python3.12/site-packages/rich/layout.py | 442 + .../lib/python3.12/site-packages/rich/live.py | 404 + .../site-packages/rich/live_render.py | 116 + .../python3.12/site-packages/rich/logging.py | 297 + .../python3.12/site-packages/rich/markdown.py | 793 + .../python3.12/site-packages/rich/markup.py | 251 + .../python3.12/site-packages/rich/measure.py | 151 + .../python3.12/site-packages/rich/padding.py | 141 + .../python3.12/site-packages/rich/pager.py | 34 + .../python3.12/site-packages/rich/palette.py | 100 + .../python3.12/site-packages/rich/panel.py | 317 + .../python3.12/site-packages/rich/pretty.py | 1016 + .../python3.12/site-packages/rich/progress.py | 1716 + .../site-packages/rich/progress_bar.py | 223 + .../python3.12/site-packages/rich/prompt.py | 400 + .../python3.12/site-packages/rich/protocol.py | 42 + .../python3.12/site-packages/rich/py.typed | 0 .../python3.12/site-packages/rich/region.py | 10 + .../lib/python3.12/site-packages/rich/repr.py | 149 + .../lib/python3.12/site-packages/rich/rule.py | 130 + .../python3.12/site-packages/rich/scope.py | 92 + .../python3.12/site-packages/rich/screen.py | 54 + .../python3.12/site-packages/rich/segment.py | 783 + .../python3.12/site-packages/rich/spinner.py | 132 + .../python3.12/site-packages/rich/status.py | 131 + .../python3.12/site-packages/rich/style.py | 792 + .../python3.12/site-packages/rich/styled.py | 42 + .../python3.12/site-packages/rich/syntax.py | 985 + .../python3.12/site-packages/rich/table.py | 1015 + .../site-packages/rich/terminal_theme.py | 153 + .../lib/python3.12/site-packages/rich/text.py | 1363 + .../python3.12/site-packages/rich/theme.py | 115 + .../python3.12/site-packages/rich/themes.py | 5 + .../site-packages/rich/traceback.py | 924 + .../lib/python3.12/site-packages/rich/tree.py | 257 + .../sqlalchemy-2.0.49.dist-info/INSTALLER | 1 + .../sqlalchemy-2.0.49.dist-info/METADATA | 243 + .../sqlalchemy-2.0.49.dist-info/RECORD | 531 + .../sqlalchemy-2.0.49.dist-info/WHEEL | 7 + .../licenses/LICENSE | 19 + .../sqlalchemy-2.0.49.dist-info/top_level.txt | 1 + .../site-packages/sqlalchemy/__init__.py | 283 + .../sqlalchemy/connectors/__init__.py | 18 + .../sqlalchemy/connectors/aioodbc.py | 194 + .../sqlalchemy/connectors/asyncio.py | 429 + .../sqlalchemy/connectors/pyodbc.py | 250 + .../sqlalchemy/cyextension/__init__.py | 6 + ...ollections.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 2017984 bytes .../sqlalchemy/cyextension/collections.pyx | 409 + ...utabledict.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 819064 bytes .../sqlalchemy/cyextension/immutabledict.pxd | 8 + .../sqlalchemy/cyextension/immutabledict.pyx | 133 + ...processors.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 630736 bytes .../sqlalchemy/cyextension/processors.pyx | 68 + ...esultproxy.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 611072 bytes .../sqlalchemy/cyextension/resultproxy.pyx | 102 + .../util.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 958336 bytes .../sqlalchemy/cyextension/util.pyx | 90 + .../sqlalchemy/dialects/__init__.py | 62 + .../sqlalchemy/dialects/_typing.py | 30 + .../sqlalchemy/dialects/mssql/__init__.py | 88 + .../sqlalchemy/dialects/mssql/aioodbc.py | 63 + .../sqlalchemy/dialects/mssql/base.py | 4114 ++ .../dialects/mssql/information_schema.py | 285 + .../sqlalchemy/dialects/mssql/json.py | 129 + .../sqlalchemy/dialects/mssql/provision.py | 185 + .../sqlalchemy/dialects/mssql/pymssql.py | 126 + .../sqlalchemy/dialects/mssql/pyodbc.py | 760 + .../sqlalchemy/dialects/mysql/__init__.py | 104 + .../sqlalchemy/dialects/mysql/aiomysql.py | 250 + .../sqlalchemy/dialects/mysql/asyncmy.py | 231 + .../sqlalchemy/dialects/mysql/base.py | 3949 ++ .../sqlalchemy/dialects/mysql/cymysql.py | 106 + .../sqlalchemy/dialects/mysql/dml.py | 225 + .../sqlalchemy/dialects/mysql/enumerated.py | 282 + .../sqlalchemy/dialects/mysql/expression.py | 146 + .../sqlalchemy/dialects/mysql/json.py | 91 + .../sqlalchemy/dialects/mysql/mariadb.py | 72 + .../dialects/mysql/mariadbconnector.py | 322 + .../dialects/mysql/mysqlconnector.py | 302 + .../sqlalchemy/dialects/mysql/mysqldb.py | 314 + .../sqlalchemy/dialects/mysql/provision.py | 153 + .../sqlalchemy/dialects/mysql/pymysql.py | 158 + .../sqlalchemy/dialects/mysql/pyodbc.py | 157 + .../sqlalchemy/dialects/mysql/reflection.py | 727 + .../dialects/mysql/reserved_words.py | 570 + .../sqlalchemy/dialects/mysql/types.py | 835 + .../sqlalchemy/dialects/oracle/__init__.py | 81 + .../sqlalchemy/dialects/oracle/base.py | 3806 + .../sqlalchemy/dialects/oracle/cx_oracle.py | 1555 + .../sqlalchemy/dialects/oracle/dictionary.py | 507 + .../sqlalchemy/dialects/oracle/oracledb.py | 941 + .../sqlalchemy/dialects/oracle/provision.py | 297 + .../sqlalchemy/dialects/oracle/types.py | 316 + .../sqlalchemy/dialects/oracle/vector.py | 365 + .../dialects/postgresql/__init__.py | 167 + .../dialects/postgresql/_psycopg_common.py | 189 + .../sqlalchemy/dialects/postgresql/array.py | 519 + .../sqlalchemy/dialects/postgresql/asyncpg.py | 1284 + .../sqlalchemy/dialects/postgresql/base.py | 5378 ++ .../sqlalchemy/dialects/postgresql/dml.py | 339 + .../sqlalchemy/dialects/postgresql/ext.py | 540 + .../sqlalchemy/dialects/postgresql/hstore.py | 406 + .../sqlalchemy/dialects/postgresql/json.py | 404 + .../dialects/postgresql/named_types.py | 524 + .../dialects/postgresql/operators.py | 129 + .../sqlalchemy/dialects/postgresql/pg8000.py | 669 + .../dialects/postgresql/pg_catalog.py | 326 + .../dialects/postgresql/provision.py | 183 + .../sqlalchemy/dialects/postgresql/psycopg.py | 862 + .../dialects/postgresql/psycopg2.py | 892 + .../dialects/postgresql/psycopg2cffi.py | 61 + .../sqlalchemy/dialects/postgresql/ranges.py | 1031 + .../sqlalchemy/dialects/postgresql/types.py | 313 + .../sqlalchemy/dialects/sqlite/__init__.py | 57 + .../sqlalchemy/dialects/sqlite/aiosqlite.py | 482 + .../sqlalchemy/dialects/sqlite/base.py | 3056 + .../sqlalchemy/dialects/sqlite/dml.py | 263 + .../sqlalchemy/dialects/sqlite/json.py | 92 + .../sqlalchemy/dialects/sqlite/provision.py | 229 + .../sqlalchemy/dialects/sqlite/pysqlcipher.py | 157 + .../sqlalchemy/dialects/sqlite/pysqlite.py | 756 + .../dialects/type_migration_guidelines.txt | 145 + .../sqlalchemy/engine/__init__.py | 62 + .../sqlalchemy/engine/_py_processors.py | 136 + .../sqlalchemy/engine/_py_row.py | 128 + .../sqlalchemy/engine/_py_util.py | 74 + .../site-packages/sqlalchemy/engine/base.py | 3390 + .../sqlalchemy/engine/characteristics.py | 155 + .../site-packages/sqlalchemy/engine/create.py | 899 + .../site-packages/sqlalchemy/engine/cursor.py | 2303 + .../sqlalchemy/engine/default.py | 2394 + .../site-packages/sqlalchemy/engine/events.py | 965 + .../sqlalchemy/engine/interfaces.py | 3471 + .../site-packages/sqlalchemy/engine/mock.py | 134 + .../sqlalchemy/engine/processors.py | 61 + .../sqlalchemy/engine/reflection.py | 2102 + .../site-packages/sqlalchemy/engine/result.py | 2422 + .../site-packages/sqlalchemy/engine/row.py | 400 + .../sqlalchemy/engine/strategies.py | 16 + .../site-packages/sqlalchemy/engine/url.py | 924 + .../site-packages/sqlalchemy/engine/util.py | 167 + .../sqlalchemy/event/__init__.py | 26 + .../site-packages/sqlalchemy/event/api.py | 220 + .../site-packages/sqlalchemy/event/attr.py | 676 + .../site-packages/sqlalchemy/event/base.py | 472 + .../site-packages/sqlalchemy/event/legacy.py | 258 + .../sqlalchemy/event/registry.py | 390 + .../site-packages/sqlalchemy/events.py | 17 + .../site-packages/sqlalchemy/exc.py | 832 + .../site-packages/sqlalchemy/ext/__init__.py | 11 + .../sqlalchemy/ext/associationproxy.py | 2027 + .../sqlalchemy/ext/asyncio/__init__.py | 25 + .../sqlalchemy/ext/asyncio/base.py | 281 + .../sqlalchemy/ext/asyncio/engine.py | 1471 + .../sqlalchemy/ext/asyncio/exc.py | 21 + .../sqlalchemy/ext/asyncio/result.py | 965 + .../sqlalchemy/ext/asyncio/scoping.py | 1599 + .../sqlalchemy/ext/asyncio/session.py | 1947 + .../site-packages/sqlalchemy/ext/automap.py | 1701 + .../site-packages/sqlalchemy/ext/baked.py | 570 + .../site-packages/sqlalchemy/ext/compiler.py | 600 + .../sqlalchemy/ext/declarative/__init__.py | 65 + .../sqlalchemy/ext/declarative/extensions.py | 564 + .../sqlalchemy/ext/horizontal_shard.py | 478 + .../site-packages/sqlalchemy/ext/hybrid.py | 1535 + .../site-packages/sqlalchemy/ext/indexable.py | 364 + .../sqlalchemy/ext/instrumentation.py | 450 + .../site-packages/sqlalchemy/ext/mutable.py | 1085 + .../sqlalchemy/ext/mypy/__init__.py | 6 + .../sqlalchemy/ext/mypy/apply.py | 324 + .../sqlalchemy/ext/mypy/decl_class.py | 515 + .../sqlalchemy/ext/mypy/infer.py | 590 + .../sqlalchemy/ext/mypy/names.py | 335 + .../sqlalchemy/ext/mypy/plugin.py | 303 + .../site-packages/sqlalchemy/ext/mypy/util.py | 357 + .../sqlalchemy/ext/orderinglist.py | 439 + .../sqlalchemy/ext/serializer.py | 185 + .../sqlalchemy/future/__init__.py | 16 + .../site-packages/sqlalchemy/future/engine.py | 15 + .../site-packages/sqlalchemy/inspection.py | 174 + .../site-packages/sqlalchemy/log.py | 288 + .../site-packages/sqlalchemy/orm/__init__.py | 171 + .../sqlalchemy/orm/_orm_constructors.py | 2661 + .../site-packages/sqlalchemy/orm/_typing.py | 179 + .../sqlalchemy/orm/attributes.py | 2845 + .../site-packages/sqlalchemy/orm/base.py | 971 + .../sqlalchemy/orm/bulk_persistence.py | 2135 + .../sqlalchemy/orm/clsregistry.py | 571 + .../sqlalchemy/orm/collections.py | 1627 + .../site-packages/sqlalchemy/orm/context.py | 3334 + .../site-packages/sqlalchemy/orm/decl_api.py | 2004 + .../site-packages/sqlalchemy/orm/decl_base.py | 2192 + .../sqlalchemy/orm/dependency.py | 1302 + .../sqlalchemy/orm/descriptor_props.py | 1092 + .../site-packages/sqlalchemy/orm/dynamic.py | 307 + .../site-packages/sqlalchemy/orm/evaluator.py | 379 + .../site-packages/sqlalchemy/orm/events.py | 3252 + .../site-packages/sqlalchemy/orm/exc.py | 237 + .../site-packages/sqlalchemy/orm/identity.py | 302 + .../sqlalchemy/orm/instrumentation.py | 754 + .../sqlalchemy/orm/interfaces.py | 1496 + .../site-packages/sqlalchemy/orm/loading.py | 1686 + .../sqlalchemy/orm/mapped_collection.py | 557 + .../site-packages/sqlalchemy/orm/mapper.py | 4444 ++ .../sqlalchemy/orm/path_registry.py | 824 + .../sqlalchemy/orm/persistence.py | 1788 + .../sqlalchemy/orm/properties.py | 935 + .../site-packages/sqlalchemy/orm/query.py | 3466 + .../sqlalchemy/orm/relationships.py | 3508 + .../site-packages/sqlalchemy/orm/scoping.py | 2148 + .../site-packages/sqlalchemy/orm/session.py | 5280 ++ .../site-packages/sqlalchemy/orm/state.py | 1168 + .../sqlalchemy/orm/state_changes.py | 196 + .../sqlalchemy/orm/strategies.py | 3482 + .../sqlalchemy/orm/strategy_options.py | 2586 + .../site-packages/sqlalchemy/orm/sync.py | 164 + .../sqlalchemy/orm/unitofwork.py | 796 + .../site-packages/sqlalchemy/orm/util.py | 2403 + .../site-packages/sqlalchemy/orm/writeonly.py | 674 + .../site-packages/sqlalchemy/pool/__init__.py | 44 + .../site-packages/sqlalchemy/pool/base.py | 1524 + .../site-packages/sqlalchemy/pool/events.py | 375 + .../site-packages/sqlalchemy/pool/impl.py | 588 + .../site-packages/sqlalchemy/py.typed | 0 .../site-packages/sqlalchemy/schema.py | 69 + .../site-packages/sqlalchemy/sql/__init__.py | 145 + .../sqlalchemy/sql/_dml_constructors.py | 132 + .../sqlalchemy/sql/_elements_constructors.py | 1872 + .../sqlalchemy/sql/_orm_types.py | 20 + .../site-packages/sqlalchemy/sql/_py_util.py | 75 + .../sql/_selectable_constructors.py | 763 + .../site-packages/sqlalchemy/sql/_typing.py | 482 + .../sqlalchemy/sql/annotation.py | 587 + .../site-packages/sqlalchemy/sql/base.py | 2293 + .../site-packages/sqlalchemy/sql/cache_key.py | 1057 + .../site-packages/sqlalchemy/sql/coercions.py | 1404 + .../site-packages/sqlalchemy/sql/compiler.py | 8083 +++ .../site-packages/sqlalchemy/sql/crud.py | 1752 + .../site-packages/sqlalchemy/sql/ddl.py | 1444 + .../sqlalchemy/sql/default_comparator.py | 551 + .../site-packages/sqlalchemy/sql/dml.py | 1853 + .../site-packages/sqlalchemy/sql/elements.py | 5589 ++ .../site-packages/sqlalchemy/sql/events.py | 458 + .../sqlalchemy/sql/expression.py | 159 + .../site-packages/sqlalchemy/sql/functions.py | 2199 + .../site-packages/sqlalchemy/sql/lambdas.py | 1442 + .../site-packages/sqlalchemy/sql/naming.py | 209 + .../site-packages/sqlalchemy/sql/operators.py | 2623 + .../site-packages/sqlalchemy/sql/roles.py | 323 + .../site-packages/sqlalchemy/sql/schema.py | 6225 ++ .../sqlalchemy/sql/selectable.py | 7265 ++ .../site-packages/sqlalchemy/sql/sqltypes.py | 3930 ++ .../sqlalchemy/sql/traversals.py | 1024 + .../site-packages/sqlalchemy/sql/type_api.py | 2368 + .../site-packages/sqlalchemy/sql/util.py | 1485 + .../site-packages/sqlalchemy/sql/visitors.py | 1164 + .../sqlalchemy/testing/__init__.py | 96 + .../sqlalchemy/testing/assertions.py | 994 + .../sqlalchemy/testing/assertsql.py | 520 + .../sqlalchemy/testing/asyncio.py | 135 + .../sqlalchemy/testing/config.py | 434 + .../sqlalchemy/testing/engines.py | 483 + .../sqlalchemy/testing/entities.py | 117 + .../sqlalchemy/testing/exclusions.py | 476 + .../sqlalchemy/testing/fixtures/__init__.py | 28 + .../sqlalchemy/testing/fixtures/base.py | 384 + .../sqlalchemy/testing/fixtures/mypy.py | 335 + .../sqlalchemy/testing/fixtures/orm.py | 227 + .../sqlalchemy/testing/fixtures/sql.py | 482 + .../sqlalchemy/testing/pickleable.py | 155 + .../sqlalchemy/testing/plugin/__init__.py | 6 + .../sqlalchemy/testing/plugin/bootstrap.py | 51 + .../sqlalchemy/testing/plugin/plugin_base.py | 828 + .../sqlalchemy/testing/plugin/pytestplugin.py | 892 + .../sqlalchemy/testing/profiling.py | 329 + .../sqlalchemy/testing/provision.py | 603 + .../sqlalchemy/testing/requirements.py | 1945 + .../sqlalchemy/testing/schema.py | 198 + .../sqlalchemy/testing/suite/__init__.py | 19 + .../sqlalchemy/testing/suite/test_cte.py | 237 + .../sqlalchemy/testing/suite/test_ddl.py | 389 + .../testing/suite/test_deprecations.py | 153 + .../sqlalchemy/testing/suite/test_dialect.py | 776 + .../sqlalchemy/testing/suite/test_insert.py | 630 + .../testing/suite/test_reflection.py | 3557 + .../sqlalchemy/testing/suite/test_results.py | 504 + .../sqlalchemy/testing/suite/test_rowcount.py | 258 + .../sqlalchemy/testing/suite/test_select.py | 2010 + .../sqlalchemy/testing/suite/test_sequence.py | 317 + .../sqlalchemy/testing/suite/test_types.py | 2147 + .../testing/suite/test_unicode_ddl.py | 189 + .../testing/suite/test_update_delete.py | 139 + .../site-packages/sqlalchemy/testing/util.py | 535 + .../sqlalchemy/testing/warnings.py | 52 + .../site-packages/sqlalchemy/types.py | 74 + .../site-packages/sqlalchemy/util/__init__.py | 162 + .../sqlalchemy/util/_collections.py | 712 + .../sqlalchemy/util/_concurrency_py3k.py | 288 + .../site-packages/sqlalchemy/util/_has_cy.py | 40 + .../sqlalchemy/util/_py_collections.py | 541 + .../site-packages/sqlalchemy/util/compat.py | 421 + .../sqlalchemy/util/concurrency.py | 110 + .../sqlalchemy/util/deprecations.py | 401 + .../sqlalchemy/util/langhelpers.py | 2203 + .../sqlalchemy/util/preloaded.py | 150 + .../site-packages/sqlalchemy/util/queue.py | 322 + .../sqlalchemy/util/tool_support.py | 201 + .../sqlalchemy/util/topological.py | 120 + .../site-packages/sqlalchemy/util/typing.py | 734 + .../stevedore-5.7.0.dist-info/INSTALLER | 1 + .../stevedore-5.7.0.dist-info/METADATA | 57 + .../stevedore-5.7.0.dist-info/RECORD | 82 + .../stevedore-5.7.0.dist-info/WHEEL | 5 + .../entry_points.txt | 10 + .../licenses/AUTHORS | 75 + .../licenses/LICENSE | 202 + .../stevedore-5.7.0.dist-info/pbr.json | 1 + .../stevedore-5.7.0.dist-info/top_level.txt | 1 + .../site-packages/stevedore/__init__.py | 23 + .../site-packages/stevedore/_cache.py | 217 + .../site-packages/stevedore/dispatch.py | 265 + .../site-packages/stevedore/driver.py | 208 + .../site-packages/stevedore/enabled.py | 103 + .../stevedore/example/__init__.py | 0 .../site-packages/stevedore/example/base.py | 33 + .../stevedore/example/load_as_driver.py | 44 + .../stevedore/example/load_as_extension.py | 53 + .../stevedore/example/pyproject.toml | 40 + .../site-packages/stevedore/example/setup.py | 18 + .../site-packages/stevedore/example/simple.py | 32 + .../stevedore/example2/__init__.py | 0 .../stevedore/example2/fields.py | 49 + .../stevedore/example2/pyproject.toml | 39 + .../site-packages/stevedore/example2/setup.py | 18 + .../site-packages/stevedore/exception.py | 23 + .../site-packages/stevedore/extension.py | 456 + .../site-packages/stevedore/hook.py | 107 + .../site-packages/stevedore/named.py | 218 + .../site-packages/stevedore/py.typed | 0 .../site-packages/stevedore/sphinxext.py | 138 + .../site-packages/stevedore/tests/__init__.py | 0 .../stevedore/tests/extension_unimportable.py | 0 .../site-packages/stevedore/tests/manager.py | 64 + .../stevedore/tests/test_cache.py | 63 + .../stevedore/tests/test_callback.py | 57 + .../stevedore/tests/test_dispatch.py | 103 + .../stevedore/tests/test_driver.py | 101 + .../stevedore/tests/test_enabled.py | 44 + .../stevedore/tests/test_example_fields.py | 39 + .../stevedore/tests/test_example_simple.py | 24 + .../stevedore/tests/test_extension.py | 375 + .../stevedore/tests/test_hook.py | 60 + .../stevedore/tests/test_named.py | 94 + .../stevedore/tests/test_sphinxext.py | 113 + .../stevedore/tests/test_test_manager.py | 263 + .../site-packages/stevedore/tests/utils.py | 17 + .../INSTALLER | 1 + .../METADATA | 72 + .../typing_extensions-4.15.0.dist-info/RECORD | 7 + .../typing_extensions-4.15.0.dist-info/WHEEL | 4 + .../licenses/LICENSE | 279 + .../site-packages/typing_extensions.py | 4317 ++ .../werkzeug-3.1.8.dist-info/INSTALLER | 1 + .../werkzeug-3.1.8.dist-info/METADATA | 109 + .../werkzeug-3.1.8.dist-info/RECORD | 116 + .../werkzeug-3.1.8.dist-info/WHEEL | 4 + .../licenses/LICENSE.txt | 28 + .../site-packages/werkzeug/__init__.py | 4 + .../site-packages/werkzeug/_internal.py | 211 + .../site-packages/werkzeug/_reloader.py | 465 + .../werkzeug/datastructures/__init__.py | 64 + .../werkzeug/datastructures/accept.py | 350 + .../werkzeug/datastructures/auth.py | 320 + .../werkzeug/datastructures/cache_control.py | 273 + .../werkzeug/datastructures/csp.py | 100 + .../werkzeug/datastructures/etag.py | 106 + .../werkzeug/datastructures/file_storage.py | 209 + .../werkzeug/datastructures/headers.py | 662 + .../werkzeug/datastructures/mixins.py | 317 + .../werkzeug/datastructures/range.py | 214 + .../werkzeug/datastructures/structures.py | 1239 + .../site-packages/werkzeug/debug/__init__.py | 574 + .../site-packages/werkzeug/debug/console.py | 219 + .../site-packages/werkzeug/debug/repr.py | 282 + .../werkzeug/debug/shared/ICON_LICENSE.md | 6 + .../werkzeug/debug/shared/console.png | Bin 0 -> 507 bytes .../werkzeug/debug/shared/debugger.js | 344 + .../werkzeug/debug/shared/less.png | Bin 0 -> 191 bytes .../werkzeug/debug/shared/more.png | Bin 0 -> 200 bytes .../werkzeug/debug/shared/style.css | 150 + .../site-packages/werkzeug/debug/tbtools.py | 449 + .../site-packages/werkzeug/exceptions.py | 905 + .../site-packages/werkzeug/formparser.py | 430 + .../python3.12/site-packages/werkzeug/http.py | 1443 + .../site-packages/werkzeug/local.py | 653 + .../werkzeug/middleware/__init__.py | 0 .../werkzeug/middleware/dispatcher.py | 81 + .../werkzeug/middleware/http_proxy.py | 236 + .../site-packages/werkzeug/middleware/lint.py | 439 + .../werkzeug/middleware/profiler.py | 155 + .../werkzeug/middleware/proxy_fix.py | 183 + .../werkzeug/middleware/shared_data.py | 283 + .../site-packages/werkzeug/py.typed | 0 .../werkzeug/routing/__init__.py | 134 + .../werkzeug/routing/converters.py | 261 + .../werkzeug/routing/exceptions.py | 152 + .../site-packages/werkzeug/routing/map.py | 928 + .../site-packages/werkzeug/routing/matcher.py | 202 + .../site-packages/werkzeug/routing/rules.py | 927 + .../site-packages/werkzeug/sansio/__init__.py | 0 .../site-packages/werkzeug/sansio/http.py | 170 + .../werkzeug/sansio/multipart.py | 331 + .../site-packages/werkzeug/sansio/request.py | 536 + .../site-packages/werkzeug/sansio/response.py | 763 + .../site-packages/werkzeug/sansio/utils.py | 224 + .../site-packages/werkzeug/security.py | 201 + .../site-packages/werkzeug/serving.py | 1126 + .../python3.12/site-packages/werkzeug/test.py | 1464 + .../site-packages/werkzeug/testapp.py | 194 + .../python3.12/site-packages/werkzeug/urls.py | 203 + .../site-packages/werkzeug/user_agent.py | 47 + .../site-packages/werkzeug/utils.py | 684 + .../werkzeug/wrappers/__init__.py | 3 + .../werkzeug/wrappers/request.py | 650 + .../werkzeug/wrappers/response.py | 838 + .../python3.12/site-packages/werkzeug/wsgi.py | 609 + .../wtforms-3.2.1.dist-info/INSTALLER | 1 + .../wtforms-3.2.1.dist-info/METADATA | 119 + .../wtforms-3.2.1.dist-info/RECORD | 109 + .../wtforms-3.2.1.dist-info/WHEEL | 4 + .../licenses/LICENSE.rst | 28 + .../site-packages/wtforms/__init__.py | 79 + .../site-packages/wtforms/csrf/__init__.py | 0 .../site-packages/wtforms/csrf/core.py | 96 + .../site-packages/wtforms/csrf/session.py | 93 + .../site-packages/wtforms/fields/__init__.py | 71 + .../site-packages/wtforms/fields/choices.py | 229 + .../site-packages/wtforms/fields/core.py | 448 + .../site-packages/wtforms/fields/datetime.py | 170 + .../site-packages/wtforms/fields/form.py | 98 + .../site-packages/wtforms/fields/list.py | 202 + .../site-packages/wtforms/fields/numeric.py | 213 + .../site-packages/wtforms/fields/simple.py | 173 + .../python3.12/site-packages/wtforms/form.py | 330 + .../python3.12/site-packages/wtforms/i18n.py | 72 + .../site-packages/wtforms/locale/README.md | 62 + .../wtforms/locale/ar/LC_MESSAGES/wtforms.mo | Bin 0 -> 4393 bytes .../wtforms/locale/ar/LC_MESSAGES/wtforms.po | 205 + .../wtforms/locale/bg/LC_MESSAGES/wtforms.mo | Bin 0 -> 3932 bytes .../wtforms/locale/bg/LC_MESSAGES/wtforms.po | 190 + .../wtforms/locale/ca/LC_MESSAGES/wtforms.mo | Bin 0 -> 3177 bytes .../wtforms/locale/ca/LC_MESSAGES/wtforms.po | 189 + .../locale/cs_CZ/LC_MESSAGES/wtforms.mo | Bin 0 -> 3398 bytes .../locale/cs_CZ/LC_MESSAGES/wtforms.po | 192 + .../wtforms/locale/cy/LC_MESSAGES/wtforms.mo | Bin 0 -> 3142 bytes .../wtforms/locale/cy/LC_MESSAGES/wtforms.po | 189 + .../wtforms/locale/de/LC_MESSAGES/wtforms.mo | Bin 0 -> 3175 bytes .../wtforms/locale/de/LC_MESSAGES/wtforms.po | 190 + .../locale/de_CH/LC_MESSAGES/wtforms.mo | Bin 0 -> 3169 bytes .../locale/de_CH/LC_MESSAGES/wtforms.po | 190 + .../wtforms/locale/el/LC_MESSAGES/wtforms.mo | Bin 0 -> 3951 bytes .../wtforms/locale/el/LC_MESSAGES/wtforms.po | 188 + .../wtforms/locale/en/LC_MESSAGES/wtforms.mo | Bin 0 -> 3323 bytes .../wtforms/locale/en/LC_MESSAGES/wtforms.po | 169 + .../wtforms/locale/es/LC_MESSAGES/wtforms.mo | Bin 0 -> 3882 bytes .../wtforms/locale/es/LC_MESSAGES/wtforms.po | 187 + .../wtforms/locale/et/LC_MESSAGES/wtforms.mo | Bin 0 -> 3202 bytes .../wtforms/locale/et/LC_MESSAGES/wtforms.po | 188 + .../wtforms/locale/fa/LC_MESSAGES/wtforms.mo | Bin 0 -> 3796 bytes .../wtforms/locale/fa/LC_MESSAGES/wtforms.po | 187 + .../wtforms/locale/fi/LC_MESSAGES/wtforms.mo | Bin 0 -> 3152 bytes .../wtforms/locale/fi/LC_MESSAGES/wtforms.po | 188 + .../wtforms/locale/fr/LC_MESSAGES/wtforms.mo | Bin 0 -> 3961 bytes .../wtforms/locale/fr/LC_MESSAGES/wtforms.po | 188 + .../wtforms/locale/he/LC_MESSAGES/wtforms.mo | Bin 0 -> 3265 bytes .../wtforms/locale/he/LC_MESSAGES/wtforms.po | 188 + .../wtforms/locale/hu/LC_MESSAGES/wtforms.mo | Bin 0 -> 3275 bytes .../wtforms/locale/hu/LC_MESSAGES/wtforms.po | 188 + .../wtforms/locale/it/LC_MESSAGES/wtforms.mo | Bin 0 -> 3248 bytes .../wtforms/locale/it/LC_MESSAGES/wtforms.po | 190 + .../wtforms/locale/ja/LC_MESSAGES/wtforms.mo | Bin 0 -> 3481 bytes .../wtforms/locale/ja/LC_MESSAGES/wtforms.po | 184 + .../wtforms/locale/kk/LC_MESSAGES/wtforms.mo | Bin 0 -> 4921 bytes .../wtforms/locale/kk/LC_MESSAGES/wtforms.po | 187 + .../wtforms/locale/ko/LC_MESSAGES/wtforms.mo | Bin 0 -> 4291 bytes .../wtforms/locale/ko/LC_MESSAGES/wtforms.po | 184 + .../wtforms/locale/nb/LC_MESSAGES/wtforms.mo | Bin 0 -> 3080 bytes .../wtforms/locale/nb/LC_MESSAGES/wtforms.po | 188 + .../wtforms/locale/nl/LC_MESSAGES/wtforms.mo | Bin 0 -> 3732 bytes .../wtforms/locale/nl/LC_MESSAGES/wtforms.po | 186 + .../wtforms/locale/pl/LC_MESSAGES/wtforms.mo | Bin 0 -> 3428 bytes .../wtforms/locale/pl/LC_MESSAGES/wtforms.po | 194 + .../wtforms/locale/pt/LC_MESSAGES/wtforms.mo | Bin 0 -> 3892 bytes .../wtforms/locale/pt/LC_MESSAGES/wtforms.po | 185 + .../wtforms/locale/ro/LC_MESSAGES/wtforms.mo | Bin 0 -> 4066 bytes .../wtforms/locale/ro/LC_MESSAGES/wtforms.po | 195 + .../wtforms/locale/ru/LC_MESSAGES/wtforms.mo | Bin 0 -> 4712 bytes .../wtforms/locale/ru/LC_MESSAGES/wtforms.po | 195 + .../wtforms/locale/sk/LC_MESSAGES/wtforms.mo | Bin 0 -> 4054 bytes .../wtforms/locale/sk/LC_MESSAGES/wtforms.po | 189 + .../wtforms/locale/sv/LC_MESSAGES/wtforms.mo | Bin 0 -> 3818 bytes .../wtforms/locale/sv/LC_MESSAGES/wtforms.po | 185 + .../wtforms/locale/tr/LC_MESSAGES/wtforms.mo | Bin 0 -> 3885 bytes .../wtforms/locale/tr/LC_MESSAGES/wtforms.po | 185 + .../wtforms/locale/uk/LC_MESSAGES/wtforms.mo | Bin 0 -> 5187 bytes .../wtforms/locale/uk/LC_MESSAGES/wtforms.po | 190 + .../site-packages/wtforms/locale/wtforms.pot | 182 + .../wtforms/locale/zh/LC_MESSAGES/wtforms.mo | Bin 0 -> 3296 bytes .../wtforms/locale/zh/LC_MESSAGES/wtforms.po | 188 + .../locale/zh_TW/LC_MESSAGES/wtforms.mo | Bin 0 -> 3653 bytes .../locale/zh_TW/LC_MESSAGES/wtforms.po | 181 + .../python3.12/site-packages/wtforms/meta.py | 132 + .../python3.12/site-packages/wtforms/utils.py | 91 + .../site-packages/wtforms/validators.py | 734 + .../site-packages/wtforms/widgets/__init__.py | 57 + .../site-packages/wtforms/widgets/core.py | 569 + .../python3.12/site-packages/yaml/__init__.py | 390 + .../_yaml.cpython-312-x86_64-linux-gnu.so | Bin 0 -> 2679264 bytes .../python3.12/site-packages/yaml/composer.py | 139 + .../site-packages/yaml/constructor.py | 748 + .../python3.12/site-packages/yaml/cyaml.py | 101 + .../python3.12/site-packages/yaml/dumper.py | 62 + .../python3.12/site-packages/yaml/emitter.py | 1137 + .../python3.12/site-packages/yaml/error.py | 75 + .../python3.12/site-packages/yaml/events.py | 86 + .../python3.12/site-packages/yaml/loader.py | 63 + .../python3.12/site-packages/yaml/nodes.py | 49 + .../python3.12/site-packages/yaml/parser.py | 589 + .../python3.12/site-packages/yaml/reader.py | 185 + .../site-packages/yaml/representer.py | 389 + .../python3.12/site-packages/yaml/resolver.py | 227 + .../python3.12/site-packages/yaml/scanner.py | 1435 + .../site-packages/yaml/serializer.py | 111 + .../python3.12/site-packages/yaml/tokens.py | 104 + Python/Flask_Blog/11-Blueprints/venv/lib64 | 1 + .../Flask_Blog/11-Blueprints/venv/pyvenv.cfg | 5 + .../venv/share/man/man1/bandit.1 | 243 + 2283 files changed, 927873 insertions(+), 6 deletions(-) create mode 100644 Python/Flask_Blog/11-Blueprints/bandit_report.html create mode 100644 Python/Flask_Blog/11-Blueprints/bandit_report_updated.html create mode 100644 Python/Flask_Blog/11-Blueprints/instance/site.db create mode 100644 Python/Flask_Blog/11-Blueprints/trojansource.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/bin/Activate.ps1 create mode 100644 Python/Flask_Blog/11-Blueprints/venv/bin/activate create mode 100644 Python/Flask_Blog/11-Blueprints/venv/bin/activate.csh create mode 100644 Python/Flask_Blog/11-Blueprints/venv/bin/activate.fish create mode 100755 Python/Flask_Blog/11-Blueprints/venv/bin/bandit create mode 100755 Python/Flask_Blog/11-Blueprints/venv/bin/bandit-baseline create mode 100755 Python/Flask_Blog/11-Blueprints/venv/bin/bandit-config-generator create mode 100755 Python/Flask_Blog/11-Blueprints/venv/bin/email_validator create mode 100755 Python/Flask_Blog/11-Blueprints/venv/bin/flask create mode 100755 Python/Flask_Blog/11-Blueprints/venv/bin/markdown-it create mode 100755 Python/Flask_Blog/11-Blueprints/venv/bin/pip create mode 100755 Python/Flask_Blog/11-Blueprints/venv/bin/pip3 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/bin/pip3.12 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/bin/pygmentize create mode 120000 Python/Flask_Blog/11-Blueprints/venv/bin/python create mode 120000 Python/Flask_Blog/11-Blueprints/venv/bin/python3 create mode 120000 Python/Flask_Blog/11-Blueprints/venv/bin/python3.12 create mode 100644 Python/Flask_Blog/11-Blueprints/venv/include/site/python3.12/greenlet/greenlet.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/LICENSE create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/REQUESTED create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/top_level.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/LICENSE create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/REQUESTED create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/top_level.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/AvifImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/BdfFontFile.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/BufrStubImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ContainerIO.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/CurImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/DcxImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ExifTags.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FitsImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FliImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FontFile.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FpxImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FtexImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GbrImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GdImageFile.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GimpGradientFile.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GimpPaletteFile.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GribStubImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/Hdf5StubImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/IcnsImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/IcoImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/Image.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageChops.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageCms.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageColor.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageDraw.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageDraw2.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageEnhance.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageFile.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageFilter.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageFont.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageGrab.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageMath.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageMode.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageMorph.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageOps.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImagePalette.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImagePath.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageQt.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageSequence.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageShow.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageStat.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageText.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageTk.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageTransform.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageWin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImtImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/IptcImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/JpegPresets.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/McIdasImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/MicImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/MpegImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/MpoImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/MspImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PSDraw.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PaletteFile.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PalmImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PcdImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PcfFontFile.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PcxImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PdfImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PdfParser.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PixarImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PpmImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PsdImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/QoiImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/SgiImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/SpiderImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/SunImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/TarIO.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/TgaImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/TiffTags.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/WalImageFile.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/WebPImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/WmfImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/XVThumbImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/XbmImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/XpmImagePlugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/__main__.py create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_avif.cpython-312-x86_64-linux-gnu.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_avif.pyi create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_binary.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_deprecate.py create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imaging.cpython-312-x86_64-linux-gnu.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imaging.pyi create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imagingcms.cpython-312-x86_64-linux-gnu.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imagingcms.pyi create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imagingft.cpython-312-x86_64-linux-gnu.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imagingft.pyi create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imagingmath.cpython-312-x86_64-linux-gnu.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imagingmath.pyi create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imagingmorph.cpython-312-x86_64-linux-gnu.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imagingmorph.pyi create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imagingtk.cpython-312-x86_64-linux-gnu.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imagingtk.pyi create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_tkinter_finder.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_typing.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_util.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_version.py create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_webp.cpython-312-x86_64-linux-gnu.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_webp.pyi create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/features.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/report.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/_yaml/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit-1.9.4.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit-1.9.4.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit-1.9.4.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit-1.9.4.dist-info/REQUESTED create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit-1.9.4.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit-1.9.4.dist-info/entry_points.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit-1.9.4.dist-info/licenses/LICENSE create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit-1.9.4.dist-info/pbr.json create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit-1.9.4.dist-info/top_level.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/__main__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/blacklists/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/blacklists/calls.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/blacklists/imports.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/blacklists/utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/cli/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/cli/baseline.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/cli/config_generator.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/cli/main.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/core/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/core/blacklisting.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/core/config.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/core/constants.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/core/context.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/core/docs_utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/core/extension_loader.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/core/issue.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/core/manager.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/core/meta_ast.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/core/metrics.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/core/node_visitor.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/core/test_properties.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/core/test_set.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/core/tester.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/core/utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/formatters/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/formatters/csv.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/formatters/custom.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/formatters/html.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/formatters/json.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/formatters/sarif.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/formatters/screen.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/formatters/text.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/formatters/utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/formatters/xml.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/formatters/yaml.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/app_debug.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/asserts.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/crypto_request_no_cert_validation.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/django_sql_injection.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/django_xss.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/exec.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/general_bad_file_permissions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/general_bind_all_interfaces.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/general_hardcoded_password.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/general_hardcoded_tmp.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/hashlib_insecure_functions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/huggingface_unsafe_download.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/injection_paramiko.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/injection_shell.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/injection_sql.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/injection_wildcard.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/insecure_ssl_tls.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/jinja2_templates.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/logging_config_insecure_listen.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/mako_templates.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/markupsafe_markup_xss.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/pytorch_load.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/request_without_timeout.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/snmp_security_check.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/ssh_no_host_key_verification.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/tarfile_unsafe_members.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/trojansource.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/try_except_continue.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/try_except_pass.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/weak_cryptographic_key.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bandit/plugins/yaml_load.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bcrypt-5.0.0.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bcrypt-5.0.0.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bcrypt-5.0.0.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bcrypt-5.0.0.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bcrypt-5.0.0.dist-info/licenses/LICENSE create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bcrypt-5.0.0.dist-info/top_level.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bcrypt/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bcrypt/__init__.pyi create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bcrypt/_bcrypt.abi3.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/bcrypt/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/LICENSE.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/blinker-1.9.0.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/blinker/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/blinker/_utilities.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/blinker/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/blinker/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click-8.3.2.dist-info/licenses/LICENSE.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click/_compat.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click/_termui_impl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click/_textwrap.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click/_utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click/_winconsole.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click/core.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click/decorators.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click/exceptions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click/formatting.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click/globals.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click/parser.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click/shell_completion.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click/termui.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click/testing.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click/types.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/click/utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/_asyncbackend.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/_asyncio_backend.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/_ddr.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/_features.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/_immutable_ctx.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/_no_ssl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/_tls_util.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/_trio_backend.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/asyncbackend.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/asyncquery.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/asyncresolver.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/btree.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/btreezone.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/dnssec.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/dnssecalgs/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/dnssecalgs/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/dnssecalgs/cryptography.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/dnssecalgs/dsa.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/dnssecalgs/ecdsa.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/dnssecalgs/eddsa.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/dnssecalgs/rsa.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/dnssectypes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/e164.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/edns.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/entropy.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/enum.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/exception.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/flags.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/grange.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/immutable.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/inet.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/ipv4.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/ipv6.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/message.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/name.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/namedict.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/nameserver.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/node.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/opcode.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/query.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/quic/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/quic/_asyncio.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/quic/_common.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/quic/_sync.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/quic/_trio.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rcode.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdata.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdataclass.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdataset.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdatatype.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/AFSDB.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/AMTRELAY.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/AVC.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/CAA.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/CDNSKEY.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/CDS.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/CERT.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/CNAME.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/CSYNC.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/DLV.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/DNAME.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/DNSKEY.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/DS.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/DSYNC.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/EUI48.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/EUI64.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/GPOS.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/HINFO.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/HIP.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/ISDN.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/L32.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/L64.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/LOC.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/LP.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/MX.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/NID.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/NINFO.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/NS.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/NSEC.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/NSEC3.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/NSEC3PARAM.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/OPENPGPKEY.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/OPT.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/PTR.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/RESINFO.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/RP.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/RRSIG.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/RT.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/SMIMEA.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/SOA.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/SPF.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/SSHFP.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/TKEY.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/TLSA.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/TSIG.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/TXT.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/URI.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/WALLET.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/X25.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/ZONEMD.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/ANY/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/CH/A.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/CH/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/IN/A.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/IN/AAAA.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/IN/APL.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/IN/DHCID.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/IN/HTTPS.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/IN/IPSECKEY.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/IN/KX.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/IN/NAPTR.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/IN/NSAP.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/IN/NSAP_PTR.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/IN/PX.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/IN/SRV.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/IN/SVCB.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/IN/WKS.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/IN/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/dnskeybase.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/dsbase.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/euibase.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/mxbase.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/nsbase.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/svcbbase.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/tlsabase.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/txtbase.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rdtypes/util.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/renderer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/resolver.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/reversename.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/rrset.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/serial.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/set.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/tokenizer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/transaction.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/tsig.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/tsigkeyring.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/ttl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/update.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/version.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/versioned.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/win32util.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/wire.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/xfr.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/zone.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/zonefile.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dns/zonetypes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dnspython-2.8.0.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dnspython-2.8.0.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dnspython-2.8.0.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dnspython-2.8.0.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/dnspython-2.8.0.dist-info/licenses/LICENSE create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/email_validator-2.3.0.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/email_validator-2.3.0.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/email_validator-2.3.0.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/email_validator-2.3.0.dist-info/REQUESTED create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/email_validator-2.3.0.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/email_validator-2.3.0.dist-info/entry_points.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/email_validator-2.3.0.dist-info/licenses/LICENSE create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/email_validator-2.3.0.dist-info/top_level.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/email_validator/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/email_validator/__main__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/email_validator/deliverability.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/email_validator/exceptions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/email_validator/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/email_validator/rfc_constants.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/email_validator/syntax.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/email_validator/types.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/email_validator/validate_email.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/email_validator/version.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask-3.1.3.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask-3.1.3.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask-3.1.3.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask-3.1.3.dist-info/REQUESTED create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask-3.1.3.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask-3.1.3.dist-info/entry_points.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask-3.1.3.dist-info/licenses/LICENSE.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/__main__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/app.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/blueprints.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/cli.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/config.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/ctx.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/debughelpers.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/globals.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/helpers.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/json/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/json/provider.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/json/tag.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/logging.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/sansio/README.md create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/sansio/app.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/sansio/blueprints.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/sansio/scaffold.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/sessions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/signals.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/templating.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/testing.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/typing.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/views.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask/wrappers.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_bcrypt.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_login/__about__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_login/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_login/config.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_login/login_manager.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_login/mixins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_login/signals.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_login/test_client.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_login/utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_mail-0.10.0.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_mail-0.10.0.dist-info/LICENSE.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_mail-0.10.0.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_mail-0.10.0.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_mail-0.10.0.dist-info/REQUESTED create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_mail-0.10.0.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_mail/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_mail/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/LICENSE.rst create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/REQUESTED create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_sqlalchemy-3.1.1.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_sqlalchemy/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_sqlalchemy/cli.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_sqlalchemy/extension.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_sqlalchemy/model.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_sqlalchemy/pagination.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_sqlalchemy/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_sqlalchemy/query.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_sqlalchemy/record_queries.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_sqlalchemy/session.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_sqlalchemy/table.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_sqlalchemy/track_modifications.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_wtf-1.2.2.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_wtf-1.2.2.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_wtf-1.2.2.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_wtf-1.2.2.dist-info/REQUESTED create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_wtf-1.2.2.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_wtf-1.2.2.dist-info/licenses/LICENSE.rst create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_wtf/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_wtf/_compat.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_wtf/csrf.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_wtf/file.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_wtf/form.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_wtf/i18n.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/fields.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/validators.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/flask_wtf/recaptcha/widgets.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet-3.4.0.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet-3.4.0.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet-3.4.0.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet-3.4.0.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet-3.4.0.dist-info/licenses/LICENSE create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet-3.4.0.dist-info/licenses/LICENSE.PSF create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet-3.4.0.dist-info/top_level.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/CObjects.cpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/PyGreenlet.cpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/PyGreenlet.hpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/PyGreenletUnswitchable.cpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/PyModule.cpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/TBrokenGreenlet.cpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/TExceptionState.cpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/TGreenlet.cpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/TGreenlet.hpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/TGreenletGlobals.cpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/TMainGreenlet.cpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/TPythonState.cpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/TStackState.cpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/TThreadState.hpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/TThreadStateCreator.hpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/TThreadStateDestroy.cpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/TUserGreenlet.cpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/__init__.py create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/_greenlet.cpython-312-x86_64-linux-gnu.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/greenlet.cpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/greenlet.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/greenlet_allocator.hpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/greenlet_compiler_compat.hpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/greenlet_cpython_compat.hpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/greenlet_exceptions.hpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/greenlet_internal.hpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/greenlet_msvc_compat.hpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/greenlet_refs.hpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/greenlet_slp_switch.hpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/greenlet_thread_support.hpp create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/setup_switch_x64_masm.cmd create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_aarch64_gcc.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_alpha_unix.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_amd64_unix.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_arm32_gcc.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_arm32_ios.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_arm64_masm.asm create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_arm64_masm.obj create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_arm64_msvc.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_csky_gcc.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_loongarch64_linux.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_m68k_gcc.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_mips_unix.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_ppc64_aix.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_ppc64_linux.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_ppc_aix.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_ppc_linux.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_ppc_macosx.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_ppc_unix.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_riscv_unix.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_s390_unix.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_sh_gcc.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_sparc_sun_gcc.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_x32_unix.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_x64_masm.asm create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_x64_masm.obj create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_x64_msvc.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_x86_msvc.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/platform/switch_x86_unix.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/slp_platformselect.h create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/_test_extension.c create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/_test_extension.cpython-312-x86_64-linux-gnu.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/_test_extension_cpp.cpp create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/_test_extension_cpp.cpython-312-x86_64-linux-gnu.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/fail_clearing_run_switches.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/fail_cpp_exception.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/fail_slp_switch.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/fail_switch_three_greenlets.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/fail_switch_three_greenlets2.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/fail_switch_two_greenlets.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/leakcheck.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/test_contextvars.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/test_cpp.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/test_extension_interface.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/test_gc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/test_generator.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/test_generator_nested.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/test_greenlet.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/test_greenlet_trash.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/test_interpreter_shutdown.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/test_leaks.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/test_stack_saved.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/test_throw.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/test_tracing.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/test_version.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/greenlet/tests/test_weakref.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/idna-3.11.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/idna-3.11.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/idna-3.11.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/idna-3.11.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/idna-3.11.dist-info/licenses/LICENSE.md create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/idna/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/idna/codec.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/idna/compat.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/idna/core.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/idna/idnadata.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/idna/intranges.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/idna/package_data.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/idna/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/idna/uts46data.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/itsdangerous-2.0.1.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/itsdangerous-2.0.1.dist-info/LICENSE.rst create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/itsdangerous-2.0.1.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/itsdangerous-2.0.1.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/itsdangerous-2.0.1.dist-info/REQUESTED create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/itsdangerous-2.0.1.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/itsdangerous-2.0.1.dist-info/top_level.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/itsdangerous/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/itsdangerous/_json.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/itsdangerous/encoding.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/itsdangerous/exc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/itsdangerous/jws.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/itsdangerous/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/itsdangerous/serializer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/itsdangerous/signer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/itsdangerous/timed.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/itsdangerous/url_safe.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/entry_points.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2-3.1.6.dist-info/licenses/LICENSE.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/_identifier.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/async_utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/bccache.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/compiler.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/constants.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/debug.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/defaults.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/environment.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/exceptions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/ext.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/filters.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/idtracking.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/lexer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/loaders.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/meta.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/nativetypes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/nodes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/optimizer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/parser.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/runtime.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/sandbox.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/tests.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/jinja2/visitor.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/_compat.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/_punycode.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/cli/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/cli/parse.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/common/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/common/entities.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/common/html_blocks.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/common/html_re.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/common/normalize_url.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/common/utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/helpers/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/helpers/parse_link_destination.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/helpers/parse_link_label.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/helpers/parse_link_title.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/main.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/parser_block.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/parser_core.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/parser_inline.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/port.yaml create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/presets/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/presets/commonmark.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/presets/default.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/presets/zero.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/renderer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/ruler.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_block/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_block/blockquote.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_block/code.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_block/fence.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_block/heading.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_block/hr.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_block/html_block.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_block/lheading.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_block/list.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_block/paragraph.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_block/reference.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_block/state_block.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_block/table.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_core/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_core/block.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_core/inline.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_core/linkify.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_core/normalize.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_core/replacements.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_core/smartquotes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_core/state_core.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_core/text_join.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_inline/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_inline/autolink.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_inline/backticks.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_inline/balance_pairs.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_inline/emphasis.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_inline/entity.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_inline/escape.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_inline/fragments_join.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_inline/html_inline.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_inline/image.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_inline/link.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_inline/linkify.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_inline/newline.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_inline/state_inline.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_inline/strikethrough.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/rules_inline/text.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/token.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/tree.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it/utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it_py-4.0.0.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it_py-4.0.0.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it_py-4.0.0.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it_py-4.0.0.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it_py-4.0.0.dist-info/entry_points.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it_py-4.0.0.dist-info/licenses/LICENSE create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markdown_it_py-4.0.0.dist-info/licenses/LICENSE.markdown-it create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markupsafe-3.0.3.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markupsafe-3.0.3.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markupsafe-3.0.3.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markupsafe-3.0.3.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markupsafe-3.0.3.dist-info/licenses/LICENSE.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markupsafe-3.0.3.dist-info/top_level.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markupsafe/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markupsafe/_native.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markupsafe/_speedups.c create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markupsafe/_speedups.cpython-312-x86_64-linux-gnu.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markupsafe/_speedups.pyi create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/markupsafe/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/LICENSE create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/mdurl-0.1.2.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/mdurl/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/mdurl/_decode.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/mdurl/_encode.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/mdurl/_format.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/mdurl/_parse.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/mdurl/_url.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/mdurl/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow-12.2.0.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow-12.2.0.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow-12.2.0.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow-12.2.0.dist-info/REQUESTED create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow-12.2.0.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow-12.2.0.dist-info/licenses/LICENSE create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow-12.2.0.dist-info/sboms/auditwheel.cdx.json create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow-12.2.0.dist-info/top_level.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow-12.2.0.dist-info/zip-safe create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow.libs/libXau-154567c4.so.6.0.0 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow.libs/libavif-a883386a.so.16.4.1 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow.libs/libbrotlicommon-785b7a00.so.1.2.0 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow.libs/libbrotlidec-08d35d18.so.1.2.0 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow.libs/libfreetype-d2d71ad9.so.6.20.6 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow.libs/libharfbuzz-ef65cc8a.so.0.61321.0 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow.libs/libjpeg-8296d2fa.so.62.4.0 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow.libs/liblcms2-545f6561.so.2.0.18 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow.libs/liblzma-3c942967.so.5.8.3 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow.libs/libopenjp2-f3576751.so.2.5.4 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow.libs/libpng16-65c953c0.so.16.56.0 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow.libs/libsharpyuv-0bacc318.so.0.1.2 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow.libs/libtiff-f4bc73ff.so.6.2.0 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow.libs/libwebp-67ee3789.so.7.2.0 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow.libs/libwebpdemux-eeb71312.so.2.0.17 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow.libs/libwebpmux-20a90b09.so.3.1.2 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow.libs/libxcb-bac6ebc8.so.1.1.0 create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pillow.libs/libzstd-6ea785c0.so.1.5.7 create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip-24.0.dist-info/AUTHORS.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip-24.0.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip-24.0.dist-info/LICENSE.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip-24.0.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip-24.0.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip-24.0.dist-info/REQUESTED create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip-24.0.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip-24.0.dist-info/entry_points.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip-24.0.dist-info/top_level.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/__main__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/__pip-runner__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/build_env.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/cache.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/cli/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/cli/main.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/cli/status_codes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/commands/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/commands/cache.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/commands/check.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/commands/download.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/commands/freeze.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/commands/hash.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/commands/help.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/commands/index.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/commands/inspect.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/commands/install.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/commands/list.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/commands/search.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/commands/show.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/commands/uninstall.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/configuration.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/distributions/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/distributions/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/exceptions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/index/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/index/collector.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/index/sources.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/locations/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/locations/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/main.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/metadata/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/metadata/_json.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/metadata/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_compat.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_dists.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/metadata/importlib/_envs.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/models/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/models/candidate.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/models/format_control.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/models/index.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/models/link.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/models/scheme.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/models/search_scope.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/models/target_python.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/models/wheel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/network/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/network/auth.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/network/cache.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/network/download.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/network/session.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/network/utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/operations/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/operations/check.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/pyproject.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/resolution/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/resolution/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/self_outdated_check.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/_jaraco_text.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/_log.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/appdirs.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/compat.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/datetime.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/deprecation.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/egg_link.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/filetypes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/glibc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/hashes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/models.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/packaging.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/utils/wheel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/vcs/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/certifi/core.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/codingstatemachinedict.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/enums.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabfreq.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/johabprober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/macromanprober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/resultdict.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf1632prober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/chardet/version.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansi_test.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/ansitowin32_test.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/initialise_test.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/isatty_test.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/colorama/tests/winterm_test.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/colorama/win32.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/distlib/resources.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/distro/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/distro/__main__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/idna/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/idna/codec.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/idna/compat.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/idna/core.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/idna/intranges.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/idna/package_data.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/packaging/tags.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/packaging/utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/packaging/version.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/console.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/filter.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/style.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/token.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pygments/util.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/actions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/common.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/core.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/diagram/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/exceptions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/helpers.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/results.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/testing.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/unicode.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pyparsing/util.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_compat.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_in_process/_in_process.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/requests/__version__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/requests/adapters.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/requests/api.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/requests/certs.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/requests/compat.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/requests/cookies.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/requests/help.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/requests/hooks.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/requests/models.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/requests/packages.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/requests/sessions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/requests/structures.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/requests/utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/__main__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_export_format.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_extension.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_fileno.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_loop.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_null_file.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_stack.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_timer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_windows_renderer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/abc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/align.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/ansi.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/bar.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/box.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/cells.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/columns.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/constrain.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/containers.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/control.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/emoji.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/errors.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/filesize.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/json.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/layout.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/live_render.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/markup.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/measure.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/padding.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/pager.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/palette.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/panel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/protocol.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/region.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/repr.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/rule.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/scope.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/screen.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/segment.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/spinner.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/status.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/styled.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/table.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/theme.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/themes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/rich/tree.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/six.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/after.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/before_sleep.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/nap.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/retry.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/tornadoweb.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/tomli/_re.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/tomli/_types.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/truststore/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_api.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_macos.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_openssl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_ssl_constants.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/truststore/_windows.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/request.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/vendor.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pip/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments-2.20.0.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments-2.20.0.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments-2.20.0.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments-2.20.0.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments-2.20.0.dist-info/entry_points.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments-2.20.0.dist-info/licenses/AUTHORS create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments-2.20.0.dist-info/licenses/LICENSE create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/__main__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/cmdline.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/console.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/filter.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/filters/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/formatter.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/formatters/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/formatters/_mapping.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/formatters/bbcode.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/formatters/groff.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/formatters/html.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/formatters/img.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/formatters/irc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/formatters/latex.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/formatters/other.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/formatters/pangomarkup.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/formatters/rtf.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/formatters/svg.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/formatters/terminal.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/formatters/terminal256.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_ada_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_asy_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_cl_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_cocoa_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_csound_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_css_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_googlesql_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_julia_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_lasso_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_lilypond_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_lua_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_luau_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_mapping.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_mql_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_mysql_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_openedge_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_php_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_postgres_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_qlik_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_scheme_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_scilab_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_sourcemod_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_sql_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_stan_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_stata_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_tsql_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_usd_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_vbscript_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/_vim_builtins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/actionscript.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/ada.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/agile.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/algebra.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/ambient.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/amdgpu.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/ampl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/apdlexer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/apl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/archetype.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/arrow.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/arturo.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/asc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/asm.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/asn1.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/automation.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/bare.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/basic.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/bdd.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/berry.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/bibtex.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/blueprint.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/boa.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/bqn.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/business.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/c_cpp.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/c_like.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/capnproto.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/carbon.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/cddl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/chapel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/clean.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/codeql.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/comal.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/compiled.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/configs.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/console.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/cplint.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/crystal.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/csound.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/css.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/d.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/dalvik.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/data.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/dax.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/devicetree.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/diff.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/dns.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/dotnet.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/dsls.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/dylan.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/ecl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/eiffel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/elm.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/elpi.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/email.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/erlang.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/esoteric.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/ezhil.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/factor.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/fantom.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/felix.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/fift.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/floscript.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/forth.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/fortran.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/foxpro.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/freefem.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/func.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/functional.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/futhark.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/gcodelexer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/gdscript.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/gleam.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/go.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/grammar_notation.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/graph.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/graphics.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/graphql.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/graphviz.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/gsql.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/hare.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/haskell.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/haxe.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/hdl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/hexdump.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/html.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/idl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/igor.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/inferno.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/installers.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/int_fiction.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/iolang.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/j.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/javascript.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/jmespath.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/jslt.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/json5.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/jsonnet.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/jsx.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/julia.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/jvm.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/kuin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/kusto.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/ldap.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/lean.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/lilypond.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/lisp.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/macaulay2.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/make.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/maple.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/markup.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/math.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/matlab.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/maxima.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/meson.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/mime.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/minecraft.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/mips.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/ml.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/modeling.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/modula2.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/mojo.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/monte.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/mosel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/ncl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/nimrod.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/nit.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/nix.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/numbair.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/oberon.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/objective.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/ooc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/openscad.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/other.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/parasail.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/parsers.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/pascal.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/pawn.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/pddl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/perl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/phix.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/php.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/pointless.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/pony.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/praat.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/procfile.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/prolog.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/promql.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/prql.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/ptx.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/python.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/q.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/qlik.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/qvt.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/r.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/rdf.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/rebol.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/rego.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/rell.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/resource.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/ride.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/rita.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/rnc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/roboconf.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/robotframework.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/ruby.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/rust.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/sas.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/savi.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/scdoc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/scripting.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/sgf.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/shell.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/sieve.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/slash.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/smalltalk.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/smithy.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/smv.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/snobol.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/solidity.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/soong.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/sophia.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/special.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/spice.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/sql.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/srcinfo.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/stata.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/supercollider.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/tablegen.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/tact.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/tal.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/tcl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/teal.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/templates.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/teraterm.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/testing.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/text.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/textedit.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/textfmts.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/theorem.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/thingsdb.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/tlb.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/tls.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/tnt.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/trafficscript.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/typoscript.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/typst.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/ul4.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/unicon.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/urbi.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/usd.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/varnish.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/verification.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/verifpal.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/vip.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/vyper.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/web.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/webassembly.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/webidl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/webmisc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/wgsl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/whiley.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/wowtoc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/wren.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/x10.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/xorg.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/yang.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/yara.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/lexers/zig.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/modeline.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/plugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/regexopt.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/scanner.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/sphinxext.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/style.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/_mapping.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/abap.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/algol.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/algol_nu.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/arduino.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/autumn.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/borland.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/bw.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/coffee.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/colorful.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/default.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/dracula.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/emacs.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/friendly.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/friendly_grayscale.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/fruity.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/gh_dark.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/gruvbox.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/igor.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/inkpot.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/lightbulb.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/lilypond.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/lovelace.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/manni.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/material.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/monokai.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/murphy.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/native.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/nord.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/onedark.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/paraiso_dark.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/paraiso_light.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/pastie.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/perldoc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/rainbow_dash.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/rrt.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/sas.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/solarized.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/staroffice.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/stata_dark.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/stata_light.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/tango.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/trac.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/vim.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/vs.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/xcode.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/styles/zenburn.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/token.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/unistring.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pygments/util.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pyyaml-6.0.3.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pyyaml-6.0.3.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pyyaml-6.0.3.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pyyaml-6.0.3.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pyyaml-6.0.3.dist-info/licenses/LICENSE create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/pyyaml-6.0.3.dist-info/top_level.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich-14.3.3.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich-14.3.3.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich-14.3.3.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich-14.3.3.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich-14.3.3.dist-info/licenses/LICENSE create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/__main__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_emoji_codes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_emoji_replace.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_export_format.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_extension.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_fileno.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_inspect.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_log_render.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_loop.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_null_file.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_palettes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_pick.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_ratio.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_spinners.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_stack.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_timer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/_versions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode10-0-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode11-0-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode12-0-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode12-1-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode13-0-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode14-0-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode15-0-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode15-1-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode16-0-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode17-0-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode4-1-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode5-0-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode5-1-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode5-2-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode6-0-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode6-1-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode6-2-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode6-3-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode7-0-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode8-0-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_unicode_data/unicode9-0-0.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_win32_console.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_windows.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_windows_renderer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/_wrap.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/abc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/align.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/ansi.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/bar.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/box.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/cells.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/color.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/color_triplet.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/columns.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/console.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/constrain.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/containers.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/control.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/default_styles.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/diagnose.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/emoji.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/errors.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/file_proxy.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/filesize.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/highlighter.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/json.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/jupyter.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/layout.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/live.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/live_render.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/logging.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/markdown.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/markup.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/measure.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/padding.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/pager.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/palette.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/panel.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/pretty.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/progress.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/progress_bar.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/prompt.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/protocol.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/region.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/repr.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/rule.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/scope.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/screen.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/segment.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/spinner.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/status.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/style.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/styled.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/syntax.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/table.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/terminal_theme.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/text.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/theme.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/themes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/traceback.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/rich/tree.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy-2.0.49.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy-2.0.49.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy-2.0.49.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy-2.0.49.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy-2.0.49.dist-info/licenses/LICENSE create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy-2.0.49.dist-info/top_level.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/connectors/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/connectors/aioodbc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/connectors/asyncio.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/connectors/pyodbc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/__init__.py create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/collections.cpython-312-x86_64-linux-gnu.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/collections.pyx create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/immutabledict.cpython-312-x86_64-linux-gnu.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/immutabledict.pxd create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/immutabledict.pyx create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/processors.cpython-312-x86_64-linux-gnu.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/processors.pyx create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/resultproxy.cpython-312-x86_64-linux-gnu.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/resultproxy.pyx create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/util.cpython-312-x86_64-linux-gnu.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/cyextension/util.pyx create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/_typing.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/aioodbc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/information_schema.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/json.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/provision.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/pymssql.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/pyodbc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/aiomysql.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/asyncmy.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/cymysql.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/dml.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/enumerated.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/expression.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/json.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mariadb.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mariadbconnector.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mysqldb.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/provision.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/pymysql.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/pyodbc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/reflection.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/reserved_words.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/types.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/dictionary.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/oracledb.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/provision.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/types.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/vector.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/_psycopg_common.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/array.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/dml.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/ext.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/hstore.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/json.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/named_types.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/operators.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/pg8000.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/pg_catalog.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/provision.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg2.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg2cffi.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/ranges.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/types.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/dml.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/json.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/provision.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/pysqlcipher.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/dialects/type_migration_guidelines.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/_py_processors.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/_py_row.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/_py_util.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/characteristics.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/create.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/events.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/interfaces.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/mock.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/processors.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/reflection.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/row.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/strategies.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/url.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/engine/util.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/event/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/event/api.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/event/attr.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/event/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/event/legacy.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/event/registry.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/events.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/exc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/associationproxy.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/exc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/result.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/scoping.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/session.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/automap.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/baked.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/compiler.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/declarative/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/declarative/extensions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/horizontal_shard.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/hybrid.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/indexable.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/instrumentation.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/mutable.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/apply.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/decl_class.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/names.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/plugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/util.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/orderinglist.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/ext/serializer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/future/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/future/engine.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/inspection.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/log.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/_orm_constructors.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/_typing.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/clsregistry.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/collections.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_api.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/dependency.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/descriptor_props.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/dynamic.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/evaluator.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/events.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/exc.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/identity.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/instrumentation.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/interfaces.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/mapped_collection.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/persistence.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/properties.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/query.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/scoping.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/state.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/sync.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/unitofwork.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/orm/writeonly.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/pool/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/pool/events.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/pool/impl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/schema.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/_dml_constructors.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/_elements_constructors.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/_orm_types.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/_py_util.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/_selectable_constructors.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/_typing.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/annotation.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/cache_key.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/coercions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/default_comparator.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/dml.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/events.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/expression.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/functions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/lambdas.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/naming.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/operators.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/roles.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/traversals.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/type_api.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/util.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/assertsql.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/asyncio.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/config.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/engines.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/entities.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/exclusions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/mypy.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/orm.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/sql.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/pickleable.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/bootstrap.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/plugin_base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/pytestplugin.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/profiling.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/provision.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/requirements.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/schema.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_cte.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_ddl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_deprecations.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_dialect.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_results.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_rowcount.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_select.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_sequence.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_unicode_ddl.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/util.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/testing/warnings.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/types.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/util/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/util/_collections.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/util/_has_cy.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/util/_py_collections.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/util/compat.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/util/concurrency.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/util/preloaded.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/util/queue.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/util/tool_support.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/util/topological.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/sqlalchemy/util/typing.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore-5.7.0.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore-5.7.0.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore-5.7.0.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore-5.7.0.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore-5.7.0.dist-info/entry_points.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore-5.7.0.dist-info/licenses/AUTHORS create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore-5.7.0.dist-info/licenses/LICENSE create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore-5.7.0.dist-info/pbr.json create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore-5.7.0.dist-info/top_level.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/_cache.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/dispatch.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/driver.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/enabled.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/example/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/example/base.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/example/load_as_driver.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/example/load_as_extension.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/example/pyproject.toml create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/example/setup.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/example/simple.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/example2/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/example2/fields.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/example2/pyproject.toml create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/example2/setup.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/exception.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/extension.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/hook.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/named.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/sphinxext.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/tests/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/tests/extension_unimportable.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/tests/manager.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/tests/test_cache.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/tests/test_callback.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/tests/test_dispatch.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/tests/test_driver.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/tests/test_enabled.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/tests/test_example_fields.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/tests/test_example_simple.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/tests/test_extension.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/tests/test_hook.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/tests/test_named.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/tests/test_sphinxext.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/tests/test_test_manager.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/stevedore/tests/utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/typing_extensions-4.15.0.dist-info/licenses/LICENSE create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/typing_extensions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug-3.1.8.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug-3.1.8.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug-3.1.8.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug-3.1.8.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug-3.1.8.dist-info/licenses/LICENSE.txt create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/_internal.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/_reloader.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/datastructures/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/datastructures/accept.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/datastructures/auth.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/datastructures/cache_control.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/datastructures/csp.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/datastructures/etag.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/datastructures/file_storage.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/datastructures/headers.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/datastructures/mixins.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/datastructures/range.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/datastructures/structures.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/debug/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/debug/console.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/debug/repr.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/debug/shared/ICON_LICENSE.md create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/debug/shared/console.png create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/debug/shared/debugger.js create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/debug/shared/less.png create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/debug/shared/more.png create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/debug/shared/style.css create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/debug/tbtools.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/exceptions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/formparser.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/http.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/local.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/middleware/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/middleware/dispatcher.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/middleware/http_proxy.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/middleware/lint.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/middleware/profiler.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/middleware/proxy_fix.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/middleware/shared_data.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/py.typed create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/routing/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/routing/converters.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/routing/exceptions.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/routing/map.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/routing/matcher.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/routing/rules.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/sansio/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/sansio/http.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/sansio/multipart.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/sansio/request.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/sansio/response.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/sansio/utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/security.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/serving.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/test.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/testapp.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/urls.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/user_agent.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/wrappers/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/wrappers/request.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/wrappers/response.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/werkzeug/wsgi.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms-3.2.1.dist-info/INSTALLER create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms-3.2.1.dist-info/METADATA create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms-3.2.1.dist-info/RECORD create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms-3.2.1.dist-info/WHEEL create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms-3.2.1.dist-info/licenses/LICENSE.rst create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/csrf/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/csrf/core.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/csrf/session.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/fields/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/fields/choices.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/fields/core.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/fields/datetime.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/fields/form.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/fields/list.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/fields/numeric.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/fields/simple.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/form.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/i18n.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/README.md create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/ar/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/ar/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/bg/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/bg/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/ca/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/ca/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/cs_CZ/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/cy/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/cy/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/de/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/de/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/de_CH/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/de_CH/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/el/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/el/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/en/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/en/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/es/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/es/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/et/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/et/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/fa/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/fa/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/fi/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/fi/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/fr/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/fr/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/he/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/he/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/hu/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/hu/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/it/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/it/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/ja/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/ja/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/kk/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/kk/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/ko/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/ko/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/nb/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/nb/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/nl/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/nl/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/pl/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/pl/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/pt/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/pt/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/ro/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/ro/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/ru/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/ru/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/sk/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/sk/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/sv/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/sv/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/tr/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/tr/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/uk/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/uk/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/wtforms.pot create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/zh/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/zh/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/zh_TW/LC_MESSAGES/wtforms.mo create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/locale/zh_TW/LC_MESSAGES/wtforms.po create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/meta.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/utils.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/validators.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/widgets/__init__.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/wtforms/widgets/core.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/yaml/__init__.py create mode 100755 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/yaml/_yaml.cpython-312-x86_64-linux-gnu.so create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/yaml/composer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/yaml/constructor.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/yaml/cyaml.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/yaml/dumper.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/yaml/emitter.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/yaml/error.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/yaml/events.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/yaml/loader.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/yaml/nodes.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/yaml/parser.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/yaml/reader.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/yaml/representer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/yaml/resolver.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/yaml/scanner.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/yaml/serializer.py create mode 100644 Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/yaml/tokens.py create mode 120000 Python/Flask_Blog/11-Blueprints/venv/lib64 create mode 100644 Python/Flask_Blog/11-Blueprints/venv/pyvenv.cfg create mode 100644 Python/Flask_Blog/11-Blueprints/venv/share/man/man1/bandit.1 diff --git a/BeautifulSoup/scrape.py b/BeautifulSoup/scrape.py index 42a191f1c..e56730526 100644 --- a/BeautifulSoup/scrape.py +++ b/BeautifulSoup/scrape.py @@ -2,7 +2,7 @@ import requests import csv -source = requests.get('http://coreyms.com').text +source = requests.get('http://coreyms.com', timeout=5).text soup = BeautifulSoup(source, 'lxml') diff --git a/Python-JSON/api.py b/Python-JSON/api.py index 0ce9f34d8..606abce24 100644 --- a/Python-JSON/api.py +++ b/Python-JSON/api.py @@ -1,8 +1,8 @@ -import json -from urllib.request import urlopen +import requests # Change the import at the top -with urlopen("https://finance.yahoo.com/webservice/v1/symbols/allcurrencies/quote?format=json") as response: - source = response.read() +# Replace the urlopen block with this: +response = requests.get("https://yahoo.com", timeout=5) +source = response.content data = json.loads(source) diff --git a/Python-Unit-Testing/employee.py b/Python-Unit-Testing/employee.py index 0470fe328..6e397f4b9 100644 --- a/Python-Unit-Testing/employee.py +++ b/Python-Unit-Testing/employee.py @@ -24,7 +24,7 @@ def apply_raise(self): self.pay = int(self.pay * self.raise_amt) def monthly_schedule(self, month): - response = requests.get(f'http://company.com/{self.last}/{month}') + response = requests.get(f'http://company.com/{self.last}/{month}', timeout=5) if response.ok: return response.text else: diff --git a/Python/Flask_Blog/11-Blueprints/bandit_report.html b/Python/Flask_Blog/11-Blueprints/bandit_report.html new file mode 100644 index 000000000..c67f9c8eb --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/bandit_report.html @@ -0,0 +1,57567 @@ + + + + + + + + + Bandit Report + + + + + + + +
+
+
+ Metrics:
+
+ Total lines of code: 624789
+ Total lines skipped (#nosec): 2 +
+
+ + + + +
+
+ +
+
+ flask_debug_true: A Flask app appears to be run with debug=True, which exposes the Werkzeug debugger and allows the execution of arbitrary code.
+ Test ID: B201
+ Severity: HIGH
+ Confidence: MEDIUM
+ CWE: CWE-94
+ File: ./run.py
+ Line number: 6
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b201_flask_debug_true.html
+ +
+
+5	if __name__ == '__main__':
+6	    app.run(debug=True)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/AvifImagePlugin.py
+ Line number: 81
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+80	
+81	        assert self.fp is not None
+82	        self._decoder = _avif.AvifDecoder(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py
+ Line number: 261
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+260	    def _open(self) -> None:
+261	        assert self.fp is not None
+262	        self.magic = self.fp.read(4)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py
+ Line number: 316
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+315	    def _safe_read(self, length: int) -> bytes:
+316	        assert self.fd is not None
+317	        return ImageFile._safe_read(self.fd, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py
+ Line number: 371
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+370	        jpeg_header = self._safe_read(jpeg_header_size)
+371	        assert self.fd is not None
+372	        self._safe_read(self._offsets[0] - self.fd.tell())  # What IS this?
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py
+ Line number: 379
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+378	            args = image.tile[0].args
+379	            assert isinstance(args, tuple)
+380	            image.tile = [image.tile[0]._replace(args=(args[0], "CMYK"))]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py
+ Line number: 390
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+389	
+390	        assert self.fd is not None
+391	        self.fd.seek(self._offsets[0])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py
+ Line number: 437
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+436	        data = b""
+437	        assert self.im is not None
+438	        palette = self.im.getpalette("RGBA", "RGBA")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py
+ Line number: 452
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+451	
+452	        assert self.im is not None
+453	        w, h = self.im.size
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py
+ Line number: 473
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+472	
+473	    assert im.palette is not None
+474	    fp.write(struct.pack("<i", 1))  # Uncompressed or DirectX compression
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 79
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+78	        """Read relevant info about the BMP"""
+79	        assert self.fp is not None
+80	        read, seek = self.fp.read, self.fp.seek
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 91
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+90	        # read the rest of the bmp header, without its size
+91	        assert isinstance(file_info["header_size"], int)
+92	        header_data = ImageFile._safe_read(self.fp, file_info["header_size"] - 4)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 132
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+131	            file_info["palette_padding"] = 4
+132	            assert isinstance(file_info["pixels_per_meter"], tuple)
+133	            self.info["dpi"] = tuple(x / 39.3701 for x in file_info["pixels_per_meter"])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 155
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+154	                        file_info[mask] = i32(read(4))
+155	                assert isinstance(file_info["r_mask"], int)
+156	                assert isinstance(file_info["g_mask"], int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 156
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+155	                assert isinstance(file_info["r_mask"], int)
+156	                assert isinstance(file_info["g_mask"], int)
+157	                assert isinstance(file_info["b_mask"], int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 157
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+156	                assert isinstance(file_info["g_mask"], int)
+157	                assert isinstance(file_info["b_mask"], int)
+158	                assert isinstance(file_info["a_mask"], int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 158
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+157	                assert isinstance(file_info["b_mask"], int)
+158	                assert isinstance(file_info["a_mask"], int)
+159	                file_info["rgb_mask"] = (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 176
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+175	        # ---------------------- is shorter than real size for bpp >= 16
+176	        assert isinstance(file_info["width"], int)
+177	        assert isinstance(file_info["height"], int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 177
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+176	        assert isinstance(file_info["width"], int)
+177	        assert isinstance(file_info["height"], int)
+178	        self._size = file_info["width"], file_info["height"]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 181
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+180	        # ------- If color count was not found in the header, compute from bits
+181	        assert isinstance(file_info["bits"], int)
+182	        if not file_info.get("colors", 0):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 184
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+183	            file_info["colors"] = 1 << file_info["bits"]
+184	        assert isinstance(file_info["palette_padding"], int)
+185	        assert isinstance(file_info["colors"], int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 185
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+184	        assert isinstance(file_info["palette_padding"], int)
+185	        assert isinstance(file_info["colors"], int)
+186	        if offset == 14 + file_info["header_size"] and file_info["bits"] <= 8:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 230
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+229	                ):
+230	                    assert isinstance(file_info["rgba_mask"], tuple)
+231	                    raw_mode = MASK_MODES[(file_info["bits"], file_info["rgba_mask"])]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 237
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+236	                ):
+237	                    assert isinstance(file_info["rgb_mask"], tuple)
+238	                    raw_mode = MASK_MODES[(file_info["bits"], file_info["rgb_mask"])]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 297
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+296	        else:
+297	            assert isinstance(file_info["width"], int)
+298	            args.append(((file_info["width"] * file_info["bits"] + 31) >> 3) & (~3))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 312
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+311	        # read 14 bytes: magic number, filesize, reserved, header final offset
+312	        assert self.fp is not None
+313	        head_data = self.fp.read(14)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 328
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+327	    def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]:
+328	        assert self.fd is not None
+329	        rle4 = self.args[1]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BufrStubImagePlugin.py
+ Line number: 44
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+43	    def _open(self) -> None:
+44	        assert self.fp is not None
+45	        if not _accept(self.fp.read(4)):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/CurImagePlugin.py
+ Line number: 41
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+40	    def _open(self) -> None:
+41	        assert self.fp is not None
+42	        offset = self.fp.tell()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/DcxImagePlugin.py
+ Line number: 48
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+47	        # Header
+48	        assert self.fp is not None
+49	        s = self.fp.read(4)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py
+ Line number: 273
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+272	for item in DDSD:
+273	    assert item.name is not None
+274	    setattr(module, f"DDSD_{item.name}", item.value)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py
+ Line number: 276
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+275	for item1 in DDSCAPS:
+276	    assert item1.name is not None
+277	    setattr(module, f"DDSCAPS_{item1.name}", item1.value)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py
+ Line number: 279
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+278	for item2 in DDSCAPS2:
+279	    assert item2.name is not None
+280	    setattr(module, f"DDSCAPS2_{item2.name}", item2.value)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py
+ Line number: 282
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+281	for item3 in DDPF:
+282	    assert item3.name is not None
+283	    setattr(module, f"DDPF_{item3.name}", item3.value)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py
+ Line number: 335
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+334	    def _open(self) -> None:
+335	        assert self.fp is not None
+336	        if not _accept(self.fp.read(4)):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py
+ Line number: 492
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+491	    def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]:
+492	        assert self.fd is not None
+493	        bitcount, masks = self.args
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py
+ Line number: 27
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+26	import re
+27	import subprocess
+28	import sys
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+60	            try:
+61	                subprocess.check_call(["gs", "--version"], stdout=subprocess.DEVNULL)
+62	                gs_binary = "gs"
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+60	            try:
+61	                subprocess.check_call(["gs", "--version"], stdout=subprocess.DEVNULL)
+62	                gs_binary = "gs"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py
+ Line number: 80
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+79	        raise OSError(msg)
+80	    assert isinstance(gs_binary, str)
+81	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py
+ Line number: 84
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+83	    args = tile[0].args
+84	    assert isinstance(args, tuple)
+85	    length, bbox = args
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py
+ Line number: 159
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+158	            startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
+159	        subprocess.check_call(command, startupinfo=startupinfo)
+160	        with Image.open(outfile) as out_im:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py
+ Line number: 192
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+191	    def _open(self) -> None:
+192	        assert self.fp is not None
+193	        length, offset = self._find_offset(self.fp)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py
+ Line number: 247
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+246	                        bounding_box = [int(float(i)) for i in v.split()]
+247	                    except Exception:
+248	                        pass
+249	            return True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py
+ Line number: 407
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+406	        if self.tile:
+407	            assert self.fp is not None
+408	            self.im = Ghostscript(self.tile, self.size, self.fp, scale, transparency)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FitsImagePlugin.py
+ Line number: 28
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+27	    def _open(self) -> None:
+28	        assert self.fp is not None
+29	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FitsImagePlugin.py
+ Line number: 130
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+129	    def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]:
+130	        assert self.fd is not None
+131	        with gzip.open(self.fd) as fp:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FliImagePlugin.py
+ Line number: 51
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+50	        # HEAD
+51	        assert self.fp is not None
+52	        s = self.fp.read(128)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FliImagePlugin.py
+ Line number: 119
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+118	        i = 0
+119	        assert self.fp is not None
+120	        for e in range(i16(self.fp.read(2))):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FpxImagePlugin.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+60	
+61	        assert self.fp is not None
+62	        try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FpxImagePlugin.py
+ Line number: 85
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+84	
+85	        assert isinstance(prop[0x1000002], int)
+86	        assert isinstance(prop[0x1000003], int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FpxImagePlugin.py
+ Line number: 86
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+85	        assert isinstance(prop[0x1000002], int)
+86	        assert isinstance(prop[0x1000003], int)
+87	        self._size = prop[0x1000002], prop[0x1000003]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FpxImagePlugin.py
+ Line number: 232
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+231	
+232	        assert self.fp is not None
+233	        self.stream = stream
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FtexImagePlugin.py
+ Line number: 75
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+74	    def _open(self) -> None:
+75	        assert self.fp is not None
+76	        if not _accept(self.fp.read(4)):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FtexImagePlugin.py
+ Line number: 85
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+84	        # I don't know of any multi-format file.
+85	        assert format_count == 1
+86	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GbrImagePlugin.py
+ Line number: 45
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+44	    def _open(self) -> None:
+45	        assert self.fp is not None
+46	        header_size = i32(self.fp.read(4))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GbrImagePlugin.py
+ Line number: 92
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+91	        if self._im is None:
+92	            assert self.fp is not None
+93	            self.im = Image.core.new(self.mode, self.size)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GdImageFile.py
+ Line number: 52
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+51	        # Header
+52	        assert self.fp is not None
+53	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 31
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+30	import os
+31	import subprocess
+32	from enum import IntEnum
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 90
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+89	    def data(self) -> bytes | None:
+90	        assert self.fp is not None
+91	        s = self.fp.read(1)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 104
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+103	        # Screen
+104	        assert self.fp is not None
+105	        s = self.fp.read(13)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 485
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+484	            self._prev_im = expanded_im
+485	            assert self._prev_im is not None
+486	        if self._frame_transparency is not None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 495
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+494	
+495	        assert self.dispose_extent is not None
+496	        frame_im = self._crop(frame_im, self.dispose_extent)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 532
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+531	        im = im.convert("P", palette=Image.Palette.ADAPTIVE)
+532	        assert im.palette is not None
+533	        if im.palette.mode == "RGBA":
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 570
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+569	            im_palette = im.getpalette(None)
+570	            assert im_palette is not None
+571	            source_palette = bytearray(im_palette)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 576
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+575	        im.palette = ImagePalette.ImagePalette("RGB", palette=source_palette)
+576	    assert source_palette is not None
+577	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 580
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+579	        used_palette_colors: list[int | None] = []
+580	        assert im.palette is not None
+581	        for i in range(0, len(source_palette), 3):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 595
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+594	        for index in used_palette_colors:
+595	            assert index is not None
+596	            dest_map.append(index)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 611
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+610	
+611	    assert im.palette is not None
+612	    im.palette.palette = source_palette
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 716
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+715	                            first_palette = im_frames[0].im.palette
+716	                            assert first_palette is not None
+717	                            background_im.putpalette(first_palette, first_palette.mode)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 723
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+722	                    if "transparency" not in encoderinfo:
+723	                        assert im_frame.palette is not None
+724	                        try:
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 888
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+887	            if im.mode != "RGB":
+888	                subprocess.check_call(
+889	                    ["ppmtogif", tempfile], stdout=f, stderr=subprocess.DEVNULL
+890	                )
+891	            else:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 888
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+887	            if im.mode != "RGB":
+888	                subprocess.check_call(
+889	                    ["ppmtogif", tempfile], stdout=f, stderr=subprocess.DEVNULL
+890	                )
+891	            else:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 896
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+895	                togif_cmd = ["ppmtogif"]
+896	                quant_proc = subprocess.Popen(
+897	                    quant_cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL
+898	                )
+899	                togif_proc = subprocess.Popen(
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 899
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+898	                )
+899	                togif_proc = subprocess.Popen(
+900	                    togif_cmd,
+901	                    stdin=quant_proc.stdout,
+902	                    stdout=f,
+903	                    stderr=subprocess.DEVNULL,
+904	                )
+905	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 907
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+906	                # Allow ppmquant to receive SIGPIPE if ppmtogif exits
+907	                assert quant_proc.stdout is not None
+908	                quant_proc.stdout.close()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 968
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+967	
+968	            assert im.palette is not None
+969	            num_palette_colors = len(im.palette.palette) // Image.getmodebands(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 1037
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1036	            # info["background"] - a global color table index
+1037	            assert im.palette is not None
+1038	            try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GimpGradientFile.py
+ Line number: 88
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+87	    def getpalette(self, entries: int = 256) -> tuple[bytes, str]:
+88	        assert self.gradient is not None
+89	        palette = []
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GribStubImagePlugin.py
+ Line number: 44
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+43	    def _open(self) -> None:
+44	        assert self.fp is not None
+45	        if not _accept(self.fp.read(8)):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Hdf5StubImagePlugin.py
+ Line number: 44
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+43	    def _open(self) -> None:
+44	        assert self.fp is not None
+45	        if not _accept(self.fp.read(8)):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/IcnsImagePlugin.py
+ Line number: 267
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+266	    def _open(self) -> None:
+267	        assert self.fp is not None
+268	        self.icns = IcnsFile(self.fp)
+
+
+ + +
+
+ +
+
+ start_process_with_no_shell: Starting a process without a shell.
+ Test ID: B606
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/IcnsImagePlugin.py
+ Line number: 401
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b606_start_process_with_no_shell.html
+ +
+
+400	        if sys.platform == "windows":
+401	            os.startfile("out.png")
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/IcnsImagePlugin.py
+ Line number: 401
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+400	        if sys.platform == "windows":
+401	            os.startfile("out.png")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/IcoImagePlugin.py
+ Line number: 343
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+342	    def _open(self) -> None:
+343	        assert self.fp is not None
+344	        self.ico = IcoFile(self.fp)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImImagePlugin.py
+ Line number: 128
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+127	
+128	        assert self.fp is not None
+129	        if b"\n" not in self.fp.read(100):
+
+
+ + +
+
+ +
+
+ blacklist: Using Element to parse untrusted XML data is known to be vulnerable to XML attacks. Replace Element with the equivalent defusedxml package, or make sure defusedxml.defuse_stdlib() is called.
+ Test ID: B405
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-20
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 206
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b405-import-xml-etree
+ +
+
+205	    import mmap
+206	    from xml.etree.ElementTree import Element
+207	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 443
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+442	
+443	        assert BmpImagePlugin
+444	    except ImportError:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 449
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+448	
+449	        assert GifImagePlugin
+450	    except ImportError:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 455
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+454	
+455	        assert JpegImagePlugin
+456	    except ImportError:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 461
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+460	
+461	        assert PpmImagePlugin
+462	    except ImportError:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 467
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+466	
+467	        assert PngImagePlugin
+468	    except ImportError:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 647
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+646	            raise self._im.ex
+647	        assert self._im is not None
+648	        return self._im
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 758
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+757	            return False
+758	        assert isinstance(other, Image)
+759	        return (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 1147
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1146	                    if self.mode == "P":
+1147	                        assert self.palette is not None
+1148	                        trns_im.putpalette(self.palette, self.palette.mode)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 1151
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1150	                            err = "Couldn't allocate a palette color for transparency"
+1151	                            assert trns_im.palette is not None
+1152	                            try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 1339
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1338	            new_im = self._new(im)
+1339	            assert palette.palette is not None
+1340	            new_im.palette = palette.palette.copy()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 1641
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1640	
+1641	                assert isinstance(self, TiffImagePlugin.TiffImageFile)
+1642	                self._exif.bigtiff = self.tag_v2._bigtiff
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 1645
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1644	
+1645	                assert self.fp is not None
+1646	                self._exif.load_from_fp(self.fp, self.tag_v2._offset)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 1725
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1724	        if self.mode == "P":
+1725	            assert self.palette is not None
+1726	            return self.palette.mode.endswith("A")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 1741
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1740	        palette = self.getpalette("RGBA")
+1741	        assert palette is not None
+1742	        transparency = self.info["transparency"]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 2211
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2210	                value = value[:3]
+2211	            assert self.palette is not None
+2212	            palette_index = self.palette.getcolor(tuple(value), self)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 4095
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+4094	                return value[0]
+4095	        except Exception:
+4096	            pass
+4097	        return value
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageColor.py
+ Line number: 48
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+47	        rgb_tuple = getrgb(rgb)
+48	        assert len(rgb_tuple) == 3
+49	        colormap[color] = rgb_tuple
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageDraw.py
+ Line number: 578
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+577	            if ink is None:
+578	                assert fill_ink is not None
+579	                return fill_ink
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageDraw.py
+ Line number: 859
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+858	    pixel = image.load()
+859	    assert pixel is not None
+860	    x, y = xy
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 228
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+227	        if ifd1 and ifd1.get(ExifTags.Base.JpegIFOffset):
+228	            assert exif._info is not None
+229	            ifds.append((ifd1, exif._info.next))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 233
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+232	        for ifd, ifd_offset in ifds:
+233	            assert self.fp is not None
+234	            current_offset = self.fp.tell()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 246
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+245	                    length = ifd.get(ExifTags.Base.JpegIFByteCount)
+246	                    assert isinstance(length, int)
+247	                    data = self.fp.read(length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 262
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+261	        if offset is not None:
+262	            assert self.fp is not None
+263	            self.fp.seek(offset)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 305
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+304	
+305	        assert self.fp is not None
+306	        readonly = 0
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 498
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+497	        image = loader.load(self)
+498	        assert image is not None
+499	        # become the other object (!)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 529
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+528	        """
+529	        assert self.data is None, "cannot reuse parsers"
+530	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 699
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+698	                    # slight speedup: compress to real file object
+699	                    assert fh is not None
+700	                    errcode = encoder.encode_to_file(fh, bufsize)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 867
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+866	        d = Image._getdecoder(self.mode, "raw", rawmode, extra)
+867	        assert self.im is not None
+868	        d.setimage(self.im, self.state.extents())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 917
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+916	        if data:
+917	            assert self.fd is not None
+918	            self.fd.write(data)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFont.py
+ Line number: 110
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+109	                    image = Image.open(fullname)
+110	                except Exception:
+111	                    pass
+112	                else:
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageGrab.py
+ Line number: 22
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+21	import shutil
+22	import subprocess
+23	import sys
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageGrab.py
+ Line number: 52
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+51	            args += ["-x", filepath]
+52	            retcode = subprocess.call(args)
+53	            if retcode:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageGrab.py
+ Line number: 66
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+65	                    args = ["screencapture", "-l", str(window), "-o", "-x", filepath]
+66	                    retcode = subprocess.call(args)
+67	                    if retcode:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageGrab.py
+ Line number: 133
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+132	            args.append(filepath)
+133	            retcode = subprocess.call(args)
+134	            if retcode:
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageGrab.py
+ Line number: 155
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+154	    if sys.platform == "darwin":
+155	        p = subprocess.run(
+156	            ["osascript", "-e", "get the clipboard as «class PNGf»"],
+157	            capture_output=True,
+158	        )
+159	        if p.returncode != 0:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageGrab.py
+ Line number: 155
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+154	    if sys.platform == "darwin":
+155	        p = subprocess.run(
+156	            ["osascript", "-e", "get the clipboard as «class PNGf»"],
+157	            capture_output=True,
+158	        )
+159	        if p.returncode != 0:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageGrab.py
+ Line number: 204
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+203	
+204	        p = subprocess.run(args, capture_output=True)
+205	        if p.returncode != 0:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageMorph.py
+ Line number: 127
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+126	        """
+127	        assert len(permutation) == 9
+128	        return "".join(pattern[p] for p in permutation)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageMorph.py
+ Line number: 167
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+166	        self.build_default_lut()
+167	        assert self.lut is not None
+168	        patterns = []
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageOps.py
+ Line number: 199
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+198	    # Initial asserts
+199	    assert image.mode == "L"
+200	    if mid is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageOps.py
+ Line number: 201
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+200	    if mid is None:
+201	        assert 0 <= blackpoint <= whitepoint <= 255
+202	    else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageOps.py
+ Line number: 203
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+202	    else:
+203	        assert 0 <= blackpoint <= midpoint <= whitepoint <= 255
+204	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImagePalette.py
+ Line number: 169
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+168	                index = self._new_color_index(image, e)
+169	                assert isinstance(self._palette, bytearray)
+170	                self.colors[color] = index
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/PIL/ImagePalette.py
+ Line number: 249
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+248	
+249	    palette = [randint(0, 255) for _ in range(256 * len(mode))]
+250	    return ImagePalette(mode, palette)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageQt.py
+ Line number: 144
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+143	        exclusive_fp = True
+144	    assert isinstance(im, Image.Image)
+145	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageQt.py
+ Line number: 155
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+154	        palette = im.getpalette()
+155	        assert palette is not None
+156	        colortable = [rgb(*palette[i : i + 3]) for i in range(0, len(palette), 3)]
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 19
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+18	import shutil
+19	import subprocess
+20	import sys
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 177
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+176	            raise FileNotFoundError
+177	        subprocess.call(["open", "-a", "Preview.app", path])
+178	
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 177
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+176	            raise FileNotFoundError
+177	        subprocess.call(["open", "-a", "Preview.app", path])
+178	
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 182
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+181	        if executable:
+182	            subprocess.Popen(
+183	                [
+184	                    executable,
+185	                    "-c",
+186	                    "import os, sys, time; time.sleep(20); os.remove(sys.argv[1])",
+187	                    path,
+188	                ]
+189	            )
+190	        return 1
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 225
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+224	            raise FileNotFoundError
+225	        subprocess.Popen(["xdg-open", path])
+226	        return 1
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 225
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+224	            raise FileNotFoundError
+225	        subprocess.Popen(["xdg-open", path])
+226	        return 1
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 255
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+254	
+255	        subprocess.Popen(args)
+256	        return 1
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 273
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+272	            raise FileNotFoundError
+273	        subprocess.Popen(["gm", "display", path])
+274	        return 1
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 273
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+272	            raise FileNotFoundError
+273	        subprocess.Popen(["gm", "display", path])
+274	        return 1
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 291
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+290	            raise FileNotFoundError
+291	        subprocess.Popen(["eog", "-n", path])
+292	        return 1
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 291
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+290	            raise FileNotFoundError
+291	        subprocess.Popen(["eog", "-n", path])
+292	        return 1
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 323
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+322	
+323	        subprocess.Popen(args)
+324	        return 1
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageText.py
+ Line number: 507
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+506	
+507	        assert bbox is not None
+508	        return bbox
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageTk.py
+ Line number: 142
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+141	            self.__photo.tk.call("image", "delete", name)
+142	        except Exception:
+143	            pass  # ignore internal errors
+144	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageTk.py
+ Line number: 230
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+229	            self.__photo.tk.call("image", "delete", name)
+230	        except Exception:
+231	            pass  # ignore internal errors
+232	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageWin.py
+ Line number: 90
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+89	        if image:
+90	            assert not isinstance(image, str)
+91	            self.paste(image)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImtImagePlugin.py
+ Line number: 40
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+39	
+40	        assert self.fp is not None
+41	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/IptcImagePlugin.py
+ Line number: 52
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+51	        # get a IPTC field header
+52	        assert self.fp is not None
+53	        s = self.fp.read(5)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/IptcImagePlugin.py
+ Line number: 80
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+79	        # load descriptive fields
+80	        assert self.fp is not None
+81	        while True:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/IptcImagePlugin.py
+ Line number: 133
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+132	            args = self.tile[0].args
+133	            assert isinstance(args, tuple)
+134	            compression, band = args
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/IptcImagePlugin.py
+ Line number: 136
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+135	
+136	            assert self.fp is not None
+137	            self.fp.seek(self.tile[0].offset)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 171
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+170	                mimetype = "image/jpx"
+171	    assert header is not None
+172	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 186
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+185	            height, width, nc, bpc = header.read_fields(">IIHB")
+186	            assert isinstance(height, int)
+187	            assert isinstance(width, int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 187
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+186	            assert isinstance(height, int)
+187	            assert isinstance(width, int)
+188	            assert isinstance(bpc, int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 188
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+187	            assert isinstance(width, int)
+188	            assert isinstance(bpc, int)
+189	            size = (width, height)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 213
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+212	            ne, npc = header.read_fields(">HB")
+213	            assert isinstance(ne, int)
+214	            assert isinstance(npc, int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 214
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+213	            assert isinstance(ne, int)
+214	            assert isinstance(npc, int)
+215	            max_bitdepth = 0
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 217
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+216	            for bitdepth in header.read_fields(">" + ("B" * npc)):
+217	                assert isinstance(bitdepth, int)
+218	                if bitdepth > max_bitdepth:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 229
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+228	                    for value in header.read_fields(">" + ("B" * npc)):
+229	                        assert isinstance(value, int)
+230	                        color.append(value)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 239
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+238	                    vrcn, vrcd, hrcn, hrcd, vrce, hrce = res.read_fields(">HHHHBB")
+239	                    assert isinstance(vrcn, int)
+240	                    assert isinstance(vrcd, int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 240
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+239	                    assert isinstance(vrcn, int)
+240	                    assert isinstance(vrcd, int)
+241	                    assert isinstance(hrcn, int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 241
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+240	                    assert isinstance(vrcd, int)
+241	                    assert isinstance(hrcn, int)
+242	                    assert isinstance(hrcd, int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 242
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+241	                    assert isinstance(hrcn, int)
+242	                    assert isinstance(hrcd, int)
+243	                    assert isinstance(vrce, int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 243
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+242	                    assert isinstance(hrcd, int)
+243	                    assert isinstance(vrce, int)
+244	                    assert isinstance(hrce, int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 244
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+243	                    assert isinstance(vrce, int)
+244	                    assert isinstance(hrce, int)
+245	                    hres = _res_to_dpi(hrcn, hrcd, hrce)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 267
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+266	    def _open(self) -> None:
+267	        assert self.fp is not None
+268	        sig = self.fp.read(4)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 320
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+319	    def _parse_comment(self) -> None:
+320	        assert self.fp is not None
+321	        while True:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 365
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+364	            t = self.tile[0]
+365	            assert isinstance(t[3], tuple)
+366	            t3 = (t[3][0], self._reduce, self.layers, t[3][3], t[3][4])
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 41
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+40	import struct
+41	import subprocess
+42	import sys
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 64
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+63	def Skip(self: JpegImageFile, marker: int) -> None:
+64	    assert self.fp is not None
+65	    n = i16(self.fp.read(2)) - 2
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 74
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+73	
+74	    assert self.fp is not None
+75	    n = i16(self.fp.read(2)) - 2
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 91
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+90	            jfif_density = i16(s, 8), i16(s, 10)
+91	        except Exception:
+92	            pass
+93	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 179
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+178	    # Comment marker.  Store these in the APP dictionary.
+179	    assert self.fp is not None
+180	    n = i16(self.fp.read(2)) - 2
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 196
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+195	
+196	    assert self.fp is not None
+197	    n = i16(self.fp.read(2)) - 2
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 247
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+246	
+247	    assert self.fp is not None
+248	    n = i16(self.fp.read(2)) - 2
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 348
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+347	    def _open(self) -> None:
+348	        assert self.fp is not None
+349	        s = self.fp.read(3)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 417
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+416	        """
+417	        assert self.fp is not None
+418	        s = self.fp.read(read_bytes)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 442
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+441	
+442	        assert isinstance(a, tuple)
+443	        if a[0] == "RGB" and mode in ["L", "YCbCr"]:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 452
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+451	                    break
+452	            assert e is not None
+453	            e = (
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 474
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+473	        if os.path.exists(self.filename):
+474	            subprocess.check_call(["djpeg", "-outfile", path, self.filename])
+475	        else:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 474
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+473	        if os.path.exists(self.filename):
+474	            subprocess.check_call(["djpeg", "-outfile", path, self.filename])
+475	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/McIdasImagePlugin.py
+ Line number: 39
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+38	        # parse area file directory
+39	        assert self.fp is not None
+40	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/MicImagePlugin.py
+ Line number: 70
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+69	
+70	        assert self.fp is not None
+71	        self.__fp = self.fp
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/MpegImagePlugin.py
+ Line number: 66
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+65	    def _open(self) -> None:
+66	        assert self.fp is not None
+67	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/MpoImagePlugin.py
+ Line number: 108
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+107	    def _open(self) -> None:
+108	        assert self.fp is not None
+109	        self.fp.seek(0)  # prep the fp in order to pass the JPEG test
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/MpoImagePlugin.py
+ Line number: 125
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+124	        # gets broken within JpegImagePlugin.
+125	        assert self.n_frames == len(self.__mpoffsets)
+126	        del self.info["mpoffset"]  # no longer needed
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/MpoImagePlugin.py
+ Line number: 128
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+127	        self.is_animated = self.n_frames > 1
+128	        assert self.fp is not None
+129	        self._fp = self.fp  # FIXME: hack
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/MspImagePlugin.py
+ Line number: 54
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+53	        # Header
+54	        assert self.fp is not None
+55	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/MspImagePlugin.py
+ Line number: 116
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+115	    def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]:
+116	        assert self.fd is not None
+117	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PcdImagePlugin.py
+ Line number: 32
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+31	        # rough
+32	        assert self.fp is not None
+33	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PcxImagePlugin.py
+ Line number: 55
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+54	        # header
+55	        assert self.fp is not None
+56	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PcxImagePlugin.py
+ Line number: 204
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+203	
+204	    assert fp.tell() == 128
+205	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfImagePlugin.py
+ Line number: 103
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+102	        palette = im.getpalette()
+103	        assert palette is not None
+104	        dict_obj["ColorSpace"] = [
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 107
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+106	            return False
+107	        assert isinstance(other, IndirectReference)
+108	        return other.object_id == self.object_id and other.generation == self.generation
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 446
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+445	    def seek_end(self) -> None:
+446	        assert self.f is not None
+447	        self.f.seek(0, os.SEEK_END)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 450
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+449	    def write_header(self) -> None:
+450	        assert self.f is not None
+451	        self.f.write(b"%PDF-1.4\n")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 454
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+453	    def write_comment(self, s: str) -> None:
+454	        assert self.f is not None
+455	        self.f.write(f"% {s}\n".encode())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 458
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+457	    def write_catalog(self) -> IndirectReference:
+458	        assert self.f is not None
+459	        self.del_root()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 504
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+503	    ) -> None:
+504	        assert self.f is not None
+505	        if new_root_ref:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 540
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+539	    ) -> IndirectReference:
+540	        assert self.f is not None
+541	        f = self.f
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 580
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+579	    def read_pdf_info(self) -> None:
+580	        assert self.buf is not None
+581	        self.file_size_total = len(self.buf)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 588
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+587	        self.root_ref = self.trailer_dict[b"Root"]
+588	        assert self.root_ref is not None
+589	        self.info_ref = self.trailer_dict.get(b"Info", None)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 607
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+606	        self.pages_ref = self.root[b"Pages"]
+607	        assert self.pages_ref is not None
+608	        self.page_tree_root = self.read_indirect(self.pages_ref)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 666
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+665	    def read_trailer(self) -> None:
+666	        assert self.buf is not None
+667	        search_start_offset = len(self.buf) - 16384
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 679
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+678	            m = last_match
+679	        assert m is not None
+680	        trailer_data = m.group(1)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 691
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+690	    ) -> None:
+691	        assert self.buf is not None
+692	        trailer_offset = self.read_xref_table(xref_section_offset=xref_section_offset)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 697
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+696	        check_format_condition(m is not None, "previous trailer not found")
+697	        assert m is not None
+698	        trailer_data = m.group(1)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 736
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+735	            key = cls.interpret_name(m.group(1))
+736	            assert isinstance(key, bytes)
+737	            value, value_offset = cls.get_value(trailer_data, m.end())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 854
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+853	            )
+854	            assert m is not None
+855	            return object, m.end()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 877
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+876	            while not m:
+877	                assert current_offset is not None
+878	                key, current_offset = cls.get_value(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 900
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+899	                check_format_condition(m is not None, "stream end not found")
+900	                assert m is not None
+901	                current_offset = m.end()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 911
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+910	            while not m:
+911	                assert current_offset is not None
+912	                value, current_offset = cls.get_value(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 1018
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1017	    def read_xref_table(self, xref_section_offset: int) -> int:
+1018	        assert self.buf is not None
+1019	        subsection_found = False
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 1024
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1023	        check_format_condition(m is not None, "xref section start not found")
+1024	        assert m is not None
+1025	        offset = m.end()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 1040
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1039	                check_format_condition(m is not None, "xref entry not found")
+1040	                assert m is not None
+1041	                offset = m.end()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 1057
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1056	        )
+1057	        assert self.buf is not None
+1058	        value = self.get_value(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PixarImagePlugin.py
+ Line number: 44
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+43	        # assuming a 4-byte magic label
+44	        assert self.fp is not None
+45	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 171
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+170	
+171	        assert self.fp is not None
+172	        if self.queue:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 198
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+197	    def push(self, cid: bytes, pos: int, length: int) -> None:
+198	        assert self.queue is not None
+199	        self.queue.append((cid, pos, length))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 217
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+216	
+217	        assert self.fp is not None
+218	        try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 231
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+230	
+231	        assert self.fp is not None
+232	        self.fp.read(4)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 240
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+239	
+240	        assert self.fp is not None
+241	        while True:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 426
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+425	        # ICC profile
+426	        assert self.fp is not None
+427	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 454
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+453	        # image header
+454	        assert self.fp is not None
+455	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 464
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+463	            self.im_mode, self.im_rawmode = _MODES[(s[8], s[9])]
+464	        except Exception:
+465	            pass
+466	        if s[12]:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 492
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+491	        # palette
+492	        assert self.fp is not None
+493	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 500
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+499	        # transparency
+500	        assert self.fp is not None
+501	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 523
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+522	        # gamma setting
+523	        assert self.fp is not None
+524	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 532
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+531	
+532	        assert self.fp is not None
+533	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 545
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+544	
+545	        assert self.fp is not None
+546	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 557
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+556	        # pixels per unit
+557	        assert self.fp is not None
+558	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 575
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+574	        # text
+575	        assert self.fp is not None
+576	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 595
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+594	        # compressed text
+595	        assert self.fp is not None
+596	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 630
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+629	        # international text
+630	        assert self.fp is not None
+631	        r = s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 672
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+671	    def chunk_eXIf(self, pos: int, length: int) -> bytes:
+672	        assert self.fp is not None
+673	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 679
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+678	    def chunk_acTL(self, pos: int, length: int) -> bytes:
+679	        assert self.fp is not None
+680	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 700
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+699	    def chunk_fcTL(self, pos: int, length: int) -> bytes:
+700	        assert self.fp is not None
+701	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 730
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+729	    def chunk_fdAT(self, pos: int, length: int) -> bytes:
+730	        assert self.fp is not None
+731	        if length < 4:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 763
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+762	    def _open(self) -> None:
+763	        assert self.fp is not None
+764	        if not _accept(self.fp.read(8)):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 843
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+842	                self.seek(frame)
+843	        assert self._text is not None
+844	        return self._text
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 856
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+855	
+856	        assert self.png is not None
+857	        self.png.verify()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 878
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+877	    def _seek(self, frame: int, rewind: bool = False) -> None:
+878	        assert self.png is not None
+879	        if isinstance(self._fp, DeferredError):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 992
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+991	
+992	        assert self.png is not None
+993	        assert self.fp is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 993
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+992	        assert self.png is not None
+993	        assert self.fp is not None
+994	        while self.__idat == 0:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 1026
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1025	        """internal: finished reading image data"""
+1026	        assert self.png is not None
+1027	        assert self.fp is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 1027
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1026	        assert self.png is not None
+1027	        assert self.fp is not None
+1028	        if self.__idat != 0:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PpmImagePlugin.py
+ Line number: 62
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+61	    def _read_magic(self) -> bytes:
+62	        assert self.fp is not None
+63	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PpmImagePlugin.py
+ Line number: 74
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+73	    def _read_token(self) -> bytes:
+74	        assert self.fp is not None
+75	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PpmImagePlugin.py
+ Line number: 102
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+101	    def _open(self) -> None:
+102	        assert self.fp is not None
+103	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PpmImagePlugin.py
+ Line number: 168
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+167	    def _read_block(self) -> bytes:
+168	        assert self.fd is not None
+169	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PpmImagePlugin.py
+ Line number: 304
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+303	    def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]:
+304	        assert self.fd is not None
+305	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PsdImagePlugin.py
+ Line number: 64
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+63	    def _open(self) -> None:
+64	        assert self.fp is not None
+65	        read = self.fp.read
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/QoiImagePlugin.py
+ Line number: 28
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+27	    def _open(self) -> None:
+28	        assert self.fp is not None
+29	        if not _accept(self.fp.read(4)):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/QoiImagePlugin.py
+ Line number: 55
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+54	    def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]:
+55	        assert self.fd is not None
+56	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/QoiImagePlugin.py
+ Line number: 155
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+154	    def encode(self, bufsize: int) -> tuple[int, int, bytes]:
+155	        assert self.im is not None
+156	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/SgiImagePlugin.py
+ Line number: 58
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+57	        # HEAD
+58	        assert self.fp is not None
+59	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/SgiImagePlugin.py
+ Line number: 202
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+201	    def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]:
+202	        assert self.fd is not None
+203	        assert self.im is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/SgiImagePlugin.py
+ Line number: 203
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+202	        assert self.fd is not None
+203	        assert self.im is not None
+204	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/SpiderImagePlugin.py
+ Line number: 107
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+106	        n = 27 * 4  # read 27 float values
+107	        assert self.fp is not None
+108	        f = self.fp.read(n)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/SpiderImagePlugin.py
+ Line number: 195
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+194	        extrema = self.getextrema()
+195	        assert isinstance(extrema[0], float)
+196	        minimum, maximum = cast(tuple[float, float], extrema)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/SpiderImagePlugin.py
+ Line number: 230
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+229	            with Image.open(img) as im:
+230	                assert isinstance(im, SpiderImageFile)
+231	                byte_im = im.convert2byte()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/SunImagePlugin.py
+ Line number: 52
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+51	
+52	        assert self.fp is not None
+53	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TgaImagePlugin.py
+ Line number: 57
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+56	        # process header
+57	        assert self.fp is not None
+58	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TgaImagePlugin.py
+ Line number: 163
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+162	        if self.mode == "RGBA":
+163	            assert self.fp is not None
+164	            self.fp.seek(-26, os.SEEK_END)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 400
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+399	
+400	        assert isinstance(self._val, Fraction)
+401	        f = self._val.limit_denominator(max_denominator)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 424
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+423	        _val, _numerator, _denominator = state
+424	        assert isinstance(_val, (float, Fraction))
+425	        self._val = _val
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 430
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+429	            self._numerator = _numerator
+430	        assert isinstance(_denominator, int)
+431	        self._denominator = _denominator
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 689
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+688	                    for v in values:
+689	                        assert isinstance(v, IFDRational)
+690	                        if v < 0:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 700
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+699	                    for v in values:
+700	                        assert isinstance(v, int)
+701	                        if short and not (0 <= v < 2**16):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 1181
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1180	        # Header
+1181	        assert self.fp is not None
+1182	        ifh = self.fp.read(8)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 1211
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1210	            self.seek(current)
+1211	        assert self._n_frames is not None
+1212	        return self._n_frames
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 1351
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1350	        # into a string in python.
+1351	        assert self.fp is not None
+1352	        try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 1365
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1364	        if fp:
+1365	            assert isinstance(args, tuple)
+1366	            args_list = list(args)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 1763
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+1762	            ifd.tagtype[key] = info.tagtype[key]
+1763	        except Exception:
+1764	            pass  # might not be an IFD. Might not have populated type
+1765	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 2110
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2109	        ifd_offset += self.offsetOfNewPage
+2110	        assert self.whereToWriteNewIFDOffset is not None
+2111	        self.f.seek(self.whereToWriteNewIFDOffset)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/WalImageFile.py
+ Line number: 43
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+42	        # read header fields
+43	        assert self.fp is not None
+44	        header = self.fp.read(32 + 24 + 32 + 12)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/WalImageFile.py
+ Line number: 59
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+58	        if self._im is None:
+59	            assert self.fp is not None
+60	            self.im = Image.core.new(self.mode, self.size)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/WebPImagePlugin.py
+ Line number: 48
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+47	        # and access muxed chunks like ICC/EXIF/XMP.
+48	        assert self.fp is not None
+49	        self._decoder = _webp.WebPAnimDecoder(self.fp.read())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/WmfImagePlugin.py
+ Line number: 51
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+50	        def load(self, im: ImageFile.StubImageFile) -> Image.Image:
+51	            assert im.fp is not None
+52	            im.fp.seek(0)  # rewind
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/WmfImagePlugin.py
+ Line number: 84
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+83	        # check placeable header
+84	        assert self.fp is not None
+85	        s = self.fp.read(44)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/XVThumbImagePlugin.py
+ Line number: 50
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+49	        # check magic
+50	        assert self.fp is not None
+51	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/XbmImagePlugin.py
+ Line number: 53
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+52	    def _open(self) -> None:
+53	        assert self.fp is not None
+54	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/XpmImagePlugin.py
+ Line number: 40
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+39	    def _open(self) -> None:
+40	        assert self.fp is not None
+41	        if not _accept(self.fp.read(9)):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/XpmImagePlugin.py
+ Line number: 112
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+111	
+112	        assert self.fp is not None
+113	        s = [self.fp.readline()[1 : xsize + 1].ljust(xsize) for i in range(ysize)]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/XpmImagePlugin.py
+ Line number: 122
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+121	    def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]:
+122	        assert self.fd is not None
+123	
+
+
+ + +
+
+ +
+
+ trojansource: A Python source file contains bidirectional control characters ('\u202e').
+ Test ID: B613
+ Severity: HIGH
+ Confidence: MEDIUM
+ CWE: CWE-838
+ File: ./venv/lib/python3.12/site-packages/bandit/plugins/trojansource.py
+ Line number: 22
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b613_trojansource.html
+ +
+
+21	     3  	access_level = "user"
+22	     4	    if access_level != 'none‮⁦': # Check if admin ⁩⁦' and access_level != 'user
+23	     5	        print("You are an admin.\n")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/blinker/base.py
+ Line number: 420
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+419	        """
+420	        assert sender_id != ANY_ID
+421	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/_compat.py
+ Line number: 74
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+73	            self.detach()
+74	        except Exception:
+75	            pass
+76	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/_compat.py
+ Line number: 167
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+166	            return False
+167	        except Exception:
+168	            pass
+169	        return default
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/click/_compat.py
+ Line number: 429
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+428	            os.path.dirname(filename),
+429	            f".__atomic-write{random.randrange(1 << 32):08x}",
+430	        )
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/_compat.py
+ Line number: 552
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+551	            _ansi_stream_wrappers[stream] = rv
+552	        except Exception:
+553	            pass
+554	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/_compat.py
+ Line number: 600
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+599	            cache[stream] = rv
+600	        except Exception:
+601	            pass
+602	        return rv
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 439
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+438	
+439	    import subprocess
+440	
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 456
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+455	        [str(cmd_path)] + cmd_params,
+456	        shell=False,
+457	        stdin=subprocess.PIPE,
+458	        env=env,
+459	        errors="replace",
+460	        text=True,
+461	    )
+462	    assert c.stdin is not None
+463	    try:
+464	        for text in generator:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 462
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+461	    )
+462	    assert c.stdin is not None
+463	    try:
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 531
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+530	
+531	    import subprocess
+532	    import tempfile
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 543
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+542	    try:
+543	        subprocess.call([str(cmd_path), filename])
+544	    except OSError:
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 595
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+594	    def edit_files(self, filenames: cabc.Iterable[str]) -> None:
+595	        import subprocess
+596	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 677
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+676	def open_url(url: str, wait: bool = False, locate: bool = False) -> int:
+677	    import subprocess
+678	
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 696
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+695	        try:
+696	            return subprocess.Popen(args, stderr=null).wait()
+697	        finally:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 710
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+709	        try:
+710	            return subprocess.call(args)
+711	        except OSError:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 724
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+723	        try:
+724	            return subprocess.call(args)
+725	        except OSError:
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 734
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+733	            url = _unquote_file(url)
+734	        c = subprocess.Popen(["xdg-open", url])
+735	        if wait:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 734
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+733	            url = _unquote_file(url)
+734	        c = subprocess.Popen(["xdg-open", url])
+735	        if wait:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/_winconsole.py
+ Line number: 34
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+33	
+34	assert sys.platform == "win32"
+35	import msvcrt  # noqa: E402
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/_winconsole.py
+ Line number: 208
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+207	            self.flush()
+208	        except Exception:
+209	            pass
+210	        return self.buffer.write(x)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/core.py
+ Line number: 1662
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1661	        if args and callable(args[0]):
+1662	            assert len(args) == 1 and not kwargs, (
+1663	                "Use 'command(**kwargs)(callable)' to provide arguments."
+1664	            )
+1665	            (func,) = args
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/core.py
+ Line number: 1711
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1710	        if args and callable(args[0]):
+1711	            assert len(args) == 1 and not kwargs, (
+1712	                "Use 'group(**kwargs)(callable)' to provide arguments."
+1713	            )
+1714	            (func,) = args
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/core.py
+ Line number: 1868
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1867	                cmd_name, cmd, args = self.resolve_command(ctx, args)
+1868	                assert cmd is not None
+1869	                ctx.invoked_subcommand = cmd_name
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/core.py
+ Line number: 1890
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1889	                cmd_name, cmd, args = self.resolve_command(ctx, args)
+1890	                assert cmd is not None
+1891	                sub_ctx = cmd.make_context(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/core.py
+ Line number: 2602
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2601	            # not to be exposed. We still assert it here to please the type checker.
+2602	            assert self.name is not None, (
+2603	                f"{self!r} parameter's name should not be None when exposing value."
+2604	            )
+2605	            ctx.params[self.name] = value
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/core.py
+ Line number: 3142
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3141	        """
+3142	        assert self.prompt is not None
+3143	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/decorators.py
+ Line number: 211
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+210	        name = None
+211	        assert cls is None, "Use 'command(cls=cls)(callable)' to specify a class."
+212	        assert not attrs, "Use 'command(**kwargs)(callable)' to provide arguments."
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/decorators.py
+ Line number: 212
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+211	        assert cls is None, "Use 'command(cls=cls)(callable)' to specify a class."
+212	        assert not attrs, "Use 'command(**kwargs)(callable)' to provide arguments."
+213	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/decorators.py
+ Line number: 236
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+235	        if t.TYPE_CHECKING:
+236	            assert cls is not None
+237	            assert not callable(name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/decorators.py
+ Line number: 237
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+236	            assert cls is not None
+237	            assert not callable(name)
+238	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/parser.py
+ Line number: 193
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+192	        if self.nargs > 1:
+193	            assert isinstance(value, cabc.Sequence)
+194	            holes = sum(1 for x in value if x is UNSET)
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/shell_completion.py
+ Line number: 313
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+312	        import shutil
+313	        import subprocess
+314	
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/shell_completion.py
+ Line number: 320
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+319	        else:
+320	            output = subprocess.run(
+321	                [bash_exe, "--norc", "-c", 'echo "${BASH_VERSION}"'],
+322	                stdout=subprocess.PIPE,
+323	            )
+324	            match = re.search(r"^(\d+)\.(\d+)\.\d+", output.stdout.decode())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/shell_completion.py
+ Line number: 514
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+513	
+514	    assert param.name is not None
+515	    # Will be None if expose_value is False.
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/testing.py
+ Line number: 406
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+405	                        del os.environ[key]
+406	                    except Exception:
+407	                        pass
+408	                else:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/testing.py
+ Line number: 416
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+415	                        del os.environ[key]
+416	                    except Exception:
+417	                        pass
+418	                else:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/utils.py
+ Line number: 42
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+41	            return func(*args, **kwargs)
+42	        except Exception:
+43	            pass
+44	        return None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/_asyncio_backend.py
+ Line number: 81
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+80	        try:
+81	            assert self.protocol.recvfrom is None
+82	            self.protocol.recvfrom = done
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/_asyncio_backend.py
+ Line number: 179
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+178	                    return _CoreAnyIOStream(stream)
+179	                except Exception:
+180	                    pass
+181	            raise httpcore.ConnectError
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/_ddr.py
+ Line number: 109
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+108	                nameservers.append(dns.nameserver.DoHNameserver(url, bootstrap_address))
+109	            except Exception:
+110	                # continue processing other ALPN types
+111	                pass
+112	        if b"dot" in alpns:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/_ddr.py
+ Line number: 138
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+137	                nameservers.extend(info.nameservers)
+138	        except Exception:
+139	            pass
+140	    return nameservers
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/_ddr.py
+ Line number: 152
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+151	                nameservers.extend(info.nameservers)
+152	        except Exception:
+153	            pass
+154	    return nameservers
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/_trio_backend.py
+ Line number: 154
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+153	                    )
+154	                    assert isinstance(sock, StreamSocket)
+155	                    return _CoreTrioStream(sock.stream)
+
+
+ + +
+
+ +
+
+ try_except_continue: Try, Except, Continue detected.
+ Test ID: B112
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/_trio_backend.py
+ Line number: 156
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b112_try_except_continue.html
+ +
+
+155	                    return _CoreTrioStream(sock.stream)
+156	                except Exception:
+157	                    continue
+158	            raise httpcore.ConnectError
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/_trio_backend.py
+ Line number: 215
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+214	                with _maybe_timeout(timeout):
+215	                    assert destination is not None
+216	                    await s.connect(_lltuple(destination, af))
+
+
+ + +
+
+ +
+
+ hardcoded_bind_all_interfaces: Possible binding to all interfaces.
+ Test ID: B104
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-605
+ File: ./venv/lib/python3.12/site-packages/dns/asyncquery.py
+ Line number: 72
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b104_hardcoded_bind_all_interfaces.html
+ +
+
+71	            if af == socket.AF_INET:
+72	                address = "0.0.0.0"
+73	            elif af == socket.AF_INET6:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/asyncquery.py
+ Line number: 589
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+588	            resolver = _maybe_get_resolver(resolver)
+589	            assert parsed.hostname is not None  # pyright: ignore
+590	            answers = await resolver.resolve_name(  # pyright: ignore
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/dns/asyncquery.py
+ Line number: 593
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+592	            )
+593	            bootstrap_address = random.choice(list(answers.addresses()))
+594	        if client and not isinstance(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/asyncquery.py
+ Line number: 598
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+597	            raise ValueError("client parameter must be a dns.quic.AsyncQuicConnection.")
+598	        assert client is None or isinstance(client, dns.quic.AsyncQuicConnection)
+599	        return await _http3(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/asyncquery.py
+ Line number: 726
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+725	    hostname = url_parts.hostname
+726	    assert hostname is not None
+727	    if url_parts.port is not None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/asyncresolver.py
+ Line number: 86
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+85	                return answer
+86	            assert request is not None  # needed for type checking
+87	            done = False
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/asyncresolver.py
+ Line number: 259
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+258	                self.nameservers = nameservers
+259	        except Exception:
+260	            pass
+261	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/asyncresolver.py
+ Line number: 270
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+269	        reset_default_resolver()
+270	    assert default_resolver is not None
+271	    return default_resolver
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/asyncresolver.py
+ Line number: 388
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+387	            )
+388	            assert answer.rrset is not None
+389	            if answer.rrset.name == name:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+60	    def __init__(self, t: int, creator: _Creator, is_leaf: bool):
+61	        assert t >= 3
+62	        self.t = t
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 70
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+69	        """Does this node have the maximal number of keys?"""
+70	        assert len(self.elts) <= _MAX(self.t)
+71	        return len(self.elts) == _MAX(self.t)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 75
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+74	        """Does this node have the minimal number of keys?"""
+75	        assert len(self.elts) >= _MIN(self.t)
+76	        return len(self.elts) == _MIN(self.t)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 108
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+107	    def maybe_cow_child(self, index: int) -> "_Node[KT, ET]":
+108	        assert not self.is_leaf
+109	        child = self.children[index]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 162
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+161	    def insert_nonfull(self, element: ET, in_order: bool) -> ET | None:
+162	        assert not self.is_maximal()
+163	        while True:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 188
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+187	        """Split a maximal node into two minimal ones and a central element."""
+188	        assert self.is_maximal()
+189	        right = self.__class__(self.t, self.creator, self.is_leaf)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 211
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+210	                if not left.is_leaf:
+211	                    assert not self.is_leaf
+212	                    child = left.children.pop()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 230
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+229	                if not right.is_leaf:
+230	                    assert not self.is_leaf
+231	                    child = right.children.pop(0)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 240
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+239	        then the left child must already be in the Node."""
+240	        assert not self.is_maximal()
+241	        assert not self.is_leaf
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 241
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+240	        assert not self.is_maximal()
+241	        assert not self.is_leaf
+242	        key = middle.key()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 244
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+243	        i, equal = self.search_in_node(key)
+244	        assert not equal
+245	        self.elts.insert(i, middle)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 250
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+249	        else:
+250	            assert self.children[i] == left
+251	            self.children.insert(i + 1, right)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 279
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+278	        with one of them."""
+279	        assert not parent.is_leaf
+280	        if self.try_left_steal(parent, index):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 300
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+299	        minimal unless it is the root."""
+300	        assert parent is None or not self.is_minimal()
+301	        i, equal = self.search_in_node(key)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 328
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+327	            i, equal = self.search_in_node(key)
+328	            assert not equal
+329	            child = self.children[i]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 330
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+329	            child = self.children[i]
+330	            assert not child.is_minimal()
+331	        elt = child.delete(key, self, exact)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 334
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+333	            node, i = self._get_node(original_key)
+334	            assert node is not None
+335	            assert elt is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 335
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+334	            assert node is not None
+335	            assert elt is not None
+336	            oelt = node.elts[i]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 406
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+405	        # current node
+406	        assert self.current_node is not None
+407	        while not self.current_node.is_leaf:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 410
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+409	            self.current_node = self.current_node.children[self.current_index]
+410	            assert self.current_node is not None
+411	            self.current_index = 0
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 416
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+415	        # current node
+416	        assert self.current_node is not None
+417	        while not self.current_node.is_leaf:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 420
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+419	            self.current_node = self.current_node.children[self.current_index]
+420	            assert self.current_node is not None
+421	            self.current_index = len(self.current_node.elts)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 464
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+463	            else:
+464	                assert self.current_index == 1
+465	                # right boundary; seek to the actual boundary
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 504
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+503	            else:
+504	                assert self.current_index == 0
+505	                # left boundary; seek to the actual boundary
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 550
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+549	        self.current_node = self.btree.root
+550	        assert self.current_node is not None
+551	        self.recurse = False
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 568
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+567	            self.current_node = self.current_node.children[i]
+568	            assert self.current_node is not None
+569	        i, equal = self.current_node.search_in_node(key)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 707
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+706	                if not self.root.is_leaf:
+707	                    assert len(self.root.children) == 1
+708	                    self.root = self.root.children[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 724
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+723	        delt = self._delete(element.key(), element)
+724	        assert delt is element
+725	        return delt
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btreezone.py
+ Line number: 144
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+143	        if not replacement:
+144	            assert isinstance(zone, dns.versioned.Zone)
+145	            version = zone._versions[-1]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btreezone.py
+ Line number: 190
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+189	                node = new_node
+190	            assert isinstance(node, Node)
+191	            if is_glue:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btreezone.py
+ Line number: 312
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+311	        """
+312	        assert self.origin is not None
+313	        # validate the origin because we may need to relativize
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btreezone.py
+ Line number: 326
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+325	        left = c.prev()
+326	        assert left is not None
+327	        c.next()  # skip over left
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/dnssec.py
+ Line number: 117
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+116	    rdata = key.to_wire()
+117	    assert rdata is not None  # for mypy
+118	    if key.algorithm == Algorithm.RSAMD5:
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/dns/dnssec.py
+ Line number: 234
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+233	    if algorithm == DSDigest.SHA1:
+234	        dshash = hashlib.sha1()
+235	    elif algorithm == DSDigest.SHA256:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/dnssec.py
+ Line number: 246
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+245	    kwire = key.to_wire(origin=origin)
+246	    assert wire is not None and kwire is not None  # for mypy
+247	    dshash.update(wire)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/dnssec.py
+ Line number: 639
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+638	    wire = rrsig.to_wire(origin=signer)
+639	    assert wire is not None  # for mypy
+640	    data += wire[:18]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/dnssec.py
+ Line number: 792
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+791	    domain_encoded = domain.canonicalize().to_wire()
+792	    assert domain_encoded is not None
+793	
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/dns/dnssec.py
+ Line number: 794
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+793	
+794	    digest = hashlib.sha1(domain_encoded + salt_encoded).digest()
+795	    for _ in range(iterations):
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/dns/dnssec.py
+ Line number: 796
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+795	    for _ in range(iterations):
+796	        digest = hashlib.sha1(digest + salt_encoded).digest()
+797	
+
+
+ + +
+
+ +
+
+ blacklist: Use of insecure MD2, MD4, MD5, or SHA1 hash function.
+ Test ID: B303
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/dns/dnssecalgs/dsa.py
+ Line number: 16
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b303-md5
+ +
+
+15	    algorithm = Algorithm.DSA
+16	    chosen_hash = hashes.SHA1()
+17	
+
+
+ + +
+
+ +
+
+ blacklist: Use of insecure MD2, MD4, MD5, or SHA1 hash function.
+ Test ID: B303
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/dns/dnssecalgs/rsa.py
+ Line number: 86
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b303-md5
+ +
+
+85	    algorithm = Algorithm.RSAMD5
+86	    chosen_hash = hashes.MD5()
+87	
+
+
+ + +
+
+ +
+
+ blacklist: Use of insecure MD2, MD4, MD5, or SHA1 hash function.
+ Test ID: B303
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/dns/dnssecalgs/rsa.py
+ Line number: 95
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b303-md5
+ +
+
+94	    algorithm = Algorithm.RSASHA1
+95	    chosen_hash = hashes.SHA1()
+96	
+
+
+ + +
+
+ +
+
+ blacklist: Use of insecure MD2, MD4, MD5, or SHA1 hash function.
+ Test ID: B303
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/dns/dnssecalgs/rsa.py
+ Line number: 104
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b303-md5
+ +
+
+103	    algorithm = Algorithm.RSASHA1NSEC3SHA1
+104	    chosen_hash = hashes.SHA1()
+105	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/edns.py
+ Line number: 95
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+94	        wire = self.to_wire()
+95	        assert wire is not None  # for mypy
+96	        return GenericOption(self.otype, wire)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/edns.py
+ Line number: 227
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+226	
+227	        assert srclen is not None
+228	        self.address = address
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/dns/entropy.py
+ Line number: 37
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+36	        self.lock = threading.Lock()
+37	        self.hash = hashlib.sha1()
+38	        self.hash_len = 20
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/exception.py
+ Line number: 76
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+75	        if args or kwargs:
+76	            assert bool(args) != bool(
+77	                kwargs
+78	            ), "keyword arguments are mutually exclusive with positional args"
+79	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/exception.py
+ Line number: 82
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+81	        if kwargs:
+82	            assert (
+83	                set(kwargs.keys()) == self.supp_kwargs
+84	            ), f"following set of keyword args is required: {self.supp_kwargs}"
+85	        return kwargs
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/grange.py
+ Line number: 64
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+63	    else:
+64	        assert state == 2
+65	        step = int(cur)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/grange.py
+ Line number: 67
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+66	
+67	    assert step >= 1
+68	    assert start >= 0
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/grange.py
+ Line number: 68
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+67	    assert step >= 1
+68	    assert start >= 0
+69	    if start > stop:
+
+
+ + +
+
+ +
+
+ hardcoded_bind_all_interfaces: Possible binding to all interfaces.
+ Test ID: B104
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-605
+ File: ./venv/lib/python3.12/site-packages/dns/inet.py
+ Line number: 175
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b104_hardcoded_bind_all_interfaces.html
+ +
+
+174	    if af == socket.AF_INET:
+175	        return "0.0.0.0"
+176	    elif af == socket.AF_INET6:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/message.py
+ Line number: 1154
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1153	        """
+1154	        assert self.message is not None
+1155	        section = self.message.sections[section_number]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/message.py
+ Line number: 1176
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1175	        """
+1176	        assert self.message is not None
+1177	        section = self.message.sections[section_number]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/message.py
+ Line number: 1499
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1498	
+1499	        assert self.message is not None
+1500	        section = self.message.sections[section_number]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/message.py
+ Line number: 1537
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1536	
+1537	        assert self.message is not None
+1538	        section = self.message.sections[section_number]
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/message.py
+ Line number: 1654
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+1653	                        line_method = self._rr_line
+1654	                except Exception:
+1655	                    # It's just a comment.
+1656	                    pass
+1657	                self.tok.get_eol()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/message.py
+ Line number: 1746
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1745	        return from_text(f, idna_codec, one_rr_per_rrset)
+1746	    assert False  # for mypy  lgtm[py/unreachable-statement]
+1747	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/message.py
+ Line number: 1932
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1931	    if query.had_tsig and query.keyring:
+1932	        assert query.mac is not None
+1933	        assert query.keyalgorithm is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/message.py
+ Line number: 1933
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1932	        assert query.mac is not None
+1933	        assert query.keyalgorithm is not None
+1934	        response.use_tsig(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/name.py
+ Line number: 647
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+646	        digest = self.to_wire(origin=origin, canonicalize=True)
+647	        assert digest is not None
+648	        return digest
+
+
+ + +
+
+ +
+
+ hardcoded_bind_all_interfaces: Possible binding to all interfaces.
+ Test ID: B104
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-605
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 106
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b104_hardcoded_bind_all_interfaces.html
+ +
+
+105	                    if local_address is None:
+106	                        local_address = "0.0.0.0"
+107	                    source = dns.inet.low_level_address_tuple(
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 121
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+120	                    return _CoreSyncStream(sock)
+121	                except Exception:
+122	                    pass
+123	            raise httpcore.ConnectError
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 542
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+541	            resolver = _maybe_get_resolver(resolver)
+542	            assert parsed.hostname is not None  # pyright: ignore
+543	            answers = resolver.resolve_name(parsed.hostname, family)  # pyright: ignore
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 544
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+543	            answers = resolver.resolve_name(parsed.hostname, family)  # pyright: ignore
+544	            bootstrap_address = random.choice(list(answers.addresses()))
+545	        if session and not isinstance(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 604
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+603	        # GET and POST examples
+604	        assert session is not None
+605	        if post:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 671
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+670	                error = ": " + wire.decode()
+671	            except Exception:
+672	                pass
+673	        raise ValueError(f"{peer} responded with status code {status}{error}")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 695
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+694	    hostname = url_parts.hostname
+695	    assert hostname is not None
+696	    if url_parts.port is not None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 963
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+962	    else:
+963	        assert af is not None
+964	        cm = make_socket(af, socket.SOCK_DGRAM, source)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 986
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+985	        return r
+986	    assert (
+987	        False  # help mypy figure out we can't get here  lgtm[py/unreachable-statement]
+988	    )
+989	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 1255
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1254	        )
+1255	        assert af is not None
+1256	        cm = make_socket(af, socket.SOCK_STREAM, source)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 1269
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1268	        return r
+1269	    assert (
+1270	        False  # help mypy figure out we can't get here  lgtm[py/unreachable-statement]
+1271	    )
+1272	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 1407
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1406	    )
+1407	    assert af is not None  # where must be an address
+1408	    if ssl_context is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 1428
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1427	        return r
+1428	    assert (
+1429	        False  # help mypy figure out we can't get here  lgtm[py/unreachable-statement]
+1430	    )
+1431	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 1702
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1701	    )
+1702	    assert af is not None
+1703	    (_, expiration) = _compute_times(lifetime)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 1768
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1767	    )
+1768	    assert af is not None
+1769	    (_, expiration) = _compute_times(lifetime)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_asyncio.py
+ Line number: 125
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+124	                    await self._wakeup()
+125	        except Exception:
+126	            pass
+127	        finally:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_asyncio.py
+ Line number: 148
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+147	            for datagram, address in datagrams:
+148	                assert address == self._peer
+149	                assert self._socket is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_asyncio.py
+ Line number: 149
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+148	                assert address == self._peer
+149	                assert self._socket is not None
+150	                await self._socket.sendto(datagram, self._peer, None)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_asyncio.py
+ Line number: 154
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+153	                await asyncio.wait_for(self._wait_for_wake_timer(), interval)
+154	            except Exception:
+155	                pass
+156	            self._handle_timer(expiration)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_asyncio.py
+ Line number: 167
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+166	                if self.is_h3():
+167	                    assert self._h3_conn is not None
+168	                    h3_events = self._h3_conn.handle_event(event)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_common.py
+ Line number: 53
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+52	    def get(self, amount):
+53	        assert self.have(amount)
+54	        data = self._buffer[:amount]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_common.py
+ Line number: 59
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+58	    def get_all(self):
+59	        assert self.seen_end()
+60	        data = self._buffer
+
+
+ + +
+
+ +
+
+ hardcoded_bind_all_interfaces: Possible binding to all interfaces.
+ Test ID: B104
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-605
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_common.py
+ Line number: 176
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b104_hardcoded_bind_all_interfaces.html
+ +
+
+175	            if self._af == socket.AF_INET:
+176	                source = "0.0.0.0"
+177	            elif self._af == socket.AF_INET6:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_common.py
+ Line number: 193
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+192	    def send_headers(self, stream_id, headers, is_end=False):
+193	        assert self._h3_conn is not None
+194	        self._h3_conn.send_headers(stream_id, headers, is_end)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_common.py
+ Line number: 197
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+196	    def send_data(self, stream_id, data, is_end=False):
+197	        assert self._h3_conn is not None
+198	        self._h3_conn.send_data(stream_id, data, is_end)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_sync.py
+ Line number: 157
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+156	                            pass
+157	        except Exception:
+158	            # Eat all exceptions as we have no way to pass them back to the
+159	            # caller currently.  It might be nice to fix this in the future.
+160	            pass
+161	        finally:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_sync.py
+ Line number: 176
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+175	                if self.is_h3():
+176	                    assert self._h3_conn is not None
+177	                    h3_events = self._h3_conn.handle_event(event)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_trio.py
+ Line number: 142
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+141	                if self.is_h3():
+142	                    assert self._h3_conn is not None
+143	                    h3_events = self._h3_conn.handle_event(event)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdata.py
+ Line number: 255
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+254	        wire = self.to_wire(origin=origin)
+255	        assert wire is not None  # for type checkers
+256	        return GenericRdata(self.rdclass, self.rdtype, wire)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdata.py
+ Line number: 265
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+264	        wire = self.to_wire(origin=origin, canonicalize=True)
+265	        assert wire is not None  # for mypy
+266	        return wire
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdata.py
+ Line number: 776
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+775	    cls = get_rdata_class(rdclass, rdtype)
+776	    assert cls is not None  # for type checkers
+777	    with dns.exception.ExceptionWrapper(dns.exception.SyntaxError):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdata.py
+ Line number: 849
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+848	    cls = get_rdata_class(rdclass, rdtype)
+849	    assert cls is not None  # for type checkers
+850	    with dns.exception.ExceptionWrapper(dns.exception.FormError):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdataset.py
+ Line number: 497
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+496	        r.add(rd)
+497	    assert r is not None
+498	    return r
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/ANY/CAA.py
+ Line number: 57
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+56	        l = len(self.tag)
+57	        assert l < 256
+58	        file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/ANY/GPOS.py
+ Line number: 94
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+93	        l = len(self.latitude)
+94	        assert l < 256
+95	        file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/ANY/GPOS.py
+ Line number: 98
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+97	        l = len(self.longitude)
+98	        assert l < 256
+99	        file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/ANY/GPOS.py
+ Line number: 102
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+101	        l = len(self.altitude)
+102	        assert l < 256
+103	        file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/ANY/HINFO.py
+ Line number: 52
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+51	        l = len(self.cpu)
+52	        assert l < 256
+53	        file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/ANY/HINFO.py
+ Line number: 56
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+55	        l = len(self.os)
+56	        assert l < 256
+57	        file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/ANY/ISDN.py
+ Line number: 62
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+61	        l = len(self.address)
+62	        assert l < 256
+63	        file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/ANY/ISDN.py
+ Line number: 67
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+66	        if l > 0:
+67	            assert l < 256
+68	            file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/ANY/X25.py
+ Line number: 50
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+49	        l = len(self.address)
+50	        assert l < 256
+51	        file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/IN/APL.py
+ Line number: 72
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+71	        l = len(address)
+72	        assert l < 128
+73	        if self.negation:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/IN/NAPTR.py
+ Line number: 29
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+28	    l = len(s)
+29	    assert l < 256
+30	    file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/util.py
+ Line number: 54
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+53	            # check that it's OK
+54	            assert isinstance(self.gateway, str)
+55	            dns.ipv4.inet_aton(self.gateway)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/util.py
+ Line number: 58
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+57	            # check that it's OK
+58	            assert isinstance(self.gateway, str)
+59	            dns.ipv6.inet_aton(self.gateway)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/util.py
+ Line number: 72
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+71	        elif self.type == 3:
+72	            assert isinstance(self.gateway, dns.name.Name)
+73	            return str(self.gateway.choose_relativity(origin, relativize))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/util.py
+ Line number: 96
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+95	        elif self.type == 1:
+96	            assert isinstance(self.gateway, str)
+97	            file.write(dns.ipv4.inet_aton(self.gateway))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/util.py
+ Line number: 99
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+98	        elif self.type == 2:
+99	            assert isinstance(self.gateway, str)
+100	            file.write(dns.ipv6.inet_aton(self.gateway))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/util.py
+ Line number: 102
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+101	        elif self.type == 3:
+102	            assert isinstance(self.gateway, dns.name.Name)
+103	            self.gateway.to_wire(file, None, origin, False)
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/util.py
+ Line number: 244
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+243	        while len(rdatas) > 1:
+244	            r = random.uniform(0, total)
+245	            for n, rdata in enumerate(rdatas):  # noqa: B007
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/dns/renderer.py
+ Line number: 108
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+107	        if id is None:
+108	            self.id = random.randint(0, 65535)
+109	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/renderer.py
+ Line number: 212
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+211	            ttl = opt.ttl
+212	            assert opt_size >= 11
+213	            opt_rdata = opt[0]
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 101
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+100	                    return cname
+101	            except Exception:  # pragma: no cover
+102	                # We can just eat this exception as it means there was
+103	                # something wrong with the response.
+104	                pass
+105	        return self.kwargs["qnames"][0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 762
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+761	        if self.retry_with_tcp:
+762	            assert self.nameserver is not None
+763	            assert not self.nameserver.is_always_max_size()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 763
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+762	            assert self.nameserver is not None
+763	            assert not self.nameserver.is_always_max_size()
+764	            self.tcp_attempt = True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 787
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+786	        #
+787	        assert self.nameserver is not None
+788	        if ex:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 790
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+789	            # Exception during I/O or from_wire()
+790	            assert response is None
+791	            self.errors.append(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 816
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+815	        # We got an answer!
+816	        assert response is not None
+817	        assert isinstance(response, dns.message.QueryMessage)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 817
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+816	        assert response is not None
+817	        assert isinstance(response, dns.message.QueryMessage)
+818	        rcode = response.rcode()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1322
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1321	                return answer
+1322	            assert request is not None  # needed for type checking
+1323	            done = False
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1525
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+1524	                self.nameservers = nameservers
+1525	        except Exception:  # pragma: no cover
+1526	            pass
+1527	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1537
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1536	        reset_default_resolver()
+1537	    assert default_resolver is not None
+1538	    return default_resolver
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1716
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1715	            )
+1716	            assert answer.rrset is not None
+1717	            if answer.rrset.name == name:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1877
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+1876	        return _original_getaddrinfo(host, service, family, socktype, proto, flags)
+1877	    except Exception:
+1878	        pass
+1879	    # Something needs resolution!
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1881
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1880	    try:
+1881	        assert _resolver is not None
+1882	        answers = _resolver.resolve_name(host, family)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1903
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+1902	                port = socket.getservbyname(service)  # pyright: ignore
+1903	            except Exception:
+1904	                pass
+1905	    if port is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1944
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1943	        pname = "tcp"
+1944	    assert isinstance(addr, str)
+1945	    qname = dns.reversename.from_address(addr)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1948
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1947	        try:
+1948	            assert _resolver is not None
+1949	            answer = _resolver.resolve(qname, "PTR")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1950
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1949	            answer = _resolver.resolve(qname, "PTR")
+1950	            assert answer.rrset is not None
+1951	            rdata = cast(dns.rdtypes.ANY.PTR.PTR, answer.rrset[0])
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1977
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+1976	        # ignores them, so we do so here as well.
+1977	    except Exception:  # pragma: no cover
+1978	        pass
+1979	    return name
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 2024
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2023	        addr = item[4][0]
+2024	        assert isinstance(addr, str)
+2025	        bin_addr = dns.inet.inet_pton(family, addr)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rrset.py
+ Line number: 276
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+275	        r.add(rd)
+276	    assert r is not None
+277	    return r
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/tokenizer.py
+ Line number: 273
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+272	        self.line_number = 1
+273	        assert filename is not None
+274	        self.filename = filename
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: ''
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/dns/tokenizer.py
+ Line number: 372
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+371	            return Token(WHITESPACE, " ")
+372	        token = ""
+373	        ttype = IDENTIFIER
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: ''
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/dns/tokenizer.py
+ Line number: 380
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+379	                    raise dns.exception.UnexpectedEnd
+380	                if token == "" and ttype != QUOTED_STRING:
+381	                    if c == "(":
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: ''
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/dns/tokenizer.py
+ Line number: 421
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+420	                            self.skip_whitespace()
+421	                            token = ""
+422	                            continue
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: ''
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/dns/tokenizer.py
+ Line number: 447
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+446	            token += c
+447	        if token == "" and ttype != QUOTED_STRING:
+448	            if self.multiline:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/transaction.py
+ Line number: 442
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+441	                )
+442	            assert rdataset is not None  # for type checkers
+443	            if rdataset.rdclass != self.manager.get_class():
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/tsig.py
+ Line number: 225
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+224	            ctx.update(request_mac)
+225	    assert ctx is not None  # for type checkers
+226	    ctx.update(struct.pack("!H", rdata.original_id))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/versioned.py
+ Line number: 100
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+99	                else:
+100	                    assert self.origin is not None
+101	                    oname = self.origin
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/versioned.py
+ Line number: 182
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+181	    def _prune_versions_unlocked(self):
+182	        assert len(self._versions) > 0
+183	        # Don't ever prune a version greater than or equal to one that
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/versioned.py
+ Line number: 243
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+242	    def _end_write_unlocked(self, txn):
+243	        assert self._write_txn == txn
+244	        self._write_txn = None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/wire.py
+ Line number: 33
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+32	    def get_bytes(self, size: int) -> bytes:
+33	        assert size >= 0
+34	        if size > self.remaining():
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/wire.py
+ Line number: 78
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+77	    def restrict_to(self, size: int) -> Iterator:
+78	        assert size >= 0
+79	        if size > self.remaining():
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/xfr.py
+ Line number: 139
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+138	            if self.incremental:
+139	                assert self.soa_rdataset is not None
+140	                soa = cast(dns.rdtypes.ANY.SOA.SOA, self.soa_rdataset[0])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/xfr.py
+ Line number: 170
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+169	                raise dns.exception.FormError("answers after final SOA")
+170	            assert self.txn is not None  # for mypy
+171	            if rdataset.rdtype == dns.rdatatype.SOA and name == self.origin:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 684
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+683	            if want_origin:
+684	                assert self.origin is not None
+685	                l = "$ORIGIN " + self.origin.to_text()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 766
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+765	        else:
+766	            assert self.origin is not None
+767	            name = self.origin
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 815
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+814	        else:
+815	            assert self.origin is not None
+816	            origin_name = self.origin
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 853
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+852	        else:
+853	            assert self.origin is not None
+854	            rds = self.get_rdataset(self.origin, dns.rdatatype.ZONEMD)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 863
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+862	                    return
+863	            except Exception:
+864	                pass
+865	        raise DigestVerificationFailure
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1120
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1119	    def _setup_version(self):
+1120	        assert self.version is None
+1121	        factory = self.manager.writable_version_factory  # pyright: ignore
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1127
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1126	    def _get_rdataset(self, name, rdtype, covers):
+1127	        assert self.version is not None
+1128	        return self.version.get_rdataset(name, rdtype, covers)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1131
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1130	    def _put_rdataset(self, name, rdataset):
+1131	        assert not self.read_only
+1132	        assert self.version is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1132
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1131	        assert not self.read_only
+1132	        assert self.version is not None
+1133	        self.version.put_rdataset(name, rdataset)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1136
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1135	    def _delete_name(self, name):
+1136	        assert not self.read_only
+1137	        assert self.version is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1137
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1136	        assert not self.read_only
+1137	        assert self.version is not None
+1138	        self.version.delete_node(name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1141
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1140	    def _delete_rdataset(self, name, rdtype, covers):
+1141	        assert not self.read_only
+1142	        assert self.version is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1142
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1141	        assert not self.read_only
+1142	        assert self.version is not None
+1143	        self.version.delete_rdataset(name, rdtype, covers)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1146
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1145	    def _name_exists(self, name):
+1146	        assert self.version is not None
+1147	        return self.version.get_node(name) is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1153
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1152	        else:
+1153	            assert self.version is not None
+1154	            return len(self.version.changed) > 0
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1157
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1156	    def _end_transaction(self, commit):
+1157	        assert self.zone is not None
+1158	        assert self.version is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1158
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1157	        assert self.zone is not None
+1158	        assert self.version is not None
+1159	        if self.read_only:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1178
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1177	    def _set_origin(self, origin):
+1178	        assert self.version is not None
+1179	        if self.version.origin is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1183
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1182	    def _iterate_rdatasets(self):
+1183	        assert self.version is not None
+1184	        for name, node in self.version.items():
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1189
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1188	    def _iterate_names(self):
+1189	        assert self.version is not None
+1190	        return self.version.keys()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1193
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1192	    def _get_node(self, name):
+1193	        assert self.version is not None
+1194	        return self.version.get_node(name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1197
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1196	    def _origin_information(self):
+1197	        assert self.version is not None
+1198	        (absolute, relativize, effective) = self.manager.origin_information()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1406
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1405	        )
+1406	    assert False  # make mypy happy  lgtm[py/unreachable-statement]
+1407	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zonefile.py
+ Line number: 174
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+173	                raise dns.exception.SyntaxError("the last used name is undefined")
+174	            assert self.zone_origin is not None
+175	            if not name.is_subdomain(self.zone_origin):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zonefile.py
+ Line number: 430
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+429	            name = self.last_name
+430	            assert self.zone_origin is not None
+431	            if not name.is_subdomain(self.zone_origin):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zonefile.py
+ Line number: 563
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+562	    def __init__(self, manager, replacement, read_only):
+563	        assert not read_only
+564	        super().__init__(manager, replacement, read_only)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zonefile.py
+ Line number: 646
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+645	    def writer(self, replacement=False):
+646	        assert replacement is True
+647	        return RRsetsReaderTransaction(self, True, False)
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'None'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/flask/app.py
+ Line number: 183
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+182	            "PROPAGATE_EXCEPTIONS": None,
+183	            "SECRET_KEY": None,
+184	            "SECRET_KEY_FALLBACKS": None,
+185	            "PERMANENT_SESSION_LIFETIME": timedelta(days=31),
+186	            "USE_X_SENDFILE": False,
+187	            "TRUSTED_HOSTS": None,
+188	            "SERVER_NAME": None,
+189	            "APPLICATION_ROOT": "/",
+190	            "SESSION_COOKIE_NAME": "session",
+191	            "SESSION_COOKIE_DOMAIN": None,
+192	            "SESSION_COOKIE_PATH": None,
+193	            "SESSION_COOKIE_HTTPONLY": True,
+194	            "SESSION_COOKIE_SECURE": False,
+195	            "SESSION_COOKIE_PARTITIONED": False,
+196	            "SESSION_COOKIE_SAMESITE": None,
+197	            "SESSION_REFRESH_EACH_REQUEST": True,
+198	            "MAX_CONTENT_LENGTH": None,
+199	            "MAX_FORM_MEMORY_SIZE": 500_000,
+200	            "MAX_FORM_PARTS": 1_000,
+201	            "SEND_FILE_MAX_AGE_DEFAULT": None,
+202	            "TRAP_BAD_REQUEST_ERRORS": None,
+203	            "TRAP_HTTP_EXCEPTIONS": False,
+204	            "EXPLAIN_TEMPLATE_LOADING": False,
+205	            "PREFERRED_URL_SCHEME": "http",
+206	            "TEMPLATES_AUTO_RELOAD": None,
+207	            "MAX_COOKIE_SIZE": 4093,
+208	            "PROVIDE_AUTOMATIC_OPTIONS": True,
+209	        }
+210	    )
+211	
+212	    #: The class that is used for request objects.  See :class:`~flask.Request`
+213	    #: for more information.
+214	    request_class: type[Request] = Request
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'None'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/flask/app.py
+ Line number: 184
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+183	            "SECRET_KEY": None,
+184	            "SECRET_KEY_FALLBACKS": None,
+185	            "PERMANENT_SESSION_LIFETIME": timedelta(days=31),
+186	            "USE_X_SENDFILE": False,
+187	            "TRUSTED_HOSTS": None,
+188	            "SERVER_NAME": None,
+189	            "APPLICATION_ROOT": "/",
+190	            "SESSION_COOKIE_NAME": "session",
+191	            "SESSION_COOKIE_DOMAIN": None,
+192	            "SESSION_COOKIE_PATH": None,
+193	            "SESSION_COOKIE_HTTPONLY": True,
+194	            "SESSION_COOKIE_SECURE": False,
+195	            "SESSION_COOKIE_PARTITIONED": False,
+196	            "SESSION_COOKIE_SAMESITE": None,
+197	            "SESSION_REFRESH_EACH_REQUEST": True,
+198	            "MAX_CONTENT_LENGTH": None,
+199	            "MAX_FORM_MEMORY_SIZE": 500_000,
+200	            "MAX_FORM_PARTS": 1_000,
+201	            "SEND_FILE_MAX_AGE_DEFAULT": None,
+202	            "TRAP_BAD_REQUEST_ERRORS": None,
+203	            "TRAP_HTTP_EXCEPTIONS": False,
+204	            "EXPLAIN_TEMPLATE_LOADING": False,
+205	            "PREFERRED_URL_SCHEME": "http",
+206	            "TEMPLATES_AUTO_RELOAD": None,
+207	            "MAX_COOKIE_SIZE": 4093,
+208	            "PROVIDE_AUTOMATIC_OPTIONS": True,
+209	        }
+210	    )
+211	
+212	    #: The class that is used for request objects.  See :class:`~flask.Request`
+213	    #: for more information.
+214	    request_class: type[Request] = Request
+215	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask/app.py
+ Line number: 268
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+267	        if self.has_static_folder:
+268	            assert bool(static_host) == host_matching, (
+269	                "Invalid static_host/host_matching combination"
+270	            )
+271	            # Use a weakref to avoid creating a reference cycle between the app
+
+
+ + +
+
+ +
+
+ blacklist: Use of possibly insecure function - consider using safer ast.literal_eval.
+ Test ID: B307
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/flask/cli.py
+ Line number: 1031
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b307-eval
+ +
+
+1030	        with open(startup) as f:
+1031	            eval(compile(f.read(), startup, "exec"), ctx)
+1032	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask/config.py
+ Line number: 163
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+162	                value = loads(value)
+163	            except Exception:
+164	                # Keep the value as a string if loading failed.
+165	                pass
+166	
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/flask/config.py
+ Line number: 209
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+208	            with open(filename, mode="rb") as config_file:
+209	                exec(compile(config_file.read(), filename, "exec"), d.__dict__)
+210	        except OSError as e:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask/ctx.py
+ Line number: 373
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+372	        """
+373	        assert self._session is not None, "The session has not yet been opened."
+374	        self._session.accessed = True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask/debughelpers.py
+ Line number: 59
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+58	        exc = request.routing_exception
+59	        assert isinstance(exc, RequestRedirect)
+60	        buf = [
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/flask/json/tag.py
+ Line number: 188
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+187	    def to_python(self, value: t.Any) -> t.Any:
+188	        return Markup(value)
+189	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask/sansio/scaffold.py
+ Line number: 705
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+704	    """
+705	    assert view_func is not None, "expected view func if endpoint is not provided."
+706	    return view_func.__name__
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/flask/sessions.py
+ Line number: 281
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+280	    """
+281	    return hashlib.sha1(string)
+282	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask/testing.py
+ Line number: 59
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+58	    ) -> None:
+59	        assert not (base_url or subdomain or url_scheme) or (
+60	            base_url is not None
+61	        ) != bool(subdomain or url_scheme), (
+62	            'Cannot pass "subdomain" or "url_scheme" with "base_url".'
+63	        )
+64	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask/views.py
+ Line number: 190
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+189	
+190	        assert meth is not None, f"Unimplemented method {request.method!r}"
+191	        return current_app.ensure_sync(meth)(**kwargs)  # type: ignore[no-any-return]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask_mail/__init__.py
+ Line number: 164
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+163	        """
+164	        assert message.send_to, "No recipients have been added"
+165	        assert message.sender, (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask_mail/__init__.py
+ Line number: 165
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+164	        assert message.send_to, "No recipients have been added"
+165	        assert message.sender, (
+166	            "The message does not specify a sender and a default sender "
+167	            "has not been configured"
+168	        )
+169	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask_sqlalchemy/model.py
+ Line number: 58
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+57	        state = sa.inspect(self)
+58	        assert state is not None
+59	
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/flask_wtf/csrf.py
+ Line number: 53
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+52	        if field_name not in session:
+53	            session[field_name] = hashlib.sha1(os.urandom(64)).hexdigest()
+54	
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/flask_wtf/csrf.py
+ Line number: 58
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+57	        except TypeError:
+58	            session[field_name] = hashlib.sha1(os.urandom(64)).hexdigest()
+59	            token = s.dumps(session[field_name])
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/flask_wtf/form.py
+ Line number: 119
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+118	
+119	        return Markup("\n".join(str(f) for f in hidden_fields(fields or self)))
+120	
+
+
+ + +
+
+ +
+
+ blacklist: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
+ Test ID: B310
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/flask_wtf/recaptcha/validators.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b310-urllib-urlopen
+ +
+
+60	
+61	        http_response = http.urlopen(verify_server, data.encode("utf-8"))
+62	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/flask_wtf/recaptcha/widgets.py
+ Line number: 20
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+19	        if html:
+20	            return Markup(html)
+21	        params = current_app.config.get("RECAPTCHA_PARAMETERS")
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/flask_wtf/recaptcha/widgets.py
+ Line number: 33
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+32	            div_class = RECAPTCHA_DIV_CLASS_DEFAULT
+33	        return Markup(RECAPTCHA_TEMPLATE % (script, div_class, snippet))
+34	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/__init__.py
+ Line number: 217
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+216	    def run_script(self, script_name, show_output=True):
+217	        import subprocess
+218	        script = os.path.join(
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/__init__.py
+ Line number: 224
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+223	        try:
+224	            return subprocess.check_output([sys.executable, script],
+225	                                           encoding='utf-8',
+226	                                           stderr=subprocess.STDOUT)
+227	        except subprocess.CalledProcessError as ex:
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/__init__.py
+ Line number: 238
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+237	    def assertScriptRaises(self, script_name, exitcodes=None):
+238	        import subprocess
+239	        with self.assertRaises(subprocess.CalledProcessError) as exc:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py
+ Line number: 34
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+33	        if name == 'run' and not self.doing_it:
+34	            assert greenlet.getcurrent() is c
+35	            self.doing_it = True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py
+ Line number: 69
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+68	# A and B should both be dead now.
+69	assert a.dead
+70	assert b.dead
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py
+ Line number: 70
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+69	assert a.dead
+70	assert b.dead
+71	assert not c.dead
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py
+ Line number: 71
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+70	assert b.dead
+71	assert not c.dead
+72	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py
+ Line number: 76
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+75	# Now C is dead
+76	assert c.dead
+77	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/fail_slp_switch.py
+ Line number: 23
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+22	g.switch()
+23	assert runs == [1]
+24	g.switch()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/fail_slp_switch.py
+ Line number: 25
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+24	g.switch()
+25	assert runs == [1, 2]
+26	g.force_slp_switch_error = True
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_cpp.py
+ Line number: 2
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+1	import gc
+2	import subprocess
+3	import unittest
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_cpp.py
+ Line number: 33
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+32	        with self.assertRaises(subprocess.CalledProcessError) as exc:
+33	            subprocess.check_output(
+34	                args,
+35	                encoding='utf-8',
+36	                stderr=subprocess.STDOUT
+37	            )
+38	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_gc.py
+ Line number: 12
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+11	# which is no longer optional.
+12	assert greenlet.GREENLET_USE_GC
+13	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_generator_nested.py
+ Line number: 106
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+105	            x = [Yield([e] + p) for p in perms([x for x in l if x != e])]
+106	            assert x
+107	    else:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_greenlet.py
+ Line number: 503
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+502	                    raise Exception # pylint:disable=broad-exception-raised
+503	                except: # pylint:disable=bare-except
+504	                    pass
+505	                return RawGreenlet.__getattribute__(self, name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_greenlet.py
+ Line number: 1289
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1288	        # implementation detail
+1289	        assert 'main' in repr(greenlet.getcurrent())
+1290	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_greenlet.py
+ Line number: 1292
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1291	        t = type(greenlet.getcurrent())
+1292	        assert 'main' not in repr(t)
+1293	        return t
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_greenlet_trash.py
+ Line number: 48
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+47	            # what we want it to.
+48	            assert sys.version_info[:2] >= (3, 13)
+49	            def get_tstate_trash_delete_nesting():
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_greenlet_trash.py
+ Line number: 62
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+61	
+62	        assert get_tstate_trash_delete_nesting() == 0
+63	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_greenlet_trash.py
+ Line number: 118
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+117	                    x = other.switch()
+118	                    assert x == 42
+119	                    # It's important that we don't switch back to the greenlet,
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_interpreter_shutdown.py
+ Line number: 32
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+31	import sys
+32	import subprocess
+33	import unittest
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_interpreter_shutdown.py
+ Line number: 47
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+46	        full_script = textwrap.dedent(script_body)
+47	        result = subprocess.run(
+48	            [sys.executable, '-c', full_script],
+49	            capture_output=True,
+50	            text=True,
+51	            timeout=30,
+52	            check=False,
+53	        )
+54	        return result.returncode, result.stdout, result.stderr
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_leaks.py
+ Line number: 25
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+24	
+25	assert greenlet.GREENLET_USE_GC # Option to disable this was removed in 1.0
+26	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_leaks.py
+ Line number: 153
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+152	
+153	        assert gc.is_tracked([])
+154	        HasFinalizerTracksInstances.reset()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_leaks.py
+ Line number: 212
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+211	
+212	        assert len(background_greenlets) == 1
+213	        self.assertFalse(background_greenlets[0].dead)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_leaks.py
+ Line number: 322
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+321	        # resolved, so we are actually running this on 3.8+
+322	        assert sys.version_info[0] >= 3
+323	        if RUNNING_ON_MANYLINUX:
+
+
+ + +
+
+ +
+
+ start_process_with_a_shell: Starting a process with a shell, possible injection detected, security issue.
+ Test ID: B605
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_version.py
+ Line number: 36
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b605_start_process_with_a_shell.html
+ +
+
+35	        invoke_setup = "%s %s --version" % (sys.executable, setup_py)
+36	        with os.popen(invoke_setup) as f:
+37	            sversion = f.read().strip()
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/itsdangerous/timed.py
+ Line number: 120
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+119	            ts_int = bytes_to_int(base64_decode(ts_bytes))
+120	        except Exception:
+121	            pass
+122	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with pickle module.
+ Test ID: B403
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/jinja2/bccache.py
+ Line number: 13
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b403-import-pickle
+ +
+
+12	import os
+13	import pickle
+14	import stat
+
+
+ + +
+
+ +
+
+ blacklist: Pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue.
+ Test ID: B301
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/jinja2/bccache.py
+ Line number: 73
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b301-pickle
+ +
+
+72	        # the source code of the file changed, we need to reload
+73	        checksum = pickle.load(f)
+74	        if self.checksum != checksum:
+
+
+ + +
+
+ +
+
+ blacklist: Deserialization with the marshal module is possibly dangerous.
+ Test ID: B302
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/jinja2/bccache.py
+ Line number: 79
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b302-marshal
+ +
+
+78	        try:
+79	            self.code = marshal.load(f)
+80	        except (EOFError, ValueError, TypeError):
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/jinja2/bccache.py
+ Line number: 156
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+155	        """Returns the unique hash key for this template name."""
+156	        hash = sha1(name.encode("utf-8"))
+157	
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/jinja2/bccache.py
+ Line number: 165
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+164	        """Returns a checksum for the source."""
+165	        return sha1(source.encode("utf-8")).hexdigest()
+166	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/compiler.py
+ Line number: 832
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+831	    ) -> None:
+832	        assert frame is None, "no root frame allowed"
+833	        eval_ctx = EvalContext(self.environment, self.name)
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'environment'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/compiler.py
+ Line number: 1440
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+1439	
+1440	                if pass_arg == "environment":
+1441	
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/jinja2/debug.py
+ Line number: 145
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+144	    try:
+145	        exec(code, globals, locals)
+146	    except BaseException:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/environment.py
+ Line number: 128
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+127	    """Perform a sanity check on the environment."""
+128	    assert issubclass(
+129	        environment.undefined, Undefined
+130	    ), "'undefined' must be a subclass of 'jinja2.Undefined'."
+131	    assert (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/environment.py
+ Line number: 131
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+130	    ), "'undefined' must be a subclass of 'jinja2.Undefined'."
+131	    assert (
+132	        environment.block_start_string
+133	        != environment.variable_start_string
+134	        != environment.comment_start_string
+135	    ), "block, variable and comment start strings must be different."
+136	    assert environment.newline_sequence in {
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/environment.py
+ Line number: 136
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+135	    ), "block, variable and comment start strings must be different."
+136	    assert environment.newline_sequence in {
+137	        "\r",
+138	        "\r\n",
+139	        "\n",
+140	    }, "'newline_sequence' must be one of '\\n', '\\r\\n', or '\\r'."
+141	    return environment
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/environment.py
+ Line number: 476
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+475	                    attr = str(argument)
+476	                except Exception:
+477	                    pass
+478	                else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/environment.py
+ Line number: 851
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+850	
+851	        assert log_function is not None
+852	        assert self.loader is not None, "No loader configured."
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/environment.py
+ Line number: 852
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+851	        assert log_function is not None
+852	        assert self.loader is not None, "No loader configured."
+853	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/environment.py
+ Line number: 919
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+918	        """
+919	        assert self.loader is not None, "No loader configured."
+920	        names = self.loader.list_templates()
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/jinja2/environment.py
+ Line number: 1228
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+1227	        namespace = {"environment": environment, "__file__": code.co_filename}
+1228	        exec(code, namespace)
+1229	        rv = cls._from_namespace(environment, namespace, globals)
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/environment.py
+ Line number: 1544
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+1543	    def __html__(self) -> Markup:
+1544	        return Markup(concat(self._body_stream))
+1545	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/ext.py
+ Line number: 176
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+175	        if __context.eval_ctx.autoescape:
+176	            rv = Markup(rv)
+177	        # Always treat as a format string, even if there are no
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/ext.py
+ Line number: 197
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+196	        if __context.eval_ctx.autoescape:
+197	            rv = Markup(rv)
+198	        # Always treat as a format string, see gettext comment above.
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/ext.py
+ Line number: 213
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+212	        if __context.eval_ctx.autoescape:
+213	            rv = Markup(rv)
+214	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/ext.py
+ Line number: 238
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+237	        if __context.eval_ctx.autoescape:
+238	            rv = Markup(rv)
+239	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/filters.py
+ Line number: 316
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+315	    if eval_ctx.autoescape:
+316	        rv = Markup(rv)
+317	
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/jinja2/filters.py
+ Line number: 699
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+698	    try:
+699	        return random.choice(seq)
+700	    except IndexError:
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/filters.py
+ Line number: 820
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+819	    if eval_ctx.autoescape:
+820	        rv = Markup(rv)
+821	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/filters.py
+ Line number: 851
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+850	    if isinstance(s, Markup):
+851	        indention = Markup(indention)
+852	        newline = Markup(newline)
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/filters.py
+ Line number: 852
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+851	        indention = Markup(indention)
+852	        newline = Markup(newline)
+853	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/filters.py
+ Line number: 908
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+907	
+908	    assert length >= len(end), f"expected length >= {len(end)}, got {length}"
+909	    assert leeway >= 0, f"expected leeway >= 0, got {leeway}"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/filters.py
+ Line number: 909
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+908	    assert length >= len(end), f"expected length >= {len(end)}, got {length}"
+909	    assert leeway >= 0, f"expected leeway >= 0, got {leeway}"
+910	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/filters.py
+ Line number: 1056
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+1055	
+1056	    return Markup(str(value)).striptags()
+1057	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/filters.py
+ Line number: 1377
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+1376	    """
+1377	    return Markup(value)
+1378	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/idtracking.py
+ Line number: 138
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+137	            target = self.find_ref(name)
+138	            assert target is not None, "should not happen"
+139	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/lexer.py
+ Line number: 144
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+143	reverse_operators = {v: k for k, v in operators.items()}
+144	assert len(operators) == len(reverse_operators), "operators dropped"
+145	operator_re = re.compile(
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'keyword'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/lexer.py
+ Line number: 639
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+638	                value = self._normalize_newlines(value_str)
+639	            elif token == "keyword":
+640	                token = value_str
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/lexer.py
+ Line number: 694
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+693	        if state is not None and state != "root":
+694	            assert state in ("variable", "block"), "invalid state"
+695	            stack.append(state + "_begin")
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '#bygroup'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/lexer.py
+ Line number: 765
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+764	                        # group that matched
+765	                        elif token == "#bygroup":
+766	                            for key, value in m.groupdict().items():
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/loaders.py
+ Line number: 325
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+324	        spec = importlib.util.find_spec(package_name)
+325	        assert spec is not None, "An import spec was not found for the package."
+326	        loader = spec.loader
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/loaders.py
+ Line number: 327
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+326	        loader = spec.loader
+327	        assert loader is not None, "A loader was not found for the package."
+328	        self._loader = loader
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/jinja2/loaders.py
+ Line number: 661
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+660	    def get_template_key(name: str) -> str:
+661	        return "tmpl_" + sha1(name.encode("utf-8")).hexdigest()
+662	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/nodes.py
+ Line number: 64
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+63	            storage.extend(d.get(attr, ()))
+64	            assert len(bases) <= 1, "multiple inheritance not allowed"
+65	            assert len(storage) == len(set(storage)), "layout conflict"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/nodes.py
+ Line number: 65
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+64	            assert len(bases) <= 1, "multiple inheritance not allowed"
+65	            assert len(storage) == len(set(storage)), "layout conflict"
+66	            d[attr] = tuple(storage)
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/nodes.py
+ Line number: 619
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+618	        if eval_ctx.autoescape:
+619	            return Markup(self.data)
+620	        return self.data
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/nodes.py
+ Line number: 1091
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+1090	        eval_ctx = get_eval_context(self, eval_ctx)
+1091	        return Markup(self.expr.as_const(eval_ctx))
+1092	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/nodes.py
+ Line number: 1112
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+1111	        if eval_ctx.autoescape:
+1112	            return Markup(expr)
+1113	        return expr
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'sub'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/parser.py
+ Line number: 630
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+629	
+630	        if token_type == "sub":
+631	            next(self.stream)
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'add'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/parser.py
+ Line number: 633
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+632	            node = nodes.Neg(self.parse_unary(False), lineno=lineno)
+633	        elif token_type == "add":
+634	            next(self.stream)
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'dot'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/parser.py
+ Line number: 784
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+783	            token_type = self.stream.current.type
+784	            if token_type == "dot" or token_type == "lbracket":
+785	                node = self.parse_subscript(node)
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'lbracket'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/parser.py
+ Line number: 784
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+783	            token_type = self.stream.current.type
+784	            if token_type == "dot" or token_type == "lbracket":
+785	                node = self.parse_subscript(node)
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'lparen'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/parser.py
+ Line number: 788
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+787	            # and getitem) as well as filters and tests
+788	            elif token_type == "lparen":
+789	                node = self.parse_call(node)
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'pipe'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/parser.py
+ Line number: 797
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+796	            token_type = self.stream.current.type
+797	            if token_type == "pipe":
+798	                node = self.parse_filter(node)  # type: ignore
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'name'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/parser.py
+ Line number: 799
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+798	                node = self.parse_filter(node)  # type: ignore
+799	            elif token_type == "name" and self.stream.current.value == "is":
+800	                node = self.parse_test(node)
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'lparen'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/parser.py
+ Line number: 803
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+802	            # and getitem) as well as filters and tests
+803	            elif token_type == "lparen":
+804	                node = self.parse_call(node)
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/runtime.py
+ Line number: 375
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+374	        if self._context.eval_ctx.autoescape:
+375	            return Markup(rv)
+376	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/runtime.py
+ Line number: 389
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+388	        if self._context.eval_ctx.autoescape:
+389	            return Markup(rv)
+390	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/runtime.py
+ Line number: 776
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+775	        if autoescape:
+776	            return Markup(rv)
+777	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/runtime.py
+ Line number: 787
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+786	        if autoescape:
+787	            rv = Markup(rv)
+788	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/sandbox.py
+ Line number: 298
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+297	                    attr = str(argument)
+298	                except Exception:
+299	                    pass
+300	                else:
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/jinja2/utils.py
+ Line number: 370
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+369	        # each paragraph contains out of 20 to 100 words.
+370	        for idx, _ in enumerate(range(randrange(min, max))):
+371	            while True:
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/jinja2/utils.py
+ Line number: 372
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+371	            while True:
+372	                word = choice(words)
+373	                if word != last:
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/jinja2/utils.py
+ Line number: 380
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+379	            # add commas
+380	            if idx - randrange(3, 8) > last_comma:
+381	                last_comma = idx
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/jinja2/utils.py
+ Line number: 385
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+384	            # add end of sentences
+385	            if idx - randrange(10, 20) > last_fullstop:
+386	                last_comma = last_fullstop = idx
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/utils.py
+ Line number: 403
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+402	        return "\n\n".join(result)
+403	    return markupsafe.Markup(
+404	        "\n".join(f"<p>{markupsafe.escape(x)}</p>" for x in result)
+405	    )
+406	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/utils.py
+ Line number: 668
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+667	
+668	    return markupsafe.Markup(
+669	        dumps(obj, **kwargs)
+670	        .replace("<", "\\u003c")
+671	        .replace(">", "\\u003e")
+672	        .replace("&", "\\u0026")
+673	        .replace("'", "\\u0027")
+674	    )
+675	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/markdown_it/ruler.py
+ Line number: 265
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+264	            self.__compile__()
+265	            assert self.__cache__ is not None
+266	        # Chain can be empty, if rules disabled. But we still have to return Array.
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/markdown_it/rules_core/linkify.py
+ Line number: 35
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+34	        # Use reversed logic in links start/end match
+35	        assert tokens is not None
+36	        i = len(tokens)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/markdown_it/rules_core/linkify.py
+ Line number: 39
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+38	            i -= 1
+39	            assert isinstance(tokens, list)
+40	            currentToken = tokens[i]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/markdown_it/rules_core/smartquotes.py
+ Line number: 20
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+19	    # But basically, the index will not be negative.
+20	    assert index >= 0
+21	    return string[:index] + ch + string[index + 1 :]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/markdown_it/tree.py
+ Line number: 100
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+99	            else:
+100	                assert node.nester_tokens
+101	                token_list.append(node.nester_tokens.opening)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/markdown_it/tree.py
+ Line number: 164
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+163	            return self.token.type
+164	        assert self.nester_tokens
+165	        return self.nester_tokens.opening.type.removesuffix("_open")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/__pip-runner__.py
+ Line number: 43
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+42	        spec = PathFinder.find_spec(fullname, [PIP_SOURCES_ROOT], target)
+43	        assert spec, (PIP_SOURCES_ROOT, fullname)
+44	        return spec
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/__pip-runner__.py
+ Line number: 49
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+48	
+49	assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module"
+50	runpy.run_module("pip", run_name="__main__", alter_sys=True)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/build_env.py
+ Line number: 213
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+212	        prefix = self._prefixes[prefix_as_string]
+213	        assert not prefix.setup
+214	        prefix.setup = True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cache.py
+ Line number: 40
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+39	        super().__init__()
+40	        assert not cache_dir or os.path.isabs(cache_dir)
+41	        self.cache_dir = cache_dir or None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cache.py
+ Line number: 124
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+123	        parts = self._get_cache_path_parts(link)
+124	        assert self.cache_dir
+125	        # Store wheels within the root cache_dir
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py
+ Line number: 89
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+88	        # are present.
+89	        assert not hasattr(options, "no_index")
+90	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py
+ Line number: 181
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+180	                    status = run_func(*args)
+181	                    assert isinstance(status, int)
+182	                    return status
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py
+ Line number: 15
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+14	    def main_context(self) -> Generator[None, None, None]:
+15	        assert not self._in_main_context
+16	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py
+ Line number: 25
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+24	    def enter_context(self, context_provider: ContextManager[_T]) -> _T:
+25	        assert self._in_main_context
+26	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py
+ Line number: 5
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+4	import os
+5	import subprocess
+6	import sys
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py
+ Line number: 101
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+100	        try:
+101	            proc = subprocess.run(pip_cmd)
+102	            returncode = proc.returncode
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py
+ Line number: 51
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+50	        if option.takes_value():
+51	            assert option.dest is not None
+52	            metavar = option.metavar or option.dest.lower()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py
+ Line number: 112
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+111	        if self.parser is not None:
+112	            assert isinstance(self.parser, ConfigOptionParser)
+113	            self.parser._update_defaults(self.parser.defaults)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py
+ Line number: 114
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+113	            self.parser._update_defaults(self.parser.defaults)
+114	            assert option.dest is not None
+115	            default_values = self.parser.defaults.get(option.dest)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py
+ Line number: 168
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+167	
+168	        assert self.name
+169	        super().__init__(*args, **kwargs)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py
+ Line number: 225
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+224	
+225	            assert option.dest is not None
+226	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py
+ Line number: 252
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+251	            elif option.action == "callback":
+252	                assert option.callback is not None
+253	                late_eval.add(option.dest)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py
+ Line number: 285
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+284	        for option in self._get_all_options():
+285	            assert option.dest is not None
+286	            default = defaults.get(option.dest)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py
+ Line number: 28
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+27	) -> Generator[bytes, None, None]:
+28	    assert bar_type == "on", "This should only be used in the default mode."
+29	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py
+ Line number: 99
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+98	            # then https://github.com/python/mypy/issues/7696 kicks in
+99	            assert self._session is not None
+100	        return self._session
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py
+ Line number: 110
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+109	        cache_dir = options.cache_dir
+110	        assert not cache_dir or os.path.isabs(cache_dir)
+111	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py
+ Line number: 171
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+170	        # Make sure the index_group options are present.
+171	        assert hasattr(options, "no_index")
+172	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py
+ Line number: 240
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+239	    ) -> Optional[int]:
+240	        assert self.tempdir_registry is not None
+241	        if options.no_clean:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py
+ Line number: 286
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+285	        temp_build_dir_path = temp_build_dir.path
+286	        assert temp_build_dir_path is not None
+287	        legacy_resolver = False
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py
+ Line number: 44
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+43	    def _write(self, status: str) -> None:
+44	        assert not self._finished
+45	        # Erase what we wrote before by backspacing to the beginning, writing
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py
+ Line number: 83
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+82	    def _update(self, status: str) -> None:
+83	        assert not self._finished
+84	        self._rate_limiter.reset()
+
+
+ + +
+
+ +
+
+ any_other_function_with_shell_equals_true: Function call with shell=True parameter identified, possible security issue.
+ Test ID: B604
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py
+ Line number: 124
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b604_any_other_function_with_shell_equals_true.html
+ +
+
+123	            )
+124	            print(BASE_COMPLETION.format(script=script, shell=options.shell))
+125	            return SUCCESS
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py
+ Line number: 3
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+2	import os
+3	import subprocess
+4	from optparse import Values
+
+
+ + +
+
+ +
+
+ subprocess_popen_with_shell_equals_true: subprocess call with shell=True identified, security issue.
+ Test ID: B602
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py
+ Line number: 239
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b602_subprocess_popen_with_shell_equals_true.html
+ +
+
+238	        try:
+239	            subprocess.check_call(f'{editor} "{fname}"', shell=True)
+240	        except FileNotFoundError as e:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py
+ Line number: 73
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+72	        # Try to find version in debundled module info.
+73	        assert module.__file__ is not None
+74	        env = get_environment([os.path.dirname(module.__file__)])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/download.py
+ Line number: 137
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+136	            if req.satisfied_by is None:
+137	                assert req.name is not None
+138	                preparer.save_linked_requirement(req)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/install.py
+ Line number: 480
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+479	                        item = f"{item}-{installed_dist.version}"
+480	                except Exception:
+481	                    pass
+482	                items.append(item)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/install.py
+ Line number: 509
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+508	        if options.target_dir:
+509	            assert target_temp_dir
+510	            self._handle_target_dir(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/install.py
+ Line number: 598
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+597	        else:
+598	            assert resolver_variant == "resolvelib"
+599	            parts.append(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/install.py
+ Line number: 695
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+694	    # If we are here, user installs have not been explicitly requested/avoided
+695	    assert use_user_site is None
+696	
+
+
+ + +
+
+ +
+
+ blacklist: Using xmlrpc.client to parse untrusted XML data is known to be vulnerable to XML attacks. Use defusedxml.xmlrpc.monkey_patch() function to monkey-patch xmlrpclib and mitigate XML vulnerabilities.
+ Test ID: B411
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-20
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/search.py
+ Line number: 5
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b411-import-xmlrpclib
+ +
+
+4	import textwrap
+5	import xmlrpc.client
+6	from collections import OrderedDict
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/search.py
+ Line number: 84
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+83	            raise CommandError(message)
+84	        assert isinstance(hits, list)
+85	        return hits
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py
+ Line number: 168
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+167	        for req in build_successes:
+168	            assert req.link and req.link.is_wheel
+169	            assert req.local_file_path
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py
+ Line number: 169
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+168	            assert req.link and req.link.is_wheel
+169	            assert req.local_file_path
+170	            # copy from cache to target directory
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/configuration.py
+ Line number: 130
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+129	        """Returns the file with highest priority in configuration"""
+130	        assert self.load_only is not None, "Need to be specified a file to be editing"
+131	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/configuration.py
+ Line number: 160
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+159	
+160	        assert self.load_only
+161	        fname, parser = self._get_parser_to_modify()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/configuration.py
+ Line number: 180
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+179	
+180	        assert self.load_only
+181	        if key not in self._config[self.load_only]:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/configuration.py
+ Line number: 365
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+364	        # Determine which parser to modify
+365	        assert self.load_only
+366	        parsers = self._parsers[self.load_only]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py
+ Line number: 20
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+19	    def get_metadata_distribution(self) -> BaseDistribution:
+20	        assert self.req.satisfied_by is not None, "not actually installed"
+21	        return self.req.satisfied_by
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py
+ Line number: 24
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+23	        """Identify this requirement uniquely by its link."""
+24	        assert self.req.link
+25	        return self.req.link.url_without_fragment
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py
+ Line number: 59
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+58	            pyproject_requires = self.req.pyproject_requires
+59	            assert pyproject_requires is not None
+60	            conflicting, missing = self.req.build_env.check_requirements(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py
+ Line number: 73
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+72	        pyproject_requires = self.req.pyproject_requires
+73	        assert pyproject_requires is not None
+74	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py
+ Line number: 99
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+98	            backend = self.req.pep517_backend
+99	            assert backend is not None
+100	            with backend.subprocess_runner(runner):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py
+ Line number: 109
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+108	            backend = self.req.pep517_backend
+109	            assert backend is not None
+110	            with backend.subprocess_runner(runner):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py
+ Line number: 29
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+28	        """
+29	        assert self.req.local_file_path, "Set as part of preparation during download"
+30	        assert self.req.name, "Wheels are never unnamed"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py
+ Line number: 30
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+29	        assert self.req.local_file_path, "Set as part of preparation during download"
+30	        assert self.req.name, "Wheels are never unnamed"
+31	        wheel = FilesystemWheel(self.req.local_file_path)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/exceptions.py
+ Line number: 87
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+86	        if reference is None:
+87	            assert hasattr(self, "reference"), "error reference not provided!"
+88	            reference = self.reference
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/exceptions.py
+ Line number: 89
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+88	            reference = self.reference
+89	        assert _is_kebab_case(reference), "error reference must be kebab-case!"
+90	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/exceptions.py
+ Line number: 646
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+645	        else:
+646	            assert self.error is not None
+647	            message_part = f".\n{self.error}\n"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/index/collector.py
+ Line number: 193
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+192	    def __init__(self, page: "IndexContent") -> None:
+193	        assert page.cache_link_parsing
+194	        self.page = page
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py
+ Line number: 364
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+363	        """
+364	        assert set(applicable_candidates) <= set(candidates)
+365	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py
+ Line number: 367
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+366	        if best_candidate is None:
+367	            assert not applicable_candidates
+368	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py
+ Line number: 369
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+368	        else:
+369	            assert best_candidate in applicable_candidates
+370	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py
+ Line number: 543
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+542	                match = re.match(r"^(\d+)(.*)$", wheel.build_tag)
+543	                assert match is not None, "guaranteed by filename validation"
+544	                build_tag_groups = match.groups()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py
+ Line number: 847
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+846	            for candidate in file_candidates:
+847	                assert candidate.link.url  # we need to have a URL
+848	                try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py
+ Line number: 66
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+65	    obj = d.get_command_obj("install", create=True)
+66	    assert obj is not None
+67	    i = cast(distutils_install_command, obj)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py
+ Line number: 71
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+70	    # ideally, we'd prefer a scheme class that has no side-effects.
+71	    assert not (user and prefix), f"user={user} prefix={prefix}"
+72	    assert not (home and prefix), f"home={home} prefix={prefix}"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py
+ Line number: 72
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+71	    assert not (user and prefix), f"user={user} prefix={prefix}"
+72	    assert not (home and prefix), f"home={home} prefix={prefix}"
+73	    i.user = user or i.user
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py
+ Line number: 92
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+91	        else:
+92	            assert dist_dir.endswith(".dist-info")
+93	            dist_cls = pkg_resources.DistInfoDistribution
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py
+ Line number: 58
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+57	        )
+58	    assert infos[0] is not None
+59	    return infos[0]
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'git'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py
+ Line number: 182
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+181	            and self.info.vcs == "git"
+182	            and user_pass == "git"
+183	        ):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py
+ Line number: 15
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+14	    def _install_req_to_dict(cls, ireq: InstallRequirement) -> Dict[str, Any]:
+15	        assert ireq.download_info, f"No download_info for {ireq}"
+16	        res = {
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/models/link.py
+ Line number: 70
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+69	    def __post_init__(self) -> None:
+70	        assert self.name in _SUPPORTED_HASHES
+71	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/models/link.py
+ Line number: 106
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+105	        if self.hashes is not None:
+106	            assert all(name in _SUPPORTED_HASHES for name in self.hashes)
+107	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/models/link.py
+ Line number: 393
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+392	        name = urllib.parse.unquote(name)
+393	        assert name, f"URL {self._url!r} produced no filename"
+394	        return name
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/auth.py
+ Line number: 9
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+8	import shutil
+9	import subprocess
+10	import sysconfig
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/auth.py
+ Line number: 136
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+135	        env["PYTHONIOENCODING"] = "utf-8"
+136	        res = subprocess.run(
+137	            cmd,
+138	            stdin=subprocess.DEVNULL,
+139	            stdout=subprocess.PIPE,
+140	            env=env,
+141	        )
+142	        if res.returncode:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/auth.py
+ Line number: 152
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+151	        env["PYTHONIOENCODING"] = "utf-8"
+152	        subprocess.run(
+153	            [self.keyring, "set", service_name, username],
+154	            input=f"{password}{os.linesep}".encode("utf-8"),
+155	            env=env,
+156	            check=True,
+157	        )
+158	        return None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/auth.py
+ Line number: 426
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+425	
+426	        assert (
+427	            # Credentials were found
+428	            (username is not None and password is not None)
+429	            # Credentials were not found
+430	            or (username is None and password is None)
+431	        ), f"Could not load credentials from url: {original_url}"
+432	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/auth.py
+ Line number: 548
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+547	        """Response callback to save credentials on success."""
+548	        assert (
+549	            self.keyring_provider.has_keyring
+550	        ), "should never reach here without keyring"
+551	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/cache.py
+ Line number: 51
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+50	    def __init__(self, directory: str) -> None:
+51	        assert directory is not None, "Cache directory must not be None."
+52	        super().__init__()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/download.py
+ Line number: 136
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+135	        except NetworkConnectionError as e:
+136	            assert e.response is not None
+137	            logger.critical(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/download.py
+ Line number: 170
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+169	            except NetworkConnectionError as e:
+170	                assert e.response is not None
+171	                logger.critical(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py
+ Line number: 54
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+53	        raise_for_status(head)
+54	        assert head.status_code == 200
+55	        self._session, self._url, self._chunk_size = session, url, chunk_size
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/session.py
+ Line number: 14
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+13	import shutil
+14	import subprocess
+15	import sys
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/session.py
+ Line number: 182
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+181	        try:
+182	            rustc_output = subprocess.check_output(
+183	                ["rustc", "--version"], stderr=subprocess.STDOUT, timeout=0.5
+184	            )
+185	        except Exception:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/session.py
+ Line number: 182
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+181	        try:
+182	            rustc_output = subprocess.check_output(
+183	                ["rustc", "--version"], stderr=subprocess.STDOUT, timeout=0.5
+184	            )
+185	        except Exception:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/session.py
+ Line number: 185
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+184	            )
+185	        except Exception:
+186	            pass
+187	        else:
+
+
+ + +
+
+ +
+
+ blacklist: Using xmlrpc.client to parse untrusted XML data is known to be vulnerable to XML attacks. Use defusedxml.xmlrpc.monkey_patch() function to monkey-patch xmlrpclib and mitigate XML vulnerabilities.
+ Test ID: B411
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-20
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py
+ Line number: 6
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b411-import-xmlrpclib
+ +
+
+5	import urllib.parse
+6	import xmlrpc.client
+7	from typing import TYPE_CHECKING, Tuple
+
+
+ + +
+
+ +
+
+ blacklist: Using _HostType to parse untrusted XML data is known to be vulnerable to XML attacks. Use defusedxml.xmlrpc.monkey_patch() function to monkey-patch xmlrpclib and mitigate XML vulnerabilities.
+ Test ID: B411
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-20
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py
+ Line number: 14
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b411-import-xmlrpclib
+ +
+
+13	if TYPE_CHECKING:
+14	    from xmlrpc.client import _HostType, _Marshallable
+15	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py
+ Line number: 41
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+40	    ) -> Tuple["_Marshallable", ...]:
+41	        assert isinstance(host, str)
+42	        parts = (self._scheme, host, handler, None, None, None)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py
+ Line number: 56
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+55	        except NetworkConnectionError as exc:
+56	            assert exc.response
+57	            logger.critical(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py
+ Line number: 37
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+36	            else:
+37	                assert isinstance(original_value, str)  # for mypy
+38	                target[name] = original_value
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py
+ Line number: 106
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+105	        # If we're here, req should really not be building already.
+106	        assert key not in self._entries
+107	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py
+ Line number: 22
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+21	    """
+22	    assert metadata_directory is not None
+23	    try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py
+ Line number: 22
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+21	    """
+22	    assert metadata_directory is not None
+23	    try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py
+ Line number: 160
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+159	    editable_project_location = dist.editable_project_location
+160	    assert editable_project_location
+161	    location = os.path.normcase(os.path.abspath(editable_project_location))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py
+ Line number: 99
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+98	    # XXX RECORD hashes will need to be updated
+99	    assert os.path.isfile(path)
+100	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py
+ Line number: 614
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+613	                        pyc_path = pyc_output_path(path)
+614	                        assert os.path.exists(pyc_path)
+615	                        pyc_record_path = cast(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 79
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+78	    vcs_backend = vcs.get_backend_for_scheme(link.scheme)
+79	    assert vcs_backend is not None
+80	    vcs_backend.unpack(location, url=hide_url(link.url), verbosity=verbosity)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 160
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+159	
+160	    assert not link.is_existing_dir()
+161	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 310
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+309	            return
+310	        assert req.source_dir is None
+311	        if req.link.is_existing_dir():
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 384
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+383	            return None
+384	        assert req.req is not None
+385	        logger.verbose(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 460
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+459	        for req in partially_downloaded_reqs:
+460	            assert req.link
+461	            links_to_fully_download[req.link] = req
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 493
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+492	        """Prepare a requirement to be obtained from req.link."""
+493	        assert req.link
+494	        self._log_preparing_link(req)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 560
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+559	    ) -> BaseDistribution:
+560	        assert req.link
+561	        link = req.link
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 566
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+565	        if hashes and req.is_wheel_from_cache:
+566	            assert req.download_info is not None
+567	            assert link.is_wheel
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 567
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+566	            assert req.download_info is not None
+567	            assert link.is_wheel
+568	            assert link.is_file
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 568
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+567	            assert link.is_wheel
+568	            assert link.is_file
+569	            # We need to verify hashes, and we have found the requirement in the cache
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 619
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+618	            # prepare_editable_requirement).
+619	            assert not req.editable
+620	            req.download_info = direct_url_from_link(link, req.source_dir)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 650
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+649	    def save_linked_requirement(self, req: InstallRequirement) -> None:
+650	        assert self.download_dir is not None
+651	        assert req.link is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 651
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+650	        assert self.download_dir is not None
+651	        assert req.link is not None
+652	        link = req.link
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 680
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+679	        """Prepare an editable requirement."""
+680	        assert req.editable, "cannot prepare a non-editable req as editable"
+681	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 693
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+692	            req.update_editable()
+693	            assert req.source_dir
+694	            req.download_info = direct_url_for_editable(req.unpacked_source_directory)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 714
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+713	        """Prepare an already-installed requirement."""
+714	        assert req.satisfied_by, "req should have been satisfied but isn't"
+715	        assert skip_reason is not None, (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 715
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+714	        assert req.satisfied_by, "req should have been satisfied but isn't"
+715	        assert skip_reason is not None, (
+716	            "did not get skip reason skipped but req.satisfied_by "
+717	            f"is set to {req.satisfied_by}"
+718	        )
+719	        logger.info(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/pyproject.py
+ Line number: 109
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+108	    # At this point, we know whether we're going to use PEP 517.
+109	    assert use_pep517 is not None
+110	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/pyproject.py
+ Line number: 134
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+133	    # specified a backend, though.
+134	    assert build_system is not None
+135	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py
+ Line number: 33
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+32	    for req in requirements:
+33	        assert req.name, f"invalid to-be-installed requirement: {req}"
+34	        yield req.name, req
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py
+ Line number: 74
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+73	    # ireq.req is a valid requirement so the regex should always match
+74	    assert (
+75	        match is not None
+76	    ), f"regex match on requirement {req} failed, this should never happen"
+77	    pre: Optional[str] = match.group(1)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py
+ Line number: 79
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+78	    post: Optional[str] = match.group(3)
+79	    assert (
+80	        pre is not None and post is not None
+81	    ), f"regex group selection for requirement {req} failed, this should never happen"
+82	    extras: str = "[%s]" % ",".join(sorted(new_extras)) if new_extras else ""
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py
+ Line number: 187
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+186	
+187	    assert line.is_requirement
+188	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py
+ Line number: 476
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+475	                new_line.append(line)
+476	                assert primary_line_number is not None
+477	                yield primary_line_number, "".join(new_line)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py
+ Line number: 488
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+487	    if new_line:
+488	        assert primary_line_number is not None
+489	        yield primary_line_number, "".join(new_line)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 90
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+89	    ) -> None:
+90	        assert req is None or isinstance(req, Requirement), req
+91	        self.req = req
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 104
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+103	        if self.editable:
+104	            assert link
+105	            if link.is_file:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 251
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+250	            return False
+251	        assert self.pep517_backend
+252	        with self.build_env:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 261
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+260	    def specifier(self) -> SpecifierSet:
+261	        assert self.req is not None
+262	        return self.req.specifier
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 275
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+274	        """
+275	        assert self.req is not None
+276	        specifiers = self.req.specifier
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 329
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+328	        if link and link.hash:
+329	            assert link.hash_name is not None
+330	            good_hashes.setdefault(link.hash_name, []).append(link.hash)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 351
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+350	    ) -> str:
+351	        assert build_dir is not None
+352	        if self._temp_build_dir is not None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 353
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+352	        if self._temp_build_dir is not None:
+353	            assert self._temp_build_dir.path
+354	            return self._temp_build_dir.path
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 393
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+392	        """Set requirement after generating metadata."""
+393	        assert self.req is None
+394	        assert self.metadata is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 394
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+393	        assert self.req is None
+394	        assert self.metadata is not None
+395	        assert self.source_dir is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 395
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+394	        assert self.metadata is not None
+395	        assert self.source_dir is not None
+396	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 414
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+413	    def warn_on_mismatching_name(self) -> None:
+414	        assert self.req is not None
+415	        metadata_name = canonicalize_name(self.metadata["Name"])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 484
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+483	    def unpacked_source_directory(self) -> str:
+484	        assert self.source_dir, f"No source dir for {self}"
+485	        return os.path.join(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 491
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+490	    def setup_py_path(self) -> str:
+491	        assert self.source_dir, f"No source dir for {self}"
+492	        setup_py = os.path.join(self.unpacked_source_directory, "setup.py")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 498
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+497	    def setup_cfg_path(self) -> str:
+498	        assert self.source_dir, f"No source dir for {self}"
+499	        setup_cfg = os.path.join(self.unpacked_source_directory, "setup.cfg")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 505
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+504	    def pyproject_toml_path(self) -> str:
+505	        assert self.source_dir, f"No source dir for {self}"
+506	        return make_pyproject_path(self.unpacked_source_directory)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 521
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+520	        if pyproject_toml_data is None:
+521	            assert not self.config_settings
+522	            self.use_pep517 = False
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 563
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+562	        """
+563	        assert self.source_dir, f"No source dir for {self}"
+564	        details = self.name or f"from {self.link}"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 567
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+566	        if self.use_pep517:
+567	            assert self.pep517_backend is not None
+568	            if (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 612
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+611	        elif self.local_file_path and self.is_wheel:
+612	            assert self.req is not None
+613	            return get_wheel_distribution(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 623
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+622	    def assert_source_matches_version(self) -> None:
+623	        assert self.source_dir, f"No source dir for {self}"
+624	        version = self.metadata["version"]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 663
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+662	    def needs_unpacked_archive(self, archive_source: Path) -> None:
+663	        assert self._archive_source is None
+664	        self._archive_source = archive_source
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 668
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+667	        """Ensure the source directory has not yet been built in."""
+668	        assert self.source_dir is not None
+669	        if self._archive_source is not None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 691
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+690	            return
+691	        assert self.editable
+692	        assert self.source_dir
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 692
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+691	        assert self.editable
+692	        assert self.source_dir
+693	        if self.link.scheme == "file":
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 699
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+698	        # So here, if it's neither a path nor a valid VCS URL, it's a bug.
+699	        assert vcs_backend, f"Unsupported VCS URL {self.link.url}"
+700	        hidden_url = hide_url(self.link.url)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 719
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+718	        """
+719	        assert self.req
+720	        dist = get_default_environment().get_distribution(self.req.name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 732
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+731	        def _clean_zip_name(name: str, prefix: str) -> str:
+732	            assert name.startswith(
+733	                prefix + os.path.sep
+734	            ), f"name {name!r} doesn't start with prefix {prefix!r}"
+735	            name = name[len(prefix) + 1 :]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 739
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+738	
+739	        assert self.req is not None
+740	        path = os.path.join(parentdir, path)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 749
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+748	        """
+749	        assert self.source_dir
+750	        if build_dir is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 821
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+820	    ) -> None:
+821	        assert self.req is not None
+822	        scheme = get_scheme(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 853
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+852	
+853	        assert self.is_wheel
+854	        assert self.local_file_path
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 854
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+853	        assert self.is_wheel
+854	        assert self.local_file_path
+855	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py
+ Line number: 45
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+44	    def add_unnamed_requirement(self, install_req: InstallRequirement) -> None:
+45	        assert not install_req.name
+46	        self.unnamed_requirements.append(install_req)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py
+ Line number: 49
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+48	    def add_named_requirement(self, install_req: InstallRequirement) -> None:
+49	        assert install_req.name
+50	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py
+ Line number: 70
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+69	    location = dist.location
+70	    assert location is not None, "not installed"
+71	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py
+ Line number: 544
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+543	                )
+544	            assert os.path.samefile(
+545	                normalized_link_pointer, normalized_dist_location
+546	            ), (
+547	                f"Egg-link {develop_egg_link} (to {link_pointer}) does not match "
+548	                f"installed location of {dist.raw_name} (at {dist_location})"
+549	            )
+550	            paths_to_remove.add(develop_egg_link)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py
+ Line number: 135
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+134	        super().__init__()
+135	        assert upgrade_strategy in self._allowed_strategies
+136	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py
+ Line number: 238
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+237	        # This next bit is really a sanity check.
+238	        assert (
+239	            not install_req.user_supplied or parent_req_name is None
+240	        ), "a user supplied req shouldn't have a parent"
+241	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py
+ Line number: 317
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+316	        else:
+317	            assert self.upgrade_strategy == "only-if-needed"
+318	            return req.user_supplied or req.constraint
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py
+ Line number: 452
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+451	        # so it must be None here.
+452	        assert req.satisfied_by is None
+453	        skip_reason = self._check_skip_installed(req)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py
+ Line number: 541
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+540	                # provided by the user.
+541	                assert req_to_install.user_supplied
+542	                self._add_requirement_to_set(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py
+ Line number: 56
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+55	) -> InstallRequirement:
+56	    assert not template.editable, "template is editable"
+57	    if template.req:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py
+ Line number: 81
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+80	) -> InstallRequirement:
+81	    assert template.editable, "template not editable"
+82	    ireq = install_req_from_editable(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py
+ Line number: 264
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+263	        ireq = make_install_req_from_link(link, template)
+264	        assert ireq.link == link
+265	        if ireq.link.is_wheel and not ireq.link.is_file:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py
+ Line number: 268
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+267	            wheel_name = canonicalize_name(wheel.name)
+268	            assert name == wheel_name, f"{name!r} != {wheel_name!r} for wheel"
+269	            # Version may not be present for PEP 508 direct URLs
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py
+ Line number: 272
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+271	                wheel_version = Version(wheel.version)
+272	                assert version == wheel_version, "{!r} != {!r} for wheel {}".format(
+273	                    version, wheel_version, name
+274	                )
+275	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py
+ Line number: 277
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+276	        if cache_entry is not None:
+277	            assert ireq.link.is_wheel
+278	            assert ireq.link.is_file
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py
+ Line number: 278
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+277	            assert ireq.link.is_wheel
+278	            assert ireq.link.is_file
+279	            if cache_entry.persistent and template.link is template.original_link:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py
+ Line number: 262
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+261	        template = ireqs[0]
+262	        assert template.req, "Candidates found on index must be PEP 508"
+263	        name = canonicalize_name(template.req.name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py
+ Line number: 267
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+266	        for ireq in ireqs:
+267	            assert ireq.req, "Candidates found on index must be PEP 508"
+268	            specifier &= ireq.req.specifier
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py
+ Line number: 362
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+361	            base_cand = as_base_candidate(lookup_cand)
+362	            assert base_cand is not None, "no extras here"
+363	            yield self._make_extras_candidate(base_cand, extras)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py
+ Line number: 527
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+526	                    continue
+527	                assert ireq.name, "Constraint must be named"
+528	                name = canonicalize_name(ireq.name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py
+ Line number: 641
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+640	    ) -> UnsupportedPythonVersion:
+641	        assert causes, "Requires-Python error reported with no cause"
+642	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py
+ Line number: 717
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+716	    ) -> InstallationError:
+717	        assert e.causes, "Installation error reported with no cause"
+718	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py
+ Line number: 42
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+41	    def __init__(self, ireq: InstallRequirement) -> None:
+42	        assert ireq.link is None, "This is a link, not a specifier"
+43	        self._ireq = ireq
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py
+ Line number: 54
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+53	    def project_name(self) -> NormalizedName:
+54	        assert self._ireq.req, "Specifier-backed ireq is always PEP 508"
+55	        return canonicalize_name(self._ireq.req.name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py
+ Line number: 78
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+77	    def is_satisfied_by(self, candidate: Candidate) -> bool:
+78	        assert candidate.name == self.name, (
+79	            f"Internal issue: Candidate is not for this requirement "
+80	            f"{candidate.name} vs {self.name}"
+81	        )
+82	        # We can safely always allow prereleases here since PackageFinder
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py
+ Line number: 85
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+84	        # prerelease candidates if the user does not expect them.
+85	        assert self._ireq.req, "Specifier-backed ireq is always PEP 508"
+86	        spec = self._ireq.req.specifier
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py
+ Line number: 97
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+96	    def __init__(self, ireq: InstallRequirement) -> None:
+97	        assert ireq.link is None, "This is a link, not a specifier"
+98	        self._ireq = install_req_drop_extras(ireq)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py
+ Line number: 132
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+131	    def is_satisfied_by(self, candidate: Candidate) -> bool:
+132	        assert candidate.name == self._candidate.name, "Not Python candidate"
+133	        # We can safely always allow prereleases here since PackageFinder
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py
+ Line number: 56
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+55	        super().__init__()
+56	        assert upgrade_strategy in self._allowed_strategies
+57	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py
+ Line number: 200
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+199	        """
+200	        assert self._result is not None, "must call resolve() first"
+201	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py
+ Line number: 301
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+300	    difference = set(weights.keys()).difference(requirement_keys)
+301	    assert not difference, difference
+302	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py
+ Line number: 23
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+22	    else:
+23	        assert isinstance(direct_url.info, DirInfo)
+24	        requirement += direct_url.url
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py
+ Line number: 44
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+43	        vcs_backend = vcs.get_backend_for_scheme(link.scheme)
+44	        assert vcs_backend
+45	        url, requested_revision, _ = vcs_backend.get_url_rev_and_auth(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py
+ Line number: 55
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+54	            # with the VCS checkout.
+55	            assert requested_revision
+56	            commit_id = requested_revision
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+60	            # which we can inspect to find out the commit id.
+61	            assert source_dir
+62	            commit_id = vcs_backend.get_revision(source_dir)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py
+ Line number: 31
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+30	            result = ENCODING_RE.search(line)
+31	            assert result is not None
+32	            encoding = result.groups()[0].decode("ascii")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py
+ Line number: 22
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+21	
+22	    assert os.path.isabs(path)
+23	
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py
+ Line number: 100
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+99	    for _ in range(10):
+100	        name = basename + "".join(random.choice(alphabet) for _ in range(6))
+101	        file = os.path.join(path, name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py
+ Line number: 157
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+156	        # If we are given a diagnostic error to present, present it with indentation.
+157	        assert isinstance(record.args, tuple)
+158	        if getattr(record, "rich", False):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py
+ Line number: 160
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+159	            (rich_renderable,) = record.args
+160	            assert isinstance(
+161	                rich_renderable, (ConsoleRenderable, RichCast, str)
+162	            ), f"{rich_renderable} is not rich-console-renderable"
+163	
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: ''
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py
+ Line number: 517
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+516	        user = "****"
+517	        password = ""
+518	    else:
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: ':****'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py
+ Line number: 520
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+519	        user = urllib.parse.quote(user)
+520	        password = ":****"
+521	    return f"{user}{password}@{netloc}"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py
+ Line number: 113
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+112	) -> List[str]:
+113	    assert not (use_user_site and prefix)
+114	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py
+ Line number: 4
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+3	import shlex
+4	import subprocess
+5	from typing import (
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py
+ Line number: 141
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+140	    try:
+141	        proc = subprocess.Popen(
+142	            # Convert HiddenText objects to the underlying str.
+143	            reveal_command_args(cmd),
+144	            stdin=subprocess.PIPE,
+145	            stdout=subprocess.PIPE,
+146	            stderr=subprocess.STDOUT if not stdout_only else subprocess.PIPE,
+147	            cwd=cwd,
+148	            env=env,
+149	            errors="backslashreplace",
+150	        )
+151	    except Exception as exc:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py
+ Line number: 161
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+160	    if not stdout_only:
+161	        assert proc.stdout
+162	        assert proc.stdin
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py
+ Line number: 162
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+161	        assert proc.stdout
+162	        assert proc.stdin
+163	        proc.stdin.close()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py
+ Line number: 176
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+175	            if use_spinner:
+176	                assert spinner
+177	                spinner.spin()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py
+ Line number: 199
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+198	    if use_spinner:
+199	        assert spinner
+200	        if proc_had_error:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py
+ Line number: 146
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+145	        if globally_managed:
+146	            assert _tempdir_manager is not None
+147	            _tempdir_manager.enter_context(self)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py
+ Line number: 151
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+150	    def path(self) -> str:
+151	        assert not self._deleted, f"Attempted to access deleted path: {self._path}"
+152	        return self._path
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py
+ Line number: 216
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+215	                ensure_dir(os.path.dirname(path))
+216	                assert fp is not None
+217	                with open(path, "wb") as destfp:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py
+ Line number: 30
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+29	    """
+30	    assert url.startswith(
+31	        "file:"
+32	    ), f"You can only turn file: urls into filenames (not {url!r})"
+33	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py
+ Line number: 214
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+213	        # rev return value is always non-None.
+214	        assert rev is not None
+215	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py
+ Line number: 477
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+476	        if "://" not in url:
+477	            assert "file:" not in url
+478	            url = url.replace("git+", "git+ssh://")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py
+ Line number: 65
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+64	            if base == location:
+65	                assert dirurl is not None
+66	                base = dirurl + "/"  # save the root url
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py
+ Line number: 169
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+168	                match = _svn_info_xml_url_re.search(xml)
+169	                assert match is not None
+170	                url = match.group(1)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 105
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+104	        # unless it points to an immutable commit hash.
+105	        assert not req.editable
+106	        assert req.source_dir
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 106
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+105	        assert not req.editable
+106	        assert req.source_dir
+107	        vcs_backend = vcs.get_backend_for_scheme(req.link.scheme)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 108
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+107	        vcs_backend = vcs.get_backend_for_scheme(req.link.scheme)
+108	        assert vcs_backend
+109	        if vcs_backend.is_immutable_rev_checkout(req.link.url, req.source_dir):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 113
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+112	
+113	    assert req.link
+114	    base, ext = req.link.splitext()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 130
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+129	    cache_available = bool(wheel_cache.cache_dir)
+130	    assert req.link
+131	    if cache_available and _should_cache(req):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 213
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+212	    with TempDirectory(kind="wheel") as temp_dir:
+213	        assert req.name
+214	        if req.use_pep517:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 215
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+214	        if req.use_pep517:
+215	            assert req.metadata_directory
+216	            assert req.pep517_backend
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 216
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+215	            assert req.metadata_directory
+216	            assert req.pep517_backend
+217	            if global_options:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 317
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+316	        for req in requirements:
+317	            assert req.name
+318	            cache_dir = _get_cache_dir(req, wheel_cache)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 337
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+336	                req.local_file_path = req.link.file_path
+337	                assert req.link.is_wheel
+338	                build_successes.append(req)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py
+ Line number: 150
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+149	        if request.method in self.invalidating_methods and resp.ok:
+150	            assert request.url is not None
+151	            cache_url = self.controller.cache_url(request.url)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
+ Line number: 43
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+42	    match = URI.match(uri)
+43	    assert match is not None
+44	    groups = match.groups()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
+ Line number: 146
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+145	        cache_url = request.url
+146	        assert cache_url is not None
+147	        cache_data = self.cache.get(cache_url)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
+ Line number: 167
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+166	        """
+167	        assert request.url is not None
+168	        cache_url = self.cache_url(request.url)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
+ Line number: 215
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+214	        time_tuple = parsedate_tz(headers["date"])
+215	        assert time_tuple is not None
+216	        date = calendar.timegm(time_tuple[:6])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
+ Line number: 344
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+343	            time_tuple = parsedate_tz(response_headers["date"])
+344	            assert time_tuple is not None
+345	            date = calendar.timegm(time_tuple[:6])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
+ Line number: 364
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+363	
+364	        assert request.url is not None
+365	        cache_url = self.cache_url(request.url)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
+ Line number: 416
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+415	            time_tuple = parsedate_tz(response_headers["date"])
+416	            assert time_tuple is not None
+417	            date = calendar.timegm(time_tuple[:6])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
+ Line number: 463
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+462	        """
+463	        assert request.url is not None
+464	        cache_url = self.cache_url(request.url)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py
+ Line number: 137
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+136	        time_tuple = parsedate_tz(headers["date"])
+137	        assert time_tuple is not None
+138	        date = calendar.timegm(time_tuple[:6])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py
+ Line number: 59
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+58	    def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
+59	        assert self.coding_sm is not None
+60	        assert self.distribution_analyzer is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py
+ Line number: 60
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+59	        assert self.coding_sm is not None
+60	        assert self.distribution_analyzer is not None
+61	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py
+ Line number: 98
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+97	    def get_confidence(self) -> float:
+98	        assert self.distribution_analyzer is not None
+99	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py
+ Line number: 273
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+272	    def charset_name(self) -> str:
+273	        assert self._logical_prober is not None
+274	        assert self._visual_prober is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py
+ Line number: 274
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+273	        assert self._logical_prober is not None
+274	        assert self._visual_prober is not None
+275	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py
+ Line number: 308
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+307	    def state(self) -> ProbingState:
+308	        assert self._logical_prober is not None
+309	        assert self._visual_prober is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py
+ Line number: 309
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+308	        assert self._logical_prober is not None
+309	        assert self._visual_prober is not None
+310	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py
+ Line number: 58
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+57	    def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
+58	        assert self.coding_sm is not None
+59	        assert self.distribution_analyzer is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py
+ Line number: 59
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+58	        assert self.coding_sm is not None
+59	        assert self.distribution_analyzer is not None
+60	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py
+ Line number: 94
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+93	    def get_confidence(self) -> float:
+94	        assert self.distribution_analyzer is not None
+95	        return self.distribution_analyzer.get_confidence()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py
+ Line number: 59
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+58	    def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
+59	        assert self.coding_sm is not None
+60	        assert self.distribution_analyzer is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py
+ Line number: 60
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+59	        assert self.coding_sm is not None
+60	        assert self.distribution_analyzer is not None
+61	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py
+ Line number: 101
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+100	    def get_confidence(self) -> float:
+101	        assert self.distribution_analyzer is not None
+102	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py
+ Line number: 319
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+318	                charset_name = max_prober.charset_name
+319	                assert charset_name is not None
+320	                lower_charset_name = charset_name.lower()
+
+
+ + +
+
+ +
+
+ blacklist: Using xmlrpclib to parse untrusted XML data is known to be vulnerable to XML attacks. Use defusedxml.xmlrpc.monkey_patch() function to monkey-patch xmlrpclib and mitigate XML vulnerabilities.
+ Test ID: B411
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-20
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py
+ Line number: 42
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b411-import-xmlrpclib
+ +
+
+41	    import httplib
+42	    import xmlrpclib
+43	    import Queue as queue
+
+
+ + +
+
+ +
+
+ blacklist: Using xmlrpc.client to parse untrusted XML data is known to be vulnerable to XML attacks. Use defusedxml.xmlrpc.monkey_patch() function to monkey-patch xmlrpclib and mitigate XML vulnerabilities.
+ Test ID: B411
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-20
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py
+ Line number: 81
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b411-import-xmlrpclib
+ +
+
+80	    import urllib.request as urllib2
+81	    import xmlrpc.client as xmlrpclib
+82	    import queue
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py
+ Line number: 634
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+633	    def cache_from_source(path, debug_override=None):
+634	        assert path.endswith('.py')
+635	        if debug_override is None:
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak MD5 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py
+ Line number: 1032
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+1031	                f.close()
+1032	            return hashlib.md5(content).hexdigest()
+1033	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py
+ Line number: 11
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+10	import shutil
+11	import subprocess
+12	import tempfile
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py
+ Line number: 58
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+57	                try:
+58	                    rc = subprocess.check_call([s, '--version'], stdout=sink,
+59	                                               stderr=sink)
+60	                    if rc == 0:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py
+ Line number: 193
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+192	        stderr = []
+193	        p = subprocess.Popen(cmd, **kwargs)
+194	        # We don't use communicate() here because we may need to
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak MD5 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py
+ Line number: 269
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+268	            file_data = f.read()
+269	        md5_digest = hashlib.md5(file_data).hexdigest()
+270	        sha256_digest = hashlib.sha256(file_data).hexdigest()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py
+ Line number: 953
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+952	        super(DistPathLocator, self).__init__(**kwargs)
+953	        assert isinstance(distpath, DistributionPath)
+954	        self.distpath = distpath
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py
+ Line number: 115
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+114	                parent, _ = os.path.split(d)
+115	                assert parent not in ('', '/')
+116	                add_dir(dirs, parent)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py
+ Line number: 330
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+329	            if _PYTHON_VERSION > (3, 2):
+330	                assert pattern_re.startswith(start) and pattern_re.endswith(end)
+331	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py
+ Line number: 342
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+341	                prefix_re = self._glob_to_re(prefix)
+342	                assert prefix_re.startswith(start) and prefix_re.endswith(end)
+343	                prefix_re = prefix_re[len(start): len(prefix_re) - len(end)]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py
+ Line number: 78
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+77	        else:
+78	            assert isinstance(expr, dict)
+79	            op = expr['op']
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py
+ Line number: 930
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+929	    def _from_legacy(self):
+930	        assert self._legacy and not self._data
+931	        result = {
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py
+ Line number: 993
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+992	
+993	        assert self._data and not self._legacy
+994	        result = LegacyMetadata()
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py
+ Line number: 297
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+296	                        os.remove(dfname)
+297	                    except Exception:
+298	                        pass  # still in use - ignore error
+299	            else:
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 21
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+20	    ssl = None
+21	import subprocess
+22	import sys
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 287
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+286	        path = path.replace(os.path.sep, '/')
+287	        assert path.startswith(root)
+288	        return path[len(root):].lstrip('/')
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 374
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+373	                entry = get_export_entry(s)
+374	                assert entry is not None
+375	                entries[k] = entry
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 401
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+400	            entry = get_export_entry(s)
+401	            assert entry is not None
+402	            # entry.dist = self
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 552
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+551	    def copy_stream(self, instream, outfile, encoding=None):
+552	        assert not os.path.isdir(outfile)
+553	        self.ensure_dir(os.path.dirname(outfile))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 617
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+616	                else:
+617	                    assert path.startswith(prefix)
+618	                    diagpath = path[len(prefix):]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 667
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+666	        """
+667	        assert self.record
+668	        result = self.files_written, self.dirs_created
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 684
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+683	                if flist:
+684	                    assert flist == ['__pycache__']
+685	                    sd = os.path.join(d, flist[0])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 864
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+863	            break
+864	    assert i is not None
+865	    return result
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 1130
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1129	    def add(self, pred, succ):
+1130	        assert pred != succ
+1131	        self._preds.setdefault(succ, set()).add(pred)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 1135
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1134	    def remove(self, pred, succ):
+1135	        assert pred != succ
+1136	        try:
+
+
+ + +
+
+ +
+
+ tarfile_unsafe_members: tarfile.extractall used without any validation. Please check and discard dangerous members.
+ Test ID: B202
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 1310
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b202_tarfile_unsafe_members.html
+ +
+
+1309	
+1310	        archive.extractall(dest_dir)
+1311	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 1342
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1341	    def __init__(self, minval=0, maxval=100):
+1342	        assert maxval is None or maxval >= minval
+1343	        self.min = self.cur = minval
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 1350
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1349	    def update(self, curval):
+1350	        assert self.min <= curval
+1351	        assert self.max is None or curval <= self.max
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 1351
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1350	        assert self.min <= curval
+1351	        assert self.max is None or curval <= self.max
+1352	        self.cur = curval
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 1360
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1359	    def increment(self, incr):
+1360	        assert incr >= 0
+1361	        self.update(self.cur + incr)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 1451
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1450	    if len(rich_path_glob) > 1:
+1451	        assert len(rich_path_glob) == 3, rich_path_glob
+1452	        prefix, set, suffix = rich_path_glob
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 1792
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+1791	    def run_command(self, cmd, **kwargs):
+1792	        p = subprocess.Popen(cmd,
+1793	                             stdout=subprocess.PIPE,
+1794	                             stderr=subprocess.PIPE,
+1795	                             **kwargs)
+1796	        t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py
+ Line number: 34
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+33	        self._parts = parts = self.parse(s)
+34	        assert isinstance(parts, tuple)
+35	        assert len(parts) > 0
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py
+ Line number: 35
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+34	        assert isinstance(parts, tuple)
+35	        assert len(parts) > 0
+36	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py
+ Line number: 437
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+436	                        break
+437	                assert distinfo, '.dist-info directory expected, not found'
+438	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py
+ Line number: 37
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+36	import shlex
+37	import subprocess
+38	import sys
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py
+ Line number: 640
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+639	        def __get__(self, obj: Any, owner: Type[Any]) -> Any:
+640	            assert obj is not None, f"call {self._fname} on an instance"
+641	            ret = obj.__dict__[self._fname] = self._f(obj)
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py
+ Line number: 1161
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+1160	            cmd = ("lsb_release", "-a")
+1161	            stdout = subprocess.check_output(cmd, stderr=subprocess.DEVNULL)
+1162	        # Command not found or lsb_release returned error
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py
+ Line number: 1198
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+1197	            cmd = ("uname", "-rs")
+1198	            stdout = subprocess.check_output(cmd, stderr=subprocess.DEVNULL)
+1199	        except OSError:
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py
+ Line number: 1209
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+1208	        try:
+1209	            stdout = subprocess.check_output("oslevel", stderr=subprocess.DEVNULL)
+1210	        except (OSError, subprocess.CalledProcessError):
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py
+ Line number: 1209
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+1208	        try:
+1209	            stdout = subprocess.check_output("oslevel", stderr=subprocess.DEVNULL)
+1210	        except (OSError, subprocess.CalledProcessError):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py
+ Line number: 369
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+368	    def feed(self, next_bytes):
+369	        assert self._feeding
+370	        view = _get_data_from_buffer(next_bytes)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py
+ Line number: 433
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+432	                break
+433	            assert isinstance(read_data, bytes)
+434	            self._buffer += read_data
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py
+ Line number: 617
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+616	                return self._ext_hook(n, bytes(obj))
+617	        assert typ == TYPE_IMMEDIATE
+618	        return obj
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py
+ Line number: 833
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+832	                    data = obj.data
+833	                assert isinstance(code, int)
+834	                assert isinstance(data, bytes)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py
+ Line number: 834
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+833	                assert isinstance(code, int)
+834	                assert isinstance(data, bytes)
+835	                L = len(data)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py
+ Line number: 146
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+145	        version_string = os.confstr("CS_GNU_LIBC_VERSION")
+146	        assert version_string is not None
+147	        _, version = version_string.split()
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py
+ Line number: 13
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+12	import struct
+13	import subprocess
+14	import sys
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py
+ Line number: 106
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+105	        return None
+106	    proc = subprocess.run([ld], stderr=subprocess.PIPE, universal_newlines=True)
+107	    return _parse_musl_version(proc.stderr)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py
+ Line number: 130
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+129	    plat = sysconfig.get_platform()
+130	    assert plat.startswith("linux-"), "not linux"
+131	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py
+ Line number: 152
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+151	
+152	    assert isinstance(marker, (list, tuple, str))
+153	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py
+ Line number: 226
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+225	    for marker in markers:
+226	        assert isinstance(marker, (list, tuple, str))
+227	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py
+ Line number: 242
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+241	        else:
+242	            assert marker in ["and", "or"]
+243	            if marker == "or":
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py
+ Line number: 1561
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+1560	            code = compile(source, script_filename, 'exec')
+1561	            exec(code, namespace, namespace)
+1562	        else:
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py
+ Line number: 1572
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+1571	            script_code = compile(script_text, script_filename, 'exec')
+1572	            exec(script_code, namespace, namespace)
+1573	
+
+
+ + +
+
+ +
+
+ hardcoded_tmp_directory: Probable insecure usage of temp file/directory.
+ Test ID: B108
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-377
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py
+ Line number: 103
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b108_hardcoded_tmp_directory.html
+ +
+
+102	        """:return: cache directory shared by users, e.g. ``/var/tmp/$appname/$version``"""
+103	        return self._append_app_name_and_version("/var/tmp")  # noqa: S108
+104	
+
+
+ + +
+
+ +
+
+ hardcoded_tmp_directory: Probable insecure usage of temp file/directory.
+ Test ID: B108
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-377
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py
+ Line number: 164
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b108_hardcoded_tmp_directory.html
+ +
+
+163	                if not Path(path).exists():
+164	                    path = f"/tmp/runtime-{getuid()}"  # noqa: S108
+165	            else:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py
+ Line number: 522
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+521	                width = shutil.get_terminal_size().columns - 2
+522	            except Exception:
+523	                pass
+524	        argparse.HelpFormatter.__init__(self, prog, indent_increment,
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py
+ Line number: 103
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+102	        with open(filename, 'rb') as f:
+103	            exec(f.read(), custom_namespace)
+104	        # Retrieve the class `formattername` from that namespace
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py
+ Line number: 18
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+17	
+18	import subprocess
+19	
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py
+ Line number: 85
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+84	    def _get_nix_font_path(self, name, style):
+85	        proc = subprocess.Popen(['fc-list', "%s:style=%s" % (name, style), 'file'],
+86	                                stdout=subprocess.PIPE, stderr=None)
+87	        stdout, _ = proc.communicate()
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py
+ Line number: 85
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+84	    def _get_nix_font_path(self, name, style):
+85	        proc = subprocess.Popen(['fc-list', "%s:style=%s" % (name, style), 'file'],
+86	                                stdout=subprocess.PIPE, stderr=None)
+87	        stdout, _ = proc.communicate()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 492
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+491	        """Preprocess the token component of a token definition."""
+492	        assert type(token) is _TokenType or callable(token), \
+493	            'token type must be simple type or callable, not %r' % (token,)
+494	        return token
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 509
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+508	            else:
+509	                assert False, 'unknown new state %r' % new_state
+510	        elif isinstance(new_state, combined):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 516
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+515	            for istate in new_state:
+516	                assert istate != new_state, 'circular state ref %r' % istate
+517	                itokens.extend(cls._process_state(unprocessed,
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 524
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+523	            for istate in new_state:
+524	                assert (istate in unprocessed or
+525	                        istate in ('#pop', '#push')), \
+526	                    'unknown new state ' + istate
+527	            return new_state
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 529
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+528	        else:
+529	            assert False, 'unknown new state def %r' % new_state
+530	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 533
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+532	        """Preprocess a single state definition."""
+533	        assert type(state) is str, "wrong state name %r" % state
+534	        assert state[0] != '#', "invalid state name %r" % state
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 534
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+533	        assert type(state) is str, "wrong state name %r" % state
+534	        assert state[0] != '#', "invalid state name %r" % state
+535	        if state in processed:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 542
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+541	                # it's a state reference
+542	                assert tdef != state, "circular state reference %r" % state
+543	                tokens.extend(cls._process_state(unprocessed, processed,
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 556
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+555	
+556	            assert type(tdef) is tuple, "wrong rule def %r" % tdef
+557	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 723
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+722	                        else:
+723	                            assert False, "wrong state def: %r" % new_state
+724	                        statetokens = tokendefs[statestack[-1]]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 811
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+810	                        else:
+811	                            assert False, "wrong state def: %r" % new_state
+812	                        statetokens = tokendefs[ctx.stack[-1]]
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py
+ Line number: 153
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+152	        with open(filename, 'rb') as f:
+153	            exec(f.read(), custom_namespace)
+154	        # Retrieve the class `lexername` from that namespace
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/style.py
+ Line number: 79
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+78	                return text
+79	            assert False, "wrong color format %r" % text
+80	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py
+ Line number: 8
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+7	from os.path import join as pjoin
+8	from subprocess import STDOUT, check_call, check_output
+9	
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py
+ Line number: 59
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+58	
+59	    check_call(cmd, cwd=cwd, env=env)
+60	
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py
+ Line number: 71
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+70	
+71	    check_output(cmd, cwd=cwd, env=env, stderr=STDOUT)
+72	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py
+ Line number: 57
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+56	    urllib3_version = urllib3_version.split(".")
+57	    assert urllib3_version != ["dev"]  # Verify urllib3 isn't installed from git.
+58	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py
+ Line number: 67
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+66	    # urllib3 >= 1.21.1
+67	    assert major >= 1
+68	    if major == 1:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py
+ Line number: 69
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+68	    if major == 1:
+69	        assert minor >= 21
+70	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py
+ Line number: 76
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+75	        # chardet_version >= 3.0.2, < 6.0.0
+76	        assert (3, 0, 2) <= (major, minor, patch) < (6, 0, 0)
+77	    elif charset_normalizer_version:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py
+ Line number: 81
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+80	        # charset_normalizer >= 2.0.0 < 4.0.0
+81	        assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0)
+82	    else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py
+ Line number: 45
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+44	    """
+45	    assert isinstance(u_string, str)
+46	    try:
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak MD5 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py
+ Line number: 148
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+147	                    x = x.encode("utf-8")
+148	                return hashlib.md5(x).hexdigest()
+149	
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py
+ Line number: 156
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+155	                    x = x.encode("utf-8")
+156	                return hashlib.sha1(x).hexdigest()
+157	
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py
+ Line number: 205
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+204	
+205	        cnonce = hashlib.sha1(s).hexdigest()[:16]
+206	        if _algorithm == "MD5-SESS":
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '㊙'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py
+ Line number: 156
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+155	    "japanese_reserved_button": "🈯",
+156	    "japanese_secret_button": "㊙",
+157	    "japanese_service_charge_button": "🈂",
+158	    "japanese_symbol_for_beginner": "🔰",
+159	    "japanese_vacancy_button": "🈳",
+160	    "jersey": "🇯🇪",
+161	    "jordan": "🇯🇴",
+162	    "kazakhstan": "🇰🇿",
+163	    "kenya": "🇰🇪",
+164	    "kiribati": "🇰🇮",
+165	    "kosovo": "🇽🇰",
+166	    "kuwait": "🇰🇼",
+167	    "kyrgyzstan": "🇰🇬",
+168	    "laos": "🇱🇦",
+169	    "latvia": "🇱🇻",
+170	    "lebanon": "🇱🇧",
+171	    "leo": "♌",
+172	    "lesotho": "🇱🇸",
+173	    "liberia": "🇱🇷",
+174	    "libra": "♎",
+175	    "libya": "🇱🇾",
+176	    "liechtenstein": "🇱🇮",
+177	    "lithuania": "🇱🇹",
+178	    "luxembourg": "🇱🇺",
+179	    "macau_sar_china": "🇲🇴",
+180	    "macedonia": "🇲🇰",
+181	    "madagascar": "🇲🇬",
+182	    "malawi": "🇲🇼",
+183	    "malaysia": "🇲🇾",
+184	    "maldives": "🇲🇻",
+185	    "mali": "🇲🇱",
+186	    "malta": "🇲🇹",
+187	    "marshall_islands": "🇲🇭",
+188	    "martinique": "🇲🇶",
+189	    "mauritania": "🇲🇷",
+190	    "mauritius": "🇲🇺",
+191	    "mayotte": "🇾🇹",
+192	    "mexico": "🇲🇽",
+193	    "micronesia": "🇫🇲",
+194	    "moldova": "🇲🇩",
+195	    "monaco": "🇲🇨",
+196	    "mongolia": "🇲🇳",
+197	    "montenegro": "🇲🇪",
+198	    "montserrat": "🇲🇸",
+199	    "morocco": "🇲🇦",
+200	    "mozambique": "🇲🇿",
+201	    "mrs._claus": "🤶",
+202	    "mrs._claus_dark_skin_tone": "🤶🏿",
+203	    "mrs._claus_light_skin_tone": "🤶🏻",
+204	    "mrs._claus_medium-dark_skin_tone": "🤶🏾",
+205	    "mrs._claus_medium-light_skin_tone": "🤶🏼",
+206	    "mrs._claus_medium_skin_tone": "🤶🏽",
+207	    "myanmar_(burma)": "🇲🇲",
+208	    "new_button": "🆕",
+209	    "ng_button": "🆖",
+210	    "namibia": "🇳🇦",
+211	    "nauru": "🇳🇷",
+212	    "nepal": "🇳🇵",
+213	    "netherlands": "🇳🇱",
+214	    "new_caledonia": "🇳🇨",
+215	    "new_zealand": "🇳🇿",
+216	    "nicaragua": "🇳🇮",
+217	    "niger": "🇳🇪",
+218	    "nigeria": "🇳🇬",
+219	    "niue": "🇳🇺",
+220	    "norfolk_island": "🇳🇫",
+221	    "north_korea": "🇰🇵",
+222	    "northern_mariana_islands": "🇲🇵",
+223	    "norway": "🇳🇴",
+224	    "ok_button": "🆗",
+225	    "ok_hand": "👌",
+226	    "ok_hand_dark_skin_tone": "👌🏿",
+227	    "ok_hand_light_skin_tone": "👌🏻",
+228	    "ok_hand_medium-dark_skin_tone": "👌🏾",
+229	    "ok_hand_medium-light_skin_tone": "👌🏼",
+230	    "ok_hand_medium_skin_tone": "👌🏽",
+231	    "on!_arrow": "🔛",
+232	    "o_button_(blood_type)": "🅾",
+233	    "oman": "🇴🇲",
+234	    "ophiuchus": "⛎",
+235	    "p_button": "🅿",
+236	    "pakistan": "🇵🇰",
+237	    "palau": "🇵🇼",
+238	    "palestinian_territories": "🇵🇸",
+239	    "panama": "🇵🇦",
+240	    "papua_new_guinea": "🇵🇬",
+241	    "paraguay": "🇵🇾",
+242	    "peru": "🇵🇪",
+243	    "philippines": "🇵🇭",
+244	    "pisces": "♓",
+245	    "pitcairn_islands": "🇵🇳",
+246	    "poland": "🇵🇱",
+247	    "portugal": "🇵🇹",
+248	    "puerto_rico": "🇵🇷",
+249	    "qatar": "🇶🇦",
+250	    "romania": "🇷🇴",
+251	    "russia": "🇷🇺",
+252	    "rwanda": "🇷🇼",
+253	    "réunion": "🇷🇪",
+254	    "soon_arrow": "🔜",
+255	    "sos_button": "🆘",
+256	    "sagittarius": "♐",
+257	    "samoa": "🇼🇸",
+258	    "san_marino": "🇸🇲",
+259	    "santa_claus": "🎅",
+260	    "santa_claus_dark_skin_tone": "🎅🏿",
+261	    "santa_claus_light_skin_tone": "🎅🏻",
+262	    "santa_claus_medium-dark_skin_tone": "🎅🏾",
+263	    "santa_claus_medium-light_skin_tone": "🎅🏼",
+264	    "santa_claus_medium_skin_tone": "🎅🏽",
+265	    "saudi_arabia": "🇸🇦",
+266	    "scorpio": "♏",
+267	    "scotland": "🏴\U000e0067\U000e0062\U000e0073\U000e0063\U000e0074\U000e007f",
+268	    "senegal": "🇸🇳",
+269	    "serbia": "🇷🇸",
+270	    "seychelles": "🇸🇨",
+271	    "sierra_leone": "🇸🇱",
+272	    "singapore": "🇸🇬",
+273	    "sint_maarten": "🇸🇽",
+274	    "slovakia": "🇸🇰",
+275	    "slovenia": "🇸🇮",
+276	    "solomon_islands": "🇸🇧",
+277	    "somalia": "🇸🇴",
+278	    "south_africa": "🇿🇦",
+279	    "south_georgia_&_south_sandwich_islands": "🇬🇸",
+280	    "south_korea": "🇰🇷",
+281	    "south_sudan": "🇸🇸",
+282	    "spain": "🇪🇸",
+283	    "sri_lanka": "🇱🇰",
+284	    "st._barthélemy": "🇧🇱",
+285	    "st._helena": "🇸🇭",
+286	    "st._kitts_&_nevis": "🇰🇳",
+287	    "st._lucia": "🇱🇨",
+288	    "st._martin": "🇲🇫",
+289	    "st._pierre_&_miquelon": "🇵🇲",
+290	    "st._vincent_&_grenadines": "🇻🇨",
+291	    "statue_of_liberty": "🗽",
+292	    "sudan": "🇸🇩",
+293	    "suriname": "🇸🇷",
+294	    "svalbard_&_jan_mayen": "🇸🇯",
+295	    "swaziland": "🇸🇿",
+296	    "sweden": "🇸🇪",
+297	    "switzerland": "🇨🇭",
+298	    "syria": "🇸🇾",
+299	    "são_tomé_&_príncipe": "🇸🇹",
+300	    "t-rex": "🦖",
+301	    "top_arrow": "🔝",
+302	    "taiwan": "🇹🇼",
+303	    "tajikistan": "🇹🇯",
+304	    "tanzania": "🇹🇿",
+305	    "taurus": "♉",
+306	    "thailand": "🇹🇭",
+307	    "timor-leste": "🇹🇱",
+308	    "togo": "🇹🇬",
+309	    "tokelau": "🇹🇰",
+310	    "tokyo_tower": "🗼",
+311	    "tonga": "🇹🇴",
+312	    "trinidad_&_tobago": "🇹🇹",
+313	    "tristan_da_cunha": "🇹🇦",
+314	    "tunisia": "🇹🇳",
+315	    "turkey": "🦃",
+316	    "turkmenistan": "🇹🇲",
+317	    "turks_&_caicos_islands": "🇹🇨",
+318	    "tuvalu": "🇹🇻",
+319	    "u.s._outlying_islands": "🇺🇲",
+320	    "u.s._virgin_islands": "🇻🇮",
+321	    "up!_button": "🆙",
+322	    "uganda": "🇺🇬",
+323	    "ukraine": "🇺🇦",
+324	    "united_arab_emirates": "🇦🇪",
+325	    "united_kingdom": "🇬🇧",
+326	    "united_nations": "🇺🇳",
+327	    "united_states": "🇺🇸",
+328	    "uruguay": "🇺🇾",
+329	    "uzbekistan": "🇺🇿",
+330	    "vs_button": "🆚",
+331	    "vanuatu": "🇻🇺",
+332	    "vatican_city": "🇻🇦",
+333	    "venezuela": "🇻🇪",
+334	    "vietnam": "🇻🇳",
+335	    "virgo": "♍",
+336	    "wales": "🏴\U000e0067\U000e0062\U000e0077\U000e006c\U000e0073\U000e007f",
+337	    "wallis_&_futuna": "🇼🇫",
+338	    "western_sahara": "🇪🇭",
+339	    "yemen": "🇾🇪",
+340	    "zambia": "🇿🇲",
+341	    "zimbabwe": "🇿🇼",
+342	    "abacus": "🧮",
+343	    "adhesive_bandage": "🩹",
+344	    "admission_tickets": "🎟",
+345	    "adult": "🧑",
+346	    "adult_dark_skin_tone": "🧑🏿",
+347	    "adult_light_skin_tone": "🧑🏻",
+348	    "adult_medium-dark_skin_tone": "🧑🏾",
+349	    "adult_medium-light_skin_tone": "🧑🏼",
+350	    "adult_medium_skin_tone": "🧑🏽",
+351	    "aerial_tramway": "🚡",
+352	    "airplane": "✈",
+353	    "airplane_arrival": "🛬",
+354	    "airplane_departure": "🛫",
+355	    "alarm_clock": "⏰",
+356	    "alembic": "⚗",
+357	    "alien": "👽",
+358	    "alien_monster": "👾",
+359	    "ambulance": "🚑",
+360	    "american_football": "🏈",
+361	    "amphora": "🏺",
+362	    "anchor": "⚓",
+363	    "anger_symbol": "💢",
+364	    "angry_face": "😠",
+365	    "angry_face_with_horns": "👿",
+366	    "anguished_face": "😧",
+367	    "ant": "🐜",
+368	    "antenna_bars": "📶",
+369	    "anxious_face_with_sweat": "😰",
+370	    "articulated_lorry": "🚛",
+371	    "artist_palette": "🎨",
+372	    "astonished_face": "😲",
+373	    "atom_symbol": "⚛",
+374	    "auto_rickshaw": "🛺",
+375	    "automobile": "🚗",
+376	    "avocado": "🥑",
+377	    "axe": "🪓",
+378	    "baby": "👶",
+379	    "baby_angel": "👼",
+380	    "baby_angel_dark_skin_tone": "👼🏿",
+381	    "baby_angel_light_skin_tone": "👼🏻",
+382	    "baby_angel_medium-dark_skin_tone": "👼🏾",
+383	    "baby_angel_medium-light_skin_tone": "👼🏼",
+384	    "baby_angel_medium_skin_tone": "👼🏽",
+385	    "baby_bottle": "🍼",
+386	    "baby_chick": "🐤",
+387	    "baby_dark_skin_tone": "👶🏿",
+388	    "baby_light_skin_tone": "👶🏻",
+389	    "baby_medium-dark_skin_tone": "👶🏾",
+390	    "baby_medium-light_skin_tone": "👶🏼",
+391	    "baby_medium_skin_tone": "👶🏽",
+392	    "baby_symbol": "🚼",
+393	    "backhand_index_pointing_down": "👇",
+394	    "backhand_index_pointing_down_dark_skin_tone": "👇🏿",
+395	    "backhand_index_pointing_down_light_skin_tone": "👇🏻",
+396	    "backhand_index_pointing_down_medium-dark_skin_tone": "👇🏾",
+397	    "backhand_index_pointing_down_medium-light_skin_tone": "👇🏼",
+398	    "backhand_index_pointing_down_medium_skin_tone": "👇🏽",
+399	    "backhand_index_pointing_left": "👈",
+400	    "backhand_index_pointing_left_dark_skin_tone": "👈🏿",
+401	    "backhand_index_pointing_left_light_skin_tone": "👈🏻",
+402	    "backhand_index_pointing_left_medium-dark_skin_tone": "👈🏾",
+403	    "backhand_index_pointing_left_medium-light_skin_tone": "👈🏼",
+404	    "backhand_index_pointing_left_medium_skin_tone": "👈🏽",
+405	    "backhand_index_pointing_right": "👉",
+406	    "backhand_index_pointing_right_dark_skin_tone": "👉🏿",
+407	    "backhand_index_pointing_right_light_skin_tone": "👉🏻",
+408	    "backhand_index_pointing_right_medium-dark_skin_tone": "👉🏾",
+409	    "backhand_index_pointing_right_medium-light_skin_tone": "👉🏼",
+410	    "backhand_index_pointing_right_medium_skin_tone": "👉🏽",
+411	    "backhand_index_pointing_up": "👆",
+412	    "backhand_index_pointing_up_dark_skin_tone": "👆🏿",
+413	    "backhand_index_pointing_up_light_skin_tone": "👆🏻",
+414	    "backhand_index_pointing_up_medium-dark_skin_tone": "👆🏾",
+415	    "backhand_index_pointing_up_medium-light_skin_tone": "👆🏼",
+416	    "backhand_index_pointing_up_medium_skin_tone": "👆🏽",
+417	    "bacon": "🥓",
+418	    "badger": "🦡",
+419	    "badminton": "🏸",
+420	    "bagel": "🥯",
+421	    "baggage_claim": "🛄",
+422	    "baguette_bread": "🥖",
+423	    "balance_scale": "⚖",
+424	    "bald": "🦲",
+425	    "bald_man": "👨\u200d🦲",
+426	    "bald_woman": "👩\u200d🦲",
+427	    "ballet_shoes": "🩰",
+428	    "balloon": "🎈",
+429	    "ballot_box_with_ballot": "🗳",
+430	    "ballot_box_with_check": "☑",
+431	    "banana": "🍌",
+432	    "banjo": "🪕",
+433	    "bank": "🏦",
+434	    "bar_chart": "📊",
+435	    "barber_pole": "💈",
+436	    "baseball": "⚾",
+437	    "basket": "🧺",
+438	    "basketball": "🏀",
+439	    "bat": "🦇",
+440	    "bathtub": "🛁",
+441	    "battery": "🔋",
+442	    "beach_with_umbrella": "🏖",
+443	    "beaming_face_with_smiling_eyes": "😁",
+444	    "bear_face": "🐻",
+445	    "bearded_person": "🧔",
+446	    "bearded_person_dark_skin_tone": "🧔🏿",
+447	    "bearded_person_light_skin_tone": "🧔🏻",
+448	    "bearded_person_medium-dark_skin_tone": "🧔🏾",
+449	    "bearded_person_medium-light_skin_tone": "🧔🏼",
+450	    "bearded_person_medium_skin_tone": "🧔🏽",
+451	    "beating_heart": "💓",
+452	    "bed": "🛏",
+453	    "beer_mug": "🍺",
+454	    "bell": "🔔",
+455	    "bell_with_slash": "🔕",
+456	    "bellhop_bell": "🛎",
+457	    "bento_box": "🍱",
+458	    "beverage_box": "🧃",
+459	    "bicycle": "🚲",
+460	    "bikini": "👙",
+461	    "billed_cap": "🧢",
+462	    "biohazard": "☣",
+463	    "bird": "🐦",
+464	    "birthday_cake": "🎂",
+465	    "black_circle": "⚫",
+466	    "black_flag": "🏴",
+467	    "black_heart": "🖤",
+468	    "black_large_square": "⬛",
+469	    "black_medium-small_square": "◾",
+470	    "black_medium_square": "◼",
+471	    "black_nib": "✒",
+472	    "black_small_square": "▪",
+473	    "black_square_button": "🔲",
+474	    "blond-haired_man": "👱\u200d♂️",
+475	    "blond-haired_man_dark_skin_tone": "👱🏿\u200d♂️",
+476	    "blond-haired_man_light_skin_tone": "👱🏻\u200d♂️",
+477	    "blond-haired_man_medium-dark_skin_tone": "👱🏾\u200d♂️",
+478	    "blond-haired_man_medium-light_skin_tone": "👱🏼\u200d♂️",
+479	    "blond-haired_man_medium_skin_tone": "👱🏽\u200d♂️",
+480	    "blond-haired_person": "👱",
+481	    "blond-haired_person_dark_skin_tone": "👱🏿",
+482	    "blond-haired_person_light_skin_tone": "👱🏻",
+483	    "blond-haired_person_medium-dark_skin_tone": "👱🏾",
+484	    "blond-haired_person_medium-light_skin_tone": "👱🏼",
+485	    "blond-haired_person_medium_skin_tone": "👱🏽",
+486	    "blond-haired_woman": "👱\u200d♀️",
+487	    "blond-haired_woman_dark_skin_tone": "👱🏿\u200d♀️",
+488	    "blond-haired_woman_light_skin_tone": "👱🏻\u200d♀️",
+489	    "blond-haired_woman_medium-dark_skin_tone": "👱🏾\u200d♀️",
+490	    "blond-haired_woman_medium-light_skin_tone": "👱🏼\u200d♀️",
+491	    "blond-haired_woman_medium_skin_tone": "👱🏽\u200d♀️",
+492	    "blossom": "🌼",
+493	    "blowfish": "🐡",
+494	    "blue_book": "📘",
+495	    "blue_circle": "🔵",
+496	    "blue_heart": "💙",
+497	    "blue_square": "🟦",
+498	    "boar": "🐗",
+499	    "bomb": "💣",
+500	    "bone": "🦴",
+501	    "bookmark": "🔖",
+502	    "bookmark_tabs": "📑",
+503	    "books": "📚",
+504	    "bottle_with_popping_cork": "🍾",
+505	    "bouquet": "💐",
+506	    "bow_and_arrow": "🏹",
+507	    "bowl_with_spoon": "🥣",
+508	    "bowling": "🎳",
+509	    "boxing_glove": "🥊",
+510	    "boy": "👦",
+511	    "boy_dark_skin_tone": "👦🏿",
+512	    "boy_light_skin_tone": "👦🏻",
+513	    "boy_medium-dark_skin_tone": "👦🏾",
+514	    "boy_medium-light_skin_tone": "👦🏼",
+515	    "boy_medium_skin_tone": "👦🏽",
+516	    "brain": "🧠",
+517	    "bread": "🍞",
+518	    "breast-feeding": "🤱",
+519	    "breast-feeding_dark_skin_tone": "🤱🏿",
+520	    "breast-feeding_light_skin_tone": "🤱🏻",
+521	    "breast-feeding_medium-dark_skin_tone": "🤱🏾",
+522	    "breast-feeding_medium-light_skin_tone": "🤱🏼",
+523	    "breast-feeding_medium_skin_tone": "🤱🏽",
+524	    "brick": "🧱",
+525	    "bride_with_veil": "👰",
+526	    "bride_with_veil_dark_skin_tone": "👰🏿",
+527	    "bride_with_veil_light_skin_tone": "👰🏻",
+528	    "bride_with_veil_medium-dark_skin_tone": "👰🏾",
+529	    "bride_with_veil_medium-light_skin_tone": "👰🏼",
+530	    "bride_with_veil_medium_skin_tone": "👰🏽",
+531	    "bridge_at_night": "🌉",
+532	    "briefcase": "💼",
+533	    "briefs": "🩲",
+534	    "bright_button": "🔆",
+535	    "broccoli": "🥦",
+536	    "broken_heart": "💔",
+537	    "broom": "🧹",
+538	    "brown_circle": "🟤",
+539	    "brown_heart": "🤎",
+540	    "brown_square": "🟫",
+541	    "bug": "🐛",
+542	    "building_construction": "🏗",
+543	    "bullet_train": "🚅",
+544	    "burrito": "🌯",
+545	    "bus": "🚌",
+546	    "bus_stop": "🚏",
+547	    "bust_in_silhouette": "👤",
+548	    "busts_in_silhouette": "👥",
+549	    "butter": "🧈",
+550	    "butterfly": "🦋",
+551	    "cactus": "🌵",
+552	    "calendar": "📆",
+553	    "call_me_hand": "🤙",
+554	    "call_me_hand_dark_skin_tone": "🤙🏿",
+555	    "call_me_hand_light_skin_tone": "🤙🏻",
+556	    "call_me_hand_medium-dark_skin_tone": "🤙🏾",
+557	    "call_me_hand_medium-light_skin_tone": "🤙🏼",
+558	    "call_me_hand_medium_skin_tone": "🤙🏽",
+559	    "camel": "🐫",
+560	    "camera": "📷",
+561	    "camera_with_flash": "📸",
+562	    "camping": "🏕",
+563	    "candle": "🕯",
+564	    "candy": "🍬",
+565	    "canned_food": "🥫",
+566	    "canoe": "🛶",
+567	    "card_file_box": "🗃",
+568	    "card_index": "📇",
+569	    "card_index_dividers": "🗂",
+570	    "carousel_horse": "🎠",
+571	    "carp_streamer": "🎏",
+572	    "carrot": "🥕",
+573	    "castle": "🏰",
+574	    "cat": "🐱",
+575	    "cat_face": "🐱",
+576	    "cat_face_with_tears_of_joy": "😹",
+577	    "cat_face_with_wry_smile": "😼",
+578	    "chains": "⛓",
+579	    "chair": "🪑",
+580	    "chart_decreasing": "📉",
+581	    "chart_increasing": "📈",
+582	    "chart_increasing_with_yen": "💹",
+583	    "cheese_wedge": "🧀",
+584	    "chequered_flag": "🏁",
+585	    "cherries": "🍒",
+586	    "cherry_blossom": "🌸",
+587	    "chess_pawn": "♟",
+588	    "chestnut": "🌰",
+589	    "chicken": "🐔",
+590	    "child": "🧒",
+591	    "child_dark_skin_tone": "🧒🏿",
+592	    "child_light_skin_tone": "🧒🏻",
+593	    "child_medium-dark_skin_tone": "🧒🏾",
+594	    "child_medium-light_skin_tone": "🧒🏼",
+595	    "child_medium_skin_tone": "🧒🏽",
+596	    "children_crossing": "🚸",
+597	    "chipmunk": "🐿",
+598	    "chocolate_bar": "🍫",
+599	    "chopsticks": "🥢",
+600	    "church": "⛪",
+601	    "cigarette": "🚬",
+602	    "cinema": "🎦",
+603	    "circled_m": "Ⓜ",
+604	    "circus_tent": "🎪",
+605	    "cityscape": "🏙",
+606	    "cityscape_at_dusk": "🌆",
+607	    "clamp": "🗜",
+608	    "clapper_board": "🎬",
+609	    "clapping_hands": "👏",
+610	    "clapping_hands_dark_skin_tone": "👏🏿",
+611	    "clapping_hands_light_skin_tone": "👏🏻",
+612	    "clapping_hands_medium-dark_skin_tone": "👏🏾",
+613	    "clapping_hands_medium-light_skin_tone": "👏🏼",
+614	    "clapping_hands_medium_skin_tone": "👏🏽",
+615	    "classical_building": "🏛",
+616	    "clinking_beer_mugs": "🍻",
+617	    "clinking_glasses": "🥂",
+618	    "clipboard": "📋",
+619	    "clockwise_vertical_arrows": "🔃",
+620	    "closed_book": "📕",
+621	    "closed_mailbox_with_lowered_flag": "📪",
+622	    "closed_mailbox_with_raised_flag": "📫",
+623	    "closed_umbrella": "🌂",
+624	    "cloud": "☁",
+625	    "cloud_with_lightning": "🌩",
+626	    "cloud_with_lightning_and_rain": "⛈",
+627	    "cloud_with_rain": "🌧",
+628	    "cloud_with_snow": "🌨",
+629	    "clown_face": "🤡",
+630	    "club_suit": "♣",
+631	    "clutch_bag": "👝",
+632	    "coat": "🧥",
+633	    "cocktail_glass": "🍸",
+634	    "coconut": "🥥",
+635	    "coffin": "⚰",
+636	    "cold_face": "🥶",
+637	    "collision": "💥",
+638	    "comet": "☄",
+639	    "compass": "🧭",
+640	    "computer_disk": "💽",
+641	    "computer_mouse": "🖱",
+642	    "confetti_ball": "🎊",
+643	    "confounded_face": "😖",
+644	    "confused_face": "😕",
+645	    "construction": "🚧",
+646	    "construction_worker": "👷",
+647	    "construction_worker_dark_skin_tone": "👷🏿",
+648	    "construction_worker_light_skin_tone": "👷🏻",
+649	    "construction_worker_medium-dark_skin_tone": "👷🏾",
+650	    "construction_worker_medium-light_skin_tone": "👷🏼",
+651	    "construction_worker_medium_skin_tone": "👷🏽",
+652	    "control_knobs": "🎛",
+653	    "convenience_store": "🏪",
+654	    "cooked_rice": "🍚",
+655	    "cookie": "🍪",
+656	    "cooking": "🍳",
+657	    "copyright": "©",
+658	    "couch_and_lamp": "🛋",
+659	    "counterclockwise_arrows_button": "🔄",
+660	    "couple_with_heart": "💑",
+661	    "couple_with_heart_man_man": "👨\u200d❤️\u200d👨",
+662	    "couple_with_heart_woman_man": "👩\u200d❤️\u200d👨",
+663	    "couple_with_heart_woman_woman": "👩\u200d❤️\u200d👩",
+664	    "cow": "🐮",
+665	    "cow_face": "🐮",
+666	    "cowboy_hat_face": "🤠",
+667	    "crab": "🦀",
+668	    "crayon": "🖍",
+669	    "credit_card": "💳",
+670	    "crescent_moon": "🌙",
+671	    "cricket": "🦗",
+672	    "cricket_game": "🏏",
+673	    "crocodile": "🐊",
+674	    "croissant": "🥐",
+675	    "cross_mark": "❌",
+676	    "cross_mark_button": "❎",
+677	    "crossed_fingers": "🤞",
+678	    "crossed_fingers_dark_skin_tone": "🤞🏿",
+679	    "crossed_fingers_light_skin_tone": "🤞🏻",
+680	    "crossed_fingers_medium-dark_skin_tone": "🤞🏾",
+681	    "crossed_fingers_medium-light_skin_tone": "🤞🏼",
+682	    "crossed_fingers_medium_skin_tone": "🤞🏽",
+683	    "crossed_flags": "🎌",
+684	    "crossed_swords": "⚔",
+685	    "crown": "👑",
+686	    "crying_cat_face": "😿",
+687	    "crying_face": "😢",
+688	    "crystal_ball": "🔮",
+689	    "cucumber": "🥒",
+690	    "cupcake": "🧁",
+691	    "cup_with_straw": "🥤",
+692	    "curling_stone": "🥌",
+693	    "curly_hair": "🦱",
+694	    "curly-haired_man": "👨\u200d🦱",
+695	    "curly-haired_woman": "👩\u200d🦱",
+696	    "curly_loop": "➰",
+697	    "currency_exchange": "💱",
+698	    "curry_rice": "🍛",
+699	    "custard": "🍮",
+700	    "customs": "🛃",
+701	    "cut_of_meat": "🥩",
+702	    "cyclone": "🌀",
+703	    "dagger": "🗡",
+704	    "dango": "🍡",
+705	    "dashing_away": "💨",
+706	    "deaf_person": "🧏",
+707	    "deciduous_tree": "🌳",
+708	    "deer": "🦌",
+709	    "delivery_truck": "🚚",
+710	    "department_store": "🏬",
+711	    "derelict_house": "🏚",
+712	    "desert": "🏜",
+713	    "desert_island": "🏝",
+714	    "desktop_computer": "🖥",
+715	    "detective": "🕵",
+716	    "detective_dark_skin_tone": "🕵🏿",
+717	    "detective_light_skin_tone": "🕵🏻",
+718	    "detective_medium-dark_skin_tone": "🕵🏾",
+719	    "detective_medium-light_skin_tone": "🕵🏼",
+720	    "detective_medium_skin_tone": "🕵🏽",
+721	    "diamond_suit": "♦",
+722	    "diamond_with_a_dot": "💠",
+723	    "dim_button": "🔅",
+724	    "direct_hit": "🎯",
+725	    "disappointed_face": "😞",
+726	    "diving_mask": "🤿",
+727	    "diya_lamp": "🪔",
+728	    "dizzy": "💫",
+729	    "dizzy_face": "😵",
+730	    "dna": "🧬",
+731	    "dog": "🐶",
+732	    "dog_face": "🐶",
+733	    "dollar_banknote": "💵",
+734	    "dolphin": "🐬",
+735	    "door": "🚪",
+736	    "dotted_six-pointed_star": "🔯",
+737	    "double_curly_loop": "➿",
+738	    "double_exclamation_mark": "‼",
+739	    "doughnut": "🍩",
+740	    "dove": "🕊",
+741	    "down-left_arrow": "↙",
+742	    "down-right_arrow": "↘",
+743	    "down_arrow": "⬇",
+744	    "downcast_face_with_sweat": "😓",
+745	    "downwards_button": "🔽",
+746	    "dragon": "🐉",
+747	    "dragon_face": "🐲",
+748	    "dress": "👗",
+749	    "drooling_face": "🤤",
+750	    "drop_of_blood": "🩸",
+751	    "droplet": "💧",
+752	    "drum": "🥁",
+753	    "duck": "🦆",
+754	    "dumpling": "🥟",
+755	    "dvd": "📀",
+756	    "e-mail": "📧",
+757	    "eagle": "🦅",
+758	    "ear": "👂",
+759	    "ear_dark_skin_tone": "👂🏿",
+760	    "ear_light_skin_tone": "👂🏻",
+761	    "ear_medium-dark_skin_tone": "👂🏾",
+762	    "ear_medium-light_skin_tone": "👂🏼",
+763	    "ear_medium_skin_tone": "👂🏽",
+764	    "ear_of_corn": "🌽",
+765	    "ear_with_hearing_aid": "🦻",
+766	    "egg": "🍳",
+767	    "eggplant": "🍆",
+768	    "eight-pointed_star": "✴",
+769	    "eight-spoked_asterisk": "✳",
+770	    "eight-thirty": "🕣",
+771	    "eight_o’clock": "🕗",
+772	    "eject_button": "⏏",
+773	    "electric_plug": "🔌",
+774	    "elephant": "🐘",
+775	    "eleven-thirty": "🕦",
+776	    "eleven_o’clock": "🕚",
+777	    "elf": "🧝",
+778	    "elf_dark_skin_tone": "🧝🏿",
+779	    "elf_light_skin_tone": "🧝🏻",
+780	    "elf_medium-dark_skin_tone": "🧝🏾",
+781	    "elf_medium-light_skin_tone": "🧝🏼",
+782	    "elf_medium_skin_tone": "🧝🏽",
+783	    "envelope": "✉",
+784	    "envelope_with_arrow": "📩",
+785	    "euro_banknote": "💶",
+786	    "evergreen_tree": "🌲",
+787	    "ewe": "🐑",
+788	    "exclamation_mark": "❗",
+789	    "exclamation_question_mark": "⁉",
+790	    "exploding_head": "🤯",
+791	    "expressionless_face": "😑",
+792	    "eye": "👁",
+793	    "eye_in_speech_bubble": "👁️\u200d🗨️",
+794	    "eyes": "👀",
+795	    "face_blowing_a_kiss": "😘",
+796	    "face_savoring_food": "😋",
+797	    "face_screaming_in_fear": "😱",
+798	    "face_vomiting": "🤮",
+799	    "face_with_hand_over_mouth": "🤭",
+800	    "face_with_head-bandage": "🤕",
+801	    "face_with_medical_mask": "😷",
+802	    "face_with_monocle": "🧐",
+803	    "face_with_open_mouth": "😮",
+804	    "face_with_raised_eyebrow": "🤨",
+805	    "face_with_rolling_eyes": "🙄",
+806	    "face_with_steam_from_nose": "😤",
+807	    "face_with_symbols_on_mouth": "🤬",
+808	    "face_with_tears_of_joy": "😂",
+809	    "face_with_thermometer": "🤒",
+810	    "face_with_tongue": "😛",
+811	    "face_without_mouth": "😶",
+812	    "factory": "🏭",
+813	    "fairy": "🧚",
+814	    "fairy_dark_skin_tone": "🧚🏿",
+815	    "fairy_light_skin_tone": "🧚🏻",
+816	    "fairy_medium-dark_skin_tone": "🧚🏾",
+817	    "fairy_medium-light_skin_tone": "🧚🏼",
+818	    "fairy_medium_skin_tone": "🧚🏽",
+819	    "falafel": "🧆",
+820	    "fallen_leaf": "🍂",
+821	    "family": "👪",
+822	    "family_man_boy": "👨\u200d👦",
+823	    "family_man_boy_boy": "👨\u200d👦\u200d👦",
+824	    "family_man_girl": "👨\u200d👧",
+825	    "family_man_girl_boy": "👨\u200d👧\u200d👦",
+826	    "family_man_girl_girl": "👨\u200d👧\u200d👧",
+827	    "family_man_man_boy": "👨\u200d👨\u200d👦",
+828	    "family_man_man_boy_boy": "👨\u200d👨\u200d👦\u200d👦",
+829	    "family_man_man_girl": "👨\u200d👨\u200d👧",
+830	    "family_man_man_girl_boy": "👨\u200d👨\u200d👧\u200d👦",
+831	    "family_man_man_girl_girl": "👨\u200d👨\u200d👧\u200d👧",
+832	    "family_man_woman_boy": "👨\u200d👩\u200d👦",
+833	    "family_man_woman_boy_boy": "👨\u200d👩\u200d👦\u200d👦",
+834	    "family_man_woman_girl": "👨\u200d👩\u200d👧",
+835	    "family_man_woman_girl_boy": "👨\u200d👩\u200d👧\u200d👦",
+836	    "family_man_woman_girl_girl": "👨\u200d👩\u200d👧\u200d👧",
+837	    "family_woman_boy": "👩\u200d👦",
+838	    "family_woman_boy_boy": "👩\u200d👦\u200d👦",
+839	    "family_woman_girl": "👩\u200d👧",
+840	    "family_woman_girl_boy": "👩\u200d👧\u200d👦",
+841	    "family_woman_girl_girl": "👩\u200d👧\u200d👧",
+842	    "family_woman_woman_boy": "👩\u200d👩\u200d👦",
+843	    "family_woman_woman_boy_boy": "👩\u200d👩\u200d👦\u200d👦",
+844	    "family_woman_woman_girl": "👩\u200d👩\u200d👧",
+845	    "family_woman_woman_girl_boy": "👩\u200d👩\u200d👧\u200d👦",
+846	    "family_woman_woman_girl_girl": "👩\u200d👩\u200d👧\u200d👧",
+847	    "fast-forward_button": "⏩",
+848	    "fast_down_button": "⏬",
+849	    "fast_reverse_button": "⏪",
+850	    "fast_up_button": "⏫",
+851	    "fax_machine": "📠",
+852	    "fearful_face": "😨",
+853	    "female_sign": "♀",
+854	    "ferris_wheel": "🎡",
+855	    "ferry": "⛴",
+856	    "field_hockey": "🏑",
+857	    "file_cabinet": "🗄",
+858	    "file_folder": "📁",
+859	    "film_frames": "🎞",
+860	    "film_projector": "📽",
+861	    "fire": "🔥",
+862	    "fire_extinguisher": "🧯",
+863	    "firecracker": "🧨",
+864	    "fire_engine": "🚒",
+865	    "fireworks": "🎆",
+866	    "first_quarter_moon": "🌓",
+867	    "first_quarter_moon_face": "🌛",
+868	    "fish": "🐟",
+869	    "fish_cake_with_swirl": "🍥",
+870	    "fishing_pole": "🎣",
+871	    "five-thirty": "🕠",
+872	    "five_o’clock": "🕔",
+873	    "flag_in_hole": "⛳",
+874	    "flamingo": "🦩",
+875	    "flashlight": "🔦",
+876	    "flat_shoe": "🥿",
+877	    "fleur-de-lis": "⚜",
+878	    "flexed_biceps": "💪",
+879	    "flexed_biceps_dark_skin_tone": "💪🏿",
+880	    "flexed_biceps_light_skin_tone": "💪🏻",
+881	    "flexed_biceps_medium-dark_skin_tone": "💪🏾",
+882	    "flexed_biceps_medium-light_skin_tone": "💪🏼",
+883	    "flexed_biceps_medium_skin_tone": "💪🏽",
+884	    "floppy_disk": "💾",
+885	    "flower_playing_cards": "🎴",
+886	    "flushed_face": "😳",
+887	    "flying_disc": "🥏",
+888	    "flying_saucer": "🛸",
+889	    "fog": "🌫",
+890	    "foggy": "🌁",
+891	    "folded_hands": "🙏",
+892	    "folded_hands_dark_skin_tone": "🙏🏿",
+893	    "folded_hands_light_skin_tone": "🙏🏻",
+894	    "folded_hands_medium-dark_skin_tone": "🙏🏾",
+895	    "folded_hands_medium-light_skin_tone": "🙏🏼",
+896	    "folded_hands_medium_skin_tone": "🙏🏽",
+897	    "foot": "🦶",
+898	    "footprints": "👣",
+899	    "fork_and_knife": "🍴",
+900	    "fork_and_knife_with_plate": "🍽",
+901	    "fortune_cookie": "🥠",
+902	    "fountain": "⛲",
+903	    "fountain_pen": "🖋",
+904	    "four-thirty": "🕟",
+905	    "four_leaf_clover": "🍀",
+906	    "four_o’clock": "🕓",
+907	    "fox_face": "🦊",
+908	    "framed_picture": "🖼",
+909	    "french_fries": "🍟",
+910	    "fried_shrimp": "🍤",
+911	    "frog_face": "🐸",
+912	    "front-facing_baby_chick": "🐥",
+913	    "frowning_face": "☹",
+914	    "frowning_face_with_open_mouth": "😦",
+915	    "fuel_pump": "⛽",
+916	    "full_moon": "🌕",
+917	    "full_moon_face": "🌝",
+918	    "funeral_urn": "⚱",
+919	    "game_die": "🎲",
+920	    "garlic": "🧄",
+921	    "gear": "⚙",
+922	    "gem_stone": "💎",
+923	    "genie": "🧞",
+924	    "ghost": "👻",
+925	    "giraffe": "🦒",
+926	    "girl": "👧",
+927	    "girl_dark_skin_tone": "👧🏿",
+928	    "girl_light_skin_tone": "👧🏻",
+929	    "girl_medium-dark_skin_tone": "👧🏾",
+930	    "girl_medium-light_skin_tone": "👧🏼",
+931	    "girl_medium_skin_tone": "👧🏽",
+932	    "glass_of_milk": "🥛",
+933	    "glasses": "👓",
+934	    "globe_showing_americas": "🌎",
+935	    "globe_showing_asia-australia": "🌏",
+936	    "globe_showing_europe-africa": "🌍",
+937	    "globe_with_meridians": "🌐",
+938	    "gloves": "🧤",
+939	    "glowing_star": "🌟",
+940	    "goal_net": "🥅",
+941	    "goat": "🐐",
+942	    "goblin": "👺",
+943	    "goggles": "🥽",
+944	    "gorilla": "🦍",
+945	    "graduation_cap": "🎓",
+946	    "grapes": "🍇",
+947	    "green_apple": "🍏",
+948	    "green_book": "📗",
+949	    "green_circle": "🟢",
+950	    "green_heart": "💚",
+951	    "green_salad": "🥗",
+952	    "green_square": "🟩",
+953	    "grimacing_face": "😬",
+954	    "grinning_cat_face": "😺",
+955	    "grinning_cat_face_with_smiling_eyes": "😸",
+956	    "grinning_face": "😀",
+957	    "grinning_face_with_big_eyes": "😃",
+958	    "grinning_face_with_smiling_eyes": "😄",
+959	    "grinning_face_with_sweat": "😅",
+960	    "grinning_squinting_face": "😆",
+961	    "growing_heart": "💗",
+962	    "guard": "💂",
+963	    "guard_dark_skin_tone": "💂🏿",
+964	    "guard_light_skin_tone": "💂🏻",
+965	    "guard_medium-dark_skin_tone": "💂🏾",
+966	    "guard_medium-light_skin_tone": "💂🏼",
+967	    "guard_medium_skin_tone": "💂🏽",
+968	    "guide_dog": "🦮",
+969	    "guitar": "🎸",
+970	    "hamburger": "🍔",
+971	    "hammer": "🔨",
+972	    "hammer_and_pick": "⚒",
+973	    "hammer_and_wrench": "🛠",
+974	    "hamster_face": "🐹",
+975	    "hand_with_fingers_splayed": "🖐",
+976	    "hand_with_fingers_splayed_dark_skin_tone": "🖐🏿",
+977	    "hand_with_fingers_splayed_light_skin_tone": "🖐🏻",
+978	    "hand_with_fingers_splayed_medium-dark_skin_tone": "🖐🏾",
+979	    "hand_with_fingers_splayed_medium-light_skin_tone": "🖐🏼",
+980	    "hand_with_fingers_splayed_medium_skin_tone": "🖐🏽",
+981	    "handbag": "👜",
+982	    "handshake": "🤝",
+983	    "hatching_chick": "🐣",
+984	    "headphone": "🎧",
+985	    "hear-no-evil_monkey": "🙉",
+986	    "heart_decoration": "💟",
+987	    "heart_suit": "♥",
+988	    "heart_with_arrow": "💘",
+989	    "heart_with_ribbon": "💝",
+990	    "heavy_check_mark": "✔",
+991	    "heavy_division_sign": "➗",
+992	    "heavy_dollar_sign": "💲",
+993	    "heavy_heart_exclamation": "❣",
+994	    "heavy_large_circle": "⭕",
+995	    "heavy_minus_sign": "➖",
+996	    "heavy_multiplication_x": "✖",
+997	    "heavy_plus_sign": "➕",
+998	    "hedgehog": "🦔",
+999	    "helicopter": "🚁",
+1000	    "herb": "🌿",
+1001	    "hibiscus": "🌺",
+1002	    "high-heeled_shoe": "👠",
+1003	    "high-speed_train": "🚄",
+1004	    "high_voltage": "⚡",
+1005	    "hiking_boot": "🥾",
+1006	    "hindu_temple": "🛕",
+1007	    "hippopotamus": "🦛",
+1008	    "hole": "🕳",
+1009	    "honey_pot": "🍯",
+1010	    "honeybee": "🐝",
+1011	    "horizontal_traffic_light": "🚥",
+1012	    "horse": "🐴",
+1013	    "horse_face": "🐴",
+1014	    "horse_racing": "🏇",
+1015	    "horse_racing_dark_skin_tone": "🏇🏿",
+1016	    "horse_racing_light_skin_tone": "🏇🏻",
+1017	    "horse_racing_medium-dark_skin_tone": "🏇🏾",
+1018	    "horse_racing_medium-light_skin_tone": "🏇🏼",
+1019	    "horse_racing_medium_skin_tone": "🏇🏽",
+1020	    "hospital": "🏥",
+1021	    "hot_beverage": "☕",
+1022	    "hot_dog": "🌭",
+1023	    "hot_face": "🥵",
+1024	    "hot_pepper": "🌶",
+1025	    "hot_springs": "♨",
+1026	    "hotel": "🏨",
+1027	    "hourglass_done": "⌛",
+1028	    "hourglass_not_done": "⏳",
+1029	    "house": "🏠",
+1030	    "house_with_garden": "🏡",
+1031	    "houses": "🏘",
+1032	    "hugging_face": "🤗",
+1033	    "hundred_points": "💯",
+1034	    "hushed_face": "😯",
+1035	    "ice": "🧊",
+1036	    "ice_cream": "🍨",
+1037	    "ice_hockey": "🏒",
+1038	    "ice_skate": "⛸",
+1039	    "inbox_tray": "📥",
+1040	    "incoming_envelope": "📨",
+1041	    "index_pointing_up": "☝",
+1042	    "index_pointing_up_dark_skin_tone": "☝🏿",
+1043	    "index_pointing_up_light_skin_tone": "☝🏻",
+1044	    "index_pointing_up_medium-dark_skin_tone": "☝🏾",
+1045	    "index_pointing_up_medium-light_skin_tone": "☝🏼",
+1046	    "index_pointing_up_medium_skin_tone": "☝🏽",
+1047	    "infinity": "♾",
+1048	    "information": "ℹ",
+1049	    "input_latin_letters": "🔤",
+1050	    "input_latin_lowercase": "🔡",
+1051	    "input_latin_uppercase": "🔠",
+1052	    "input_numbers": "🔢",
+1053	    "input_symbols": "🔣",
+1054	    "jack-o-lantern": "🎃",
+1055	    "jeans": "👖",
+1056	    "jigsaw": "🧩",
+1057	    "joker": "🃏",
+1058	    "joystick": "🕹",
+1059	    "kaaba": "🕋",
+1060	    "kangaroo": "🦘",
+1061	    "key": "🔑",
+1062	    "keyboard": "⌨",
+1063	    "keycap_#": "#️⃣",
+1064	    "keycap_*": "*️⃣",
+1065	    "keycap_0": "0️⃣",
+1066	    "keycap_1": "1️⃣",
+1067	    "keycap_10": "🔟",
+1068	    "keycap_2": "2️⃣",
+1069	    "keycap_3": "3️⃣",
+1070	    "keycap_4": "4️⃣",
+1071	    "keycap_5": "5️⃣",
+1072	    "keycap_6": "6️⃣",
+1073	    "keycap_7": "7️⃣",
+1074	    "keycap_8": "8️⃣",
+1075	    "keycap_9": "9️⃣",
+1076	    "kick_scooter": "🛴",
+1077	    "kimono": "👘",
+1078	    "kiss": "💋",
+1079	    "kiss_man_man": "👨\u200d❤️\u200d💋\u200d👨",
+1080	    "kiss_mark": "💋",
+1081	    "kiss_woman_man": "👩\u200d❤️\u200d💋\u200d👨",
+1082	    "kiss_woman_woman": "👩\u200d❤️\u200d💋\u200d👩",
+1083	    "kissing_cat_face": "😽",
+1084	    "kissing_face": "😗",
+1085	    "kissing_face_with_closed_eyes": "😚",
+1086	    "kissing_face_with_smiling_eyes": "😙",
+1087	    "kitchen_knife": "🔪",
+1088	    "kite": "🪁",
+1089	    "kiwi_fruit": "🥝",
+1090	    "koala": "🐨",
+1091	    "lab_coat": "🥼",
+1092	    "label": "🏷",
+1093	    "lacrosse": "🥍",
+1094	    "lady_beetle": "🐞",
+1095	    "laptop_computer": "💻",
+1096	    "large_blue_diamond": "🔷",
+1097	    "large_orange_diamond": "🔶",
+1098	    "last_quarter_moon": "🌗",
+1099	    "last_quarter_moon_face": "🌜",
+1100	    "last_track_button": "⏮",
+1101	    "latin_cross": "✝",
+1102	    "leaf_fluttering_in_wind": "🍃",
+1103	    "leafy_green": "🥬",
+1104	    "ledger": "📒",
+1105	    "left-facing_fist": "🤛",
+1106	    "left-facing_fist_dark_skin_tone": "🤛🏿",
+1107	    "left-facing_fist_light_skin_tone": "🤛🏻",
+1108	    "left-facing_fist_medium-dark_skin_tone": "🤛🏾",
+1109	    "left-facing_fist_medium-light_skin_tone": "🤛🏼",
+1110	    "left-facing_fist_medium_skin_tone": "🤛🏽",
+1111	    "left-right_arrow": "↔",
+1112	    "left_arrow": "⬅",
+1113	    "left_arrow_curving_right": "↪",
+1114	    "left_luggage": "🛅",
+1115	    "left_speech_bubble": "🗨",
+1116	    "leg": "🦵",
+1117	    "lemon": "🍋",
+1118	    "leopard": "🐆",
+1119	    "level_slider": "🎚",
+1120	    "light_bulb": "💡",
+1121	    "light_rail": "🚈",
+1122	    "link": "🔗",
+1123	    "linked_paperclips": "🖇",
+1124	    "lion_face": "🦁",
+1125	    "lipstick": "💄",
+1126	    "litter_in_bin_sign": "🚮",
+1127	    "lizard": "🦎",
+1128	    "llama": "🦙",
+1129	    "lobster": "🦞",
+1130	    "locked": "🔒",
+1131	    "locked_with_key": "🔐",
+1132	    "locked_with_pen": "🔏",
+1133	    "locomotive": "🚂",
+1134	    "lollipop": "🍭",
+1135	    "lotion_bottle": "🧴",
+1136	    "loudly_crying_face": "😭",
+1137	    "loudspeaker": "📢",
+1138	    "love-you_gesture": "🤟",
+1139	    "love-you_gesture_dark_skin_tone": "🤟🏿",
+1140	    "love-you_gesture_light_skin_tone": "🤟🏻",
+1141	    "love-you_gesture_medium-dark_skin_tone": "🤟🏾",
+1142	    "love-you_gesture_medium-light_skin_tone": "🤟🏼",
+1143	    "love-you_gesture_medium_skin_tone": "🤟🏽",
+1144	    "love_hotel": "🏩",
+1145	    "love_letter": "💌",
+1146	    "luggage": "🧳",
+1147	    "lying_face": "🤥",
+1148	    "mage": "🧙",
+1149	    "mage_dark_skin_tone": "🧙🏿",
+1150	    "mage_light_skin_tone": "🧙🏻",
+1151	    "mage_medium-dark_skin_tone": "🧙🏾",
+1152	    "mage_medium-light_skin_tone": "🧙🏼",
+1153	    "mage_medium_skin_tone": "🧙🏽",
+1154	    "magnet": "🧲",
+1155	    "magnifying_glass_tilted_left": "🔍",
+1156	    "magnifying_glass_tilted_right": "🔎",
+1157	    "mahjong_red_dragon": "🀄",
+1158	    "male_sign": "♂",
+1159	    "man": "👨",
+1160	    "man_and_woman_holding_hands": "👫",
+1161	    "man_artist": "👨\u200d🎨",
+1162	    "man_artist_dark_skin_tone": "👨🏿\u200d🎨",
+1163	    "man_artist_light_skin_tone": "👨🏻\u200d🎨",
+1164	    "man_artist_medium-dark_skin_tone": "👨🏾\u200d🎨",
+1165	    "man_artist_medium-light_skin_tone": "👨🏼\u200d🎨",
+1166	    "man_artist_medium_skin_tone": "👨🏽\u200d🎨",
+1167	    "man_astronaut": "👨\u200d🚀",
+1168	    "man_astronaut_dark_skin_tone": "👨🏿\u200d🚀",
+1169	    "man_astronaut_light_skin_tone": "👨🏻\u200d🚀",
+1170	    "man_astronaut_medium-dark_skin_tone": "👨🏾\u200d🚀",
+1171	    "man_astronaut_medium-light_skin_tone": "👨🏼\u200d🚀",
+1172	    "man_astronaut_medium_skin_tone": "👨🏽\u200d🚀",
+1173	    "man_biking": "🚴\u200d♂️",
+1174	    "man_biking_dark_skin_tone": "🚴🏿\u200d♂️",
+1175	    "man_biking_light_skin_tone": "🚴🏻\u200d♂️",
+1176	    "man_biking_medium-dark_skin_tone": "🚴🏾\u200d♂️",
+1177	    "man_biking_medium-light_skin_tone": "🚴🏼\u200d♂️",
+1178	    "man_biking_medium_skin_tone": "🚴🏽\u200d♂️",
+1179	    "man_bouncing_ball": "⛹️\u200d♂️",
+1180	    "man_bouncing_ball_dark_skin_tone": "⛹🏿\u200d♂️",
+1181	    "man_bouncing_ball_light_skin_tone": "⛹🏻\u200d♂️",
+1182	    "man_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♂️",
+1183	    "man_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♂️",
+1184	    "man_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♂️",
+1185	    "man_bowing": "🙇\u200d♂️",
+1186	    "man_bowing_dark_skin_tone": "🙇🏿\u200d♂️",
+1187	    "man_bowing_light_skin_tone": "🙇🏻\u200d♂️",
+1188	    "man_bowing_medium-dark_skin_tone": "🙇🏾\u200d♂️",
+1189	    "man_bowing_medium-light_skin_tone": "🙇🏼\u200d♂️",
+1190	    "man_bowing_medium_skin_tone": "🙇🏽\u200d♂️",
+1191	    "man_cartwheeling": "🤸\u200d♂️",
+1192	    "man_cartwheeling_dark_skin_tone": "🤸🏿\u200d♂️",
+1193	    "man_cartwheeling_light_skin_tone": "🤸🏻\u200d♂️",
+1194	    "man_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♂️",
+1195	    "man_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♂️",
+1196	    "man_cartwheeling_medium_skin_tone": "🤸🏽\u200d♂️",
+1197	    "man_climbing": "🧗\u200d♂️",
+1198	    "man_climbing_dark_skin_tone": "🧗🏿\u200d♂️",
+1199	    "man_climbing_light_skin_tone": "🧗🏻\u200d♂️",
+1200	    "man_climbing_medium-dark_skin_tone": "🧗🏾\u200d♂️",
+1201	    "man_climbing_medium-light_skin_tone": "🧗🏼\u200d♂️",
+1202	    "man_climbing_medium_skin_tone": "🧗🏽\u200d♂️",
+1203	    "man_construction_worker": "👷\u200d♂️",
+1204	    "man_construction_worker_dark_skin_tone": "👷🏿\u200d♂️",
+1205	    "man_construction_worker_light_skin_tone": "👷🏻\u200d♂️",
+1206	    "man_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♂️",
+1207	    "man_construction_worker_medium-light_skin_tone": "👷🏼\u200d♂️",
+1208	    "man_construction_worker_medium_skin_tone": "👷🏽\u200d♂️",
+1209	    "man_cook": "👨\u200d🍳",
+1210	    "man_cook_dark_skin_tone": "👨🏿\u200d🍳",
+1211	    "man_cook_light_skin_tone": "👨🏻\u200d🍳",
+1212	    "man_cook_medium-dark_skin_tone": "👨🏾\u200d🍳",
+1213	    "man_cook_medium-light_skin_tone": "👨🏼\u200d🍳",
+1214	    "man_cook_medium_skin_tone": "👨🏽\u200d🍳",
+1215	    "man_dancing": "🕺",
+1216	    "man_dancing_dark_skin_tone": "🕺🏿",
+1217	    "man_dancing_light_skin_tone": "🕺🏻",
+1218	    "man_dancing_medium-dark_skin_tone": "🕺🏾",
+1219	    "man_dancing_medium-light_skin_tone": "🕺🏼",
+1220	    "man_dancing_medium_skin_tone": "🕺🏽",
+1221	    "man_dark_skin_tone": "👨🏿",
+1222	    "man_detective": "🕵️\u200d♂️",
+1223	    "man_detective_dark_skin_tone": "🕵🏿\u200d♂️",
+1224	    "man_detective_light_skin_tone": "🕵🏻\u200d♂️",
+1225	    "man_detective_medium-dark_skin_tone": "🕵🏾\u200d♂️",
+1226	    "man_detective_medium-light_skin_tone": "🕵🏼\u200d♂️",
+1227	    "man_detective_medium_skin_tone": "🕵🏽\u200d♂️",
+1228	    "man_elf": "🧝\u200d♂️",
+1229	    "man_elf_dark_skin_tone": "🧝🏿\u200d♂️",
+1230	    "man_elf_light_skin_tone": "🧝🏻\u200d♂️",
+1231	    "man_elf_medium-dark_skin_tone": "🧝🏾\u200d♂️",
+1232	    "man_elf_medium-light_skin_tone": "🧝🏼\u200d♂️",
+1233	    "man_elf_medium_skin_tone": "🧝🏽\u200d♂️",
+1234	    "man_facepalming": "🤦\u200d♂️",
+1235	    "man_facepalming_dark_skin_tone": "🤦🏿\u200d♂️",
+1236	    "man_facepalming_light_skin_tone": "🤦🏻\u200d♂️",
+1237	    "man_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♂️",
+1238	    "man_facepalming_medium-light_skin_tone": "🤦🏼\u200d♂️",
+1239	    "man_facepalming_medium_skin_tone": "🤦🏽\u200d♂️",
+1240	    "man_factory_worker": "👨\u200d🏭",
+1241	    "man_factory_worker_dark_skin_tone": "👨🏿\u200d🏭",
+1242	    "man_factory_worker_light_skin_tone": "👨🏻\u200d🏭",
+1243	    "man_factory_worker_medium-dark_skin_tone": "👨🏾\u200d🏭",
+1244	    "man_factory_worker_medium-light_skin_tone": "👨🏼\u200d🏭",
+1245	    "man_factory_worker_medium_skin_tone": "👨🏽\u200d🏭",
+1246	    "man_fairy": "🧚\u200d♂️",
+1247	    "man_fairy_dark_skin_tone": "🧚🏿\u200d♂️",
+1248	    "man_fairy_light_skin_tone": "🧚🏻\u200d♂️",
+1249	    "man_fairy_medium-dark_skin_tone": "🧚🏾\u200d♂️",
+1250	    "man_fairy_medium-light_skin_tone": "🧚🏼\u200d♂️",
+1251	    "man_fairy_medium_skin_tone": "🧚🏽\u200d♂️",
+1252	    "man_farmer": "👨\u200d🌾",
+1253	    "man_farmer_dark_skin_tone": "👨🏿\u200d🌾",
+1254	    "man_farmer_light_skin_tone": "👨🏻\u200d🌾",
+1255	    "man_farmer_medium-dark_skin_tone": "👨🏾\u200d🌾",
+1256	    "man_farmer_medium-light_skin_tone": "👨🏼\u200d🌾",
+1257	    "man_farmer_medium_skin_tone": "👨🏽\u200d🌾",
+1258	    "man_firefighter": "👨\u200d🚒",
+1259	    "man_firefighter_dark_skin_tone": "👨🏿\u200d🚒",
+1260	    "man_firefighter_light_skin_tone": "👨🏻\u200d🚒",
+1261	    "man_firefighter_medium-dark_skin_tone": "👨🏾\u200d🚒",
+1262	    "man_firefighter_medium-light_skin_tone": "👨🏼\u200d🚒",
+1263	    "man_firefighter_medium_skin_tone": "👨🏽\u200d🚒",
+1264	    "man_frowning": "🙍\u200d♂️",
+1265	    "man_frowning_dark_skin_tone": "🙍🏿\u200d♂️",
+1266	    "man_frowning_light_skin_tone": "🙍🏻\u200d♂️",
+1267	    "man_frowning_medium-dark_skin_tone": "🙍🏾\u200d♂️",
+1268	    "man_frowning_medium-light_skin_tone": "🙍🏼\u200d♂️",
+1269	    "man_frowning_medium_skin_tone": "🙍🏽\u200d♂️",
+1270	    "man_genie": "🧞\u200d♂️",
+1271	    "man_gesturing_no": "🙅\u200d♂️",
+1272	    "man_gesturing_no_dark_skin_tone": "🙅🏿\u200d♂️",
+1273	    "man_gesturing_no_light_skin_tone": "🙅🏻\u200d♂️",
+1274	    "man_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♂️",
+1275	    "man_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♂️",
+1276	    "man_gesturing_no_medium_skin_tone": "🙅🏽\u200d♂️",
+1277	    "man_gesturing_ok": "🙆\u200d♂️",
+1278	    "man_gesturing_ok_dark_skin_tone": "🙆🏿\u200d♂️",
+1279	    "man_gesturing_ok_light_skin_tone": "🙆🏻\u200d♂️",
+1280	    "man_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♂️",
+1281	    "man_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♂️",
+1282	    "man_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♂️",
+1283	    "man_getting_haircut": "💇\u200d♂️",
+1284	    "man_getting_haircut_dark_skin_tone": "💇🏿\u200d♂️",
+1285	    "man_getting_haircut_light_skin_tone": "💇🏻\u200d♂️",
+1286	    "man_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♂️",
+1287	    "man_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♂️",
+1288	    "man_getting_haircut_medium_skin_tone": "💇🏽\u200d♂️",
+1289	    "man_getting_massage": "💆\u200d♂️",
+1290	    "man_getting_massage_dark_skin_tone": "💆🏿\u200d♂️",
+1291	    "man_getting_massage_light_skin_tone": "💆🏻\u200d♂️",
+1292	    "man_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♂️",
+1293	    "man_getting_massage_medium-light_skin_tone": "💆🏼\u200d♂️",
+1294	    "man_getting_massage_medium_skin_tone": "💆🏽\u200d♂️",
+1295	    "man_golfing": "🏌️\u200d♂️",
+1296	    "man_golfing_dark_skin_tone": "🏌🏿\u200d♂️",
+1297	    "man_golfing_light_skin_tone": "🏌🏻\u200d♂️",
+1298	    "man_golfing_medium-dark_skin_tone": "🏌🏾\u200d♂️",
+1299	    "man_golfing_medium-light_skin_tone": "🏌🏼\u200d♂️",
+1300	    "man_golfing_medium_skin_tone": "🏌🏽\u200d♂️",
+1301	    "man_guard": "💂\u200d♂️",
+1302	    "man_guard_dark_skin_tone": "💂🏿\u200d♂️",
+1303	    "man_guard_light_skin_tone": "💂🏻\u200d♂️",
+1304	    "man_guard_medium-dark_skin_tone": "💂🏾\u200d♂️",
+1305	    "man_guard_medium-light_skin_tone": "💂🏼\u200d♂️",
+1306	    "man_guard_medium_skin_tone": "💂🏽\u200d♂️",
+1307	    "man_health_worker": "👨\u200d⚕️",
+1308	    "man_health_worker_dark_skin_tone": "👨🏿\u200d⚕️",
+1309	    "man_health_worker_light_skin_tone": "👨🏻\u200d⚕️",
+1310	    "man_health_worker_medium-dark_skin_tone": "👨🏾\u200d⚕️",
+1311	    "man_health_worker_medium-light_skin_tone": "👨🏼\u200d⚕️",
+1312	    "man_health_worker_medium_skin_tone": "👨🏽\u200d⚕️",
+1313	    "man_in_lotus_position": "🧘\u200d♂️",
+1314	    "man_in_lotus_position_dark_skin_tone": "🧘🏿\u200d♂️",
+1315	    "man_in_lotus_position_light_skin_tone": "🧘🏻\u200d♂️",
+1316	    "man_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♂️",
+1317	    "man_in_lotus_position_medium-light_skin_tone": "🧘🏼\u200d♂️",
+1318	    "man_in_lotus_position_medium_skin_tone": "🧘🏽\u200d♂️",
+1319	    "man_in_manual_wheelchair": "👨\u200d🦽",
+1320	    "man_in_motorized_wheelchair": "👨\u200d🦼",
+1321	    "man_in_steamy_room": "🧖\u200d♂️",
+1322	    "man_in_steamy_room_dark_skin_tone": "🧖🏿\u200d♂️",
+1323	    "man_in_steamy_room_light_skin_tone": "🧖🏻\u200d♂️",
+1324	    "man_in_steamy_room_medium-dark_skin_tone": "🧖🏾\u200d♂️",
+1325	    "man_in_steamy_room_medium-light_skin_tone": "🧖🏼\u200d♂️",
+1326	    "man_in_steamy_room_medium_skin_tone": "🧖🏽\u200d♂️",
+1327	    "man_in_suit_levitating": "🕴",
+1328	    "man_in_suit_levitating_dark_skin_tone": "🕴🏿",
+1329	    "man_in_suit_levitating_light_skin_tone": "🕴🏻",
+1330	    "man_in_suit_levitating_medium-dark_skin_tone": "🕴🏾",
+1331	    "man_in_suit_levitating_medium-light_skin_tone": "🕴🏼",
+1332	    "man_in_suit_levitating_medium_skin_tone": "🕴🏽",
+1333	    "man_in_tuxedo": "🤵",
+1334	    "man_in_tuxedo_dark_skin_tone": "🤵🏿",
+1335	    "man_in_tuxedo_light_skin_tone": "🤵🏻",
+1336	    "man_in_tuxedo_medium-dark_skin_tone": "🤵🏾",
+1337	    "man_in_tuxedo_medium-light_skin_tone": "🤵🏼",
+1338	    "man_in_tuxedo_medium_skin_tone": "🤵🏽",
+1339	    "man_judge": "👨\u200d⚖️",
+1340	    "man_judge_dark_skin_tone": "👨🏿\u200d⚖️",
+1341	    "man_judge_light_skin_tone": "👨🏻\u200d⚖️",
+1342	    "man_judge_medium-dark_skin_tone": "👨🏾\u200d⚖️",
+1343	    "man_judge_medium-light_skin_tone": "👨🏼\u200d⚖️",
+1344	    "man_judge_medium_skin_tone": "👨🏽\u200d⚖️",
+1345	    "man_juggling": "🤹\u200d♂️",
+1346	    "man_juggling_dark_skin_tone": "🤹🏿\u200d♂️",
+1347	    "man_juggling_light_skin_tone": "🤹🏻\u200d♂️",
+1348	    "man_juggling_medium-dark_skin_tone": "🤹🏾\u200d♂️",
+1349	    "man_juggling_medium-light_skin_tone": "🤹🏼\u200d♂️",
+1350	    "man_juggling_medium_skin_tone": "🤹🏽\u200d♂️",
+1351	    "man_lifting_weights": "🏋️\u200d♂️",
+1352	    "man_lifting_weights_dark_skin_tone": "🏋🏿\u200d♂️",
+1353	    "man_lifting_weights_light_skin_tone": "🏋🏻\u200d♂️",
+1354	    "man_lifting_weights_medium-dark_skin_tone": "🏋🏾\u200d♂️",
+1355	    "man_lifting_weights_medium-light_skin_tone": "🏋🏼\u200d♂️",
+1356	    "man_lifting_weights_medium_skin_tone": "🏋🏽\u200d♂️",
+1357	    "man_light_skin_tone": "👨🏻",
+1358	    "man_mage": "🧙\u200d♂️",
+1359	    "man_mage_dark_skin_tone": "🧙🏿\u200d♂️",
+1360	    "man_mage_light_skin_tone": "🧙🏻\u200d♂️",
+1361	    "man_mage_medium-dark_skin_tone": "🧙🏾\u200d♂️",
+1362	    "man_mage_medium-light_skin_tone": "🧙🏼\u200d♂️",
+1363	    "man_mage_medium_skin_tone": "🧙🏽\u200d♂️",
+1364	    "man_mechanic": "👨\u200d🔧",
+1365	    "man_mechanic_dark_skin_tone": "👨🏿\u200d🔧",
+1366	    "man_mechanic_light_skin_tone": "👨🏻\u200d🔧",
+1367	    "man_mechanic_medium-dark_skin_tone": "👨🏾\u200d🔧",
+1368	    "man_mechanic_medium-light_skin_tone": "👨🏼\u200d🔧",
+1369	    "man_mechanic_medium_skin_tone": "👨🏽\u200d🔧",
+1370	    "man_medium-dark_skin_tone": "👨🏾",
+1371	    "man_medium-light_skin_tone": "👨🏼",
+1372	    "man_medium_skin_tone": "👨🏽",
+1373	    "man_mountain_biking": "🚵\u200d♂️",
+1374	    "man_mountain_biking_dark_skin_tone": "🚵🏿\u200d♂️",
+1375	    "man_mountain_biking_light_skin_tone": "🚵🏻\u200d♂️",
+1376	    "man_mountain_biking_medium-dark_skin_tone": "🚵🏾\u200d♂️",
+1377	    "man_mountain_biking_medium-light_skin_tone": "🚵🏼\u200d♂️",
+1378	    "man_mountain_biking_medium_skin_tone": "🚵🏽\u200d♂️",
+1379	    "man_office_worker": "👨\u200d💼",
+1380	    "man_office_worker_dark_skin_tone": "👨🏿\u200d💼",
+1381	    "man_office_worker_light_skin_tone": "👨🏻\u200d💼",
+1382	    "man_office_worker_medium-dark_skin_tone": "👨🏾\u200d💼",
+1383	    "man_office_worker_medium-light_skin_tone": "👨🏼\u200d💼",
+1384	    "man_office_worker_medium_skin_tone": "👨🏽\u200d💼",
+1385	    "man_pilot": "👨\u200d✈️",
+1386	    "man_pilot_dark_skin_tone": "👨🏿\u200d✈️",
+1387	    "man_pilot_light_skin_tone": "👨🏻\u200d✈️",
+1388	    "man_pilot_medium-dark_skin_tone": "👨🏾\u200d✈️",
+1389	    "man_pilot_medium-light_skin_tone": "👨🏼\u200d✈️",
+1390	    "man_pilot_medium_skin_tone": "👨🏽\u200d✈️",
+1391	    "man_playing_handball": "🤾\u200d♂️",
+1392	    "man_playing_handball_dark_skin_tone": "🤾🏿\u200d♂️",
+1393	    "man_playing_handball_light_skin_tone": "🤾🏻\u200d♂️",
+1394	    "man_playing_handball_medium-dark_skin_tone": "🤾🏾\u200d♂️",
+1395	    "man_playing_handball_medium-light_skin_tone": "🤾🏼\u200d♂️",
+1396	    "man_playing_handball_medium_skin_tone": "🤾🏽\u200d♂️",
+1397	    "man_playing_water_polo": "🤽\u200d♂️",
+1398	    "man_playing_water_polo_dark_skin_tone": "🤽🏿\u200d♂️",
+1399	    "man_playing_water_polo_light_skin_tone": "🤽🏻\u200d♂️",
+1400	    "man_playing_water_polo_medium-dark_skin_tone": "🤽🏾\u200d♂️",
+1401	    "man_playing_water_polo_medium-light_skin_tone": "🤽🏼\u200d♂️",
+1402	    "man_playing_water_polo_medium_skin_tone": "🤽🏽\u200d♂️",
+1403	    "man_police_officer": "👮\u200d♂️",
+1404	    "man_police_officer_dark_skin_tone": "👮🏿\u200d♂️",
+1405	    "man_police_officer_light_skin_tone": "👮🏻\u200d♂️",
+1406	    "man_police_officer_medium-dark_skin_tone": "👮🏾\u200d♂️",
+1407	    "man_police_officer_medium-light_skin_tone": "👮🏼\u200d♂️",
+1408	    "man_police_officer_medium_skin_tone": "👮🏽\u200d♂️",
+1409	    "man_pouting": "🙎\u200d♂️",
+1410	    "man_pouting_dark_skin_tone": "🙎🏿\u200d♂️",
+1411	    "man_pouting_light_skin_tone": "🙎🏻\u200d♂️",
+1412	    "man_pouting_medium-dark_skin_tone": "🙎🏾\u200d♂️",
+1413	    "man_pouting_medium-light_skin_tone": "🙎🏼\u200d♂️",
+1414	    "man_pouting_medium_skin_tone": "🙎🏽\u200d♂️",
+1415	    "man_raising_hand": "🙋\u200d♂️",
+1416	    "man_raising_hand_dark_skin_tone": "🙋🏿\u200d♂️",
+1417	    "man_raising_hand_light_skin_tone": "🙋🏻\u200d♂️",
+1418	    "man_raising_hand_medium-dark_skin_tone": "🙋🏾\u200d♂️",
+1419	    "man_raising_hand_medium-light_skin_tone": "🙋🏼\u200d♂️",
+1420	    "man_raising_hand_medium_skin_tone": "🙋🏽\u200d♂️",
+1421	    "man_rowing_boat": "🚣\u200d♂️",
+1422	    "man_rowing_boat_dark_skin_tone": "🚣🏿\u200d♂️",
+1423	    "man_rowing_boat_light_skin_tone": "🚣🏻\u200d♂️",
+1424	    "man_rowing_boat_medium-dark_skin_tone": "🚣🏾\u200d♂️",
+1425	    "man_rowing_boat_medium-light_skin_tone": "🚣🏼\u200d♂️",
+1426	    "man_rowing_boat_medium_skin_tone": "🚣🏽\u200d♂️",
+1427	    "man_running": "🏃\u200d♂️",
+1428	    "man_running_dark_skin_tone": "🏃🏿\u200d♂️",
+1429	    "man_running_light_skin_tone": "🏃🏻\u200d♂️",
+1430	    "man_running_medium-dark_skin_tone": "🏃🏾\u200d♂️",
+1431	    "man_running_medium-light_skin_tone": "🏃🏼\u200d♂️",
+1432	    "man_running_medium_skin_tone": "🏃🏽\u200d♂️",
+1433	    "man_scientist": "👨\u200d🔬",
+1434	    "man_scientist_dark_skin_tone": "👨🏿\u200d🔬",
+1435	    "man_scientist_light_skin_tone": "👨🏻\u200d🔬",
+1436	    "man_scientist_medium-dark_skin_tone": "👨🏾\u200d🔬",
+1437	    "man_scientist_medium-light_skin_tone": "👨🏼\u200d🔬",
+1438	    "man_scientist_medium_skin_tone": "👨🏽\u200d🔬",
+1439	    "man_shrugging": "🤷\u200d♂️",
+1440	    "man_shrugging_dark_skin_tone": "🤷🏿\u200d♂️",
+1441	    "man_shrugging_light_skin_tone": "🤷🏻\u200d♂️",
+1442	    "man_shrugging_medium-dark_skin_tone": "🤷🏾\u200d♂️",
+1443	    "man_shrugging_medium-light_skin_tone": "🤷🏼\u200d♂️",
+1444	    "man_shrugging_medium_skin_tone": "🤷🏽\u200d♂️",
+1445	    "man_singer": "👨\u200d🎤",
+1446	    "man_singer_dark_skin_tone": "👨🏿\u200d🎤",
+1447	    "man_singer_light_skin_tone": "👨🏻\u200d🎤",
+1448	    "man_singer_medium-dark_skin_tone": "👨🏾\u200d🎤",
+1449	    "man_singer_medium-light_skin_tone": "👨🏼\u200d🎤",
+1450	    "man_singer_medium_skin_tone": "👨🏽\u200d🎤",
+1451	    "man_student": "👨\u200d🎓",
+1452	    "man_student_dark_skin_tone": "👨🏿\u200d🎓",
+1453	    "man_student_light_skin_tone": "👨🏻\u200d🎓",
+1454	    "man_student_medium-dark_skin_tone": "👨🏾\u200d🎓",
+1455	    "man_student_medium-light_skin_tone": "👨🏼\u200d🎓",
+1456	    "man_student_medium_skin_tone": "👨🏽\u200d🎓",
+1457	    "man_surfing": "🏄\u200d♂️",
+1458	    "man_surfing_dark_skin_tone": "🏄🏿\u200d♂️",
+1459	    "man_surfing_light_skin_tone": "🏄🏻\u200d♂️",
+1460	    "man_surfing_medium-dark_skin_tone": "🏄🏾\u200d♂️",
+1461	    "man_surfing_medium-light_skin_tone": "🏄🏼\u200d♂️",
+1462	    "man_surfing_medium_skin_tone": "🏄🏽\u200d♂️",
+1463	    "man_swimming": "🏊\u200d♂️",
+1464	    "man_swimming_dark_skin_tone": "🏊🏿\u200d♂️",
+1465	    "man_swimming_light_skin_tone": "🏊🏻\u200d♂️",
+1466	    "man_swimming_medium-dark_skin_tone": "🏊🏾\u200d♂️",
+1467	    "man_swimming_medium-light_skin_tone": "🏊🏼\u200d♂️",
+1468	    "man_swimming_medium_skin_tone": "🏊🏽\u200d♂️",
+1469	    "man_teacher": "👨\u200d🏫",
+1470	    "man_teacher_dark_skin_tone": "👨🏿\u200d🏫",
+1471	    "man_teacher_light_skin_tone": "👨🏻\u200d🏫",
+1472	    "man_teacher_medium-dark_skin_tone": "👨🏾\u200d🏫",
+1473	    "man_teacher_medium-light_skin_tone": "👨🏼\u200d🏫",
+1474	    "man_teacher_medium_skin_tone": "👨🏽\u200d🏫",
+1475	    "man_technologist": "👨\u200d💻",
+1476	    "man_technologist_dark_skin_tone": "👨🏿\u200d💻",
+1477	    "man_technologist_light_skin_tone": "👨🏻\u200d💻",
+1478	    "man_technologist_medium-dark_skin_tone": "👨🏾\u200d💻",
+1479	    "man_technologist_medium-light_skin_tone": "👨🏼\u200d💻",
+1480	    "man_technologist_medium_skin_tone": "👨🏽\u200d💻",
+1481	    "man_tipping_hand": "💁\u200d♂️",
+1482	    "man_tipping_hand_dark_skin_tone": "💁🏿\u200d♂️",
+1483	    "man_tipping_hand_light_skin_tone": "💁🏻\u200d♂️",
+1484	    "man_tipping_hand_medium-dark_skin_tone": "💁🏾\u200d♂️",
+1485	    "man_tipping_hand_medium-light_skin_tone": "💁🏼\u200d♂️",
+1486	    "man_tipping_hand_medium_skin_tone": "💁🏽\u200d♂️",
+1487	    "man_vampire": "🧛\u200d♂️",
+1488	    "man_vampire_dark_skin_tone": "🧛🏿\u200d♂️",
+1489	    "man_vampire_light_skin_tone": "🧛🏻\u200d♂️",
+1490	    "man_vampire_medium-dark_skin_tone": "🧛🏾\u200d♂️",
+1491	    "man_vampire_medium-light_skin_tone": "🧛🏼\u200d♂️",
+1492	    "man_vampire_medium_skin_tone": "🧛🏽\u200d♂️",
+1493	    "man_walking": "🚶\u200d♂️",
+1494	    "man_walking_dark_skin_tone": "🚶🏿\u200d♂️",
+1495	    "man_walking_light_skin_tone": "🚶🏻\u200d♂️",
+1496	    "man_walking_medium-dark_skin_tone": "🚶🏾\u200d♂️",
+1497	    "man_walking_medium-light_skin_tone": "🚶🏼\u200d♂️",
+1498	    "man_walking_medium_skin_tone": "🚶🏽\u200d♂️",
+1499	    "man_wearing_turban": "👳\u200d♂️",
+1500	    "man_wearing_turban_dark_skin_tone": "👳🏿\u200d♂️",
+1501	    "man_wearing_turban_light_skin_tone": "👳🏻\u200d♂️",
+1502	    "man_wearing_turban_medium-dark_skin_tone": "👳🏾\u200d♂️",
+1503	    "man_wearing_turban_medium-light_skin_tone": "👳🏼\u200d♂️",
+1504	    "man_wearing_turban_medium_skin_tone": "👳🏽\u200d♂️",
+1505	    "man_with_probing_cane": "👨\u200d🦯",
+1506	    "man_with_chinese_cap": "👲",
+1507	    "man_with_chinese_cap_dark_skin_tone": "👲🏿",
+1508	    "man_with_chinese_cap_light_skin_tone": "👲🏻",
+1509	    "man_with_chinese_cap_medium-dark_skin_tone": "👲🏾",
+1510	    "man_with_chinese_cap_medium-light_skin_tone": "👲🏼",
+1511	    "man_with_chinese_cap_medium_skin_tone": "👲🏽",
+1512	    "man_zombie": "🧟\u200d♂️",
+1513	    "mango": "🥭",
+1514	    "mantelpiece_clock": "🕰",
+1515	    "manual_wheelchair": "🦽",
+1516	    "man’s_shoe": "👞",
+1517	    "map_of_japan": "🗾",
+1518	    "maple_leaf": "🍁",
+1519	    "martial_arts_uniform": "🥋",
+1520	    "mate": "🧉",
+1521	    "meat_on_bone": "🍖",
+1522	    "mechanical_arm": "🦾",
+1523	    "mechanical_leg": "🦿",
+1524	    "medical_symbol": "⚕",
+1525	    "megaphone": "📣",
+1526	    "melon": "🍈",
+1527	    "memo": "📝",
+1528	    "men_with_bunny_ears": "👯\u200d♂️",
+1529	    "men_wrestling": "🤼\u200d♂️",
+1530	    "menorah": "🕎",
+1531	    "men’s_room": "🚹",
+1532	    "mermaid": "🧜\u200d♀️",
+1533	    "mermaid_dark_skin_tone": "🧜🏿\u200d♀️",
+1534	    "mermaid_light_skin_tone": "🧜🏻\u200d♀️",
+1535	    "mermaid_medium-dark_skin_tone": "🧜🏾\u200d♀️",
+1536	    "mermaid_medium-light_skin_tone": "🧜🏼\u200d♀️",
+1537	    "mermaid_medium_skin_tone": "🧜🏽\u200d♀️",
+1538	    "merman": "🧜\u200d♂️",
+1539	    "merman_dark_skin_tone": "🧜🏿\u200d♂️",
+1540	    "merman_light_skin_tone": "🧜🏻\u200d♂️",
+1541	    "merman_medium-dark_skin_tone": "🧜🏾\u200d♂️",
+1542	    "merman_medium-light_skin_tone": "🧜🏼\u200d♂️",
+1543	    "merman_medium_skin_tone": "🧜🏽\u200d♂️",
+1544	    "merperson": "🧜",
+1545	    "merperson_dark_skin_tone": "🧜🏿",
+1546	    "merperson_light_skin_tone": "🧜🏻",
+1547	    "merperson_medium-dark_skin_tone": "🧜🏾",
+1548	    "merperson_medium-light_skin_tone": "🧜🏼",
+1549	    "merperson_medium_skin_tone": "🧜🏽",
+1550	    "metro": "🚇",
+1551	    "microbe": "🦠",
+1552	    "microphone": "🎤",
+1553	    "microscope": "🔬",
+1554	    "middle_finger": "🖕",
+1555	    "middle_finger_dark_skin_tone": "🖕🏿",
+1556	    "middle_finger_light_skin_tone": "🖕🏻",
+1557	    "middle_finger_medium-dark_skin_tone": "🖕🏾",
+1558	    "middle_finger_medium-light_skin_tone": "🖕🏼",
+1559	    "middle_finger_medium_skin_tone": "🖕🏽",
+1560	    "military_medal": "🎖",
+1561	    "milky_way": "🌌",
+1562	    "minibus": "🚐",
+1563	    "moai": "🗿",
+1564	    "mobile_phone": "📱",
+1565	    "mobile_phone_off": "📴",
+1566	    "mobile_phone_with_arrow": "📲",
+1567	    "money-mouth_face": "🤑",
+1568	    "money_bag": "💰",
+1569	    "money_with_wings": "💸",
+1570	    "monkey": "🐒",
+1571	    "monkey_face": "🐵",
+1572	    "monorail": "🚝",
+1573	    "moon_cake": "🥮",
+1574	    "moon_viewing_ceremony": "🎑",
+1575	    "mosque": "🕌",
+1576	    "mosquito": "🦟",
+1577	    "motor_boat": "🛥",
+1578	    "motor_scooter": "🛵",
+1579	    "motorcycle": "🏍",
+1580	    "motorized_wheelchair": "🦼",
+1581	    "motorway": "🛣",
+1582	    "mount_fuji": "🗻",
+1583	    "mountain": "⛰",
+1584	    "mountain_cableway": "🚠",
+1585	    "mountain_railway": "🚞",
+1586	    "mouse": "🐭",
+1587	    "mouse_face": "🐭",
+1588	    "mouth": "👄",
+1589	    "movie_camera": "🎥",
+1590	    "mushroom": "🍄",
+1591	    "musical_keyboard": "🎹",
+1592	    "musical_note": "🎵",
+1593	    "musical_notes": "🎶",
+1594	    "musical_score": "🎼",
+1595	    "muted_speaker": "🔇",
+1596	    "nail_polish": "💅",
+1597	    "nail_polish_dark_skin_tone": "💅🏿",
+1598	    "nail_polish_light_skin_tone": "💅🏻",
+1599	    "nail_polish_medium-dark_skin_tone": "💅🏾",
+1600	    "nail_polish_medium-light_skin_tone": "💅🏼",
+1601	    "nail_polish_medium_skin_tone": "💅🏽",
+1602	    "name_badge": "📛",
+1603	    "national_park": "🏞",
+1604	    "nauseated_face": "🤢",
+1605	    "nazar_amulet": "🧿",
+1606	    "necktie": "👔",
+1607	    "nerd_face": "🤓",
+1608	    "neutral_face": "😐",
+1609	    "new_moon": "🌑",
+1610	    "new_moon_face": "🌚",
+1611	    "newspaper": "📰",
+1612	    "next_track_button": "⏭",
+1613	    "night_with_stars": "🌃",
+1614	    "nine-thirty": "🕤",
+1615	    "nine_o’clock": "🕘",
+1616	    "no_bicycles": "🚳",
+1617	    "no_entry": "⛔",
+1618	    "no_littering": "🚯",
+1619	    "no_mobile_phones": "📵",
+1620	    "no_one_under_eighteen": "🔞",
+1621	    "no_pedestrians": "🚷",
+1622	    "no_smoking": "🚭",
+1623	    "non-potable_water": "🚱",
+1624	    "nose": "👃",
+1625	    "nose_dark_skin_tone": "👃🏿",
+1626	    "nose_light_skin_tone": "👃🏻",
+1627	    "nose_medium-dark_skin_tone": "👃🏾",
+1628	    "nose_medium-light_skin_tone": "👃🏼",
+1629	    "nose_medium_skin_tone": "👃🏽",
+1630	    "notebook": "📓",
+1631	    "notebook_with_decorative_cover": "📔",
+1632	    "nut_and_bolt": "🔩",
+1633	    "octopus": "🐙",
+1634	    "oden": "🍢",
+1635	    "office_building": "🏢",
+1636	    "ogre": "👹",
+1637	    "oil_drum": "🛢",
+1638	    "old_key": "🗝",
+1639	    "old_man": "👴",
+1640	    "old_man_dark_skin_tone": "👴🏿",
+1641	    "old_man_light_skin_tone": "👴🏻",
+1642	    "old_man_medium-dark_skin_tone": "👴🏾",
+1643	    "old_man_medium-light_skin_tone": "👴🏼",
+1644	    "old_man_medium_skin_tone": "👴🏽",
+1645	    "old_woman": "👵",
+1646	    "old_woman_dark_skin_tone": "👵🏿",
+1647	    "old_woman_light_skin_tone": "👵🏻",
+1648	    "old_woman_medium-dark_skin_tone": "👵🏾",
+1649	    "old_woman_medium-light_skin_tone": "👵🏼",
+1650	    "old_woman_medium_skin_tone": "👵🏽",
+1651	    "older_adult": "🧓",
+1652	    "older_adult_dark_skin_tone": "🧓🏿",
+1653	    "older_adult_light_skin_tone": "🧓🏻",
+1654	    "older_adult_medium-dark_skin_tone": "🧓🏾",
+1655	    "older_adult_medium-light_skin_tone": "🧓🏼",
+1656	    "older_adult_medium_skin_tone": "🧓🏽",
+1657	    "om": "🕉",
+1658	    "oncoming_automobile": "🚘",
+1659	    "oncoming_bus": "🚍",
+1660	    "oncoming_fist": "👊",
+1661	    "oncoming_fist_dark_skin_tone": "👊🏿",
+1662	    "oncoming_fist_light_skin_tone": "👊🏻",
+1663	    "oncoming_fist_medium-dark_skin_tone": "👊🏾",
+1664	    "oncoming_fist_medium-light_skin_tone": "👊🏼",
+1665	    "oncoming_fist_medium_skin_tone": "👊🏽",
+1666	    "oncoming_police_car": "🚔",
+1667	    "oncoming_taxi": "🚖",
+1668	    "one-piece_swimsuit": "🩱",
+1669	    "one-thirty": "🕜",
+1670	    "one_o’clock": "🕐",
+1671	    "onion": "🧅",
+1672	    "open_book": "📖",
+1673	    "open_file_folder": "📂",
+1674	    "open_hands": "👐",
+1675	    "open_hands_dark_skin_tone": "👐🏿",
+1676	    "open_hands_light_skin_tone": "👐🏻",
+1677	    "open_hands_medium-dark_skin_tone": "👐🏾",
+1678	    "open_hands_medium-light_skin_tone": "👐🏼",
+1679	    "open_hands_medium_skin_tone": "👐🏽",
+1680	    "open_mailbox_with_lowered_flag": "📭",
+1681	    "open_mailbox_with_raised_flag": "📬",
+1682	    "optical_disk": "💿",
+1683	    "orange_book": "📙",
+1684	    "orange_circle": "🟠",
+1685	    "orange_heart": "🧡",
+1686	    "orange_square": "🟧",
+1687	    "orangutan": "🦧",
+1688	    "orthodox_cross": "☦",
+1689	    "otter": "🦦",
+1690	    "outbox_tray": "📤",
+1691	    "owl": "🦉",
+1692	    "ox": "🐂",
+1693	    "oyster": "🦪",
+1694	    "package": "📦",
+1695	    "page_facing_up": "📄",
+1696	    "page_with_curl": "📃",
+1697	    "pager": "📟",
+1698	    "paintbrush": "🖌",
+1699	    "palm_tree": "🌴",
+1700	    "palms_up_together": "🤲",
+1701	    "palms_up_together_dark_skin_tone": "🤲🏿",
+1702	    "palms_up_together_light_skin_tone": "🤲🏻",
+1703	    "palms_up_together_medium-dark_skin_tone": "🤲🏾",
+1704	    "palms_up_together_medium-light_skin_tone": "🤲🏼",
+1705	    "palms_up_together_medium_skin_tone": "🤲🏽",
+1706	    "pancakes": "🥞",
+1707	    "panda_face": "🐼",
+1708	    "paperclip": "📎",
+1709	    "parrot": "🦜",
+1710	    "part_alternation_mark": "〽",
+1711	    "party_popper": "🎉",
+1712	    "partying_face": "🥳",
+1713	    "passenger_ship": "🛳",
+1714	    "passport_control": "🛂",
+1715	    "pause_button": "⏸",
+1716	    "paw_prints": "🐾",
+1717	    "peace_symbol": "☮",
+1718	    "peach": "🍑",
+1719	    "peacock": "🦚",
+1720	    "peanuts": "🥜",
+1721	    "pear": "🍐",
+1722	    "pen": "🖊",
+1723	    "pencil": "📝",
+1724	    "penguin": "🐧",
+1725	    "pensive_face": "😔",
+1726	    "people_holding_hands": "🧑\u200d🤝\u200d🧑",
+1727	    "people_with_bunny_ears": "👯",
+1728	    "people_wrestling": "🤼",
+1729	    "performing_arts": "🎭",
+1730	    "persevering_face": "😣",
+1731	    "person_biking": "🚴",
+1732	    "person_biking_dark_skin_tone": "🚴🏿",
+1733	    "person_biking_light_skin_tone": "🚴🏻",
+1734	    "person_biking_medium-dark_skin_tone": "🚴🏾",
+1735	    "person_biking_medium-light_skin_tone": "🚴🏼",
+1736	    "person_biking_medium_skin_tone": "🚴🏽",
+1737	    "person_bouncing_ball": "⛹",
+1738	    "person_bouncing_ball_dark_skin_tone": "⛹🏿",
+1739	    "person_bouncing_ball_light_skin_tone": "⛹🏻",
+1740	    "person_bouncing_ball_medium-dark_skin_tone": "⛹🏾",
+1741	    "person_bouncing_ball_medium-light_skin_tone": "⛹🏼",
+1742	    "person_bouncing_ball_medium_skin_tone": "⛹🏽",
+1743	    "person_bowing": "🙇",
+1744	    "person_bowing_dark_skin_tone": "🙇🏿",
+1745	    "person_bowing_light_skin_tone": "🙇🏻",
+1746	    "person_bowing_medium-dark_skin_tone": "🙇🏾",
+1747	    "person_bowing_medium-light_skin_tone": "🙇🏼",
+1748	    "person_bowing_medium_skin_tone": "🙇🏽",
+1749	    "person_cartwheeling": "🤸",
+1750	    "person_cartwheeling_dark_skin_tone": "🤸🏿",
+1751	    "person_cartwheeling_light_skin_tone": "🤸🏻",
+1752	    "person_cartwheeling_medium-dark_skin_tone": "🤸🏾",
+1753	    "person_cartwheeling_medium-light_skin_tone": "🤸🏼",
+1754	    "person_cartwheeling_medium_skin_tone": "🤸🏽",
+1755	    "person_climbing": "🧗",
+1756	    "person_climbing_dark_skin_tone": "🧗🏿",
+1757	    "person_climbing_light_skin_tone": "🧗🏻",
+1758	    "person_climbing_medium-dark_skin_tone": "🧗🏾",
+1759	    "person_climbing_medium-light_skin_tone": "🧗🏼",
+1760	    "person_climbing_medium_skin_tone": "🧗🏽",
+1761	    "person_facepalming": "🤦",
+1762	    "person_facepalming_dark_skin_tone": "🤦🏿",
+1763	    "person_facepalming_light_skin_tone": "🤦🏻",
+1764	    "person_facepalming_medium-dark_skin_tone": "🤦🏾",
+1765	    "person_facepalming_medium-light_skin_tone": "🤦🏼",
+1766	    "person_facepalming_medium_skin_tone": "🤦🏽",
+1767	    "person_fencing": "🤺",
+1768	    "person_frowning": "🙍",
+1769	    "person_frowning_dark_skin_tone": "🙍🏿",
+1770	    "person_frowning_light_skin_tone": "🙍🏻",
+1771	    "person_frowning_medium-dark_skin_tone": "🙍🏾",
+1772	    "person_frowning_medium-light_skin_tone": "🙍🏼",
+1773	    "person_frowning_medium_skin_tone": "🙍🏽",
+1774	    "person_gesturing_no": "🙅",
+1775	    "person_gesturing_no_dark_skin_tone": "🙅🏿",
+1776	    "person_gesturing_no_light_skin_tone": "🙅🏻",
+1777	    "person_gesturing_no_medium-dark_skin_tone": "🙅🏾",
+1778	    "person_gesturing_no_medium-light_skin_tone": "🙅🏼",
+1779	    "person_gesturing_no_medium_skin_tone": "🙅🏽",
+1780	    "person_gesturing_ok": "🙆",
+1781	    "person_gesturing_ok_dark_skin_tone": "🙆🏿",
+1782	    "person_gesturing_ok_light_skin_tone": "🙆🏻",
+1783	    "person_gesturing_ok_medium-dark_skin_tone": "🙆🏾",
+1784	    "person_gesturing_ok_medium-light_skin_tone": "🙆🏼",
+1785	    "person_gesturing_ok_medium_skin_tone": "🙆🏽",
+1786	    "person_getting_haircut": "💇",
+1787	    "person_getting_haircut_dark_skin_tone": "💇🏿",
+1788	    "person_getting_haircut_light_skin_tone": "💇🏻",
+1789	    "person_getting_haircut_medium-dark_skin_tone": "💇🏾",
+1790	    "person_getting_haircut_medium-light_skin_tone": "💇🏼",
+1791	    "person_getting_haircut_medium_skin_tone": "💇🏽",
+1792	    "person_getting_massage": "💆",
+1793	    "person_getting_massage_dark_skin_tone": "💆🏿",
+1794	    "person_getting_massage_light_skin_tone": "💆🏻",
+1795	    "person_getting_massage_medium-dark_skin_tone": "💆🏾",
+1796	    "person_getting_massage_medium-light_skin_tone": "💆🏼",
+1797	    "person_getting_massage_medium_skin_tone": "💆🏽",
+1798	    "person_golfing": "🏌",
+1799	    "person_golfing_dark_skin_tone": "🏌🏿",
+1800	    "person_golfing_light_skin_tone": "🏌🏻",
+1801	    "person_golfing_medium-dark_skin_tone": "🏌🏾",
+1802	    "person_golfing_medium-light_skin_tone": "🏌🏼",
+1803	    "person_golfing_medium_skin_tone": "🏌🏽",
+1804	    "person_in_bed": "🛌",
+1805	    "person_in_bed_dark_skin_tone": "🛌🏿",
+1806	    "person_in_bed_light_skin_tone": "🛌🏻",
+1807	    "person_in_bed_medium-dark_skin_tone": "🛌🏾",
+1808	    "person_in_bed_medium-light_skin_tone": "🛌🏼",
+1809	    "person_in_bed_medium_skin_tone": "🛌🏽",
+1810	    "person_in_lotus_position": "🧘",
+1811	    "person_in_lotus_position_dark_skin_tone": "🧘🏿",
+1812	    "person_in_lotus_position_light_skin_tone": "🧘🏻",
+1813	    "person_in_lotus_position_medium-dark_skin_tone": "🧘🏾",
+1814	    "person_in_lotus_position_medium-light_skin_tone": "🧘🏼",
+1815	    "person_in_lotus_position_medium_skin_tone": "🧘🏽",
+1816	    "person_in_steamy_room": "🧖",
+1817	    "person_in_steamy_room_dark_skin_tone": "🧖🏿",
+1818	    "person_in_steamy_room_light_skin_tone": "🧖🏻",
+1819	    "person_in_steamy_room_medium-dark_skin_tone": "🧖🏾",
+1820	    "person_in_steamy_room_medium-light_skin_tone": "🧖🏼",
+1821	    "person_in_steamy_room_medium_skin_tone": "🧖🏽",
+1822	    "person_juggling": "🤹",
+1823	    "person_juggling_dark_skin_tone": "🤹🏿",
+1824	    "person_juggling_light_skin_tone": "🤹🏻",
+1825	    "person_juggling_medium-dark_skin_tone": "🤹🏾",
+1826	    "person_juggling_medium-light_skin_tone": "🤹🏼",
+1827	    "person_juggling_medium_skin_tone": "🤹🏽",
+1828	    "person_kneeling": "🧎",
+1829	    "person_lifting_weights": "🏋",
+1830	    "person_lifting_weights_dark_skin_tone": "🏋🏿",
+1831	    "person_lifting_weights_light_skin_tone": "🏋🏻",
+1832	    "person_lifting_weights_medium-dark_skin_tone": "🏋🏾",
+1833	    "person_lifting_weights_medium-light_skin_tone": "🏋🏼",
+1834	    "person_lifting_weights_medium_skin_tone": "🏋🏽",
+1835	    "person_mountain_biking": "🚵",
+1836	    "person_mountain_biking_dark_skin_tone": "🚵🏿",
+1837	    "person_mountain_biking_light_skin_tone": "🚵🏻",
+1838	    "person_mountain_biking_medium-dark_skin_tone": "🚵🏾",
+1839	    "person_mountain_biking_medium-light_skin_tone": "🚵🏼",
+1840	    "person_mountain_biking_medium_skin_tone": "🚵🏽",
+1841	    "person_playing_handball": "🤾",
+1842	    "person_playing_handball_dark_skin_tone": "🤾🏿",
+1843	    "person_playing_handball_light_skin_tone": "🤾🏻",
+1844	    "person_playing_handball_medium-dark_skin_tone": "🤾🏾",
+1845	    "person_playing_handball_medium-light_skin_tone": "🤾🏼",
+1846	    "person_playing_handball_medium_skin_tone": "🤾🏽",
+1847	    "person_playing_water_polo": "🤽",
+1848	    "person_playing_water_polo_dark_skin_tone": "🤽🏿",
+1849	    "person_playing_water_polo_light_skin_tone": "🤽🏻",
+1850	    "person_playing_water_polo_medium-dark_skin_tone": "🤽🏾",
+1851	    "person_playing_water_polo_medium-light_skin_tone": "🤽🏼",
+1852	    "person_playing_water_polo_medium_skin_tone": "🤽🏽",
+1853	    "person_pouting": "🙎",
+1854	    "person_pouting_dark_skin_tone": "🙎🏿",
+1855	    "person_pouting_light_skin_tone": "🙎🏻",
+1856	    "person_pouting_medium-dark_skin_tone": "🙎🏾",
+1857	    "person_pouting_medium-light_skin_tone": "🙎🏼",
+1858	    "person_pouting_medium_skin_tone": "🙎🏽",
+1859	    "person_raising_hand": "🙋",
+1860	    "person_raising_hand_dark_skin_tone": "🙋🏿",
+1861	    "person_raising_hand_light_skin_tone": "🙋🏻",
+1862	    "person_raising_hand_medium-dark_skin_tone": "🙋🏾",
+1863	    "person_raising_hand_medium-light_skin_tone": "🙋🏼",
+1864	    "person_raising_hand_medium_skin_tone": "🙋🏽",
+1865	    "person_rowing_boat": "🚣",
+1866	    "person_rowing_boat_dark_skin_tone": "🚣🏿",
+1867	    "person_rowing_boat_light_skin_tone": "🚣🏻",
+1868	    "person_rowing_boat_medium-dark_skin_tone": "🚣🏾",
+1869	    "person_rowing_boat_medium-light_skin_tone": "🚣🏼",
+1870	    "person_rowing_boat_medium_skin_tone": "🚣🏽",
+1871	    "person_running": "🏃",
+1872	    "person_running_dark_skin_tone": "🏃🏿",
+1873	    "person_running_light_skin_tone": "🏃🏻",
+1874	    "person_running_medium-dark_skin_tone": "🏃🏾",
+1875	    "person_running_medium-light_skin_tone": "🏃🏼",
+1876	    "person_running_medium_skin_tone": "🏃🏽",
+1877	    "person_shrugging": "🤷",
+1878	    "person_shrugging_dark_skin_tone": "🤷🏿",
+1879	    "person_shrugging_light_skin_tone": "🤷🏻",
+1880	    "person_shrugging_medium-dark_skin_tone": "🤷🏾",
+1881	    "person_shrugging_medium-light_skin_tone": "🤷🏼",
+1882	    "person_shrugging_medium_skin_tone": "🤷🏽",
+1883	    "person_standing": "🧍",
+1884	    "person_surfing": "🏄",
+1885	    "person_surfing_dark_skin_tone": "🏄🏿",
+1886	    "person_surfing_light_skin_tone": "🏄🏻",
+1887	    "person_surfing_medium-dark_skin_tone": "🏄🏾",
+1888	    "person_surfing_medium-light_skin_tone": "🏄🏼",
+1889	    "person_surfing_medium_skin_tone": "🏄🏽",
+1890	    "person_swimming": "🏊",
+1891	    "person_swimming_dark_skin_tone": "🏊🏿",
+1892	    "person_swimming_light_skin_tone": "🏊🏻",
+1893	    "person_swimming_medium-dark_skin_tone": "🏊🏾",
+1894	    "person_swimming_medium-light_skin_tone": "🏊🏼",
+1895	    "person_swimming_medium_skin_tone": "🏊🏽",
+1896	    "person_taking_bath": "🛀",
+1897	    "person_taking_bath_dark_skin_tone": "🛀🏿",
+1898	    "person_taking_bath_light_skin_tone": "🛀🏻",
+1899	    "person_taking_bath_medium-dark_skin_tone": "🛀🏾",
+1900	    "person_taking_bath_medium-light_skin_tone": "🛀🏼",
+1901	    "person_taking_bath_medium_skin_tone": "🛀🏽",
+1902	    "person_tipping_hand": "💁",
+1903	    "person_tipping_hand_dark_skin_tone": "💁🏿",
+1904	    "person_tipping_hand_light_skin_tone": "💁🏻",
+1905	    "person_tipping_hand_medium-dark_skin_tone": "💁🏾",
+1906	    "person_tipping_hand_medium-light_skin_tone": "💁🏼",
+1907	    "person_tipping_hand_medium_skin_tone": "💁🏽",
+1908	    "person_walking": "🚶",
+1909	    "person_walking_dark_skin_tone": "🚶🏿",
+1910	    "person_walking_light_skin_tone": "🚶🏻",
+1911	    "person_walking_medium-dark_skin_tone": "🚶🏾",
+1912	    "person_walking_medium-light_skin_tone": "🚶🏼",
+1913	    "person_walking_medium_skin_tone": "🚶🏽",
+1914	    "person_wearing_turban": "👳",
+1915	    "person_wearing_turban_dark_skin_tone": "👳🏿",
+1916	    "person_wearing_turban_light_skin_tone": "👳🏻",
+1917	    "person_wearing_turban_medium-dark_skin_tone": "👳🏾",
+1918	    "person_wearing_turban_medium-light_skin_tone": "👳🏼",
+1919	    "person_wearing_turban_medium_skin_tone": "👳🏽",
+1920	    "petri_dish": "🧫",
+1921	    "pick": "⛏",
+1922	    "pie": "🥧",
+1923	    "pig": "🐷",
+1924	    "pig_face": "🐷",
+1925	    "pig_nose": "🐽",
+1926	    "pile_of_poo": "💩",
+1927	    "pill": "💊",
+1928	    "pinching_hand": "🤏",
+1929	    "pine_decoration": "🎍",
+1930	    "pineapple": "🍍",
+1931	    "ping_pong": "🏓",
+1932	    "pirate_flag": "🏴\u200d☠️",
+1933	    "pistol": "🔫",
+1934	    "pizza": "🍕",
+1935	    "place_of_worship": "🛐",
+1936	    "play_button": "▶",
+1937	    "play_or_pause_button": "⏯",
+1938	    "pleading_face": "🥺",
+1939	    "police_car": "🚓",
+1940	    "police_car_light": "🚨",
+1941	    "police_officer": "👮",
+1942	    "police_officer_dark_skin_tone": "👮🏿",
+1943	    "police_officer_light_skin_tone": "👮🏻",
+1944	    "police_officer_medium-dark_skin_tone": "👮🏾",
+1945	    "police_officer_medium-light_skin_tone": "👮🏼",
+1946	    "police_officer_medium_skin_tone": "👮🏽",
+1947	    "poodle": "🐩",
+1948	    "pool_8_ball": "🎱",
+1949	    "popcorn": "🍿",
+1950	    "post_office": "🏣",
+1951	    "postal_horn": "📯",
+1952	    "postbox": "📮",
+1953	    "pot_of_food": "🍲",
+1954	    "potable_water": "🚰",
+1955	    "potato": "🥔",
+1956	    "poultry_leg": "🍗",
+1957	    "pound_banknote": "💷",
+1958	    "pouting_cat_face": "😾",
+1959	    "pouting_face": "😡",
+1960	    "prayer_beads": "📿",
+1961	    "pregnant_woman": "🤰",
+1962	    "pregnant_woman_dark_skin_tone": "🤰🏿",
+1963	    "pregnant_woman_light_skin_tone": "🤰🏻",
+1964	    "pregnant_woman_medium-dark_skin_tone": "🤰🏾",
+1965	    "pregnant_woman_medium-light_skin_tone": "🤰🏼",
+1966	    "pregnant_woman_medium_skin_tone": "🤰🏽",
+1967	    "pretzel": "🥨",
+1968	    "probing_cane": "🦯",
+1969	    "prince": "🤴",
+1970	    "prince_dark_skin_tone": "🤴🏿",
+1971	    "prince_light_skin_tone": "🤴🏻",
+1972	    "prince_medium-dark_skin_tone": "🤴🏾",
+1973	    "prince_medium-light_skin_tone": "🤴🏼",
+1974	    "prince_medium_skin_tone": "🤴🏽",
+1975	    "princess": "👸",
+1976	    "princess_dark_skin_tone": "👸🏿",
+1977	    "princess_light_skin_tone": "👸🏻",
+1978	    "princess_medium-dark_skin_tone": "👸🏾",
+1979	    "princess_medium-light_skin_tone": "👸🏼",
+1980	    "princess_medium_skin_tone": "👸🏽",
+1981	    "printer": "🖨",
+1982	    "prohibited": "🚫",
+1983	    "purple_circle": "🟣",
+1984	    "purple_heart": "💜",
+1985	    "purple_square": "🟪",
+1986	    "purse": "👛",
+1987	    "pushpin": "📌",
+1988	    "question_mark": "❓",
+1989	    "rabbit": "🐰",
+1990	    "rabbit_face": "🐰",
+1991	    "raccoon": "🦝",
+1992	    "racing_car": "🏎",
+1993	    "radio": "📻",
+1994	    "radio_button": "🔘",
+1995	    "radioactive": "☢",
+1996	    "railway_car": "🚃",
+1997	    "railway_track": "🛤",
+1998	    "rainbow": "🌈",
+1999	    "rainbow_flag": "🏳️\u200d🌈",
+2000	    "raised_back_of_hand": "🤚",
+2001	    "raised_back_of_hand_dark_skin_tone": "🤚🏿",
+2002	    "raised_back_of_hand_light_skin_tone": "🤚🏻",
+2003	    "raised_back_of_hand_medium-dark_skin_tone": "🤚🏾",
+2004	    "raised_back_of_hand_medium-light_skin_tone": "🤚🏼",
+2005	    "raised_back_of_hand_medium_skin_tone": "🤚🏽",
+2006	    "raised_fist": "✊",
+2007	    "raised_fist_dark_skin_tone": "✊🏿",
+2008	    "raised_fist_light_skin_tone": "✊🏻",
+2009	    "raised_fist_medium-dark_skin_tone": "✊🏾",
+2010	    "raised_fist_medium-light_skin_tone": "✊🏼",
+2011	    "raised_fist_medium_skin_tone": "✊🏽",
+2012	    "raised_hand": "✋",
+2013	    "raised_hand_dark_skin_tone": "✋🏿",
+2014	    "raised_hand_light_skin_tone": "✋🏻",
+2015	    "raised_hand_medium-dark_skin_tone": "✋🏾",
+2016	    "raised_hand_medium-light_skin_tone": "✋🏼",
+2017	    "raised_hand_medium_skin_tone": "✋🏽",
+2018	    "raising_hands": "🙌",
+2019	    "raising_hands_dark_skin_tone": "🙌🏿",
+2020	    "raising_hands_light_skin_tone": "🙌🏻",
+2021	    "raising_hands_medium-dark_skin_tone": "🙌🏾",
+2022	    "raising_hands_medium-light_skin_tone": "🙌🏼",
+2023	    "raising_hands_medium_skin_tone": "🙌🏽",
+2024	    "ram": "🐏",
+2025	    "rat": "🐀",
+2026	    "razor": "🪒",
+2027	    "ringed_planet": "🪐",
+2028	    "receipt": "🧾",
+2029	    "record_button": "⏺",
+2030	    "recycling_symbol": "♻",
+2031	    "red_apple": "🍎",
+2032	    "red_circle": "🔴",
+2033	    "red_envelope": "🧧",
+2034	    "red_hair": "🦰",
+2035	    "red-haired_man": "👨\u200d🦰",
+2036	    "red-haired_woman": "👩\u200d🦰",
+2037	    "red_heart": "❤",
+2038	    "red_paper_lantern": "🏮",
+2039	    "red_square": "🟥",
+2040	    "red_triangle_pointed_down": "🔻",
+2041	    "red_triangle_pointed_up": "🔺",
+2042	    "registered": "®",
+2043	    "relieved_face": "😌",
+2044	    "reminder_ribbon": "🎗",
+2045	    "repeat_button": "🔁",
+2046	    "repeat_single_button": "🔂",
+2047	    "rescue_worker’s_helmet": "⛑",
+2048	    "restroom": "🚻",
+2049	    "reverse_button": "◀",
+2050	    "revolving_hearts": "💞",
+2051	    "rhinoceros": "🦏",
+2052	    "ribbon": "🎀",
+2053	    "rice_ball": "🍙",
+2054	    "rice_cracker": "🍘",
+2055	    "right-facing_fist": "🤜",
+2056	    "right-facing_fist_dark_skin_tone": "🤜🏿",
+2057	    "right-facing_fist_light_skin_tone": "🤜🏻",
+2058	    "right-facing_fist_medium-dark_skin_tone": "🤜🏾",
+2059	    "right-facing_fist_medium-light_skin_tone": "🤜🏼",
+2060	    "right-facing_fist_medium_skin_tone": "🤜🏽",
+2061	    "right_anger_bubble": "🗯",
+2062	    "right_arrow": "➡",
+2063	    "right_arrow_curving_down": "⤵",
+2064	    "right_arrow_curving_left": "↩",
+2065	    "right_arrow_curving_up": "⤴",
+2066	    "ring": "💍",
+2067	    "roasted_sweet_potato": "🍠",
+2068	    "robot_face": "🤖",
+2069	    "rocket": "🚀",
+2070	    "roll_of_paper": "🧻",
+2071	    "rolled-up_newspaper": "🗞",
+2072	    "roller_coaster": "🎢",
+2073	    "rolling_on_the_floor_laughing": "🤣",
+2074	    "rooster": "🐓",
+2075	    "rose": "🌹",
+2076	    "rosette": "🏵",
+2077	    "round_pushpin": "📍",
+2078	    "rugby_football": "🏉",
+2079	    "running_shirt": "🎽",
+2080	    "running_shoe": "👟",
+2081	    "sad_but_relieved_face": "😥",
+2082	    "safety_pin": "🧷",
+2083	    "safety_vest": "🦺",
+2084	    "salt": "🧂",
+2085	    "sailboat": "⛵",
+2086	    "sake": "🍶",
+2087	    "sandwich": "🥪",
+2088	    "sari": "🥻",
+2089	    "satellite": "📡",
+2090	    "satellite_antenna": "📡",
+2091	    "sauropod": "🦕",
+2092	    "saxophone": "🎷",
+2093	    "scarf": "🧣",
+2094	    "school": "🏫",
+2095	    "school_backpack": "🎒",
+2096	    "scissors": "✂",
+2097	    "scorpion": "🦂",
+2098	    "scroll": "📜",
+2099	    "seat": "💺",
+2100	    "see-no-evil_monkey": "🙈",
+2101	    "seedling": "🌱",
+2102	    "selfie": "🤳",
+2103	    "selfie_dark_skin_tone": "🤳🏿",
+2104	    "selfie_light_skin_tone": "🤳🏻",
+2105	    "selfie_medium-dark_skin_tone": "🤳🏾",
+2106	    "selfie_medium-light_skin_tone": "🤳🏼",
+2107	    "selfie_medium_skin_tone": "🤳🏽",
+2108	    "service_dog": "🐕\u200d🦺",
+2109	    "seven-thirty": "🕢",
+2110	    "seven_o’clock": "🕖",
+2111	    "shallow_pan_of_food": "🥘",
+2112	    "shamrock": "☘",
+2113	    "shark": "🦈",
+2114	    "shaved_ice": "🍧",
+2115	    "sheaf_of_rice": "🌾",
+2116	    "shield": "🛡",
+2117	    "shinto_shrine": "⛩",
+2118	    "ship": "🚢",
+2119	    "shooting_star": "🌠",
+2120	    "shopping_bags": "🛍",
+2121	    "shopping_cart": "🛒",
+2122	    "shortcake": "🍰",
+2123	    "shorts": "🩳",
+2124	    "shower": "🚿",
+2125	    "shrimp": "🦐",
+2126	    "shuffle_tracks_button": "🔀",
+2127	    "shushing_face": "🤫",
+2128	    "sign_of_the_horns": "🤘",
+2129	    "sign_of_the_horns_dark_skin_tone": "🤘🏿",
+2130	    "sign_of_the_horns_light_skin_tone": "🤘🏻",
+2131	    "sign_of_the_horns_medium-dark_skin_tone": "🤘🏾",
+2132	    "sign_of_the_horns_medium-light_skin_tone": "🤘🏼",
+2133	    "sign_of_the_horns_medium_skin_tone": "🤘🏽",
+2134	    "six-thirty": "🕡",
+2135	    "six_o’clock": "🕕",
+2136	    "skateboard": "🛹",
+2137	    "skier": "⛷",
+2138	    "skis": "🎿",
+2139	    "skull": "💀",
+2140	    "skull_and_crossbones": "☠",
+2141	    "skunk": "🦨",
+2142	    "sled": "🛷",
+2143	    "sleeping_face": "😴",
+2144	    "sleepy_face": "😪",
+2145	    "slightly_frowning_face": "🙁",
+2146	    "slightly_smiling_face": "🙂",
+2147	    "slot_machine": "🎰",
+2148	    "sloth": "🦥",
+2149	    "small_airplane": "🛩",
+2150	    "small_blue_diamond": "🔹",
+2151	    "small_orange_diamond": "🔸",
+2152	    "smiling_cat_face_with_heart-eyes": "😻",
+2153	    "smiling_face": "☺",
+2154	    "smiling_face_with_halo": "😇",
+2155	    "smiling_face_with_3_hearts": "🥰",
+2156	    "smiling_face_with_heart-eyes": "😍",
+2157	    "smiling_face_with_horns": "😈",
+2158	    "smiling_face_with_smiling_eyes": "😊",
+2159	    "smiling_face_with_sunglasses": "😎",
+2160	    "smirking_face": "😏",
+2161	    "snail": "🐌",
+2162	    "snake": "🐍",
+2163	    "sneezing_face": "🤧",
+2164	    "snow-capped_mountain": "🏔",
+2165	    "snowboarder": "🏂",
+2166	    "snowboarder_dark_skin_tone": "🏂🏿",
+2167	    "snowboarder_light_skin_tone": "🏂🏻",
+2168	    "snowboarder_medium-dark_skin_tone": "🏂🏾",
+2169	    "snowboarder_medium-light_skin_tone": "🏂🏼",
+2170	    "snowboarder_medium_skin_tone": "🏂🏽",
+2171	    "snowflake": "❄",
+2172	    "snowman": "☃",
+2173	    "snowman_without_snow": "⛄",
+2174	    "soap": "🧼",
+2175	    "soccer_ball": "⚽",
+2176	    "socks": "🧦",
+2177	    "softball": "🥎",
+2178	    "soft_ice_cream": "🍦",
+2179	    "spade_suit": "♠",
+2180	    "spaghetti": "🍝",
+2181	    "sparkle": "❇",
+2182	    "sparkler": "🎇",
+2183	    "sparkles": "✨",
+2184	    "sparkling_heart": "💖",
+2185	    "speak-no-evil_monkey": "🙊",
+2186	    "speaker_high_volume": "🔊",
+2187	    "speaker_low_volume": "🔈",
+2188	    "speaker_medium_volume": "🔉",
+2189	    "speaking_head": "🗣",
+2190	    "speech_balloon": "💬",
+2191	    "speedboat": "🚤",
+2192	    "spider": "🕷",
+2193	    "spider_web": "🕸",
+2194	    "spiral_calendar": "🗓",
+2195	    "spiral_notepad": "🗒",
+2196	    "spiral_shell": "🐚",
+2197	    "spoon": "🥄",
+2198	    "sponge": "🧽",
+2199	    "sport_utility_vehicle": "🚙",
+2200	    "sports_medal": "🏅",
+2201	    "spouting_whale": "🐳",
+2202	    "squid": "🦑",
+2203	    "squinting_face_with_tongue": "😝",
+2204	    "stadium": "🏟",
+2205	    "star-struck": "🤩",
+2206	    "star_and_crescent": "☪",
+2207	    "star_of_david": "✡",
+2208	    "station": "🚉",
+2209	    "steaming_bowl": "🍜",
+2210	    "stethoscope": "🩺",
+2211	    "stop_button": "⏹",
+2212	    "stop_sign": "🛑",
+2213	    "stopwatch": "⏱",
+2214	    "straight_ruler": "📏",
+2215	    "strawberry": "🍓",
+2216	    "studio_microphone": "🎙",
+2217	    "stuffed_flatbread": "🥙",
+2218	    "sun": "☀",
+2219	    "sun_behind_cloud": "⛅",
+2220	    "sun_behind_large_cloud": "🌥",
+2221	    "sun_behind_rain_cloud": "🌦",
+2222	    "sun_behind_small_cloud": "🌤",
+2223	    "sun_with_face": "🌞",
+2224	    "sunflower": "🌻",
+2225	    "sunglasses": "😎",
+2226	    "sunrise": "🌅",
+2227	    "sunrise_over_mountains": "🌄",
+2228	    "sunset": "🌇",
+2229	    "superhero": "🦸",
+2230	    "supervillain": "🦹",
+2231	    "sushi": "🍣",
+2232	    "suspension_railway": "🚟",
+2233	    "swan": "🦢",
+2234	    "sweat_droplets": "💦",
+2235	    "synagogue": "🕍",
+2236	    "syringe": "💉",
+2237	    "t-shirt": "👕",
+2238	    "taco": "🌮",
+2239	    "takeout_box": "🥡",
+2240	    "tanabata_tree": "🎋",
+2241	    "tangerine": "🍊",
+2242	    "taxi": "🚕",
+2243	    "teacup_without_handle": "🍵",
+2244	    "tear-off_calendar": "📆",
+2245	    "teddy_bear": "🧸",
+2246	    "telephone": "☎",
+2247	    "telephone_receiver": "📞",
+2248	    "telescope": "🔭",
+2249	    "television": "📺",
+2250	    "ten-thirty": "🕥",
+2251	    "ten_o’clock": "🕙",
+2252	    "tennis": "🎾",
+2253	    "tent": "⛺",
+2254	    "test_tube": "🧪",
+2255	    "thermometer": "🌡",
+2256	    "thinking_face": "🤔",
+2257	    "thought_balloon": "💭",
+2258	    "thread": "🧵",
+2259	    "three-thirty": "🕞",
+2260	    "three_o’clock": "🕒",
+2261	    "thumbs_down": "👎",
+2262	    "thumbs_down_dark_skin_tone": "👎🏿",
+2263	    "thumbs_down_light_skin_tone": "👎🏻",
+2264	    "thumbs_down_medium-dark_skin_tone": "👎🏾",
+2265	    "thumbs_down_medium-light_skin_tone": "👎🏼",
+2266	    "thumbs_down_medium_skin_tone": "👎🏽",
+2267	    "thumbs_up": "👍",
+2268	    "thumbs_up_dark_skin_tone": "👍🏿",
+2269	    "thumbs_up_light_skin_tone": "👍🏻",
+2270	    "thumbs_up_medium-dark_skin_tone": "👍🏾",
+2271	    "thumbs_up_medium-light_skin_tone": "👍🏼",
+2272	    "thumbs_up_medium_skin_tone": "👍🏽",
+2273	    "ticket": "🎫",
+2274	    "tiger": "🐯",
+2275	    "tiger_face": "🐯",
+2276	    "timer_clock": "⏲",
+2277	    "tired_face": "😫",
+2278	    "toolbox": "🧰",
+2279	    "toilet": "🚽",
+2280	    "tomato": "🍅",
+2281	    "tongue": "👅",
+2282	    "tooth": "🦷",
+2283	    "top_hat": "🎩",
+2284	    "tornado": "🌪",
+2285	    "trackball": "🖲",
+2286	    "tractor": "🚜",
+2287	    "trade_mark": "™",
+2288	    "train": "🚋",
+2289	    "tram": "🚊",
+2290	    "tram_car": "🚋",
+2291	    "triangular_flag": "🚩",
+2292	    "triangular_ruler": "📐",
+2293	    "trident_emblem": "🔱",
+2294	    "trolleybus": "🚎",
+2295	    "trophy": "🏆",
+2296	    "tropical_drink": "🍹",
+2297	    "tropical_fish": "🐠",
+2298	    "trumpet": "🎺",
+2299	    "tulip": "🌷",
+2300	    "tumbler_glass": "🥃",
+2301	    "turtle": "🐢",
+2302	    "twelve-thirty": "🕧",
+2303	    "twelve_o’clock": "🕛",
+2304	    "two-hump_camel": "🐫",
+2305	    "two-thirty": "🕝",
+2306	    "two_hearts": "💕",
+2307	    "two_men_holding_hands": "👬",
+2308	    "two_o’clock": "🕑",
+2309	    "two_women_holding_hands": "👭",
+2310	    "umbrella": "☂",
+2311	    "umbrella_on_ground": "⛱",
+2312	    "umbrella_with_rain_drops": "☔",
+2313	    "unamused_face": "😒",
+2314	    "unicorn_face": "🦄",
+2315	    "unlocked": "🔓",
+2316	    "up-down_arrow": "↕",
+2317	    "up-left_arrow": "↖",
+2318	    "up-right_arrow": "↗",
+2319	    "up_arrow": "⬆",
+2320	    "upside-down_face": "🙃",
+2321	    "upwards_button": "🔼",
+2322	    "vampire": "🧛",
+2323	    "vampire_dark_skin_tone": "🧛🏿",
+2324	    "vampire_light_skin_tone": "🧛🏻",
+2325	    "vampire_medium-dark_skin_tone": "🧛🏾",
+2326	    "vampire_medium-light_skin_tone": "🧛🏼",
+2327	    "vampire_medium_skin_tone": "🧛🏽",
+2328	    "vertical_traffic_light": "🚦",
+2329	    "vibration_mode": "📳",
+2330	    "victory_hand": "✌",
+2331	    "victory_hand_dark_skin_tone": "✌🏿",
+2332	    "victory_hand_light_skin_tone": "✌🏻",
+2333	    "victory_hand_medium-dark_skin_tone": "✌🏾",
+2334	    "victory_hand_medium-light_skin_tone": "✌🏼",
+2335	    "victory_hand_medium_skin_tone": "✌🏽",
+2336	    "video_camera": "📹",
+2337	    "video_game": "🎮",
+2338	    "videocassette": "📼",
+2339	    "violin": "🎻",
+2340	    "volcano": "🌋",
+2341	    "volleyball": "🏐",
+2342	    "vulcan_salute": "🖖",
+2343	    "vulcan_salute_dark_skin_tone": "🖖🏿",
+2344	    "vulcan_salute_light_skin_tone": "🖖🏻",
+2345	    "vulcan_salute_medium-dark_skin_tone": "🖖🏾",
+2346	    "vulcan_salute_medium-light_skin_tone": "🖖🏼",
+2347	    "vulcan_salute_medium_skin_tone": "🖖🏽",
+2348	    "waffle": "🧇",
+2349	    "waning_crescent_moon": "🌘",
+2350	    "waning_gibbous_moon": "🌖",
+2351	    "warning": "⚠",
+2352	    "wastebasket": "🗑",
+2353	    "watch": "⌚",
+2354	    "water_buffalo": "🐃",
+2355	    "water_closet": "🚾",
+2356	    "water_wave": "🌊",
+2357	    "watermelon": "🍉",
+2358	    "waving_hand": "👋",
+2359	    "waving_hand_dark_skin_tone": "👋🏿",
+2360	    "waving_hand_light_skin_tone": "👋🏻",
+2361	    "waving_hand_medium-dark_skin_tone": "👋🏾",
+2362	    "waving_hand_medium-light_skin_tone": "👋🏼",
+2363	    "waving_hand_medium_skin_tone": "👋🏽",
+2364	    "wavy_dash": "〰",
+2365	    "waxing_crescent_moon": "🌒",
+2366	    "waxing_gibbous_moon": "🌔",
+2367	    "weary_cat_face": "🙀",
+2368	    "weary_face": "😩",
+2369	    "wedding": "💒",
+2370	    "whale": "🐳",
+2371	    "wheel_of_dharma": "☸",
+2372	    "wheelchair_symbol": "♿",
+2373	    "white_circle": "⚪",
+2374	    "white_exclamation_mark": "❕",
+2375	    "white_flag": "🏳",
+2376	    "white_flower": "💮",
+2377	    "white_hair": "🦳",
+2378	    "white-haired_man": "👨\u200d🦳",
+2379	    "white-haired_woman": "👩\u200d🦳",
+2380	    "white_heart": "🤍",
+2381	    "white_heavy_check_mark": "✅",
+2382	    "white_large_square": "⬜",
+2383	    "white_medium-small_square": "◽",
+2384	    "white_medium_square": "◻",
+2385	    "white_medium_star": "⭐",
+2386	    "white_question_mark": "❔",
+2387	    "white_small_square": "▫",
+2388	    "white_square_button": "🔳",
+2389	    "wilted_flower": "🥀",
+2390	    "wind_chime": "🎐",
+2391	    "wind_face": "🌬",
+2392	    "wine_glass": "🍷",
+2393	    "winking_face": "😉",
+2394	    "winking_face_with_tongue": "😜",
+2395	    "wolf_face": "🐺",
+2396	    "woman": "👩",
+2397	    "woman_artist": "👩\u200d🎨",
+2398	    "woman_artist_dark_skin_tone": "👩🏿\u200d🎨",
+2399	    "woman_artist_light_skin_tone": "👩🏻\u200d🎨",
+2400	    "woman_artist_medium-dark_skin_tone": "👩🏾\u200d🎨",
+2401	    "woman_artist_medium-light_skin_tone": "👩🏼\u200d🎨",
+2402	    "woman_artist_medium_skin_tone": "👩🏽\u200d🎨",
+2403	    "woman_astronaut": "👩\u200d🚀",
+2404	    "woman_astronaut_dark_skin_tone": "👩🏿\u200d🚀",
+2405	    "woman_astronaut_light_skin_tone": "👩🏻\u200d🚀",
+2406	    "woman_astronaut_medium-dark_skin_tone": "👩🏾\u200d🚀",
+2407	    "woman_astronaut_medium-light_skin_tone": "👩🏼\u200d🚀",
+2408	    "woman_astronaut_medium_skin_tone": "👩🏽\u200d🚀",
+2409	    "woman_biking": "🚴\u200d♀️",
+2410	    "woman_biking_dark_skin_tone": "🚴🏿\u200d♀️",
+2411	    "woman_biking_light_skin_tone": "🚴🏻\u200d♀️",
+2412	    "woman_biking_medium-dark_skin_tone": "🚴🏾\u200d♀️",
+2413	    "woman_biking_medium-light_skin_tone": "🚴🏼\u200d♀️",
+2414	    "woman_biking_medium_skin_tone": "🚴🏽\u200d♀️",
+2415	    "woman_bouncing_ball": "⛹️\u200d♀️",
+2416	    "woman_bouncing_ball_dark_skin_tone": "⛹🏿\u200d♀️",
+2417	    "woman_bouncing_ball_light_skin_tone": "⛹🏻\u200d♀️",
+2418	    "woman_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♀️",
+2419	    "woman_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♀️",
+2420	    "woman_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♀️",
+2421	    "woman_bowing": "🙇\u200d♀️",
+2422	    "woman_bowing_dark_skin_tone": "🙇🏿\u200d♀️",
+2423	    "woman_bowing_light_skin_tone": "🙇🏻\u200d♀️",
+2424	    "woman_bowing_medium-dark_skin_tone": "🙇🏾\u200d♀️",
+2425	    "woman_bowing_medium-light_skin_tone": "🙇🏼\u200d♀️",
+2426	    "woman_bowing_medium_skin_tone": "🙇🏽\u200d♀️",
+2427	    "woman_cartwheeling": "🤸\u200d♀️",
+2428	    "woman_cartwheeling_dark_skin_tone": "🤸🏿\u200d♀️",
+2429	    "woman_cartwheeling_light_skin_tone": "🤸🏻\u200d♀️",
+2430	    "woman_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♀️",
+2431	    "woman_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♀️",
+2432	    "woman_cartwheeling_medium_skin_tone": "🤸🏽\u200d♀️",
+2433	    "woman_climbing": "🧗\u200d♀️",
+2434	    "woman_climbing_dark_skin_tone": "🧗🏿\u200d♀️",
+2435	    "woman_climbing_light_skin_tone": "🧗🏻\u200d♀️",
+2436	    "woman_climbing_medium-dark_skin_tone": "🧗🏾\u200d♀️",
+2437	    "woman_climbing_medium-light_skin_tone": "🧗🏼\u200d♀️",
+2438	    "woman_climbing_medium_skin_tone": "🧗🏽\u200d♀️",
+2439	    "woman_construction_worker": "👷\u200d♀️",
+2440	    "woman_construction_worker_dark_skin_tone": "👷🏿\u200d♀️",
+2441	    "woman_construction_worker_light_skin_tone": "👷🏻\u200d♀️",
+2442	    "woman_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♀️",
+2443	    "woman_construction_worker_medium-light_skin_tone": "👷🏼\u200d♀️",
+2444	    "woman_construction_worker_medium_skin_tone": "👷🏽\u200d♀️",
+2445	    "woman_cook": "👩\u200d🍳",
+2446	    "woman_cook_dark_skin_tone": "👩🏿\u200d🍳",
+2447	    "woman_cook_light_skin_tone": "👩🏻\u200d🍳",
+2448	    "woman_cook_medium-dark_skin_tone": "👩🏾\u200d🍳",
+2449	    "woman_cook_medium-light_skin_tone": "👩🏼\u200d🍳",
+2450	    "woman_cook_medium_skin_tone": "👩🏽\u200d🍳",
+2451	    "woman_dancing": "💃",
+2452	    "woman_dancing_dark_skin_tone": "💃🏿",
+2453	    "woman_dancing_light_skin_tone": "💃🏻",
+2454	    "woman_dancing_medium-dark_skin_tone": "💃🏾",
+2455	    "woman_dancing_medium-light_skin_tone": "💃🏼",
+2456	    "woman_dancing_medium_skin_tone": "💃🏽",
+2457	    "woman_dark_skin_tone": "👩🏿",
+2458	    "woman_detective": "🕵️\u200d♀️",
+2459	    "woman_detective_dark_skin_tone": "🕵🏿\u200d♀️",
+2460	    "woman_detective_light_skin_tone": "🕵🏻\u200d♀️",
+2461	    "woman_detective_medium-dark_skin_tone": "🕵🏾\u200d♀️",
+2462	    "woman_detective_medium-light_skin_tone": "🕵🏼\u200d♀️",
+2463	    "woman_detective_medium_skin_tone": "🕵🏽\u200d♀️",
+2464	    "woman_elf": "🧝\u200d♀️",
+2465	    "woman_elf_dark_skin_tone": "🧝🏿\u200d♀️",
+2466	    "woman_elf_light_skin_tone": "🧝🏻\u200d♀️",
+2467	    "woman_elf_medium-dark_skin_tone": "🧝🏾\u200d♀️",
+2468	    "woman_elf_medium-light_skin_tone": "🧝🏼\u200d♀️",
+2469	    "woman_elf_medium_skin_tone": "🧝🏽\u200d♀️",
+2470	    "woman_facepalming": "🤦\u200d♀️",
+2471	    "woman_facepalming_dark_skin_tone": "🤦🏿\u200d♀️",
+2472	    "woman_facepalming_light_skin_tone": "🤦🏻\u200d♀️",
+2473	    "woman_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♀️",
+2474	    "woman_facepalming_medium-light_skin_tone": "🤦🏼\u200d♀️",
+2475	    "woman_facepalming_medium_skin_tone": "🤦🏽\u200d♀️",
+2476	    "woman_factory_worker": "👩\u200d🏭",
+2477	    "woman_factory_worker_dark_skin_tone": "👩🏿\u200d🏭",
+2478	    "woman_factory_worker_light_skin_tone": "👩🏻\u200d🏭",
+2479	    "woman_factory_worker_medium-dark_skin_tone": "👩🏾\u200d🏭",
+2480	    "woman_factory_worker_medium-light_skin_tone": "👩🏼\u200d🏭",
+2481	    "woman_factory_worker_medium_skin_tone": "👩🏽\u200d🏭",
+2482	    "woman_fairy": "🧚\u200d♀️",
+2483	    "woman_fairy_dark_skin_tone": "🧚🏿\u200d♀️",
+2484	    "woman_fairy_light_skin_tone": "🧚🏻\u200d♀️",
+2485	    "woman_fairy_medium-dark_skin_tone": "🧚🏾\u200d♀️",
+2486	    "woman_fairy_medium-light_skin_tone": "🧚🏼\u200d♀️",
+2487	    "woman_fairy_medium_skin_tone": "🧚🏽\u200d♀️",
+2488	    "woman_farmer": "👩\u200d🌾",
+2489	    "woman_farmer_dark_skin_tone": "👩🏿\u200d🌾",
+2490	    "woman_farmer_light_skin_tone": "👩🏻\u200d🌾",
+2491	    "woman_farmer_medium-dark_skin_tone": "👩🏾\u200d🌾",
+2492	    "woman_farmer_medium-light_skin_tone": "👩🏼\u200d🌾",
+2493	    "woman_farmer_medium_skin_tone": "👩🏽\u200d🌾",
+2494	    "woman_firefighter": "👩\u200d🚒",
+2495	    "woman_firefighter_dark_skin_tone": "👩🏿\u200d🚒",
+2496	    "woman_firefighter_light_skin_tone": "👩🏻\u200d🚒",
+2497	    "woman_firefighter_medium-dark_skin_tone": "👩🏾\u200d🚒",
+2498	    "woman_firefighter_medium-light_skin_tone": "👩🏼\u200d🚒",
+2499	    "woman_firefighter_medium_skin_tone": "👩🏽\u200d🚒",
+2500	    "woman_frowning": "🙍\u200d♀️",
+2501	    "woman_frowning_dark_skin_tone": "🙍🏿\u200d♀️",
+2502	    "woman_frowning_light_skin_tone": "🙍🏻\u200d♀️",
+2503	    "woman_frowning_medium-dark_skin_tone": "🙍🏾\u200d♀️",
+2504	    "woman_frowning_medium-light_skin_tone": "🙍🏼\u200d♀️",
+2505	    "woman_frowning_medium_skin_tone": "🙍🏽\u200d♀️",
+2506	    "woman_genie": "🧞\u200d♀️",
+2507	    "woman_gesturing_no": "🙅\u200d♀️",
+2508	    "woman_gesturing_no_dark_skin_tone": "🙅🏿\u200d♀️",
+2509	    "woman_gesturing_no_light_skin_tone": "🙅🏻\u200d♀️",
+2510	    "woman_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♀️",
+2511	    "woman_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♀️",
+2512	    "woman_gesturing_no_medium_skin_tone": "🙅🏽\u200d♀️",
+2513	    "woman_gesturing_ok": "🙆\u200d♀️",
+2514	    "woman_gesturing_ok_dark_skin_tone": "🙆🏿\u200d♀️",
+2515	    "woman_gesturing_ok_light_skin_tone": "🙆🏻\u200d♀️",
+2516	    "woman_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♀️",
+2517	    "woman_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♀️",
+2518	    "woman_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♀️",
+2519	    "woman_getting_haircut": "💇\u200d♀️",
+2520	    "woman_getting_haircut_dark_skin_tone": "💇🏿\u200d♀️",
+2521	    "woman_getting_haircut_light_skin_tone": "💇🏻\u200d♀️",
+2522	    "woman_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♀️",
+2523	    "woman_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♀️",
+2524	    "woman_getting_haircut_medium_skin_tone": "💇🏽\u200d♀️",
+2525	    "woman_getting_massage": "💆\u200d♀️",
+2526	    "woman_getting_massage_dark_skin_tone": "💆🏿\u200d♀️",
+2527	    "woman_getting_massage_light_skin_tone": "💆🏻\u200d♀️",
+2528	    "woman_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♀️",
+2529	    "woman_getting_massage_medium-light_skin_tone": "💆🏼\u200d♀️",
+2530	    "woman_getting_massage_medium_skin_tone": "💆🏽\u200d♀️",
+2531	    "woman_golfing": "🏌️\u200d♀️",
+2532	    "woman_golfing_dark_skin_tone": "🏌🏿\u200d♀️",
+2533	    "woman_golfing_light_skin_tone": "🏌🏻\u200d♀️",
+2534	    "woman_golfing_medium-dark_skin_tone": "🏌🏾\u200d♀️",
+2535	    "woman_golfing_medium-light_skin_tone": "🏌🏼\u200d♀️",
+2536	    "woman_golfing_medium_skin_tone": "🏌🏽\u200d♀️",
+2537	    "woman_guard": "💂\u200d♀️",
+2538	    "woman_guard_dark_skin_tone": "💂🏿\u200d♀️",
+2539	    "woman_guard_light_skin_tone": "💂🏻\u200d♀️",
+2540	    "woman_guard_medium-dark_skin_tone": "💂🏾\u200d♀️",
+2541	    "woman_guard_medium-light_skin_tone": "💂🏼\u200d♀️",
+2542	    "woman_guard_medium_skin_tone": "💂🏽\u200d♀️",
+2543	    "woman_health_worker": "👩\u200d⚕️",
+2544	    "woman_health_worker_dark_skin_tone": "👩🏿\u200d⚕️",
+2545	    "woman_health_worker_light_skin_tone": "👩🏻\u200d⚕️",
+2546	    "woman_health_worker_medium-dark_skin_tone": "👩🏾\u200d⚕️",
+2547	    "woman_health_worker_medium-light_skin_tone": "👩🏼\u200d⚕️",
+2548	    "woman_health_worker_medium_skin_tone": "👩🏽\u200d⚕️",
+2549	    "woman_in_lotus_position": "🧘\u200d♀️",
+2550	    "woman_in_lotus_position_dark_skin_tone": "🧘🏿\u200d♀️",
+2551	    "woman_in_lotus_position_light_skin_tone": "🧘🏻\u200d♀️",
+2552	    "woman_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♀️",
+2553	    "woman_in_lotus_position_medium-light_skin_tone": "🧘🏼\u200d♀️",
+2554	    "woman_in_lotus_position_medium_skin_tone": "🧘🏽\u200d♀️",
+2555	    "woman_in_manual_wheelchair": "👩\u200d🦽",
+2556	    "woman_in_motorized_wheelchair": "👩\u200d🦼",
+2557	    "woman_in_steamy_room": "🧖\u200d♀️",
+2558	    "woman_in_steamy_room_dark_skin_tone": "🧖🏿\u200d♀️",
+2559	    "woman_in_steamy_room_light_skin_tone": "🧖🏻\u200d♀️",
+2560	    "woman_in_steamy_room_medium-dark_skin_tone": "🧖🏾\u200d♀️",
+2561	    "woman_in_steamy_room_medium-light_skin_tone": "🧖🏼\u200d♀️",
+2562	    "woman_in_steamy_room_medium_skin_tone": "🧖🏽\u200d♀️",
+2563	    "woman_judge": "👩\u200d⚖️",
+2564	    "woman_judge_dark_skin_tone": "👩🏿\u200d⚖️",
+2565	    "woman_judge_light_skin_tone": "👩🏻\u200d⚖️",
+2566	    "woman_judge_medium-dark_skin_tone": "👩🏾\u200d⚖️",
+2567	    "woman_judge_medium-light_skin_tone": "👩🏼\u200d⚖️",
+2568	    "woman_judge_medium_skin_tone": "👩🏽\u200d⚖️",
+2569	    "woman_juggling": "🤹\u200d♀️",
+2570	    "woman_juggling_dark_skin_tone": "🤹🏿\u200d♀️",
+2571	    "woman_juggling_light_skin_tone": "🤹🏻\u200d♀️",
+2572	    "woman_juggling_medium-dark_skin_tone": "🤹🏾\u200d♀️",
+2573	    "woman_juggling_medium-light_skin_tone": "🤹🏼\u200d♀️",
+2574	    "woman_juggling_medium_skin_tone": "🤹🏽\u200d♀️",
+2575	    "woman_lifting_weights": "🏋️\u200d♀️",
+2576	    "woman_lifting_weights_dark_skin_tone": "🏋🏿\u200d♀️",
+2577	    "woman_lifting_weights_light_skin_tone": "🏋🏻\u200d♀️",
+2578	    "woman_lifting_weights_medium-dark_skin_tone": "🏋🏾\u200d♀️",
+2579	    "woman_lifting_weights_medium-light_skin_tone": "🏋🏼\u200d♀️",
+2580	    "woman_lifting_weights_medium_skin_tone": "🏋🏽\u200d♀️",
+2581	    "woman_light_skin_tone": "👩🏻",
+2582	    "woman_mage": "🧙\u200d♀️",
+2583	    "woman_mage_dark_skin_tone": "🧙🏿\u200d♀️",
+2584	    "woman_mage_light_skin_tone": "🧙🏻\u200d♀️",
+2585	    "woman_mage_medium-dark_skin_tone": "🧙🏾\u200d♀️",
+2586	    "woman_mage_medium-light_skin_tone": "🧙🏼\u200d♀️",
+2587	    "woman_mage_medium_skin_tone": "🧙🏽\u200d♀️",
+2588	    "woman_mechanic": "👩\u200d🔧",
+2589	    "woman_mechanic_dark_skin_tone": "👩🏿\u200d🔧",
+2590	    "woman_mechanic_light_skin_tone": "👩🏻\u200d🔧",
+2591	    "woman_mechanic_medium-dark_skin_tone": "👩🏾\u200d🔧",
+2592	    "woman_mechanic_medium-light_skin_tone": "👩🏼\u200d🔧",
+2593	    "woman_mechanic_medium_skin_tone": "👩🏽\u200d🔧",
+2594	    "woman_medium-dark_skin_tone": "👩🏾",
+2595	    "woman_medium-light_skin_tone": "👩🏼",
+2596	    "woman_medium_skin_tone": "👩🏽",
+2597	    "woman_mountain_biking": "🚵\u200d♀️",
+2598	    "woman_mountain_biking_dark_skin_tone": "🚵🏿\u200d♀️",
+2599	    "woman_mountain_biking_light_skin_tone": "🚵🏻\u200d♀️",
+2600	    "woman_mountain_biking_medium-dark_skin_tone": "🚵🏾\u200d♀️",
+2601	    "woman_mountain_biking_medium-light_skin_tone": "🚵🏼\u200d♀️",
+2602	    "woman_mountain_biking_medium_skin_tone": "🚵🏽\u200d♀️",
+2603	    "woman_office_worker": "👩\u200d💼",
+2604	    "woman_office_worker_dark_skin_tone": "👩🏿\u200d💼",
+2605	    "woman_office_worker_light_skin_tone": "👩🏻\u200d💼",
+2606	    "woman_office_worker_medium-dark_skin_tone": "👩🏾\u200d💼",
+2607	    "woman_office_worker_medium-light_skin_tone": "👩🏼\u200d💼",
+2608	    "woman_office_worker_medium_skin_tone": "👩🏽\u200d💼",
+2609	    "woman_pilot": "👩\u200d✈️",
+2610	    "woman_pilot_dark_skin_tone": "👩🏿\u200d✈️",
+2611	    "woman_pilot_light_skin_tone": "👩🏻\u200d✈️",
+2612	    "woman_pilot_medium-dark_skin_tone": "👩🏾\u200d✈️",
+2613	    "woman_pilot_medium-light_skin_tone": "👩🏼\u200d✈️",
+2614	    "woman_pilot_medium_skin_tone": "👩🏽\u200d✈️",
+2615	    "woman_playing_handball": "🤾\u200d♀️",
+2616	    "woman_playing_handball_dark_skin_tone": "🤾🏿\u200d♀️",
+2617	    "woman_playing_handball_light_skin_tone": "🤾🏻\u200d♀️",
+2618	    "woman_playing_handball_medium-dark_skin_tone": "🤾🏾\u200d♀️",
+2619	    "woman_playing_handball_medium-light_skin_tone": "🤾🏼\u200d♀️",
+2620	    "woman_playing_handball_medium_skin_tone": "🤾🏽\u200d♀️",
+2621	    "woman_playing_water_polo": "🤽\u200d♀️",
+2622	    "woman_playing_water_polo_dark_skin_tone": "🤽🏿\u200d♀️",
+2623	    "woman_playing_water_polo_light_skin_tone": "🤽🏻\u200d♀️",
+2624	    "woman_playing_water_polo_medium-dark_skin_tone": "🤽🏾\u200d♀️",
+2625	    "woman_playing_water_polo_medium-light_skin_tone": "🤽🏼\u200d♀️",
+2626	    "woman_playing_water_polo_medium_skin_tone": "🤽🏽\u200d♀️",
+2627	    "woman_police_officer": "👮\u200d♀️",
+2628	    "woman_police_officer_dark_skin_tone": "👮🏿\u200d♀️",
+2629	    "woman_police_officer_light_skin_tone": "👮🏻\u200d♀️",
+2630	    "woman_police_officer_medium-dark_skin_tone": "👮🏾\u200d♀️",
+2631	    "woman_police_officer_medium-light_skin_tone": "👮🏼\u200d♀️",
+2632	    "woman_police_officer_medium_skin_tone": "👮🏽\u200d♀️",
+2633	    "woman_pouting": "🙎\u200d♀️",
+2634	    "woman_pouting_dark_skin_tone": "🙎🏿\u200d♀️",
+2635	    "woman_pouting_light_skin_tone": "🙎🏻\u200d♀️",
+2636	    "woman_pouting_medium-dark_skin_tone": "🙎🏾\u200d♀️",
+2637	    "woman_pouting_medium-light_skin_tone": "🙎🏼\u200d♀️",
+2638	    "woman_pouting_medium_skin_tone": "🙎🏽\u200d♀️",
+2639	    "woman_raising_hand": "🙋\u200d♀️",
+2640	    "woman_raising_hand_dark_skin_tone": "🙋🏿\u200d♀️",
+2641	    "woman_raising_hand_light_skin_tone": "🙋🏻\u200d♀️",
+2642	    "woman_raising_hand_medium-dark_skin_tone": "🙋🏾\u200d♀️",
+2643	    "woman_raising_hand_medium-light_skin_tone": "🙋🏼\u200d♀️",
+2644	    "woman_raising_hand_medium_skin_tone": "🙋🏽\u200d♀️",
+2645	    "woman_rowing_boat": "🚣\u200d♀️",
+2646	    "woman_rowing_boat_dark_skin_tone": "🚣🏿\u200d♀️",
+2647	    "woman_rowing_boat_light_skin_tone": "🚣🏻\u200d♀️",
+2648	    "woman_rowing_boat_medium-dark_skin_tone": "🚣🏾\u200d♀️",
+2649	    "woman_rowing_boat_medium-light_skin_tone": "🚣🏼\u200d♀️",
+2650	    "woman_rowing_boat_medium_skin_tone": "🚣🏽\u200d♀️",
+2651	    "woman_running": "🏃\u200d♀️",
+2652	    "woman_running_dark_skin_tone": "🏃🏿\u200d♀️",
+2653	    "woman_running_light_skin_tone": "🏃🏻\u200d♀️",
+2654	    "woman_running_medium-dark_skin_tone": "🏃🏾\u200d♀️",
+2655	    "woman_running_medium-light_skin_tone": "🏃🏼\u200d♀️",
+2656	    "woman_running_medium_skin_tone": "🏃🏽\u200d♀️",
+2657	    "woman_scientist": "👩\u200d🔬",
+2658	    "woman_scientist_dark_skin_tone": "👩🏿\u200d🔬",
+2659	    "woman_scientist_light_skin_tone": "👩🏻\u200d🔬",
+2660	    "woman_scientist_medium-dark_skin_tone": "👩🏾\u200d🔬",
+2661	    "woman_scientist_medium-light_skin_tone": "👩🏼\u200d🔬",
+2662	    "woman_scientist_medium_skin_tone": "👩🏽\u200d🔬",
+2663	    "woman_shrugging": "🤷\u200d♀️",
+2664	    "woman_shrugging_dark_skin_tone": "🤷🏿\u200d♀️",
+2665	    "woman_shrugging_light_skin_tone": "🤷🏻\u200d♀️",
+2666	    "woman_shrugging_medium-dark_skin_tone": "🤷🏾\u200d♀️",
+2667	    "woman_shrugging_medium-light_skin_tone": "🤷🏼\u200d♀️",
+2668	    "woman_shrugging_medium_skin_tone": "🤷🏽\u200d♀️",
+2669	    "woman_singer": "👩\u200d🎤",
+2670	    "woman_singer_dark_skin_tone": "👩🏿\u200d🎤",
+2671	    "woman_singer_light_skin_tone": "👩🏻\u200d🎤",
+2672	    "woman_singer_medium-dark_skin_tone": "👩🏾\u200d🎤",
+2673	    "woman_singer_medium-light_skin_tone": "👩🏼\u200d🎤",
+2674	    "woman_singer_medium_skin_tone": "👩🏽\u200d🎤",
+2675	    "woman_student": "👩\u200d🎓",
+2676	    "woman_student_dark_skin_tone": "👩🏿\u200d🎓",
+2677	    "woman_student_light_skin_tone": "👩🏻\u200d🎓",
+2678	    "woman_student_medium-dark_skin_tone": "👩🏾\u200d🎓",
+2679	    "woman_student_medium-light_skin_tone": "👩🏼\u200d🎓",
+2680	    "woman_student_medium_skin_tone": "👩🏽\u200d🎓",
+2681	    "woman_surfing": "🏄\u200d♀️",
+2682	    "woman_surfing_dark_skin_tone": "🏄🏿\u200d♀️",
+2683	    "woman_surfing_light_skin_tone": "🏄🏻\u200d♀️",
+2684	    "woman_surfing_medium-dark_skin_tone": "🏄🏾\u200d♀️",
+2685	    "woman_surfing_medium-light_skin_tone": "🏄🏼\u200d♀️",
+2686	    "woman_surfing_medium_skin_tone": "🏄🏽\u200d♀️",
+2687	    "woman_swimming": "🏊\u200d♀️",
+2688	    "woman_swimming_dark_skin_tone": "🏊🏿\u200d♀️",
+2689	    "woman_swimming_light_skin_tone": "🏊🏻\u200d♀️",
+2690	    "woman_swimming_medium-dark_skin_tone": "🏊🏾\u200d♀️",
+2691	    "woman_swimming_medium-light_skin_tone": "🏊🏼\u200d♀️",
+2692	    "woman_swimming_medium_skin_tone": "🏊🏽\u200d♀️",
+2693	    "woman_teacher": "👩\u200d🏫",
+2694	    "woman_teacher_dark_skin_tone": "👩🏿\u200d🏫",
+2695	    "woman_teacher_light_skin_tone": "👩🏻\u200d🏫",
+2696	    "woman_teacher_medium-dark_skin_tone": "👩🏾\u200d🏫",
+2697	    "woman_teacher_medium-light_skin_tone": "👩🏼\u200d🏫",
+2698	    "woman_teacher_medium_skin_tone": "👩🏽\u200d🏫",
+2699	    "woman_technologist": "👩\u200d💻",
+2700	    "woman_technologist_dark_skin_tone": "👩🏿\u200d💻",
+2701	    "woman_technologist_light_skin_tone": "👩🏻\u200d💻",
+2702	    "woman_technologist_medium-dark_skin_tone": "👩🏾\u200d💻",
+2703	    "woman_technologist_medium-light_skin_tone": "👩🏼\u200d💻",
+2704	    "woman_technologist_medium_skin_tone": "👩🏽\u200d💻",
+2705	    "woman_tipping_hand": "💁\u200d♀️",
+2706	    "woman_tipping_hand_dark_skin_tone": "💁🏿\u200d♀️",
+2707	    "woman_tipping_hand_light_skin_tone": "💁🏻\u200d♀️",
+2708	    "woman_tipping_hand_medium-dark_skin_tone": "💁🏾\u200d♀️",
+2709	    "woman_tipping_hand_medium-light_skin_tone": "💁🏼\u200d♀️",
+2710	    "woman_tipping_hand_medium_skin_tone": "💁🏽\u200d♀️",
+2711	    "woman_vampire": "🧛\u200d♀️",
+2712	    "woman_vampire_dark_skin_tone": "🧛🏿\u200d♀️",
+2713	    "woman_vampire_light_skin_tone": "🧛🏻\u200d♀️",
+2714	    "woman_vampire_medium-dark_skin_tone": "🧛🏾\u200d♀️",
+2715	    "woman_vampire_medium-light_skin_tone": "🧛🏼\u200d♀️",
+2716	    "woman_vampire_medium_skin_tone": "🧛🏽\u200d♀️",
+2717	    "woman_walking": "🚶\u200d♀️",
+2718	    "woman_walking_dark_skin_tone": "🚶🏿\u200d♀️",
+2719	    "woman_walking_light_skin_tone": "🚶🏻\u200d♀️",
+2720	    "woman_walking_medium-dark_skin_tone": "🚶🏾\u200d♀️",
+2721	    "woman_walking_medium-light_skin_tone": "🚶🏼\u200d♀️",
+2722	    "woman_walking_medium_skin_tone": "🚶🏽\u200d♀️",
+2723	    "woman_wearing_turban": "👳\u200d♀️",
+2724	    "woman_wearing_turban_dark_skin_tone": "👳🏿\u200d♀️",
+2725	    "woman_wearing_turban_light_skin_tone": "👳🏻\u200d♀️",
+2726	    "woman_wearing_turban_medium-dark_skin_tone": "👳🏾\u200d♀️",
+2727	    "woman_wearing_turban_medium-light_skin_tone": "👳🏼\u200d♀️",
+2728	    "woman_wearing_turban_medium_skin_tone": "👳🏽\u200d♀️",
+2729	    "woman_with_headscarf": "🧕",
+2730	    "woman_with_headscarf_dark_skin_tone": "🧕🏿",
+2731	    "woman_with_headscarf_light_skin_tone": "🧕🏻",
+2732	    "woman_with_headscarf_medium-dark_skin_tone": "🧕🏾",
+2733	    "woman_with_headscarf_medium-light_skin_tone": "🧕🏼",
+2734	    "woman_with_headscarf_medium_skin_tone": "🧕🏽",
+2735	    "woman_with_probing_cane": "👩\u200d🦯",
+2736	    "woman_zombie": "🧟\u200d♀️",
+2737	    "woman’s_boot": "👢",
+2738	    "woman’s_clothes": "👚",
+2739	    "woman’s_hat": "👒",
+2740	    "woman’s_sandal": "👡",
+2741	    "women_with_bunny_ears": "👯\u200d♀️",
+2742	    "women_wrestling": "🤼\u200d♀️",
+2743	    "women’s_room": "🚺",
+2744	    "woozy_face": "🥴",
+2745	    "world_map": "🗺",
+2746	    "worried_face": "😟",
+2747	    "wrapped_gift": "🎁",
+2748	    "wrench": "🔧",
+2749	    "writing_hand": "✍",
+2750	    "writing_hand_dark_skin_tone": "✍🏿",
+2751	    "writing_hand_light_skin_tone": "✍🏻",
+2752	    "writing_hand_medium-dark_skin_tone": "✍🏾",
+2753	    "writing_hand_medium-light_skin_tone": "✍🏼",
+2754	    "writing_hand_medium_skin_tone": "✍🏽",
+2755	    "yarn": "🧶",
+2756	    "yawning_face": "🥱",
+2757	    "yellow_circle": "🟡",
+2758	    "yellow_heart": "💛",
+2759	    "yellow_square": "🟨",
+2760	    "yen_banknote": "💴",
+2761	    "yo-yo": "🪀",
+2762	    "yin_yang": "☯",
+2763	    "zany_face": "🤪",
+2764	    "zebra": "🦓",
+2765	    "zipper-mouth_face": "🤐",
+2766	    "zombie": "🧟",
+2767	    "zzz": "💤",
+2768	    "åland_islands": "🇦🇽",
+2769	    "keycap_asterisk": "*⃣",
+2770	    "keycap_digit_eight": "8⃣",
+2771	    "keycap_digit_five": "5⃣",
+2772	    "keycap_digit_four": "4⃣",
+2773	    "keycap_digit_nine": "9⃣",
+2774	    "keycap_digit_one": "1⃣",
+2775	    "keycap_digit_seven": "7⃣",
+2776	    "keycap_digit_six": "6⃣",
+2777	    "keycap_digit_three": "3⃣",
+2778	    "keycap_digit_two": "2⃣",
+2779	    "keycap_digit_zero": "0⃣",
+2780	    "keycap_number_sign": "#⃣",
+2781	    "light_skin_tone": "🏻",
+2782	    "medium_light_skin_tone": "🏼",
+2783	    "medium_skin_tone": "🏽",
+2784	    "medium_dark_skin_tone": "🏾",
+2785	    "dark_skin_tone": "🏿",
+2786	    "regional_indicator_symbol_letter_a": "🇦",
+2787	    "regional_indicator_symbol_letter_b": "🇧",
+2788	    "regional_indicator_symbol_letter_c": "🇨",
+2789	    "regional_indicator_symbol_letter_d": "🇩",
+2790	    "regional_indicator_symbol_letter_e": "🇪",
+2791	    "regional_indicator_symbol_letter_f": "🇫",
+2792	    "regional_indicator_symbol_letter_g": "🇬",
+2793	    "regional_indicator_symbol_letter_h": "🇭",
+2794	    "regional_indicator_symbol_letter_i": "🇮",
+2795	    "regional_indicator_symbol_letter_j": "🇯",
+2796	    "regional_indicator_symbol_letter_k": "🇰",
+2797	    "regional_indicator_symbol_letter_l": "🇱",
+2798	    "regional_indicator_symbol_letter_m": "🇲",
+2799	    "regional_indicator_symbol_letter_n": "🇳",
+2800	    "regional_indicator_symbol_letter_o": "🇴",
+2801	    "regional_indicator_symbol_letter_p": "🇵",
+2802	    "regional_indicator_symbol_letter_q": "🇶",
+2803	    "regional_indicator_symbol_letter_r": "🇷",
+2804	    "regional_indicator_symbol_letter_s": "🇸",
+2805	    "regional_indicator_symbol_letter_t": "🇹",
+2806	    "regional_indicator_symbol_letter_u": "🇺",
+2807	    "regional_indicator_symbol_letter_v": "🇻",
+2808	    "regional_indicator_symbol_letter_w": "🇼",
+2809	    "regional_indicator_symbol_letter_x": "🇽",
+2810	    "regional_indicator_symbol_letter_y": "🇾",
+2811	    "regional_indicator_symbol_letter_z": "🇿",
+2812	    "airplane_arriving": "🛬",
+2813	    "space_invader": "👾",
+2814	    "football": "🏈",
+2815	    "anger": "💢",
+2816	    "angry": "😠",
+2817	    "anguished": "😧",
+2818	    "signal_strength": "📶",
+2819	    "arrows_counterclockwise": "🔄",
+2820	    "arrow_heading_down": "⤵",
+2821	    "arrow_heading_up": "⤴",
+2822	    "art": "🎨",
+2823	    "astonished": "😲",
+2824	    "athletic_shoe": "👟",
+2825	    "atm": "🏧",
+2826	    "car": "🚗",
+2827	    "red_car": "🚗",
+2828	    "angel": "👼",
+2829	    "back": "🔙",
+2830	    "badminton_racquet_and_shuttlecock": "🏸",
+2831	    "dollar": "💵",
+2832	    "euro": "💶",
+2833	    "pound": "💷",
+2834	    "yen": "💴",
+2835	    "barber": "💈",
+2836	    "bath": "🛀",
+2837	    "bear": "🐻",
+2838	    "heartbeat": "💓",
+2839	    "beer": "🍺",
+2840	    "no_bell": "🔕",
+2841	    "bento": "🍱",
+2842	    "bike": "🚲",
+2843	    "bicyclist": "🚴",
+2844	    "8ball": "🎱",
+2845	    "biohazard_sign": "☣",
+2846	    "birthday": "🎂",
+2847	    "black_circle_for_record": "⏺",
+2848	    "clubs": "♣",
+2849	    "diamonds": "♦",
+2850	    "arrow_double_down": "⏬",
+2851	    "hearts": "♥",
+2852	    "rewind": "⏪",
+2853	    "black_left__pointing_double_triangle_with_vertical_bar": "⏮",
+2854	    "arrow_backward": "◀",
+2855	    "black_medium_small_square": "◾",
+2856	    "question": "❓",
+2857	    "fast_forward": "⏩",
+2858	    "black_right__pointing_double_triangle_with_vertical_bar": "⏭",
+2859	    "arrow_forward": "▶",
+2860	    "black_right__pointing_triangle_with_double_vertical_bar": "⏯",
+2861	    "arrow_right": "➡",
+2862	    "spades": "♠",
+2863	    "black_square_for_stop": "⏹",
+2864	    "sunny": "☀",
+2865	    "phone": "☎",
+2866	    "recycle": "♻",
+2867	    "arrow_double_up": "⏫",
+2868	    "busstop": "🚏",
+2869	    "date": "📅",
+2870	    "flags": "🎏",
+2871	    "cat2": "🐈",
+2872	    "joy_cat": "😹",
+2873	    "smirk_cat": "😼",
+2874	    "chart_with_downwards_trend": "📉",
+2875	    "chart_with_upwards_trend": "📈",
+2876	    "chart": "💹",
+2877	    "mega": "📣",
+2878	    "checkered_flag": "🏁",
+2879	    "accept": "🉑",
+2880	    "ideograph_advantage": "🉐",
+2881	    "congratulations": "㊗",
+2882	    "secret": "㊙",
+2883	    "m": "Ⓜ",
+2884	    "city_sunset": "🌆",
+2885	    "clapper": "🎬",
+2886	    "clap": "👏",
+2887	    "beers": "🍻",
+2888	    "clock830": "🕣",
+2889	    "clock8": "🕗",
+2890	    "clock1130": "🕦",
+2891	    "clock11": "🕚",
+2892	    "clock530": "🕠",
+2893	    "clock5": "🕔",
+2894	    "clock430": "🕟",
+2895	    "clock4": "🕓",
+2896	    "clock930": "🕤",
+2897	    "clock9": "🕘",
+2898	    "clock130": "🕜",
+2899	    "clock1": "🕐",
+2900	    "clock730": "🕢",
+2901	    "clock7": "🕖",
+2902	    "clock630": "🕡",
+2903	    "clock6": "🕕",
+2904	    "clock1030": "🕥",
+2905	    "clock10": "🕙",
+2906	    "clock330": "🕞",
+2907	    "clock3": "🕒",
+2908	    "clock1230": "🕧",
+2909	    "clock12": "🕛",
+2910	    "clock230": "🕝",
+2911	    "clock2": "🕑",
+2912	    "arrows_clockwise": "🔃",
+2913	    "repeat": "🔁",
+2914	    "repeat_one": "🔂",
+2915	    "closed_lock_with_key": "🔐",
+2916	    "mailbox_closed": "📪",
+2917	    "mailbox": "📫",
+2918	    "cloud_with_tornado": "🌪",
+2919	    "cocktail": "🍸",
+2920	    "boom": "💥",
+2921	    "compression": "🗜",
+2922	    "confounded": "😖",
+2923	    "confused": "😕",
+2924	    "rice": "🍚",
+2925	    "cow2": "🐄",
+2926	    "cricket_bat_and_ball": "🏏",
+2927	    "x": "❌",
+2928	    "cry": "😢",
+2929	    "curry": "🍛",
+2930	    "dagger_knife": "🗡",
+2931	    "dancer": "💃",
+2932	    "dark_sunglasses": "🕶",
+2933	    "dash": "💨",
+2934	    "truck": "🚚",
+2935	    "derelict_house_building": "🏚",
+2936	    "diamond_shape_with_a_dot_inside": "💠",
+2937	    "dart": "🎯",
+2938	    "disappointed_relieved": "😥",
+2939	    "disappointed": "😞",
+2940	    "do_not_litter": "🚯",
+2941	    "dog2": "🐕",
+2942	    "flipper": "🐬",
+2943	    "loop": "➿",
+2944	    "bangbang": "‼",
+2945	    "double_vertical_bar": "⏸",
+2946	    "dove_of_peace": "🕊",
+2947	    "small_red_triangle_down": "🔻",
+2948	    "arrow_down_small": "🔽",
+2949	    "arrow_down": "⬇",
+2950	    "dromedary_camel": "🐪",
+2951	    "e__mail": "📧",
+2952	    "corn": "🌽",
+2953	    "ear_of_rice": "🌾",
+2954	    "earth_americas": "🌎",
+2955	    "earth_asia": "🌏",
+2956	    "earth_africa": "🌍",
+2957	    "eight_pointed_black_star": "✴",
+2958	    "eight_spoked_asterisk": "✳",
+2959	    "eject_symbol": "⏏",
+2960	    "bulb": "💡",
+2961	    "emoji_modifier_fitzpatrick_type__1__2": "🏻",
+2962	    "emoji_modifier_fitzpatrick_type__3": "🏼",
+2963	    "emoji_modifier_fitzpatrick_type__4": "🏽",
+2964	    "emoji_modifier_fitzpatrick_type__5": "🏾",
+2965	    "emoji_modifier_fitzpatrick_type__6": "🏿",
+2966	    "end": "🔚",
+2967	    "email": "✉",
+2968	    "european_castle": "🏰",
+2969	    "european_post_office": "🏤",
+2970	    "interrobang": "⁉",
+2971	    "expressionless": "😑",
+2972	    "eyeglasses": "👓",
+2973	    "massage": "💆",
+2974	    "yum": "😋",
+2975	    "scream": "😱",
+2976	    "kissing_heart": "😘",
+2977	    "sweat": "😓",
+2978	    "face_with_head__bandage": "🤕",
+2979	    "triumph": "😤",
+2980	    "mask": "😷",
+2981	    "no_good": "🙅",
+2982	    "ok_woman": "🙆",
+2983	    "open_mouth": "😮",
+2984	    "cold_sweat": "😰",
+2985	    "stuck_out_tongue": "😛",
+2986	    "stuck_out_tongue_closed_eyes": "😝",
+2987	    "stuck_out_tongue_winking_eye": "😜",
+2988	    "joy": "😂",
+2989	    "no_mouth": "😶",
+2990	    "santa": "🎅",
+2991	    "fax": "📠",
+2992	    "fearful": "😨",
+2993	    "field_hockey_stick_and_ball": "🏑",
+2994	    "first_quarter_moon_with_face": "🌛",
+2995	    "fish_cake": "🍥",
+2996	    "fishing_pole_and_fish": "🎣",
+2997	    "facepunch": "👊",
+2998	    "punch": "👊",
+2999	    "flag_for_afghanistan": "🇦🇫",
+3000	    "flag_for_albania": "🇦🇱",
+3001	    "flag_for_algeria": "🇩🇿",
+3002	    "flag_for_american_samoa": "🇦🇸",
+3003	    "flag_for_andorra": "🇦🇩",
+3004	    "flag_for_angola": "🇦🇴",
+3005	    "flag_for_anguilla": "🇦🇮",
+3006	    "flag_for_antarctica": "🇦🇶",
+3007	    "flag_for_antigua_&_barbuda": "🇦🇬",
+3008	    "flag_for_argentina": "🇦🇷",
+3009	    "flag_for_armenia": "🇦🇲",
+3010	    "flag_for_aruba": "🇦🇼",
+3011	    "flag_for_ascension_island": "🇦🇨",
+3012	    "flag_for_australia": "🇦🇺",
+3013	    "flag_for_austria": "🇦🇹",
+3014	    "flag_for_azerbaijan": "🇦🇿",
+3015	    "flag_for_bahamas": "🇧🇸",
+3016	    "flag_for_bahrain": "🇧🇭",
+3017	    "flag_for_bangladesh": "🇧🇩",
+3018	    "flag_for_barbados": "🇧🇧",
+3019	    "flag_for_belarus": "🇧🇾",
+3020	    "flag_for_belgium": "🇧🇪",
+3021	    "flag_for_belize": "🇧🇿",
+3022	    "flag_for_benin": "🇧🇯",
+3023	    "flag_for_bermuda": "🇧🇲",
+3024	    "flag_for_bhutan": "🇧🇹",
+3025	    "flag_for_bolivia": "🇧🇴",
+3026	    "flag_for_bosnia_&_herzegovina": "🇧🇦",
+3027	    "flag_for_botswana": "🇧🇼",
+3028	    "flag_for_bouvet_island": "🇧🇻",
+3029	    "flag_for_brazil": "🇧🇷",
+3030	    "flag_for_british_indian_ocean_territory": "🇮🇴",
+3031	    "flag_for_british_virgin_islands": "🇻🇬",
+3032	    "flag_for_brunei": "🇧🇳",
+3033	    "flag_for_bulgaria": "🇧🇬",
+3034	    "flag_for_burkina_faso": "🇧🇫",
+3035	    "flag_for_burundi": "🇧🇮",
+3036	    "flag_for_cambodia": "🇰🇭",
+3037	    "flag_for_cameroon": "🇨🇲",
+3038	    "flag_for_canada": "🇨🇦",
+3039	    "flag_for_canary_islands": "🇮🇨",
+3040	    "flag_for_cape_verde": "🇨🇻",
+3041	    "flag_for_caribbean_netherlands": "🇧🇶",
+3042	    "flag_for_cayman_islands": "🇰🇾",
+3043	    "flag_for_central_african_republic": "🇨🇫",
+3044	    "flag_for_ceuta_&_melilla": "🇪🇦",
+3045	    "flag_for_chad": "🇹🇩",
+3046	    "flag_for_chile": "🇨🇱",
+3047	    "flag_for_china": "🇨🇳",
+3048	    "flag_for_christmas_island": "🇨🇽",
+3049	    "flag_for_clipperton_island": "🇨🇵",
+3050	    "flag_for_cocos__islands": "🇨🇨",
+3051	    "flag_for_colombia": "🇨🇴",
+3052	    "flag_for_comoros": "🇰🇲",
+3053	    "flag_for_congo____brazzaville": "🇨🇬",
+3054	    "flag_for_congo____kinshasa": "🇨🇩",
+3055	    "flag_for_cook_islands": "🇨🇰",
+3056	    "flag_for_costa_rica": "🇨🇷",
+3057	    "flag_for_croatia": "🇭🇷",
+3058	    "flag_for_cuba": "🇨🇺",
+3059	    "flag_for_curaçao": "🇨🇼",
+3060	    "flag_for_cyprus": "🇨🇾",
+3061	    "flag_for_czech_republic": "🇨🇿",
+3062	    "flag_for_côte_d’ivoire": "🇨🇮",
+3063	    "flag_for_denmark": "🇩🇰",
+3064	    "flag_for_diego_garcia": "🇩🇬",
+3065	    "flag_for_djibouti": "🇩🇯",
+3066	    "flag_for_dominica": "🇩🇲",
+3067	    "flag_for_dominican_republic": "🇩🇴",
+3068	    "flag_for_ecuador": "🇪🇨",
+3069	    "flag_for_egypt": "🇪🇬",
+3070	    "flag_for_el_salvador": "🇸🇻",
+3071	    "flag_for_equatorial_guinea": "🇬🇶",
+3072	    "flag_for_eritrea": "🇪🇷",
+3073	    "flag_for_estonia": "🇪🇪",
+3074	    "flag_for_ethiopia": "🇪🇹",
+3075	    "flag_for_european_union": "🇪🇺",
+3076	    "flag_for_falkland_islands": "🇫🇰",
+3077	    "flag_for_faroe_islands": "🇫🇴",
+3078	    "flag_for_fiji": "🇫🇯",
+3079	    "flag_for_finland": "🇫🇮",
+3080	    "flag_for_france": "🇫🇷",
+3081	    "flag_for_french_guiana": "🇬🇫",
+3082	    "flag_for_french_polynesia": "🇵🇫",
+3083	    "flag_for_french_southern_territories": "🇹🇫",
+3084	    "flag_for_gabon": "🇬🇦",
+3085	    "flag_for_gambia": "🇬🇲",
+3086	    "flag_for_georgia": "🇬🇪",
+3087	    "flag_for_germany": "🇩🇪",
+3088	    "flag_for_ghana": "🇬🇭",
+3089	    "flag_for_gibraltar": "🇬🇮",
+3090	    "flag_for_greece": "🇬🇷",
+3091	    "flag_for_greenland": "🇬🇱",
+3092	    "flag_for_grenada": "🇬🇩",
+3093	    "flag_for_guadeloupe": "🇬🇵",
+3094	    "flag_for_guam": "🇬🇺",
+3095	    "flag_for_guatemala": "🇬🇹",
+3096	    "flag_for_guernsey": "🇬🇬",
+3097	    "flag_for_guinea": "🇬🇳",
+3098	    "flag_for_guinea__bissau": "🇬🇼",
+3099	    "flag_for_guyana": "🇬🇾",
+3100	    "flag_for_haiti": "🇭🇹",
+3101	    "flag_for_heard_&_mcdonald_islands": "🇭🇲",
+3102	    "flag_for_honduras": "🇭🇳",
+3103	    "flag_for_hong_kong": "🇭🇰",
+3104	    "flag_for_hungary": "🇭🇺",
+3105	    "flag_for_iceland": "🇮🇸",
+3106	    "flag_for_india": "🇮🇳",
+3107	    "flag_for_indonesia": "🇮🇩",
+3108	    "flag_for_iran": "🇮🇷",
+3109	    "flag_for_iraq": "🇮🇶",
+3110	    "flag_for_ireland": "🇮🇪",
+3111	    "flag_for_isle_of_man": "🇮🇲",
+3112	    "flag_for_israel": "🇮🇱",
+3113	    "flag_for_italy": "🇮🇹",
+3114	    "flag_for_jamaica": "🇯🇲",
+3115	    "flag_for_japan": "🇯🇵",
+3116	    "flag_for_jersey": "🇯🇪",
+3117	    "flag_for_jordan": "🇯🇴",
+3118	    "flag_for_kazakhstan": "🇰🇿",
+3119	    "flag_for_kenya": "🇰🇪",
+3120	    "flag_for_kiribati": "🇰🇮",
+3121	    "flag_for_kosovo": "🇽🇰",
+3122	    "flag_for_kuwait": "🇰🇼",
+3123	    "flag_for_kyrgyzstan": "🇰🇬",
+3124	    "flag_for_laos": "🇱🇦",
+3125	    "flag_for_latvia": "🇱🇻",
+3126	    "flag_for_lebanon": "🇱🇧",
+3127	    "flag_for_lesotho": "🇱🇸",
+3128	    "flag_for_liberia": "🇱🇷",
+3129	    "flag_for_libya": "🇱🇾",
+3130	    "flag_for_liechtenstein": "🇱🇮",
+3131	    "flag_for_lithuania": "🇱🇹",
+3132	    "flag_for_luxembourg": "🇱🇺",
+3133	    "flag_for_macau": "🇲🇴",
+3134	    "flag_for_macedonia": "🇲🇰",
+3135	    "flag_for_madagascar": "🇲🇬",
+3136	    "flag_for_malawi": "🇲🇼",
+3137	    "flag_for_malaysia": "🇲🇾",
+3138	    "flag_for_maldives": "🇲🇻",
+3139	    "flag_for_mali": "🇲🇱",
+3140	    "flag_for_malta": "🇲🇹",
+3141	    "flag_for_marshall_islands": "🇲🇭",
+3142	    "flag_for_martinique": "🇲🇶",
+3143	    "flag_for_mauritania": "🇲🇷",
+3144	    "flag_for_mauritius": "🇲🇺",
+3145	    "flag_for_mayotte": "🇾🇹",
+3146	    "flag_for_mexico": "🇲🇽",
+3147	    "flag_for_micronesia": "🇫🇲",
+3148	    "flag_for_moldova": "🇲🇩",
+3149	    "flag_for_monaco": "🇲🇨",
+3150	    "flag_for_mongolia": "🇲🇳",
+3151	    "flag_for_montenegro": "🇲🇪",
+3152	    "flag_for_montserrat": "🇲🇸",
+3153	    "flag_for_morocco": "🇲🇦",
+3154	    "flag_for_mozambique": "🇲🇿",
+3155	    "flag_for_myanmar": "🇲🇲",
+3156	    "flag_for_namibia": "🇳🇦",
+3157	    "flag_for_nauru": "🇳🇷",
+3158	    "flag_for_nepal": "🇳🇵",
+3159	    "flag_for_netherlands": "🇳🇱",
+3160	    "flag_for_new_caledonia": "🇳🇨",
+3161	    "flag_for_new_zealand": "🇳🇿",
+3162	    "flag_for_nicaragua": "🇳🇮",
+3163	    "flag_for_niger": "🇳🇪",
+3164	    "flag_for_nigeria": "🇳🇬",
+3165	    "flag_for_niue": "🇳🇺",
+3166	    "flag_for_norfolk_island": "🇳🇫",
+3167	    "flag_for_north_korea": "🇰🇵",
+3168	    "flag_for_northern_mariana_islands": "🇲🇵",
+3169	    "flag_for_norway": "🇳🇴",
+3170	    "flag_for_oman": "🇴🇲",
+3171	    "flag_for_pakistan": "🇵🇰",
+3172	    "flag_for_palau": "🇵🇼",
+3173	    "flag_for_palestinian_territories": "🇵🇸",
+3174	    "flag_for_panama": "🇵🇦",
+3175	    "flag_for_papua_new_guinea": "🇵🇬",
+3176	    "flag_for_paraguay": "🇵🇾",
+3177	    "flag_for_peru": "🇵🇪",
+3178	    "flag_for_philippines": "🇵🇭",
+3179	    "flag_for_pitcairn_islands": "🇵🇳",
+3180	    "flag_for_poland": "🇵🇱",
+3181	    "flag_for_portugal": "🇵🇹",
+3182	    "flag_for_puerto_rico": "🇵🇷",
+3183	    "flag_for_qatar": "🇶🇦",
+3184	    "flag_for_romania": "🇷🇴",
+3185	    "flag_for_russia": "🇷🇺",
+3186	    "flag_for_rwanda": "🇷🇼",
+3187	    "flag_for_réunion": "🇷🇪",
+3188	    "flag_for_samoa": "🇼🇸",
+3189	    "flag_for_san_marino": "🇸🇲",
+3190	    "flag_for_saudi_arabia": "🇸🇦",
+3191	    "flag_for_senegal": "🇸🇳",
+3192	    "flag_for_serbia": "🇷🇸",
+3193	    "flag_for_seychelles": "🇸🇨",
+3194	    "flag_for_sierra_leone": "🇸🇱",
+3195	    "flag_for_singapore": "🇸🇬",
+3196	    "flag_for_sint_maarten": "🇸🇽",
+3197	    "flag_for_slovakia": "🇸🇰",
+3198	    "flag_for_slovenia": "🇸🇮",
+3199	    "flag_for_solomon_islands": "🇸🇧",
+3200	    "flag_for_somalia": "🇸🇴",
+3201	    "flag_for_south_africa": "🇿🇦",
+3202	    "flag_for_south_georgia_&_south_sandwich_islands": "🇬🇸",
+3203	    "flag_for_south_korea": "🇰🇷",
+3204	    "flag_for_south_sudan": "🇸🇸",
+3205	    "flag_for_spain": "🇪🇸",
+3206	    "flag_for_sri_lanka": "🇱🇰",
+3207	    "flag_for_st._barthélemy": "🇧🇱",
+3208	    "flag_for_st._helena": "🇸🇭",
+3209	    "flag_for_st._kitts_&_nevis": "🇰🇳",
+3210	    "flag_for_st._lucia": "🇱🇨",
+3211	    "flag_for_st._martin": "🇲🇫",
+3212	    "flag_for_st._pierre_&_miquelon": "🇵🇲",
+3213	    "flag_for_st._vincent_&_grenadines": "🇻🇨",
+3214	    "flag_for_sudan": "🇸🇩",
+3215	    "flag_for_suriname": "🇸🇷",
+3216	    "flag_for_svalbard_&_jan_mayen": "🇸🇯",
+3217	    "flag_for_swaziland": "🇸🇿",
+3218	    "flag_for_sweden": "🇸🇪",
+3219	    "flag_for_switzerland": "🇨🇭",
+3220	    "flag_for_syria": "🇸🇾",
+3221	    "flag_for_são_tomé_&_príncipe": "🇸🇹",
+3222	    "flag_for_taiwan": "🇹🇼",
+3223	    "flag_for_tajikistan": "🇹🇯",
+3224	    "flag_for_tanzania": "🇹🇿",
+3225	    "flag_for_thailand": "🇹🇭",
+3226	    "flag_for_timor__leste": "🇹🇱",
+3227	    "flag_for_togo": "🇹🇬",
+3228	    "flag_for_tokelau": "🇹🇰",
+3229	    "flag_for_tonga": "🇹🇴",
+3230	    "flag_for_trinidad_&_tobago": "🇹🇹",
+3231	    "flag_for_tristan_da_cunha": "🇹🇦",
+3232	    "flag_for_tunisia": "🇹🇳",
+3233	    "flag_for_turkey": "🇹🇷",
+3234	    "flag_for_turkmenistan": "🇹🇲",
+3235	    "flag_for_turks_&_caicos_islands": "🇹🇨",
+3236	    "flag_for_tuvalu": "🇹🇻",
+3237	    "flag_for_u.s._outlying_islands": "🇺🇲",
+3238	    "flag_for_u.s._virgin_islands": "🇻🇮",
+3239	    "flag_for_uganda": "🇺🇬",
+3240	    "flag_for_ukraine": "🇺🇦",
+3241	    "flag_for_united_arab_emirates": "🇦🇪",
+3242	    "flag_for_united_kingdom": "🇬🇧",
+3243	    "flag_for_united_states": "🇺🇸",
+3244	    "flag_for_uruguay": "🇺🇾",
+3245	    "flag_for_uzbekistan": "🇺🇿",
+3246	    "flag_for_vanuatu": "🇻🇺",
+3247	    "flag_for_vatican_city": "🇻🇦",
+3248	    "flag_for_venezuela": "🇻🇪",
+3249	    "flag_for_vietnam": "🇻🇳",
+3250	    "flag_for_wallis_&_futuna": "🇼🇫",
+3251	    "flag_for_western_sahara": "🇪🇭",
+3252	    "flag_for_yemen": "🇾🇪",
+3253	    "flag_for_zambia": "🇿🇲",
+3254	    "flag_for_zimbabwe": "🇿🇼",
+3255	    "flag_for_åland_islands": "🇦🇽",
+3256	    "golf": "⛳",
+3257	    "fleur__de__lis": "⚜",
+3258	    "muscle": "💪",
+3259	    "flushed": "😳",
+3260	    "frame_with_picture": "🖼",
+3261	    "fries": "🍟",
+3262	    "frog": "🐸",
+3263	    "hatched_chick": "🐥",
+3264	    "frowning": "😦",
+3265	    "fuelpump": "⛽",
+3266	    "full_moon_with_face": "🌝",
+3267	    "gem": "💎",
+3268	    "star2": "🌟",
+3269	    "golfer": "🏌",
+3270	    "mortar_board": "🎓",
+3271	    "grimacing": "😬",
+3272	    "smile_cat": "😸",
+3273	    "grinning": "😀",
+3274	    "grin": "😁",
+3275	    "heartpulse": "💗",
+3276	    "guardsman": "💂",
+3277	    "haircut": "💇",
+3278	    "hamster": "🐹",
+3279	    "raising_hand": "🙋",
+3280	    "headphones": "🎧",
+3281	    "hear_no_evil": "🙉",
+3282	    "cupid": "💘",
+3283	    "gift_heart": "💝",
+3284	    "heart": "❤",
+3285	    "exclamation": "❗",
+3286	    "heavy_exclamation_mark": "❗",
+3287	    "heavy_heart_exclamation_mark_ornament": "❣",
+3288	    "o": "⭕",
+3289	    "helm_symbol": "⎈",
+3290	    "helmet_with_white_cross": "⛑",
+3291	    "high_heel": "👠",
+3292	    "bullettrain_side": "🚄",
+3293	    "bullettrain_front": "🚅",
+3294	    "high_brightness": "🔆",
+3295	    "zap": "⚡",
+3296	    "hocho": "🔪",
+3297	    "knife": "🔪",
+3298	    "bee": "🐝",
+3299	    "traffic_light": "🚥",
+3300	    "racehorse": "🐎",
+3301	    "coffee": "☕",
+3302	    "hotsprings": "♨",
+3303	    "hourglass": "⌛",
+3304	    "hourglass_flowing_sand": "⏳",
+3305	    "house_buildings": "🏘",
+3306	    "100": "💯",
+3307	    "hushed": "😯",
+3308	    "ice_hockey_stick_and_puck": "🏒",
+3309	    "imp": "👿",
+3310	    "information_desk_person": "💁",
+3311	    "information_source": "ℹ",
+3312	    "capital_abcd": "🔠",
+3313	    "abc": "🔤",
+3314	    "abcd": "🔡",
+3315	    "1234": "🔢",
+3316	    "symbols": "🔣",
+3317	    "izakaya_lantern": "🏮",
+3318	    "lantern": "🏮",
+3319	    "jack_o_lantern": "🎃",
+3320	    "dolls": "🎎",
+3321	    "japanese_goblin": "👺",
+3322	    "japanese_ogre": "👹",
+3323	    "beginner": "🔰",
+3324	    "zero": "0️⃣",
+3325	    "one": "1️⃣",
+3326	    "ten": "🔟",
+3327	    "two": "2️⃣",
+3328	    "three": "3️⃣",
+3329	    "four": "4️⃣",
+3330	    "five": "5️⃣",
+3331	    "six": "6️⃣",
+3332	    "seven": "7️⃣",
+3333	    "eight": "8️⃣",
+3334	    "nine": "9️⃣",
+3335	    "couplekiss": "💏",
+3336	    "kissing_cat": "😽",
+3337	    "kissing": "😗",
+3338	    "kissing_closed_eyes": "😚",
+3339	    "kissing_smiling_eyes": "😙",
+3340	    "beetle": "🐞",
+3341	    "large_blue_circle": "🔵",
+3342	    "last_quarter_moon_with_face": "🌜",
+3343	    "leaves": "🍃",
+3344	    "mag": "🔍",
+3345	    "left_right_arrow": "↔",
+3346	    "leftwards_arrow_with_hook": "↩",
+3347	    "arrow_left": "⬅",
+3348	    "lock": "🔒",
+3349	    "lock_with_ink_pen": "🔏",
+3350	    "sob": "😭",
+3351	    "low_brightness": "🔅",
+3352	    "lower_left_ballpoint_pen": "🖊",
+3353	    "lower_left_crayon": "🖍",
+3354	    "lower_left_fountain_pen": "🖋",
+3355	    "lower_left_paintbrush": "🖌",
+3356	    "mahjong": "🀄",
+3357	    "couple": "👫",
+3358	    "man_in_business_suit_levitating": "🕴",
+3359	    "man_with_gua_pi_mao": "👲",
+3360	    "man_with_turban": "👳",
+3361	    "mans_shoe": "👞",
+3362	    "shoe": "👞",
+3363	    "menorah_with_nine_branches": "🕎",
+3364	    "mens": "🚹",
+3365	    "minidisc": "💽",
+3366	    "iphone": "📱",
+3367	    "calling": "📲",
+3368	    "money__mouth_face": "🤑",
+3369	    "moneybag": "💰",
+3370	    "rice_scene": "🎑",
+3371	    "mountain_bicyclist": "🚵",
+3372	    "mouse2": "🐁",
+3373	    "lips": "👄",
+3374	    "moyai": "🗿",
+3375	    "notes": "🎶",
+3376	    "nail_care": "💅",
+3377	    "ab": "🆎",
+3378	    "negative_squared_cross_mark": "❎",
+3379	    "a": "🅰",
+3380	    "b": "🅱",
+3381	    "o2": "🅾",
+3382	    "parking": "🅿",
+3383	    "new_moon_with_face": "🌚",
+3384	    "no_entry_sign": "🚫",
+3385	    "underage": "🔞",
+3386	    "non__potable_water": "🚱",
+3387	    "arrow_upper_right": "↗",
+3388	    "arrow_upper_left": "↖",
+3389	    "office": "🏢",
+3390	    "older_man": "👴",
+3391	    "older_woman": "👵",
+3392	    "om_symbol": "🕉",
+3393	    "on": "🔛",
+3394	    "book": "📖",
+3395	    "unlock": "🔓",
+3396	    "mailbox_with_no_mail": "📭",
+3397	    "mailbox_with_mail": "📬",
+3398	    "cd": "💿",
+3399	    "tada": "🎉",
+3400	    "feet": "🐾",
+3401	    "walking": "🚶",
+3402	    "pencil2": "✏",
+3403	    "pensive": "😔",
+3404	    "persevere": "😣",
+3405	    "bow": "🙇",
+3406	    "raised_hands": "🙌",
+3407	    "person_with_ball": "⛹",
+3408	    "person_with_blond_hair": "👱",
+3409	    "pray": "🙏",
+3410	    "person_with_pouting_face": "🙎",
+3411	    "computer": "💻",
+3412	    "pig2": "🐖",
+3413	    "hankey": "💩",
+3414	    "poop": "💩",
+3415	    "shit": "💩",
+3416	    "bamboo": "🎍",
+3417	    "gun": "🔫",
+3418	    "black_joker": "🃏",
+3419	    "rotating_light": "🚨",
+3420	    "cop": "👮",
+3421	    "stew": "🍲",
+3422	    "pouch": "👝",
+3423	    "pouting_cat": "😾",
+3424	    "rage": "😡",
+3425	    "put_litter_in_its_place": "🚮",
+3426	    "rabbit2": "🐇",
+3427	    "racing_motorcycle": "🏍",
+3428	    "radioactive_sign": "☢",
+3429	    "fist": "✊",
+3430	    "hand": "✋",
+3431	    "raised_hand_with_fingers_splayed": "🖐",
+3432	    "raised_hand_with_part_between_middle_and_ring_fingers": "🖖",
+3433	    "blue_car": "🚙",
+3434	    "apple": "🍎",
+3435	    "relieved": "😌",
+3436	    "reversed_hand_with_middle_finger_extended": "🖕",
+3437	    "mag_right": "🔎",
+3438	    "arrow_right_hook": "↪",
+3439	    "sweet_potato": "🍠",
+3440	    "robot": "🤖",
+3441	    "rolled__up_newspaper": "🗞",
+3442	    "rowboat": "🚣",
+3443	    "runner": "🏃",
+3444	    "running": "🏃",
+3445	    "running_shirt_with_sash": "🎽",
+3446	    "boat": "⛵",
+3447	    "scales": "⚖",
+3448	    "school_satchel": "🎒",
+3449	    "scorpius": "♏",
+3450	    "see_no_evil": "🙈",
+3451	    "sheep": "🐑",
+3452	    "stars": "🌠",
+3453	    "cake": "🍰",
+3454	    "six_pointed_star": "🔯",
+3455	    "ski": "🎿",
+3456	    "sleeping_accommodation": "🛌",
+3457	    "sleeping": "😴",
+3458	    "sleepy": "😪",
+3459	    "sleuth_or_spy": "🕵",
+3460	    "heart_eyes_cat": "😻",
+3461	    "smiley_cat": "😺",
+3462	    "innocent": "😇",
+3463	    "heart_eyes": "😍",
+3464	    "smiling_imp": "😈",
+3465	    "smiley": "😃",
+3466	    "sweat_smile": "😅",
+3467	    "smile": "😄",
+3468	    "laughing": "😆",
+3469	    "satisfied": "😆",
+3470	    "blush": "😊",
+3471	    "smirk": "😏",
+3472	    "smoking": "🚬",
+3473	    "snow_capped_mountain": "🏔",
+3474	    "soccer": "⚽",
+3475	    "icecream": "🍦",
+3476	    "soon": "🔜",
+3477	    "arrow_lower_right": "↘",
+3478	    "arrow_lower_left": "↙",
+3479	    "speak_no_evil": "🙊",
+3480	    "speaker": "🔈",
+3481	    "mute": "🔇",
+3482	    "sound": "🔉",
+3483	    "loud_sound": "🔊",
+3484	    "speaking_head_in_silhouette": "🗣",
+3485	    "spiral_calendar_pad": "🗓",
+3486	    "spiral_note_pad": "🗒",
+3487	    "shell": "🐚",
+3488	    "sweat_drops": "💦",
+3489	    "u5272": "🈹",
+3490	    "u5408": "🈴",
+3491	    "u55b6": "🈺",
+3492	    "u6307": "🈯",
+3493	    "u6708": "🈷",
+3494	    "u6709": "🈶",
+3495	    "u6e80": "🈵",
+3496	    "u7121": "🈚",
+3497	    "u7533": "🈸",
+3498	    "u7981": "🈲",
+3499	    "u7a7a": "🈳",
+3500	    "cl": "🆑",
+3501	    "cool": "🆒",
+3502	    "free": "🆓",
+3503	    "id": "🆔",
+3504	    "koko": "🈁",
+3505	    "sa": "🈂",
+3506	    "new": "🆕",
+3507	    "ng": "🆖",
+3508	    "ok": "🆗",
+3509	    "sos": "🆘",
+3510	    "up": "🆙",
+3511	    "vs": "🆚",
+3512	    "steam_locomotive": "🚂",
+3513	    "ramen": "🍜",
+3514	    "partly_sunny": "⛅",
+3515	    "city_sunrise": "🌇",
+3516	    "surfer": "🏄",
+3517	    "swimmer": "🏊",
+3518	    "shirt": "👕",
+3519	    "tshirt": "👕",
+3520	    "table_tennis_paddle_and_ball": "🏓",
+3521	    "tea": "🍵",
+3522	    "tv": "📺",
+3523	    "three_button_mouse": "🖱",
+3524	    "+1": "👍",
+3525	    "thumbsup": "👍",
+3526	    "__1": "👎",
+3527	    "-1": "👎",
+3528	    "thumbsdown": "👎",
+3529	    "thunder_cloud_and_rain": "⛈",
+3530	    "tiger2": "🐅",
+3531	    "tophat": "🎩",
+3532	    "top": "🔝",
+3533	    "tm": "™",
+3534	    "train2": "🚆",
+3535	    "triangular_flag_on_post": "🚩",
+3536	    "trident": "🔱",
+3537	    "twisted_rightwards_arrows": "🔀",
+3538	    "unamused": "😒",
+3539	    "small_red_triangle": "🔺",
+3540	    "arrow_up_small": "🔼",
+3541	    "arrow_up_down": "↕",
+3542	    "upside__down_face": "🙃",
+3543	    "arrow_up": "⬆",
+3544	    "v": "✌",
+3545	    "vhs": "📼",
+3546	    "wc": "🚾",
+3547	    "ocean": "🌊",
+3548	    "waving_black_flag": "🏴",
+3549	    "wave": "👋",
+3550	    "waving_white_flag": "🏳",
+3551	    "moon": "🌔",
+3552	    "scream_cat": "🙀",
+3553	    "weary": "😩",
+3554	    "weight_lifter": "🏋",
+3555	    "whale2": "🐋",
+3556	    "wheelchair": "♿",
+3557	    "point_down": "👇",
+3558	    "grey_exclamation": "❕",
+3559	    "white_frowning_face": "☹",
+3560	    "white_check_mark": "✅",
+3561	    "point_left": "👈",
+3562	    "white_medium_small_square": "◽",
+3563	    "star": "⭐",
+3564	    "grey_question": "❔",
+3565	    "point_right": "👉",
+3566	    "relaxed": "☺",
+3567	    "white_sun_behind_cloud": "🌥",
+3568	    "white_sun_behind_cloud_with_rain": "🌦",
+3569	    "white_sun_with_small_cloud": "🌤",
+3570	    "point_up_2": "👆",
+3571	    "point_up": "☝",
+3572	    "wind_blowing_face": "🌬",
+3573	    "wink": "😉",
+3574	    "wolf": "🐺",
+3575	    "dancers": "👯",
+3576	    "boot": "👢",
+3577	    "womans_clothes": "👚",
+3578	    "womans_hat": "👒",
+3579	    "sandal": "👡",
+3580	    "womens": "🚺",
+3581	    "worried": "😟",
+3582	    "gift": "🎁",
+3583	    "zipper__mouth_face": "🤐",
+3584	    "regional_indicator_a": "🇦",
+3585	    "regional_indicator_b": "🇧",
+3586	    "regional_indicator_c": "🇨",
+3587	    "regional_indicator_d": "🇩",
+3588	    "regional_indicator_e": "🇪",
+3589	    "regional_indicator_f": "🇫",
+3590	    "regional_indicator_g": "🇬",
+3591	    "regional_indicator_h": "🇭",
+3592	    "regional_indicator_i": "🇮",
+3593	    "regional_indicator_j": "🇯",
+3594	    "regional_indicator_k": "🇰",
+3595	    "regional_indicator_l": "🇱",
+3596	    "regional_indicator_m": "🇲",
+3597	    "regional_indicator_n": "🇳",
+3598	    "regional_indicator_o": "🇴",
+3599	    "regional_indicator_p": "🇵",
+3600	    "regional_indicator_q": "🇶",
+3601	    "regional_indicator_r": "🇷",
+3602	    "regional_indicator_s": "🇸",
+3603	    "regional_indicator_t": "🇹",
+3604	    "regional_indicator_u": "🇺",
+3605	    "regional_indicator_v": "🇻",
+3606	    "regional_indicator_w": "🇼",
+3607	    "regional_indicator_x": "🇽",
+3608	    "regional_indicator_y": "🇾",
+3609	    "regional_indicator_z": "🇿",
+3610	}
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '㊙'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py
+ Line number: 2882
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+2881	    "congratulations": "㊗",
+2882	    "secret": "㊙",
+2883	    "m": "Ⓜ",
+2884	    "city_sunset": "🌆",
+2885	    "clapper": "🎬",
+2886	    "clap": "👏",
+2887	    "beers": "🍻",
+2888	    "clock830": "🕣",
+2889	    "clock8": "🕗",
+2890	    "clock1130": "🕦",
+2891	    "clock11": "🕚",
+2892	    "clock530": "🕠",
+2893	    "clock5": "🕔",
+2894	    "clock430": "🕟",
+2895	    "clock4": "🕓",
+2896	    "clock930": "🕤",
+2897	    "clock9": "🕘",
+2898	    "clock130": "🕜",
+2899	    "clock1": "🕐",
+2900	    "clock730": "🕢",
+2901	    "clock7": "🕖",
+2902	    "clock630": "🕡",
+2903	    "clock6": "🕕",
+2904	    "clock1030": "🕥",
+2905	    "clock10": "🕙",
+2906	    "clock330": "🕞",
+2907	    "clock3": "🕒",
+2908	    "clock1230": "🕧",
+2909	    "clock12": "🕛",
+2910	    "clock230": "🕝",
+2911	    "clock2": "🕑",
+2912	    "arrows_clockwise": "🔃",
+2913	    "repeat": "🔁",
+2914	    "repeat_one": "🔂",
+2915	    "closed_lock_with_key": "🔐",
+2916	    "mailbox_closed": "📪",
+2917	    "mailbox": "📫",
+2918	    "cloud_with_tornado": "🌪",
+2919	    "cocktail": "🍸",
+2920	    "boom": "💥",
+2921	    "compression": "🗜",
+2922	    "confounded": "😖",
+2923	    "confused": "😕",
+2924	    "rice": "🍚",
+2925	    "cow2": "🐄",
+2926	    "cricket_bat_and_ball": "🏏",
+2927	    "x": "❌",
+2928	    "cry": "😢",
+2929	    "curry": "🍛",
+2930	    "dagger_knife": "🗡",
+2931	    "dancer": "💃",
+2932	    "dark_sunglasses": "🕶",
+2933	    "dash": "💨",
+2934	    "truck": "🚚",
+2935	    "derelict_house_building": "🏚",
+2936	    "diamond_shape_with_a_dot_inside": "💠",
+2937	    "dart": "🎯",
+2938	    "disappointed_relieved": "😥",
+2939	    "disappointed": "😞",
+2940	    "do_not_litter": "🚯",
+2941	    "dog2": "🐕",
+2942	    "flipper": "🐬",
+2943	    "loop": "➿",
+2944	    "bangbang": "‼",
+2945	    "double_vertical_bar": "⏸",
+2946	    "dove_of_peace": "🕊",
+2947	    "small_red_triangle_down": "🔻",
+2948	    "arrow_down_small": "🔽",
+2949	    "arrow_down": "⬇",
+2950	    "dromedary_camel": "🐪",
+2951	    "e__mail": "📧",
+2952	    "corn": "🌽",
+2953	    "ear_of_rice": "🌾",
+2954	    "earth_americas": "🌎",
+2955	    "earth_asia": "🌏",
+2956	    "earth_africa": "🌍",
+2957	    "eight_pointed_black_star": "✴",
+2958	    "eight_spoked_asterisk": "✳",
+2959	    "eject_symbol": "⏏",
+2960	    "bulb": "💡",
+2961	    "emoji_modifier_fitzpatrick_type__1__2": "🏻",
+2962	    "emoji_modifier_fitzpatrick_type__3": "🏼",
+2963	    "emoji_modifier_fitzpatrick_type__4": "🏽",
+2964	    "emoji_modifier_fitzpatrick_type__5": "🏾",
+2965	    "emoji_modifier_fitzpatrick_type__6": "🏿",
+2966	    "end": "🔚",
+2967	    "email": "✉",
+2968	    "european_castle": "🏰",
+2969	    "european_post_office": "🏤",
+2970	    "interrobang": "⁉",
+2971	    "expressionless": "😑",
+2972	    "eyeglasses": "👓",
+2973	    "massage": "💆",
+2974	    "yum": "😋",
+2975	    "scream": "😱",
+2976	    "kissing_heart": "😘",
+2977	    "sweat": "😓",
+2978	    "face_with_head__bandage": "🤕",
+2979	    "triumph": "😤",
+2980	    "mask": "😷",
+2981	    "no_good": "🙅",
+2982	    "ok_woman": "🙆",
+2983	    "open_mouth": "😮",
+2984	    "cold_sweat": "😰",
+2985	    "stuck_out_tongue": "😛",
+2986	    "stuck_out_tongue_closed_eyes": "😝",
+2987	    "stuck_out_tongue_winking_eye": "😜",
+2988	    "joy": "😂",
+2989	    "no_mouth": "😶",
+2990	    "santa": "🎅",
+2991	    "fax": "📠",
+2992	    "fearful": "😨",
+2993	    "field_hockey_stick_and_ball": "🏑",
+2994	    "first_quarter_moon_with_face": "🌛",
+2995	    "fish_cake": "🍥",
+2996	    "fishing_pole_and_fish": "🎣",
+2997	    "facepunch": "👊",
+2998	    "punch": "👊",
+2999	    "flag_for_afghanistan": "🇦🇫",
+3000	    "flag_for_albania": "🇦🇱",
+3001	    "flag_for_algeria": "🇩🇿",
+3002	    "flag_for_american_samoa": "🇦🇸",
+3003	    "flag_for_andorra": "🇦🇩",
+3004	    "flag_for_angola": "🇦🇴",
+3005	    "flag_for_anguilla": "🇦🇮",
+3006	    "flag_for_antarctica": "🇦🇶",
+3007	    "flag_for_antigua_&_barbuda": "🇦🇬",
+3008	    "flag_for_argentina": "🇦🇷",
+3009	    "flag_for_armenia": "🇦🇲",
+3010	    "flag_for_aruba": "🇦🇼",
+3011	    "flag_for_ascension_island": "🇦🇨",
+3012	    "flag_for_australia": "🇦🇺",
+3013	    "flag_for_austria": "🇦🇹",
+3014	    "flag_for_azerbaijan": "🇦🇿",
+3015	    "flag_for_bahamas": "🇧🇸",
+3016	    "flag_for_bahrain": "🇧🇭",
+3017	    "flag_for_bangladesh": "🇧🇩",
+3018	    "flag_for_barbados": "🇧🇧",
+3019	    "flag_for_belarus": "🇧🇾",
+3020	    "flag_for_belgium": "🇧🇪",
+3021	    "flag_for_belize": "🇧🇿",
+3022	    "flag_for_benin": "🇧🇯",
+3023	    "flag_for_bermuda": "🇧🇲",
+3024	    "flag_for_bhutan": "🇧🇹",
+3025	    "flag_for_bolivia": "🇧🇴",
+3026	    "flag_for_bosnia_&_herzegovina": "🇧🇦",
+3027	    "flag_for_botswana": "🇧🇼",
+3028	    "flag_for_bouvet_island": "🇧🇻",
+3029	    "flag_for_brazil": "🇧🇷",
+3030	    "flag_for_british_indian_ocean_territory": "🇮🇴",
+3031	    "flag_for_british_virgin_islands": "🇻🇬",
+3032	    "flag_for_brunei": "🇧🇳",
+3033	    "flag_for_bulgaria": "🇧🇬",
+3034	    "flag_for_burkina_faso": "🇧🇫",
+3035	    "flag_for_burundi": "🇧🇮",
+3036	    "flag_for_cambodia": "🇰🇭",
+3037	    "flag_for_cameroon": "🇨🇲",
+3038	    "flag_for_canada": "🇨🇦",
+3039	    "flag_for_canary_islands": "🇮🇨",
+3040	    "flag_for_cape_verde": "🇨🇻",
+3041	    "flag_for_caribbean_netherlands": "🇧🇶",
+3042	    "flag_for_cayman_islands": "🇰🇾",
+3043	    "flag_for_central_african_republic": "🇨🇫",
+3044	    "flag_for_ceuta_&_melilla": "🇪🇦",
+3045	    "flag_for_chad": "🇹🇩",
+3046	    "flag_for_chile": "🇨🇱",
+3047	    "flag_for_china": "🇨🇳",
+3048	    "flag_for_christmas_island": "🇨🇽",
+3049	    "flag_for_clipperton_island": "🇨🇵",
+3050	    "flag_for_cocos__islands": "🇨🇨",
+3051	    "flag_for_colombia": "🇨🇴",
+3052	    "flag_for_comoros": "🇰🇲",
+3053	    "flag_for_congo____brazzaville": "🇨🇬",
+3054	    "flag_for_congo____kinshasa": "🇨🇩",
+3055	    "flag_for_cook_islands": "🇨🇰",
+3056	    "flag_for_costa_rica": "🇨🇷",
+3057	    "flag_for_croatia": "🇭🇷",
+3058	    "flag_for_cuba": "🇨🇺",
+3059	    "flag_for_curaçao": "🇨🇼",
+3060	    "flag_for_cyprus": "🇨🇾",
+3061	    "flag_for_czech_republic": "🇨🇿",
+3062	    "flag_for_côte_d’ivoire": "🇨🇮",
+3063	    "flag_for_denmark": "🇩🇰",
+3064	    "flag_for_diego_garcia": "🇩🇬",
+3065	    "flag_for_djibouti": "🇩🇯",
+3066	    "flag_for_dominica": "🇩🇲",
+3067	    "flag_for_dominican_republic": "🇩🇴",
+3068	    "flag_for_ecuador": "🇪🇨",
+3069	    "flag_for_egypt": "🇪🇬",
+3070	    "flag_for_el_salvador": "🇸🇻",
+3071	    "flag_for_equatorial_guinea": "🇬🇶",
+3072	    "flag_for_eritrea": "🇪🇷",
+3073	    "flag_for_estonia": "🇪🇪",
+3074	    "flag_for_ethiopia": "🇪🇹",
+3075	    "flag_for_european_union": "🇪🇺",
+3076	    "flag_for_falkland_islands": "🇫🇰",
+3077	    "flag_for_faroe_islands": "🇫🇴",
+3078	    "flag_for_fiji": "🇫🇯",
+3079	    "flag_for_finland": "🇫🇮",
+3080	    "flag_for_france": "🇫🇷",
+3081	    "flag_for_french_guiana": "🇬🇫",
+3082	    "flag_for_french_polynesia": "🇵🇫",
+3083	    "flag_for_french_southern_territories": "🇹🇫",
+3084	    "flag_for_gabon": "🇬🇦",
+3085	    "flag_for_gambia": "🇬🇲",
+3086	    "flag_for_georgia": "🇬🇪",
+3087	    "flag_for_germany": "🇩🇪",
+3088	    "flag_for_ghana": "🇬🇭",
+3089	    "flag_for_gibraltar": "🇬🇮",
+3090	    "flag_for_greece": "🇬🇷",
+3091	    "flag_for_greenland": "🇬🇱",
+3092	    "flag_for_grenada": "🇬🇩",
+3093	    "flag_for_guadeloupe": "🇬🇵",
+3094	    "flag_for_guam": "🇬🇺",
+3095	    "flag_for_guatemala": "🇬🇹",
+3096	    "flag_for_guernsey": "🇬🇬",
+3097	    "flag_for_guinea": "🇬🇳",
+3098	    "flag_for_guinea__bissau": "🇬🇼",
+3099	    "flag_for_guyana": "🇬🇾",
+3100	    "flag_for_haiti": "🇭🇹",
+3101	    "flag_for_heard_&_mcdonald_islands": "🇭🇲",
+3102	    "flag_for_honduras": "🇭🇳",
+3103	    "flag_for_hong_kong": "🇭🇰",
+3104	    "flag_for_hungary": "🇭🇺",
+3105	    "flag_for_iceland": "🇮🇸",
+3106	    "flag_for_india": "🇮🇳",
+3107	    "flag_for_indonesia": "🇮🇩",
+3108	    "flag_for_iran": "🇮🇷",
+3109	    "flag_for_iraq": "🇮🇶",
+3110	    "flag_for_ireland": "🇮🇪",
+3111	    "flag_for_isle_of_man": "🇮🇲",
+3112	    "flag_for_israel": "🇮🇱",
+3113	    "flag_for_italy": "🇮🇹",
+3114	    "flag_for_jamaica": "🇯🇲",
+3115	    "flag_for_japan": "🇯🇵",
+3116	    "flag_for_jersey": "🇯🇪",
+3117	    "flag_for_jordan": "🇯🇴",
+3118	    "flag_for_kazakhstan": "🇰🇿",
+3119	    "flag_for_kenya": "🇰🇪",
+3120	    "flag_for_kiribati": "🇰🇮",
+3121	    "flag_for_kosovo": "🇽🇰",
+3122	    "flag_for_kuwait": "🇰🇼",
+3123	    "flag_for_kyrgyzstan": "🇰🇬",
+3124	    "flag_for_laos": "🇱🇦",
+3125	    "flag_for_latvia": "🇱🇻",
+3126	    "flag_for_lebanon": "🇱🇧",
+3127	    "flag_for_lesotho": "🇱🇸",
+3128	    "flag_for_liberia": "🇱🇷",
+3129	    "flag_for_libya": "🇱🇾",
+3130	    "flag_for_liechtenstein": "🇱🇮",
+3131	    "flag_for_lithuania": "🇱🇹",
+3132	    "flag_for_luxembourg": "🇱🇺",
+3133	    "flag_for_macau": "🇲🇴",
+3134	    "flag_for_macedonia": "🇲🇰",
+3135	    "flag_for_madagascar": "🇲🇬",
+3136	    "flag_for_malawi": "🇲🇼",
+3137	    "flag_for_malaysia": "🇲🇾",
+3138	    "flag_for_maldives": "🇲🇻",
+3139	    "flag_for_mali": "🇲🇱",
+3140	    "flag_for_malta": "🇲🇹",
+3141	    "flag_for_marshall_islands": "🇲🇭",
+3142	    "flag_for_martinique": "🇲🇶",
+3143	    "flag_for_mauritania": "🇲🇷",
+3144	    "flag_for_mauritius": "🇲🇺",
+3145	    "flag_for_mayotte": "🇾🇹",
+3146	    "flag_for_mexico": "🇲🇽",
+3147	    "flag_for_micronesia": "🇫🇲",
+3148	    "flag_for_moldova": "🇲🇩",
+3149	    "flag_for_monaco": "🇲🇨",
+3150	    "flag_for_mongolia": "🇲🇳",
+3151	    "flag_for_montenegro": "🇲🇪",
+3152	    "flag_for_montserrat": "🇲🇸",
+3153	    "flag_for_morocco": "🇲🇦",
+3154	    "flag_for_mozambique": "🇲🇿",
+3155	    "flag_for_myanmar": "🇲🇲",
+3156	    "flag_for_namibia": "🇳🇦",
+3157	    "flag_for_nauru": "🇳🇷",
+3158	    "flag_for_nepal": "🇳🇵",
+3159	    "flag_for_netherlands": "🇳🇱",
+3160	    "flag_for_new_caledonia": "🇳🇨",
+3161	    "flag_for_new_zealand": "🇳🇿",
+3162	    "flag_for_nicaragua": "🇳🇮",
+3163	    "flag_for_niger": "🇳🇪",
+3164	    "flag_for_nigeria": "🇳🇬",
+3165	    "flag_for_niue": "🇳🇺",
+3166	    "flag_for_norfolk_island": "🇳🇫",
+3167	    "flag_for_north_korea": "🇰🇵",
+3168	    "flag_for_northern_mariana_islands": "🇲🇵",
+3169	    "flag_for_norway": "🇳🇴",
+3170	    "flag_for_oman": "🇴🇲",
+3171	    "flag_for_pakistan": "🇵🇰",
+3172	    "flag_for_palau": "🇵🇼",
+3173	    "flag_for_palestinian_territories": "🇵🇸",
+3174	    "flag_for_panama": "🇵🇦",
+3175	    "flag_for_papua_new_guinea": "🇵🇬",
+3176	    "flag_for_paraguay": "🇵🇾",
+3177	    "flag_for_peru": "🇵🇪",
+3178	    "flag_for_philippines": "🇵🇭",
+3179	    "flag_for_pitcairn_islands": "🇵🇳",
+3180	    "flag_for_poland": "🇵🇱",
+3181	    "flag_for_portugal": "🇵🇹",
+3182	    "flag_for_puerto_rico": "🇵🇷",
+3183	    "flag_for_qatar": "🇶🇦",
+3184	    "flag_for_romania": "🇷🇴",
+3185	    "flag_for_russia": "🇷🇺",
+3186	    "flag_for_rwanda": "🇷🇼",
+3187	    "flag_for_réunion": "🇷🇪",
+3188	    "flag_for_samoa": "🇼🇸",
+3189	    "flag_for_san_marino": "🇸🇲",
+3190	    "flag_for_saudi_arabia": "🇸🇦",
+3191	    "flag_for_senegal": "🇸🇳",
+3192	    "flag_for_serbia": "🇷🇸",
+3193	    "flag_for_seychelles": "🇸🇨",
+3194	    "flag_for_sierra_leone": "🇸🇱",
+3195	    "flag_for_singapore": "🇸🇬",
+3196	    "flag_for_sint_maarten": "🇸🇽",
+3197	    "flag_for_slovakia": "🇸🇰",
+3198	    "flag_for_slovenia": "🇸🇮",
+3199	    "flag_for_solomon_islands": "🇸🇧",
+3200	    "flag_for_somalia": "🇸🇴",
+3201	    "flag_for_south_africa": "🇿🇦",
+3202	    "flag_for_south_georgia_&_south_sandwich_islands": "🇬🇸",
+3203	    "flag_for_south_korea": "🇰🇷",
+3204	    "flag_for_south_sudan": "🇸🇸",
+3205	    "flag_for_spain": "🇪🇸",
+3206	    "flag_for_sri_lanka": "🇱🇰",
+3207	    "flag_for_st._barthélemy": "🇧🇱",
+3208	    "flag_for_st._helena": "🇸🇭",
+3209	    "flag_for_st._kitts_&_nevis": "🇰🇳",
+3210	    "flag_for_st._lucia": "🇱🇨",
+3211	    "flag_for_st._martin": "🇲🇫",
+3212	    "flag_for_st._pierre_&_miquelon": "🇵🇲",
+3213	    "flag_for_st._vincent_&_grenadines": "🇻🇨",
+3214	    "flag_for_sudan": "🇸🇩",
+3215	    "flag_for_suriname": "🇸🇷",
+3216	    "flag_for_svalbard_&_jan_mayen": "🇸🇯",
+3217	    "flag_for_swaziland": "🇸🇿",
+3218	    "flag_for_sweden": "🇸🇪",
+3219	    "flag_for_switzerland": "🇨🇭",
+3220	    "flag_for_syria": "🇸🇾",
+3221	    "flag_for_são_tomé_&_príncipe": "🇸🇹",
+3222	    "flag_for_taiwan": "🇹🇼",
+3223	    "flag_for_tajikistan": "🇹🇯",
+3224	    "flag_for_tanzania": "🇹🇿",
+3225	    "flag_for_thailand": "🇹🇭",
+3226	    "flag_for_timor__leste": "🇹🇱",
+3227	    "flag_for_togo": "🇹🇬",
+3228	    "flag_for_tokelau": "🇹🇰",
+3229	    "flag_for_tonga": "🇹🇴",
+3230	    "flag_for_trinidad_&_tobago": "🇹🇹",
+3231	    "flag_for_tristan_da_cunha": "🇹🇦",
+3232	    "flag_for_tunisia": "🇹🇳",
+3233	    "flag_for_turkey": "🇹🇷",
+3234	    "flag_for_turkmenistan": "🇹🇲",
+3235	    "flag_for_turks_&_caicos_islands": "🇹🇨",
+3236	    "flag_for_tuvalu": "🇹🇻",
+3237	    "flag_for_u.s._outlying_islands": "🇺🇲",
+3238	    "flag_for_u.s._virgin_islands": "🇻🇮",
+3239	    "flag_for_uganda": "🇺🇬",
+3240	    "flag_for_ukraine": "🇺🇦",
+3241	    "flag_for_united_arab_emirates": "🇦🇪",
+3242	    "flag_for_united_kingdom": "🇬🇧",
+3243	    "flag_for_united_states": "🇺🇸",
+3244	    "flag_for_uruguay": "🇺🇾",
+3245	    "flag_for_uzbekistan": "🇺🇿",
+3246	    "flag_for_vanuatu": "🇻🇺",
+3247	    "flag_for_vatican_city": "🇻🇦",
+3248	    "flag_for_venezuela": "🇻🇪",
+3249	    "flag_for_vietnam": "🇻🇳",
+3250	    "flag_for_wallis_&_futuna": "🇼🇫",
+3251	    "flag_for_western_sahara": "🇪🇭",
+3252	    "flag_for_yemen": "🇾🇪",
+3253	    "flag_for_zambia": "🇿🇲",
+3254	    "flag_for_zimbabwe": "🇿🇼",
+3255	    "flag_for_åland_islands": "🇦🇽",
+3256	    "golf": "⛳",
+3257	    "fleur__de__lis": "⚜",
+3258	    "muscle": "💪",
+3259	    "flushed": "😳",
+3260	    "frame_with_picture": "🖼",
+3261	    "fries": "🍟",
+3262	    "frog": "🐸",
+3263	    "hatched_chick": "🐥",
+3264	    "frowning": "😦",
+3265	    "fuelpump": "⛽",
+3266	    "full_moon_with_face": "🌝",
+3267	    "gem": "💎",
+3268	    "star2": "🌟",
+3269	    "golfer": "🏌",
+3270	    "mortar_board": "🎓",
+3271	    "grimacing": "😬",
+3272	    "smile_cat": "😸",
+3273	    "grinning": "😀",
+3274	    "grin": "😁",
+3275	    "heartpulse": "💗",
+3276	    "guardsman": "💂",
+3277	    "haircut": "💇",
+3278	    "hamster": "🐹",
+3279	    "raising_hand": "🙋",
+3280	    "headphones": "🎧",
+3281	    "hear_no_evil": "🙉",
+3282	    "cupid": "💘",
+3283	    "gift_heart": "💝",
+3284	    "heart": "❤",
+3285	    "exclamation": "❗",
+3286	    "heavy_exclamation_mark": "❗",
+3287	    "heavy_heart_exclamation_mark_ornament": "❣",
+3288	    "o": "⭕",
+3289	    "helm_symbol": "⎈",
+3290	    "helmet_with_white_cross": "⛑",
+3291	    "high_heel": "👠",
+3292	    "bullettrain_side": "🚄",
+3293	    "bullettrain_front": "🚅",
+3294	    "high_brightness": "🔆",
+3295	    "zap": "⚡",
+3296	    "hocho": "🔪",
+3297	    "knife": "🔪",
+3298	    "bee": "🐝",
+3299	    "traffic_light": "🚥",
+3300	    "racehorse": "🐎",
+3301	    "coffee": "☕",
+3302	    "hotsprings": "♨",
+3303	    "hourglass": "⌛",
+3304	    "hourglass_flowing_sand": "⏳",
+3305	    "house_buildings": "🏘",
+3306	    "100": "💯",
+3307	    "hushed": "😯",
+3308	    "ice_hockey_stick_and_puck": "🏒",
+3309	    "imp": "👿",
+3310	    "information_desk_person": "💁",
+3311	    "information_source": "ℹ",
+3312	    "capital_abcd": "🔠",
+3313	    "abc": "🔤",
+3314	    "abcd": "🔡",
+3315	    "1234": "🔢",
+3316	    "symbols": "🔣",
+3317	    "izakaya_lantern": "🏮",
+3318	    "lantern": "🏮",
+3319	    "jack_o_lantern": "🎃",
+3320	    "dolls": "🎎",
+3321	    "japanese_goblin": "👺",
+3322	    "japanese_ogre": "👹",
+3323	    "beginner": "🔰",
+3324	    "zero": "0️⃣",
+3325	    "one": "1️⃣",
+3326	    "ten": "🔟",
+3327	    "two": "2️⃣",
+3328	    "three": "3️⃣",
+3329	    "four": "4️⃣",
+3330	    "five": "5️⃣",
+3331	    "six": "6️⃣",
+3332	    "seven": "7️⃣",
+3333	    "eight": "8️⃣",
+3334	    "nine": "9️⃣",
+3335	    "couplekiss": "💏",
+3336	    "kissing_cat": "😽",
+3337	    "kissing": "😗",
+3338	    "kissing_closed_eyes": "😚",
+3339	    "kissing_smiling_eyes": "😙",
+3340	    "beetle": "🐞",
+3341	    "large_blue_circle": "🔵",
+3342	    "last_quarter_moon_with_face": "🌜",
+3343	    "leaves": "🍃",
+3344	    "mag": "🔍",
+3345	    "left_right_arrow": "↔",
+3346	    "leftwards_arrow_with_hook": "↩",
+3347	    "arrow_left": "⬅",
+3348	    "lock": "🔒",
+3349	    "lock_with_ink_pen": "🔏",
+3350	    "sob": "😭",
+3351	    "low_brightness": "🔅",
+3352	    "lower_left_ballpoint_pen": "🖊",
+3353	    "lower_left_crayon": "🖍",
+3354	    "lower_left_fountain_pen": "🖋",
+3355	    "lower_left_paintbrush": "🖌",
+3356	    "mahjong": "🀄",
+3357	    "couple": "👫",
+3358	    "man_in_business_suit_levitating": "🕴",
+3359	    "man_with_gua_pi_mao": "👲",
+3360	    "man_with_turban": "👳",
+3361	    "mans_shoe": "👞",
+3362	    "shoe": "👞",
+3363	    "menorah_with_nine_branches": "🕎",
+3364	    "mens": "🚹",
+3365	    "minidisc": "💽",
+3366	    "iphone": "📱",
+3367	    "calling": "📲",
+3368	    "money__mouth_face": "🤑",
+3369	    "moneybag": "💰",
+3370	    "rice_scene": "🎑",
+3371	    "mountain_bicyclist": "🚵",
+3372	    "mouse2": "🐁",
+3373	    "lips": "👄",
+3374	    "moyai": "🗿",
+3375	    "notes": "🎶",
+3376	    "nail_care": "💅",
+3377	    "ab": "🆎",
+3378	    "negative_squared_cross_mark": "❎",
+3379	    "a": "🅰",
+3380	    "b": "🅱",
+3381	    "o2": "🅾",
+3382	    "parking": "🅿",
+3383	    "new_moon_with_face": "🌚",
+3384	    "no_entry_sign": "🚫",
+3385	    "underage": "🔞",
+3386	    "non__potable_water": "🚱",
+3387	    "arrow_upper_right": "↗",
+3388	    "arrow_upper_left": "↖",
+3389	    "office": "🏢",
+3390	    "older_man": "👴",
+3391	    "older_woman": "👵",
+3392	    "om_symbol": "🕉",
+3393	    "on": "🔛",
+3394	    "book": "📖",
+3395	    "unlock": "🔓",
+3396	    "mailbox_with_no_mail": "📭",
+3397	    "mailbox_with_mail": "📬",
+3398	    "cd": "💿",
+3399	    "tada": "🎉",
+3400	    "feet": "🐾",
+3401	    "walking": "🚶",
+3402	    "pencil2": "✏",
+3403	    "pensive": "😔",
+3404	    "persevere": "😣",
+3405	    "bow": "🙇",
+3406	    "raised_hands": "🙌",
+3407	    "person_with_ball": "⛹",
+3408	    "person_with_blond_hair": "👱",
+3409	    "pray": "🙏",
+3410	    "person_with_pouting_face": "🙎",
+3411	    "computer": "💻",
+3412	    "pig2": "🐖",
+3413	    "hankey": "💩",
+3414	    "poop": "💩",
+3415	    "shit": "💩",
+3416	    "bamboo": "🎍",
+3417	    "gun": "🔫",
+3418	    "black_joker": "🃏",
+3419	    "rotating_light": "🚨",
+3420	    "cop": "👮",
+3421	    "stew": "🍲",
+3422	    "pouch": "👝",
+3423	    "pouting_cat": "😾",
+3424	    "rage": "😡",
+3425	    "put_litter_in_its_place": "🚮",
+3426	    "rabbit2": "🐇",
+3427	    "racing_motorcycle": "🏍",
+3428	    "radioactive_sign": "☢",
+3429	    "fist": "✊",
+3430	    "hand": "✋",
+3431	    "raised_hand_with_fingers_splayed": "🖐",
+3432	    "raised_hand_with_part_between_middle_and_ring_fingers": "🖖",
+3433	    "blue_car": "🚙",
+3434	    "apple": "🍎",
+3435	    "relieved": "😌",
+3436	    "reversed_hand_with_middle_finger_extended": "🖕",
+3437	    "mag_right": "🔎",
+3438	    "arrow_right_hook": "↪",
+3439	    "sweet_potato": "🍠",
+3440	    "robot": "🤖",
+3441	    "rolled__up_newspaper": "🗞",
+3442	    "rowboat": "🚣",
+3443	    "runner": "🏃",
+3444	    "running": "🏃",
+3445	    "running_shirt_with_sash": "🎽",
+3446	    "boat": "⛵",
+3447	    "scales": "⚖",
+3448	    "school_satchel": "🎒",
+3449	    "scorpius": "♏",
+3450	    "see_no_evil": "🙈",
+3451	    "sheep": "🐑",
+3452	    "stars": "🌠",
+3453	    "cake": "🍰",
+3454	    "six_pointed_star": "🔯",
+3455	    "ski": "🎿",
+3456	    "sleeping_accommodation": "🛌",
+3457	    "sleeping": "😴",
+3458	    "sleepy": "😪",
+3459	    "sleuth_or_spy": "🕵",
+3460	    "heart_eyes_cat": "😻",
+3461	    "smiley_cat": "😺",
+3462	    "innocent": "😇",
+3463	    "heart_eyes": "😍",
+3464	    "smiling_imp": "😈",
+3465	    "smiley": "😃",
+3466	    "sweat_smile": "😅",
+3467	    "smile": "😄",
+3468	    "laughing": "😆",
+3469	    "satisfied": "😆",
+3470	    "blush": "😊",
+3471	    "smirk": "😏",
+3472	    "smoking": "🚬",
+3473	    "snow_capped_mountain": "🏔",
+3474	    "soccer": "⚽",
+3475	    "icecream": "🍦",
+3476	    "soon": "🔜",
+3477	    "arrow_lower_right": "↘",
+3478	    "arrow_lower_left": "↙",
+3479	    "speak_no_evil": "🙊",
+3480	    "speaker": "🔈",
+3481	    "mute": "🔇",
+3482	    "sound": "🔉",
+3483	    "loud_sound": "🔊",
+3484	    "speaking_head_in_silhouette": "🗣",
+3485	    "spiral_calendar_pad": "🗓",
+3486	    "spiral_note_pad": "🗒",
+3487	    "shell": "🐚",
+3488	    "sweat_drops": "💦",
+3489	    "u5272": "🈹",
+3490	    "u5408": "🈴",
+3491	    "u55b6": "🈺",
+3492	    "u6307": "🈯",
+3493	    "u6708": "🈷",
+3494	    "u6709": "🈶",
+3495	    "u6e80": "🈵",
+3496	    "u7121": "🈚",
+3497	    "u7533": "🈸",
+3498	    "u7981": "🈲",
+3499	    "u7a7a": "🈳",
+3500	    "cl": "🆑",
+3501	    "cool": "🆒",
+3502	    "free": "🆓",
+3503	    "id": "🆔",
+3504	    "koko": "🈁",
+3505	    "sa": "🈂",
+3506	    "new": "🆕",
+3507	    "ng": "🆖",
+3508	    "ok": "🆗",
+3509	    "sos": "🆘",
+3510	    "up": "🆙",
+3511	    "vs": "🆚",
+3512	    "steam_locomotive": "🚂",
+3513	    "ramen": "🍜",
+3514	    "partly_sunny": "⛅",
+3515	    "city_sunrise": "🌇",
+3516	    "surfer": "🏄",
+3517	    "swimmer": "🏊",
+3518	    "shirt": "👕",
+3519	    "tshirt": "👕",
+3520	    "table_tennis_paddle_and_ball": "🏓",
+3521	    "tea": "🍵",
+3522	    "tv": "📺",
+3523	    "three_button_mouse": "🖱",
+3524	    "+1": "👍",
+3525	    "thumbsup": "👍",
+3526	    "__1": "👎",
+3527	    "-1": "👎",
+3528	    "thumbsdown": "👎",
+3529	    "thunder_cloud_and_rain": "⛈",
+3530	    "tiger2": "🐅",
+3531	    "tophat": "🎩",
+3532	    "top": "🔝",
+3533	    "tm": "™",
+3534	    "train2": "🚆",
+3535	    "triangular_flag_on_post": "🚩",
+3536	    "trident": "🔱",
+3537	    "twisted_rightwards_arrows": "🔀",
+3538	    "unamused": "😒",
+3539	    "small_red_triangle": "🔺",
+3540	    "arrow_up_small": "🔼",
+3541	    "arrow_up_down": "↕",
+3542	    "upside__down_face": "🙃",
+3543	    "arrow_up": "⬆",
+3544	    "v": "✌",
+3545	    "vhs": "📼",
+3546	    "wc": "🚾",
+3547	    "ocean": "🌊",
+3548	    "waving_black_flag": "🏴",
+3549	    "wave": "👋",
+3550	    "waving_white_flag": "🏳",
+3551	    "moon": "🌔",
+3552	    "scream_cat": "🙀",
+3553	    "weary": "😩",
+3554	    "weight_lifter": "🏋",
+3555	    "whale2": "🐋",
+3556	    "wheelchair": "♿",
+3557	    "point_down": "👇",
+3558	    "grey_exclamation": "❕",
+3559	    "white_frowning_face": "☹",
+3560	    "white_check_mark": "✅",
+3561	    "point_left": "👈",
+3562	    "white_medium_small_square": "◽",
+3563	    "star": "⭐",
+3564	    "grey_question": "❔",
+3565	    "point_right": "👉",
+3566	    "relaxed": "☺",
+3567	    "white_sun_behind_cloud": "🌥",
+3568	    "white_sun_behind_cloud_with_rain": "🌦",
+3569	    "white_sun_with_small_cloud": "🌤",
+3570	    "point_up_2": "👆",
+3571	    "point_up": "☝",
+3572	    "wind_blowing_face": "🌬",
+3573	    "wink": "😉",
+3574	    "wolf": "🐺",
+3575	    "dancers": "👯",
+3576	    "boot": "👢",
+3577	    "womans_clothes": "👚",
+3578	    "womans_hat": "👒",
+3579	    "sandal": "👡",
+3580	    "womens": "🚺",
+3581	    "worried": "😟",
+3582	    "gift": "🎁",
+3583	    "zipper__mouth_face": "🤐",
+3584	    "regional_indicator_a": "🇦",
+3585	    "regional_indicator_b": "🇧",
+3586	    "regional_indicator_c": "🇨",
+3587	    "regional_indicator_d": "🇩",
+3588	    "regional_indicator_e": "🇪",
+3589	    "regional_indicator_f": "🇫",
+3590	    "regional_indicator_g": "🇬",
+3591	    "regional_indicator_h": "🇭",
+3592	    "regional_indicator_i": "🇮",
+3593	    "regional_indicator_j": "🇯",
+3594	    "regional_indicator_k": "🇰",
+3595	    "regional_indicator_l": "🇱",
+3596	    "regional_indicator_m": "🇲",
+3597	    "regional_indicator_n": "🇳",
+3598	    "regional_indicator_o": "🇴",
+3599	    "regional_indicator_p": "🇵",
+3600	    "regional_indicator_q": "🇶",
+3601	    "regional_indicator_r": "🇷",
+3602	    "regional_indicator_s": "🇸",
+3603	    "regional_indicator_t": "🇹",
+3604	    "regional_indicator_u": "🇺",
+3605	    "regional_indicator_v": "🇻",
+3606	    "regional_indicator_w": "🇼",
+3607	    "regional_indicator_x": "🇽",
+3608	    "regional_indicator_y": "🇾",
+3609	    "regional_indicator_z": "🇿",
+3610	}
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py
+ Line number: 13
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+12	    """
+13	    assert values, "1 or more values required"
+14	    for value in values:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py
+ Line number: 129
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+128	    total_ratio = sum(ratios)
+129	    assert total_ratio > 0, "Sum of ratios must be > 0"
+130	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py
+ Line number: 436
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+435	
+436	        assert fore is not None
+437	        assert back is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py
+ Line number: 437
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+436	        assert fore is not None
+437	        assert back is not None
+438	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py
+ Line number: 566
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+565	        """
+566	        assert len(title) < 255, "Console title must be less than 255 characters"
+567	        SetConsoleTitle(title)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 365
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+364	        if self.type == ColorType.TRUECOLOR:
+365	            assert self.triplet is not None
+366	            return self.triplet
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 368
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+367	        elif self.type == ColorType.EIGHT_BIT:
+368	            assert self.number is not None
+369	            return EIGHT_BIT_PALETTE[self.number]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 371
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+370	        elif self.type == ColorType.STANDARD:
+371	            assert self.number is not None
+372	            return theme.ansi_colors[self.number]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 374
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+373	        elif self.type == ColorType.WINDOWS:
+374	            assert self.number is not None
+375	            return WINDOWS_PALETTE[self.number]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 377
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+376	        else:  # self.type == ColorType.DEFAULT:
+377	            assert self.number is None
+378	            return theme.foreground_color if foreground else theme.background_color
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 493
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+492	            number = self.number
+493	            assert number is not None
+494	            fore, back = (30, 40) if number < 8 else (82, 92)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 499
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+498	            number = self.number
+499	            assert number is not None
+500	            fore, back = (30, 40) if number < 8 else (82, 92)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 504
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+503	        elif _type == ColorType.EIGHT_BIT:
+504	            assert self.number is not None
+505	            return ("38" if foreground else "48", "5", str(self.number))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 508
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+507	        else:  # self.standard == ColorStandard.TRUECOLOR:
+508	            assert self.triplet is not None
+509	            red, green, blue = self.triplet
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 520
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+519	        if system == ColorSystem.EIGHT_BIT and self.system == ColorSystem.TRUECOLOR:
+520	            assert self.triplet is not None
+521	            _h, l, s = rgb_to_hls(*self.triplet.normalized)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 546
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+545	            if self.system == ColorSystem.TRUECOLOR:
+546	                assert self.triplet is not None
+547	                triplet = self.triplet
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 549
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+548	            else:  # self.system == ColorSystem.EIGHT_BIT
+549	                assert self.number is not None
+550	                triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 557
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+556	            if self.system == ColorSystem.TRUECOLOR:
+557	                assert self.triplet is not None
+558	                triplet = self.triplet
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 560
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+559	            else:  # self.system == ColorSystem.EIGHT_BIT
+560	                assert self.number is not None
+561	                if self.number < 16:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 573
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+572	    """Parse six hex characters in to RGB triplet."""
+573	    assert len(hex_color) == 6, "must be 6 characters"
+574	    color = ColorTriplet(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py
+ Line number: 1135
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1134	
+1135	        assert count >= 0, "count must be >= 0"
+1136	        self.print(NewLine(count))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py
+ Line number: 1900
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1899	                offset -= 1
+1900	            assert frame is not None
+1901	            return frame.f_code.co_filename, frame.f_lineno, frame.f_locals
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py
+ Line number: 2138
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2137	        """
+2138	        assert (
+2139	            self.record
+2140	        ), "To export console contents set record=True in the constructor or instance"
+2141	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py
+ Line number: 2194
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2193	        """
+2194	        assert (
+2195	            self.record
+2196	        ), "To export console contents set record=True in the constructor or instance"
+2197	        fragments: List[str] = []
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py
+ Line number: 65
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+64	    ) -> None:
+65	        assert refresh_per_second > 0, "refresh_per_second must be > 0"
+66	        self._renderable = renderable
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py
+ Line number: 352
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+351	                time.sleep(0.4)
+352	                if random.randint(0, 10) < 1:
+353	                    console.log(next(examples))
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py
+ Line number: 355
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+354	                exchange_rate_dict[(select_exchange, exchange)] = 200 / (
+355	                    (random.random() * 320) + 1
+356	                )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py
+ Line number: 136
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+135	            exc_type, exc_value, exc_traceback = record.exc_info
+136	            assert exc_type is not None
+137	            assert exc_value is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py
+ Line number: 137
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+136	            assert exc_type is not None
+137	            assert exc_value is not None
+138	            traceback = Traceback.from_exception(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py
+ Line number: 191
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+190	    console = console or get_console()
+191	    assert console is not None
+192	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py
+ Line number: 196
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+195	        if value is not None:
+196	            assert console is not None
+197	            builtins._ = None  # type: ignore[attr-defined]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py
+ Line number: 496
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+495	        )
+496	        assert self.node is not None
+497	        return self.node.check_length(start_length, max_length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py
+ Line number: 502
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+501	        node = self.node
+502	        assert node is not None
+503	        whitespace = self.whitespace
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py
+ Line number: 504
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+503	        whitespace = self.whitespace
+504	        assert node.children
+505	        if node.key_repr:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py
+ Line number: 641
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+640	                    rich_repr_result = obj.__rich_repr__()
+641	            except Exception:
+642	                pass
+643	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py
+ Line number: 1080
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1079	    ) -> None:
+1080	        assert refresh_per_second > 0, "refresh_per_second must be > 0"
+1081	        self._lock = RLock()
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py
+ Line number: 1701
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+1700	            time.sleep(0.01)
+1701	            if random.randint(0, 100) < 1:
+1702	                progress.log(next(examples))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py
+ Line number: 214
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+213	        """
+214	        assert self.choices is not None
+215	        return value.strip() in self.choices
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py
+ Line number: 193
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+192	        self._link_id = (
+193	            f"{randint(0, 999999)}{hash(self._meta)}" if (link or meta) else ""
+194	        )
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py
+ Line number: 243
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+242	        style._meta = dumps(meta)
+243	        style._link_id = f"{randint(0, 999999)}{hash(style._meta)}"
+244	        style._hash = None
+
+
+ + +
+
+ +
+
+ blacklist: Deserialization with the marshal module is possibly dangerous.
+ Test ID: B302
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py
+ Line number: 475
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b302-marshal
+ +
+
+474	        """Get meta information (can not be changed after construction)."""
+475	        return {} if self._meta is None else cast(Dict[str, Any], loads(self._meta))
+476	
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py
+ Line number: 490
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+489	        style._link = self._link
+490	        style._link_id = f"{randint(0, 999999)}" if self._link else ""
+491	        style._null = False
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py
+ Line number: 642
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+641	        style._link = self._link
+642	        style._link_id = f"{randint(0, 999999)}" if self._link else ""
+643	        style._hash = self._hash
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py
+ Line number: 688
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+687	        style._link = link
+688	        style._link_id = f"{randint(0, 999999)}" if link else ""
+689	        style._hash = None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py
+ Line number: 482
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+481	                    """Split tokens to one per line."""
+482	                    assert lexer  # required to make MyPy happy - we know lexer is not None at this point
+483	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py
+ Line number: 787
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+786	            tab_size = self.tab_size
+787	        assert tab_size is not None
+788	        result = self.blank_copy()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py
+ Line number: 856
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+855	        """
+856	        assert len(character) == 1, "Character must be a string of length 1"
+857	        if count:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py
+ Line number: 873
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+872	        """
+873	        assert len(character) == 1, "Character must be a string of length 1"
+874	        if count:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py
+ Line number: 889
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+888	        """
+889	        assert len(character) == 1, "Character must be a string of length 1"
+890	        if count:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py
+ Line number: 1024
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1023	        """
+1024	        assert separator, "separator must not be empty"
+1025	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py
+ Line number: 282
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+281	            if not isinstance(suppress_entity, str):
+282	                assert (
+283	                    suppress_entity.__file__ is not None
+284	                ), f"{suppress_entity!r} must be a module with '__file__' attribute"
+285	                path = os.path.dirname(suppress_entity.__file__)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py
+ Line number: 645
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+644	            if excluded:
+645	                assert exclude_frames is not None
+646	                yield Text(
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/six.py
+ Line number: 735
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+734	            _locs_ = _globs_
+735	        exec("""exec _code_ in _globs_, _locs_""")
+736	
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py
+ Line number: 72
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+71	    def __call__(self, retry_state: "RetryCallState") -> float:
+72	        return self.wait_random_min + (random.random() * (self.wait_random_max - self.wait_random_min))
+73	
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py
+ Line number: 194
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+193	        high = super().__call__(retry_state=retry_state)
+194	        return random.uniform(0, high)
+195	
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py
+ Line number: 222
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+221	    def __call__(self, retry_state: "RetryCallState") -> float:
+222	        jitter = random.uniform(0, self.jitter)
+223	        try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py
+ Line number: 374
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+373	                            deduped_pairs.remove(pair)
+374	                    assert not deduped_pairs, deduped_pairs
+375	                    parameters = tuple(new_parameters)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py
+ Line number: 1300
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1299	        def copy_with(self, params):
+1300	            assert len(params) == 1
+1301	            new_type = params[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py
+ Line number: 2613
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2612	        def __new__(cls, typename, bases, ns):
+2613	            assert _NamedTuple in bases
+2614	            for base in bases:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py
+ Line number: 2654
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2653	    def _namedtuple_mro_entries(bases):
+2654	        assert NamedTuple in bases
+2655	        return (_NamedTuple,)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py
+ Line number: 719
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+718	            leaf = Security.SecTrustGetCertificateAtIndex(trust, 0)
+719	            assert leaf
+720	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py
+ Line number: 723
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+722	            certdata = Security.SecCertificateCopyData(leaf)
+723	            assert certdata
+724	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py
+ Line number: 901
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+900	        # See PEP 543 for the real deal.
+901	        assert not server_side
+902	        assert do_handshake_on_connect
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py
+ Line number: 902
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+901	        assert not server_side
+902	        assert do_handshake_on_connect
+903	        assert suppress_ragged_eofs
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py
+ Line number: 903
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+902	        assert do_handshake_on_connect
+903	        assert suppress_ragged_eofs
+904	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py
+ Line number: 23
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+22	    reading = "r" in mode or not writing
+23	    assert reading or writing
+24	    binary = "b" in mode
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py
+ Line number: 45
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+44	    else:
+45	        assert writing
+46	        buffer = io.BufferedWriter(raw, buffering)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py
+ Line number: 150
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+149	                        sys.excepthook(*sys.exc_info())
+150	                    assert f not in cls._registry
+151	        finally:
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py
+ Line number: 787
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+786	            _locs_ = _globs_
+787	        exec ("""exec _code_ in _globs_, _locs_""")
+788	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py
+ Line number: 495
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+494	        """
+495	        assert self._fp
+496	        c_int_max = 2 ** 31 - 1
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py
+ Line number: 141
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+140	            has_ipv6 = True
+141	        except Exception:
+142	            pass
+143	
+
+
+ + +
+
+ +
+
+ ssl_with_no_version: ssl.wrap_socket call with no SSL/TLS protocol version specified, the default SSLv23 could be insecure, possible security issue.
+ Test ID: B504
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py
+ Line number: 179
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b504_ssl_with_no_version.html
+ +
+
+178	            }
+179	            return wrap_socket(socket, ciphers=self.ciphers, **kwargs)
+180	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py
+ Line number: 120
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+119	        reading = "r" in mode or not writing
+120	        assert reading or writing
+121	        binary = "b" in mode
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py
+ Line number: 142
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+141	        else:
+142	            assert writing
+143	            buffer = io.BufferedWriter(raw, buffering)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py
+ Line number: 224
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+223	        if output:
+224	            assert decoder.encoding is not None
+225	            yield decoder.encoding
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py
+ Line number: 231
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+230	        output = decode(b'', final=True)
+231	        assert decoder.encoding is not None
+232	        yield decoder.encoding
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py
+ Line number: 21
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+20	def assert_lower(string):
+21	    assert string == string.lower()
+22	    return string
+
+
+ + +
+
+ +
+
+ blacklist: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
+ Test ID: B310
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py
+ Line number: 47
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b310-urllib-urlopen
+ +
+
+46	         repr(encoding['name']).lstrip('u'))
+47	        for category in json.loads(urlopen(url).read().decode('ascii'))
+48	        for encoding in category['encodings']
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 30
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+29	def test_labels():
+30	    assert lookup('utf-8').name == 'utf-8'
+31	    assert lookup('Utf-8').name == 'utf-8'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 31
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+30	    assert lookup('utf-8').name == 'utf-8'
+31	    assert lookup('Utf-8').name == 'utf-8'
+32	    assert lookup('UTF-8').name == 'utf-8'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 32
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+31	    assert lookup('Utf-8').name == 'utf-8'
+32	    assert lookup('UTF-8').name == 'utf-8'
+33	    assert lookup('utf8').name == 'utf-8'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 33
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+32	    assert lookup('UTF-8').name == 'utf-8'
+33	    assert lookup('utf8').name == 'utf-8'
+34	    assert lookup('utf8').name == 'utf-8'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 34
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+33	    assert lookup('utf8').name == 'utf-8'
+34	    assert lookup('utf8').name == 'utf-8'
+35	    assert lookup('utf8 ').name == 'utf-8'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 35
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+34	    assert lookup('utf8').name == 'utf-8'
+35	    assert lookup('utf8 ').name == 'utf-8'
+36	    assert lookup(' \r\nutf8\t').name == 'utf-8'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 36
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+35	    assert lookup('utf8 ').name == 'utf-8'
+36	    assert lookup(' \r\nutf8\t').name == 'utf-8'
+37	    assert lookup('u8') is None  # Python label.
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 37
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+36	    assert lookup(' \r\nutf8\t').name == 'utf-8'
+37	    assert lookup('u8') is None  # Python label.
+38	    assert lookup('utf-8 ') is None  # Non-ASCII white space.
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 38
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+37	    assert lookup('u8') is None  # Python label.
+38	    assert lookup('utf-8 ') is None  # Non-ASCII white space.
+39	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 40
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+39	
+40	    assert lookup('US-ASCII').name == 'windows-1252'
+41	    assert lookup('iso-8859-1').name == 'windows-1252'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 41
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+40	    assert lookup('US-ASCII').name == 'windows-1252'
+41	    assert lookup('iso-8859-1').name == 'windows-1252'
+42	    assert lookup('latin1').name == 'windows-1252'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 42
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+41	    assert lookup('iso-8859-1').name == 'windows-1252'
+42	    assert lookup('latin1').name == 'windows-1252'
+43	    assert lookup('LATIN1').name == 'windows-1252'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 43
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+42	    assert lookup('latin1').name == 'windows-1252'
+43	    assert lookup('LATIN1').name == 'windows-1252'
+44	    assert lookup('latin-1') is None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 44
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+43	    assert lookup('LATIN1').name == 'windows-1252'
+44	    assert lookup('latin-1') is None
+45	    assert lookup('LATİN1') is None  # ASCII-only case insensitivity.
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 45
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+44	    assert lookup('latin-1') is None
+45	    assert lookup('LATİN1') is None  # ASCII-only case insensitivity.
+46	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 50
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+49	    for label in LABELS:
+50	        assert decode(b'', label) == ('', lookup(label))
+51	        assert encode('', label) == b''
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 51
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+50	        assert decode(b'', label) == ('', lookup(label))
+51	        assert encode('', label) == b''
+52	        for repeat in [0, 1, 12]:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 54
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+53	            output, _ = iter_decode([b''] * repeat, label)
+54	            assert list(output) == []
+55	            assert list(iter_encode([''] * repeat, label)) == []
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 55
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+54	            assert list(output) == []
+55	            assert list(iter_encode([''] * repeat, label)) == []
+56	        decoder = IncrementalDecoder(label)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 57
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+56	        decoder = IncrementalDecoder(label)
+57	        assert decoder.decode(b'') == ''
+58	        assert decoder.decode(b'', final=True) == ''
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 58
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+57	        assert decoder.decode(b'') == ''
+58	        assert decoder.decode(b'', final=True) == ''
+59	        encoder = IncrementalEncoder(label)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 60
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+59	        encoder = IncrementalEncoder(label)
+60	        assert encoder.encode('') == b''
+61	        assert encoder.encode('', final=True) == b''
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+60	        assert encoder.encode('') == b''
+61	        assert encoder.encode('', final=True) == b''
+62	    # All encoding names are valid labels too:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 64
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+63	    for name in set(LABELS.values()):
+64	        assert lookup(name).name == name
+65	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 77
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+76	def test_decode():
+77	    assert decode(b'\x80', 'latin1') == ('€', lookup('latin1'))
+78	    assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 78
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+77	    assert decode(b'\x80', 'latin1') == ('€', lookup('latin1'))
+78	    assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1'))
+79	    assert decode(b'\xc3\xa9', 'utf8') == ('é', lookup('utf8'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 79
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+78	    assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1'))
+79	    assert decode(b'\xc3\xa9', 'utf8') == ('é', lookup('utf8'))
+80	    assert decode(b'\xc3\xa9', UTF8) == ('é', lookup('utf8'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 80
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+79	    assert decode(b'\xc3\xa9', 'utf8') == ('é', lookup('utf8'))
+80	    assert decode(b'\xc3\xa9', UTF8) == ('é', lookup('utf8'))
+81	    assert decode(b'\xc3\xa9', 'ascii') == ('é', lookup('ascii'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 81
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+80	    assert decode(b'\xc3\xa9', UTF8) == ('é', lookup('utf8'))
+81	    assert decode(b'\xc3\xa9', 'ascii') == ('é', lookup('ascii'))
+82	    assert decode(b'\xEF\xBB\xBF\xc3\xa9', 'ascii') == ('é', lookup('utf8'))  # UTF-8 with BOM
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 82
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+81	    assert decode(b'\xc3\xa9', 'ascii') == ('é', lookup('ascii'))
+82	    assert decode(b'\xEF\xBB\xBF\xc3\xa9', 'ascii') == ('é', lookup('utf8'))  # UTF-8 with BOM
+83	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 84
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+83	
+84	    assert decode(b'\xFE\xFF\x00\xe9', 'ascii') == ('é', lookup('utf-16be'))  # UTF-16-BE with BOM
+85	    assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('é', lookup('utf-16le'))  # UTF-16-LE with BOM
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 85
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+84	    assert decode(b'\xFE\xFF\x00\xe9', 'ascii') == ('é', lookup('utf-16be'))  # UTF-16-BE with BOM
+85	    assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('é', lookup('utf-16le'))  # UTF-16-LE with BOM
+86	    assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 86
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+85	    assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('é', lookup('utf-16le'))  # UTF-16-LE with BOM
+86	    assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be'))
+87	    assert decode(b'\xFF\xFE\x00\xe9', 'ascii') == ('\ue900', lookup('utf-16le'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 87
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+86	    assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be'))
+87	    assert decode(b'\xFF\xFE\x00\xe9', 'ascii') == ('\ue900', lookup('utf-16le'))
+88	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 89
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+88	
+89	    assert decode(b'\x00\xe9', 'UTF-16BE') == ('é', lookup('utf-16be'))
+90	    assert decode(b'\xe9\x00', 'UTF-16LE') == ('é', lookup('utf-16le'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 90
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+89	    assert decode(b'\x00\xe9', 'UTF-16BE') == ('é', lookup('utf-16be'))
+90	    assert decode(b'\xe9\x00', 'UTF-16LE') == ('é', lookup('utf-16le'))
+91	    assert decode(b'\xe9\x00', 'UTF-16') == ('é', lookup('utf-16le'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 91
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+90	    assert decode(b'\xe9\x00', 'UTF-16LE') == ('é', lookup('utf-16le'))
+91	    assert decode(b'\xe9\x00', 'UTF-16') == ('é', lookup('utf-16le'))
+92	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 93
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+92	
+93	    assert decode(b'\xe9\x00', 'UTF-16BE') == ('\ue900', lookup('utf-16be'))
+94	    assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 94
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+93	    assert decode(b'\xe9\x00', 'UTF-16BE') == ('\ue900', lookup('utf-16be'))
+94	    assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le'))
+95	    assert decode(b'\x00\xe9', 'UTF-16') == ('\ue900', lookup('utf-16le'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 95
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+94	    assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le'))
+95	    assert decode(b'\x00\xe9', 'UTF-16') == ('\ue900', lookup('utf-16le'))
+96	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 99
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+98	def test_encode():
+99	    assert encode('é', 'latin1') == b'\xe9'
+100	    assert encode('é', 'utf8') == b'\xc3\xa9'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 100
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+99	    assert encode('é', 'latin1') == b'\xe9'
+100	    assert encode('é', 'utf8') == b'\xc3\xa9'
+101	    assert encode('é', 'utf8') == b'\xc3\xa9'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 101
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+100	    assert encode('é', 'utf8') == b'\xc3\xa9'
+101	    assert encode('é', 'utf8') == b'\xc3\xa9'
+102	    assert encode('é', 'utf-16') == b'\xe9\x00'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 102
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+101	    assert encode('é', 'utf8') == b'\xc3\xa9'
+102	    assert encode('é', 'utf-16') == b'\xe9\x00'
+103	    assert encode('é', 'utf-16le') == b'\xe9\x00'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 103
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+102	    assert encode('é', 'utf-16') == b'\xe9\x00'
+103	    assert encode('é', 'utf-16le') == b'\xe9\x00'
+104	    assert encode('é', 'utf-16be') == b'\x00\xe9'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 104
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+103	    assert encode('é', 'utf-16le') == b'\xe9\x00'
+104	    assert encode('é', 'utf-16be') == b'\x00\xe9'
+105	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 111
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+110	        return ''.join(output)
+111	    assert iter_decode_to_string([], 'latin1') == ''
+112	    assert iter_decode_to_string([b''], 'latin1') == ''
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 112
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+111	    assert iter_decode_to_string([], 'latin1') == ''
+112	    assert iter_decode_to_string([b''], 'latin1') == ''
+113	    assert iter_decode_to_string([b'\xe9'], 'latin1') == 'é'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 113
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+112	    assert iter_decode_to_string([b''], 'latin1') == ''
+113	    assert iter_decode_to_string([b'\xe9'], 'latin1') == 'é'
+114	    assert iter_decode_to_string([b'hello'], 'latin1') == 'hello'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 114
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+113	    assert iter_decode_to_string([b'\xe9'], 'latin1') == 'é'
+114	    assert iter_decode_to_string([b'hello'], 'latin1') == 'hello'
+115	    assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 115
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+114	    assert iter_decode_to_string([b'hello'], 'latin1') == 'hello'
+115	    assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello'
+116	    assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 116
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+115	    assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello'
+116	    assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello'
+117	    assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'é'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 117
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+116	    assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello'
+117	    assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'é'
+118	    assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'é'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 118
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+117	    assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'é'
+118	    assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'é'
+119	    assert iter_decode_to_string([
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 119
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+118	    assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'é'
+119	    assert iter_decode_to_string([
+120	        b'\xEF\xBB\xBF', b'\xc3', b'\xa9'], 'latin1') == 'é'
+121	    assert iter_decode_to_string([
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 121
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+120	        b'\xEF\xBB\xBF', b'\xc3', b'\xa9'], 'latin1') == 'é'
+121	    assert iter_decode_to_string([
+122	        b'\xEF\xBB\xBF', b'a', b'\xc3'], 'latin1') == 'a\uFFFD'
+123	    assert iter_decode_to_string([
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 123
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+122	        b'\xEF\xBB\xBF', b'a', b'\xc3'], 'latin1') == 'a\uFFFD'
+123	    assert iter_decode_to_string([
+124	        b'', b'\xEF', b'', b'', b'\xBB\xBF\xc3', b'\xa9'], 'latin1') == 'é'
+125	    assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == ''
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 125
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+124	        b'', b'\xEF', b'', b'', b'\xBB\xBF\xc3', b'\xa9'], 'latin1') == 'é'
+125	    assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == ''
+126	    assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 126
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+125	    assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == ''
+126	    assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»'
+127	    assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'é'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 127
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+126	    assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»'
+127	    assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'é'
+128	    assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'é'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 128
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+127	    assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'é'
+128	    assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'é'
+129	    assert iter_decode_to_string([
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 129
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+128	    assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'é'
+129	    assert iter_decode_to_string([
+130	        b'', b'\xFF', b'', b'', b'\xFE\xe9', b'\x00'], 'latin1') == 'é'
+131	    assert iter_decode_to_string([
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 131
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+130	        b'', b'\xFF', b'', b'', b'\xFE\xe9', b'\x00'], 'latin1') == 'é'
+131	    assert iter_decode_to_string([
+132	        b'', b'h\xe9', b'llo'], 'x-user-defined') == 'h\uF7E9llo'
+133	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 136
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+135	def test_iter_encode():
+136	    assert b''.join(iter_encode([], 'latin1')) == b''
+137	    assert b''.join(iter_encode([''], 'latin1')) == b''
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 137
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+136	    assert b''.join(iter_encode([], 'latin1')) == b''
+137	    assert b''.join(iter_encode([''], 'latin1')) == b''
+138	    assert b''.join(iter_encode(['é'], 'latin1')) == b'\xe9'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 138
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+137	    assert b''.join(iter_encode([''], 'latin1')) == b''
+138	    assert b''.join(iter_encode(['é'], 'latin1')) == b'\xe9'
+139	    assert b''.join(iter_encode(['', 'é', '', ''], 'latin1')) == b'\xe9'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 139
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+138	    assert b''.join(iter_encode(['é'], 'latin1')) == b'\xe9'
+139	    assert b''.join(iter_encode(['', 'é', '', ''], 'latin1')) == b'\xe9'
+140	    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16')) == b'\xe9\x00'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 140
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+139	    assert b''.join(iter_encode(['', 'é', '', ''], 'latin1')) == b'\xe9'
+140	    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16')) == b'\xe9\x00'
+141	    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16le')) == b'\xe9\x00'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 141
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+140	    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16')) == b'\xe9\x00'
+141	    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16le')) == b'\xe9\x00'
+142	    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16be')) == b'\x00\xe9'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 142
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+141	    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16le')) == b'\xe9\x00'
+142	    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16be')) == b'\x00\xe9'
+143	    assert b''.join(iter_encode([
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 143
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+142	    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16be')) == b'\x00\xe9'
+143	    assert b''.join(iter_encode([
+144	        '', 'h\uF7E9', '', 'llo'], 'x-user-defined')) == b'h\xe9llo'
+145	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 152
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+151	    decoded = 'aa'
+152	    assert decode(encoded, 'x-user-defined') == (decoded, lookup('x-user-defined'))
+153	    assert encode(decoded, 'x-user-defined') == encoded
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 153
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+152	    assert decode(encoded, 'x-user-defined') == (decoded, lookup('x-user-defined'))
+153	    assert encode(decoded, 'x-user-defined') == encoded
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/cmdline.py
+ Line number: 522
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+521	                width = shutil.get_terminal_size().columns - 2
+522	            except Exception:
+523	                pass
+524	        argparse.HelpFormatter.__init__(self, prog, indent_increment,
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pygments/formatters/__init__.py
+ Line number: 103
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+102	        with open(filename, 'rb') as f:
+103	            exec(f.read(), custom_namespace)
+104	        # Retrieve the class `formattername` from that namespace
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pygments/formatters/img.py
+ Line number: 17
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+16	
+17	import subprocess
+18	
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pygments/formatters/img.py
+ Line number: 93
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+92	    def _get_nix_font_path(self, name, style):
+93	        proc = subprocess.Popen(['fc-list', f"{name}:style={style}", 'file'],
+94	                                stdout=subprocess.PIPE, stderr=None)
+95	        stdout, _ = proc.communicate()
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pygments/formatters/img.py
+ Line number: 93
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+92	    def _get_nix_font_path(self, name, style):
+93	        proc = subprocess.Popen(['fc-list', f"{name}:style={style}", 'file'],
+94	                                stdout=subprocess.PIPE, stderr=None)
+95	        stdout, _ = proc.communicate()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 514
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+513	        """Preprocess the token component of a token definition."""
+514	        assert type(token) is _TokenType or callable(token), \
+515	            f'token type must be simple type or callable, not {token!r}'
+516	        return token
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 531
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+530	            else:
+531	                assert False, f'unknown new state {new_state!r}'
+532	        elif isinstance(new_state, combined):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 538
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+537	            for istate in new_state:
+538	                assert istate != new_state, f'circular state ref {istate!r}'
+539	                itokens.extend(cls._process_state(unprocessed,
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 546
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+545	            for istate in new_state:
+546	                assert (istate in unprocessed or
+547	                        istate in ('#pop', '#push')), \
+548	                    'unknown new state ' + istate
+549	            return new_state
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 551
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+550	        else:
+551	            assert False, f'unknown new state def {new_state!r}'
+552	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 555
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+554	        """Preprocess a single state definition."""
+555	        assert isinstance(state, str), f"wrong state name {state!r}"
+556	        assert state[0] != '#', f"invalid state name {state!r}"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 556
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+555	        assert isinstance(state, str), f"wrong state name {state!r}"
+556	        assert state[0] != '#', f"invalid state name {state!r}"
+557	        if state in processed:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 564
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+563	                # it's a state reference
+564	                assert tdef != state, f"circular state reference {state!r}"
+565	                tokens.extend(cls._process_state(unprocessed, processed,
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 578
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+577	
+578	            assert type(tdef) is tuple, f"wrong rule def {tdef!r}"
+579	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 744
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+743	                        else:
+744	                            assert False, f"wrong state def: {new_state!r}"
+745	                        statetokens = tokendefs[statestack[-1]]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 831
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+830	                        else:
+831	                            assert False, f"wrong state def: {new_state!r}"
+832	                        statetokens = tokendefs[ctx.stack[-1]]
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/__init__.py
+ Line number: 154
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+153	        with open(filename, 'rb') as f:
+154	            exec(f.read(), custom_namespace)
+155	        # Retrieve the class `lexername` from that namespace
+
+
+ + +
+
+ +
+
+ blacklist: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
+ Test ID: B310
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_lua_builtins.py
+ Line number: 225
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b310-urllib-urlopen
+ +
+
+224	    def get_newest_version():
+225	        f = urlopen('http://www.lua.org/manual/')
+226	        r = re.compile(r'^<A HREF="(\d\.\d)/">(Lua )?\1</A>')
+
+
+ + +
+
+ +
+
+ blacklist: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
+ Test ID: B310
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_lua_builtins.py
+ Line number: 233
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b310-urllib-urlopen
+ +
+
+232	    def get_lua_functions(version):
+233	        f = urlopen(f'http://www.lua.org/manual/{version}/')
+234	        r = re.compile(r'^<A HREF="manual.html#pdf-(?!lua|LUA)([^:]+)">\1</A>')
+
+
+ + +
+
+ +
+
+ blacklist: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
+ Test ID: B310
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_mysql_builtins.py
+ Line number: 1297
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b310-urllib-urlopen
+ +
+
+1296	        # Pull content from lex.h.
+1297	        lex_file = urlopen(LEX_URL).read().decode('utf8', errors='ignore')
+1298	        keywords = parse_lex_keywords(lex_file)
+
+
+ + +
+
+ +
+
+ blacklist: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
+ Test ID: B310
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_mysql_builtins.py
+ Line number: 1303
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b310-urllib-urlopen
+ +
+
+1302	        # Parse content in item_create.cc.
+1303	        item_create_file = urlopen(ITEM_CREATE_URL).read().decode('utf8', errors='ignore')
+1304	        functions.update(parse_item_create_functions(item_create_file))
+
+
+ + +
+
+ +
+
+ blacklist: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
+ Test ID: B310
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_php_builtins.py
+ Line number: 3299
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b310-urllib-urlopen
+ +
+
+3298	    def get_php_references():
+3299	        download = urlretrieve(PHP_MANUAL_URL)
+3300	        with tarfile.open(download[0]) as tar:
+
+
+ + +
+
+ +
+
+ tarfile_unsafe_members: tarfile.extractall used without any validation. Please check and discard dangerous members.
+ Test ID: B202
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_php_builtins.py
+ Line number: 3304
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b202_tarfile_unsafe_members.html
+ +
+
+3303	            else:
+3304	                tar.extractall()
+3305	        yield from glob.glob(f"{PHP_MANUAL_DIR}{PHP_REFERENCE_GLOB}")
+
+
+ + +
+
+ +
+
+ blacklist: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
+ Test ID: B310
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_postgres_builtins.py
+ Line number: 642
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b310-urllib-urlopen
+ +
+
+641	    def update_myself():
+642	        content = urlopen(DATATYPES_URL).read().decode('utf-8', errors='ignore')
+643	        data_file = list(content.splitlines())
+
+
+ + +
+
+ +
+
+ blacklist: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
+ Test ID: B310
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_postgres_builtins.py
+ Line number: 647
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b310-urllib-urlopen
+ +
+
+646	
+647	        content = urlopen(KEYWORDS_URL).read().decode('utf-8', errors='ignore')
+648	        keywords = parse_keywords(content)
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_scilab_builtins.py
+ Line number: 3055
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+3054	if __name__ == '__main__':  # pragma: no cover
+3055	    import subprocess
+3056	    from pygments.util import format_lines, duplicates_removed
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_scilab_builtins.py
+ Line number: 3061
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+3060	    def extract_completion(var_type):
+3061	        s = subprocess.Popen(['scilab', '-nwni'], stdin=subprocess.PIPE,
+3062	                             stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+3063	        output = s.communicate(f'''\
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_scilab_builtins.py
+ Line number: 3061
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+3060	    def extract_completion(var_type):
+3061	        s = subprocess.Popen(['scilab', '-nwni'], stdin=subprocess.PIPE,
+3062	                             stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+3063	        output = s.communicate(f'''\
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'root'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/int_fiction.py
+ Line number: 728
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+727	        for token in Inform6Lexer.tokens:
+728	            if token == 'root':
+729	                continue
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '[^\W\d]\w*'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/jsonnet.py
+ Line number: 17
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+16	
+17	jsonnet_token = r'[^\W\d]\w*'
+18	jsonnet_function_token = jsonnet_token + r'(?=\()'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/lilypond.py
+ Line number: 43
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+42	    else:
+43	        assert backslash == "disallowed"
+44	    return words(names, prefix, suffix)
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: ' + (?= + \s # whitespace + | ; # comment + | \#[;|!] # fancy comments + | [)\]] # end delimiters + | $ # end of file + ) + '
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/lisp.py
+ Line number: 50
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+49	    # Use within verbose regexes
+50	    token_end = r'''
+51	      (?=
+52	        \s         # whitespace
+53	        | ;        # comment
+54	        | \#[;|!] # fancy comments
+55	        | [)\]]    # end delimiters
+56	        | $        # end of file
+57	      )
+58	    '''
+59	
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '(?=\s|#|[)\]]|$)'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/lisp.py
+ Line number: 3047
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+3046	    # ...so, express it like this
+3047	    _token_end = r'(?=\s|#|[)\]]|$)'
+3048	
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '[A-Z]\w*'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/parsers.py
+ Line number: 334
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+333	    _id = r'[A-Za-z]\w*'
+334	    _TOKEN_REF = r'[A-Z]\w*'
+335	    _RULE_REF = r'[a-z]\w*'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/scripting.py
+ Line number: 1499
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1498	                        result += 0.01
+1499	        assert 0.0 <= result <= 1.0
+1500	        return result
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/scripting.py
+ Line number: 1583
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1582	                result = 1.0
+1583	        assert 0.0 <= result <= 1.0
+1584	        return result
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/sql.py
+ Line number: 236
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+235	    else:
+236	        assert 0, "SQL keywords not found"
+237	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/style.py
+ Line number: 79
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+78	                return text
+79	            assert False, f"wrong color format {text!r}"
+80	
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '㊙'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/rich/_emoji_codes.py
+ Line number: 156
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+155	    "japanese_reserved_button": "🈯",
+156	    "japanese_secret_button": "㊙",
+157	    "japanese_service_charge_button": "🈂",
+158	    "japanese_symbol_for_beginner": "🔰",
+159	    "japanese_vacancy_button": "🈳",
+160	    "jersey": "🇯🇪",
+161	    "jordan": "🇯🇴",
+162	    "kazakhstan": "🇰🇿",
+163	    "kenya": "🇰🇪",
+164	    "kiribati": "🇰🇮",
+165	    "kosovo": "🇽🇰",
+166	    "kuwait": "🇰🇼",
+167	    "kyrgyzstan": "🇰🇬",
+168	    "laos": "🇱🇦",
+169	    "latvia": "🇱🇻",
+170	    "lebanon": "🇱🇧",
+171	    "leo": "♌",
+172	    "lesotho": "🇱🇸",
+173	    "liberia": "🇱🇷",
+174	    "libra": "♎",
+175	    "libya": "🇱🇾",
+176	    "liechtenstein": "🇱🇮",
+177	    "lithuania": "🇱🇹",
+178	    "luxembourg": "🇱🇺",
+179	    "macau_sar_china": "🇲🇴",
+180	    "macedonia": "🇲🇰",
+181	    "madagascar": "🇲🇬",
+182	    "malawi": "🇲🇼",
+183	    "malaysia": "🇲🇾",
+184	    "maldives": "🇲🇻",
+185	    "mali": "🇲🇱",
+186	    "malta": "🇲🇹",
+187	    "marshall_islands": "🇲🇭",
+188	    "martinique": "🇲🇶",
+189	    "mauritania": "🇲🇷",
+190	    "mauritius": "🇲🇺",
+191	    "mayotte": "🇾🇹",
+192	    "mexico": "🇲🇽",
+193	    "micronesia": "🇫🇲",
+194	    "moldova": "🇲🇩",
+195	    "monaco": "🇲🇨",
+196	    "mongolia": "🇲🇳",
+197	    "montenegro": "🇲🇪",
+198	    "montserrat": "🇲🇸",
+199	    "morocco": "🇲🇦",
+200	    "mozambique": "🇲🇿",
+201	    "mrs._claus": "🤶",
+202	    "mrs._claus_dark_skin_tone": "🤶🏿",
+203	    "mrs._claus_light_skin_tone": "🤶🏻",
+204	    "mrs._claus_medium-dark_skin_tone": "🤶🏾",
+205	    "mrs._claus_medium-light_skin_tone": "🤶🏼",
+206	    "mrs._claus_medium_skin_tone": "🤶🏽",
+207	    "myanmar_(burma)": "🇲🇲",
+208	    "new_button": "🆕",
+209	    "ng_button": "🆖",
+210	    "namibia": "🇳🇦",
+211	    "nauru": "🇳🇷",
+212	    "nepal": "🇳🇵",
+213	    "netherlands": "🇳🇱",
+214	    "new_caledonia": "🇳🇨",
+215	    "new_zealand": "🇳🇿",
+216	    "nicaragua": "🇳🇮",
+217	    "niger": "🇳🇪",
+218	    "nigeria": "🇳🇬",
+219	    "niue": "🇳🇺",
+220	    "norfolk_island": "🇳🇫",
+221	    "north_korea": "🇰🇵",
+222	    "northern_mariana_islands": "🇲🇵",
+223	    "norway": "🇳🇴",
+224	    "ok_button": "🆗",
+225	    "ok_hand": "👌",
+226	    "ok_hand_dark_skin_tone": "👌🏿",
+227	    "ok_hand_light_skin_tone": "👌🏻",
+228	    "ok_hand_medium-dark_skin_tone": "👌🏾",
+229	    "ok_hand_medium-light_skin_tone": "👌🏼",
+230	    "ok_hand_medium_skin_tone": "👌🏽",
+231	    "on!_arrow": "🔛",
+232	    "o_button_(blood_type)": "🅾",
+233	    "oman": "🇴🇲",
+234	    "ophiuchus": "⛎",
+235	    "p_button": "🅿",
+236	    "pakistan": "🇵🇰",
+237	    "palau": "🇵🇼",
+238	    "palestinian_territories": "🇵🇸",
+239	    "panama": "🇵🇦",
+240	    "papua_new_guinea": "🇵🇬",
+241	    "paraguay": "🇵🇾",
+242	    "peru": "🇵🇪",
+243	    "philippines": "🇵🇭",
+244	    "pisces": "♓",
+245	    "pitcairn_islands": "🇵🇳",
+246	    "poland": "🇵🇱",
+247	    "portugal": "🇵🇹",
+248	    "puerto_rico": "🇵🇷",
+249	    "qatar": "🇶🇦",
+250	    "romania": "🇷🇴",
+251	    "russia": "🇷🇺",
+252	    "rwanda": "🇷🇼",
+253	    "réunion": "🇷🇪",
+254	    "soon_arrow": "🔜",
+255	    "sos_button": "🆘",
+256	    "sagittarius": "♐",
+257	    "samoa": "🇼🇸",
+258	    "san_marino": "🇸🇲",
+259	    "santa_claus": "🎅",
+260	    "santa_claus_dark_skin_tone": "🎅🏿",
+261	    "santa_claus_light_skin_tone": "🎅🏻",
+262	    "santa_claus_medium-dark_skin_tone": "🎅🏾",
+263	    "santa_claus_medium-light_skin_tone": "🎅🏼",
+264	    "santa_claus_medium_skin_tone": "🎅🏽",
+265	    "saudi_arabia": "🇸🇦",
+266	    "scorpio": "♏",
+267	    "scotland": "🏴\U000e0067\U000e0062\U000e0073\U000e0063\U000e0074\U000e007f",
+268	    "senegal": "🇸🇳",
+269	    "serbia": "🇷🇸",
+270	    "seychelles": "🇸🇨",
+271	    "sierra_leone": "🇸🇱",
+272	    "singapore": "🇸🇬",
+273	    "sint_maarten": "🇸🇽",
+274	    "slovakia": "🇸🇰",
+275	    "slovenia": "🇸🇮",
+276	    "solomon_islands": "🇸🇧",
+277	    "somalia": "🇸🇴",
+278	    "south_africa": "🇿🇦",
+279	    "south_georgia_&_south_sandwich_islands": "🇬🇸",
+280	    "south_korea": "🇰🇷",
+281	    "south_sudan": "🇸🇸",
+282	    "spain": "🇪🇸",
+283	    "sri_lanka": "🇱🇰",
+284	    "st._barthélemy": "🇧🇱",
+285	    "st._helena": "🇸🇭",
+286	    "st._kitts_&_nevis": "🇰🇳",
+287	    "st._lucia": "🇱🇨",
+288	    "st._martin": "🇲🇫",
+289	    "st._pierre_&_miquelon": "🇵🇲",
+290	    "st._vincent_&_grenadines": "🇻🇨",
+291	    "statue_of_liberty": "🗽",
+292	    "sudan": "🇸🇩",
+293	    "suriname": "🇸🇷",
+294	    "svalbard_&_jan_mayen": "🇸🇯",
+295	    "swaziland": "🇸🇿",
+296	    "sweden": "🇸🇪",
+297	    "switzerland": "🇨🇭",
+298	    "syria": "🇸🇾",
+299	    "são_tomé_&_príncipe": "🇸🇹",
+300	    "t-rex": "🦖",
+301	    "top_arrow": "🔝",
+302	    "taiwan": "🇹🇼",
+303	    "tajikistan": "🇹🇯",
+304	    "tanzania": "🇹🇿",
+305	    "taurus": "♉",
+306	    "thailand": "🇹🇭",
+307	    "timor-leste": "🇹🇱",
+308	    "togo": "🇹🇬",
+309	    "tokelau": "🇹🇰",
+310	    "tokyo_tower": "🗼",
+311	    "tonga": "🇹🇴",
+312	    "trinidad_&_tobago": "🇹🇹",
+313	    "tristan_da_cunha": "🇹🇦",
+314	    "tunisia": "🇹🇳",
+315	    "turkey": "🦃",
+316	    "turkmenistan": "🇹🇲",
+317	    "turks_&_caicos_islands": "🇹🇨",
+318	    "tuvalu": "🇹🇻",
+319	    "u.s._outlying_islands": "🇺🇲",
+320	    "u.s._virgin_islands": "🇻🇮",
+321	    "up!_button": "🆙",
+322	    "uganda": "🇺🇬",
+323	    "ukraine": "🇺🇦",
+324	    "united_arab_emirates": "🇦🇪",
+325	    "united_kingdom": "🇬🇧",
+326	    "united_nations": "🇺🇳",
+327	    "united_states": "🇺🇸",
+328	    "uruguay": "🇺🇾",
+329	    "uzbekistan": "🇺🇿",
+330	    "vs_button": "🆚",
+331	    "vanuatu": "🇻🇺",
+332	    "vatican_city": "🇻🇦",
+333	    "venezuela": "🇻🇪",
+334	    "vietnam": "🇻🇳",
+335	    "virgo": "♍",
+336	    "wales": "🏴\U000e0067\U000e0062\U000e0077\U000e006c\U000e0073\U000e007f",
+337	    "wallis_&_futuna": "🇼🇫",
+338	    "western_sahara": "🇪🇭",
+339	    "yemen": "🇾🇪",
+340	    "zambia": "🇿🇲",
+341	    "zimbabwe": "🇿🇼",
+342	    "abacus": "🧮",
+343	    "adhesive_bandage": "🩹",
+344	    "admission_tickets": "🎟",
+345	    "adult": "🧑",
+346	    "adult_dark_skin_tone": "🧑🏿",
+347	    "adult_light_skin_tone": "🧑🏻",
+348	    "adult_medium-dark_skin_tone": "🧑🏾",
+349	    "adult_medium-light_skin_tone": "🧑🏼",
+350	    "adult_medium_skin_tone": "🧑🏽",
+351	    "aerial_tramway": "🚡",
+352	    "airplane": "✈",
+353	    "airplane_arrival": "🛬",
+354	    "airplane_departure": "🛫",
+355	    "alarm_clock": "⏰",
+356	    "alembic": "⚗",
+357	    "alien": "👽",
+358	    "alien_monster": "👾",
+359	    "ambulance": "🚑",
+360	    "american_football": "🏈",
+361	    "amphora": "🏺",
+362	    "anchor": "⚓",
+363	    "anger_symbol": "💢",
+364	    "angry_face": "😠",
+365	    "angry_face_with_horns": "👿",
+366	    "anguished_face": "😧",
+367	    "ant": "🐜",
+368	    "antenna_bars": "📶",
+369	    "anxious_face_with_sweat": "😰",
+370	    "articulated_lorry": "🚛",
+371	    "artist_palette": "🎨",
+372	    "astonished_face": "😲",
+373	    "atom_symbol": "⚛",
+374	    "auto_rickshaw": "🛺",
+375	    "automobile": "🚗",
+376	    "avocado": "🥑",
+377	    "axe": "🪓",
+378	    "baby": "👶",
+379	    "baby_angel": "👼",
+380	    "baby_angel_dark_skin_tone": "👼🏿",
+381	    "baby_angel_light_skin_tone": "👼🏻",
+382	    "baby_angel_medium-dark_skin_tone": "👼🏾",
+383	    "baby_angel_medium-light_skin_tone": "👼🏼",
+384	    "baby_angel_medium_skin_tone": "👼🏽",
+385	    "baby_bottle": "🍼",
+386	    "baby_chick": "🐤",
+387	    "baby_dark_skin_tone": "👶🏿",
+388	    "baby_light_skin_tone": "👶🏻",
+389	    "baby_medium-dark_skin_tone": "👶🏾",
+390	    "baby_medium-light_skin_tone": "👶🏼",
+391	    "baby_medium_skin_tone": "👶🏽",
+392	    "baby_symbol": "🚼",
+393	    "backhand_index_pointing_down": "👇",
+394	    "backhand_index_pointing_down_dark_skin_tone": "👇🏿",
+395	    "backhand_index_pointing_down_light_skin_tone": "👇🏻",
+396	    "backhand_index_pointing_down_medium-dark_skin_tone": "👇🏾",
+397	    "backhand_index_pointing_down_medium-light_skin_tone": "👇🏼",
+398	    "backhand_index_pointing_down_medium_skin_tone": "👇🏽",
+399	    "backhand_index_pointing_left": "👈",
+400	    "backhand_index_pointing_left_dark_skin_tone": "👈🏿",
+401	    "backhand_index_pointing_left_light_skin_tone": "👈🏻",
+402	    "backhand_index_pointing_left_medium-dark_skin_tone": "👈🏾",
+403	    "backhand_index_pointing_left_medium-light_skin_tone": "👈🏼",
+404	    "backhand_index_pointing_left_medium_skin_tone": "👈🏽",
+405	    "backhand_index_pointing_right": "👉",
+406	    "backhand_index_pointing_right_dark_skin_tone": "👉🏿",
+407	    "backhand_index_pointing_right_light_skin_tone": "👉🏻",
+408	    "backhand_index_pointing_right_medium-dark_skin_tone": "👉🏾",
+409	    "backhand_index_pointing_right_medium-light_skin_tone": "👉🏼",
+410	    "backhand_index_pointing_right_medium_skin_tone": "👉🏽",
+411	    "backhand_index_pointing_up": "👆",
+412	    "backhand_index_pointing_up_dark_skin_tone": "👆🏿",
+413	    "backhand_index_pointing_up_light_skin_tone": "👆🏻",
+414	    "backhand_index_pointing_up_medium-dark_skin_tone": "👆🏾",
+415	    "backhand_index_pointing_up_medium-light_skin_tone": "👆🏼",
+416	    "backhand_index_pointing_up_medium_skin_tone": "👆🏽",
+417	    "bacon": "🥓",
+418	    "badger": "🦡",
+419	    "badminton": "🏸",
+420	    "bagel": "🥯",
+421	    "baggage_claim": "🛄",
+422	    "baguette_bread": "🥖",
+423	    "balance_scale": "⚖",
+424	    "bald": "🦲",
+425	    "bald_man": "👨\u200d🦲",
+426	    "bald_woman": "👩\u200d🦲",
+427	    "ballet_shoes": "🩰",
+428	    "balloon": "🎈",
+429	    "ballot_box_with_ballot": "🗳",
+430	    "ballot_box_with_check": "☑",
+431	    "banana": "🍌",
+432	    "banjo": "🪕",
+433	    "bank": "🏦",
+434	    "bar_chart": "📊",
+435	    "barber_pole": "💈",
+436	    "baseball": "⚾",
+437	    "basket": "🧺",
+438	    "basketball": "🏀",
+439	    "bat": "🦇",
+440	    "bathtub": "🛁",
+441	    "battery": "🔋",
+442	    "beach_with_umbrella": "🏖",
+443	    "beaming_face_with_smiling_eyes": "😁",
+444	    "bear_face": "🐻",
+445	    "bearded_person": "🧔",
+446	    "bearded_person_dark_skin_tone": "🧔🏿",
+447	    "bearded_person_light_skin_tone": "🧔🏻",
+448	    "bearded_person_medium-dark_skin_tone": "🧔🏾",
+449	    "bearded_person_medium-light_skin_tone": "🧔🏼",
+450	    "bearded_person_medium_skin_tone": "🧔🏽",
+451	    "beating_heart": "💓",
+452	    "bed": "🛏",
+453	    "beer_mug": "🍺",
+454	    "bell": "🔔",
+455	    "bell_with_slash": "🔕",
+456	    "bellhop_bell": "🛎",
+457	    "bento_box": "🍱",
+458	    "beverage_box": "🧃",
+459	    "bicycle": "🚲",
+460	    "bikini": "👙",
+461	    "billed_cap": "🧢",
+462	    "biohazard": "☣",
+463	    "bird": "🐦",
+464	    "birthday_cake": "🎂",
+465	    "black_circle": "⚫",
+466	    "black_flag": "🏴",
+467	    "black_heart": "🖤",
+468	    "black_large_square": "⬛",
+469	    "black_medium-small_square": "◾",
+470	    "black_medium_square": "◼",
+471	    "black_nib": "✒",
+472	    "black_small_square": "▪",
+473	    "black_square_button": "🔲",
+474	    "blond-haired_man": "👱\u200d♂️",
+475	    "blond-haired_man_dark_skin_tone": "👱🏿\u200d♂️",
+476	    "blond-haired_man_light_skin_tone": "👱🏻\u200d♂️",
+477	    "blond-haired_man_medium-dark_skin_tone": "👱🏾\u200d♂️",
+478	    "blond-haired_man_medium-light_skin_tone": "👱🏼\u200d♂️",
+479	    "blond-haired_man_medium_skin_tone": "👱🏽\u200d♂️",
+480	    "blond-haired_person": "👱",
+481	    "blond-haired_person_dark_skin_tone": "👱🏿",
+482	    "blond-haired_person_light_skin_tone": "👱🏻",
+483	    "blond-haired_person_medium-dark_skin_tone": "👱🏾",
+484	    "blond-haired_person_medium-light_skin_tone": "👱🏼",
+485	    "blond-haired_person_medium_skin_tone": "👱🏽",
+486	    "blond-haired_woman": "👱\u200d♀️",
+487	    "blond-haired_woman_dark_skin_tone": "👱🏿\u200d♀️",
+488	    "blond-haired_woman_light_skin_tone": "👱🏻\u200d♀️",
+489	    "blond-haired_woman_medium-dark_skin_tone": "👱🏾\u200d♀️",
+490	    "blond-haired_woman_medium-light_skin_tone": "👱🏼\u200d♀️",
+491	    "blond-haired_woman_medium_skin_tone": "👱🏽\u200d♀️",
+492	    "blossom": "🌼",
+493	    "blowfish": "🐡",
+494	    "blue_book": "📘",
+495	    "blue_circle": "🔵",
+496	    "blue_heart": "💙",
+497	    "blue_square": "🟦",
+498	    "boar": "🐗",
+499	    "bomb": "💣",
+500	    "bone": "🦴",
+501	    "bookmark": "🔖",
+502	    "bookmark_tabs": "📑",
+503	    "books": "📚",
+504	    "bottle_with_popping_cork": "🍾",
+505	    "bouquet": "💐",
+506	    "bow_and_arrow": "🏹",
+507	    "bowl_with_spoon": "🥣",
+508	    "bowling": "🎳",
+509	    "boxing_glove": "🥊",
+510	    "boy": "👦",
+511	    "boy_dark_skin_tone": "👦🏿",
+512	    "boy_light_skin_tone": "👦🏻",
+513	    "boy_medium-dark_skin_tone": "👦🏾",
+514	    "boy_medium-light_skin_tone": "👦🏼",
+515	    "boy_medium_skin_tone": "👦🏽",
+516	    "brain": "🧠",
+517	    "bread": "🍞",
+518	    "breast-feeding": "🤱",
+519	    "breast-feeding_dark_skin_tone": "🤱🏿",
+520	    "breast-feeding_light_skin_tone": "🤱🏻",
+521	    "breast-feeding_medium-dark_skin_tone": "🤱🏾",
+522	    "breast-feeding_medium-light_skin_tone": "🤱🏼",
+523	    "breast-feeding_medium_skin_tone": "🤱🏽",
+524	    "brick": "🧱",
+525	    "bride_with_veil": "👰",
+526	    "bride_with_veil_dark_skin_tone": "👰🏿",
+527	    "bride_with_veil_light_skin_tone": "👰🏻",
+528	    "bride_with_veil_medium-dark_skin_tone": "👰🏾",
+529	    "bride_with_veil_medium-light_skin_tone": "👰🏼",
+530	    "bride_with_veil_medium_skin_tone": "👰🏽",
+531	    "bridge_at_night": "🌉",
+532	    "briefcase": "💼",
+533	    "briefs": "🩲",
+534	    "bright_button": "🔆",
+535	    "broccoli": "🥦",
+536	    "broken_heart": "💔",
+537	    "broom": "🧹",
+538	    "brown_circle": "🟤",
+539	    "brown_heart": "🤎",
+540	    "brown_square": "🟫",
+541	    "bug": "🐛",
+542	    "building_construction": "🏗",
+543	    "bullet_train": "🚅",
+544	    "burrito": "🌯",
+545	    "bus": "🚌",
+546	    "bus_stop": "🚏",
+547	    "bust_in_silhouette": "👤",
+548	    "busts_in_silhouette": "👥",
+549	    "butter": "🧈",
+550	    "butterfly": "🦋",
+551	    "cactus": "🌵",
+552	    "calendar": "📆",
+553	    "call_me_hand": "🤙",
+554	    "call_me_hand_dark_skin_tone": "🤙🏿",
+555	    "call_me_hand_light_skin_tone": "🤙🏻",
+556	    "call_me_hand_medium-dark_skin_tone": "🤙🏾",
+557	    "call_me_hand_medium-light_skin_tone": "🤙🏼",
+558	    "call_me_hand_medium_skin_tone": "🤙🏽",
+559	    "camel": "🐫",
+560	    "camera": "📷",
+561	    "camera_with_flash": "📸",
+562	    "camping": "🏕",
+563	    "candle": "🕯",
+564	    "candy": "🍬",
+565	    "canned_food": "🥫",
+566	    "canoe": "🛶",
+567	    "card_file_box": "🗃",
+568	    "card_index": "📇",
+569	    "card_index_dividers": "🗂",
+570	    "carousel_horse": "🎠",
+571	    "carp_streamer": "🎏",
+572	    "carrot": "🥕",
+573	    "castle": "🏰",
+574	    "cat": "🐱",
+575	    "cat_face": "🐱",
+576	    "cat_face_with_tears_of_joy": "😹",
+577	    "cat_face_with_wry_smile": "😼",
+578	    "chains": "⛓",
+579	    "chair": "🪑",
+580	    "chart_decreasing": "📉",
+581	    "chart_increasing": "📈",
+582	    "chart_increasing_with_yen": "💹",
+583	    "cheese_wedge": "🧀",
+584	    "chequered_flag": "🏁",
+585	    "cherries": "🍒",
+586	    "cherry_blossom": "🌸",
+587	    "chess_pawn": "♟",
+588	    "chestnut": "🌰",
+589	    "chicken": "🐔",
+590	    "child": "🧒",
+591	    "child_dark_skin_tone": "🧒🏿",
+592	    "child_light_skin_tone": "🧒🏻",
+593	    "child_medium-dark_skin_tone": "🧒🏾",
+594	    "child_medium-light_skin_tone": "🧒🏼",
+595	    "child_medium_skin_tone": "🧒🏽",
+596	    "children_crossing": "🚸",
+597	    "chipmunk": "🐿",
+598	    "chocolate_bar": "🍫",
+599	    "chopsticks": "🥢",
+600	    "church": "⛪",
+601	    "cigarette": "🚬",
+602	    "cinema": "🎦",
+603	    "circled_m": "Ⓜ",
+604	    "circus_tent": "🎪",
+605	    "cityscape": "🏙",
+606	    "cityscape_at_dusk": "🌆",
+607	    "clamp": "🗜",
+608	    "clapper_board": "🎬",
+609	    "clapping_hands": "👏",
+610	    "clapping_hands_dark_skin_tone": "👏🏿",
+611	    "clapping_hands_light_skin_tone": "👏🏻",
+612	    "clapping_hands_medium-dark_skin_tone": "👏🏾",
+613	    "clapping_hands_medium-light_skin_tone": "👏🏼",
+614	    "clapping_hands_medium_skin_tone": "👏🏽",
+615	    "classical_building": "🏛",
+616	    "clinking_beer_mugs": "🍻",
+617	    "clinking_glasses": "🥂",
+618	    "clipboard": "📋",
+619	    "clockwise_vertical_arrows": "🔃",
+620	    "closed_book": "📕",
+621	    "closed_mailbox_with_lowered_flag": "📪",
+622	    "closed_mailbox_with_raised_flag": "📫",
+623	    "closed_umbrella": "🌂",
+624	    "cloud": "☁",
+625	    "cloud_with_lightning": "🌩",
+626	    "cloud_with_lightning_and_rain": "⛈",
+627	    "cloud_with_rain": "🌧",
+628	    "cloud_with_snow": "🌨",
+629	    "clown_face": "🤡",
+630	    "club_suit": "♣",
+631	    "clutch_bag": "👝",
+632	    "coat": "🧥",
+633	    "cocktail_glass": "🍸",
+634	    "coconut": "🥥",
+635	    "coffin": "⚰",
+636	    "cold_face": "🥶",
+637	    "collision": "💥",
+638	    "comet": "☄",
+639	    "compass": "🧭",
+640	    "computer_disk": "💽",
+641	    "computer_mouse": "🖱",
+642	    "confetti_ball": "🎊",
+643	    "confounded_face": "😖",
+644	    "confused_face": "😕",
+645	    "construction": "🚧",
+646	    "construction_worker": "👷",
+647	    "construction_worker_dark_skin_tone": "👷🏿",
+648	    "construction_worker_light_skin_tone": "👷🏻",
+649	    "construction_worker_medium-dark_skin_tone": "👷🏾",
+650	    "construction_worker_medium-light_skin_tone": "👷🏼",
+651	    "construction_worker_medium_skin_tone": "👷🏽",
+652	    "control_knobs": "🎛",
+653	    "convenience_store": "🏪",
+654	    "cooked_rice": "🍚",
+655	    "cookie": "🍪",
+656	    "cooking": "🍳",
+657	    "copyright": "©",
+658	    "couch_and_lamp": "🛋",
+659	    "counterclockwise_arrows_button": "🔄",
+660	    "couple_with_heart": "💑",
+661	    "couple_with_heart_man_man": "👨\u200d❤️\u200d👨",
+662	    "couple_with_heart_woman_man": "👩\u200d❤️\u200d👨",
+663	    "couple_with_heart_woman_woman": "👩\u200d❤️\u200d👩",
+664	    "cow": "🐮",
+665	    "cow_face": "🐮",
+666	    "cowboy_hat_face": "🤠",
+667	    "crab": "🦀",
+668	    "crayon": "🖍",
+669	    "credit_card": "💳",
+670	    "crescent_moon": "🌙",
+671	    "cricket": "🦗",
+672	    "cricket_game": "🏏",
+673	    "crocodile": "🐊",
+674	    "croissant": "🥐",
+675	    "cross_mark": "❌",
+676	    "cross_mark_button": "❎",
+677	    "crossed_fingers": "🤞",
+678	    "crossed_fingers_dark_skin_tone": "🤞🏿",
+679	    "crossed_fingers_light_skin_tone": "🤞🏻",
+680	    "crossed_fingers_medium-dark_skin_tone": "🤞🏾",
+681	    "crossed_fingers_medium-light_skin_tone": "🤞🏼",
+682	    "crossed_fingers_medium_skin_tone": "🤞🏽",
+683	    "crossed_flags": "🎌",
+684	    "crossed_swords": "⚔",
+685	    "crown": "👑",
+686	    "crying_cat_face": "😿",
+687	    "crying_face": "😢",
+688	    "crystal_ball": "🔮",
+689	    "cucumber": "🥒",
+690	    "cupcake": "🧁",
+691	    "cup_with_straw": "🥤",
+692	    "curling_stone": "🥌",
+693	    "curly_hair": "🦱",
+694	    "curly-haired_man": "👨\u200d🦱",
+695	    "curly-haired_woman": "👩\u200d🦱",
+696	    "curly_loop": "➰",
+697	    "currency_exchange": "💱",
+698	    "curry_rice": "🍛",
+699	    "custard": "🍮",
+700	    "customs": "🛃",
+701	    "cut_of_meat": "🥩",
+702	    "cyclone": "🌀",
+703	    "dagger": "🗡",
+704	    "dango": "🍡",
+705	    "dashing_away": "💨",
+706	    "deaf_person": "🧏",
+707	    "deciduous_tree": "🌳",
+708	    "deer": "🦌",
+709	    "delivery_truck": "🚚",
+710	    "department_store": "🏬",
+711	    "derelict_house": "🏚",
+712	    "desert": "🏜",
+713	    "desert_island": "🏝",
+714	    "desktop_computer": "🖥",
+715	    "detective": "🕵",
+716	    "detective_dark_skin_tone": "🕵🏿",
+717	    "detective_light_skin_tone": "🕵🏻",
+718	    "detective_medium-dark_skin_tone": "🕵🏾",
+719	    "detective_medium-light_skin_tone": "🕵🏼",
+720	    "detective_medium_skin_tone": "🕵🏽",
+721	    "diamond_suit": "♦",
+722	    "diamond_with_a_dot": "💠",
+723	    "dim_button": "🔅",
+724	    "direct_hit": "🎯",
+725	    "disappointed_face": "😞",
+726	    "diving_mask": "🤿",
+727	    "diya_lamp": "🪔",
+728	    "dizzy": "💫",
+729	    "dizzy_face": "😵",
+730	    "dna": "🧬",
+731	    "dog": "🐶",
+732	    "dog_face": "🐶",
+733	    "dollar_banknote": "💵",
+734	    "dolphin": "🐬",
+735	    "door": "🚪",
+736	    "dotted_six-pointed_star": "🔯",
+737	    "double_curly_loop": "➿",
+738	    "double_exclamation_mark": "‼",
+739	    "doughnut": "🍩",
+740	    "dove": "🕊",
+741	    "down-left_arrow": "↙",
+742	    "down-right_arrow": "↘",
+743	    "down_arrow": "⬇",
+744	    "downcast_face_with_sweat": "😓",
+745	    "downwards_button": "🔽",
+746	    "dragon": "🐉",
+747	    "dragon_face": "🐲",
+748	    "dress": "👗",
+749	    "drooling_face": "🤤",
+750	    "drop_of_blood": "🩸",
+751	    "droplet": "💧",
+752	    "drum": "🥁",
+753	    "duck": "🦆",
+754	    "dumpling": "🥟",
+755	    "dvd": "📀",
+756	    "e-mail": "📧",
+757	    "eagle": "🦅",
+758	    "ear": "👂",
+759	    "ear_dark_skin_tone": "👂🏿",
+760	    "ear_light_skin_tone": "👂🏻",
+761	    "ear_medium-dark_skin_tone": "👂🏾",
+762	    "ear_medium-light_skin_tone": "👂🏼",
+763	    "ear_medium_skin_tone": "👂🏽",
+764	    "ear_of_corn": "🌽",
+765	    "ear_with_hearing_aid": "🦻",
+766	    "egg": "🍳",
+767	    "eggplant": "🍆",
+768	    "eight-pointed_star": "✴",
+769	    "eight-spoked_asterisk": "✳",
+770	    "eight-thirty": "🕣",
+771	    "eight_o’clock": "🕗",
+772	    "eject_button": "⏏",
+773	    "electric_plug": "🔌",
+774	    "elephant": "🐘",
+775	    "eleven-thirty": "🕦",
+776	    "eleven_o’clock": "🕚",
+777	    "elf": "🧝",
+778	    "elf_dark_skin_tone": "🧝🏿",
+779	    "elf_light_skin_tone": "🧝🏻",
+780	    "elf_medium-dark_skin_tone": "🧝🏾",
+781	    "elf_medium-light_skin_tone": "🧝🏼",
+782	    "elf_medium_skin_tone": "🧝🏽",
+783	    "envelope": "✉",
+784	    "envelope_with_arrow": "📩",
+785	    "euro_banknote": "💶",
+786	    "evergreen_tree": "🌲",
+787	    "ewe": "🐑",
+788	    "exclamation_mark": "❗",
+789	    "exclamation_question_mark": "⁉",
+790	    "exploding_head": "🤯",
+791	    "expressionless_face": "😑",
+792	    "eye": "👁",
+793	    "eye_in_speech_bubble": "👁️\u200d🗨️",
+794	    "eyes": "👀",
+795	    "face_blowing_a_kiss": "😘",
+796	    "face_savoring_food": "😋",
+797	    "face_screaming_in_fear": "😱",
+798	    "face_vomiting": "🤮",
+799	    "face_with_hand_over_mouth": "🤭",
+800	    "face_with_head-bandage": "🤕",
+801	    "face_with_medical_mask": "😷",
+802	    "face_with_monocle": "🧐",
+803	    "face_with_open_mouth": "😮",
+804	    "face_with_raised_eyebrow": "🤨",
+805	    "face_with_rolling_eyes": "🙄",
+806	    "face_with_steam_from_nose": "😤",
+807	    "face_with_symbols_on_mouth": "🤬",
+808	    "face_with_tears_of_joy": "😂",
+809	    "face_with_thermometer": "🤒",
+810	    "face_with_tongue": "😛",
+811	    "face_without_mouth": "😶",
+812	    "factory": "🏭",
+813	    "fairy": "🧚",
+814	    "fairy_dark_skin_tone": "🧚🏿",
+815	    "fairy_light_skin_tone": "🧚🏻",
+816	    "fairy_medium-dark_skin_tone": "🧚🏾",
+817	    "fairy_medium-light_skin_tone": "🧚🏼",
+818	    "fairy_medium_skin_tone": "🧚🏽",
+819	    "falafel": "🧆",
+820	    "fallen_leaf": "🍂",
+821	    "family": "👪",
+822	    "family_man_boy": "👨\u200d👦",
+823	    "family_man_boy_boy": "👨\u200d👦\u200d👦",
+824	    "family_man_girl": "👨\u200d👧",
+825	    "family_man_girl_boy": "👨\u200d👧\u200d👦",
+826	    "family_man_girl_girl": "👨\u200d👧\u200d👧",
+827	    "family_man_man_boy": "👨\u200d👨\u200d👦",
+828	    "family_man_man_boy_boy": "👨\u200d👨\u200d👦\u200d👦",
+829	    "family_man_man_girl": "👨\u200d👨\u200d👧",
+830	    "family_man_man_girl_boy": "👨\u200d👨\u200d👧\u200d👦",
+831	    "family_man_man_girl_girl": "👨\u200d👨\u200d👧\u200d👧",
+832	    "family_man_woman_boy": "👨\u200d👩\u200d👦",
+833	    "family_man_woman_boy_boy": "👨\u200d👩\u200d👦\u200d👦",
+834	    "family_man_woman_girl": "👨\u200d👩\u200d👧",
+835	    "family_man_woman_girl_boy": "👨\u200d👩\u200d👧\u200d👦",
+836	    "family_man_woman_girl_girl": "👨\u200d👩\u200d👧\u200d👧",
+837	    "family_woman_boy": "👩\u200d👦",
+838	    "family_woman_boy_boy": "👩\u200d👦\u200d👦",
+839	    "family_woman_girl": "👩\u200d👧",
+840	    "family_woman_girl_boy": "👩\u200d👧\u200d👦",
+841	    "family_woman_girl_girl": "👩\u200d👧\u200d👧",
+842	    "family_woman_woman_boy": "👩\u200d👩\u200d👦",
+843	    "family_woman_woman_boy_boy": "👩\u200d👩\u200d👦\u200d👦",
+844	    "family_woman_woman_girl": "👩\u200d👩\u200d👧",
+845	    "family_woman_woman_girl_boy": "👩\u200d👩\u200d👧\u200d👦",
+846	    "family_woman_woman_girl_girl": "👩\u200d👩\u200d👧\u200d👧",
+847	    "fast-forward_button": "⏩",
+848	    "fast_down_button": "⏬",
+849	    "fast_reverse_button": "⏪",
+850	    "fast_up_button": "⏫",
+851	    "fax_machine": "📠",
+852	    "fearful_face": "😨",
+853	    "female_sign": "♀",
+854	    "ferris_wheel": "🎡",
+855	    "ferry": "⛴",
+856	    "field_hockey": "🏑",
+857	    "file_cabinet": "🗄",
+858	    "file_folder": "📁",
+859	    "film_frames": "🎞",
+860	    "film_projector": "📽",
+861	    "fire": "🔥",
+862	    "fire_extinguisher": "🧯",
+863	    "firecracker": "🧨",
+864	    "fire_engine": "🚒",
+865	    "fireworks": "🎆",
+866	    "first_quarter_moon": "🌓",
+867	    "first_quarter_moon_face": "🌛",
+868	    "fish": "🐟",
+869	    "fish_cake_with_swirl": "🍥",
+870	    "fishing_pole": "🎣",
+871	    "five-thirty": "🕠",
+872	    "five_o’clock": "🕔",
+873	    "flag_in_hole": "⛳",
+874	    "flamingo": "🦩",
+875	    "flashlight": "🔦",
+876	    "flat_shoe": "🥿",
+877	    "fleur-de-lis": "⚜",
+878	    "flexed_biceps": "💪",
+879	    "flexed_biceps_dark_skin_tone": "💪🏿",
+880	    "flexed_biceps_light_skin_tone": "💪🏻",
+881	    "flexed_biceps_medium-dark_skin_tone": "💪🏾",
+882	    "flexed_biceps_medium-light_skin_tone": "💪🏼",
+883	    "flexed_biceps_medium_skin_tone": "💪🏽",
+884	    "floppy_disk": "💾",
+885	    "flower_playing_cards": "🎴",
+886	    "flushed_face": "😳",
+887	    "flying_disc": "🥏",
+888	    "flying_saucer": "🛸",
+889	    "fog": "🌫",
+890	    "foggy": "🌁",
+891	    "folded_hands": "🙏",
+892	    "folded_hands_dark_skin_tone": "🙏🏿",
+893	    "folded_hands_light_skin_tone": "🙏🏻",
+894	    "folded_hands_medium-dark_skin_tone": "🙏🏾",
+895	    "folded_hands_medium-light_skin_tone": "🙏🏼",
+896	    "folded_hands_medium_skin_tone": "🙏🏽",
+897	    "foot": "🦶",
+898	    "footprints": "👣",
+899	    "fork_and_knife": "🍴",
+900	    "fork_and_knife_with_plate": "🍽",
+901	    "fortune_cookie": "🥠",
+902	    "fountain": "⛲",
+903	    "fountain_pen": "🖋",
+904	    "four-thirty": "🕟",
+905	    "four_leaf_clover": "🍀",
+906	    "four_o’clock": "🕓",
+907	    "fox_face": "🦊",
+908	    "framed_picture": "🖼",
+909	    "french_fries": "🍟",
+910	    "fried_shrimp": "🍤",
+911	    "frog_face": "🐸",
+912	    "front-facing_baby_chick": "🐥",
+913	    "frowning_face": "☹",
+914	    "frowning_face_with_open_mouth": "😦",
+915	    "fuel_pump": "⛽",
+916	    "full_moon": "🌕",
+917	    "full_moon_face": "🌝",
+918	    "funeral_urn": "⚱",
+919	    "game_die": "🎲",
+920	    "garlic": "🧄",
+921	    "gear": "⚙",
+922	    "gem_stone": "💎",
+923	    "genie": "🧞",
+924	    "ghost": "👻",
+925	    "giraffe": "🦒",
+926	    "girl": "👧",
+927	    "girl_dark_skin_tone": "👧🏿",
+928	    "girl_light_skin_tone": "👧🏻",
+929	    "girl_medium-dark_skin_tone": "👧🏾",
+930	    "girl_medium-light_skin_tone": "👧🏼",
+931	    "girl_medium_skin_tone": "👧🏽",
+932	    "glass_of_milk": "🥛",
+933	    "glasses": "👓",
+934	    "globe_showing_americas": "🌎",
+935	    "globe_showing_asia-australia": "🌏",
+936	    "globe_showing_europe-africa": "🌍",
+937	    "globe_with_meridians": "🌐",
+938	    "gloves": "🧤",
+939	    "glowing_star": "🌟",
+940	    "goal_net": "🥅",
+941	    "goat": "🐐",
+942	    "goblin": "👺",
+943	    "goggles": "🥽",
+944	    "gorilla": "🦍",
+945	    "graduation_cap": "🎓",
+946	    "grapes": "🍇",
+947	    "green_apple": "🍏",
+948	    "green_book": "📗",
+949	    "green_circle": "🟢",
+950	    "green_heart": "💚",
+951	    "green_salad": "🥗",
+952	    "green_square": "🟩",
+953	    "grimacing_face": "😬",
+954	    "grinning_cat_face": "😺",
+955	    "grinning_cat_face_with_smiling_eyes": "😸",
+956	    "grinning_face": "😀",
+957	    "grinning_face_with_big_eyes": "😃",
+958	    "grinning_face_with_smiling_eyes": "😄",
+959	    "grinning_face_with_sweat": "😅",
+960	    "grinning_squinting_face": "😆",
+961	    "growing_heart": "💗",
+962	    "guard": "💂",
+963	    "guard_dark_skin_tone": "💂🏿",
+964	    "guard_light_skin_tone": "💂🏻",
+965	    "guard_medium-dark_skin_tone": "💂🏾",
+966	    "guard_medium-light_skin_tone": "💂🏼",
+967	    "guard_medium_skin_tone": "💂🏽",
+968	    "guide_dog": "🦮",
+969	    "guitar": "🎸",
+970	    "hamburger": "🍔",
+971	    "hammer": "🔨",
+972	    "hammer_and_pick": "⚒",
+973	    "hammer_and_wrench": "🛠",
+974	    "hamster_face": "🐹",
+975	    "hand_with_fingers_splayed": "🖐",
+976	    "hand_with_fingers_splayed_dark_skin_tone": "🖐🏿",
+977	    "hand_with_fingers_splayed_light_skin_tone": "🖐🏻",
+978	    "hand_with_fingers_splayed_medium-dark_skin_tone": "🖐🏾",
+979	    "hand_with_fingers_splayed_medium-light_skin_tone": "🖐🏼",
+980	    "hand_with_fingers_splayed_medium_skin_tone": "🖐🏽",
+981	    "handbag": "👜",
+982	    "handshake": "🤝",
+983	    "hatching_chick": "🐣",
+984	    "headphone": "🎧",
+985	    "hear-no-evil_monkey": "🙉",
+986	    "heart_decoration": "💟",
+987	    "heart_suit": "♥",
+988	    "heart_with_arrow": "💘",
+989	    "heart_with_ribbon": "💝",
+990	    "heavy_check_mark": "✔",
+991	    "heavy_division_sign": "➗",
+992	    "heavy_dollar_sign": "💲",
+993	    "heavy_heart_exclamation": "❣",
+994	    "heavy_large_circle": "⭕",
+995	    "heavy_minus_sign": "➖",
+996	    "heavy_multiplication_x": "✖",
+997	    "heavy_plus_sign": "➕",
+998	    "hedgehog": "🦔",
+999	    "helicopter": "🚁",
+1000	    "herb": "🌿",
+1001	    "hibiscus": "🌺",
+1002	    "high-heeled_shoe": "👠",
+1003	    "high-speed_train": "🚄",
+1004	    "high_voltage": "⚡",
+1005	    "hiking_boot": "🥾",
+1006	    "hindu_temple": "🛕",
+1007	    "hippopotamus": "🦛",
+1008	    "hole": "🕳",
+1009	    "honey_pot": "🍯",
+1010	    "honeybee": "🐝",
+1011	    "horizontal_traffic_light": "🚥",
+1012	    "horse": "🐴",
+1013	    "horse_face": "🐴",
+1014	    "horse_racing": "🏇",
+1015	    "horse_racing_dark_skin_tone": "🏇🏿",
+1016	    "horse_racing_light_skin_tone": "🏇🏻",
+1017	    "horse_racing_medium-dark_skin_tone": "🏇🏾",
+1018	    "horse_racing_medium-light_skin_tone": "🏇🏼",
+1019	    "horse_racing_medium_skin_tone": "🏇🏽",
+1020	    "hospital": "🏥",
+1021	    "hot_beverage": "☕",
+1022	    "hot_dog": "🌭",
+1023	    "hot_face": "🥵",
+1024	    "hot_pepper": "🌶",
+1025	    "hot_springs": "♨",
+1026	    "hotel": "🏨",
+1027	    "hourglass_done": "⌛",
+1028	    "hourglass_not_done": "⏳",
+1029	    "house": "🏠",
+1030	    "house_with_garden": "🏡",
+1031	    "houses": "🏘",
+1032	    "hugging_face": "🤗",
+1033	    "hundred_points": "💯",
+1034	    "hushed_face": "😯",
+1035	    "ice": "🧊",
+1036	    "ice_cream": "🍨",
+1037	    "ice_hockey": "🏒",
+1038	    "ice_skate": "⛸",
+1039	    "inbox_tray": "📥",
+1040	    "incoming_envelope": "📨",
+1041	    "index_pointing_up": "☝",
+1042	    "index_pointing_up_dark_skin_tone": "☝🏿",
+1043	    "index_pointing_up_light_skin_tone": "☝🏻",
+1044	    "index_pointing_up_medium-dark_skin_tone": "☝🏾",
+1045	    "index_pointing_up_medium-light_skin_tone": "☝🏼",
+1046	    "index_pointing_up_medium_skin_tone": "☝🏽",
+1047	    "infinity": "♾",
+1048	    "information": "ℹ",
+1049	    "input_latin_letters": "🔤",
+1050	    "input_latin_lowercase": "🔡",
+1051	    "input_latin_uppercase": "🔠",
+1052	    "input_numbers": "🔢",
+1053	    "input_symbols": "🔣",
+1054	    "jack-o-lantern": "🎃",
+1055	    "jeans": "👖",
+1056	    "jigsaw": "🧩",
+1057	    "joker": "🃏",
+1058	    "joystick": "🕹",
+1059	    "kaaba": "🕋",
+1060	    "kangaroo": "🦘",
+1061	    "key": "🔑",
+1062	    "keyboard": "⌨",
+1063	    "keycap_#": "#️⃣",
+1064	    "keycap_*": "*️⃣",
+1065	    "keycap_0": "0️⃣",
+1066	    "keycap_1": "1️⃣",
+1067	    "keycap_10": "🔟",
+1068	    "keycap_2": "2️⃣",
+1069	    "keycap_3": "3️⃣",
+1070	    "keycap_4": "4️⃣",
+1071	    "keycap_5": "5️⃣",
+1072	    "keycap_6": "6️⃣",
+1073	    "keycap_7": "7️⃣",
+1074	    "keycap_8": "8️⃣",
+1075	    "keycap_9": "9️⃣",
+1076	    "kick_scooter": "🛴",
+1077	    "kimono": "👘",
+1078	    "kiss": "💋",
+1079	    "kiss_man_man": "👨\u200d❤️\u200d💋\u200d👨",
+1080	    "kiss_mark": "💋",
+1081	    "kiss_woman_man": "👩\u200d❤️\u200d💋\u200d👨",
+1082	    "kiss_woman_woman": "👩\u200d❤️\u200d💋\u200d👩",
+1083	    "kissing_cat_face": "😽",
+1084	    "kissing_face": "😗",
+1085	    "kissing_face_with_closed_eyes": "😚",
+1086	    "kissing_face_with_smiling_eyes": "😙",
+1087	    "kitchen_knife": "🔪",
+1088	    "kite": "🪁",
+1089	    "kiwi_fruit": "🥝",
+1090	    "koala": "🐨",
+1091	    "lab_coat": "🥼",
+1092	    "label": "🏷",
+1093	    "lacrosse": "🥍",
+1094	    "lady_beetle": "🐞",
+1095	    "laptop_computer": "💻",
+1096	    "large_blue_diamond": "🔷",
+1097	    "large_orange_diamond": "🔶",
+1098	    "last_quarter_moon": "🌗",
+1099	    "last_quarter_moon_face": "🌜",
+1100	    "last_track_button": "⏮",
+1101	    "latin_cross": "✝",
+1102	    "leaf_fluttering_in_wind": "🍃",
+1103	    "leafy_green": "🥬",
+1104	    "ledger": "📒",
+1105	    "left-facing_fist": "🤛",
+1106	    "left-facing_fist_dark_skin_tone": "🤛🏿",
+1107	    "left-facing_fist_light_skin_tone": "🤛🏻",
+1108	    "left-facing_fist_medium-dark_skin_tone": "🤛🏾",
+1109	    "left-facing_fist_medium-light_skin_tone": "🤛🏼",
+1110	    "left-facing_fist_medium_skin_tone": "🤛🏽",
+1111	    "left-right_arrow": "↔",
+1112	    "left_arrow": "⬅",
+1113	    "left_arrow_curving_right": "↪",
+1114	    "left_luggage": "🛅",
+1115	    "left_speech_bubble": "🗨",
+1116	    "leg": "🦵",
+1117	    "lemon": "🍋",
+1118	    "leopard": "🐆",
+1119	    "level_slider": "🎚",
+1120	    "light_bulb": "💡",
+1121	    "light_rail": "🚈",
+1122	    "link": "🔗",
+1123	    "linked_paperclips": "🖇",
+1124	    "lion_face": "🦁",
+1125	    "lipstick": "💄",
+1126	    "litter_in_bin_sign": "🚮",
+1127	    "lizard": "🦎",
+1128	    "llama": "🦙",
+1129	    "lobster": "🦞",
+1130	    "locked": "🔒",
+1131	    "locked_with_key": "🔐",
+1132	    "locked_with_pen": "🔏",
+1133	    "locomotive": "🚂",
+1134	    "lollipop": "🍭",
+1135	    "lotion_bottle": "🧴",
+1136	    "loudly_crying_face": "😭",
+1137	    "loudspeaker": "📢",
+1138	    "love-you_gesture": "🤟",
+1139	    "love-you_gesture_dark_skin_tone": "🤟🏿",
+1140	    "love-you_gesture_light_skin_tone": "🤟🏻",
+1141	    "love-you_gesture_medium-dark_skin_tone": "🤟🏾",
+1142	    "love-you_gesture_medium-light_skin_tone": "🤟🏼",
+1143	    "love-you_gesture_medium_skin_tone": "🤟🏽",
+1144	    "love_hotel": "🏩",
+1145	    "love_letter": "💌",
+1146	    "luggage": "🧳",
+1147	    "lying_face": "🤥",
+1148	    "mage": "🧙",
+1149	    "mage_dark_skin_tone": "🧙🏿",
+1150	    "mage_light_skin_tone": "🧙🏻",
+1151	    "mage_medium-dark_skin_tone": "🧙🏾",
+1152	    "mage_medium-light_skin_tone": "🧙🏼",
+1153	    "mage_medium_skin_tone": "🧙🏽",
+1154	    "magnet": "🧲",
+1155	    "magnifying_glass_tilted_left": "🔍",
+1156	    "magnifying_glass_tilted_right": "🔎",
+1157	    "mahjong_red_dragon": "🀄",
+1158	    "male_sign": "♂",
+1159	    "man": "👨",
+1160	    "man_and_woman_holding_hands": "👫",
+1161	    "man_artist": "👨\u200d🎨",
+1162	    "man_artist_dark_skin_tone": "👨🏿\u200d🎨",
+1163	    "man_artist_light_skin_tone": "👨🏻\u200d🎨",
+1164	    "man_artist_medium-dark_skin_tone": "👨🏾\u200d🎨",
+1165	    "man_artist_medium-light_skin_tone": "👨🏼\u200d🎨",
+1166	    "man_artist_medium_skin_tone": "👨🏽\u200d🎨",
+1167	    "man_astronaut": "👨\u200d🚀",
+1168	    "man_astronaut_dark_skin_tone": "👨🏿\u200d🚀",
+1169	    "man_astronaut_light_skin_tone": "👨🏻\u200d🚀",
+1170	    "man_astronaut_medium-dark_skin_tone": "👨🏾\u200d🚀",
+1171	    "man_astronaut_medium-light_skin_tone": "👨🏼\u200d🚀",
+1172	    "man_astronaut_medium_skin_tone": "👨🏽\u200d🚀",
+1173	    "man_biking": "🚴\u200d♂️",
+1174	    "man_biking_dark_skin_tone": "🚴🏿\u200d♂️",
+1175	    "man_biking_light_skin_tone": "🚴🏻\u200d♂️",
+1176	    "man_biking_medium-dark_skin_tone": "🚴🏾\u200d♂️",
+1177	    "man_biking_medium-light_skin_tone": "🚴🏼\u200d♂️",
+1178	    "man_biking_medium_skin_tone": "🚴🏽\u200d♂️",
+1179	    "man_bouncing_ball": "⛹️\u200d♂️",
+1180	    "man_bouncing_ball_dark_skin_tone": "⛹🏿\u200d♂️",
+1181	    "man_bouncing_ball_light_skin_tone": "⛹🏻\u200d♂️",
+1182	    "man_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♂️",
+1183	    "man_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♂️",
+1184	    "man_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♂️",
+1185	    "man_bowing": "🙇\u200d♂️",
+1186	    "man_bowing_dark_skin_tone": "🙇🏿\u200d♂️",
+1187	    "man_bowing_light_skin_tone": "🙇🏻\u200d♂️",
+1188	    "man_bowing_medium-dark_skin_tone": "🙇🏾\u200d♂️",
+1189	    "man_bowing_medium-light_skin_tone": "🙇🏼\u200d♂️",
+1190	    "man_bowing_medium_skin_tone": "🙇🏽\u200d♂️",
+1191	    "man_cartwheeling": "🤸\u200d♂️",
+1192	    "man_cartwheeling_dark_skin_tone": "🤸🏿\u200d♂️",
+1193	    "man_cartwheeling_light_skin_tone": "🤸🏻\u200d♂️",
+1194	    "man_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♂️",
+1195	    "man_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♂️",
+1196	    "man_cartwheeling_medium_skin_tone": "🤸🏽\u200d♂️",
+1197	    "man_climbing": "🧗\u200d♂️",
+1198	    "man_climbing_dark_skin_tone": "🧗🏿\u200d♂️",
+1199	    "man_climbing_light_skin_tone": "🧗🏻\u200d♂️",
+1200	    "man_climbing_medium-dark_skin_tone": "🧗🏾\u200d♂️",
+1201	    "man_climbing_medium-light_skin_tone": "🧗🏼\u200d♂️",
+1202	    "man_climbing_medium_skin_tone": "🧗🏽\u200d♂️",
+1203	    "man_construction_worker": "👷\u200d♂️",
+1204	    "man_construction_worker_dark_skin_tone": "👷🏿\u200d♂️",
+1205	    "man_construction_worker_light_skin_tone": "👷🏻\u200d♂️",
+1206	    "man_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♂️",
+1207	    "man_construction_worker_medium-light_skin_tone": "👷🏼\u200d♂️",
+1208	    "man_construction_worker_medium_skin_tone": "👷🏽\u200d♂️",
+1209	    "man_cook": "👨\u200d🍳",
+1210	    "man_cook_dark_skin_tone": "👨🏿\u200d🍳",
+1211	    "man_cook_light_skin_tone": "👨🏻\u200d🍳",
+1212	    "man_cook_medium-dark_skin_tone": "👨🏾\u200d🍳",
+1213	    "man_cook_medium-light_skin_tone": "👨🏼\u200d🍳",
+1214	    "man_cook_medium_skin_tone": "👨🏽\u200d🍳",
+1215	    "man_dancing": "🕺",
+1216	    "man_dancing_dark_skin_tone": "🕺🏿",
+1217	    "man_dancing_light_skin_tone": "🕺🏻",
+1218	    "man_dancing_medium-dark_skin_tone": "🕺🏾",
+1219	    "man_dancing_medium-light_skin_tone": "🕺🏼",
+1220	    "man_dancing_medium_skin_tone": "🕺🏽",
+1221	    "man_dark_skin_tone": "👨🏿",
+1222	    "man_detective": "🕵️\u200d♂️",
+1223	    "man_detective_dark_skin_tone": "🕵🏿\u200d♂️",
+1224	    "man_detective_light_skin_tone": "🕵🏻\u200d♂️",
+1225	    "man_detective_medium-dark_skin_tone": "🕵🏾\u200d♂️",
+1226	    "man_detective_medium-light_skin_tone": "🕵🏼\u200d♂️",
+1227	    "man_detective_medium_skin_tone": "🕵🏽\u200d♂️",
+1228	    "man_elf": "🧝\u200d♂️",
+1229	    "man_elf_dark_skin_tone": "🧝🏿\u200d♂️",
+1230	    "man_elf_light_skin_tone": "🧝🏻\u200d♂️",
+1231	    "man_elf_medium-dark_skin_tone": "🧝🏾\u200d♂️",
+1232	    "man_elf_medium-light_skin_tone": "🧝🏼\u200d♂️",
+1233	    "man_elf_medium_skin_tone": "🧝🏽\u200d♂️",
+1234	    "man_facepalming": "🤦\u200d♂️",
+1235	    "man_facepalming_dark_skin_tone": "🤦🏿\u200d♂️",
+1236	    "man_facepalming_light_skin_tone": "🤦🏻\u200d♂️",
+1237	    "man_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♂️",
+1238	    "man_facepalming_medium-light_skin_tone": "🤦🏼\u200d♂️",
+1239	    "man_facepalming_medium_skin_tone": "🤦🏽\u200d♂️",
+1240	    "man_factory_worker": "👨\u200d🏭",
+1241	    "man_factory_worker_dark_skin_tone": "👨🏿\u200d🏭",
+1242	    "man_factory_worker_light_skin_tone": "👨🏻\u200d🏭",
+1243	    "man_factory_worker_medium-dark_skin_tone": "👨🏾\u200d🏭",
+1244	    "man_factory_worker_medium-light_skin_tone": "👨🏼\u200d🏭",
+1245	    "man_factory_worker_medium_skin_tone": "👨🏽\u200d🏭",
+1246	    "man_fairy": "🧚\u200d♂️",
+1247	    "man_fairy_dark_skin_tone": "🧚🏿\u200d♂️",
+1248	    "man_fairy_light_skin_tone": "🧚🏻\u200d♂️",
+1249	    "man_fairy_medium-dark_skin_tone": "🧚🏾\u200d♂️",
+1250	    "man_fairy_medium-light_skin_tone": "🧚🏼\u200d♂️",
+1251	    "man_fairy_medium_skin_tone": "🧚🏽\u200d♂️",
+1252	    "man_farmer": "👨\u200d🌾",
+1253	    "man_farmer_dark_skin_tone": "👨🏿\u200d🌾",
+1254	    "man_farmer_light_skin_tone": "👨🏻\u200d🌾",
+1255	    "man_farmer_medium-dark_skin_tone": "👨🏾\u200d🌾",
+1256	    "man_farmer_medium-light_skin_tone": "👨🏼\u200d🌾",
+1257	    "man_farmer_medium_skin_tone": "👨🏽\u200d🌾",
+1258	    "man_firefighter": "👨\u200d🚒",
+1259	    "man_firefighter_dark_skin_tone": "👨🏿\u200d🚒",
+1260	    "man_firefighter_light_skin_tone": "👨🏻\u200d🚒",
+1261	    "man_firefighter_medium-dark_skin_tone": "👨🏾\u200d🚒",
+1262	    "man_firefighter_medium-light_skin_tone": "👨🏼\u200d🚒",
+1263	    "man_firefighter_medium_skin_tone": "👨🏽\u200d🚒",
+1264	    "man_frowning": "🙍\u200d♂️",
+1265	    "man_frowning_dark_skin_tone": "🙍🏿\u200d♂️",
+1266	    "man_frowning_light_skin_tone": "🙍🏻\u200d♂️",
+1267	    "man_frowning_medium-dark_skin_tone": "🙍🏾\u200d♂️",
+1268	    "man_frowning_medium-light_skin_tone": "🙍🏼\u200d♂️",
+1269	    "man_frowning_medium_skin_tone": "🙍🏽\u200d♂️",
+1270	    "man_genie": "🧞\u200d♂️",
+1271	    "man_gesturing_no": "🙅\u200d♂️",
+1272	    "man_gesturing_no_dark_skin_tone": "🙅🏿\u200d♂️",
+1273	    "man_gesturing_no_light_skin_tone": "🙅🏻\u200d♂️",
+1274	    "man_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♂️",
+1275	    "man_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♂️",
+1276	    "man_gesturing_no_medium_skin_tone": "🙅🏽\u200d♂️",
+1277	    "man_gesturing_ok": "🙆\u200d♂️",
+1278	    "man_gesturing_ok_dark_skin_tone": "🙆🏿\u200d♂️",
+1279	    "man_gesturing_ok_light_skin_tone": "🙆🏻\u200d♂️",
+1280	    "man_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♂️",
+1281	    "man_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♂️",
+1282	    "man_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♂️",
+1283	    "man_getting_haircut": "💇\u200d♂️",
+1284	    "man_getting_haircut_dark_skin_tone": "💇🏿\u200d♂️",
+1285	    "man_getting_haircut_light_skin_tone": "💇🏻\u200d♂️",
+1286	    "man_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♂️",
+1287	    "man_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♂️",
+1288	    "man_getting_haircut_medium_skin_tone": "💇🏽\u200d♂️",
+1289	    "man_getting_massage": "💆\u200d♂️",
+1290	    "man_getting_massage_dark_skin_tone": "💆🏿\u200d♂️",
+1291	    "man_getting_massage_light_skin_tone": "💆🏻\u200d♂️",
+1292	    "man_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♂️",
+1293	    "man_getting_massage_medium-light_skin_tone": "💆🏼\u200d♂️",
+1294	    "man_getting_massage_medium_skin_tone": "💆🏽\u200d♂️",
+1295	    "man_golfing": "🏌️\u200d♂️",
+1296	    "man_golfing_dark_skin_tone": "🏌🏿\u200d♂️",
+1297	    "man_golfing_light_skin_tone": "🏌🏻\u200d♂️",
+1298	    "man_golfing_medium-dark_skin_tone": "🏌🏾\u200d♂️",
+1299	    "man_golfing_medium-light_skin_tone": "🏌🏼\u200d♂️",
+1300	    "man_golfing_medium_skin_tone": "🏌🏽\u200d♂️",
+1301	    "man_guard": "💂\u200d♂️",
+1302	    "man_guard_dark_skin_tone": "💂🏿\u200d♂️",
+1303	    "man_guard_light_skin_tone": "💂🏻\u200d♂️",
+1304	    "man_guard_medium-dark_skin_tone": "💂🏾\u200d♂️",
+1305	    "man_guard_medium-light_skin_tone": "💂🏼\u200d♂️",
+1306	    "man_guard_medium_skin_tone": "💂🏽\u200d♂️",
+1307	    "man_health_worker": "👨\u200d⚕️",
+1308	    "man_health_worker_dark_skin_tone": "👨🏿\u200d⚕️",
+1309	    "man_health_worker_light_skin_tone": "👨🏻\u200d⚕️",
+1310	    "man_health_worker_medium-dark_skin_tone": "👨🏾\u200d⚕️",
+1311	    "man_health_worker_medium-light_skin_tone": "👨🏼\u200d⚕️",
+1312	    "man_health_worker_medium_skin_tone": "👨🏽\u200d⚕️",
+1313	    "man_in_lotus_position": "🧘\u200d♂️",
+1314	    "man_in_lotus_position_dark_skin_tone": "🧘🏿\u200d♂️",
+1315	    "man_in_lotus_position_light_skin_tone": "🧘🏻\u200d♂️",
+1316	    "man_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♂️",
+1317	    "man_in_lotus_position_medium-light_skin_tone": "🧘🏼\u200d♂️",
+1318	    "man_in_lotus_position_medium_skin_tone": "🧘🏽\u200d♂️",
+1319	    "man_in_manual_wheelchair": "👨\u200d🦽",
+1320	    "man_in_motorized_wheelchair": "👨\u200d🦼",
+1321	    "man_in_steamy_room": "🧖\u200d♂️",
+1322	    "man_in_steamy_room_dark_skin_tone": "🧖🏿\u200d♂️",
+1323	    "man_in_steamy_room_light_skin_tone": "🧖🏻\u200d♂️",
+1324	    "man_in_steamy_room_medium-dark_skin_tone": "🧖🏾\u200d♂️",
+1325	    "man_in_steamy_room_medium-light_skin_tone": "🧖🏼\u200d♂️",
+1326	    "man_in_steamy_room_medium_skin_tone": "🧖🏽\u200d♂️",
+1327	    "man_in_suit_levitating": "🕴",
+1328	    "man_in_suit_levitating_dark_skin_tone": "🕴🏿",
+1329	    "man_in_suit_levitating_light_skin_tone": "🕴🏻",
+1330	    "man_in_suit_levitating_medium-dark_skin_tone": "🕴🏾",
+1331	    "man_in_suit_levitating_medium-light_skin_tone": "🕴🏼",
+1332	    "man_in_suit_levitating_medium_skin_tone": "🕴🏽",
+1333	    "man_in_tuxedo": "🤵",
+1334	    "man_in_tuxedo_dark_skin_tone": "🤵🏿",
+1335	    "man_in_tuxedo_light_skin_tone": "🤵🏻",
+1336	    "man_in_tuxedo_medium-dark_skin_tone": "🤵🏾",
+1337	    "man_in_tuxedo_medium-light_skin_tone": "🤵🏼",
+1338	    "man_in_tuxedo_medium_skin_tone": "🤵🏽",
+1339	    "man_judge": "👨\u200d⚖️",
+1340	    "man_judge_dark_skin_tone": "👨🏿\u200d⚖️",
+1341	    "man_judge_light_skin_tone": "👨🏻\u200d⚖️",
+1342	    "man_judge_medium-dark_skin_tone": "👨🏾\u200d⚖️",
+1343	    "man_judge_medium-light_skin_tone": "👨🏼\u200d⚖️",
+1344	    "man_judge_medium_skin_tone": "👨🏽\u200d⚖️",
+1345	    "man_juggling": "🤹\u200d♂️",
+1346	    "man_juggling_dark_skin_tone": "🤹🏿\u200d♂️",
+1347	    "man_juggling_light_skin_tone": "🤹🏻\u200d♂️",
+1348	    "man_juggling_medium-dark_skin_tone": "🤹🏾\u200d♂️",
+1349	    "man_juggling_medium-light_skin_tone": "🤹🏼\u200d♂️",
+1350	    "man_juggling_medium_skin_tone": "🤹🏽\u200d♂️",
+1351	    "man_lifting_weights": "🏋️\u200d♂️",
+1352	    "man_lifting_weights_dark_skin_tone": "🏋🏿\u200d♂️",
+1353	    "man_lifting_weights_light_skin_tone": "🏋🏻\u200d♂️",
+1354	    "man_lifting_weights_medium-dark_skin_tone": "🏋🏾\u200d♂️",
+1355	    "man_lifting_weights_medium-light_skin_tone": "🏋🏼\u200d♂️",
+1356	    "man_lifting_weights_medium_skin_tone": "🏋🏽\u200d♂️",
+1357	    "man_light_skin_tone": "👨🏻",
+1358	    "man_mage": "🧙\u200d♂️",
+1359	    "man_mage_dark_skin_tone": "🧙🏿\u200d♂️",
+1360	    "man_mage_light_skin_tone": "🧙🏻\u200d♂️",
+1361	    "man_mage_medium-dark_skin_tone": "🧙🏾\u200d♂️",
+1362	    "man_mage_medium-light_skin_tone": "🧙🏼\u200d♂️",
+1363	    "man_mage_medium_skin_tone": "🧙🏽\u200d♂️",
+1364	    "man_mechanic": "👨\u200d🔧",
+1365	    "man_mechanic_dark_skin_tone": "👨🏿\u200d🔧",
+1366	    "man_mechanic_light_skin_tone": "👨🏻\u200d🔧",
+1367	    "man_mechanic_medium-dark_skin_tone": "👨🏾\u200d🔧",
+1368	    "man_mechanic_medium-light_skin_tone": "👨🏼\u200d🔧",
+1369	    "man_mechanic_medium_skin_tone": "👨🏽\u200d🔧",
+1370	    "man_medium-dark_skin_tone": "👨🏾",
+1371	    "man_medium-light_skin_tone": "👨🏼",
+1372	    "man_medium_skin_tone": "👨🏽",
+1373	    "man_mountain_biking": "🚵\u200d♂️",
+1374	    "man_mountain_biking_dark_skin_tone": "🚵🏿\u200d♂️",
+1375	    "man_mountain_biking_light_skin_tone": "🚵🏻\u200d♂️",
+1376	    "man_mountain_biking_medium-dark_skin_tone": "🚵🏾\u200d♂️",
+1377	    "man_mountain_biking_medium-light_skin_tone": "🚵🏼\u200d♂️",
+1378	    "man_mountain_biking_medium_skin_tone": "🚵🏽\u200d♂️",
+1379	    "man_office_worker": "👨\u200d💼",
+1380	    "man_office_worker_dark_skin_tone": "👨🏿\u200d💼",
+1381	    "man_office_worker_light_skin_tone": "👨🏻\u200d💼",
+1382	    "man_office_worker_medium-dark_skin_tone": "👨🏾\u200d💼",
+1383	    "man_office_worker_medium-light_skin_tone": "👨🏼\u200d💼",
+1384	    "man_office_worker_medium_skin_tone": "👨🏽\u200d💼",
+1385	    "man_pilot": "👨\u200d✈️",
+1386	    "man_pilot_dark_skin_tone": "👨🏿\u200d✈️",
+1387	    "man_pilot_light_skin_tone": "👨🏻\u200d✈️",
+1388	    "man_pilot_medium-dark_skin_tone": "👨🏾\u200d✈️",
+1389	    "man_pilot_medium-light_skin_tone": "👨🏼\u200d✈️",
+1390	    "man_pilot_medium_skin_tone": "👨🏽\u200d✈️",
+1391	    "man_playing_handball": "🤾\u200d♂️",
+1392	    "man_playing_handball_dark_skin_tone": "🤾🏿\u200d♂️",
+1393	    "man_playing_handball_light_skin_tone": "🤾🏻\u200d♂️",
+1394	    "man_playing_handball_medium-dark_skin_tone": "🤾🏾\u200d♂️",
+1395	    "man_playing_handball_medium-light_skin_tone": "🤾🏼\u200d♂️",
+1396	    "man_playing_handball_medium_skin_tone": "🤾🏽\u200d♂️",
+1397	    "man_playing_water_polo": "🤽\u200d♂️",
+1398	    "man_playing_water_polo_dark_skin_tone": "🤽🏿\u200d♂️",
+1399	    "man_playing_water_polo_light_skin_tone": "🤽🏻\u200d♂️",
+1400	    "man_playing_water_polo_medium-dark_skin_tone": "🤽🏾\u200d♂️",
+1401	    "man_playing_water_polo_medium-light_skin_tone": "🤽🏼\u200d♂️",
+1402	    "man_playing_water_polo_medium_skin_tone": "🤽🏽\u200d♂️",
+1403	    "man_police_officer": "👮\u200d♂️",
+1404	    "man_police_officer_dark_skin_tone": "👮🏿\u200d♂️",
+1405	    "man_police_officer_light_skin_tone": "👮🏻\u200d♂️",
+1406	    "man_police_officer_medium-dark_skin_tone": "👮🏾\u200d♂️",
+1407	    "man_police_officer_medium-light_skin_tone": "👮🏼\u200d♂️",
+1408	    "man_police_officer_medium_skin_tone": "👮🏽\u200d♂️",
+1409	    "man_pouting": "🙎\u200d♂️",
+1410	    "man_pouting_dark_skin_tone": "🙎🏿\u200d♂️",
+1411	    "man_pouting_light_skin_tone": "🙎🏻\u200d♂️",
+1412	    "man_pouting_medium-dark_skin_tone": "🙎🏾\u200d♂️",
+1413	    "man_pouting_medium-light_skin_tone": "🙎🏼\u200d♂️",
+1414	    "man_pouting_medium_skin_tone": "🙎🏽\u200d♂️",
+1415	    "man_raising_hand": "🙋\u200d♂️",
+1416	    "man_raising_hand_dark_skin_tone": "🙋🏿\u200d♂️",
+1417	    "man_raising_hand_light_skin_tone": "🙋🏻\u200d♂️",
+1418	    "man_raising_hand_medium-dark_skin_tone": "🙋🏾\u200d♂️",
+1419	    "man_raising_hand_medium-light_skin_tone": "🙋🏼\u200d♂️",
+1420	    "man_raising_hand_medium_skin_tone": "🙋🏽\u200d♂️",
+1421	    "man_rowing_boat": "🚣\u200d♂️",
+1422	    "man_rowing_boat_dark_skin_tone": "🚣🏿\u200d♂️",
+1423	    "man_rowing_boat_light_skin_tone": "🚣🏻\u200d♂️",
+1424	    "man_rowing_boat_medium-dark_skin_tone": "🚣🏾\u200d♂️",
+1425	    "man_rowing_boat_medium-light_skin_tone": "🚣🏼\u200d♂️",
+1426	    "man_rowing_boat_medium_skin_tone": "🚣🏽\u200d♂️",
+1427	    "man_running": "🏃\u200d♂️",
+1428	    "man_running_dark_skin_tone": "🏃🏿\u200d♂️",
+1429	    "man_running_light_skin_tone": "🏃🏻\u200d♂️",
+1430	    "man_running_medium-dark_skin_tone": "🏃🏾\u200d♂️",
+1431	    "man_running_medium-light_skin_tone": "🏃🏼\u200d♂️",
+1432	    "man_running_medium_skin_tone": "🏃🏽\u200d♂️",
+1433	    "man_scientist": "👨\u200d🔬",
+1434	    "man_scientist_dark_skin_tone": "👨🏿\u200d🔬",
+1435	    "man_scientist_light_skin_tone": "👨🏻\u200d🔬",
+1436	    "man_scientist_medium-dark_skin_tone": "👨🏾\u200d🔬",
+1437	    "man_scientist_medium-light_skin_tone": "👨🏼\u200d🔬",
+1438	    "man_scientist_medium_skin_tone": "👨🏽\u200d🔬",
+1439	    "man_shrugging": "🤷\u200d♂️",
+1440	    "man_shrugging_dark_skin_tone": "🤷🏿\u200d♂️",
+1441	    "man_shrugging_light_skin_tone": "🤷🏻\u200d♂️",
+1442	    "man_shrugging_medium-dark_skin_tone": "🤷🏾\u200d♂️",
+1443	    "man_shrugging_medium-light_skin_tone": "🤷🏼\u200d♂️",
+1444	    "man_shrugging_medium_skin_tone": "🤷🏽\u200d♂️",
+1445	    "man_singer": "👨\u200d🎤",
+1446	    "man_singer_dark_skin_tone": "👨🏿\u200d🎤",
+1447	    "man_singer_light_skin_tone": "👨🏻\u200d🎤",
+1448	    "man_singer_medium-dark_skin_tone": "👨🏾\u200d🎤",
+1449	    "man_singer_medium-light_skin_tone": "👨🏼\u200d🎤",
+1450	    "man_singer_medium_skin_tone": "👨🏽\u200d🎤",
+1451	    "man_student": "👨\u200d🎓",
+1452	    "man_student_dark_skin_tone": "👨🏿\u200d🎓",
+1453	    "man_student_light_skin_tone": "👨🏻\u200d🎓",
+1454	    "man_student_medium-dark_skin_tone": "👨🏾\u200d🎓",
+1455	    "man_student_medium-light_skin_tone": "👨🏼\u200d🎓",
+1456	    "man_student_medium_skin_tone": "👨🏽\u200d🎓",
+1457	    "man_surfing": "🏄\u200d♂️",
+1458	    "man_surfing_dark_skin_tone": "🏄🏿\u200d♂️",
+1459	    "man_surfing_light_skin_tone": "🏄🏻\u200d♂️",
+1460	    "man_surfing_medium-dark_skin_tone": "🏄🏾\u200d♂️",
+1461	    "man_surfing_medium-light_skin_tone": "🏄🏼\u200d♂️",
+1462	    "man_surfing_medium_skin_tone": "🏄🏽\u200d♂️",
+1463	    "man_swimming": "🏊\u200d♂️",
+1464	    "man_swimming_dark_skin_tone": "🏊🏿\u200d♂️",
+1465	    "man_swimming_light_skin_tone": "🏊🏻\u200d♂️",
+1466	    "man_swimming_medium-dark_skin_tone": "🏊🏾\u200d♂️",
+1467	    "man_swimming_medium-light_skin_tone": "🏊🏼\u200d♂️",
+1468	    "man_swimming_medium_skin_tone": "🏊🏽\u200d♂️",
+1469	    "man_teacher": "👨\u200d🏫",
+1470	    "man_teacher_dark_skin_tone": "👨🏿\u200d🏫",
+1471	    "man_teacher_light_skin_tone": "👨🏻\u200d🏫",
+1472	    "man_teacher_medium-dark_skin_tone": "👨🏾\u200d🏫",
+1473	    "man_teacher_medium-light_skin_tone": "👨🏼\u200d🏫",
+1474	    "man_teacher_medium_skin_tone": "👨🏽\u200d🏫",
+1475	    "man_technologist": "👨\u200d💻",
+1476	    "man_technologist_dark_skin_tone": "👨🏿\u200d💻",
+1477	    "man_technologist_light_skin_tone": "👨🏻\u200d💻",
+1478	    "man_technologist_medium-dark_skin_tone": "👨🏾\u200d💻",
+1479	    "man_technologist_medium-light_skin_tone": "👨🏼\u200d💻",
+1480	    "man_technologist_medium_skin_tone": "👨🏽\u200d💻",
+1481	    "man_tipping_hand": "💁\u200d♂️",
+1482	    "man_tipping_hand_dark_skin_tone": "💁🏿\u200d♂️",
+1483	    "man_tipping_hand_light_skin_tone": "💁🏻\u200d♂️",
+1484	    "man_tipping_hand_medium-dark_skin_tone": "💁🏾\u200d♂️",
+1485	    "man_tipping_hand_medium-light_skin_tone": "💁🏼\u200d♂️",
+1486	    "man_tipping_hand_medium_skin_tone": "💁🏽\u200d♂️",
+1487	    "man_vampire": "🧛\u200d♂️",
+1488	    "man_vampire_dark_skin_tone": "🧛🏿\u200d♂️",
+1489	    "man_vampire_light_skin_tone": "🧛🏻\u200d♂️",
+1490	    "man_vampire_medium-dark_skin_tone": "🧛🏾\u200d♂️",
+1491	    "man_vampire_medium-light_skin_tone": "🧛🏼\u200d♂️",
+1492	    "man_vampire_medium_skin_tone": "🧛🏽\u200d♂️",
+1493	    "man_walking": "🚶\u200d♂️",
+1494	    "man_walking_dark_skin_tone": "🚶🏿\u200d♂️",
+1495	    "man_walking_light_skin_tone": "🚶🏻\u200d♂️",
+1496	    "man_walking_medium-dark_skin_tone": "🚶🏾\u200d♂️",
+1497	    "man_walking_medium-light_skin_tone": "🚶🏼\u200d♂️",
+1498	    "man_walking_medium_skin_tone": "🚶🏽\u200d♂️",
+1499	    "man_wearing_turban": "👳\u200d♂️",
+1500	    "man_wearing_turban_dark_skin_tone": "👳🏿\u200d♂️",
+1501	    "man_wearing_turban_light_skin_tone": "👳🏻\u200d♂️",
+1502	    "man_wearing_turban_medium-dark_skin_tone": "👳🏾\u200d♂️",
+1503	    "man_wearing_turban_medium-light_skin_tone": "👳🏼\u200d♂️",
+1504	    "man_wearing_turban_medium_skin_tone": "👳🏽\u200d♂️",
+1505	    "man_with_probing_cane": "👨\u200d🦯",
+1506	    "man_with_chinese_cap": "👲",
+1507	    "man_with_chinese_cap_dark_skin_tone": "👲🏿",
+1508	    "man_with_chinese_cap_light_skin_tone": "👲🏻",
+1509	    "man_with_chinese_cap_medium-dark_skin_tone": "👲🏾",
+1510	    "man_with_chinese_cap_medium-light_skin_tone": "👲🏼",
+1511	    "man_with_chinese_cap_medium_skin_tone": "👲🏽",
+1512	    "man_zombie": "🧟\u200d♂️",
+1513	    "mango": "🥭",
+1514	    "mantelpiece_clock": "🕰",
+1515	    "manual_wheelchair": "🦽",
+1516	    "man’s_shoe": "👞",
+1517	    "map_of_japan": "🗾",
+1518	    "maple_leaf": "🍁",
+1519	    "martial_arts_uniform": "🥋",
+1520	    "mate": "🧉",
+1521	    "meat_on_bone": "🍖",
+1522	    "mechanical_arm": "🦾",
+1523	    "mechanical_leg": "🦿",
+1524	    "medical_symbol": "⚕",
+1525	    "megaphone": "📣",
+1526	    "melon": "🍈",
+1527	    "memo": "📝",
+1528	    "men_with_bunny_ears": "👯\u200d♂️",
+1529	    "men_wrestling": "🤼\u200d♂️",
+1530	    "menorah": "🕎",
+1531	    "men’s_room": "🚹",
+1532	    "mermaid": "🧜\u200d♀️",
+1533	    "mermaid_dark_skin_tone": "🧜🏿\u200d♀️",
+1534	    "mermaid_light_skin_tone": "🧜🏻\u200d♀️",
+1535	    "mermaid_medium-dark_skin_tone": "🧜🏾\u200d♀️",
+1536	    "mermaid_medium-light_skin_tone": "🧜🏼\u200d♀️",
+1537	    "mermaid_medium_skin_tone": "🧜🏽\u200d♀️",
+1538	    "merman": "🧜\u200d♂️",
+1539	    "merman_dark_skin_tone": "🧜🏿\u200d♂️",
+1540	    "merman_light_skin_tone": "🧜🏻\u200d♂️",
+1541	    "merman_medium-dark_skin_tone": "🧜🏾\u200d♂️",
+1542	    "merman_medium-light_skin_tone": "🧜🏼\u200d♂️",
+1543	    "merman_medium_skin_tone": "🧜🏽\u200d♂️",
+1544	    "merperson": "🧜",
+1545	    "merperson_dark_skin_tone": "🧜🏿",
+1546	    "merperson_light_skin_tone": "🧜🏻",
+1547	    "merperson_medium-dark_skin_tone": "🧜🏾",
+1548	    "merperson_medium-light_skin_tone": "🧜🏼",
+1549	    "merperson_medium_skin_tone": "🧜🏽",
+1550	    "metro": "🚇",
+1551	    "microbe": "🦠",
+1552	    "microphone": "🎤",
+1553	    "microscope": "🔬",
+1554	    "middle_finger": "🖕",
+1555	    "middle_finger_dark_skin_tone": "🖕🏿",
+1556	    "middle_finger_light_skin_tone": "🖕🏻",
+1557	    "middle_finger_medium-dark_skin_tone": "🖕🏾",
+1558	    "middle_finger_medium-light_skin_tone": "🖕🏼",
+1559	    "middle_finger_medium_skin_tone": "🖕🏽",
+1560	    "military_medal": "🎖",
+1561	    "milky_way": "🌌",
+1562	    "minibus": "🚐",
+1563	    "moai": "🗿",
+1564	    "mobile_phone": "📱",
+1565	    "mobile_phone_off": "📴",
+1566	    "mobile_phone_with_arrow": "📲",
+1567	    "money-mouth_face": "🤑",
+1568	    "money_bag": "💰",
+1569	    "money_with_wings": "💸",
+1570	    "monkey": "🐒",
+1571	    "monkey_face": "🐵",
+1572	    "monorail": "🚝",
+1573	    "moon_cake": "🥮",
+1574	    "moon_viewing_ceremony": "🎑",
+1575	    "mosque": "🕌",
+1576	    "mosquito": "🦟",
+1577	    "motor_boat": "🛥",
+1578	    "motor_scooter": "🛵",
+1579	    "motorcycle": "🏍",
+1580	    "motorized_wheelchair": "🦼",
+1581	    "motorway": "🛣",
+1582	    "mount_fuji": "🗻",
+1583	    "mountain": "⛰",
+1584	    "mountain_cableway": "🚠",
+1585	    "mountain_railway": "🚞",
+1586	    "mouse": "🐭",
+1587	    "mouse_face": "🐭",
+1588	    "mouth": "👄",
+1589	    "movie_camera": "🎥",
+1590	    "mushroom": "🍄",
+1591	    "musical_keyboard": "🎹",
+1592	    "musical_note": "🎵",
+1593	    "musical_notes": "🎶",
+1594	    "musical_score": "🎼",
+1595	    "muted_speaker": "🔇",
+1596	    "nail_polish": "💅",
+1597	    "nail_polish_dark_skin_tone": "💅🏿",
+1598	    "nail_polish_light_skin_tone": "💅🏻",
+1599	    "nail_polish_medium-dark_skin_tone": "💅🏾",
+1600	    "nail_polish_medium-light_skin_tone": "💅🏼",
+1601	    "nail_polish_medium_skin_tone": "💅🏽",
+1602	    "name_badge": "📛",
+1603	    "national_park": "🏞",
+1604	    "nauseated_face": "🤢",
+1605	    "nazar_amulet": "🧿",
+1606	    "necktie": "👔",
+1607	    "nerd_face": "🤓",
+1608	    "neutral_face": "😐",
+1609	    "new_moon": "🌑",
+1610	    "new_moon_face": "🌚",
+1611	    "newspaper": "📰",
+1612	    "next_track_button": "⏭",
+1613	    "night_with_stars": "🌃",
+1614	    "nine-thirty": "🕤",
+1615	    "nine_o’clock": "🕘",
+1616	    "no_bicycles": "🚳",
+1617	    "no_entry": "⛔",
+1618	    "no_littering": "🚯",
+1619	    "no_mobile_phones": "📵",
+1620	    "no_one_under_eighteen": "🔞",
+1621	    "no_pedestrians": "🚷",
+1622	    "no_smoking": "🚭",
+1623	    "non-potable_water": "🚱",
+1624	    "nose": "👃",
+1625	    "nose_dark_skin_tone": "👃🏿",
+1626	    "nose_light_skin_tone": "👃🏻",
+1627	    "nose_medium-dark_skin_tone": "👃🏾",
+1628	    "nose_medium-light_skin_tone": "👃🏼",
+1629	    "nose_medium_skin_tone": "👃🏽",
+1630	    "notebook": "📓",
+1631	    "notebook_with_decorative_cover": "📔",
+1632	    "nut_and_bolt": "🔩",
+1633	    "octopus": "🐙",
+1634	    "oden": "🍢",
+1635	    "office_building": "🏢",
+1636	    "ogre": "👹",
+1637	    "oil_drum": "🛢",
+1638	    "old_key": "🗝",
+1639	    "old_man": "👴",
+1640	    "old_man_dark_skin_tone": "👴🏿",
+1641	    "old_man_light_skin_tone": "👴🏻",
+1642	    "old_man_medium-dark_skin_tone": "👴🏾",
+1643	    "old_man_medium-light_skin_tone": "👴🏼",
+1644	    "old_man_medium_skin_tone": "👴🏽",
+1645	    "old_woman": "👵",
+1646	    "old_woman_dark_skin_tone": "👵🏿",
+1647	    "old_woman_light_skin_tone": "👵🏻",
+1648	    "old_woman_medium-dark_skin_tone": "👵🏾",
+1649	    "old_woman_medium-light_skin_tone": "👵🏼",
+1650	    "old_woman_medium_skin_tone": "👵🏽",
+1651	    "older_adult": "🧓",
+1652	    "older_adult_dark_skin_tone": "🧓🏿",
+1653	    "older_adult_light_skin_tone": "🧓🏻",
+1654	    "older_adult_medium-dark_skin_tone": "🧓🏾",
+1655	    "older_adult_medium-light_skin_tone": "🧓🏼",
+1656	    "older_adult_medium_skin_tone": "🧓🏽",
+1657	    "om": "🕉",
+1658	    "oncoming_automobile": "🚘",
+1659	    "oncoming_bus": "🚍",
+1660	    "oncoming_fist": "👊",
+1661	    "oncoming_fist_dark_skin_tone": "👊🏿",
+1662	    "oncoming_fist_light_skin_tone": "👊🏻",
+1663	    "oncoming_fist_medium-dark_skin_tone": "👊🏾",
+1664	    "oncoming_fist_medium-light_skin_tone": "👊🏼",
+1665	    "oncoming_fist_medium_skin_tone": "👊🏽",
+1666	    "oncoming_police_car": "🚔",
+1667	    "oncoming_taxi": "🚖",
+1668	    "one-piece_swimsuit": "🩱",
+1669	    "one-thirty": "🕜",
+1670	    "one_o’clock": "🕐",
+1671	    "onion": "🧅",
+1672	    "open_book": "📖",
+1673	    "open_file_folder": "📂",
+1674	    "open_hands": "👐",
+1675	    "open_hands_dark_skin_tone": "👐🏿",
+1676	    "open_hands_light_skin_tone": "👐🏻",
+1677	    "open_hands_medium-dark_skin_tone": "👐🏾",
+1678	    "open_hands_medium-light_skin_tone": "👐🏼",
+1679	    "open_hands_medium_skin_tone": "👐🏽",
+1680	    "open_mailbox_with_lowered_flag": "📭",
+1681	    "open_mailbox_with_raised_flag": "📬",
+1682	    "optical_disk": "💿",
+1683	    "orange_book": "📙",
+1684	    "orange_circle": "🟠",
+1685	    "orange_heart": "🧡",
+1686	    "orange_square": "🟧",
+1687	    "orangutan": "🦧",
+1688	    "orthodox_cross": "☦",
+1689	    "otter": "🦦",
+1690	    "outbox_tray": "📤",
+1691	    "owl": "🦉",
+1692	    "ox": "🐂",
+1693	    "oyster": "🦪",
+1694	    "package": "📦",
+1695	    "page_facing_up": "📄",
+1696	    "page_with_curl": "📃",
+1697	    "pager": "📟",
+1698	    "paintbrush": "🖌",
+1699	    "palm_tree": "🌴",
+1700	    "palms_up_together": "🤲",
+1701	    "palms_up_together_dark_skin_tone": "🤲🏿",
+1702	    "palms_up_together_light_skin_tone": "🤲🏻",
+1703	    "palms_up_together_medium-dark_skin_tone": "🤲🏾",
+1704	    "palms_up_together_medium-light_skin_tone": "🤲🏼",
+1705	    "palms_up_together_medium_skin_tone": "🤲🏽",
+1706	    "pancakes": "🥞",
+1707	    "panda_face": "🐼",
+1708	    "paperclip": "📎",
+1709	    "parrot": "🦜",
+1710	    "part_alternation_mark": "〽",
+1711	    "party_popper": "🎉",
+1712	    "partying_face": "🥳",
+1713	    "passenger_ship": "🛳",
+1714	    "passport_control": "🛂",
+1715	    "pause_button": "⏸",
+1716	    "paw_prints": "🐾",
+1717	    "peace_symbol": "☮",
+1718	    "peach": "🍑",
+1719	    "peacock": "🦚",
+1720	    "peanuts": "🥜",
+1721	    "pear": "🍐",
+1722	    "pen": "🖊",
+1723	    "pencil": "📝",
+1724	    "penguin": "🐧",
+1725	    "pensive_face": "😔",
+1726	    "people_holding_hands": "🧑\u200d🤝\u200d🧑",
+1727	    "people_with_bunny_ears": "👯",
+1728	    "people_wrestling": "🤼",
+1729	    "performing_arts": "🎭",
+1730	    "persevering_face": "😣",
+1731	    "person_biking": "🚴",
+1732	    "person_biking_dark_skin_tone": "🚴🏿",
+1733	    "person_biking_light_skin_tone": "🚴🏻",
+1734	    "person_biking_medium-dark_skin_tone": "🚴🏾",
+1735	    "person_biking_medium-light_skin_tone": "🚴🏼",
+1736	    "person_biking_medium_skin_tone": "🚴🏽",
+1737	    "person_bouncing_ball": "⛹",
+1738	    "person_bouncing_ball_dark_skin_tone": "⛹🏿",
+1739	    "person_bouncing_ball_light_skin_tone": "⛹🏻",
+1740	    "person_bouncing_ball_medium-dark_skin_tone": "⛹🏾",
+1741	    "person_bouncing_ball_medium-light_skin_tone": "⛹🏼",
+1742	    "person_bouncing_ball_medium_skin_tone": "⛹🏽",
+1743	    "person_bowing": "🙇",
+1744	    "person_bowing_dark_skin_tone": "🙇🏿",
+1745	    "person_bowing_light_skin_tone": "🙇🏻",
+1746	    "person_bowing_medium-dark_skin_tone": "🙇🏾",
+1747	    "person_bowing_medium-light_skin_tone": "🙇🏼",
+1748	    "person_bowing_medium_skin_tone": "🙇🏽",
+1749	    "person_cartwheeling": "🤸",
+1750	    "person_cartwheeling_dark_skin_tone": "🤸🏿",
+1751	    "person_cartwheeling_light_skin_tone": "🤸🏻",
+1752	    "person_cartwheeling_medium-dark_skin_tone": "🤸🏾",
+1753	    "person_cartwheeling_medium-light_skin_tone": "🤸🏼",
+1754	    "person_cartwheeling_medium_skin_tone": "🤸🏽",
+1755	    "person_climbing": "🧗",
+1756	    "person_climbing_dark_skin_tone": "🧗🏿",
+1757	    "person_climbing_light_skin_tone": "🧗🏻",
+1758	    "person_climbing_medium-dark_skin_tone": "🧗🏾",
+1759	    "person_climbing_medium-light_skin_tone": "🧗🏼",
+1760	    "person_climbing_medium_skin_tone": "🧗🏽",
+1761	    "person_facepalming": "🤦",
+1762	    "person_facepalming_dark_skin_tone": "🤦🏿",
+1763	    "person_facepalming_light_skin_tone": "🤦🏻",
+1764	    "person_facepalming_medium-dark_skin_tone": "🤦🏾",
+1765	    "person_facepalming_medium-light_skin_tone": "🤦🏼",
+1766	    "person_facepalming_medium_skin_tone": "🤦🏽",
+1767	    "person_fencing": "🤺",
+1768	    "person_frowning": "🙍",
+1769	    "person_frowning_dark_skin_tone": "🙍🏿",
+1770	    "person_frowning_light_skin_tone": "🙍🏻",
+1771	    "person_frowning_medium-dark_skin_tone": "🙍🏾",
+1772	    "person_frowning_medium-light_skin_tone": "🙍🏼",
+1773	    "person_frowning_medium_skin_tone": "🙍🏽",
+1774	    "person_gesturing_no": "🙅",
+1775	    "person_gesturing_no_dark_skin_tone": "🙅🏿",
+1776	    "person_gesturing_no_light_skin_tone": "🙅🏻",
+1777	    "person_gesturing_no_medium-dark_skin_tone": "🙅🏾",
+1778	    "person_gesturing_no_medium-light_skin_tone": "🙅🏼",
+1779	    "person_gesturing_no_medium_skin_tone": "🙅🏽",
+1780	    "person_gesturing_ok": "🙆",
+1781	    "person_gesturing_ok_dark_skin_tone": "🙆🏿",
+1782	    "person_gesturing_ok_light_skin_tone": "🙆🏻",
+1783	    "person_gesturing_ok_medium-dark_skin_tone": "🙆🏾",
+1784	    "person_gesturing_ok_medium-light_skin_tone": "🙆🏼",
+1785	    "person_gesturing_ok_medium_skin_tone": "🙆🏽",
+1786	    "person_getting_haircut": "💇",
+1787	    "person_getting_haircut_dark_skin_tone": "💇🏿",
+1788	    "person_getting_haircut_light_skin_tone": "💇🏻",
+1789	    "person_getting_haircut_medium-dark_skin_tone": "💇🏾",
+1790	    "person_getting_haircut_medium-light_skin_tone": "💇🏼",
+1791	    "person_getting_haircut_medium_skin_tone": "💇🏽",
+1792	    "person_getting_massage": "💆",
+1793	    "person_getting_massage_dark_skin_tone": "💆🏿",
+1794	    "person_getting_massage_light_skin_tone": "💆🏻",
+1795	    "person_getting_massage_medium-dark_skin_tone": "💆🏾",
+1796	    "person_getting_massage_medium-light_skin_tone": "💆🏼",
+1797	    "person_getting_massage_medium_skin_tone": "💆🏽",
+1798	    "person_golfing": "🏌",
+1799	    "person_golfing_dark_skin_tone": "🏌🏿",
+1800	    "person_golfing_light_skin_tone": "🏌🏻",
+1801	    "person_golfing_medium-dark_skin_tone": "🏌🏾",
+1802	    "person_golfing_medium-light_skin_tone": "🏌🏼",
+1803	    "person_golfing_medium_skin_tone": "🏌🏽",
+1804	    "person_in_bed": "🛌",
+1805	    "person_in_bed_dark_skin_tone": "🛌🏿",
+1806	    "person_in_bed_light_skin_tone": "🛌🏻",
+1807	    "person_in_bed_medium-dark_skin_tone": "🛌🏾",
+1808	    "person_in_bed_medium-light_skin_tone": "🛌🏼",
+1809	    "person_in_bed_medium_skin_tone": "🛌🏽",
+1810	    "person_in_lotus_position": "🧘",
+1811	    "person_in_lotus_position_dark_skin_tone": "🧘🏿",
+1812	    "person_in_lotus_position_light_skin_tone": "🧘🏻",
+1813	    "person_in_lotus_position_medium-dark_skin_tone": "🧘🏾",
+1814	    "person_in_lotus_position_medium-light_skin_tone": "🧘🏼",
+1815	    "person_in_lotus_position_medium_skin_tone": "🧘🏽",
+1816	    "person_in_steamy_room": "🧖",
+1817	    "person_in_steamy_room_dark_skin_tone": "🧖🏿",
+1818	    "person_in_steamy_room_light_skin_tone": "🧖🏻",
+1819	    "person_in_steamy_room_medium-dark_skin_tone": "🧖🏾",
+1820	    "person_in_steamy_room_medium-light_skin_tone": "🧖🏼",
+1821	    "person_in_steamy_room_medium_skin_tone": "🧖🏽",
+1822	    "person_juggling": "🤹",
+1823	    "person_juggling_dark_skin_tone": "🤹🏿",
+1824	    "person_juggling_light_skin_tone": "🤹🏻",
+1825	    "person_juggling_medium-dark_skin_tone": "🤹🏾",
+1826	    "person_juggling_medium-light_skin_tone": "🤹🏼",
+1827	    "person_juggling_medium_skin_tone": "🤹🏽",
+1828	    "person_kneeling": "🧎",
+1829	    "person_lifting_weights": "🏋",
+1830	    "person_lifting_weights_dark_skin_tone": "🏋🏿",
+1831	    "person_lifting_weights_light_skin_tone": "🏋🏻",
+1832	    "person_lifting_weights_medium-dark_skin_tone": "🏋🏾",
+1833	    "person_lifting_weights_medium-light_skin_tone": "🏋🏼",
+1834	    "person_lifting_weights_medium_skin_tone": "🏋🏽",
+1835	    "person_mountain_biking": "🚵",
+1836	    "person_mountain_biking_dark_skin_tone": "🚵🏿",
+1837	    "person_mountain_biking_light_skin_tone": "🚵🏻",
+1838	    "person_mountain_biking_medium-dark_skin_tone": "🚵🏾",
+1839	    "person_mountain_biking_medium-light_skin_tone": "🚵🏼",
+1840	    "person_mountain_biking_medium_skin_tone": "🚵🏽",
+1841	    "person_playing_handball": "🤾",
+1842	    "person_playing_handball_dark_skin_tone": "🤾🏿",
+1843	    "person_playing_handball_light_skin_tone": "🤾🏻",
+1844	    "person_playing_handball_medium-dark_skin_tone": "🤾🏾",
+1845	    "person_playing_handball_medium-light_skin_tone": "🤾🏼",
+1846	    "person_playing_handball_medium_skin_tone": "🤾🏽",
+1847	    "person_playing_water_polo": "🤽",
+1848	    "person_playing_water_polo_dark_skin_tone": "🤽🏿",
+1849	    "person_playing_water_polo_light_skin_tone": "🤽🏻",
+1850	    "person_playing_water_polo_medium-dark_skin_tone": "🤽🏾",
+1851	    "person_playing_water_polo_medium-light_skin_tone": "🤽🏼",
+1852	    "person_playing_water_polo_medium_skin_tone": "🤽🏽",
+1853	    "person_pouting": "🙎",
+1854	    "person_pouting_dark_skin_tone": "🙎🏿",
+1855	    "person_pouting_light_skin_tone": "🙎🏻",
+1856	    "person_pouting_medium-dark_skin_tone": "🙎🏾",
+1857	    "person_pouting_medium-light_skin_tone": "🙎🏼",
+1858	    "person_pouting_medium_skin_tone": "🙎🏽",
+1859	    "person_raising_hand": "🙋",
+1860	    "person_raising_hand_dark_skin_tone": "🙋🏿",
+1861	    "person_raising_hand_light_skin_tone": "🙋🏻",
+1862	    "person_raising_hand_medium-dark_skin_tone": "🙋🏾",
+1863	    "person_raising_hand_medium-light_skin_tone": "🙋🏼",
+1864	    "person_raising_hand_medium_skin_tone": "🙋🏽",
+1865	    "person_rowing_boat": "🚣",
+1866	    "person_rowing_boat_dark_skin_tone": "🚣🏿",
+1867	    "person_rowing_boat_light_skin_tone": "🚣🏻",
+1868	    "person_rowing_boat_medium-dark_skin_tone": "🚣🏾",
+1869	    "person_rowing_boat_medium-light_skin_tone": "🚣🏼",
+1870	    "person_rowing_boat_medium_skin_tone": "🚣🏽",
+1871	    "person_running": "🏃",
+1872	    "person_running_dark_skin_tone": "🏃🏿",
+1873	    "person_running_light_skin_tone": "🏃🏻",
+1874	    "person_running_medium-dark_skin_tone": "🏃🏾",
+1875	    "person_running_medium-light_skin_tone": "🏃🏼",
+1876	    "person_running_medium_skin_tone": "🏃🏽",
+1877	    "person_shrugging": "🤷",
+1878	    "person_shrugging_dark_skin_tone": "🤷🏿",
+1879	    "person_shrugging_light_skin_tone": "🤷🏻",
+1880	    "person_shrugging_medium-dark_skin_tone": "🤷🏾",
+1881	    "person_shrugging_medium-light_skin_tone": "🤷🏼",
+1882	    "person_shrugging_medium_skin_tone": "🤷🏽",
+1883	    "person_standing": "🧍",
+1884	    "person_surfing": "🏄",
+1885	    "person_surfing_dark_skin_tone": "🏄🏿",
+1886	    "person_surfing_light_skin_tone": "🏄🏻",
+1887	    "person_surfing_medium-dark_skin_tone": "🏄🏾",
+1888	    "person_surfing_medium-light_skin_tone": "🏄🏼",
+1889	    "person_surfing_medium_skin_tone": "🏄🏽",
+1890	    "person_swimming": "🏊",
+1891	    "person_swimming_dark_skin_tone": "🏊🏿",
+1892	    "person_swimming_light_skin_tone": "🏊🏻",
+1893	    "person_swimming_medium-dark_skin_tone": "🏊🏾",
+1894	    "person_swimming_medium-light_skin_tone": "🏊🏼",
+1895	    "person_swimming_medium_skin_tone": "🏊🏽",
+1896	    "person_taking_bath": "🛀",
+1897	    "person_taking_bath_dark_skin_tone": "🛀🏿",
+1898	    "person_taking_bath_light_skin_tone": "🛀🏻",
+1899	    "person_taking_bath_medium-dark_skin_tone": "🛀🏾",
+1900	    "person_taking_bath_medium-light_skin_tone": "🛀🏼",
+1901	    "person_taking_bath_medium_skin_tone": "🛀🏽",
+1902	    "person_tipping_hand": "💁",
+1903	    "person_tipping_hand_dark_skin_tone": "💁🏿",
+1904	    "person_tipping_hand_light_skin_tone": "💁🏻",
+1905	    "person_tipping_hand_medium-dark_skin_tone": "💁🏾",
+1906	    "person_tipping_hand_medium-light_skin_tone": "💁🏼",
+1907	    "person_tipping_hand_medium_skin_tone": "💁🏽",
+1908	    "person_walking": "🚶",
+1909	    "person_walking_dark_skin_tone": "🚶🏿",
+1910	    "person_walking_light_skin_tone": "🚶🏻",
+1911	    "person_walking_medium-dark_skin_tone": "🚶🏾",
+1912	    "person_walking_medium-light_skin_tone": "🚶🏼",
+1913	    "person_walking_medium_skin_tone": "🚶🏽",
+1914	    "person_wearing_turban": "👳",
+1915	    "person_wearing_turban_dark_skin_tone": "👳🏿",
+1916	    "person_wearing_turban_light_skin_tone": "👳🏻",
+1917	    "person_wearing_turban_medium-dark_skin_tone": "👳🏾",
+1918	    "person_wearing_turban_medium-light_skin_tone": "👳🏼",
+1919	    "person_wearing_turban_medium_skin_tone": "👳🏽",
+1920	    "petri_dish": "🧫",
+1921	    "pick": "⛏",
+1922	    "pie": "🥧",
+1923	    "pig": "🐷",
+1924	    "pig_face": "🐷",
+1925	    "pig_nose": "🐽",
+1926	    "pile_of_poo": "💩",
+1927	    "pill": "💊",
+1928	    "pinching_hand": "🤏",
+1929	    "pine_decoration": "🎍",
+1930	    "pineapple": "🍍",
+1931	    "ping_pong": "🏓",
+1932	    "pirate_flag": "🏴\u200d☠️",
+1933	    "pistol": "🔫",
+1934	    "pizza": "🍕",
+1935	    "place_of_worship": "🛐",
+1936	    "play_button": "▶",
+1937	    "play_or_pause_button": "⏯",
+1938	    "pleading_face": "🥺",
+1939	    "police_car": "🚓",
+1940	    "police_car_light": "🚨",
+1941	    "police_officer": "👮",
+1942	    "police_officer_dark_skin_tone": "👮🏿",
+1943	    "police_officer_light_skin_tone": "👮🏻",
+1944	    "police_officer_medium-dark_skin_tone": "👮🏾",
+1945	    "police_officer_medium-light_skin_tone": "👮🏼",
+1946	    "police_officer_medium_skin_tone": "👮🏽",
+1947	    "poodle": "🐩",
+1948	    "pool_8_ball": "🎱",
+1949	    "popcorn": "🍿",
+1950	    "post_office": "🏣",
+1951	    "postal_horn": "📯",
+1952	    "postbox": "📮",
+1953	    "pot_of_food": "🍲",
+1954	    "potable_water": "🚰",
+1955	    "potato": "🥔",
+1956	    "poultry_leg": "🍗",
+1957	    "pound_banknote": "💷",
+1958	    "pouting_cat_face": "😾",
+1959	    "pouting_face": "😡",
+1960	    "prayer_beads": "📿",
+1961	    "pregnant_woman": "🤰",
+1962	    "pregnant_woman_dark_skin_tone": "🤰🏿",
+1963	    "pregnant_woman_light_skin_tone": "🤰🏻",
+1964	    "pregnant_woman_medium-dark_skin_tone": "🤰🏾",
+1965	    "pregnant_woman_medium-light_skin_tone": "🤰🏼",
+1966	    "pregnant_woman_medium_skin_tone": "🤰🏽",
+1967	    "pretzel": "🥨",
+1968	    "probing_cane": "🦯",
+1969	    "prince": "🤴",
+1970	    "prince_dark_skin_tone": "🤴🏿",
+1971	    "prince_light_skin_tone": "🤴🏻",
+1972	    "prince_medium-dark_skin_tone": "🤴🏾",
+1973	    "prince_medium-light_skin_tone": "🤴🏼",
+1974	    "prince_medium_skin_tone": "🤴🏽",
+1975	    "princess": "👸",
+1976	    "princess_dark_skin_tone": "👸🏿",
+1977	    "princess_light_skin_tone": "👸🏻",
+1978	    "princess_medium-dark_skin_tone": "👸🏾",
+1979	    "princess_medium-light_skin_tone": "👸🏼",
+1980	    "princess_medium_skin_tone": "👸🏽",
+1981	    "printer": "🖨",
+1982	    "prohibited": "🚫",
+1983	    "purple_circle": "🟣",
+1984	    "purple_heart": "💜",
+1985	    "purple_square": "🟪",
+1986	    "purse": "👛",
+1987	    "pushpin": "📌",
+1988	    "question_mark": "❓",
+1989	    "rabbit": "🐰",
+1990	    "rabbit_face": "🐰",
+1991	    "raccoon": "🦝",
+1992	    "racing_car": "🏎",
+1993	    "radio": "📻",
+1994	    "radio_button": "🔘",
+1995	    "radioactive": "☢",
+1996	    "railway_car": "🚃",
+1997	    "railway_track": "🛤",
+1998	    "rainbow": "🌈",
+1999	    "rainbow_flag": "🏳️\u200d🌈",
+2000	    "raised_back_of_hand": "🤚",
+2001	    "raised_back_of_hand_dark_skin_tone": "🤚🏿",
+2002	    "raised_back_of_hand_light_skin_tone": "🤚🏻",
+2003	    "raised_back_of_hand_medium-dark_skin_tone": "🤚🏾",
+2004	    "raised_back_of_hand_medium-light_skin_tone": "🤚🏼",
+2005	    "raised_back_of_hand_medium_skin_tone": "🤚🏽",
+2006	    "raised_fist": "✊",
+2007	    "raised_fist_dark_skin_tone": "✊🏿",
+2008	    "raised_fist_light_skin_tone": "✊🏻",
+2009	    "raised_fist_medium-dark_skin_tone": "✊🏾",
+2010	    "raised_fist_medium-light_skin_tone": "✊🏼",
+2011	    "raised_fist_medium_skin_tone": "✊🏽",
+2012	    "raised_hand": "✋",
+2013	    "raised_hand_dark_skin_tone": "✋🏿",
+2014	    "raised_hand_light_skin_tone": "✋🏻",
+2015	    "raised_hand_medium-dark_skin_tone": "✋🏾",
+2016	    "raised_hand_medium-light_skin_tone": "✋🏼",
+2017	    "raised_hand_medium_skin_tone": "✋🏽",
+2018	    "raising_hands": "🙌",
+2019	    "raising_hands_dark_skin_tone": "🙌🏿",
+2020	    "raising_hands_light_skin_tone": "🙌🏻",
+2021	    "raising_hands_medium-dark_skin_tone": "🙌🏾",
+2022	    "raising_hands_medium-light_skin_tone": "🙌🏼",
+2023	    "raising_hands_medium_skin_tone": "🙌🏽",
+2024	    "ram": "🐏",
+2025	    "rat": "🐀",
+2026	    "razor": "🪒",
+2027	    "ringed_planet": "🪐",
+2028	    "receipt": "🧾",
+2029	    "record_button": "⏺",
+2030	    "recycling_symbol": "♻",
+2031	    "red_apple": "🍎",
+2032	    "red_circle": "🔴",
+2033	    "red_envelope": "🧧",
+2034	    "red_hair": "🦰",
+2035	    "red-haired_man": "👨\u200d🦰",
+2036	    "red-haired_woman": "👩\u200d🦰",
+2037	    "red_heart": "❤",
+2038	    "red_paper_lantern": "🏮",
+2039	    "red_square": "🟥",
+2040	    "red_triangle_pointed_down": "🔻",
+2041	    "red_triangle_pointed_up": "🔺",
+2042	    "registered": "®",
+2043	    "relieved_face": "😌",
+2044	    "reminder_ribbon": "🎗",
+2045	    "repeat_button": "🔁",
+2046	    "repeat_single_button": "🔂",
+2047	    "rescue_worker’s_helmet": "⛑",
+2048	    "restroom": "🚻",
+2049	    "reverse_button": "◀",
+2050	    "revolving_hearts": "💞",
+2051	    "rhinoceros": "🦏",
+2052	    "ribbon": "🎀",
+2053	    "rice_ball": "🍙",
+2054	    "rice_cracker": "🍘",
+2055	    "right-facing_fist": "🤜",
+2056	    "right-facing_fist_dark_skin_tone": "🤜🏿",
+2057	    "right-facing_fist_light_skin_tone": "🤜🏻",
+2058	    "right-facing_fist_medium-dark_skin_tone": "🤜🏾",
+2059	    "right-facing_fist_medium-light_skin_tone": "🤜🏼",
+2060	    "right-facing_fist_medium_skin_tone": "🤜🏽",
+2061	    "right_anger_bubble": "🗯",
+2062	    "right_arrow": "➡",
+2063	    "right_arrow_curving_down": "⤵",
+2064	    "right_arrow_curving_left": "↩",
+2065	    "right_arrow_curving_up": "⤴",
+2066	    "ring": "💍",
+2067	    "roasted_sweet_potato": "🍠",
+2068	    "robot_face": "🤖",
+2069	    "rocket": "🚀",
+2070	    "roll_of_paper": "🧻",
+2071	    "rolled-up_newspaper": "🗞",
+2072	    "roller_coaster": "🎢",
+2073	    "rolling_on_the_floor_laughing": "🤣",
+2074	    "rooster": "🐓",
+2075	    "rose": "🌹",
+2076	    "rosette": "🏵",
+2077	    "round_pushpin": "📍",
+2078	    "rugby_football": "🏉",
+2079	    "running_shirt": "🎽",
+2080	    "running_shoe": "👟",
+2081	    "sad_but_relieved_face": "😥",
+2082	    "safety_pin": "🧷",
+2083	    "safety_vest": "🦺",
+2084	    "salt": "🧂",
+2085	    "sailboat": "⛵",
+2086	    "sake": "🍶",
+2087	    "sandwich": "🥪",
+2088	    "sari": "🥻",
+2089	    "satellite": "📡",
+2090	    "satellite_antenna": "📡",
+2091	    "sauropod": "🦕",
+2092	    "saxophone": "🎷",
+2093	    "scarf": "🧣",
+2094	    "school": "🏫",
+2095	    "school_backpack": "🎒",
+2096	    "scissors": "✂",
+2097	    "scorpion": "🦂",
+2098	    "scroll": "📜",
+2099	    "seat": "💺",
+2100	    "see-no-evil_monkey": "🙈",
+2101	    "seedling": "🌱",
+2102	    "selfie": "🤳",
+2103	    "selfie_dark_skin_tone": "🤳🏿",
+2104	    "selfie_light_skin_tone": "🤳🏻",
+2105	    "selfie_medium-dark_skin_tone": "🤳🏾",
+2106	    "selfie_medium-light_skin_tone": "🤳🏼",
+2107	    "selfie_medium_skin_tone": "🤳🏽",
+2108	    "service_dog": "🐕\u200d🦺",
+2109	    "seven-thirty": "🕢",
+2110	    "seven_o’clock": "🕖",
+2111	    "shallow_pan_of_food": "🥘",
+2112	    "shamrock": "☘",
+2113	    "shark": "🦈",
+2114	    "shaved_ice": "🍧",
+2115	    "sheaf_of_rice": "🌾",
+2116	    "shield": "🛡",
+2117	    "shinto_shrine": "⛩",
+2118	    "ship": "🚢",
+2119	    "shooting_star": "🌠",
+2120	    "shopping_bags": "🛍",
+2121	    "shopping_cart": "🛒",
+2122	    "shortcake": "🍰",
+2123	    "shorts": "🩳",
+2124	    "shower": "🚿",
+2125	    "shrimp": "🦐",
+2126	    "shuffle_tracks_button": "🔀",
+2127	    "shushing_face": "🤫",
+2128	    "sign_of_the_horns": "🤘",
+2129	    "sign_of_the_horns_dark_skin_tone": "🤘🏿",
+2130	    "sign_of_the_horns_light_skin_tone": "🤘🏻",
+2131	    "sign_of_the_horns_medium-dark_skin_tone": "🤘🏾",
+2132	    "sign_of_the_horns_medium-light_skin_tone": "🤘🏼",
+2133	    "sign_of_the_horns_medium_skin_tone": "🤘🏽",
+2134	    "six-thirty": "🕡",
+2135	    "six_o’clock": "🕕",
+2136	    "skateboard": "🛹",
+2137	    "skier": "⛷",
+2138	    "skis": "🎿",
+2139	    "skull": "💀",
+2140	    "skull_and_crossbones": "☠",
+2141	    "skunk": "🦨",
+2142	    "sled": "🛷",
+2143	    "sleeping_face": "😴",
+2144	    "sleepy_face": "😪",
+2145	    "slightly_frowning_face": "🙁",
+2146	    "slightly_smiling_face": "🙂",
+2147	    "slot_machine": "🎰",
+2148	    "sloth": "🦥",
+2149	    "small_airplane": "🛩",
+2150	    "small_blue_diamond": "🔹",
+2151	    "small_orange_diamond": "🔸",
+2152	    "smiling_cat_face_with_heart-eyes": "😻",
+2153	    "smiling_face": "☺",
+2154	    "smiling_face_with_halo": "😇",
+2155	    "smiling_face_with_3_hearts": "🥰",
+2156	    "smiling_face_with_heart-eyes": "😍",
+2157	    "smiling_face_with_horns": "😈",
+2158	    "smiling_face_with_smiling_eyes": "😊",
+2159	    "smiling_face_with_sunglasses": "😎",
+2160	    "smirking_face": "😏",
+2161	    "snail": "🐌",
+2162	    "snake": "🐍",
+2163	    "sneezing_face": "🤧",
+2164	    "snow-capped_mountain": "🏔",
+2165	    "snowboarder": "🏂",
+2166	    "snowboarder_dark_skin_tone": "🏂🏿",
+2167	    "snowboarder_light_skin_tone": "🏂🏻",
+2168	    "snowboarder_medium-dark_skin_tone": "🏂🏾",
+2169	    "snowboarder_medium-light_skin_tone": "🏂🏼",
+2170	    "snowboarder_medium_skin_tone": "🏂🏽",
+2171	    "snowflake": "❄",
+2172	    "snowman": "☃",
+2173	    "snowman_without_snow": "⛄",
+2174	    "soap": "🧼",
+2175	    "soccer_ball": "⚽",
+2176	    "socks": "🧦",
+2177	    "softball": "🥎",
+2178	    "soft_ice_cream": "🍦",
+2179	    "spade_suit": "♠",
+2180	    "spaghetti": "🍝",
+2181	    "sparkle": "❇",
+2182	    "sparkler": "🎇",
+2183	    "sparkles": "✨",
+2184	    "sparkling_heart": "💖",
+2185	    "speak-no-evil_monkey": "🙊",
+2186	    "speaker_high_volume": "🔊",
+2187	    "speaker_low_volume": "🔈",
+2188	    "speaker_medium_volume": "🔉",
+2189	    "speaking_head": "🗣",
+2190	    "speech_balloon": "💬",
+2191	    "speedboat": "🚤",
+2192	    "spider": "🕷",
+2193	    "spider_web": "🕸",
+2194	    "spiral_calendar": "🗓",
+2195	    "spiral_notepad": "🗒",
+2196	    "spiral_shell": "🐚",
+2197	    "spoon": "🥄",
+2198	    "sponge": "🧽",
+2199	    "sport_utility_vehicle": "🚙",
+2200	    "sports_medal": "🏅",
+2201	    "spouting_whale": "🐳",
+2202	    "squid": "🦑",
+2203	    "squinting_face_with_tongue": "😝",
+2204	    "stadium": "🏟",
+2205	    "star-struck": "🤩",
+2206	    "star_and_crescent": "☪",
+2207	    "star_of_david": "✡",
+2208	    "station": "🚉",
+2209	    "steaming_bowl": "🍜",
+2210	    "stethoscope": "🩺",
+2211	    "stop_button": "⏹",
+2212	    "stop_sign": "🛑",
+2213	    "stopwatch": "⏱",
+2214	    "straight_ruler": "📏",
+2215	    "strawberry": "🍓",
+2216	    "studio_microphone": "🎙",
+2217	    "stuffed_flatbread": "🥙",
+2218	    "sun": "☀",
+2219	    "sun_behind_cloud": "⛅",
+2220	    "sun_behind_large_cloud": "🌥",
+2221	    "sun_behind_rain_cloud": "🌦",
+2222	    "sun_behind_small_cloud": "🌤",
+2223	    "sun_with_face": "🌞",
+2224	    "sunflower": "🌻",
+2225	    "sunglasses": "😎",
+2226	    "sunrise": "🌅",
+2227	    "sunrise_over_mountains": "🌄",
+2228	    "sunset": "🌇",
+2229	    "superhero": "🦸",
+2230	    "supervillain": "🦹",
+2231	    "sushi": "🍣",
+2232	    "suspension_railway": "🚟",
+2233	    "swan": "🦢",
+2234	    "sweat_droplets": "💦",
+2235	    "synagogue": "🕍",
+2236	    "syringe": "💉",
+2237	    "t-shirt": "👕",
+2238	    "taco": "🌮",
+2239	    "takeout_box": "🥡",
+2240	    "tanabata_tree": "🎋",
+2241	    "tangerine": "🍊",
+2242	    "taxi": "🚕",
+2243	    "teacup_without_handle": "🍵",
+2244	    "tear-off_calendar": "📆",
+2245	    "teddy_bear": "🧸",
+2246	    "telephone": "☎",
+2247	    "telephone_receiver": "📞",
+2248	    "telescope": "🔭",
+2249	    "television": "📺",
+2250	    "ten-thirty": "🕥",
+2251	    "ten_o’clock": "🕙",
+2252	    "tennis": "🎾",
+2253	    "tent": "⛺",
+2254	    "test_tube": "🧪",
+2255	    "thermometer": "🌡",
+2256	    "thinking_face": "🤔",
+2257	    "thought_balloon": "💭",
+2258	    "thread": "🧵",
+2259	    "three-thirty": "🕞",
+2260	    "three_o’clock": "🕒",
+2261	    "thumbs_down": "👎",
+2262	    "thumbs_down_dark_skin_tone": "👎🏿",
+2263	    "thumbs_down_light_skin_tone": "👎🏻",
+2264	    "thumbs_down_medium-dark_skin_tone": "👎🏾",
+2265	    "thumbs_down_medium-light_skin_tone": "👎🏼",
+2266	    "thumbs_down_medium_skin_tone": "👎🏽",
+2267	    "thumbs_up": "👍",
+2268	    "thumbs_up_dark_skin_tone": "👍🏿",
+2269	    "thumbs_up_light_skin_tone": "👍🏻",
+2270	    "thumbs_up_medium-dark_skin_tone": "👍🏾",
+2271	    "thumbs_up_medium-light_skin_tone": "👍🏼",
+2272	    "thumbs_up_medium_skin_tone": "👍🏽",
+2273	    "ticket": "🎫",
+2274	    "tiger": "🐯",
+2275	    "tiger_face": "🐯",
+2276	    "timer_clock": "⏲",
+2277	    "tired_face": "😫",
+2278	    "toolbox": "🧰",
+2279	    "toilet": "🚽",
+2280	    "tomato": "🍅",
+2281	    "tongue": "👅",
+2282	    "tooth": "🦷",
+2283	    "top_hat": "🎩",
+2284	    "tornado": "🌪",
+2285	    "trackball": "🖲",
+2286	    "tractor": "🚜",
+2287	    "trade_mark": "™",
+2288	    "train": "🚋",
+2289	    "tram": "🚊",
+2290	    "tram_car": "🚋",
+2291	    "triangular_flag": "🚩",
+2292	    "triangular_ruler": "📐",
+2293	    "trident_emblem": "🔱",
+2294	    "trolleybus": "🚎",
+2295	    "trophy": "🏆",
+2296	    "tropical_drink": "🍹",
+2297	    "tropical_fish": "🐠",
+2298	    "trumpet": "🎺",
+2299	    "tulip": "🌷",
+2300	    "tumbler_glass": "🥃",
+2301	    "turtle": "🐢",
+2302	    "twelve-thirty": "🕧",
+2303	    "twelve_o’clock": "🕛",
+2304	    "two-hump_camel": "🐫",
+2305	    "two-thirty": "🕝",
+2306	    "two_hearts": "💕",
+2307	    "two_men_holding_hands": "👬",
+2308	    "two_o’clock": "🕑",
+2309	    "two_women_holding_hands": "👭",
+2310	    "umbrella": "☂",
+2311	    "umbrella_on_ground": "⛱",
+2312	    "umbrella_with_rain_drops": "☔",
+2313	    "unamused_face": "😒",
+2314	    "unicorn_face": "🦄",
+2315	    "unlocked": "🔓",
+2316	    "up-down_arrow": "↕",
+2317	    "up-left_arrow": "↖",
+2318	    "up-right_arrow": "↗",
+2319	    "up_arrow": "⬆",
+2320	    "upside-down_face": "🙃",
+2321	    "upwards_button": "🔼",
+2322	    "vampire": "🧛",
+2323	    "vampire_dark_skin_tone": "🧛🏿",
+2324	    "vampire_light_skin_tone": "🧛🏻",
+2325	    "vampire_medium-dark_skin_tone": "🧛🏾",
+2326	    "vampire_medium-light_skin_tone": "🧛🏼",
+2327	    "vampire_medium_skin_tone": "🧛🏽",
+2328	    "vertical_traffic_light": "🚦",
+2329	    "vibration_mode": "📳",
+2330	    "victory_hand": "✌",
+2331	    "victory_hand_dark_skin_tone": "✌🏿",
+2332	    "victory_hand_light_skin_tone": "✌🏻",
+2333	    "victory_hand_medium-dark_skin_tone": "✌🏾",
+2334	    "victory_hand_medium-light_skin_tone": "✌🏼",
+2335	    "victory_hand_medium_skin_tone": "✌🏽",
+2336	    "video_camera": "📹",
+2337	    "video_game": "🎮",
+2338	    "videocassette": "📼",
+2339	    "violin": "🎻",
+2340	    "volcano": "🌋",
+2341	    "volleyball": "🏐",
+2342	    "vulcan_salute": "🖖",
+2343	    "vulcan_salute_dark_skin_tone": "🖖🏿",
+2344	    "vulcan_salute_light_skin_tone": "🖖🏻",
+2345	    "vulcan_salute_medium-dark_skin_tone": "🖖🏾",
+2346	    "vulcan_salute_medium-light_skin_tone": "🖖🏼",
+2347	    "vulcan_salute_medium_skin_tone": "🖖🏽",
+2348	    "waffle": "🧇",
+2349	    "waning_crescent_moon": "🌘",
+2350	    "waning_gibbous_moon": "🌖",
+2351	    "warning": "⚠",
+2352	    "wastebasket": "🗑",
+2353	    "watch": "⌚",
+2354	    "water_buffalo": "🐃",
+2355	    "water_closet": "🚾",
+2356	    "water_wave": "🌊",
+2357	    "watermelon": "🍉",
+2358	    "waving_hand": "👋",
+2359	    "waving_hand_dark_skin_tone": "👋🏿",
+2360	    "waving_hand_light_skin_tone": "👋🏻",
+2361	    "waving_hand_medium-dark_skin_tone": "👋🏾",
+2362	    "waving_hand_medium-light_skin_tone": "👋🏼",
+2363	    "waving_hand_medium_skin_tone": "👋🏽",
+2364	    "wavy_dash": "〰",
+2365	    "waxing_crescent_moon": "🌒",
+2366	    "waxing_gibbous_moon": "🌔",
+2367	    "weary_cat_face": "🙀",
+2368	    "weary_face": "😩",
+2369	    "wedding": "💒",
+2370	    "whale": "🐳",
+2371	    "wheel_of_dharma": "☸",
+2372	    "wheelchair_symbol": "♿",
+2373	    "white_circle": "⚪",
+2374	    "white_exclamation_mark": "❕",
+2375	    "white_flag": "🏳",
+2376	    "white_flower": "💮",
+2377	    "white_hair": "🦳",
+2378	    "white-haired_man": "👨\u200d🦳",
+2379	    "white-haired_woman": "👩\u200d🦳",
+2380	    "white_heart": "🤍",
+2381	    "white_heavy_check_mark": "✅",
+2382	    "white_large_square": "⬜",
+2383	    "white_medium-small_square": "◽",
+2384	    "white_medium_square": "◻",
+2385	    "white_medium_star": "⭐",
+2386	    "white_question_mark": "❔",
+2387	    "white_small_square": "▫",
+2388	    "white_square_button": "🔳",
+2389	    "wilted_flower": "🥀",
+2390	    "wind_chime": "🎐",
+2391	    "wind_face": "🌬",
+2392	    "wine_glass": "🍷",
+2393	    "winking_face": "😉",
+2394	    "winking_face_with_tongue": "😜",
+2395	    "wolf_face": "🐺",
+2396	    "woman": "👩",
+2397	    "woman_artist": "👩\u200d🎨",
+2398	    "woman_artist_dark_skin_tone": "👩🏿\u200d🎨",
+2399	    "woman_artist_light_skin_tone": "👩🏻\u200d🎨",
+2400	    "woman_artist_medium-dark_skin_tone": "👩🏾\u200d🎨",
+2401	    "woman_artist_medium-light_skin_tone": "👩🏼\u200d🎨",
+2402	    "woman_artist_medium_skin_tone": "👩🏽\u200d🎨",
+2403	    "woman_astronaut": "👩\u200d🚀",
+2404	    "woman_astronaut_dark_skin_tone": "👩🏿\u200d🚀",
+2405	    "woman_astronaut_light_skin_tone": "👩🏻\u200d🚀",
+2406	    "woman_astronaut_medium-dark_skin_tone": "👩🏾\u200d🚀",
+2407	    "woman_astronaut_medium-light_skin_tone": "👩🏼\u200d🚀",
+2408	    "woman_astronaut_medium_skin_tone": "👩🏽\u200d🚀",
+2409	    "woman_biking": "🚴\u200d♀️",
+2410	    "woman_biking_dark_skin_tone": "🚴🏿\u200d♀️",
+2411	    "woman_biking_light_skin_tone": "🚴🏻\u200d♀️",
+2412	    "woman_biking_medium-dark_skin_tone": "🚴🏾\u200d♀️",
+2413	    "woman_biking_medium-light_skin_tone": "🚴🏼\u200d♀️",
+2414	    "woman_biking_medium_skin_tone": "🚴🏽\u200d♀️",
+2415	    "woman_bouncing_ball": "⛹️\u200d♀️",
+2416	    "woman_bouncing_ball_dark_skin_tone": "⛹🏿\u200d♀️",
+2417	    "woman_bouncing_ball_light_skin_tone": "⛹🏻\u200d♀️",
+2418	    "woman_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♀️",
+2419	    "woman_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♀️",
+2420	    "woman_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♀️",
+2421	    "woman_bowing": "🙇\u200d♀️",
+2422	    "woman_bowing_dark_skin_tone": "🙇🏿\u200d♀️",
+2423	    "woman_bowing_light_skin_tone": "🙇🏻\u200d♀️",
+2424	    "woman_bowing_medium-dark_skin_tone": "🙇🏾\u200d♀️",
+2425	    "woman_bowing_medium-light_skin_tone": "🙇🏼\u200d♀️",
+2426	    "woman_bowing_medium_skin_tone": "🙇🏽\u200d♀️",
+2427	    "woman_cartwheeling": "🤸\u200d♀️",
+2428	    "woman_cartwheeling_dark_skin_tone": "🤸🏿\u200d♀️",
+2429	    "woman_cartwheeling_light_skin_tone": "🤸🏻\u200d♀️",
+2430	    "woman_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♀️",
+2431	    "woman_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♀️",
+2432	    "woman_cartwheeling_medium_skin_tone": "🤸🏽\u200d♀️",
+2433	    "woman_climbing": "🧗\u200d♀️",
+2434	    "woman_climbing_dark_skin_tone": "🧗🏿\u200d♀️",
+2435	    "woman_climbing_light_skin_tone": "🧗🏻\u200d♀️",
+2436	    "woman_climbing_medium-dark_skin_tone": "🧗🏾\u200d♀️",
+2437	    "woman_climbing_medium-light_skin_tone": "🧗🏼\u200d♀️",
+2438	    "woman_climbing_medium_skin_tone": "🧗🏽\u200d♀️",
+2439	    "woman_construction_worker": "👷\u200d♀️",
+2440	    "woman_construction_worker_dark_skin_tone": "👷🏿\u200d♀️",
+2441	    "woman_construction_worker_light_skin_tone": "👷🏻\u200d♀️",
+2442	    "woman_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♀️",
+2443	    "woman_construction_worker_medium-light_skin_tone": "👷🏼\u200d♀️",
+2444	    "woman_construction_worker_medium_skin_tone": "👷🏽\u200d♀️",
+2445	    "woman_cook": "👩\u200d🍳",
+2446	    "woman_cook_dark_skin_tone": "👩🏿\u200d🍳",
+2447	    "woman_cook_light_skin_tone": "👩🏻\u200d🍳",
+2448	    "woman_cook_medium-dark_skin_tone": "👩🏾\u200d🍳",
+2449	    "woman_cook_medium-light_skin_tone": "👩🏼\u200d🍳",
+2450	    "woman_cook_medium_skin_tone": "👩🏽\u200d🍳",
+2451	    "woman_dancing": "💃",
+2452	    "woman_dancing_dark_skin_tone": "💃🏿",
+2453	    "woman_dancing_light_skin_tone": "💃🏻",
+2454	    "woman_dancing_medium-dark_skin_tone": "💃🏾",
+2455	    "woman_dancing_medium-light_skin_tone": "💃🏼",
+2456	    "woman_dancing_medium_skin_tone": "💃🏽",
+2457	    "woman_dark_skin_tone": "👩🏿",
+2458	    "woman_detective": "🕵️\u200d♀️",
+2459	    "woman_detective_dark_skin_tone": "🕵🏿\u200d♀️",
+2460	    "woman_detective_light_skin_tone": "🕵🏻\u200d♀️",
+2461	    "woman_detective_medium-dark_skin_tone": "🕵🏾\u200d♀️",
+2462	    "woman_detective_medium-light_skin_tone": "🕵🏼\u200d♀️",
+2463	    "woman_detective_medium_skin_tone": "🕵🏽\u200d♀️",
+2464	    "woman_elf": "🧝\u200d♀️",
+2465	    "woman_elf_dark_skin_tone": "🧝🏿\u200d♀️",
+2466	    "woman_elf_light_skin_tone": "🧝🏻\u200d♀️",
+2467	    "woman_elf_medium-dark_skin_tone": "🧝🏾\u200d♀️",
+2468	    "woman_elf_medium-light_skin_tone": "🧝🏼\u200d♀️",
+2469	    "woman_elf_medium_skin_tone": "🧝🏽\u200d♀️",
+2470	    "woman_facepalming": "🤦\u200d♀️",
+2471	    "woman_facepalming_dark_skin_tone": "🤦🏿\u200d♀️",
+2472	    "woman_facepalming_light_skin_tone": "🤦🏻\u200d♀️",
+2473	    "woman_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♀️",
+2474	    "woman_facepalming_medium-light_skin_tone": "🤦🏼\u200d♀️",
+2475	    "woman_facepalming_medium_skin_tone": "🤦🏽\u200d♀️",
+2476	    "woman_factory_worker": "👩\u200d🏭",
+2477	    "woman_factory_worker_dark_skin_tone": "👩🏿\u200d🏭",
+2478	    "woman_factory_worker_light_skin_tone": "👩🏻\u200d🏭",
+2479	    "woman_factory_worker_medium-dark_skin_tone": "👩🏾\u200d🏭",
+2480	    "woman_factory_worker_medium-light_skin_tone": "👩🏼\u200d🏭",
+2481	    "woman_factory_worker_medium_skin_tone": "👩🏽\u200d🏭",
+2482	    "woman_fairy": "🧚\u200d♀️",
+2483	    "woman_fairy_dark_skin_tone": "🧚🏿\u200d♀️",
+2484	    "woman_fairy_light_skin_tone": "🧚🏻\u200d♀️",
+2485	    "woman_fairy_medium-dark_skin_tone": "🧚🏾\u200d♀️",
+2486	    "woman_fairy_medium-light_skin_tone": "🧚🏼\u200d♀️",
+2487	    "woman_fairy_medium_skin_tone": "🧚🏽\u200d♀️",
+2488	    "woman_farmer": "👩\u200d🌾",
+2489	    "woman_farmer_dark_skin_tone": "👩🏿\u200d🌾",
+2490	    "woman_farmer_light_skin_tone": "👩🏻\u200d🌾",
+2491	    "woman_farmer_medium-dark_skin_tone": "👩🏾\u200d🌾",
+2492	    "woman_farmer_medium-light_skin_tone": "👩🏼\u200d🌾",
+2493	    "woman_farmer_medium_skin_tone": "👩🏽\u200d🌾",
+2494	    "woman_firefighter": "👩\u200d🚒",
+2495	    "woman_firefighter_dark_skin_tone": "👩🏿\u200d🚒",
+2496	    "woman_firefighter_light_skin_tone": "👩🏻\u200d🚒",
+2497	    "woman_firefighter_medium-dark_skin_tone": "👩🏾\u200d🚒",
+2498	    "woman_firefighter_medium-light_skin_tone": "👩🏼\u200d🚒",
+2499	    "woman_firefighter_medium_skin_tone": "👩🏽\u200d🚒",
+2500	    "woman_frowning": "🙍\u200d♀️",
+2501	    "woman_frowning_dark_skin_tone": "🙍🏿\u200d♀️",
+2502	    "woman_frowning_light_skin_tone": "🙍🏻\u200d♀️",
+2503	    "woman_frowning_medium-dark_skin_tone": "🙍🏾\u200d♀️",
+2504	    "woman_frowning_medium-light_skin_tone": "🙍🏼\u200d♀️",
+2505	    "woman_frowning_medium_skin_tone": "🙍🏽\u200d♀️",
+2506	    "woman_genie": "🧞\u200d♀️",
+2507	    "woman_gesturing_no": "🙅\u200d♀️",
+2508	    "woman_gesturing_no_dark_skin_tone": "🙅🏿\u200d♀️",
+2509	    "woman_gesturing_no_light_skin_tone": "🙅🏻\u200d♀️",
+2510	    "woman_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♀️",
+2511	    "woman_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♀️",
+2512	    "woman_gesturing_no_medium_skin_tone": "🙅🏽\u200d♀️",
+2513	    "woman_gesturing_ok": "🙆\u200d♀️",
+2514	    "woman_gesturing_ok_dark_skin_tone": "🙆🏿\u200d♀️",
+2515	    "woman_gesturing_ok_light_skin_tone": "🙆🏻\u200d♀️",
+2516	    "woman_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♀️",
+2517	    "woman_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♀️",
+2518	    "woman_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♀️",
+2519	    "woman_getting_haircut": "💇\u200d♀️",
+2520	    "woman_getting_haircut_dark_skin_tone": "💇🏿\u200d♀️",
+2521	    "woman_getting_haircut_light_skin_tone": "💇🏻\u200d♀️",
+2522	    "woman_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♀️",
+2523	    "woman_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♀️",
+2524	    "woman_getting_haircut_medium_skin_tone": "💇🏽\u200d♀️",
+2525	    "woman_getting_massage": "💆\u200d♀️",
+2526	    "woman_getting_massage_dark_skin_tone": "💆🏿\u200d♀️",
+2527	    "woman_getting_massage_light_skin_tone": "💆🏻\u200d♀️",
+2528	    "woman_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♀️",
+2529	    "woman_getting_massage_medium-light_skin_tone": "💆🏼\u200d♀️",
+2530	    "woman_getting_massage_medium_skin_tone": "💆🏽\u200d♀️",
+2531	    "woman_golfing": "🏌️\u200d♀️",
+2532	    "woman_golfing_dark_skin_tone": "🏌🏿\u200d♀️",
+2533	    "woman_golfing_light_skin_tone": "🏌🏻\u200d♀️",
+2534	    "woman_golfing_medium-dark_skin_tone": "🏌🏾\u200d♀️",
+2535	    "woman_golfing_medium-light_skin_tone": "🏌🏼\u200d♀️",
+2536	    "woman_golfing_medium_skin_tone": "🏌🏽\u200d♀️",
+2537	    "woman_guard": "💂\u200d♀️",
+2538	    "woman_guard_dark_skin_tone": "💂🏿\u200d♀️",
+2539	    "woman_guard_light_skin_tone": "💂🏻\u200d♀️",
+2540	    "woman_guard_medium-dark_skin_tone": "💂🏾\u200d♀️",
+2541	    "woman_guard_medium-light_skin_tone": "💂🏼\u200d♀️",
+2542	    "woman_guard_medium_skin_tone": "💂🏽\u200d♀️",
+2543	    "woman_health_worker": "👩\u200d⚕️",
+2544	    "woman_health_worker_dark_skin_tone": "👩🏿\u200d⚕️",
+2545	    "woman_health_worker_light_skin_tone": "👩🏻\u200d⚕️",
+2546	    "woman_health_worker_medium-dark_skin_tone": "👩🏾\u200d⚕️",
+2547	    "woman_health_worker_medium-light_skin_tone": "👩🏼\u200d⚕️",
+2548	    "woman_health_worker_medium_skin_tone": "👩🏽\u200d⚕️",
+2549	    "woman_in_lotus_position": "🧘\u200d♀️",
+2550	    "woman_in_lotus_position_dark_skin_tone": "🧘🏿\u200d♀️",
+2551	    "woman_in_lotus_position_light_skin_tone": "🧘🏻\u200d♀️",
+2552	    "woman_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♀️",
+2553	    "woman_in_lotus_position_medium-light_skin_tone": "🧘🏼\u200d♀️",
+2554	    "woman_in_lotus_position_medium_skin_tone": "🧘🏽\u200d♀️",
+2555	    "woman_in_manual_wheelchair": "👩\u200d🦽",
+2556	    "woman_in_motorized_wheelchair": "👩\u200d🦼",
+2557	    "woman_in_steamy_room": "🧖\u200d♀️",
+2558	    "woman_in_steamy_room_dark_skin_tone": "🧖🏿\u200d♀️",
+2559	    "woman_in_steamy_room_light_skin_tone": "🧖🏻\u200d♀️",
+2560	    "woman_in_steamy_room_medium-dark_skin_tone": "🧖🏾\u200d♀️",
+2561	    "woman_in_steamy_room_medium-light_skin_tone": "🧖🏼\u200d♀️",
+2562	    "woman_in_steamy_room_medium_skin_tone": "🧖🏽\u200d♀️",
+2563	    "woman_judge": "👩\u200d⚖️",
+2564	    "woman_judge_dark_skin_tone": "👩🏿\u200d⚖️",
+2565	    "woman_judge_light_skin_tone": "👩🏻\u200d⚖️",
+2566	    "woman_judge_medium-dark_skin_tone": "👩🏾\u200d⚖️",
+2567	    "woman_judge_medium-light_skin_tone": "👩🏼\u200d⚖️",
+2568	    "woman_judge_medium_skin_tone": "👩🏽\u200d⚖️",
+2569	    "woman_juggling": "🤹\u200d♀️",
+2570	    "woman_juggling_dark_skin_tone": "🤹🏿\u200d♀️",
+2571	    "woman_juggling_light_skin_tone": "🤹🏻\u200d♀️",
+2572	    "woman_juggling_medium-dark_skin_tone": "🤹🏾\u200d♀️",
+2573	    "woman_juggling_medium-light_skin_tone": "🤹🏼\u200d♀️",
+2574	    "woman_juggling_medium_skin_tone": "🤹🏽\u200d♀️",
+2575	    "woman_lifting_weights": "🏋️\u200d♀️",
+2576	    "woman_lifting_weights_dark_skin_tone": "🏋🏿\u200d♀️",
+2577	    "woman_lifting_weights_light_skin_tone": "🏋🏻\u200d♀️",
+2578	    "woman_lifting_weights_medium-dark_skin_tone": "🏋🏾\u200d♀️",
+2579	    "woman_lifting_weights_medium-light_skin_tone": "🏋🏼\u200d♀️",
+2580	    "woman_lifting_weights_medium_skin_tone": "🏋🏽\u200d♀️",
+2581	    "woman_light_skin_tone": "👩🏻",
+2582	    "woman_mage": "🧙\u200d♀️",
+2583	    "woman_mage_dark_skin_tone": "🧙🏿\u200d♀️",
+2584	    "woman_mage_light_skin_tone": "🧙🏻\u200d♀️",
+2585	    "woman_mage_medium-dark_skin_tone": "🧙🏾\u200d♀️",
+2586	    "woman_mage_medium-light_skin_tone": "🧙🏼\u200d♀️",
+2587	    "woman_mage_medium_skin_tone": "🧙🏽\u200d♀️",
+2588	    "woman_mechanic": "👩\u200d🔧",
+2589	    "woman_mechanic_dark_skin_tone": "👩🏿\u200d🔧",
+2590	    "woman_mechanic_light_skin_tone": "👩🏻\u200d🔧",
+2591	    "woman_mechanic_medium-dark_skin_tone": "👩🏾\u200d🔧",
+2592	    "woman_mechanic_medium-light_skin_tone": "👩🏼\u200d🔧",
+2593	    "woman_mechanic_medium_skin_tone": "👩🏽\u200d🔧",
+2594	    "woman_medium-dark_skin_tone": "👩🏾",
+2595	    "woman_medium-light_skin_tone": "👩🏼",
+2596	    "woman_medium_skin_tone": "👩🏽",
+2597	    "woman_mountain_biking": "🚵\u200d♀️",
+2598	    "woman_mountain_biking_dark_skin_tone": "🚵🏿\u200d♀️",
+2599	    "woman_mountain_biking_light_skin_tone": "🚵🏻\u200d♀️",
+2600	    "woman_mountain_biking_medium-dark_skin_tone": "🚵🏾\u200d♀️",
+2601	    "woman_mountain_biking_medium-light_skin_tone": "🚵🏼\u200d♀️",
+2602	    "woman_mountain_biking_medium_skin_tone": "🚵🏽\u200d♀️",
+2603	    "woman_office_worker": "👩\u200d💼",
+2604	    "woman_office_worker_dark_skin_tone": "👩🏿\u200d💼",
+2605	    "woman_office_worker_light_skin_tone": "👩🏻\u200d💼",
+2606	    "woman_office_worker_medium-dark_skin_tone": "👩🏾\u200d💼",
+2607	    "woman_office_worker_medium-light_skin_tone": "👩🏼\u200d💼",
+2608	    "woman_office_worker_medium_skin_tone": "👩🏽\u200d💼",
+2609	    "woman_pilot": "👩\u200d✈️",
+2610	    "woman_pilot_dark_skin_tone": "👩🏿\u200d✈️",
+2611	    "woman_pilot_light_skin_tone": "👩🏻\u200d✈️",
+2612	    "woman_pilot_medium-dark_skin_tone": "👩🏾\u200d✈️",
+2613	    "woman_pilot_medium-light_skin_tone": "👩🏼\u200d✈️",
+2614	    "woman_pilot_medium_skin_tone": "👩🏽\u200d✈️",
+2615	    "woman_playing_handball": "🤾\u200d♀️",
+2616	    "woman_playing_handball_dark_skin_tone": "🤾🏿\u200d♀️",
+2617	    "woman_playing_handball_light_skin_tone": "🤾🏻\u200d♀️",
+2618	    "woman_playing_handball_medium-dark_skin_tone": "🤾🏾\u200d♀️",
+2619	    "woman_playing_handball_medium-light_skin_tone": "🤾🏼\u200d♀️",
+2620	    "woman_playing_handball_medium_skin_tone": "🤾🏽\u200d♀️",
+2621	    "woman_playing_water_polo": "🤽\u200d♀️",
+2622	    "woman_playing_water_polo_dark_skin_tone": "🤽🏿\u200d♀️",
+2623	    "woman_playing_water_polo_light_skin_tone": "🤽🏻\u200d♀️",
+2624	    "woman_playing_water_polo_medium-dark_skin_tone": "🤽🏾\u200d♀️",
+2625	    "woman_playing_water_polo_medium-light_skin_tone": "🤽🏼\u200d♀️",
+2626	    "woman_playing_water_polo_medium_skin_tone": "🤽🏽\u200d♀️",
+2627	    "woman_police_officer": "👮\u200d♀️",
+2628	    "woman_police_officer_dark_skin_tone": "👮🏿\u200d♀️",
+2629	    "woman_police_officer_light_skin_tone": "👮🏻\u200d♀️",
+2630	    "woman_police_officer_medium-dark_skin_tone": "👮🏾\u200d♀️",
+2631	    "woman_police_officer_medium-light_skin_tone": "👮🏼\u200d♀️",
+2632	    "woman_police_officer_medium_skin_tone": "👮🏽\u200d♀️",
+2633	    "woman_pouting": "🙎\u200d♀️",
+2634	    "woman_pouting_dark_skin_tone": "🙎🏿\u200d♀️",
+2635	    "woman_pouting_light_skin_tone": "🙎🏻\u200d♀️",
+2636	    "woman_pouting_medium-dark_skin_tone": "🙎🏾\u200d♀️",
+2637	    "woman_pouting_medium-light_skin_tone": "🙎🏼\u200d♀️",
+2638	    "woman_pouting_medium_skin_tone": "🙎🏽\u200d♀️",
+2639	    "woman_raising_hand": "🙋\u200d♀️",
+2640	    "woman_raising_hand_dark_skin_tone": "🙋🏿\u200d♀️",
+2641	    "woman_raising_hand_light_skin_tone": "🙋🏻\u200d♀️",
+2642	    "woman_raising_hand_medium-dark_skin_tone": "🙋🏾\u200d♀️",
+2643	    "woman_raising_hand_medium-light_skin_tone": "🙋🏼\u200d♀️",
+2644	    "woman_raising_hand_medium_skin_tone": "🙋🏽\u200d♀️",
+2645	    "woman_rowing_boat": "🚣\u200d♀️",
+2646	    "woman_rowing_boat_dark_skin_tone": "🚣🏿\u200d♀️",
+2647	    "woman_rowing_boat_light_skin_tone": "🚣🏻\u200d♀️",
+2648	    "woman_rowing_boat_medium-dark_skin_tone": "🚣🏾\u200d♀️",
+2649	    "woman_rowing_boat_medium-light_skin_tone": "🚣🏼\u200d♀️",
+2650	    "woman_rowing_boat_medium_skin_tone": "🚣🏽\u200d♀️",
+2651	    "woman_running": "🏃\u200d♀️",
+2652	    "woman_running_dark_skin_tone": "🏃🏿\u200d♀️",
+2653	    "woman_running_light_skin_tone": "🏃🏻\u200d♀️",
+2654	    "woman_running_medium-dark_skin_tone": "🏃🏾\u200d♀️",
+2655	    "woman_running_medium-light_skin_tone": "🏃🏼\u200d♀️",
+2656	    "woman_running_medium_skin_tone": "🏃🏽\u200d♀️",
+2657	    "woman_scientist": "👩\u200d🔬",
+2658	    "woman_scientist_dark_skin_tone": "👩🏿\u200d🔬",
+2659	    "woman_scientist_light_skin_tone": "👩🏻\u200d🔬",
+2660	    "woman_scientist_medium-dark_skin_tone": "👩🏾\u200d🔬",
+2661	    "woman_scientist_medium-light_skin_tone": "👩🏼\u200d🔬",
+2662	    "woman_scientist_medium_skin_tone": "👩🏽\u200d🔬",
+2663	    "woman_shrugging": "🤷\u200d♀️",
+2664	    "woman_shrugging_dark_skin_tone": "🤷🏿\u200d♀️",
+2665	    "woman_shrugging_light_skin_tone": "🤷🏻\u200d♀️",
+2666	    "woman_shrugging_medium-dark_skin_tone": "🤷🏾\u200d♀️",
+2667	    "woman_shrugging_medium-light_skin_tone": "🤷🏼\u200d♀️",
+2668	    "woman_shrugging_medium_skin_tone": "🤷🏽\u200d♀️",
+2669	    "woman_singer": "👩\u200d🎤",
+2670	    "woman_singer_dark_skin_tone": "👩🏿\u200d🎤",
+2671	    "woman_singer_light_skin_tone": "👩🏻\u200d🎤",
+2672	    "woman_singer_medium-dark_skin_tone": "👩🏾\u200d🎤",
+2673	    "woman_singer_medium-light_skin_tone": "👩🏼\u200d🎤",
+2674	    "woman_singer_medium_skin_tone": "👩🏽\u200d🎤",
+2675	    "woman_student": "👩\u200d🎓",
+2676	    "woman_student_dark_skin_tone": "👩🏿\u200d🎓",
+2677	    "woman_student_light_skin_tone": "👩🏻\u200d🎓",
+2678	    "woman_student_medium-dark_skin_tone": "👩🏾\u200d🎓",
+2679	    "woman_student_medium-light_skin_tone": "👩🏼\u200d🎓",
+2680	    "woman_student_medium_skin_tone": "👩🏽\u200d🎓",
+2681	    "woman_surfing": "🏄\u200d♀️",
+2682	    "woman_surfing_dark_skin_tone": "🏄🏿\u200d♀️",
+2683	    "woman_surfing_light_skin_tone": "🏄🏻\u200d♀️",
+2684	    "woman_surfing_medium-dark_skin_tone": "🏄🏾\u200d♀️",
+2685	    "woman_surfing_medium-light_skin_tone": "🏄🏼\u200d♀️",
+2686	    "woman_surfing_medium_skin_tone": "🏄🏽\u200d♀️",
+2687	    "woman_swimming": "🏊\u200d♀️",
+2688	    "woman_swimming_dark_skin_tone": "🏊🏿\u200d♀️",
+2689	    "woman_swimming_light_skin_tone": "🏊🏻\u200d♀️",
+2690	    "woman_swimming_medium-dark_skin_tone": "🏊🏾\u200d♀️",
+2691	    "woman_swimming_medium-light_skin_tone": "🏊🏼\u200d♀️",
+2692	    "woman_swimming_medium_skin_tone": "🏊🏽\u200d♀️",
+2693	    "woman_teacher": "👩\u200d🏫",
+2694	    "woman_teacher_dark_skin_tone": "👩🏿\u200d🏫",
+2695	    "woman_teacher_light_skin_tone": "👩🏻\u200d🏫",
+2696	    "woman_teacher_medium-dark_skin_tone": "👩🏾\u200d🏫",
+2697	    "woman_teacher_medium-light_skin_tone": "👩🏼\u200d🏫",
+2698	    "woman_teacher_medium_skin_tone": "👩🏽\u200d🏫",
+2699	    "woman_technologist": "👩\u200d💻",
+2700	    "woman_technologist_dark_skin_tone": "👩🏿\u200d💻",
+2701	    "woman_technologist_light_skin_tone": "👩🏻\u200d💻",
+2702	    "woman_technologist_medium-dark_skin_tone": "👩🏾\u200d💻",
+2703	    "woman_technologist_medium-light_skin_tone": "👩🏼\u200d💻",
+2704	    "woman_technologist_medium_skin_tone": "👩🏽\u200d💻",
+2705	    "woman_tipping_hand": "💁\u200d♀️",
+2706	    "woman_tipping_hand_dark_skin_tone": "💁🏿\u200d♀️",
+2707	    "woman_tipping_hand_light_skin_tone": "💁🏻\u200d♀️",
+2708	    "woman_tipping_hand_medium-dark_skin_tone": "💁🏾\u200d♀️",
+2709	    "woman_tipping_hand_medium-light_skin_tone": "💁🏼\u200d♀️",
+2710	    "woman_tipping_hand_medium_skin_tone": "💁🏽\u200d♀️",
+2711	    "woman_vampire": "🧛\u200d♀️",
+2712	    "woman_vampire_dark_skin_tone": "🧛🏿\u200d♀️",
+2713	    "woman_vampire_light_skin_tone": "🧛🏻\u200d♀️",
+2714	    "woman_vampire_medium-dark_skin_tone": "🧛🏾\u200d♀️",
+2715	    "woman_vampire_medium-light_skin_tone": "🧛🏼\u200d♀️",
+2716	    "woman_vampire_medium_skin_tone": "🧛🏽\u200d♀️",
+2717	    "woman_walking": "🚶\u200d♀️",
+2718	    "woman_walking_dark_skin_tone": "🚶🏿\u200d♀️",
+2719	    "woman_walking_light_skin_tone": "🚶🏻\u200d♀️",
+2720	    "woman_walking_medium-dark_skin_tone": "🚶🏾\u200d♀️",
+2721	    "woman_walking_medium-light_skin_tone": "🚶🏼\u200d♀️",
+2722	    "woman_walking_medium_skin_tone": "🚶🏽\u200d♀️",
+2723	    "woman_wearing_turban": "👳\u200d♀️",
+2724	    "woman_wearing_turban_dark_skin_tone": "👳🏿\u200d♀️",
+2725	    "woman_wearing_turban_light_skin_tone": "👳🏻\u200d♀️",
+2726	    "woman_wearing_turban_medium-dark_skin_tone": "👳🏾\u200d♀️",
+2727	    "woman_wearing_turban_medium-light_skin_tone": "👳🏼\u200d♀️",
+2728	    "woman_wearing_turban_medium_skin_tone": "👳🏽\u200d♀️",
+2729	    "woman_with_headscarf": "🧕",
+2730	    "woman_with_headscarf_dark_skin_tone": "🧕🏿",
+2731	    "woman_with_headscarf_light_skin_tone": "🧕🏻",
+2732	    "woman_with_headscarf_medium-dark_skin_tone": "🧕🏾",
+2733	    "woman_with_headscarf_medium-light_skin_tone": "🧕🏼",
+2734	    "woman_with_headscarf_medium_skin_tone": "🧕🏽",
+2735	    "woman_with_probing_cane": "👩\u200d🦯",
+2736	    "woman_zombie": "🧟\u200d♀️",
+2737	    "woman’s_boot": "👢",
+2738	    "woman’s_clothes": "👚",
+2739	    "woman’s_hat": "👒",
+2740	    "woman’s_sandal": "👡",
+2741	    "women_with_bunny_ears": "👯\u200d♀️",
+2742	    "women_wrestling": "🤼\u200d♀️",
+2743	    "women’s_room": "🚺",
+2744	    "woozy_face": "🥴",
+2745	    "world_map": "🗺",
+2746	    "worried_face": "😟",
+2747	    "wrapped_gift": "🎁",
+2748	    "wrench": "🔧",
+2749	    "writing_hand": "✍",
+2750	    "writing_hand_dark_skin_tone": "✍🏿",
+2751	    "writing_hand_light_skin_tone": "✍🏻",
+2752	    "writing_hand_medium-dark_skin_tone": "✍🏾",
+2753	    "writing_hand_medium-light_skin_tone": "✍🏼",
+2754	    "writing_hand_medium_skin_tone": "✍🏽",
+2755	    "yarn": "🧶",
+2756	    "yawning_face": "🥱",
+2757	    "yellow_circle": "🟡",
+2758	    "yellow_heart": "💛",
+2759	    "yellow_square": "🟨",
+2760	    "yen_banknote": "💴",
+2761	    "yo-yo": "🪀",
+2762	    "yin_yang": "☯",
+2763	    "zany_face": "🤪",
+2764	    "zebra": "🦓",
+2765	    "zipper-mouth_face": "🤐",
+2766	    "zombie": "🧟",
+2767	    "zzz": "💤",
+2768	    "åland_islands": "🇦🇽",
+2769	    "keycap_asterisk": "*⃣",
+2770	    "keycap_digit_eight": "8⃣",
+2771	    "keycap_digit_five": "5⃣",
+2772	    "keycap_digit_four": "4⃣",
+2773	    "keycap_digit_nine": "9⃣",
+2774	    "keycap_digit_one": "1⃣",
+2775	    "keycap_digit_seven": "7⃣",
+2776	    "keycap_digit_six": "6⃣",
+2777	    "keycap_digit_three": "3⃣",
+2778	    "keycap_digit_two": "2⃣",
+2779	    "keycap_digit_zero": "0⃣",
+2780	    "keycap_number_sign": "#⃣",
+2781	    "light_skin_tone": "🏻",
+2782	    "medium_light_skin_tone": "🏼",
+2783	    "medium_skin_tone": "🏽",
+2784	    "medium_dark_skin_tone": "🏾",
+2785	    "dark_skin_tone": "🏿",
+2786	    "regional_indicator_symbol_letter_a": "🇦",
+2787	    "regional_indicator_symbol_letter_b": "🇧",
+2788	    "regional_indicator_symbol_letter_c": "🇨",
+2789	    "regional_indicator_symbol_letter_d": "🇩",
+2790	    "regional_indicator_symbol_letter_e": "🇪",
+2791	    "regional_indicator_symbol_letter_f": "🇫",
+2792	    "regional_indicator_symbol_letter_g": "🇬",
+2793	    "regional_indicator_symbol_letter_h": "🇭",
+2794	    "regional_indicator_symbol_letter_i": "🇮",
+2795	    "regional_indicator_symbol_letter_j": "🇯",
+2796	    "regional_indicator_symbol_letter_k": "🇰",
+2797	    "regional_indicator_symbol_letter_l": "🇱",
+2798	    "regional_indicator_symbol_letter_m": "🇲",
+2799	    "regional_indicator_symbol_letter_n": "🇳",
+2800	    "regional_indicator_symbol_letter_o": "🇴",
+2801	    "regional_indicator_symbol_letter_p": "🇵",
+2802	    "regional_indicator_symbol_letter_q": "🇶",
+2803	    "regional_indicator_symbol_letter_r": "🇷",
+2804	    "regional_indicator_symbol_letter_s": "🇸",
+2805	    "regional_indicator_symbol_letter_t": "🇹",
+2806	    "regional_indicator_symbol_letter_u": "🇺",
+2807	    "regional_indicator_symbol_letter_v": "🇻",
+2808	    "regional_indicator_symbol_letter_w": "🇼",
+2809	    "regional_indicator_symbol_letter_x": "🇽",
+2810	    "regional_indicator_symbol_letter_y": "🇾",
+2811	    "regional_indicator_symbol_letter_z": "🇿",
+2812	    "airplane_arriving": "🛬",
+2813	    "space_invader": "👾",
+2814	    "football": "🏈",
+2815	    "anger": "💢",
+2816	    "angry": "😠",
+2817	    "anguished": "😧",
+2818	    "signal_strength": "📶",
+2819	    "arrows_counterclockwise": "🔄",
+2820	    "arrow_heading_down": "⤵",
+2821	    "arrow_heading_up": "⤴",
+2822	    "art": "🎨",
+2823	    "astonished": "😲",
+2824	    "athletic_shoe": "👟",
+2825	    "atm": "🏧",
+2826	    "car": "🚗",
+2827	    "red_car": "🚗",
+2828	    "angel": "👼",
+2829	    "back": "🔙",
+2830	    "badminton_racquet_and_shuttlecock": "🏸",
+2831	    "dollar": "💵",
+2832	    "euro": "💶",
+2833	    "pound": "💷",
+2834	    "yen": "💴",
+2835	    "barber": "💈",
+2836	    "bath": "🛀",
+2837	    "bear": "🐻",
+2838	    "heartbeat": "💓",
+2839	    "beer": "🍺",
+2840	    "no_bell": "🔕",
+2841	    "bento": "🍱",
+2842	    "bike": "🚲",
+2843	    "bicyclist": "🚴",
+2844	    "8ball": "🎱",
+2845	    "biohazard_sign": "☣",
+2846	    "birthday": "🎂",
+2847	    "black_circle_for_record": "⏺",
+2848	    "clubs": "♣",
+2849	    "diamonds": "♦",
+2850	    "arrow_double_down": "⏬",
+2851	    "hearts": "♥",
+2852	    "rewind": "⏪",
+2853	    "black_left__pointing_double_triangle_with_vertical_bar": "⏮",
+2854	    "arrow_backward": "◀",
+2855	    "black_medium_small_square": "◾",
+2856	    "question": "❓",
+2857	    "fast_forward": "⏩",
+2858	    "black_right__pointing_double_triangle_with_vertical_bar": "⏭",
+2859	    "arrow_forward": "▶",
+2860	    "black_right__pointing_triangle_with_double_vertical_bar": "⏯",
+2861	    "arrow_right": "➡",
+2862	    "spades": "♠",
+2863	    "black_square_for_stop": "⏹",
+2864	    "sunny": "☀",
+2865	    "phone": "☎",
+2866	    "recycle": "♻",
+2867	    "arrow_double_up": "⏫",
+2868	    "busstop": "🚏",
+2869	    "date": "📅",
+2870	    "flags": "🎏",
+2871	    "cat2": "🐈",
+2872	    "joy_cat": "😹",
+2873	    "smirk_cat": "😼",
+2874	    "chart_with_downwards_trend": "📉",
+2875	    "chart_with_upwards_trend": "📈",
+2876	    "chart": "💹",
+2877	    "mega": "📣",
+2878	    "checkered_flag": "🏁",
+2879	    "accept": "🉑",
+2880	    "ideograph_advantage": "🉐",
+2881	    "congratulations": "㊗",
+2882	    "secret": "㊙",
+2883	    "m": "Ⓜ",
+2884	    "city_sunset": "🌆",
+2885	    "clapper": "🎬",
+2886	    "clap": "👏",
+2887	    "beers": "🍻",
+2888	    "clock830": "🕣",
+2889	    "clock8": "🕗",
+2890	    "clock1130": "🕦",
+2891	    "clock11": "🕚",
+2892	    "clock530": "🕠",
+2893	    "clock5": "🕔",
+2894	    "clock430": "🕟",
+2895	    "clock4": "🕓",
+2896	    "clock930": "🕤",
+2897	    "clock9": "🕘",
+2898	    "clock130": "🕜",
+2899	    "clock1": "🕐",
+2900	    "clock730": "🕢",
+2901	    "clock7": "🕖",
+2902	    "clock630": "🕡",
+2903	    "clock6": "🕕",
+2904	    "clock1030": "🕥",
+2905	    "clock10": "🕙",
+2906	    "clock330": "🕞",
+2907	    "clock3": "🕒",
+2908	    "clock1230": "🕧",
+2909	    "clock12": "🕛",
+2910	    "clock230": "🕝",
+2911	    "clock2": "🕑",
+2912	    "arrows_clockwise": "🔃",
+2913	    "repeat": "🔁",
+2914	    "repeat_one": "🔂",
+2915	    "closed_lock_with_key": "🔐",
+2916	    "mailbox_closed": "📪",
+2917	    "mailbox": "📫",
+2918	    "cloud_with_tornado": "🌪",
+2919	    "cocktail": "🍸",
+2920	    "boom": "💥",
+2921	    "compression": "🗜",
+2922	    "confounded": "😖",
+2923	    "confused": "😕",
+2924	    "rice": "🍚",
+2925	    "cow2": "🐄",
+2926	    "cricket_bat_and_ball": "🏏",
+2927	    "x": "❌",
+2928	    "cry": "😢",
+2929	    "curry": "🍛",
+2930	    "dagger_knife": "🗡",
+2931	    "dancer": "💃",
+2932	    "dark_sunglasses": "🕶",
+2933	    "dash": "💨",
+2934	    "truck": "🚚",
+2935	    "derelict_house_building": "🏚",
+2936	    "diamond_shape_with_a_dot_inside": "💠",
+2937	    "dart": "🎯",
+2938	    "disappointed_relieved": "😥",
+2939	    "disappointed": "😞",
+2940	    "do_not_litter": "🚯",
+2941	    "dog2": "🐕",
+2942	    "flipper": "🐬",
+2943	    "loop": "➿",
+2944	    "bangbang": "‼",
+2945	    "double_vertical_bar": "⏸",
+2946	    "dove_of_peace": "🕊",
+2947	    "small_red_triangle_down": "🔻",
+2948	    "arrow_down_small": "🔽",
+2949	    "arrow_down": "⬇",
+2950	    "dromedary_camel": "🐪",
+2951	    "e__mail": "📧",
+2952	    "corn": "🌽",
+2953	    "ear_of_rice": "🌾",
+2954	    "earth_americas": "🌎",
+2955	    "earth_asia": "🌏",
+2956	    "earth_africa": "🌍",
+2957	    "eight_pointed_black_star": "✴",
+2958	    "eight_spoked_asterisk": "✳",
+2959	    "eject_symbol": "⏏",
+2960	    "bulb": "💡",
+2961	    "emoji_modifier_fitzpatrick_type__1__2": "🏻",
+2962	    "emoji_modifier_fitzpatrick_type__3": "🏼",
+2963	    "emoji_modifier_fitzpatrick_type__4": "🏽",
+2964	    "emoji_modifier_fitzpatrick_type__5": "🏾",
+2965	    "emoji_modifier_fitzpatrick_type__6": "🏿",
+2966	    "end": "🔚",
+2967	    "email": "✉",
+2968	    "european_castle": "🏰",
+2969	    "european_post_office": "🏤",
+2970	    "interrobang": "⁉",
+2971	    "expressionless": "😑",
+2972	    "eyeglasses": "👓",
+2973	    "massage": "💆",
+2974	    "yum": "😋",
+2975	    "scream": "😱",
+2976	    "kissing_heart": "😘",
+2977	    "sweat": "😓",
+2978	    "face_with_head__bandage": "🤕",
+2979	    "triumph": "😤",
+2980	    "mask": "😷",
+2981	    "no_good": "🙅",
+2982	    "ok_woman": "🙆",
+2983	    "open_mouth": "😮",
+2984	    "cold_sweat": "😰",
+2985	    "stuck_out_tongue": "😛",
+2986	    "stuck_out_tongue_closed_eyes": "😝",
+2987	    "stuck_out_tongue_winking_eye": "😜",
+2988	    "joy": "😂",
+2989	    "no_mouth": "😶",
+2990	    "santa": "🎅",
+2991	    "fax": "📠",
+2992	    "fearful": "😨",
+2993	    "field_hockey_stick_and_ball": "🏑",
+2994	    "first_quarter_moon_with_face": "🌛",
+2995	    "fish_cake": "🍥",
+2996	    "fishing_pole_and_fish": "🎣",
+2997	    "facepunch": "👊",
+2998	    "punch": "👊",
+2999	    "flag_for_afghanistan": "🇦🇫",
+3000	    "flag_for_albania": "🇦🇱",
+3001	    "flag_for_algeria": "🇩🇿",
+3002	    "flag_for_american_samoa": "🇦🇸",
+3003	    "flag_for_andorra": "🇦🇩",
+3004	    "flag_for_angola": "🇦🇴",
+3005	    "flag_for_anguilla": "🇦🇮",
+3006	    "flag_for_antarctica": "🇦🇶",
+3007	    "flag_for_antigua_&_barbuda": "🇦🇬",
+3008	    "flag_for_argentina": "🇦🇷",
+3009	    "flag_for_armenia": "🇦🇲",
+3010	    "flag_for_aruba": "🇦🇼",
+3011	    "flag_for_ascension_island": "🇦🇨",
+3012	    "flag_for_australia": "🇦🇺",
+3013	    "flag_for_austria": "🇦🇹",
+3014	    "flag_for_azerbaijan": "🇦🇿",
+3015	    "flag_for_bahamas": "🇧🇸",
+3016	    "flag_for_bahrain": "🇧🇭",
+3017	    "flag_for_bangladesh": "🇧🇩",
+3018	    "flag_for_barbados": "🇧🇧",
+3019	    "flag_for_belarus": "🇧🇾",
+3020	    "flag_for_belgium": "🇧🇪",
+3021	    "flag_for_belize": "🇧🇿",
+3022	    "flag_for_benin": "🇧🇯",
+3023	    "flag_for_bermuda": "🇧🇲",
+3024	    "flag_for_bhutan": "🇧🇹",
+3025	    "flag_for_bolivia": "🇧🇴",
+3026	    "flag_for_bosnia_&_herzegovina": "🇧🇦",
+3027	    "flag_for_botswana": "🇧🇼",
+3028	    "flag_for_bouvet_island": "🇧🇻",
+3029	    "flag_for_brazil": "🇧🇷",
+3030	    "flag_for_british_indian_ocean_territory": "🇮🇴",
+3031	    "flag_for_british_virgin_islands": "🇻🇬",
+3032	    "flag_for_brunei": "🇧🇳",
+3033	    "flag_for_bulgaria": "🇧🇬",
+3034	    "flag_for_burkina_faso": "🇧🇫",
+3035	    "flag_for_burundi": "🇧🇮",
+3036	    "flag_for_cambodia": "🇰🇭",
+3037	    "flag_for_cameroon": "🇨🇲",
+3038	    "flag_for_canada": "🇨🇦",
+3039	    "flag_for_canary_islands": "🇮🇨",
+3040	    "flag_for_cape_verde": "🇨🇻",
+3041	    "flag_for_caribbean_netherlands": "🇧🇶",
+3042	    "flag_for_cayman_islands": "🇰🇾",
+3043	    "flag_for_central_african_republic": "🇨🇫",
+3044	    "flag_for_ceuta_&_melilla": "🇪🇦",
+3045	    "flag_for_chad": "🇹🇩",
+3046	    "flag_for_chile": "🇨🇱",
+3047	    "flag_for_china": "🇨🇳",
+3048	    "flag_for_christmas_island": "🇨🇽",
+3049	    "flag_for_clipperton_island": "🇨🇵",
+3050	    "flag_for_cocos__islands": "🇨🇨",
+3051	    "flag_for_colombia": "🇨🇴",
+3052	    "flag_for_comoros": "🇰🇲",
+3053	    "flag_for_congo____brazzaville": "🇨🇬",
+3054	    "flag_for_congo____kinshasa": "🇨🇩",
+3055	    "flag_for_cook_islands": "🇨🇰",
+3056	    "flag_for_costa_rica": "🇨🇷",
+3057	    "flag_for_croatia": "🇭🇷",
+3058	    "flag_for_cuba": "🇨🇺",
+3059	    "flag_for_curaçao": "🇨🇼",
+3060	    "flag_for_cyprus": "🇨🇾",
+3061	    "flag_for_czech_republic": "🇨🇿",
+3062	    "flag_for_côte_d’ivoire": "🇨🇮",
+3063	    "flag_for_denmark": "🇩🇰",
+3064	    "flag_for_diego_garcia": "🇩🇬",
+3065	    "flag_for_djibouti": "🇩🇯",
+3066	    "flag_for_dominica": "🇩🇲",
+3067	    "flag_for_dominican_republic": "🇩🇴",
+3068	    "flag_for_ecuador": "🇪🇨",
+3069	    "flag_for_egypt": "🇪🇬",
+3070	    "flag_for_el_salvador": "🇸🇻",
+3071	    "flag_for_equatorial_guinea": "🇬🇶",
+3072	    "flag_for_eritrea": "🇪🇷",
+3073	    "flag_for_estonia": "🇪🇪",
+3074	    "flag_for_ethiopia": "🇪🇹",
+3075	    "flag_for_european_union": "🇪🇺",
+3076	    "flag_for_falkland_islands": "🇫🇰",
+3077	    "flag_for_faroe_islands": "🇫🇴",
+3078	    "flag_for_fiji": "🇫🇯",
+3079	    "flag_for_finland": "🇫🇮",
+3080	    "flag_for_france": "🇫🇷",
+3081	    "flag_for_french_guiana": "🇬🇫",
+3082	    "flag_for_french_polynesia": "🇵🇫",
+3083	    "flag_for_french_southern_territories": "🇹🇫",
+3084	    "flag_for_gabon": "🇬🇦",
+3085	    "flag_for_gambia": "🇬🇲",
+3086	    "flag_for_georgia": "🇬🇪",
+3087	    "flag_for_germany": "🇩🇪",
+3088	    "flag_for_ghana": "🇬🇭",
+3089	    "flag_for_gibraltar": "🇬🇮",
+3090	    "flag_for_greece": "🇬🇷",
+3091	    "flag_for_greenland": "🇬🇱",
+3092	    "flag_for_grenada": "🇬🇩",
+3093	    "flag_for_guadeloupe": "🇬🇵",
+3094	    "flag_for_guam": "🇬🇺",
+3095	    "flag_for_guatemala": "🇬🇹",
+3096	    "flag_for_guernsey": "🇬🇬",
+3097	    "flag_for_guinea": "🇬🇳",
+3098	    "flag_for_guinea__bissau": "🇬🇼",
+3099	    "flag_for_guyana": "🇬🇾",
+3100	    "flag_for_haiti": "🇭🇹",
+3101	    "flag_for_heard_&_mcdonald_islands": "🇭🇲",
+3102	    "flag_for_honduras": "🇭🇳",
+3103	    "flag_for_hong_kong": "🇭🇰",
+3104	    "flag_for_hungary": "🇭🇺",
+3105	    "flag_for_iceland": "🇮🇸",
+3106	    "flag_for_india": "🇮🇳",
+3107	    "flag_for_indonesia": "🇮🇩",
+3108	    "flag_for_iran": "🇮🇷",
+3109	    "flag_for_iraq": "🇮🇶",
+3110	    "flag_for_ireland": "🇮🇪",
+3111	    "flag_for_isle_of_man": "🇮🇲",
+3112	    "flag_for_israel": "🇮🇱",
+3113	    "flag_for_italy": "🇮🇹",
+3114	    "flag_for_jamaica": "🇯🇲",
+3115	    "flag_for_japan": "🇯🇵",
+3116	    "flag_for_jersey": "🇯🇪",
+3117	    "flag_for_jordan": "🇯🇴",
+3118	    "flag_for_kazakhstan": "🇰🇿",
+3119	    "flag_for_kenya": "🇰🇪",
+3120	    "flag_for_kiribati": "🇰🇮",
+3121	    "flag_for_kosovo": "🇽🇰",
+3122	    "flag_for_kuwait": "🇰🇼",
+3123	    "flag_for_kyrgyzstan": "🇰🇬",
+3124	    "flag_for_laos": "🇱🇦",
+3125	    "flag_for_latvia": "🇱🇻",
+3126	    "flag_for_lebanon": "🇱🇧",
+3127	    "flag_for_lesotho": "🇱🇸",
+3128	    "flag_for_liberia": "🇱🇷",
+3129	    "flag_for_libya": "🇱🇾",
+3130	    "flag_for_liechtenstein": "🇱🇮",
+3131	    "flag_for_lithuania": "🇱🇹",
+3132	    "flag_for_luxembourg": "🇱🇺",
+3133	    "flag_for_macau": "🇲🇴",
+3134	    "flag_for_macedonia": "🇲🇰",
+3135	    "flag_for_madagascar": "🇲🇬",
+3136	    "flag_for_malawi": "🇲🇼",
+3137	    "flag_for_malaysia": "🇲🇾",
+3138	    "flag_for_maldives": "🇲🇻",
+3139	    "flag_for_mali": "🇲🇱",
+3140	    "flag_for_malta": "🇲🇹",
+3141	    "flag_for_marshall_islands": "🇲🇭",
+3142	    "flag_for_martinique": "🇲🇶",
+3143	    "flag_for_mauritania": "🇲🇷",
+3144	    "flag_for_mauritius": "🇲🇺",
+3145	    "flag_for_mayotte": "🇾🇹",
+3146	    "flag_for_mexico": "🇲🇽",
+3147	    "flag_for_micronesia": "🇫🇲",
+3148	    "flag_for_moldova": "🇲🇩",
+3149	    "flag_for_monaco": "🇲🇨",
+3150	    "flag_for_mongolia": "🇲🇳",
+3151	    "flag_for_montenegro": "🇲🇪",
+3152	    "flag_for_montserrat": "🇲🇸",
+3153	    "flag_for_morocco": "🇲🇦",
+3154	    "flag_for_mozambique": "🇲🇿",
+3155	    "flag_for_myanmar": "🇲🇲",
+3156	    "flag_for_namibia": "🇳🇦",
+3157	    "flag_for_nauru": "🇳🇷",
+3158	    "flag_for_nepal": "🇳🇵",
+3159	    "flag_for_netherlands": "🇳🇱",
+3160	    "flag_for_new_caledonia": "🇳🇨",
+3161	    "flag_for_new_zealand": "🇳🇿",
+3162	    "flag_for_nicaragua": "🇳🇮",
+3163	    "flag_for_niger": "🇳🇪",
+3164	    "flag_for_nigeria": "🇳🇬",
+3165	    "flag_for_niue": "🇳🇺",
+3166	    "flag_for_norfolk_island": "🇳🇫",
+3167	    "flag_for_north_korea": "🇰🇵",
+3168	    "flag_for_northern_mariana_islands": "🇲🇵",
+3169	    "flag_for_norway": "🇳🇴",
+3170	    "flag_for_oman": "🇴🇲",
+3171	    "flag_for_pakistan": "🇵🇰",
+3172	    "flag_for_palau": "🇵🇼",
+3173	    "flag_for_palestinian_territories": "🇵🇸",
+3174	    "flag_for_panama": "🇵🇦",
+3175	    "flag_for_papua_new_guinea": "🇵🇬",
+3176	    "flag_for_paraguay": "🇵🇾",
+3177	    "flag_for_peru": "🇵🇪",
+3178	    "flag_for_philippines": "🇵🇭",
+3179	    "flag_for_pitcairn_islands": "🇵🇳",
+3180	    "flag_for_poland": "🇵🇱",
+3181	    "flag_for_portugal": "🇵🇹",
+3182	    "flag_for_puerto_rico": "🇵🇷",
+3183	    "flag_for_qatar": "🇶🇦",
+3184	    "flag_for_romania": "🇷🇴",
+3185	    "flag_for_russia": "🇷🇺",
+3186	    "flag_for_rwanda": "🇷🇼",
+3187	    "flag_for_réunion": "🇷🇪",
+3188	    "flag_for_samoa": "🇼🇸",
+3189	    "flag_for_san_marino": "🇸🇲",
+3190	    "flag_for_saudi_arabia": "🇸🇦",
+3191	    "flag_for_senegal": "🇸🇳",
+3192	    "flag_for_serbia": "🇷🇸",
+3193	    "flag_for_seychelles": "🇸🇨",
+3194	    "flag_for_sierra_leone": "🇸🇱",
+3195	    "flag_for_singapore": "🇸🇬",
+3196	    "flag_for_sint_maarten": "🇸🇽",
+3197	    "flag_for_slovakia": "🇸🇰",
+3198	    "flag_for_slovenia": "🇸🇮",
+3199	    "flag_for_solomon_islands": "🇸🇧",
+3200	    "flag_for_somalia": "🇸🇴",
+3201	    "flag_for_south_africa": "🇿🇦",
+3202	    "flag_for_south_georgia_&_south_sandwich_islands": "🇬🇸",
+3203	    "flag_for_south_korea": "🇰🇷",
+3204	    "flag_for_south_sudan": "🇸🇸",
+3205	    "flag_for_spain": "🇪🇸",
+3206	    "flag_for_sri_lanka": "🇱🇰",
+3207	    "flag_for_st._barthélemy": "🇧🇱",
+3208	    "flag_for_st._helena": "🇸🇭",
+3209	    "flag_for_st._kitts_&_nevis": "🇰🇳",
+3210	    "flag_for_st._lucia": "🇱🇨",
+3211	    "flag_for_st._martin": "🇲🇫",
+3212	    "flag_for_st._pierre_&_miquelon": "🇵🇲",
+3213	    "flag_for_st._vincent_&_grenadines": "🇻🇨",
+3214	    "flag_for_sudan": "🇸🇩",
+3215	    "flag_for_suriname": "🇸🇷",
+3216	    "flag_for_svalbard_&_jan_mayen": "🇸🇯",
+3217	    "flag_for_swaziland": "🇸🇿",
+3218	    "flag_for_sweden": "🇸🇪",
+3219	    "flag_for_switzerland": "🇨🇭",
+3220	    "flag_for_syria": "🇸🇾",
+3221	    "flag_for_são_tomé_&_príncipe": "🇸🇹",
+3222	    "flag_for_taiwan": "🇹🇼",
+3223	    "flag_for_tajikistan": "🇹🇯",
+3224	    "flag_for_tanzania": "🇹🇿",
+3225	    "flag_for_thailand": "🇹🇭",
+3226	    "flag_for_timor__leste": "🇹🇱",
+3227	    "flag_for_togo": "🇹🇬",
+3228	    "flag_for_tokelau": "🇹🇰",
+3229	    "flag_for_tonga": "🇹🇴",
+3230	    "flag_for_trinidad_&_tobago": "🇹🇹",
+3231	    "flag_for_tristan_da_cunha": "🇹🇦",
+3232	    "flag_for_tunisia": "🇹🇳",
+3233	    "flag_for_turkey": "🇹🇷",
+3234	    "flag_for_turkmenistan": "🇹🇲",
+3235	    "flag_for_turks_&_caicos_islands": "🇹🇨",
+3236	    "flag_for_tuvalu": "🇹🇻",
+3237	    "flag_for_u.s._outlying_islands": "🇺🇲",
+3238	    "flag_for_u.s._virgin_islands": "🇻🇮",
+3239	    "flag_for_uganda": "🇺🇬",
+3240	    "flag_for_ukraine": "🇺🇦",
+3241	    "flag_for_united_arab_emirates": "🇦🇪",
+3242	    "flag_for_united_kingdom": "🇬🇧",
+3243	    "flag_for_united_states": "🇺🇸",
+3244	    "flag_for_uruguay": "🇺🇾",
+3245	    "flag_for_uzbekistan": "🇺🇿",
+3246	    "flag_for_vanuatu": "🇻🇺",
+3247	    "flag_for_vatican_city": "🇻🇦",
+3248	    "flag_for_venezuela": "🇻🇪",
+3249	    "flag_for_vietnam": "🇻🇳",
+3250	    "flag_for_wallis_&_futuna": "🇼🇫",
+3251	    "flag_for_western_sahara": "🇪🇭",
+3252	    "flag_for_yemen": "🇾🇪",
+3253	    "flag_for_zambia": "🇿🇲",
+3254	    "flag_for_zimbabwe": "🇿🇼",
+3255	    "flag_for_åland_islands": "🇦🇽",
+3256	    "golf": "⛳",
+3257	    "fleur__de__lis": "⚜",
+3258	    "muscle": "💪",
+3259	    "flushed": "😳",
+3260	    "frame_with_picture": "🖼",
+3261	    "fries": "🍟",
+3262	    "frog": "🐸",
+3263	    "hatched_chick": "🐥",
+3264	    "frowning": "😦",
+3265	    "fuelpump": "⛽",
+3266	    "full_moon_with_face": "🌝",
+3267	    "gem": "💎",
+3268	    "star2": "🌟",
+3269	    "golfer": "🏌",
+3270	    "mortar_board": "🎓",
+3271	    "grimacing": "😬",
+3272	    "smile_cat": "😸",
+3273	    "grinning": "😀",
+3274	    "grin": "😁",
+3275	    "heartpulse": "💗",
+3276	    "guardsman": "💂",
+3277	    "haircut": "💇",
+3278	    "hamster": "🐹",
+3279	    "raising_hand": "🙋",
+3280	    "headphones": "🎧",
+3281	    "hear_no_evil": "🙉",
+3282	    "cupid": "💘",
+3283	    "gift_heart": "💝",
+3284	    "heart": "❤",
+3285	    "exclamation": "❗",
+3286	    "heavy_exclamation_mark": "❗",
+3287	    "heavy_heart_exclamation_mark_ornament": "❣",
+3288	    "o": "⭕",
+3289	    "helm_symbol": "⎈",
+3290	    "helmet_with_white_cross": "⛑",
+3291	    "high_heel": "👠",
+3292	    "bullettrain_side": "🚄",
+3293	    "bullettrain_front": "🚅",
+3294	    "high_brightness": "🔆",
+3295	    "zap": "⚡",
+3296	    "hocho": "🔪",
+3297	    "knife": "🔪",
+3298	    "bee": "🐝",
+3299	    "traffic_light": "🚥",
+3300	    "racehorse": "🐎",
+3301	    "coffee": "☕",
+3302	    "hotsprings": "♨",
+3303	    "hourglass": "⌛",
+3304	    "hourglass_flowing_sand": "⏳",
+3305	    "house_buildings": "🏘",
+3306	    "100": "💯",
+3307	    "hushed": "😯",
+3308	    "ice_hockey_stick_and_puck": "🏒",
+3309	    "imp": "👿",
+3310	    "information_desk_person": "💁",
+3311	    "information_source": "ℹ",
+3312	    "capital_abcd": "🔠",
+3313	    "abc": "🔤",
+3314	    "abcd": "🔡",
+3315	    "1234": "🔢",
+3316	    "symbols": "🔣",
+3317	    "izakaya_lantern": "🏮",
+3318	    "lantern": "🏮",
+3319	    "jack_o_lantern": "🎃",
+3320	    "dolls": "🎎",
+3321	    "japanese_goblin": "👺",
+3322	    "japanese_ogre": "👹",
+3323	    "beginner": "🔰",
+3324	    "zero": "0️⃣",
+3325	    "one": "1️⃣",
+3326	    "ten": "🔟",
+3327	    "two": "2️⃣",
+3328	    "three": "3️⃣",
+3329	    "four": "4️⃣",
+3330	    "five": "5️⃣",
+3331	    "six": "6️⃣",
+3332	    "seven": "7️⃣",
+3333	    "eight": "8️⃣",
+3334	    "nine": "9️⃣",
+3335	    "couplekiss": "💏",
+3336	    "kissing_cat": "😽",
+3337	    "kissing": "😗",
+3338	    "kissing_closed_eyes": "😚",
+3339	    "kissing_smiling_eyes": "😙",
+3340	    "beetle": "🐞",
+3341	    "large_blue_circle": "🔵",
+3342	    "last_quarter_moon_with_face": "🌜",
+3343	    "leaves": "🍃",
+3344	    "mag": "🔍",
+3345	    "left_right_arrow": "↔",
+3346	    "leftwards_arrow_with_hook": "↩",
+3347	    "arrow_left": "⬅",
+3348	    "lock": "🔒",
+3349	    "lock_with_ink_pen": "🔏",
+3350	    "sob": "😭",
+3351	    "low_brightness": "🔅",
+3352	    "lower_left_ballpoint_pen": "🖊",
+3353	    "lower_left_crayon": "🖍",
+3354	    "lower_left_fountain_pen": "🖋",
+3355	    "lower_left_paintbrush": "🖌",
+3356	    "mahjong": "🀄",
+3357	    "couple": "👫",
+3358	    "man_in_business_suit_levitating": "🕴",
+3359	    "man_with_gua_pi_mao": "👲",
+3360	    "man_with_turban": "👳",
+3361	    "mans_shoe": "👞",
+3362	    "shoe": "👞",
+3363	    "menorah_with_nine_branches": "🕎",
+3364	    "mens": "🚹",
+3365	    "minidisc": "💽",
+3366	    "iphone": "📱",
+3367	    "calling": "📲",
+3368	    "money__mouth_face": "🤑",
+3369	    "moneybag": "💰",
+3370	    "rice_scene": "🎑",
+3371	    "mountain_bicyclist": "🚵",
+3372	    "mouse2": "🐁",
+3373	    "lips": "👄",
+3374	    "moyai": "🗿",
+3375	    "notes": "🎶",
+3376	    "nail_care": "💅",
+3377	    "ab": "🆎",
+3378	    "negative_squared_cross_mark": "❎",
+3379	    "a": "🅰",
+3380	    "b": "🅱",
+3381	    "o2": "🅾",
+3382	    "parking": "🅿",
+3383	    "new_moon_with_face": "🌚",
+3384	    "no_entry_sign": "🚫",
+3385	    "underage": "🔞",
+3386	    "non__potable_water": "🚱",
+3387	    "arrow_upper_right": "↗",
+3388	    "arrow_upper_left": "↖",
+3389	    "office": "🏢",
+3390	    "older_man": "👴",
+3391	    "older_woman": "👵",
+3392	    "om_symbol": "🕉",
+3393	    "on": "🔛",
+3394	    "book": "📖",
+3395	    "unlock": "🔓",
+3396	    "mailbox_with_no_mail": "📭",
+3397	    "mailbox_with_mail": "📬",
+3398	    "cd": "💿",
+3399	    "tada": "🎉",
+3400	    "feet": "🐾",
+3401	    "walking": "🚶",
+3402	    "pencil2": "✏",
+3403	    "pensive": "😔",
+3404	    "persevere": "😣",
+3405	    "bow": "🙇",
+3406	    "raised_hands": "🙌",
+3407	    "person_with_ball": "⛹",
+3408	    "person_with_blond_hair": "👱",
+3409	    "pray": "🙏",
+3410	    "person_with_pouting_face": "🙎",
+3411	    "computer": "💻",
+3412	    "pig2": "🐖",
+3413	    "hankey": "💩",
+3414	    "poop": "💩",
+3415	    "shit": "💩",
+3416	    "bamboo": "🎍",
+3417	    "gun": "🔫",
+3418	    "black_joker": "🃏",
+3419	    "rotating_light": "🚨",
+3420	    "cop": "👮",
+3421	    "stew": "🍲",
+3422	    "pouch": "👝",
+3423	    "pouting_cat": "😾",
+3424	    "rage": "😡",
+3425	    "put_litter_in_its_place": "🚮",
+3426	    "rabbit2": "🐇",
+3427	    "racing_motorcycle": "🏍",
+3428	    "radioactive_sign": "☢",
+3429	    "fist": "✊",
+3430	    "hand": "✋",
+3431	    "raised_hand_with_fingers_splayed": "🖐",
+3432	    "raised_hand_with_part_between_middle_and_ring_fingers": "🖖",
+3433	    "blue_car": "🚙",
+3434	    "apple": "🍎",
+3435	    "relieved": "😌",
+3436	    "reversed_hand_with_middle_finger_extended": "🖕",
+3437	    "mag_right": "🔎",
+3438	    "arrow_right_hook": "↪",
+3439	    "sweet_potato": "🍠",
+3440	    "robot": "🤖",
+3441	    "rolled__up_newspaper": "🗞",
+3442	    "rowboat": "🚣",
+3443	    "runner": "🏃",
+3444	    "running": "🏃",
+3445	    "running_shirt_with_sash": "🎽",
+3446	    "boat": "⛵",
+3447	    "scales": "⚖",
+3448	    "school_satchel": "🎒",
+3449	    "scorpius": "♏",
+3450	    "see_no_evil": "🙈",
+3451	    "sheep": "🐑",
+3452	    "stars": "🌠",
+3453	    "cake": "🍰",
+3454	    "six_pointed_star": "🔯",
+3455	    "ski": "🎿",
+3456	    "sleeping_accommodation": "🛌",
+3457	    "sleeping": "😴",
+3458	    "sleepy": "😪",
+3459	    "sleuth_or_spy": "🕵",
+3460	    "heart_eyes_cat": "😻",
+3461	    "smiley_cat": "😺",
+3462	    "innocent": "😇",
+3463	    "heart_eyes": "😍",
+3464	    "smiling_imp": "😈",
+3465	    "smiley": "😃",
+3466	    "sweat_smile": "😅",
+3467	    "smile": "😄",
+3468	    "laughing": "😆",
+3469	    "satisfied": "😆",
+3470	    "blush": "😊",
+3471	    "smirk": "😏",
+3472	    "smoking": "🚬",
+3473	    "snow_capped_mountain": "🏔",
+3474	    "soccer": "⚽",
+3475	    "icecream": "🍦",
+3476	    "soon": "🔜",
+3477	    "arrow_lower_right": "↘",
+3478	    "arrow_lower_left": "↙",
+3479	    "speak_no_evil": "🙊",
+3480	    "speaker": "🔈",
+3481	    "mute": "🔇",
+3482	    "sound": "🔉",
+3483	    "loud_sound": "🔊",
+3484	    "speaking_head_in_silhouette": "🗣",
+3485	    "spiral_calendar_pad": "🗓",
+3486	    "spiral_note_pad": "🗒",
+3487	    "shell": "🐚",
+3488	    "sweat_drops": "💦",
+3489	    "u5272": "🈹",
+3490	    "u5408": "🈴",
+3491	    "u55b6": "🈺",
+3492	    "u6307": "🈯",
+3493	    "u6708": "🈷",
+3494	    "u6709": "🈶",
+3495	    "u6e80": "🈵",
+3496	    "u7121": "🈚",
+3497	    "u7533": "🈸",
+3498	    "u7981": "🈲",
+3499	    "u7a7a": "🈳",
+3500	    "cl": "🆑",
+3501	    "cool": "🆒",
+3502	    "free": "🆓",
+3503	    "id": "🆔",
+3504	    "koko": "🈁",
+3505	    "sa": "🈂",
+3506	    "new": "🆕",
+3507	    "ng": "🆖",
+3508	    "ok": "🆗",
+3509	    "sos": "🆘",
+3510	    "up": "🆙",
+3511	    "vs": "🆚",
+3512	    "steam_locomotive": "🚂",
+3513	    "ramen": "🍜",
+3514	    "partly_sunny": "⛅",
+3515	    "city_sunrise": "🌇",
+3516	    "surfer": "🏄",
+3517	    "swimmer": "🏊",
+3518	    "shirt": "👕",
+3519	    "tshirt": "👕",
+3520	    "table_tennis_paddle_and_ball": "🏓",
+3521	    "tea": "🍵",
+3522	    "tv": "📺",
+3523	    "three_button_mouse": "🖱",
+3524	    "+1": "👍",
+3525	    "thumbsup": "👍",
+3526	    "__1": "👎",
+3527	    "-1": "👎",
+3528	    "thumbsdown": "👎",
+3529	    "thunder_cloud_and_rain": "⛈",
+3530	    "tiger2": "🐅",
+3531	    "tophat": "🎩",
+3532	    "top": "🔝",
+3533	    "tm": "™",
+3534	    "train2": "🚆",
+3535	    "triangular_flag_on_post": "🚩",
+3536	    "trident": "🔱",
+3537	    "twisted_rightwards_arrows": "🔀",
+3538	    "unamused": "😒",
+3539	    "small_red_triangle": "🔺",
+3540	    "arrow_up_small": "🔼",
+3541	    "arrow_up_down": "↕",
+3542	    "upside__down_face": "🙃",
+3543	    "arrow_up": "⬆",
+3544	    "v": "✌",
+3545	    "vhs": "📼",
+3546	    "wc": "🚾",
+3547	    "ocean": "🌊",
+3548	    "waving_black_flag": "🏴",
+3549	    "wave": "👋",
+3550	    "waving_white_flag": "🏳",
+3551	    "moon": "🌔",
+3552	    "scream_cat": "🙀",
+3553	    "weary": "😩",
+3554	    "weight_lifter": "🏋",
+3555	    "whale2": "🐋",
+3556	    "wheelchair": "♿",
+3557	    "point_down": "👇",
+3558	    "grey_exclamation": "❕",
+3559	    "white_frowning_face": "☹",
+3560	    "white_check_mark": "✅",
+3561	    "point_left": "👈",
+3562	    "white_medium_small_square": "◽",
+3563	    "star": "⭐",
+3564	    "grey_question": "❔",
+3565	    "point_right": "👉",
+3566	    "relaxed": "☺",
+3567	    "white_sun_behind_cloud": "🌥",
+3568	    "white_sun_behind_cloud_with_rain": "🌦",
+3569	    "white_sun_with_small_cloud": "🌤",
+3570	    "point_up_2": "👆",
+3571	    "point_up": "☝",
+3572	    "wind_blowing_face": "🌬",
+3573	    "wink": "😉",
+3574	    "wolf": "🐺",
+3575	    "dancers": "👯",
+3576	    "boot": "👢",
+3577	    "womans_clothes": "👚",
+3578	    "womans_hat": "👒",
+3579	    "sandal": "👡",
+3580	    "womens": "🚺",
+3581	    "worried": "😟",
+3582	    "gift": "🎁",
+3583	    "zipper__mouth_face": "🤐",
+3584	    "regional_indicator_a": "🇦",
+3585	    "regional_indicator_b": "🇧",
+3586	    "regional_indicator_c": "🇨",
+3587	    "regional_indicator_d": "🇩",
+3588	    "regional_indicator_e": "🇪",
+3589	    "regional_indicator_f": "🇫",
+3590	    "regional_indicator_g": "🇬",
+3591	    "regional_indicator_h": "🇭",
+3592	    "regional_indicator_i": "🇮",
+3593	    "regional_indicator_j": "🇯",
+3594	    "regional_indicator_k": "🇰",
+3595	    "regional_indicator_l": "🇱",
+3596	    "regional_indicator_m": "🇲",
+3597	    "regional_indicator_n": "🇳",
+3598	    "regional_indicator_o": "🇴",
+3599	    "regional_indicator_p": "🇵",
+3600	    "regional_indicator_q": "🇶",
+3601	    "regional_indicator_r": "🇷",
+3602	    "regional_indicator_s": "🇸",
+3603	    "regional_indicator_t": "🇹",
+3604	    "regional_indicator_u": "🇺",
+3605	    "regional_indicator_v": "🇻",
+3606	    "regional_indicator_w": "🇼",
+3607	    "regional_indicator_x": "🇽",
+3608	    "regional_indicator_y": "🇾",
+3609	    "regional_indicator_z": "🇿",
+3610	}
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '㊙'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/rich/_emoji_codes.py
+ Line number: 2882
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+2881	    "congratulations": "㊗",
+2882	    "secret": "㊙",
+2883	    "m": "Ⓜ",
+2884	    "city_sunset": "🌆",
+2885	    "clapper": "🎬",
+2886	    "clap": "👏",
+2887	    "beers": "🍻",
+2888	    "clock830": "🕣",
+2889	    "clock8": "🕗",
+2890	    "clock1130": "🕦",
+2891	    "clock11": "🕚",
+2892	    "clock530": "🕠",
+2893	    "clock5": "🕔",
+2894	    "clock430": "🕟",
+2895	    "clock4": "🕓",
+2896	    "clock930": "🕤",
+2897	    "clock9": "🕘",
+2898	    "clock130": "🕜",
+2899	    "clock1": "🕐",
+2900	    "clock730": "🕢",
+2901	    "clock7": "🕖",
+2902	    "clock630": "🕡",
+2903	    "clock6": "🕕",
+2904	    "clock1030": "🕥",
+2905	    "clock10": "🕙",
+2906	    "clock330": "🕞",
+2907	    "clock3": "🕒",
+2908	    "clock1230": "🕧",
+2909	    "clock12": "🕛",
+2910	    "clock230": "🕝",
+2911	    "clock2": "🕑",
+2912	    "arrows_clockwise": "🔃",
+2913	    "repeat": "🔁",
+2914	    "repeat_one": "🔂",
+2915	    "closed_lock_with_key": "🔐",
+2916	    "mailbox_closed": "📪",
+2917	    "mailbox": "📫",
+2918	    "cloud_with_tornado": "🌪",
+2919	    "cocktail": "🍸",
+2920	    "boom": "💥",
+2921	    "compression": "🗜",
+2922	    "confounded": "😖",
+2923	    "confused": "😕",
+2924	    "rice": "🍚",
+2925	    "cow2": "🐄",
+2926	    "cricket_bat_and_ball": "🏏",
+2927	    "x": "❌",
+2928	    "cry": "😢",
+2929	    "curry": "🍛",
+2930	    "dagger_knife": "🗡",
+2931	    "dancer": "💃",
+2932	    "dark_sunglasses": "🕶",
+2933	    "dash": "💨",
+2934	    "truck": "🚚",
+2935	    "derelict_house_building": "🏚",
+2936	    "diamond_shape_with_a_dot_inside": "💠",
+2937	    "dart": "🎯",
+2938	    "disappointed_relieved": "😥",
+2939	    "disappointed": "😞",
+2940	    "do_not_litter": "🚯",
+2941	    "dog2": "🐕",
+2942	    "flipper": "🐬",
+2943	    "loop": "➿",
+2944	    "bangbang": "‼",
+2945	    "double_vertical_bar": "⏸",
+2946	    "dove_of_peace": "🕊",
+2947	    "small_red_triangle_down": "🔻",
+2948	    "arrow_down_small": "🔽",
+2949	    "arrow_down": "⬇",
+2950	    "dromedary_camel": "🐪",
+2951	    "e__mail": "📧",
+2952	    "corn": "🌽",
+2953	    "ear_of_rice": "🌾",
+2954	    "earth_americas": "🌎",
+2955	    "earth_asia": "🌏",
+2956	    "earth_africa": "🌍",
+2957	    "eight_pointed_black_star": "✴",
+2958	    "eight_spoked_asterisk": "✳",
+2959	    "eject_symbol": "⏏",
+2960	    "bulb": "💡",
+2961	    "emoji_modifier_fitzpatrick_type__1__2": "🏻",
+2962	    "emoji_modifier_fitzpatrick_type__3": "🏼",
+2963	    "emoji_modifier_fitzpatrick_type__4": "🏽",
+2964	    "emoji_modifier_fitzpatrick_type__5": "🏾",
+2965	    "emoji_modifier_fitzpatrick_type__6": "🏿",
+2966	    "end": "🔚",
+2967	    "email": "✉",
+2968	    "european_castle": "🏰",
+2969	    "european_post_office": "🏤",
+2970	    "interrobang": "⁉",
+2971	    "expressionless": "😑",
+2972	    "eyeglasses": "👓",
+2973	    "massage": "💆",
+2974	    "yum": "😋",
+2975	    "scream": "😱",
+2976	    "kissing_heart": "😘",
+2977	    "sweat": "😓",
+2978	    "face_with_head__bandage": "🤕",
+2979	    "triumph": "😤",
+2980	    "mask": "😷",
+2981	    "no_good": "🙅",
+2982	    "ok_woman": "🙆",
+2983	    "open_mouth": "😮",
+2984	    "cold_sweat": "😰",
+2985	    "stuck_out_tongue": "😛",
+2986	    "stuck_out_tongue_closed_eyes": "😝",
+2987	    "stuck_out_tongue_winking_eye": "😜",
+2988	    "joy": "😂",
+2989	    "no_mouth": "😶",
+2990	    "santa": "🎅",
+2991	    "fax": "📠",
+2992	    "fearful": "😨",
+2993	    "field_hockey_stick_and_ball": "🏑",
+2994	    "first_quarter_moon_with_face": "🌛",
+2995	    "fish_cake": "🍥",
+2996	    "fishing_pole_and_fish": "🎣",
+2997	    "facepunch": "👊",
+2998	    "punch": "👊",
+2999	    "flag_for_afghanistan": "🇦🇫",
+3000	    "flag_for_albania": "🇦🇱",
+3001	    "flag_for_algeria": "🇩🇿",
+3002	    "flag_for_american_samoa": "🇦🇸",
+3003	    "flag_for_andorra": "🇦🇩",
+3004	    "flag_for_angola": "🇦🇴",
+3005	    "flag_for_anguilla": "🇦🇮",
+3006	    "flag_for_antarctica": "🇦🇶",
+3007	    "flag_for_antigua_&_barbuda": "🇦🇬",
+3008	    "flag_for_argentina": "🇦🇷",
+3009	    "flag_for_armenia": "🇦🇲",
+3010	    "flag_for_aruba": "🇦🇼",
+3011	    "flag_for_ascension_island": "🇦🇨",
+3012	    "flag_for_australia": "🇦🇺",
+3013	    "flag_for_austria": "🇦🇹",
+3014	    "flag_for_azerbaijan": "🇦🇿",
+3015	    "flag_for_bahamas": "🇧🇸",
+3016	    "flag_for_bahrain": "🇧🇭",
+3017	    "flag_for_bangladesh": "🇧🇩",
+3018	    "flag_for_barbados": "🇧🇧",
+3019	    "flag_for_belarus": "🇧🇾",
+3020	    "flag_for_belgium": "🇧🇪",
+3021	    "flag_for_belize": "🇧🇿",
+3022	    "flag_for_benin": "🇧🇯",
+3023	    "flag_for_bermuda": "🇧🇲",
+3024	    "flag_for_bhutan": "🇧🇹",
+3025	    "flag_for_bolivia": "🇧🇴",
+3026	    "flag_for_bosnia_&_herzegovina": "🇧🇦",
+3027	    "flag_for_botswana": "🇧🇼",
+3028	    "flag_for_bouvet_island": "🇧🇻",
+3029	    "flag_for_brazil": "🇧🇷",
+3030	    "flag_for_british_indian_ocean_territory": "🇮🇴",
+3031	    "flag_for_british_virgin_islands": "🇻🇬",
+3032	    "flag_for_brunei": "🇧🇳",
+3033	    "flag_for_bulgaria": "🇧🇬",
+3034	    "flag_for_burkina_faso": "🇧🇫",
+3035	    "flag_for_burundi": "🇧🇮",
+3036	    "flag_for_cambodia": "🇰🇭",
+3037	    "flag_for_cameroon": "🇨🇲",
+3038	    "flag_for_canada": "🇨🇦",
+3039	    "flag_for_canary_islands": "🇮🇨",
+3040	    "flag_for_cape_verde": "🇨🇻",
+3041	    "flag_for_caribbean_netherlands": "🇧🇶",
+3042	    "flag_for_cayman_islands": "🇰🇾",
+3043	    "flag_for_central_african_republic": "🇨🇫",
+3044	    "flag_for_ceuta_&_melilla": "🇪🇦",
+3045	    "flag_for_chad": "🇹🇩",
+3046	    "flag_for_chile": "🇨🇱",
+3047	    "flag_for_china": "🇨🇳",
+3048	    "flag_for_christmas_island": "🇨🇽",
+3049	    "flag_for_clipperton_island": "🇨🇵",
+3050	    "flag_for_cocos__islands": "🇨🇨",
+3051	    "flag_for_colombia": "🇨🇴",
+3052	    "flag_for_comoros": "🇰🇲",
+3053	    "flag_for_congo____brazzaville": "🇨🇬",
+3054	    "flag_for_congo____kinshasa": "🇨🇩",
+3055	    "flag_for_cook_islands": "🇨🇰",
+3056	    "flag_for_costa_rica": "🇨🇷",
+3057	    "flag_for_croatia": "🇭🇷",
+3058	    "flag_for_cuba": "🇨🇺",
+3059	    "flag_for_curaçao": "🇨🇼",
+3060	    "flag_for_cyprus": "🇨🇾",
+3061	    "flag_for_czech_republic": "🇨🇿",
+3062	    "flag_for_côte_d’ivoire": "🇨🇮",
+3063	    "flag_for_denmark": "🇩🇰",
+3064	    "flag_for_diego_garcia": "🇩🇬",
+3065	    "flag_for_djibouti": "🇩🇯",
+3066	    "flag_for_dominica": "🇩🇲",
+3067	    "flag_for_dominican_republic": "🇩🇴",
+3068	    "flag_for_ecuador": "🇪🇨",
+3069	    "flag_for_egypt": "🇪🇬",
+3070	    "flag_for_el_salvador": "🇸🇻",
+3071	    "flag_for_equatorial_guinea": "🇬🇶",
+3072	    "flag_for_eritrea": "🇪🇷",
+3073	    "flag_for_estonia": "🇪🇪",
+3074	    "flag_for_ethiopia": "🇪🇹",
+3075	    "flag_for_european_union": "🇪🇺",
+3076	    "flag_for_falkland_islands": "🇫🇰",
+3077	    "flag_for_faroe_islands": "🇫🇴",
+3078	    "flag_for_fiji": "🇫🇯",
+3079	    "flag_for_finland": "🇫🇮",
+3080	    "flag_for_france": "🇫🇷",
+3081	    "flag_for_french_guiana": "🇬🇫",
+3082	    "flag_for_french_polynesia": "🇵🇫",
+3083	    "flag_for_french_southern_territories": "🇹🇫",
+3084	    "flag_for_gabon": "🇬🇦",
+3085	    "flag_for_gambia": "🇬🇲",
+3086	    "flag_for_georgia": "🇬🇪",
+3087	    "flag_for_germany": "🇩🇪",
+3088	    "flag_for_ghana": "🇬🇭",
+3089	    "flag_for_gibraltar": "🇬🇮",
+3090	    "flag_for_greece": "🇬🇷",
+3091	    "flag_for_greenland": "🇬🇱",
+3092	    "flag_for_grenada": "🇬🇩",
+3093	    "flag_for_guadeloupe": "🇬🇵",
+3094	    "flag_for_guam": "🇬🇺",
+3095	    "flag_for_guatemala": "🇬🇹",
+3096	    "flag_for_guernsey": "🇬🇬",
+3097	    "flag_for_guinea": "🇬🇳",
+3098	    "flag_for_guinea__bissau": "🇬🇼",
+3099	    "flag_for_guyana": "🇬🇾",
+3100	    "flag_for_haiti": "🇭🇹",
+3101	    "flag_for_heard_&_mcdonald_islands": "🇭🇲",
+3102	    "flag_for_honduras": "🇭🇳",
+3103	    "flag_for_hong_kong": "🇭🇰",
+3104	    "flag_for_hungary": "🇭🇺",
+3105	    "flag_for_iceland": "🇮🇸",
+3106	    "flag_for_india": "🇮🇳",
+3107	    "flag_for_indonesia": "🇮🇩",
+3108	    "flag_for_iran": "🇮🇷",
+3109	    "flag_for_iraq": "🇮🇶",
+3110	    "flag_for_ireland": "🇮🇪",
+3111	    "flag_for_isle_of_man": "🇮🇲",
+3112	    "flag_for_israel": "🇮🇱",
+3113	    "flag_for_italy": "🇮🇹",
+3114	    "flag_for_jamaica": "🇯🇲",
+3115	    "flag_for_japan": "🇯🇵",
+3116	    "flag_for_jersey": "🇯🇪",
+3117	    "flag_for_jordan": "🇯🇴",
+3118	    "flag_for_kazakhstan": "🇰🇿",
+3119	    "flag_for_kenya": "🇰🇪",
+3120	    "flag_for_kiribati": "🇰🇮",
+3121	    "flag_for_kosovo": "🇽🇰",
+3122	    "flag_for_kuwait": "🇰🇼",
+3123	    "flag_for_kyrgyzstan": "🇰🇬",
+3124	    "flag_for_laos": "🇱🇦",
+3125	    "flag_for_latvia": "🇱🇻",
+3126	    "flag_for_lebanon": "🇱🇧",
+3127	    "flag_for_lesotho": "🇱🇸",
+3128	    "flag_for_liberia": "🇱🇷",
+3129	    "flag_for_libya": "🇱🇾",
+3130	    "flag_for_liechtenstein": "🇱🇮",
+3131	    "flag_for_lithuania": "🇱🇹",
+3132	    "flag_for_luxembourg": "🇱🇺",
+3133	    "flag_for_macau": "🇲🇴",
+3134	    "flag_for_macedonia": "🇲🇰",
+3135	    "flag_for_madagascar": "🇲🇬",
+3136	    "flag_for_malawi": "🇲🇼",
+3137	    "flag_for_malaysia": "🇲🇾",
+3138	    "flag_for_maldives": "🇲🇻",
+3139	    "flag_for_mali": "🇲🇱",
+3140	    "flag_for_malta": "🇲🇹",
+3141	    "flag_for_marshall_islands": "🇲🇭",
+3142	    "flag_for_martinique": "🇲🇶",
+3143	    "flag_for_mauritania": "🇲🇷",
+3144	    "flag_for_mauritius": "🇲🇺",
+3145	    "flag_for_mayotte": "🇾🇹",
+3146	    "flag_for_mexico": "🇲🇽",
+3147	    "flag_for_micronesia": "🇫🇲",
+3148	    "flag_for_moldova": "🇲🇩",
+3149	    "flag_for_monaco": "🇲🇨",
+3150	    "flag_for_mongolia": "🇲🇳",
+3151	    "flag_for_montenegro": "🇲🇪",
+3152	    "flag_for_montserrat": "🇲🇸",
+3153	    "flag_for_morocco": "🇲🇦",
+3154	    "flag_for_mozambique": "🇲🇿",
+3155	    "flag_for_myanmar": "🇲🇲",
+3156	    "flag_for_namibia": "🇳🇦",
+3157	    "flag_for_nauru": "🇳🇷",
+3158	    "flag_for_nepal": "🇳🇵",
+3159	    "flag_for_netherlands": "🇳🇱",
+3160	    "flag_for_new_caledonia": "🇳🇨",
+3161	    "flag_for_new_zealand": "🇳🇿",
+3162	    "flag_for_nicaragua": "🇳🇮",
+3163	    "flag_for_niger": "🇳🇪",
+3164	    "flag_for_nigeria": "🇳🇬",
+3165	    "flag_for_niue": "🇳🇺",
+3166	    "flag_for_norfolk_island": "🇳🇫",
+3167	    "flag_for_north_korea": "🇰🇵",
+3168	    "flag_for_northern_mariana_islands": "🇲🇵",
+3169	    "flag_for_norway": "🇳🇴",
+3170	    "flag_for_oman": "🇴🇲",
+3171	    "flag_for_pakistan": "🇵🇰",
+3172	    "flag_for_palau": "🇵🇼",
+3173	    "flag_for_palestinian_territories": "🇵🇸",
+3174	    "flag_for_panama": "🇵🇦",
+3175	    "flag_for_papua_new_guinea": "🇵🇬",
+3176	    "flag_for_paraguay": "🇵🇾",
+3177	    "flag_for_peru": "🇵🇪",
+3178	    "flag_for_philippines": "🇵🇭",
+3179	    "flag_for_pitcairn_islands": "🇵🇳",
+3180	    "flag_for_poland": "🇵🇱",
+3181	    "flag_for_portugal": "🇵🇹",
+3182	    "flag_for_puerto_rico": "🇵🇷",
+3183	    "flag_for_qatar": "🇶🇦",
+3184	    "flag_for_romania": "🇷🇴",
+3185	    "flag_for_russia": "🇷🇺",
+3186	    "flag_for_rwanda": "🇷🇼",
+3187	    "flag_for_réunion": "🇷🇪",
+3188	    "flag_for_samoa": "🇼🇸",
+3189	    "flag_for_san_marino": "🇸🇲",
+3190	    "flag_for_saudi_arabia": "🇸🇦",
+3191	    "flag_for_senegal": "🇸🇳",
+3192	    "flag_for_serbia": "🇷🇸",
+3193	    "flag_for_seychelles": "🇸🇨",
+3194	    "flag_for_sierra_leone": "🇸🇱",
+3195	    "flag_for_singapore": "🇸🇬",
+3196	    "flag_for_sint_maarten": "🇸🇽",
+3197	    "flag_for_slovakia": "🇸🇰",
+3198	    "flag_for_slovenia": "🇸🇮",
+3199	    "flag_for_solomon_islands": "🇸🇧",
+3200	    "flag_for_somalia": "🇸🇴",
+3201	    "flag_for_south_africa": "🇿🇦",
+3202	    "flag_for_south_georgia_&_south_sandwich_islands": "🇬🇸",
+3203	    "flag_for_south_korea": "🇰🇷",
+3204	    "flag_for_south_sudan": "🇸🇸",
+3205	    "flag_for_spain": "🇪🇸",
+3206	    "flag_for_sri_lanka": "🇱🇰",
+3207	    "flag_for_st._barthélemy": "🇧🇱",
+3208	    "flag_for_st._helena": "🇸🇭",
+3209	    "flag_for_st._kitts_&_nevis": "🇰🇳",
+3210	    "flag_for_st._lucia": "🇱🇨",
+3211	    "flag_for_st._martin": "🇲🇫",
+3212	    "flag_for_st._pierre_&_miquelon": "🇵🇲",
+3213	    "flag_for_st._vincent_&_grenadines": "🇻🇨",
+3214	    "flag_for_sudan": "🇸🇩",
+3215	    "flag_for_suriname": "🇸🇷",
+3216	    "flag_for_svalbard_&_jan_mayen": "🇸🇯",
+3217	    "flag_for_swaziland": "🇸🇿",
+3218	    "flag_for_sweden": "🇸🇪",
+3219	    "flag_for_switzerland": "🇨🇭",
+3220	    "flag_for_syria": "🇸🇾",
+3221	    "flag_for_são_tomé_&_príncipe": "🇸🇹",
+3222	    "flag_for_taiwan": "🇹🇼",
+3223	    "flag_for_tajikistan": "🇹🇯",
+3224	    "flag_for_tanzania": "🇹🇿",
+3225	    "flag_for_thailand": "🇹🇭",
+3226	    "flag_for_timor__leste": "🇹🇱",
+3227	    "flag_for_togo": "🇹🇬",
+3228	    "flag_for_tokelau": "🇹🇰",
+3229	    "flag_for_tonga": "🇹🇴",
+3230	    "flag_for_trinidad_&_tobago": "🇹🇹",
+3231	    "flag_for_tristan_da_cunha": "🇹🇦",
+3232	    "flag_for_tunisia": "🇹🇳",
+3233	    "flag_for_turkey": "🇹🇷",
+3234	    "flag_for_turkmenistan": "🇹🇲",
+3235	    "flag_for_turks_&_caicos_islands": "🇹🇨",
+3236	    "flag_for_tuvalu": "🇹🇻",
+3237	    "flag_for_u.s._outlying_islands": "🇺🇲",
+3238	    "flag_for_u.s._virgin_islands": "🇻🇮",
+3239	    "flag_for_uganda": "🇺🇬",
+3240	    "flag_for_ukraine": "🇺🇦",
+3241	    "flag_for_united_arab_emirates": "🇦🇪",
+3242	    "flag_for_united_kingdom": "🇬🇧",
+3243	    "flag_for_united_states": "🇺🇸",
+3244	    "flag_for_uruguay": "🇺🇾",
+3245	    "flag_for_uzbekistan": "🇺🇿",
+3246	    "flag_for_vanuatu": "🇻🇺",
+3247	    "flag_for_vatican_city": "🇻🇦",
+3248	    "flag_for_venezuela": "🇻🇪",
+3249	    "flag_for_vietnam": "🇻🇳",
+3250	    "flag_for_wallis_&_futuna": "🇼🇫",
+3251	    "flag_for_western_sahara": "🇪🇭",
+3252	    "flag_for_yemen": "🇾🇪",
+3253	    "flag_for_zambia": "🇿🇲",
+3254	    "flag_for_zimbabwe": "🇿🇼",
+3255	    "flag_for_åland_islands": "🇦🇽",
+3256	    "golf": "⛳",
+3257	    "fleur__de__lis": "⚜",
+3258	    "muscle": "💪",
+3259	    "flushed": "😳",
+3260	    "frame_with_picture": "🖼",
+3261	    "fries": "🍟",
+3262	    "frog": "🐸",
+3263	    "hatched_chick": "🐥",
+3264	    "frowning": "😦",
+3265	    "fuelpump": "⛽",
+3266	    "full_moon_with_face": "🌝",
+3267	    "gem": "💎",
+3268	    "star2": "🌟",
+3269	    "golfer": "🏌",
+3270	    "mortar_board": "🎓",
+3271	    "grimacing": "😬",
+3272	    "smile_cat": "😸",
+3273	    "grinning": "😀",
+3274	    "grin": "😁",
+3275	    "heartpulse": "💗",
+3276	    "guardsman": "💂",
+3277	    "haircut": "💇",
+3278	    "hamster": "🐹",
+3279	    "raising_hand": "🙋",
+3280	    "headphones": "🎧",
+3281	    "hear_no_evil": "🙉",
+3282	    "cupid": "💘",
+3283	    "gift_heart": "💝",
+3284	    "heart": "❤",
+3285	    "exclamation": "❗",
+3286	    "heavy_exclamation_mark": "❗",
+3287	    "heavy_heart_exclamation_mark_ornament": "❣",
+3288	    "o": "⭕",
+3289	    "helm_symbol": "⎈",
+3290	    "helmet_with_white_cross": "⛑",
+3291	    "high_heel": "👠",
+3292	    "bullettrain_side": "🚄",
+3293	    "bullettrain_front": "🚅",
+3294	    "high_brightness": "🔆",
+3295	    "zap": "⚡",
+3296	    "hocho": "🔪",
+3297	    "knife": "🔪",
+3298	    "bee": "🐝",
+3299	    "traffic_light": "🚥",
+3300	    "racehorse": "🐎",
+3301	    "coffee": "☕",
+3302	    "hotsprings": "♨",
+3303	    "hourglass": "⌛",
+3304	    "hourglass_flowing_sand": "⏳",
+3305	    "house_buildings": "🏘",
+3306	    "100": "💯",
+3307	    "hushed": "😯",
+3308	    "ice_hockey_stick_and_puck": "🏒",
+3309	    "imp": "👿",
+3310	    "information_desk_person": "💁",
+3311	    "information_source": "ℹ",
+3312	    "capital_abcd": "🔠",
+3313	    "abc": "🔤",
+3314	    "abcd": "🔡",
+3315	    "1234": "🔢",
+3316	    "symbols": "🔣",
+3317	    "izakaya_lantern": "🏮",
+3318	    "lantern": "🏮",
+3319	    "jack_o_lantern": "🎃",
+3320	    "dolls": "🎎",
+3321	    "japanese_goblin": "👺",
+3322	    "japanese_ogre": "👹",
+3323	    "beginner": "🔰",
+3324	    "zero": "0️⃣",
+3325	    "one": "1️⃣",
+3326	    "ten": "🔟",
+3327	    "two": "2️⃣",
+3328	    "three": "3️⃣",
+3329	    "four": "4️⃣",
+3330	    "five": "5️⃣",
+3331	    "six": "6️⃣",
+3332	    "seven": "7️⃣",
+3333	    "eight": "8️⃣",
+3334	    "nine": "9️⃣",
+3335	    "couplekiss": "💏",
+3336	    "kissing_cat": "😽",
+3337	    "kissing": "😗",
+3338	    "kissing_closed_eyes": "😚",
+3339	    "kissing_smiling_eyes": "😙",
+3340	    "beetle": "🐞",
+3341	    "large_blue_circle": "🔵",
+3342	    "last_quarter_moon_with_face": "🌜",
+3343	    "leaves": "🍃",
+3344	    "mag": "🔍",
+3345	    "left_right_arrow": "↔",
+3346	    "leftwards_arrow_with_hook": "↩",
+3347	    "arrow_left": "⬅",
+3348	    "lock": "🔒",
+3349	    "lock_with_ink_pen": "🔏",
+3350	    "sob": "😭",
+3351	    "low_brightness": "🔅",
+3352	    "lower_left_ballpoint_pen": "🖊",
+3353	    "lower_left_crayon": "🖍",
+3354	    "lower_left_fountain_pen": "🖋",
+3355	    "lower_left_paintbrush": "🖌",
+3356	    "mahjong": "🀄",
+3357	    "couple": "👫",
+3358	    "man_in_business_suit_levitating": "🕴",
+3359	    "man_with_gua_pi_mao": "👲",
+3360	    "man_with_turban": "👳",
+3361	    "mans_shoe": "👞",
+3362	    "shoe": "👞",
+3363	    "menorah_with_nine_branches": "🕎",
+3364	    "mens": "🚹",
+3365	    "minidisc": "💽",
+3366	    "iphone": "📱",
+3367	    "calling": "📲",
+3368	    "money__mouth_face": "🤑",
+3369	    "moneybag": "💰",
+3370	    "rice_scene": "🎑",
+3371	    "mountain_bicyclist": "🚵",
+3372	    "mouse2": "🐁",
+3373	    "lips": "👄",
+3374	    "moyai": "🗿",
+3375	    "notes": "🎶",
+3376	    "nail_care": "💅",
+3377	    "ab": "🆎",
+3378	    "negative_squared_cross_mark": "❎",
+3379	    "a": "🅰",
+3380	    "b": "🅱",
+3381	    "o2": "🅾",
+3382	    "parking": "🅿",
+3383	    "new_moon_with_face": "🌚",
+3384	    "no_entry_sign": "🚫",
+3385	    "underage": "🔞",
+3386	    "non__potable_water": "🚱",
+3387	    "arrow_upper_right": "↗",
+3388	    "arrow_upper_left": "↖",
+3389	    "office": "🏢",
+3390	    "older_man": "👴",
+3391	    "older_woman": "👵",
+3392	    "om_symbol": "🕉",
+3393	    "on": "🔛",
+3394	    "book": "📖",
+3395	    "unlock": "🔓",
+3396	    "mailbox_with_no_mail": "📭",
+3397	    "mailbox_with_mail": "📬",
+3398	    "cd": "💿",
+3399	    "tada": "🎉",
+3400	    "feet": "🐾",
+3401	    "walking": "🚶",
+3402	    "pencil2": "✏",
+3403	    "pensive": "😔",
+3404	    "persevere": "😣",
+3405	    "bow": "🙇",
+3406	    "raised_hands": "🙌",
+3407	    "person_with_ball": "⛹",
+3408	    "person_with_blond_hair": "👱",
+3409	    "pray": "🙏",
+3410	    "person_with_pouting_face": "🙎",
+3411	    "computer": "💻",
+3412	    "pig2": "🐖",
+3413	    "hankey": "💩",
+3414	    "poop": "💩",
+3415	    "shit": "💩",
+3416	    "bamboo": "🎍",
+3417	    "gun": "🔫",
+3418	    "black_joker": "🃏",
+3419	    "rotating_light": "🚨",
+3420	    "cop": "👮",
+3421	    "stew": "🍲",
+3422	    "pouch": "👝",
+3423	    "pouting_cat": "😾",
+3424	    "rage": "😡",
+3425	    "put_litter_in_its_place": "🚮",
+3426	    "rabbit2": "🐇",
+3427	    "racing_motorcycle": "🏍",
+3428	    "radioactive_sign": "☢",
+3429	    "fist": "✊",
+3430	    "hand": "✋",
+3431	    "raised_hand_with_fingers_splayed": "🖐",
+3432	    "raised_hand_with_part_between_middle_and_ring_fingers": "🖖",
+3433	    "blue_car": "🚙",
+3434	    "apple": "🍎",
+3435	    "relieved": "😌",
+3436	    "reversed_hand_with_middle_finger_extended": "🖕",
+3437	    "mag_right": "🔎",
+3438	    "arrow_right_hook": "↪",
+3439	    "sweet_potato": "🍠",
+3440	    "robot": "🤖",
+3441	    "rolled__up_newspaper": "🗞",
+3442	    "rowboat": "🚣",
+3443	    "runner": "🏃",
+3444	    "running": "🏃",
+3445	    "running_shirt_with_sash": "🎽",
+3446	    "boat": "⛵",
+3447	    "scales": "⚖",
+3448	    "school_satchel": "🎒",
+3449	    "scorpius": "♏",
+3450	    "see_no_evil": "🙈",
+3451	    "sheep": "🐑",
+3452	    "stars": "🌠",
+3453	    "cake": "🍰",
+3454	    "six_pointed_star": "🔯",
+3455	    "ski": "🎿",
+3456	    "sleeping_accommodation": "🛌",
+3457	    "sleeping": "😴",
+3458	    "sleepy": "😪",
+3459	    "sleuth_or_spy": "🕵",
+3460	    "heart_eyes_cat": "😻",
+3461	    "smiley_cat": "😺",
+3462	    "innocent": "😇",
+3463	    "heart_eyes": "😍",
+3464	    "smiling_imp": "😈",
+3465	    "smiley": "😃",
+3466	    "sweat_smile": "😅",
+3467	    "smile": "😄",
+3468	    "laughing": "😆",
+3469	    "satisfied": "😆",
+3470	    "blush": "😊",
+3471	    "smirk": "😏",
+3472	    "smoking": "🚬",
+3473	    "snow_capped_mountain": "🏔",
+3474	    "soccer": "⚽",
+3475	    "icecream": "🍦",
+3476	    "soon": "🔜",
+3477	    "arrow_lower_right": "↘",
+3478	    "arrow_lower_left": "↙",
+3479	    "speak_no_evil": "🙊",
+3480	    "speaker": "🔈",
+3481	    "mute": "🔇",
+3482	    "sound": "🔉",
+3483	    "loud_sound": "🔊",
+3484	    "speaking_head_in_silhouette": "🗣",
+3485	    "spiral_calendar_pad": "🗓",
+3486	    "spiral_note_pad": "🗒",
+3487	    "shell": "🐚",
+3488	    "sweat_drops": "💦",
+3489	    "u5272": "🈹",
+3490	    "u5408": "🈴",
+3491	    "u55b6": "🈺",
+3492	    "u6307": "🈯",
+3493	    "u6708": "🈷",
+3494	    "u6709": "🈶",
+3495	    "u6e80": "🈵",
+3496	    "u7121": "🈚",
+3497	    "u7533": "🈸",
+3498	    "u7981": "🈲",
+3499	    "u7a7a": "🈳",
+3500	    "cl": "🆑",
+3501	    "cool": "🆒",
+3502	    "free": "🆓",
+3503	    "id": "🆔",
+3504	    "koko": "🈁",
+3505	    "sa": "🈂",
+3506	    "new": "🆕",
+3507	    "ng": "🆖",
+3508	    "ok": "🆗",
+3509	    "sos": "🆘",
+3510	    "up": "🆙",
+3511	    "vs": "🆚",
+3512	    "steam_locomotive": "🚂",
+3513	    "ramen": "🍜",
+3514	    "partly_sunny": "⛅",
+3515	    "city_sunrise": "🌇",
+3516	    "surfer": "🏄",
+3517	    "swimmer": "🏊",
+3518	    "shirt": "👕",
+3519	    "tshirt": "👕",
+3520	    "table_tennis_paddle_and_ball": "🏓",
+3521	    "tea": "🍵",
+3522	    "tv": "📺",
+3523	    "three_button_mouse": "🖱",
+3524	    "+1": "👍",
+3525	    "thumbsup": "👍",
+3526	    "__1": "👎",
+3527	    "-1": "👎",
+3528	    "thumbsdown": "👎",
+3529	    "thunder_cloud_and_rain": "⛈",
+3530	    "tiger2": "🐅",
+3531	    "tophat": "🎩",
+3532	    "top": "🔝",
+3533	    "tm": "™",
+3534	    "train2": "🚆",
+3535	    "triangular_flag_on_post": "🚩",
+3536	    "trident": "🔱",
+3537	    "twisted_rightwards_arrows": "🔀",
+3538	    "unamused": "😒",
+3539	    "small_red_triangle": "🔺",
+3540	    "arrow_up_small": "🔼",
+3541	    "arrow_up_down": "↕",
+3542	    "upside__down_face": "🙃",
+3543	    "arrow_up": "⬆",
+3544	    "v": "✌",
+3545	    "vhs": "📼",
+3546	    "wc": "🚾",
+3547	    "ocean": "🌊",
+3548	    "waving_black_flag": "🏴",
+3549	    "wave": "👋",
+3550	    "waving_white_flag": "🏳",
+3551	    "moon": "🌔",
+3552	    "scream_cat": "🙀",
+3553	    "weary": "😩",
+3554	    "weight_lifter": "🏋",
+3555	    "whale2": "🐋",
+3556	    "wheelchair": "♿",
+3557	    "point_down": "👇",
+3558	    "grey_exclamation": "❕",
+3559	    "white_frowning_face": "☹",
+3560	    "white_check_mark": "✅",
+3561	    "point_left": "👈",
+3562	    "white_medium_small_square": "◽",
+3563	    "star": "⭐",
+3564	    "grey_question": "❔",
+3565	    "point_right": "👉",
+3566	    "relaxed": "☺",
+3567	    "white_sun_behind_cloud": "🌥",
+3568	    "white_sun_behind_cloud_with_rain": "🌦",
+3569	    "white_sun_with_small_cloud": "🌤",
+3570	    "point_up_2": "👆",
+3571	    "point_up": "☝",
+3572	    "wind_blowing_face": "🌬",
+3573	    "wink": "😉",
+3574	    "wolf": "🐺",
+3575	    "dancers": "👯",
+3576	    "boot": "👢",
+3577	    "womans_clothes": "👚",
+3578	    "womans_hat": "👒",
+3579	    "sandal": "👡",
+3580	    "womens": "🚺",
+3581	    "worried": "😟",
+3582	    "gift": "🎁",
+3583	    "zipper__mouth_face": "🤐",
+3584	    "regional_indicator_a": "🇦",
+3585	    "regional_indicator_b": "🇧",
+3586	    "regional_indicator_c": "🇨",
+3587	    "regional_indicator_d": "🇩",
+3588	    "regional_indicator_e": "🇪",
+3589	    "regional_indicator_f": "🇫",
+3590	    "regional_indicator_g": "🇬",
+3591	    "regional_indicator_h": "🇭",
+3592	    "regional_indicator_i": "🇮",
+3593	    "regional_indicator_j": "🇯",
+3594	    "regional_indicator_k": "🇰",
+3595	    "regional_indicator_l": "🇱",
+3596	    "regional_indicator_m": "🇲",
+3597	    "regional_indicator_n": "🇳",
+3598	    "regional_indicator_o": "🇴",
+3599	    "regional_indicator_p": "🇵",
+3600	    "regional_indicator_q": "🇶",
+3601	    "regional_indicator_r": "🇷",
+3602	    "regional_indicator_s": "🇸",
+3603	    "regional_indicator_t": "🇹",
+3604	    "regional_indicator_u": "🇺",
+3605	    "regional_indicator_v": "🇻",
+3606	    "regional_indicator_w": "🇼",
+3607	    "regional_indicator_x": "🇽",
+3608	    "regional_indicator_y": "🇾",
+3609	    "regional_indicator_z": "🇿",
+3610	}
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/_pick.py
+ Line number: 13
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+12	    """
+13	    assert values, "1 or more values required"
+14	    for value in values:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/_ratio.py
+ Line number: 123
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+122	    total_ratio = sum(ratios)
+123	    assert total_ratio > 0, "Sum of ratios must be > 0"
+124	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/_unicode_data/__init__.py
+ Line number: 92
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+91	    if TYPE_CHECKING:
+92	        assert isinstance(module.cell_table, CellTable)
+93	    return module.cell_table
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/_win32_console.py
+ Line number: 435
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+434	
+435	        assert fore is not None
+436	        assert back is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/_win32_console.py
+ Line number: 436
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+435	        assert fore is not None
+436	        assert back is not None
+437	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/_win32_console.py
+ Line number: 565
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+564	        """
+565	        assert len(title) < 255, "Console title must be less than 255 characters"
+566	        SetConsoleTitle(title)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 365
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+364	        if self.type == ColorType.TRUECOLOR:
+365	            assert self.triplet is not None
+366	            return self.triplet
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 368
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+367	        elif self.type == ColorType.EIGHT_BIT:
+368	            assert self.number is not None
+369	            return EIGHT_BIT_PALETTE[self.number]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 371
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+370	        elif self.type == ColorType.STANDARD:
+371	            assert self.number is not None
+372	            return theme.ansi_colors[self.number]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 374
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+373	        elif self.type == ColorType.WINDOWS:
+374	            assert self.number is not None
+375	            return WINDOWS_PALETTE[self.number]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 377
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+376	        else:  # self.type == ColorType.DEFAULT:
+377	            assert self.number is None
+378	            return theme.foreground_color if foreground else theme.background_color
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 493
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+492	            number = self.number
+493	            assert number is not None
+494	            fore, back = (30, 40) if number < 8 else (82, 92)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 499
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+498	            number = self.number
+499	            assert number is not None
+500	            fore, back = (30, 40) if number < 8 else (82, 92)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 504
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+503	        elif _type == ColorType.EIGHT_BIT:
+504	            assert self.number is not None
+505	            return ("38" if foreground else "48", "5", str(self.number))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 508
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+507	        else:  # self.standard == ColorStandard.TRUECOLOR:
+508	            assert self.triplet is not None
+509	            red, green, blue = self.triplet
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 520
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+519	        if system == ColorSystem.EIGHT_BIT and self.system == ColorSystem.TRUECOLOR:
+520	            assert self.triplet is not None
+521	            _h, l, s = rgb_to_hls(*self.triplet.normalized)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 546
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+545	            if self.system == ColorSystem.TRUECOLOR:
+546	                assert self.triplet is not None
+547	                triplet = self.triplet
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 549
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+548	            else:  # self.system == ColorSystem.EIGHT_BIT
+549	                assert self.number is not None
+550	                triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 557
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+556	            if self.system == ColorSystem.TRUECOLOR:
+557	                assert self.triplet is not None
+558	                triplet = self.triplet
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 560
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+559	            else:  # self.system == ColorSystem.EIGHT_BIT
+560	                assert self.number is not None
+561	                if self.number < 16:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 573
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+572	    """Parse six hex characters in to RGB triplet."""
+573	    assert len(hex_color) == 6, "must be 6 characters"
+574	    color = ColorTriplet(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/console.py
+ Line number: 1149
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1148	
+1149	        assert count >= 0, "count must be >= 0"
+1150	        self.print(NewLine(count))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/console.py
+ Line number: 1929
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1928	                offset -= 1
+1929	            assert frame is not None
+1930	            return frame.f_code.co_filename, frame.f_lineno, frame.f_locals
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/console.py
+ Line number: 2189
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2188	        """
+2189	        assert (
+2190	            self.record
+2191	        ), "To export console contents set record=True in the constructor or instance"
+2192	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/console.py
+ Line number: 2245
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2244	        """
+2245	        assert (
+2246	            self.record
+2247	        ), "To export console contents set record=True in the constructor or instance"
+2248	        fragments: List[str] = []
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/live.py
+ Line number: 71
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+70	    ) -> None:
+71	        assert refresh_per_second > 0, "refresh_per_second must be > 0"
+72	        self._renderable = renderable
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/rich/live.py
+ Line number: 381
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+380	                time.sleep(0.4)
+381	                if random.randint(0, 10) < 1:
+382	                    console.log(next(examples))
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/rich/live.py
+ Line number: 384
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+383	                exchange_rate_dict[(select_exchange, exchange)] = 200 / (
+384	                    (random.random() * 320) + 1
+385	                )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/logging.py
+ Line number: 142
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+141	            exc_type, exc_value, exc_traceback = record.exc_info
+142	            assert exc_type is not None
+143	            assert exc_value is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/logging.py
+ Line number: 143
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+142	            assert exc_type is not None
+143	            assert exc_value is not None
+144	            traceback = Traceback.from_exception(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/markdown.py
+ Line number: 279
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+278	    def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool:
+279	        assert isinstance(child, TableRowElement)
+280	        self.row = child
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/markdown.py
+ Line number: 291
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+290	    def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool:
+291	        assert isinstance(child, TableRowElement)
+292	        self.rows.append(child)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/markdown.py
+ Line number: 303
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+302	    def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool:
+303	        assert isinstance(child, TableDataElement)
+304	        self.cells.append(child)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/markdown.py
+ Line number: 326
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+325	
+326	        assert justify in get_args(JustifyMethod)
+327	        return cls(justify=justify)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/markdown.py
+ Line number: 352
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+351	    def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool:
+352	        assert isinstance(child, ListItem)
+353	        self.items.append(child)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/markdown.py
+ Line number: 623
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+622	                    element = context.stack.pop()
+623	                    assert isinstance(element, Link)
+624	                    link_style = console.get_style("markdown.link", default="none")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/pretty.py
+ Line number: 198
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+197	    console = console or get_console()
+198	    assert console is not None
+199	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/pretty.py
+ Line number: 203
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+202	        if value is not None:
+203	            assert console is not None
+204	            builtins._ = None  # type: ignore[attr-defined]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/pretty.py
+ Line number: 516
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+515	        )
+516	        assert self.node is not None
+517	        return self.node.check_length(start_length, max_length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/pretty.py
+ Line number: 522
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+521	        node = self.node
+522	        assert node is not None
+523	        whitespace = self.whitespace
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/pretty.py
+ Line number: 524
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+523	        whitespace = self.whitespace
+524	        assert node.children
+525	        if node.key_repr:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/pretty.py
+ Line number: 661
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+660	                    rich_repr_result = obj.__rich_repr__()
+661	            except Exception:
+662	                pass
+663	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/progress.py
+ Line number: 1091
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1090	    ) -> None:
+1091	        assert refresh_per_second > 0, "refresh_per_second must be > 0"
+1092	        self._lock = RLock()
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/rich/progress.py
+ Line number: 1715
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+1714	            time.sleep(0.01)
+1715	            if random.randint(0, 100) < 1:
+1716	                progress.log(next(examples))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/prompt.py
+ Line number: 222
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+221	        """
+222	        assert self.choices is not None
+223	        if self.case_sensitive:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/segment.py
+ Line number: 171
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+170	        text, style, control = self
+171	        assert cut >= 0
+172	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with dumps module.
+ Test ID: B403
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/rich/style.py
+ Line number: 4
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b403-import-pickle
+ +
+
+3	from operator import attrgetter
+4	from pickle import dumps, loads
+5	from random import randint
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/rich/style.py
+ Line number: 198
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+197	        self._link_id = (
+198	            f"{randint(0, 999999)}{hash(self._meta)}" if (link or meta) else ""
+199	        )
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/rich/style.py
+ Line number: 248
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+247	        style._meta = dumps(meta)
+248	        style._link_id = f"{randint(0, 999999)}{hash(style._meta)}"
+249	        style._hash = None
+
+
+ + +
+
+ +
+
+ blacklist: Pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue.
+ Test ID: B301
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/rich/style.py
+ Line number: 471
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b301-pickle
+ +
+
+470	        """Get meta information (can not be changed after construction)."""
+471	        return {} if self._meta is None else cast(Dict[str, Any], loads(self._meta))
+472	
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/rich/style.py
+ Line number: 486
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+485	        style._link = self._link
+486	        style._link_id = f"{randint(0, 999999)}" if self._link else ""
+487	        style._null = False
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/rich/style.py
+ Line number: 638
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+637	        style._link = self._link
+638	        style._link_id = f"{randint(0, 999999)}" if self._link else ""
+639	        style._hash = self._hash
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/rich/style.py
+ Line number: 684
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+683	        style._link = link
+684	        style._link_id = f"{randint(0, 999999)}" if link else ""
+685	        style._hash = None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/syntax.py
+ Line number: 507
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+506	                    """Split tokens to one per line."""
+507	                    assert lexer  # required to make MyPy happy - we know lexer is not None at this point
+508	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/text.py
+ Line number: 907
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+906	        """
+907	        assert len(character) == 1, "Character must be a string of length 1"
+908	        if count:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/text.py
+ Line number: 924
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+923	        """
+924	        assert len(character) == 1, "Character must be a string of length 1"
+925	        if count:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/text.py
+ Line number: 940
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+939	        """
+940	        assert len(character) == 1, "Character must be a string of length 1"
+941	        if count:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/text.py
+ Line number: 1079
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1078	        """
+1079	        assert separator, "separator must not be empty"
+1080	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/traceback.py
+ Line number: 342
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+341	            if not isinstance(suppress_entity, str):
+342	                assert (
+343	                    suppress_entity.__file__ is not None
+344	                ), f"{suppress_entity!r} must be a module with '__file__' attribute"
+345	                path = os.path.dirname(suppress_entity.__file__)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/traceback.py
+ Line number: 798
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+797	            if excluded:
+798	                assert exclude_frames is not None
+799	                yield Text(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 1885
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1884	            if TYPE_CHECKING:
+1885	                assert is_sql_compiler(self.compiled)
+1886	                assert isinstance(self.compiled.compile_state, DMLState)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 1886
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1885	                assert is_sql_compiler(self.compiled)
+1886	                assert isinstance(self.compiled.compile_state, DMLState)
+1887	                assert isinstance(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 1887
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1886	                assert isinstance(self.compiled.compile_state, DMLState)
+1887	                assert isinstance(
+1888	                    self.compiled.compile_state.dml_table, TableClause
+1889	                )
+1890	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 1969
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1968	            if TYPE_CHECKING:
+1969	                assert is_sql_compiler(self.compiled)
+1970	                assert isinstance(self.compiled.compile_state, DMLState)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 1970
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1969	                assert is_sql_compiler(self.compiled)
+1970	                assert isinstance(self.compiled.compile_state, DMLState)
+1971	                assert isinstance(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 1971
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1970	                assert isinstance(self.compiled.compile_state, DMLState)
+1971	                assert isinstance(
+1972	                    self.compiled.compile_state.dml_table, TableClause
+1973	                )
+1974	            conn._cursor_execute(
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 2000
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+1999	                )
+2000	            except Exception:
+2001	                pass
+2002	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 2339
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2338	        else:
+2339	            assert False, "expected Insert, Update or Delete statement"
+2340	
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '['
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 2973
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+2972	            continue
+2973	        if token == "[":
+2974	            bracket = True
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: ']'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 2976
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+2975	            has_brackets = True
+2976	        elif token == "]":
+2977	            bracket = False
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '.'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 2978
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+2977	            bracket = False
+2978	        elif not bracket and token == ".":
+2979	            if has_brackets:
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 3210
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+3209	                (
+3210	                    "SELECT name FROM {} WHERE name IN "
+3211	                    "('dm_exec_sessions', 'dm_pdw_nodes_exec_sessions')"
+3212	                ).format(view_name)
+3213	            )
+3214	            row = cursor.fetchone()
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 3224
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+3223	            cursor.execute(
+3224	                """
+3225	                    SELECT CASE transaction_isolation_level
+3226	                    WHEN 0 THEN NULL
+3227	                    WHEN 1 THEN 'READ UNCOMMITTED'
+3228	                    WHEN 2 THEN 'READ COMMITTED'
+3229	                    WHEN 3 THEN 'REPEATABLE READ'
+3230	                    WHEN 4 THEN 'SERIALIZABLE'
+3231	                    WHEN 5 THEN 'SNAPSHOT' END
+3232	                    AS TRANSACTION_ISOLATION_LEVEL
+3233	                    FROM {}
+3234	                    where session_id = @@SPID
+3235	                """.format(
+3236	                    view_name
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 3436
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+3435	            sql.text(
+3436	                f"""
+3437	select
+3438	    ind.index_id,
+3439	    ind.is_unique,
+3440	    ind.name,
+3441	    ind.type,
+3442	    {filter_definition}
+3443	from
+3444	    sys.indexes as ind
+3445	join sys.tables as tab on
+3446	    ind.object_id = tab.object_id
+3447	join sys.schemas as sch on
+3448	    sch.schema_id = tab.schema_id
+3449	where
+3450	    tab.name = :tabname
+3451	    and sch.name = :schname
+3452	    and ind.is_primary_key = 0
+3453	    and ind.type != 0
+3454	order by
+3455	    ind.name
+3456	                """
+3457	            )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/aiomysql.py
+ Line number: 95
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+94	    def ping(self, reconnect: bool) -> None:
+95	        assert not reconnect
+96	        self.await_(self._connection.ping(reconnect))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/asyncmy.py
+ Line number: 94
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+93	    def ping(self, reconnect: bool) -> None:
+94	        assert not reconnect
+95	        return self.await_(self._do_ping())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 1771
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1770	    ) -> str:
+1771	        assert select._for_update_arg is not None
+1772	        if select._for_update_arg.read:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 1836
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1835	        else:
+1836	            assert limit_clause is not None
+1837	            # No offset provided, so just use the limit
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 1911
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+1910	        return (
+1911	            "SELECT %(outer)s FROM (SELECT %(inner)s) "
+1912	            "as _empty_set WHERE 1!=1"
+1913	            % {
+1914	                "inner": ", ".join(
+1915	                    "1 AS _in_%s" % idx
+1916	                    for idx, type_ in enumerate(element_types)
+1917	                ),
+1918	                "outer": ", ".join(
+1919	                    "_in_%s" % idx for idx, type_ in enumerate(element_types)
+1920	                ),
+1921	            }
+1922	        )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 1955
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1954	    ) -> str:
+1955	        assert binary.modifiers is not None
+1956	        flags = binary.modifiers["flags"]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 1989
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1988	    ) -> str:
+1989	        assert binary.modifiers is not None
+1990	        flags = binary.modifiers["flags"]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 3059
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3058	
+3059	        assert schema is not None
+3060	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 3210
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3209	            mdb_version = self._mariadb_normalized_version_info
+3210	            assert mdb_version is not None
+3211	            if mdb_version > (10, 2) and mdb_version < (10, 2, 9):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 3297
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3296	            schema = self.default_schema_name
+3297	        assert schema is not None
+3298	        charset = self._connection_charset
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 3821
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3820	        if full_name is None:
+3821	            assert table is not None
+3822	            full_name = self.identifier_preparer.format_table(table)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 3867
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3866	        if full_name is None:
+3867	            assert table is not None
+3868	            full_name = self.identifier_preparer.format_table(table)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/enumerated.py
+ Line number: 96
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+95	        if TYPE_CHECKING:
+96	            assert isinstance(impl, ENUM)
+97	        kw.setdefault("validate_strings", impl.validate_strings)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/enumerated.py
+ Line number: 221
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+220	                        value = super_convert(value)
+221	                        assert value is not None
+222	                    if TYPE_CHECKING:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/enumerated.py
+ Line number: 223
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+222	                    if TYPE_CHECKING:
+223	                        assert isinstance(value, str)
+224	                    return set(re.findall(r"[^,]+", value))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mariadbconnector.py
+ Line number: 109
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+108	        if TYPE_CHECKING:
+109	            assert isinstance(self.compiled, SQLCompiler)
+110	        if self.isinsert and self.compiled.postfetch_lastrowid:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mariadbconnector.py
+ Line number: 115
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+114	        if TYPE_CHECKING:
+115	            assert self._lastrowid is not None
+116	        return self._lastrowid
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py
+ Line number: 215
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+214	                opts["client_flags"] = client_flags
+215	            except Exception:
+216	                pass
+217	
+
+
+ + +
+
+ +
+
+ hardcoded_password_funcarg: Possible hardcoded password: 'passwd'
+ Test ID: B106
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mysqldb.py
+ Line number: 205
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b106_hardcoded_password_funcarg.html
+ +
+
+204	            _translate_args = dict(
+205	                database="db", username="user", password="passwd"
+206	            )
+207	
+208	        opts = url.translate_connect_args(**_translate_args)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/provision.py
+ Line number: 67
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+66	            _mysql_drop_db(cfg, conn, ident)
+67	        except Exception:
+68	            pass
+69	
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/base.py
+ Line number: 1914
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+1913	        return self._execute_scalar(
+1914	            "SELECT "
+1915	            + self.identifier_preparer.format_sequence(seq)
+1916	            + ".nextval FROM DUAL",
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/base.py
+ Line number: 3264
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3263	                if row_dict["descend"].lower() != "asc":
+3264	                    assert row_dict["descend"].lower() == "desc"
+3265	                    cs = index_dict.setdefault("column_sorting", {})
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/base.py
+ Line number: 3268
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3267	            else:
+3268	                assert row_dict["descend"].lower() == "asc"
+3269	                cn = self.normalize_name(row_dict["column_name"])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/base.py
+ Line number: 3481
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3480	
+3481	            assert constraint_name is not None
+3482	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/base.py
+ Line number: 3633
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3632	
+3633	            assert constraint_name is not None
+3634	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/base.py
+ Line number: 3684
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3683	            if synonyms:
+3684	                assert len(synonyms) == 1
+3685	                row_dict = synonyms[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py
+ Line number: 835
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+834	            out_parameters = self.out_parameters
+835	            assert out_parameters is not None
+836	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py
+ Line number: 854
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+853	
+854	                        assert cx_Oracle is not None
+855	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py
+ Line number: 1026
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1025	        # False.
+1026	        assert not self.compiled.returning
+1027	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py
+ Line number: 1270
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1269	            decimal_char = value.lstrip("0")[1]
+1270	            assert not decimal_char[0].isdigit()
+1271	
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py
+ Line number: 1496
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+1495	    def create_xid(self):
+1496	        id_ = random.randint(0, 2**128)
+1497	        return (0x1234, "%032x" % id_, "%032x" % 9)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/provision.py
+ Line number: 171
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+170	def _connect_with_retry(dialect, conn_rec, cargs, cparams):
+171	    assert dialect.driver == "cx_oracle"
+172	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/provision.py
+ Line number: 226
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+225	            sc = dbapi_connection.stmtcachesize
+226	        except:
+227	            # connection closed
+228	            pass
+229	        else:
+
+
+ + +
+
+ +
+
+ hardcoded_password_funcarg: Possible hardcoded password: 'xe'
+ Test ID: B106
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/provision.py
+ Line number: 270
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b106_hardcoded_password_funcarg.html
+ +
+
+269	    url = sa_url.make_url(url)
+270	    return url.set(username=ident, password="xe")
+271	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py
+ Line number: 633
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+632	    def _buffer_rows(self):
+633	        assert self._cursor is not None
+634	        new_rows = self._adapt_connection.await_(self._cursor.fetch(50))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py
+ Line number: 663
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+662	
+663	        assert self._cursor is not None
+664	        rb = self._rowbuffer
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py
+ Line number: 1136
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1135	        if multihosts:
+1136	            assert multiports
+1137	            if len(multihosts) == 1:
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/base.py
+ Line number: 2291
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+2290	
+2291	        return "ON CONFLICT %s DO UPDATE SET %s" % (target_text, action_text)
+2292	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/base.py
+ Line number: 3431
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3430	                        if TYPE_CHECKING:
+3431	                            assert isinstance(h, str)
+3432	                            assert isinstance(p, str)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/base.py
+ Line number: 3432
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3431	                            assert isinstance(h, str)
+3432	                            assert isinstance(p, str)
+3433	                        hosts = (h,)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/base.py
+ Line number: 4889
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4888	                        # supported in included columns".
+4889	                        assert all(
+4890	                            not is_expr
+4891	                            for is_expr in all_elements_is_expr[indnkeyatts:]
+4892	                        )
+4893	                        idx_elements_opclass = all_elements_opclass[
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py
+ Line number: 485
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+484	                # this one
+485	                assert self._psycopg_adapters_map
+486	                register_hstore(info, self._psycopg_adapters_map)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py
+ Line number: 489
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+488	                # register the adapter for this connection
+489	                assert connection.connection
+490	                register_hstore(info, connection.connection.driver_connection)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/ranges.py
+ Line number: 653
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+652	
+653	        assert False, f"Unhandled case computing {self} - {other}"
+654	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/types.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+60	        if TYPE_CHECKING:
+61	            assert isinstance(self, TypeEngine)
+62	        return self
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.py
+ Line number: 242
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+241	    def fetchone(self) -> Optional[Any]:
+242	        assert self._cursor is not None
+243	        return self.await_(self._cursor.fetchone())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.py
+ Line number: 246
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+245	    def fetchmany(self, size: Optional[int] = None) -> Sequence[Any]:
+246	        assert self._cursor is not None
+247	        if size is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.py
+ Line number: 252
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+251	    def fetchall(self) -> Sequence[Any]:
+252	        assert self._cursor is not None
+253	        return self.await_(self._cursor.fetchall())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 1163
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1162	        if truncate_microseconds:
+1163	            assert "storage_format" not in kwargs, (
+1164	                "You can specify only "
+1165	                "one of truncate_microseconds or storage_format."
+1166	            )
+1167	            assert "regexp" not in kwargs, (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 1167
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1166	            )
+1167	            assert "regexp" not in kwargs, (
+1168	                "You can specify only one of "
+1169	                "truncate_microseconds or regexp."
+1170	            )
+1171	            self._storage_format = (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 1357
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1356	        if truncate_microseconds:
+1357	            assert "storage_format" not in kwargs, (
+1358	                "You can specify only "
+1359	                "one of truncate_microseconds or storage_format."
+1360	            )
+1361	            assert "regexp" not in kwargs, (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 1361
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1360	            )
+1361	            assert "regexp" not in kwargs, (
+1362	                "You can specify only one of "
+1363	                "truncate_microseconds or regexp."
+1364	            )
+1365	            self._storage_format = "%(hour)02d:%(minute)02d:%(second)02d"
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 1573
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+1572	    def visit_empty_set_expr(self, element_types, **kw):
+1573	        return "SELECT %s FROM (SELECT %s) WHERE 1!=1" % (
+1574	            ", ".join("1" for type_ in element_types or [INTEGER()]),
+1575	            ", ".join("1" for type_ in element_types or [INTEGER()]),
+1576	        )
+1577	
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 1691
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+1690	
+1691	        return "ON CONFLICT %s DO UPDATE SET %s" % (target_text, action_text)
+1692	
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'NULL'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 2104
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+2103	
+2104	    default_metavalue_token = "NULL"
+2105	    """for INSERT... VALUES (DEFAULT) syntax, the token to put in the
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 2260
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2259	        else:
+2260	            assert False, "Unknown isolation level %s" % value
+2261	
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 2290
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+2289	        query = (
+2290	            f"SELECT name FROM {main} "
+2291	            f"WHERE type='{type_}'{filter_table} "
+2292	            "ORDER BY name"
+2293	        )
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 2358
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+2357	            master = f"{qschema}.sqlite_master"
+2358	            s = ("SELECT sql FROM %s WHERE name = ? AND type='view'") % (
+2359	                master,
+2360	            )
+2361	            rs = connection.exec_driver_sql(s, (view_name,))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 2428
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2427	                )
+2428	                assert match, f"create table not found in {tablesql}"
+2429	                tablesql = match.group(1).strip()
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 2946
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+2945	                s = (
+2946	                    "SELECT sql FROM %(schema)ssqlite_master "
+2947	                    "WHERE name = ? "
+2948	                    "AND type = 'index'" % {"schema": schema_expr}
+2949	                )
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 3012
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+3011	            s = (
+3012	                "SELECT sql FROM "
+3013	                " (SELECT * FROM %(schema)ssqlite_master UNION ALL "
+3014	                "  SELECT * FROM %(schema)ssqlite_temp_master) "
+3015	                "WHERE name = ? "
+3016	                "AND type in ('table', 'view')" % {"schema": schema_expr}
+3017	            )
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 3021
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+3020	            s = (
+3021	                "SELECT sql FROM %(schema)ssqlite_master "
+3022	                "WHERE name = ? "
+3023	                "AND type in ('table', 'view')" % {"schema": schema_expr}
+3024	            )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/provision.py
+ Line number: 54
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+53	    if filename and filename != ":memory:":
+54	        assert "test_schema" not in filename
+55	        tokens = re.split(r"[_\.]", filename)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/provision.py
+ Line number: 67
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+66	
+67	        assert name_token, f"sqlite filename has no name token: {url.database}"
+68	
+
+
+ + +
+
+ +
+
+ hardcoded_password_funcarg: Possible hardcoded password: 'test'
+ Test ID: B106
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/provision.py
+ Line number: 78
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b106_hardcoded_password_funcarg.html
+ +
+
+77	    if needs_enc:
+78	        url = url.set(password="test")
+79	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py
+ Line number: 674
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+673	                m = nis.search(sql)
+674	                assert not m, f"Found {nis.pattern!r} in {sql!r}"
+675	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py
+ Line number: 685
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+684	            if parameters:
+685	                assert isinstance(parameters, tuple)
+686	                return {
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 627
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+626	        dbapi_connection = self.connection.dbapi_connection
+627	        assert dbapi_connection is not None
+628	        try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 746
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+745	            pool_proxied_connection = self._dbapi_connection
+746	            assert pool_proxied_connection is not None
+747	            pool_proxied_connection.invalidate(exception)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 1190
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1189	
+1190	        assert isinstance(self._transaction, TwoPhaseTransaction)
+1191	        try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 1201
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1200	        if self._still_open_and_dbapi_connection_is_valid:
+1201	            assert isinstance(self._transaction, TwoPhaseTransaction)
+1202	            try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 1213
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1212	
+1213	        assert isinstance(self._transaction, TwoPhaseTransaction)
+1214	        try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2362
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2361	            elif should_wrap:
+2362	                assert sqlalchemy_exception is not None
+2363	                raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2365
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2364	            else:
+2365	                assert exc_info[1] is not None
+2366	                raise exc_info[1].with_traceback(exc_info[2])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2373
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2372	                    dbapi_conn_wrapper = self._dbapi_connection
+2373	                    assert dbapi_conn_wrapper is not None
+2374	                    if invalidate_pool_on_disconnect:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2447
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2446	        elif should_wrap:
+2447	            assert sqlalchemy_exception is not None
+2448	            raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2450
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2449	        else:
+2450	            assert exc_info[1] is not None
+2451	            raise exc_info[1].with_traceback(exc_info[2])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2599
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2598	        finally:
+2599	            assert not self.is_active
+2600	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2621
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2620	        finally:
+2621	            assert not self.is_active
+2622	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2642
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2641	        finally:
+2642	            assert not self.is_active
+2643	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2688
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2687	    def __init__(self, connection: Connection):
+2688	        assert connection._transaction is None
+2689	        if connection._trans_context_manager:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2699
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2698	        if self.is_active:
+2699	            assert self.connection._transaction is self
+2700	            self.is_active = False
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2731
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2730	
+2731	        assert not self.is_active
+2732	        assert self.connection._transaction is not self
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2732
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2731	        assert not self.is_active
+2732	        assert self.connection._transaction is not self
+2733	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2742
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2741	        if self.is_active:
+2742	            assert self.connection._transaction is self
+2743	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2765
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2764	
+2765	        assert not self.is_active
+2766	        assert self.connection._transaction is not self
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2766
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2765	        assert not self.is_active
+2766	        assert self.connection._transaction is not self
+2767	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2806
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2805	    def __init__(self, connection: Connection):
+2806	        assert connection._transaction is not None
+2807	        if connection._trans_context_manager:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2852
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2851	
+2852	        assert not self.is_active
+2853	        if deactivate_from_connection:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2854
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2853	        if deactivate_from_connection:
+2854	            assert self.connection._nested_transaction is not self
+2855	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/create.py
+ Line number: 744
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+743	            ) -> None:
+744	                assert do_on_connect is not None
+745	                do_on_connect(dbapi_connection)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py
+ Line number: 218
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+217	    def _remove_processors(self) -> CursorResultMetaData:
+218	        assert not self._tuplefilter
+219	        return self._make_new_metadata(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py
+ Line number: 236
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+235	    ) -> CursorResultMetaData:
+236	        assert not self._tuplefilter
+237	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py
+ Line number: 313
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+312	        if TYPE_CHECKING:
+313	            assert isinstance(invoked_statement, elements.ClauseElement)
+314	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py
+ Line number: 318
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+317	
+318	        assert invoked_statement is not None
+319	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py
+ Line number: 338
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+337	
+338	        assert not self._tuplefilter
+339	        return self._make_new_metadata(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py
+ Line number: 874
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+873	            x = self._key_fallback(key, ke, raiseerr)
+874	            assert x is None
+875	            return None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py
+ Line number: 1112
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1111	        # we only expect to have a _NoResultMetaData() here right now.
+1112	        assert not result._metadata.returns_rows
+1113	        result._metadata._we_dont_return_rows(err)  # type: ignore[union-attr]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py
+ Line number: 1384
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1383	        else:
+1384	            assert dbapi_cursor is not None
+1385	            self._rowbuffer = collections.deque(dbapi_cursor.fetchall())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py
+ Line number: 1589
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1588	        else:
+1589	            assert context._num_sentinel_cols == 0
+1590	            self._metadata = self._no_result_metadata
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'DEFAULT'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 226
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+225	
+226	    default_metavalue_token = "DEFAULT"
+227	    """for INSERT... VALUES (DEFAULT) syntax, the token to put in the
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 765
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+764	
+765	        return "_sa_%032x" % random.randint(0, 2**128)
+766	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 797
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+796	        imv = compiled._insertmanyvalues
+797	        assert imv is not None
+798	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 848
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+847	                # would have assured this but pylance thinks not
+848	                assert result is not None
+849	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 855
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+854	                        # integer autoincrement, do a simple sort.
+855	                        assert not composite_sentinel
+856	                        result.extend(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 863
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+862	                    # with parameters
+863	                    assert imv.sentinel_param_keys
+864	                    assert imv.sentinel_columns
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 864
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+863	                    assert imv.sentinel_param_keys
+864	                    assert imv.sentinel_columns
+865	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1006
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1005	        if self._on_connect_isolation_level is not None:
+1006	            assert (
+1007	                self._on_connect_isolation_level == "AUTOCOMMIT"
+1008	                or self._on_connect_isolation_level
+1009	                == self.default_isolation_level
+1010	            )
+1011	            self._assert_and_set_isolation_level(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1015
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1014	        else:
+1015	            assert self.default_isolation_level is not None
+1016	            self._assert_and_set_isolation_level(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1355
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1354	            if TYPE_CHECKING:
+1355	                assert isinstance(dml_statement, UpdateBase)
+1356	            self.is_crud = True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1365
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1364	            # dont mix implicit and explicit returning
+1365	            assert not (iir and ier)
+1366	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1492
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1491	            core_positional_parameters: MutableSequence[Sequence[Any]] = []
+1492	            assert positiontup is not None
+1493	            for compiled_params in self.compiled_parameters:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1614
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1613	        gen_time = self.compiled._gen_time
+1614	        assert gen_time is not None
+1615	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1664
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1663	        if TYPE_CHECKING:
+1664	            assert isinstance(self.compiled, SQLCompiler)
+1665	        return self.compiled.postfetch
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1670
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1669	        if TYPE_CHECKING:
+1670	            assert isinstance(self.compiled, SQLCompiler)
+1671	        if self.isinsert:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1965
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1964	        elif self._num_sentinel_cols:
+1965	            assert self.execute_style is ExecuteStyle.INSERTMANYVALUES
+1966	            # strip out the sentinel columns from cursor description
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1990
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1989	                # support is added here.
+1990	                assert result._metadata.returns_rows
+1991	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 2022
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2021	            # the rows have all been fetched however.
+2022	            assert result._metadata.returns_rows
+2023	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 2301
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2300	        else:
+2301	            assert column is not None
+2302	            assert parameters is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 2302
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2301	            assert column is not None
+2302	            assert parameters is not None
+2303	        compile_state = cast(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 2306
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2305	        )
+2306	        assert compile_state is not None
+2307	        if (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 2318
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2317	                index = 0
+2318	            assert compile_state._dict_parameters is not None
+2319	            keys = compile_state._dict_parameters.keys()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/reflection.py
+ Line number: 1672
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1671	            default_text = col_d["default"]
+1672	            assert default_text is not None
+1673	            if isinstance(default_text, TextClause):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py
+ Line number: 149
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+148	    ) -> Optional[NoReturn]:
+149	        assert raiseerr
+150	        raise KeyError(key) from err
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py
+ Line number: 551
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+550	        make_row = self._row_getter
+551	        assert make_row is not None
+552	        rows = self._fetchall_impl()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py
+ Line number: 691
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+690	                        num = len(rows)
+691	                        assert make_row is not None
+692	                        collect.extend(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py
+ Line number: 699
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+698	
+699	                assert num is not None
+700	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py
+ Line number: 808
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+807	                        if strategy:
+808	                            assert next_row is not _NO_ROW
+809	                            if existing_row_hash == strategy(next_row):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py
+ Line number: 867
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+866	
+867	        assert self._generate_rows
+868	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py
+ Line number: 873
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+872	    def _unique_strategy(self) -> _UniqueFilterStateType:
+873	        assert self._unique_filter_state is not None
+874	        uniques, strategy = self._unique_filter_state
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/util.py
+ Line number: 152
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+151	                if not out_of_band_exit:
+152	                    assert subject is not None
+153	                    subject._trans_context_manager = self._outer_trans_ctx
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/util.py
+ Line number: 165
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+164	                if not out_of_band_exit:
+165	                    assert subject is not None
+166	                    subject._trans_context_manager = self._outer_trans_ctx
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/attr.py
+ Line number: 182
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+181	        target = event_key.dispatch_target
+182	        assert isinstance(
+183	            target, type
+184	        ), "Class-level Event targets must be classes."
+185	        if not getattr(target, "_sa_propagate_class_events", True):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/attr.py
+ Line number: 345
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+344	
+345	        assert obj._instance_cls is not None
+346	        existing = getattr(obj, self.name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/attr.py
+ Line number: 355
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+354	                # with freethreaded.
+355	                assert isinstance(existing, _ListenerCollection)
+356	                return existing
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/base.py
+ Line number: 146
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+145	        if instance_cls:
+146	            assert parent is not None
+147	            try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/base.py
+ Line number: 194
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+193	        """
+194	        assert "_joined_dispatch_cls" in self.__class__.__dict__
+195	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/base.py
+ Line number: 317
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+316	            dispatch_target_cls = cls._dispatch_target
+317	            assert dispatch_target_cls is not None
+318	            if (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/legacy.py
+ Line number: 102
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+101	            if conv is not None:
+102	                assert not has_kw
+103	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/legacy.py
+ Line number: 106
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+105	                    util.warn_deprecated(warning_txt, version=since)
+106	                    assert conv is not None
+107	                    return fn(*conv(*args))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/legacy.py
+ Line number: 234
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+233	    if getattr(fn, "_omit_standard_example", False):
+234	        assert fn.__doc__
+235	        return fn.__doc__
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/registry.py
+ Line number: 193
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+192	        if newowner_ref in dispatch_reg:
+193	            assert dispatch_reg[newowner_ref] == listen_ref
+194	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/associationproxy.py
+ Line number: 453
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+452	
+453	        assert instance is None
+454	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/associationproxy.py
+ Line number: 735
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+734	        attr = getattr(target_class, value_attr)
+735	        assert not isinstance(attr, AssociationProxy)
+736	        if isinstance(attr, AssociationProxyInstance):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/associationproxy.py
+ Line number: 900
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+899	                if id(obj) == creator_id and id(self) == self_id:
+900	                    assert self.collection_class is not None
+901	                    return proxy
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/associationproxy.py
+ Line number: 933
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+932	            proxy = self.get(obj)
+933	            assert self.collection_class is not None
+934	            if proxy is not values:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py
+ Line number: 332
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+331	        """Begin a transaction prior to autobegin occurring."""
+332	        assert self._proxied
+333	        return AsyncTransaction(self)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py
+ Line number: 337
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+336	        """Begin a nested transaction and return a transaction handle."""
+337	        assert self._proxied
+338	        return AsyncTransaction(self, nested=True)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py
+ Line number: 443
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+442	        c2 = await greenlet_spawn(conn.execution_options, **opt)
+443	        assert c2 is conn
+444	        return self
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py
+ Line number: 593
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+592	        )
+593	        assert result.context._is_server_side
+594	        ar = AsyncResult(result)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py
+ Line number: 1360
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1359	        )
+1360	        assert async_connection is not None
+1361	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/automap.py
+ Line number: 1232
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1231	        else:
+1232	            assert False, "Can't locate automap base in class hierarchy"
+1233	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/automap.py
+ Line number: 1257
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1256	        if reflect:
+1257	            assert autoload_with
+1258	            opts = dict(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/automap.py
+ Line number: 1294
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1293	                if lcl_m2m is not None:
+1294	                    assert rem_m2m is not None
+1295	                    assert m2m_const is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/automap.py
+ Line number: 1295
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1294	                    assert rem_m2m is not None
+1295	                    assert m2m_const is not None
+1296	                    many_to_many.append((lcl_m2m, rem_m2m, m2m_const, table))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/automap.py
+ Line number: 1330
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1329	                    )
+1330	                    assert map_config.cls.__name__ == newname
+1331	                    if new_module is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/automap.py
+ Line number: 1345
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1344	                        # see test_cls_schema_name_conflict
+1345	                        assert isinstance(props, Properties)
+1346	                        by_module_properties = props
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/baked.py
+ Line number: 204
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+203	                else:
+204	                    assert not ck[1], (
+205	                        "loader options with variable bound parameters "
+206	                        "not supported with baked queries.  Please "
+207	                        "use new-style select() statements for cached "
+208	                        "ORM queries."
+209	                    )
+210	                    key += ck[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/horizontal_shard.py
+ Line number: 113
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+112	        super().__init__(*args, **kwargs)
+113	        assert isinstance(self.session, ShardedSession)
+114	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/horizontal_shard.py
+ Line number: 310
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+309	                token = state.key[2]
+310	                assert token is not None
+311	                return token
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/horizontal_shard.py
+ Line number: 315
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+314	
+315	        assert isinstance(mapper, Mapper)
+316	        shard_id = self.shard_chooser(mapper, instance, **kw)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/horizontal_shard.py
+ Line number: 338
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+337	            trans = self.get_transaction()
+338	            assert trans is not None
+339	            return trans.connection(mapper, shard_id=shard_id)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/horizontal_shard.py
+ Line number: 348
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+347	            else:
+348	                assert isinstance(bind, Connection)
+349	                return bind
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/horizontal_shard.py
+ Line number: 364
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+363	            )
+364	            assert shard_id is not None
+365	        return self.__shards[shard_id]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/horizontal_shard.py
+ Line number: 443
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+442	    session = orm_context.session
+443	    assert isinstance(session, ShardedSession)
+444	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/hybrid.py
+ Line number: 1471
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1470	            if TYPE_CHECKING:
+1471	                assert isinstance(expr, ColumnElement)
+1472	            ret_expr = expr
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/hybrid.py
+ Line number: 1478
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1477	            # true
+1478	            assert isinstance(ret_expr, ColumnElement)
+1479	        return ret_expr
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mutable.py
+ Line number: 525
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+524	                    val = cls.coerce(key, val)
+525	                    assert val is not None
+526	                    state.dict[key] = val
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/apply.py
+ Line number: 79
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+78	    left_hand_explicit_type = get_proper_type(stmt.type)
+79	    assert isinstance(
+80	        left_hand_explicit_type, (Instance, UnionType, UnboundType)
+81	    )
+82	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/apply.py
+ Line number: 174
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+173	            ):
+174	                assert python_type_for_type is not None
+175	                left_node.type = api.named_type(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/apply.py
+ Line number: 213
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+212	    left_node = lvalue.node
+213	    assert isinstance(left_node, Var)
+214	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/apply.py
+ Line number: 316
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+315	    if sym:
+316	        assert isinstance(sym.node, TypeInfo)
+317	        type_: ProperType = Instance(sym.node, [])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/decl_class.py
+ Line number: 191
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+190	    if left_hand_explicit_type is not None:
+191	        assert value.node is not None
+192	        attributes.append(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/decl_class.py
+ Line number: 378
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+377	    # hook.
+378	    assert sym is not None
+379	    node = sym.node
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/decl_class.py
+ Line number: 384
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+383	
+384	    assert node is lvalue.node
+385	    assert isinstance(node, Var)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/decl_class.py
+ Line number: 385
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+384	    assert node is lvalue.node
+385	    assert isinstance(node, Var)
+386	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/decl_class.py
+ Line number: 468
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+467	
+468	    assert python_type_for_type is not None
+469	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 110
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+109	
+110	    assert isinstance(stmt.rvalue, CallExpr)
+111	    target_cls_arg = stmt.rvalue.args[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 230
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+229	        if type_is_a_collection:
+230	            assert isinstance(left_hand_explicit_type, Instance)
+231	            assert isinstance(python_type_for_type, Instance)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 231
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+230	            assert isinstance(left_hand_explicit_type, Instance)
+231	            assert isinstance(python_type_for_type, Instance)
+232	            return _infer_collection_type_from_left_and_inferred_right(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 254
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+253	
+254	    assert isinstance(stmt.rvalue, CallExpr)
+255	    target_cls_arg = stmt.rvalue.args[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 290
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+289	    """
+290	    assert isinstance(stmt.rvalue, CallExpr)
+291	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 322
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+321	    """
+322	    assert isinstance(stmt.rvalue, CallExpr)
+323	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 397
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+396	    """
+397	    assert isinstance(node, Var)
+398	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 431
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+430	        else:
+431	            assert False
+432	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 516
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+515	
+516	    assert isinstance(left_hand_arg, (Instance, UnionType))
+517	    assert isinstance(python_type_arg, (Instance, UnionType))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 517
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+516	    assert isinstance(left_hand_arg, (Instance, UnionType))
+517	    assert isinstance(python_type_arg, (Instance, UnionType))
+518	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 575
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+574	
+575	    assert node.has_base("sqlalchemy.sql.type_api.TypeEngine"), (
+576	        "could not extract Python type from node: %s" % node
+577	    )
+578	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 583
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+582	
+583	    assert type_engine_sym is not None and isinstance(
+584	        type_engine_sym.node, TypeInfo
+585	    )
+586	    type_engine = map_instance_to_supertype(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/plugin.py
+ Line number: 235
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+234	    _add_globals(ctx)
+235	    assert isinstance(ctx.reason, nodes.MemberExpr)
+236	    expr = ctx.reason.expr
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/plugin.py
+ Line number: 238
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+237	
+238	    assert isinstance(expr, nodes.RefExpr) and isinstance(expr.node, nodes.Var)
+239	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/plugin.py
+ Line number: 242
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+241	
+242	    assert (
+243	        isinstance(node_type, Instance)
+244	        and names.type_id_for_named_node(node_type.type) is names.REGISTRY
+245	    )
+246	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/plugin.py
+ Line number: 302
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+301	    )
+302	    assert sym is not None and isinstance(sym.node, TypeInfo)
+303	    info.declared_metaclass = info.metaclass_type = Instance(sym.node, [])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/util.py
+ Line number: 78
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+77	    def serialize(self) -> JsonDict:
+78	        assert self.type
+79	        return {
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/util.py
+ Line number: 335
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+334	            return None
+335	        assert sym and isinstance(sym.node, TypeInfo)
+336	        return sym.node
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/util.py
+ Line number: 344
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+343	        return typ.serialize()
+344	    except Exception:
+345	        pass
+346	    if hasattr(typ, "args"):
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with pickle module.
+ Test ID: B403
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/serializer.py
+ Line number: 72
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b403-import-pickle
+ +
+
+71	from io import BytesIO
+72	import pickle
+73	import re
+
+
+ + +
+
+ +
+
+ blacklist: Pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue.
+ Test ID: B301
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/serializer.py
+ Line number: 150
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b301-pickle
+ +
+
+149	                key, clsarg = args.split(":")
+150	                cls = pickle.loads(b64decode(clsarg))
+151	                return getattr(cls, key)
+
+
+ + +
+
+ +
+
+ blacklist: Pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue.
+ Test ID: B301
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/serializer.py
+ Line number: 153
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b301-pickle
+ +
+
+152	            elif type_ == "mapper":
+153	                cls = pickle.loads(b64decode(args))
+154	                return class_mapper(cls)
+
+
+ + +
+
+ +
+
+ blacklist: Pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue.
+ Test ID: B301
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/serializer.py
+ Line number: 156
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b301-pickle
+ +
+
+155	            elif type_ == "mapper_selectable":
+156	                cls = pickle.loads(b64decode(args))
+157	                return class_mapper(cls).__clause_element__()
+
+
+ + +
+
+ +
+
+ blacklist: Pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue.
+ Test ID: B301
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/serializer.py
+ Line number: 160
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b301-pickle
+ +
+
+159	                mapper, keyname = args.split(":")
+160	                cls = pickle.loads(b64decode(mapper))
+161	                return class_mapper(cls).attrs[keyname]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 218
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+217	
+218	        assert comparator is not None
+219	        self.comparator = comparator
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 336
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+335	        entity_namespace = self._entity_namespace
+336	        assert isinstance(entity_namespace, HasCacheKey)
+337	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 350
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+349	            if TYPE_CHECKING:
+350	                assert isinstance(ce, ColumnElement)
+351	            anno = ce._annotate
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 395
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+394	    def adapt_to_entity(self, adapt_to_entity: AliasedInsp[Any]) -> Self:
+395	        assert not self._of_type
+396	        return self.__class__(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 419
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+418	        if TYPE_CHECKING:
+419	            assert isinstance(self.comparator, RelationshipProperty.Comparator)
+420	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 975
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+974	        msg = "This AttributeImpl is not configured to track parents."
+975	        assert self.trackparent, msg
+976	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 993
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+992	        msg = "This AttributeImpl is not configured to track parents."
+993	        assert self.trackparent, msg
+994	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 1060
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1059	
+1060	        assert self.key not in dict_, (
+1061	            "_default_value should only be invoked for an "
+1062	            "uninitialized or expired attribute"
+1063	        )
+1064	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 1704
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1703	                # pending mutations
+1704	                assert self.key not in state._pending_mutations
+1705	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 1835
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1834	
+1835	        assert self.key not in dict_, (
+1836	            "_default_value should only be invoked for an "
+1837	            "uninitialized or expired attribute"
+1838	        )
+1839	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 1873
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1872	            )
+1873	            assert (
+1874	                self.key not in dict_
+1875	            ), "Collection was loaded during event handling."
+1876	            state._get_pending_mutation(self.key).append(value)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 1879
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1878	            if TYPE_CHECKING:
+1879	                assert isinstance(collection, CollectionAdapter)
+1880	            collection.append_with_event(value, initiator)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 1895
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1894	            self.fire_remove_event(state, dict_, value, initiator, key=NO_KEY)
+1895	            assert (
+1896	                self.key not in dict_
+1897	            ), "Collection was loaded during event handling."
+1898	            state._get_pending_mutation(self.key).remove(value)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 1901
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1900	            if TYPE_CHECKING:
+1901	                assert isinstance(collection, CollectionAdapter)
+1902	            collection.remove_with_event(value, initiator)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 2704
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2703	    if TYPE_CHECKING:
+2704	        assert isinstance(attr, HasCollectionAdapter)
+2705	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/base.py
+ Line number: 443
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+442	    else:
+443	        assert isinstance(class_or_mapper, type)
+444	        raise exc.UnmappedClassError(class_or_mapper)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 236
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+235	            elif result.returns_rows:
+236	                assert bookkeeping
+237	                return_result = return_result.splice_horizontally(result)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 250
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+249	    if use_orm_insert_stmt is not None:
+250	        assert return_result is not None
+251	        return return_result
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 480
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+479	    def _get_crud_kv_pairs(cls, statement, kv_iterator, needs_to_be_cacheable):
+480	        assert (
+481	            needs_to_be_cacheable
+482	        ), "no test coverage for needs_to_be_cacheable=False"
+483	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 705
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+704	        except KeyError:
+705	            assert False, "statement had 'orm' plugin but no plugin_subject"
+706	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 1199
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1198	        except KeyError:
+1199	            assert False, "statement had 'orm' plugin but no plugin_subject"
+1200	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 1290
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1289	
+1290	            assert mapper is not None
+1291	            assert session._transaction is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 1291
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1290	            assert mapper is not None
+1291	            assert session._transaction is not None
+1292	            result = _bulk_insert(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 1623
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1622	
+1623	            assert update_options._synchronize_session != "fetch"
+1624	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 1637
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1636	            mapper = update_options._subject_mapper
+1637	            assert mapper is not None
+1638	            assert session._transaction is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 1638
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1637	            assert mapper is not None
+1638	            assert session._transaction is not None
+1639	            result = _bulk_update(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/clsregistry.py
+ Line number: 348
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+347	                else:
+348	                    assert isinstance(value, _MultipleClassMarker)
+349	                    return value.attempt_get(self.__parent.path, key)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/clsregistry.py
+ Line number: 375
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+374	            if desc.extension_type is interfaces.NotExtension.NOT_EXTENSION:
+375	                assert isinstance(desc, attributes.QueryableAttribute)
+376	                prop = desc.property
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/clsregistry.py
+ Line number: 452
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+451	        decl_base = manager.registry
+452	        assert decl_base is not None
+453	        decl_class_registry = decl_base._class_registry
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/clsregistry.py
+ Line number: 528
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+527	                if TYPE_CHECKING:
+528	                    assert isinstance(rval, (type, Table, _ModNS))
+529	                return rval
+
+
+ + +
+
+ +
+
+ blacklist: Use of possibly insecure function - consider using safer ast.literal_eval.
+ Test ID: B307
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/clsregistry.py
+ Line number: 533
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b307-eval
+ +
+
+532	        try:
+533	            x = eval(self.arg, globals(), self._dict)
+534	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/collections.py
+ Line number: 548
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+547	    def _set_empty(self, user_data):
+548	        assert (
+549	            not self.empty
+550	        ), "This collection adapter is already in the 'empty' state"
+551	        self.empty = True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/collections.py
+ Line number: 555
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+554	    def _reset_empty(self) -> None:
+555	        assert (
+556	            self.empty
+557	        ), "This collection adapter is not in the 'empty' state"
+558	        self.empty = False
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/collections.py
+ Line number: 799
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+798	
+799	    assert isinstance(values, list)
+800	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/collections.py
+ Line number: 908
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+907	                role = method._sa_instrument_role
+908	                assert role in (
+909	                    "appender",
+910	                    "remover",
+911	                    "iterator",
+912	                    "converter",
+913	                )
+914	                roles.setdefault(role, name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/collections.py
+ Line number: 923
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+922	                op, argument = method._sa_instrument_before
+923	                assert op in ("fire_append_event", "fire_remove_event")
+924	                before = op, argument
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/collections.py
+ Line number: 927
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+926	                op = method._sa_instrument_after
+927	                assert op in ("fire_append_event", "fire_remove_event")
+928	                after = op
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/collections.py
+ Line number: 945
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+944	    if collection_type in __interfaces:
+945	        assert collection_type is not None
+946	        canned_roles, decorators = __interfaces[collection_type]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 235
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+234	            self.global_attributes = {}
+235	            assert toplevel
+236	            return
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 571
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+570	        except KeyError:
+571	            assert False, "statement had 'orm' plugin but no plugin_subject"
+572	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 783
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+782	
+783	        assert isinstance(statement_container, FromStatement)
+784	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 1374
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1373	            if self.compile_options._only_load_props:
+1374	                assert False, "no columns were included in _only_load_props"
+1375	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 1491
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1490	
+1491	        assert self.compile_options._set_base_alias
+1492	        assert len(query._from_obj) == 1
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 1492
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1491	        assert self.compile_options._set_base_alias
+1492	        assert len(query._from_obj) == 1
+1493	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 1518
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1517	            equivs = self._all_equivs()
+1518	            assert info is info.selectable
+1519	            return ORMStatementAdapter(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 1952
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1951	            # entities
+1952	            assert prop is None
+1953	            (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 2013
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2012	                # might be distinct
+2013	                assert isinstance(
+2014	                    entities_collection[use_entity_index], _MapperEntity
+2015	                )
+2016	                left_clause = entities_collection[use_entity_index].selectable
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 2342
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2341	            # a warning has been emitted.
+2342	            assert right_mapper
+2343	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 3285
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3284	            if column is None:
+3285	                assert compile_state.is_dml_returning
+3286	                self._fetch_column = self.column
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_api.py
+ Line number: 299
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+298	        # assert that we are in fact in the declarative scan
+299	        assert declarative_scan is not None
+300	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_api.py
+ Line number: 1309
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1308	                if res_after_fallback is not None:
+1309	                    assert kind is not None
+1310	                    if kind == "pep-695 type":
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_api.py
+ Line number: 1425
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1424	            )
+1425	        assert manager.registry is None
+1426	        manager.registry = self
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 203
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+202	    # make sure we've moved it out.  transitional
+203	    assert attrname != "__abstract__"
+204	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 880
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+879	                        # _include_dunders
+880	                        assert False
+881	                elif class_mapped:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 910
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+909	                        # pylance, no luck
+910	                        assert obj is not None
+911	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 990
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+989	                        if not fixed_table:
+990	                            assert (
+991	                                name in collected_attributes
+992	                                or attribute_is_overridden(name, None)
+993	                            )
+994	                        continue
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 1012
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1011	
+1012	                    assert not attribute_is_overridden(name, obj)
+1013	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 1095
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1094	        manager = instrumentation.manager_of_class(self.cls)
+1095	        assert manager is not None
+1096	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 1165
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1164	            else:
+1165	                assert False
+1166	            annotations[name] = tp
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 1590
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1589	                        # by util._extract_mapped_subtype before we got here.
+1590	                        assert expect_annotations_wo_mapped
+1591	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 1689
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1688	                # ensure every column we get here has been named
+1689	                assert c.name is not None
+1690	                name_to_prop_key[c.name].add(key)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 1846
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1845	            inherited_mapper_or_config = _declared_mapping_info(self.inherits)
+1846	            assert inherited_mapper_or_config is not None
+1847	            inherited_table = inherited_mapper_or_config.local_table
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 1870
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1869	                for col in declared_columns:
+1870	                    assert inherited_table is not None
+1871	                    if col.name in inherited_table.c:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 1889
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1888	                    if TYPE_CHECKING:
+1889	                        assert isinstance(inherited_table, Table)
+1890	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/dependency.py
+ Line number: 136
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+135	            # this method a bit more.
+136	            assert child_deletes not in uow.cycles
+137	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/dependency.py
+ Line number: 916
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+915	    def process_deletes(self, uowcommit, states):
+916	        assert False
+917	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/dependency.py
+ Line number: 923
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+922	        # statements being emitted
+923	        assert self.passive_updates
+924	        self._process_key_switches(states, uowcommit)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/descriptor_props.py
+ Line number: 856
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+855	            if self._adapt_to_entity:
+856	                assert self.adapter is not None
+857	                comparisons = [self.adapter(x) for x in comparisons]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/descriptor_props.py
+ Line number: 910
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+909	                break
+910	        assert comparator_callable is not None
+911	        return comparator_callable(p, mapper)  # type: ignore
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/exc.py
+ Line number: 195
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+194	        else:
+195	            assert applies_to is not None
+196	            sa_exc.InvalidRequestError.__init__(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/identity.py
+ Line number: 151
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+150	            if TYPE_CHECKING:
+151	                assert state.key is not None
+152	            try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/identity.py
+ Line number: 162
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+161	    ) -> Optional[InstanceState[Any]]:
+162	        assert state.key is not None
+163	        if state.key in self._dict:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/identity.py
+ Line number: 183
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+182	        key = state.key
+183	        assert key is not None
+184	        # inline of self.__contains__
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/identity.py
+ Line number: 241
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+240	            key = state.key
+241	            assert key is not None
+242	            if value is not None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/identity.py
+ Line number: 266
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+265	        key = state.key
+266	        assert key is not None
+267	        try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/identity.py
+ Line number: 282
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+281	        if key in self._dict:
+282	            assert key is not None
+283	            try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/instrumentation.py
+ Line number: 214
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+213	        if init_method:
+214	            assert not self._finalized, (
+215	                "class is already instrumented, "
+216	                "init_method %s can't be applied" % init_method
+217	            )
+218	            self.init_method = init_method
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/instrumentation.py
+ Line number: 483
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+482	        impl = self.get_impl(key)
+483	        assert _is_collection_attribute_impl(impl)
+484	        adapter = collections.CollectionAdapter(impl, state, user_data)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/instrumentation.py
+ Line number: 613
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+612	    def create_manager_for_cls(self, class_: Type[_O]) -> ClassManager[_O]:
+613	        assert class_ is not None
+614	        assert opt_manager_of_class(class_) is None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/instrumentation.py
+ Line number: 614
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+613	        assert class_ is not None
+614	        assert opt_manager_of_class(class_) is None
+615	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/instrumentation.py
+ Line number: 624
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+623	        else:
+624	            assert manager is not None
+625	
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/instrumentation.py
+ Line number: 744
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+743	    env["__name__"] = __name__
+744	    exec(func_text, env)
+745	    __init__ = env["__init__"]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/interfaces.py
+ Line number: 296
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+295	
+296	            assert False, "Mapped[] received without a mapping declaration"
+297	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/interfaces.py
+ Line number: 1148
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1147	                if TYPE_CHECKING:
+1148	                    assert issubclass(prop_cls, MapperProperty)
+1149	                strategies = cls._all_strategies[prop_cls]
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py
+ Line number: 148
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+147	                        return hash(obj)
+148	                    except:
+149	                        pass
+150	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py
+ Line number: 172
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+171	                        return hash(obj)
+172	                    except:
+173	                        pass
+174	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py
+ Line number: 548
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+547	
+548	    assert not q._is_lambda_element
+549	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py
+ Line number: 1012
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1011	            # loading does not apply
+1012	            assert only_load_props is None
+1013	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1241
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1240	                        except sa_exc.NoForeignKeysError as nfe:
+1241	                            assert self.inherits.local_table is not None
+1242	                            assert self.local_table is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1242
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1241	                            assert self.inherits.local_table is not None
+1242	                            assert self.local_table is not None
+1243	                            raise sa_exc.NoForeignKeysError(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1261
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1260	                        except sa_exc.AmbiguousForeignKeysError as afe:
+1261	                            assert self.inherits.local_table is not None
+1262	                            assert self.local_table is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1262
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1261	                            assert self.inherits.local_table is not None
+1262	                            assert self.local_table is not None
+1263	                            raise sa_exc.AmbiguousForeignKeysError(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1276
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1275	                            ) from afe
+1276	                    assert self.inherits.persist_selectable is not None
+1277	                    self.persist_selectable = sql.join(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1377
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1376	            self.base_mapper = self
+1377	            assert self.local_table is not None
+1378	            self.persist_selectable = self.local_table
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1433
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1432	        elif self.with_polymorphic[0] != "*":
+1433	            assert isinstance(self.with_polymorphic[0], tuple)
+1434	            self._set_with_polymorphic(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1443
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1442	
+1443	        assert self.concrete
+1444	        assert not self.inherits
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1444
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1443	        assert self.concrete
+1444	        assert not self.inherits
+1445	        assert isinstance(mapper, Mapper)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1445
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1444	        assert not self.inherits
+1445	        assert isinstance(mapper, Mapper)
+1446	        self.inherits = mapper
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1495
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1494	
+1495	            assert manager.registry is not None
+1496	            self.registry = manager.registry
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1530
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1529	
+1530	        assert manager.registry is not None
+1531	        self.registry = manager.registry
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 2318
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2317	        if incoming_prop is None:
+2318	            assert single_column is not None
+2319	            incoming_column = single_column
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 2322
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2321	        else:
+2322	            assert single_column is None
+2323	            incoming_column = incoming_prop.columns[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 2457
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2456	        )
+2457	        assert isinstance(prop, MapperProperty)
+2458	        self._init_properties[key] = prop
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'True'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 2902
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+2901	                    "parentmapper": self,
+2902	                    "identity_token": True,
+2903	                }
+2904	            )
+2905	            ._set_propagate_attrs(
+2906	                {"compile_state_plugin": "orm", "plugin_subject": self}
+2907	            )
+2908	        )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 3700
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3699	            if start and not mapper.single:
+3700	                assert mapper.inherits
+3701	                assert not mapper.concrete
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 3701
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3700	                assert mapper.inherits
+3701	                assert not mapper.concrete
+3702	                assert mapper.inherit_condition is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 3702
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3701	                assert not mapper.concrete
+3702	                assert mapper.inherit_condition is not None
+3703	                allconds.append(mapper.inherit_condition)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 3790
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3789	        # mappers or other objects.
+3790	        assert self.isa(super_mapper)
+3791	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 3834
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3833	
+3834	        assert self.inherits
+3835	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 3902
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3901	        if entity.is_aliased_class:
+3902	            assert entity.mapper is self
+3903	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 3963
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3962	
+3963	        assert state.mapper.isa(self)
+3964	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 3990
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3989	                    continue
+3990	                assert parent_state is not None
+3991	                assert parent_dict is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 3991
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3990	                assert parent_state is not None
+3991	                assert parent_dict is not None
+3992	                queue = deque(
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '_sa_default'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py
+ Line number: 83
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+82	_WILDCARD_TOKEN: _LiteralStar = "*"
+83	_DEFAULT_TOKEN = "_sa_default"
+84	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py
+ Line number: 286
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+285	                mp = orm_base._inspect_mapped_class(mcls, configure=True)
+286	                assert mp is not None
+287	                return mp.attrs[key]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py
+ Line number: 310
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+309	    def deserialize(cls, path: _SerializedPath) -> PathRegistry:
+310	        assert path is not None
+311	        p = cls._deserialize_path(path)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py
+ Line number: 388
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+387	            if TYPE_CHECKING:
+388	                assert isinstance(entity, _StrPathToken)
+389	            return TokenRegistry(self, PathToken._intern[entity])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py
+ Line number: 459
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+458	        if TYPE_CHECKING:
+459	            assert isinstance(parent, AbstractEntityRegistry)
+460	        if not parent.is_aliased_class:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py
+ Line number: 487
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+486	        if TYPE_CHECKING:
+487	            assert isinstance(parent, AbstractEntityRegistry)
+488	        for mp_ent in parent.mapper.iterate_to_root():
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py
+ Line number: 614
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+613	            if TYPE_CHECKING:
+614	                assert isinstance(prop, RelationshipProperty)
+615	            self.entity = prop.entity
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py
+ Line number: 641
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+640	    def entity_path(self) -> AbstractEntityRegistry:
+641	        assert self.entity is not None
+642	        return self[self.entity]
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/persistence.py
+ Line number: 715
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+714	                raise orm_exc.FlushError(
+715	                    "Can't delete from table %s "
+716	                    "using NULL for primary "
+717	                    "key value on column %s" % (table, col)
+718	                )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/persistence.py
+ Line number: 1214
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1213	            else:
+1214	                assert not returning_is_required_anyway
+1215	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/properties.py
+ Line number: 762
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+761	        ):
+762	            assert originating_module is not None
+763	            argument = de_stringify_annotation(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/query.py
+ Line number: 648
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+647	        if TYPE_CHECKING:
+648	            assert isinstance(stmt, Select)
+649	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/query.py
+ Line number: 3344
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3343	        stmt = self._statement_20(for_statement=for_statement, **kw)
+3344	        assert for_statement == stmt._compile_options._for_statement
+3345	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 785
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+784	                )
+785	                assert info is not None
+786	                target_mapper, to_selectable, is_aliased_class = (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 1170
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1169	    ) -> ColumnElement[bool]:
+1170	        assert instance is not None
+1171	        adapt_source: Optional[_CoreAdapterProto] = None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 1174
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1173	            insp: Optional[_InternalEntityType[Any]] = inspect(from_entity)
+1174	            assert insp is not None
+1175	            if insp_is_aliased_class(insp):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 1311
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1310	        def _go() -> Any:
+1311	            assert lkv_fixed is not None
+1312	            last_known = to_return = lkv_fixed[prop.key]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 1409
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1408	
+1409	            assert is_has_collection_adapter(impl)
+1410	            instances_iterable = impl.get_collection(source_state, source_dict)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 1415
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1414	            # True
+1415	            assert not instances_iterable.empty if impl.collection else True
+1416	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 1450
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1449	                dest_impl = dest_state.get_impl(self.key)
+1450	                assert is_has_collection_adapter(dest_impl)
+1451	                dest_impl.set(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 1544
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1543	
+1544	            assert instance_state is not None
+1545	            instance_dict = attributes.instance_dict(c)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 1767
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1766	        argument = extracted_mapped_annotation
+1767	        assert originating_module is not None
+1768	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 2322
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2321	        self._determine_joins()
+2322	        assert self.primaryjoin is not None
+2323	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 2494
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2493	    def secondaryjoin_minus_local(self) -> ColumnElement[bool]:
+2494	        assert self.secondaryjoin is not None
+2495	        return _deep_deannotate(self.secondaryjoin, values=("local", "remote"))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 2687
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2686	
+2687	        assert self.secondary is not None
+2688	        fixed_secondary = self.secondary
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 2699
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2698	
+2699	        assert self.secondaryjoin is not None
+2700	        self.secondaryjoin = visitors.replacement_traverse(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 952
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+951	        elif origin is SessionTransactionOrigin.SUBTRANSACTION:
+952	            assert parent is not None
+953	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 954
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+953	        else:
+954	            assert parent is None
+955	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1075
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1074	            parent = self._parent
+1075	            assert parent is not None
+1076	            self._new = parent._new
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1100
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1099	        """
+1100	        assert self._is_transaction_boundary
+1101	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1120
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1119	
+1120	        assert not self.session._deleted
+1121	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1132
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1131	        """
+1132	        assert self._is_transaction_boundary
+1133	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1144
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1143	            parent = self._parent
+1144	            assert parent is not None
+1145	            parent._new.update(self._new)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1238
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1237	                    else:
+1238	                        assert False, join_transaction_mode
+1239	                else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1277
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1276	        stx = self.session._transaction
+1277	        assert stx is not None
+1278	        if stx is not self:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1343
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1342	        stx = self.session._transaction
+1343	        assert stx is not None
+1344	        if stx is not self:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1887
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1886	            )
+1887	            assert self._transaction is trans
+1888	            return trans
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1934
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1933	
+1934	        assert trans is not None
+1935	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1938
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1937	            trans = trans._begin(nested=nested)
+1938	            assert self._transaction is trans
+1939	            self._nested_transaction = trans
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 2162
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2161	            if TYPE_CHECKING:
+2162	                assert isinstance(
+2163	                    compile_state_cls, context.AbstractORMCompileState
+2164	                )
+2165	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 2606
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2605	            if TYPE_CHECKING:
+2606	                assert isinstance(insp, Inspectable)
+2607	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 2817
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2816	                        if TYPE_CHECKING:
+2817	                            assert isinstance(obj, Table)
+2818	                        return self.__binds[obj]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 3362
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3361	                    trans = self._transaction
+3362	                    assert trans is not None
+3363	                    if state in trans._key_switches:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 3565
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3564	            if TYPE_CHECKING:
+3565	                assert cascade_states is not None
+3566	            for o, m, st_, dct_ in cascade_states:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 3841
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3840	            # TODO: this was being tested before, but this is not possible
+3841	            assert instance is not LoaderCallableStatus.PASSIVE_CLASS_MISMATCH
+3842	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 4408
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4407	                )
+4408	                assert _reg, "Failed to add object to the flush context!"
+4409	                processed.add(state)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 4418
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4417	            _reg = flush_context.register_object(state, isdelete=True)
+4418	            assert _reg, "Failed to add object to the flush context!"
+4419	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/state.py
+ Line number: 527
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+526	        # so make sure this is not set
+527	        assert self._strong_obj is None
+528	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/state.py
+ Line number: 909
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+908	                    if TYPE_CHECKING:
+909	                        assert is_collection_impl(attr)
+910	                    if previous is NEVER_SET:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py
+ Line number: 83
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+82	        """
+83	        assert prerequisite_states, "no prerequisite states sent"
+84	        has_prerequisite_states = (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py
+ Line number: 180
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+179	        """
+180	        assert self._next_state is _StateChangeStates.CHANGE_IN_PROGRESS, (
+181	            "Unexpected call to _expect_state outside of "
+182	            "state-changing method"
+183	        )
+184	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py
+ Line number: 1810
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1809	            q = self.subq
+1810	            assert q.session is None
+1811	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py
+ Line number: 2043
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2042	
+2043	        assert subq.session is None
+2044	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py
+ Line number: 2397
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2396	
+2397	        assert clauses.is_aliased_class
+2398	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py
+ Line number: 2519
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2518	
+2519	        assert clauses.is_aliased_class
+2520	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py
+ Line number: 2609
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2608	
+2609	        assert entity_we_want_to_splice_onto is path[-2]
+2610	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py
+ Line number: 2612
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2611	        if entity_inside_join_structure is False:
+2612	            assert isinstance(join_obj, orm_util._ORMJoin)
+2613	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py
+ Line number: 2690
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2689	            if entity_inside_join_structure is False:
+2690	                assert (
+2691	                    False
+2692	                ), "assertion failed attempting to produce joined eager loads"
+2693	            return None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py
+ Line number: 2712
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2711	            # and entity_inside_join_structure=join_obj._right_memo.mapper
+2712	            assert detected_existing_path[-3] is entity_inside_join_structure
+2713	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 148
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+147	        elif getattr(attr, "_of_type", None):
+148	            assert isinstance(attr, QueryableAttribute)
+149	            ot: Optional[_InternalEntityType[Any]] = inspect(attr._of_type)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 150
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+149	            ot: Optional[_InternalEntityType[Any]] = inspect(attr._of_type)
+150	            assert ot is not None
+151	            coerced_alias = ot.selectable
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1071
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1070	        orig_cache_key = orig_query._generate_cache_key()
+1071	        assert orig_cache_key is not None
+1072	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1160
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1159	
+1160	        assert cloned.propagate_to_loaders == self.propagate_to_loaders
+1161	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1279
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1278	                self.context += (load_element,)
+1279	                assert opts is not None
+1280	                self.additional_source_entities += cast(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1374
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1373	    ):
+1374	        assert attrs is not None
+1375	        attr = attrs[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1376
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1375	        attr = attrs[0]
+1376	        assert (
+1377	            wildcard_key
+1378	            and isinstance(attr, str)
+1379	            and attr in (_WILDCARD_TOKEN, _DEFAULT_TOKEN)
+1380	        )
+1381	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1389
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1388	
+1389	        assert extra_criteria is None
+1390	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1403
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1402	        """
+1403	        assert self.path
+1404	        attr = self.path[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1410
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1409	
+1410	        assert effective_path.is_token
+1411	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1443
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1442	            # just returns it
+1443	            assert new_path == start_path
+1444	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1446
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1445	        # start_path is a single-token tuple
+1446	        assert start_path and len(start_path) == 1
+1447	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1449
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1448	        token = start_path[0]
+1449	        assert isinstance(token, str)
+1450	        entity = self._find_entity_basestring(entities, token, raiseerr)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1462
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1461	
+1462	        assert isinstance(token, str)
+1463	        loader = _TokenStrategyLoad.create(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1475
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1474	
+1475	        assert loader.path.is_token
+1476	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1771
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1770	
+1771	        assert opt.is_token_strategy == path.is_token
+1772	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1813
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1812	
+1813	        assert cloned.strategy == self.strategy
+1814	        assert cloned.local_opts == self.local_opts
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1814
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1813	        assert cloned.strategy == self.strategy
+1814	        assert cloned.local_opts == self.local_opts
+1815	        assert cloned.is_class_strategy == self.is_class_strategy
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1815
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1814	        assert cloned.local_opts == self.local_opts
+1815	        assert cloned.is_class_strategy == self.is_class_strategy
+1816	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1911
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1910	    ):
+1911	        assert attr is not None
+1912	        self._of_type = None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1930
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1929	            # should not reach here;
+1930	            assert False
+1931	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1957
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1956	        if extra_criteria:
+1957	            assert not attr._extra_criteria
+1958	            self._extra_criteria = extra_criteria
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 2009
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2008	
+2009	        assert (
+2010	            self._extra_criteria
+2011	        ), "this should only be called if _extra_criteria is present"
+2012	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 2035
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2034	    def _set_of_type_info(self, context, current_path):
+2035	        assert self._path_with_polymorphic_path
+2036	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 2038
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2037	        pwpi = self._of_type
+2038	        assert pwpi
+2039	        if not pwpi.is_aliased_class:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 2080
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2079	        is_refresh = compile_state.compile_options._for_refresh_state
+2080	        assert not self.path.is_token
+2081	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 2103
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2102	        if current_path:
+2103	            assert effective_path is not None
+2104	            effective_path = self._adjust_effective_path_for_current_path(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 2132
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2131	            else:
+2132	                assert False, "unexpected object for _of_type"
+2133	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 2203
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2202	
+2203	        assert self.path.is_token
+2204	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 2357
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2356	
+2357	    assert lead_element
+2358	    return lead_element
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/unitofwork.py
+ Line number: 638
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+637	        self.sort_key = ("SaveUpdateAll", mapper._sort_key)
+638	        assert mapper is mapper.base_mapper
+639	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/unitofwork.py
+ Line number: 675
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+674	        self.sort_key = ("DeleteAll", mapper._sort_key)
+675	        assert mapper is mapper.base_mapper
+676	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 727
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+726	
+727	        assert alias is not None
+728	        self._aliased_insp = AliasedInsp(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1004
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1003	            # supports "aliased class of aliased class" use case
+1004	            assert isinstance(inspected, AliasedInsp)
+1005	            self._adapter = inspected._adapter.wrap(self._adapter)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1065
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1064	        if aliased or flat:
+1065	            assert selectable is not None
+1066	            selectable = selectable._anonymous_fromclause(flat=flat)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1160
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1159	
+1160	        assert self.mapper is primary_mapper
+1161	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1187
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1186	    ) -> _ORMCOLEXPR:
+1187	        assert isinstance(expr, ColumnElement)
+1188	        d: Dict[str, Any] = {
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1230
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1229	        else:
+1230	            assert False, "mapper %s doesn't correspond to %s" % (mapper, self)
+1231	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1388
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1387	            else:
+1388	                assert entity is not None
+1389	                wrap_entity = entity.entity
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1435
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1434	        else:
+1435	            assert self.root_entity
+1436	            stack = list(self.root_entity.__subclasses__())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1468
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1467	            crit = self.where_criteria  # type: ignore
+1468	        assert isinstance(crit, ColumnElement)
+1469	        return sql_util._deep_annotate(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1813
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1812	            if TYPE_CHECKING:
+1813	                assert isinstance(
+1814	                    onclause.comparator, RelationshipProperty.Comparator
+1815	                )
+1816	            on_selectable = onclause.comparator._source_selectable()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1833
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1832	            else:
+1833	                assert isinstance(left_selectable, FromClause)
+1834	                adapt_from = left_selectable
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1886
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1885	
+1886	        assert self.onclause is not None
+1887	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1916
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1915	
+1916	        assert self.right is leftmost
+1917	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 2081
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2080	
+2081	    assert insp_is_mapper(given)
+2082	    return entity.common_parent(given)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/writeonly.py
+ Line number: 503
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+502	        if TYPE_CHECKING:
+503	            assert instance
+504	        self.instance = instance
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 868
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+867	
+868	        assert self.dbapi_connection is not None
+869	        return self.dbapi_connection
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 882
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+881	            self.__pool.dispatch.close(self.dbapi_connection, self)
+882	        assert self.dbapi_connection is not None
+883	        self.__pool._close_connection(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 940
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+939	    if is_gc_cleanup:
+940	        assert ref is not None
+941	        _strong_ref_connection_records.pop(ref, None)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 942
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+941	        _strong_ref_connection_records.pop(ref, None)
+942	        assert connection_record is not None
+943	        if connection_record.fairy_ref is not ref:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 945
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+944	            return
+945	        assert dbapi_connection is None
+946	        dbapi_connection = connection_record.dbapi_connection
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 977
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+976	            if not fairy:
+977	                assert connection_record is not None
+978	                fairy = _ConnectionFairy(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 984
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+983	                )
+984	            assert fairy.dbapi_connection is dbapi_connection
+985	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 1277
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1276	
+1277	        assert (
+1278	            fairy._connection_record is not None
+1279	        ), "can't 'checkout' a detached connection fairy"
+1280	        assert (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 1280
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1279	        ), "can't 'checkout' a detached connection fairy"
+1280	        assert (
+1281	            fairy.dbapi_connection is not None
+1282	        ), "can't 'checkout' an invalidated connection fairy"
+1283	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 1493
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1492	    def cursor(self, *args: Any, **kwargs: Any) -> DBAPICursor:
+1493	        assert self.dbapi_connection is not None
+1494	        return self.dbapi_connection.cursor(*args, **kwargs)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/events.py
+ Line number: 78
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+77	            else:
+78	                assert issubclass(target, Pool)
+79	                return target
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/impl.py
+ Line number: 392
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+391	        # losing the state of an existing SQLite :memory: connection
+392	        assert not hasattr(other_singleton_pool._fairy, "current")
+393	        self._conn = other_singleton_pool._conn
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/impl.py
+ Line number: 402
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+401	                conn.close()
+402	            except Exception:
+403	                # pysqlite won't even let you close a conn from a thread
+404	                # that didn't create it
+405	                pass
+406	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/impl.py
+ Line number: 502
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+501	            conn = other_static_pool.connection.dbapi_connection
+502	            assert conn is not None
+503	            return conn
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/impl.py
+ Line number: 552
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+551	        self._checked_out = False
+552	        assert record is self._conn
+553	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/_py_util.py
+ Line number: 63
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+62	            s_val = self[idself]
+63	            assert s_val is not True
+64	            return s_val, True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/base.py
+ Line number: 286
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+285	        x = fn(self, *args, **kw)
+286	        assert x is self, "generative methods must return self"
+287	        return self
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/base.py
+ Line number: 1223
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1222	
+1223	        assert self._compile_options is not None
+1224	        self._compile_options += options
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/cache_key.py
+ Line number: 165
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+164	                try:
+165	                    assert issubclass(cls, HasTraverseInternals)
+166	                    _cache_key_traversal = cls._traverse_internals
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/cache_key.py
+ Line number: 171
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+170	
+171	            assert _cache_key_traversal is not NO_CACHE, (
+172	                f"class {cls} has _cache_key_traversal=NO_CACHE, "
+173	                "which conflicts with inherit_cache=True"
+174	            )
+175	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/cache_key.py
+ Line number: 386
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+385	        else:
+386	            assert key is not None
+387	            return CacheKey(key, bindparams)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/cache_key.py
+ Line number: 400
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+399	        else:
+400	            assert key is not None
+401	            return CacheKey(key, bindparams)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/coercions.py
+ Line number: 408
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+407	        if typing.TYPE_CHECKING:
+408	            assert isinstance(resolved, (SQLCoreOperations, ClauseElement))
+409	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/coercions.py
+ Line number: 454
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+453	        if isinstance(resolved, str):
+454	            assert isinstance(expr, str)
+455	            strname = resolved = expr
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/coercions.py
+ Line number: 706
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+705	        # never reached
+706	        assert False
+707	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/coercions.py
+ Line number: 887
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+886	        elif isinstance(element, elements.ClauseList):
+887	            assert not len(element.clauses) == 0
+888	            return element.self_group(against=operator)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/coercions.py
+ Line number: 1331
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1330	    def _post_coercion(self, element, *, flat=False, name=None, **kw):
+1331	        assert name is None
+1332	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 899
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+898	                if TYPE_CHECKING:
+899	                    assert isinstance(statement, Executable)
+900	                self.execution_options = statement._execution_options
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 904
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+903	            if render_schema_translate:
+904	                assert schema_translate_map is not None
+905	                self.string = self.preparer._render_schema_translates(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1465
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1464	            if TYPE_CHECKING:
+1465	                assert isinstance(statement, UpdateBase)
+1466	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1469
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1468	                if TYPE_CHECKING:
+1469	                    assert isinstance(statement, ValuesBase)
+1470	                if statement._inline:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1662
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1661	    def _process_positional(self):
+1662	        assert not self.positiontup
+1663	        assert self.state is CompilerState.STRING_APPLIED
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1663
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1662	        assert not self.positiontup
+1663	        assert self.state is CompilerState.STRING_APPLIED
+1664	        assert not self._numeric_binds
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1664
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1663	        assert self.state is CompilerState.STRING_APPLIED
+1664	        assert not self._numeric_binds
+1665	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1669
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1668	        else:
+1669	            assert self.dialect.paramstyle == "qmark"
+1670	            placeholder = "?"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1690
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1689	            reverse_escape = {v: k for k, v in self.escaped_bind_names.items()}
+1690	            assert len(self.escaped_bind_names) == len(reverse_escape)
+1691	            self.positiontup = [
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1721
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1720	    def _process_numeric(self):
+1721	        assert self._numeric_binds
+1722	        assert self.state is CompilerState.STRING_APPLIED
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1722
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1721	        assert self._numeric_binds
+1722	        assert self.state is CompilerState.STRING_APPLIED
+1723	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1767
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1766	            }
+1767	            assert len(param_pos) == len_before
+1768	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1864
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1863	        if self._render_postcompile and not _no_postcompile:
+1864	            assert self._post_compile_expanded_state is not None
+1865	            if not params:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1893
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1892	            ckbm_tuple = self._cache_key_bind_match
+1893	            assert ckbm_tuple is not None
+1894	            ckbm, _ = ckbm_tuple
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 2140
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2139	                    if parameter.type._is_tuple_type:
+2140	                        assert values is not None
+2141	                        new_processors.update(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 2192
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2191	        if numeric_positiontup is not None:
+2192	            assert new_positiontup is not None
+2193	            param_pos = {
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 2252
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2251	
+2252	        assert self.compile_state is not None
+2253	        statement = self.compile_state.statement
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 2256
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2255	        if TYPE_CHECKING:
+2256	            assert isinstance(statement, Insert)
+2257	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 2334
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2333	
+2334	        assert self.compile_state is not None
+2335	        statement = self.compile_state.statement
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 2338
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2337	        if TYPE_CHECKING:
+2338	            assert isinstance(statement, Insert)
+2339	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 2344
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2343	        returning = self.implicit_returning
+2344	        assert returning is not None
+2345	        ret = {col: idx for idx, col in enumerate(returning)}
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 2648
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2647	            if TYPE_CHECKING:
+2648	                assert isinstance(table, NamedFromClause)
+2649	            tablename = table.name
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 3291
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3290	                m = post_compile_pattern.search(bind_expression_template)
+3291	                assert m and m.group(
+3292	                    2
+3293	                ), "unexpected format for expanding parameter"
+3294	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 3361
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3360	        ):
+3361	            assert not typ_dialect_impl._is_array
+3362	            to_update = [
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 3725
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3724	                    )
+3725	                    assert m, "unexpected format for expanding parameter"
+3726	                    wrapped = "(__[POSTCOMPILE_%s~~%s~~REPL~~%s~~])" % (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4058
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4057	        self_ctes = self._init_cte_state()
+4058	        assert self_ctes is self.ctes
+4059	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4079
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4078	            ]
+4079	            assert _ == cte_name
+4080	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4128
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4127	
+4128	                assert existing_cte_reference_cte is _reference_cte
+4129	                assert existing_cte_reference_cte is existing_cte
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4129
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4128	                assert existing_cte_reference_cte is _reference_cte
+4129	                assert existing_cte_reference_cte is existing_cte
+4130	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4218
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4217	
+4218	                assert kwargs.get("subquery", False) is False
+4219	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4291
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4290	                # from visit_lateral() and we need to set enclosing_lateral.
+4291	                assert alias._is_lateral
+4292	                kwargs["enclosing_lateral"] = alias
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4473
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4472	        # collection properly
+4473	        assert objects
+4474	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4568
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4567	        # these assertions right now set up the current expected inputs
+4568	        assert within_columns_clause, (
+4569	            "_label_select_column is only relevant within "
+4570	            "the columns clause of a SELECT or RETURNING"
+4571	        )
+4572	        result_expr: Union[elements.Label[Any], _CompileLabel]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4588
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4587	
+4588	            assert (
+4589	                proxy_name is not None
+4590	            ), "proxy_name is required if 'name' is passed"
+4591	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4696
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4695	                    # just-added _label_returning_column method
+4696	                    assert not column_is_repeated
+4697	                    fallback_label_name = column._anon_name_label
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4795
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4794	    ):
+4795	        assert select_wraps_for is None, (
+4796	            "SQLAlchemy 1.4 requires use of "
+4797	            "the translate_select_structure hook for structural "
+4798	            "translations of SELECT objects"
+4799	        )
+4800	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 5123
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5122	        if warn_linting:
+5123	            assert from_linter is not None
+5124	            from_linter.warn()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 5541
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5540	        imv = self._insertmanyvalues
+5541	        assert imv is not None
+5542	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 5674
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5673	        insert_crud_params = imv.insert_crud_params
+5674	        assert insert_crud_params is not None
+5675	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 5745
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5744	                positiontup = self.positiontup
+5745	                assert positiontup is not None
+5746	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 5754
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5753	                expand_pos_upper_index = max(all_expand_positions) + 1
+5754	                assert (
+5755	                    len(all_expand_positions)
+5756	                    == expand_pos_upper_index - expand_pos_lower_index
+5757	                )
+5758	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 5833
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5832	                    # parameters
+5833	                    assert not extra_params_right
+5834	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 6033
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+6032	            if add_sentinel_cols is not None:
+6033	                assert use_insertmanyvalues
+6034	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 6082
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+6081	                        # _get_sentinel_column_for_table.
+6082	                        assert not add_sentinel_cols[0]._insert_sentinel, (
+6083	                            "sentinel selection rules should have prevented "
+6084	                            "us from getting here for this dialect"
+6085	                        )
+6086	
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 6224
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+6223	                text += (
+6224	                    f" SELECT {colnames_w_cast} FROM "
+6225	                    f"(VALUES ({insert_single_values_expr})) "
+6226	                    f"AS imp_sen({colnames}, sen_counter) "
+6227	                    "ORDER BY sen_counter"
+6228	                )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 6332
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+6331	        if TYPE_CHECKING:
+6332	            assert isinstance(compile_state, UpdateDMLState)
+6333	        update_stmt = compile_state.statement  # type: ignore[assignment]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 6463
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+6462	        if warn_linting:
+6463	            assert from_linter is not None
+6464	            from_linter.warn(stmt_type="UPDATE")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 6615
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+6614	        if warn_linting:
+6615	            assert from_linter is not None
+6616	            from_linter.warn(stmt_type="DELETE")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 7869
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+7868	        if name is None:
+7869	            assert alias is not None
+7870	            return self.quote(alias.name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 7899
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+7898	
+7899	        assert name is not None
+7900	        if constraint.__visit_name__ == "index":
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 7953
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+7952	        name = self.format_constraint(index)
+7953	        assert name is not None
+7954	        return name
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 7965
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+7964	            if TYPE_CHECKING:
+7965	                assert isinstance(table, NamedFromClause)
+7966	            name = table.name
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 8008
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+8007	            name = column.name
+8008	            assert name is not None
+8009	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 166
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+165	        kw.pop("accumulate_bind_names", None)
+166	    assert (
+167	        "accumulate_bind_names" not in kw
+168	    ), "Don't know how to handle insert within insert without a CTE"
+169	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 230
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+229	        mp = compile_state._multi_parameters
+230	        assert mp is not None
+231	        spd = mp[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 237
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+236	        stmt_parameter_tuples = compile_state._ordered_values
+237	        assert spd is not None
+238	        spd_str_key = {_column_as_key(key) for key in spd}
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 251
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+250	    elif stmt_parameter_tuples:
+251	        assert spd_str_key is not None
+252	        parameters = {
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 296
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+295	
+296	        assert not compile_state._has_multi_parameters
+297	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 370
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+369	                elif multi_not_in_from:
+370	                    assert compiler.render_table_with_column_in_update_from
+371	                    raise exc.CompileError(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 393
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+392	        # is a multiparams, is not an insert from a select
+393	        assert not stmt._select_names
+394	        multi_extended_values = _extend_values_for_multiparams(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 559
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+558	                if TYPE_CHECKING:
+559	                    assert isinstance(col.table, TableClause)
+560	                return "%s_%s" % (col.table.name, col.key)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 588
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+587	
+588	    assert compiler.stack[-1]["selectable"] is stmt
+589	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 664
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+663	
+664	    assert compile_state.isupdate or compile_state.isinsert
+665	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 1392
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1391	        col = _multiparam_column(c, index)
+1392	        assert isinstance(stmt, dml.Insert)
+1393	        return _create_insert_prefetch_bind_param(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 1513
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1512	    mp = compile_state._multi_parameters
+1513	    assert mp is not None
+1514	    for i, row in enumerate(mp[1:]):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py
+ Line number: 126
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+125	        else:
+126	            assert False, "compiler or dialect is required"
+127	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py
+ Line number: 443
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+442	    def stringify_dialect(self):  # type: ignore[override]
+443	        assert not isinstance(self.element, str)
+444	        return self.element.create_drop_stringify_dialect
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py
+ Line number: 872
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+871	        self.connection = connection
+872	        assert not kw, f"Unexpected keywords: {kw.keys()}"
+873	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/dml.py
+ Line number: 235
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+234	    def _process_select_values(self, statement: ValuesBase) -> None:
+235	        assert statement._select_names is not None
+236	        parameters: MutableMapping[_DMLColumnElement, Any] = {
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/dml.py
+ Line number: 246
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+245	            # does not allow this construction to occur
+246	            assert False, "This statement already has parameters"
+247	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/dml.py
+ Line number: 330
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+329	            else:
+330	                assert self._multi_parameters
+331	                self._multi_parameters.extend(multi_parameters)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/dml.py
+ Line number: 364
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+363	            self._no_parameters = False
+364	            assert parameters is not None
+365	            self._dict_parameters = dict(parameters)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/dml.py
+ Line number: 1175
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1174	                    # case
+1175	                    assert isinstance(self, Insert)
+1176	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 323
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+322	        if TYPE_CHECKING:
+323	            assert isinstance(self, ClauseElement)
+324	        return dialect.statement_compiler(dialect, self, **kw)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 526
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+525	            if TYPE_CHECKING:
+526	                assert isinstance(self, Executable)
+527	            return connection._execute_clauseelement(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 702
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+701	            if TYPE_CHECKING:
+702	                assert compiled_cache is not None
+703	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 759
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+758	        grouped = self.self_group(against=operators.inv)
+759	        assert isinstance(grouped, ColumnElement)
+760	        return UnaryExpression(grouped, operator=operators.inv)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 1485
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1484	            grouped = self.self_group(against=operators.inv)
+1485	            assert isinstance(grouped, ColumnElement)
+1486	            return UnaryExpression(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 1682
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1681	
+1682	        assert key is not None
+1683	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 1747
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1746	            # 16 bits leftward.  fill extra add_hash on right
+1747	            assert add_hash < (2 << 15)
+1748	            assert seed
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 1748
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1747	            assert add_hash < (2 << 15)
+1748	            assert seed
+1749	            hash_value = (hash_value << 16) | add_hash
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 2883
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2882	        if operators.is_associative(op):
+2883	            assert (
+2884	                negate is None
+2885	            ), f"negate not supported for associative operator {op}"
+2886	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 3008
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3007	        grouped = self.self_group(against=operators.inv)
+3008	        assert isinstance(grouped, ColumnElement)
+3009	        return UnaryExpression(grouped, operator=operators.inv)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 3120
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3119	        else:
+3120	            assert lcc
+3121	            # just one element.  return it as a single boolean element,
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 3850
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3849	        # comparison operators should never call reverse_operate
+3850	        assert not operators.is_comparison(op)
+3851	        raise exc.ArgumentError(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 4071
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4070	    def self_group(self, against: Optional[OperatorType] = None) -> Self:
+4071	        assert against is operator.getitem
+4072	        return self
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 4121
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4120	    def _ungroup(self) -> ColumnElement[_T]:
+4121	        assert isinstance(self.element, ColumnElement)
+4122	        return self.element._ungroup()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 5074
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5073	            else:
+5074	                assert not TYPE_CHECKING or isinstance(t, NamedFromClause)
+5075	                label = t.name + "_" + name
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 5086
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5085	                # assert false on it for now
+5086	                assert not isinstance(label, quoted_name)
+5087	                label = quoted_name(label, t.name.quote)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 5314
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5313	    def __new__(cls, value: str, quote: Optional[bool]) -> quoted_name:
+5314	        assert (
+5315	            value is not None
+5316	        ), "use quoted_name.construct() for None passthrough"
+5317	        if isinstance(value, cls) and (quote is None or value.quote == quote):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 5445
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5444	        if TYPE_CHECKING:
+5445	            assert isinstance(self._Annotated__element, Column)
+5446	        return self._Annotated__element.info
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/functions.py
+ Line number: 1600
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1599	    def __init__(self, seq: schema.Sequence, **kw: Any) -> None:
+1600	        assert isinstance(
+1601	            seq, schema.Sequence
+1602	        ), "next_value() accepts a Sequence object as input."
+1603	        self.sequence = seq
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/lambdas.py
+ Line number: 408
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+407	        while parent is not None:
+408	            assert parent.closure_cache_key is not CacheConst.NO_CACHE
+409	            parent_closure_cache_key: Tuple[Any, ...] = (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/lambdas.py
+ Line number: 451
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+450	    def _resolve_with_args(self, *lambda_args: Any) -> ClauseElement:
+451	        assert isinstance(self._rec, AnalyzedFunction)
+452	        tracker_fn = self._rec.tracker_instrumented_fn
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/lambdas.py
+ Line number: 594
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+593	        if TYPE_CHECKING:
+594	            assert isinstance(self._rec.expected_expr, ClauseElement)
+595	        if self._rec.expected_expr.supports_execution:
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/lambdas.py
+ Line number: 1045
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+1044	        raise exc.InvalidRequestError(
+1045	            "Closure variable named '%s' inside of lambda callable %s "
+1046	            "does not refer to a cacheable SQL element, and also does not "
+1047	            "appear to be serving as a SQL literal bound value based on "
+1048	            "the default "
+1049	            "SQL expression returned by the function.   This variable "
+1050	            "needs to remain outside the scope of a SQL-generating lambda "
+1051	            "so that a proper cache key may be generated from the "
+1052	            "lambda's state.  Evaluate this variable outside of the "
+1053	            "lambda, set track_on=[<elements>] to explicitly select "
+1054	            "closure elements to track, or set "
+1055	            "track_closure_variables=False to exclude "
+1056	            "closure variables from being part of the cache key."
+1057	            % (variable_name, fn.__code__),
+1058	        ) from from_
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/lambdas.py
+ Line number: 1264
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+1263	        vars_ = {"o%d" % i: cell_values[i] for i in argrange}
+1264	        exec(code, vars_, vars_)
+1265	        closure = vars_["make_cells"]()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 824
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+823	            quote_schema = quote_schema
+824	            assert isinstance(schema, str)
+825	            self.schema = quoted_name(schema, quote_schema)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 948
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+947	
+948	        assert extend_existing
+949	        assert not keep_existing
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 949
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+948	        assert extend_existing
+949	        assert not keep_existing
+950	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 1046
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1045	        if sentinel_is_explicit and explicit_sentinel_col is autoinc_col:
+1046	            assert autoinc_col is not None
+1047	            sentinel_is_autoinc = True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 1125
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1124	        if the_sentinel is None and self.primary_key:
+1125	            assert autoinc_col is None
+1126	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 1272
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1271	        metadata = parent
+1272	        assert isinstance(metadata, MetaData)
+1273	        metadata._add_table(self.name, self.schema, self)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 2224
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2223	    def _set_type(self, type_: TypeEngine[Any]) -> None:
+2224	        assert self.type._isnull or type_ is self.type
+2225	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 2322
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2321	        table = parent
+2322	        assert isinstance(table, Table)
+2323	        if not self.name:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3023
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3022	        else:
+3023	            assert isinstance(self._colspec, str)
+3024	            return self._colspec
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3121
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3120	            if isinstance(c, Column):
+3121	                assert c.table is parenttable
+3122	                break
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3124
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3123	        else:
+3124	            assert False
+3125	        ######################
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3147
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3146	            parent = self.parent
+3147	            assert parent is not None
+3148	            key = parent.key
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3172
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3171	    def _set_target_column(self, column: Column[Any]) -> None:
+3172	        assert self.parent is not None
+3173	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3250
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3249	    def _set_parent(self, parent: SchemaEventTarget, **kw: Any) -> None:
+3250	        assert isinstance(parent, Column)
+3251	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3264
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3263	        self._set_target_column(_column)
+3264	        assert self.constraint is not None
+3265	        self.constraint._validate_dest_table(table)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3278
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3277	        # on the hosting Table when attached to the Table.
+3278	        assert isinstance(table, Table)
+3279	        if self.constraint is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3370
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3369	        if TYPE_CHECKING:
+3370	            assert isinstance(parent, Column)
+3371	        self.column = parent
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3936
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3935	        column = parent
+3936	        assert isinstance(column, Column)
+3937	        super()._set_parent(column)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4035
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4034	        column = parent
+4035	        assert isinstance(column, Column)
+4036	        self.column = column
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4189
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4188	    def _set_parent(self, parent: SchemaEventTarget, **kw: Any) -> None:
+4189	        assert isinstance(parent, (Table, Column))
+4190	        self.parent = parent
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4245
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4244	            # this is expected to be an empty list
+4245	            assert not processed_expressions
+4246	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4276
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4275	            # such that when all those cols are attached, we autoattach.
+4276	            assert not evt, "Should not reach here on event call"
+4277	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4330
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4329	            ]
+4330	            assert len(result) == len(self._pending_colargs)
+4331	            return result
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4346
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4345	    def _set_parent(self, parent: SchemaEventTarget, **kw: Any) -> None:
+4346	        assert isinstance(parent, (Table, Column))
+4347	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4407
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4406	    def _set_parent(self, parent: SchemaEventTarget, **kw: Any) -> None:
+4407	        assert isinstance(parent, (Column, Table))
+4408	        Constraint._set_parent(self, parent)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4445
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4444	
+4445	        assert isinstance(self.parent, Table)
+4446	        c = self.__class__(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4753
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4752	            if hasattr(self, "parent"):
+4753	                assert table is self.parent
+4754	            self._set_parent_with_dispatch(table)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4836
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4835	        table = parent
+4836	        assert isinstance(table, Table)
+4837	        Constraint._set_parent(self, table)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4986
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4985	        table = parent
+4986	        assert isinstance(table, Table)
+4987	        super()._set_parent(table)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 5298
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5297	        table = parent
+5298	        assert isinstance(table, Table)
+5299	        ColumnCollectionMixin._set_parent(self, table)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 5312
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5311	        col_expressions = self._col_expressions(table)
+5312	        assert len(expressions) == len(col_expressions)
+5313	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 5321
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5320	            else:
+5321	                assert False
+5322	        self.expressions = self._table_bound_expressions = exprs
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 6032
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+6031	    def _set_parent(self, parent: SchemaEventTarget, **kw: Any) -> None:
+6032	        assert isinstance(parent, Column)
+6033	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 6178
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+6177	    def _set_parent(self, parent: SchemaEventTarget, **kw: Any) -> None:
+6178	        assert isinstance(parent, Column)
+6179	        if not isinstance(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 919
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+918	            if "_columns" in self.__dict__:
+919	                assert "primary_key" in self.__dict__
+920	                assert "foreign_keys" in self.__dict__
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 920
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+919	                assert "primary_key" in self.__dict__
+920	                assert "foreign_keys" in self.__dict__
+921	                return
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 2106
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2105	    ) -> None:
+2106	        assert sampling is not None
+2107	        functions = util.preloaded.sql_functions
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 2261
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2260	        """
+2261	        assert is_select_statement(
+2262	            self.element
+2263	        ), f"CTE element f{self.element} does not support union()"
+2264	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 2293
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2292	
+2293	        assert is_select_statement(
+2294	            self.element
+2295	        ), f"CTE element f{self.element} does not support union_all()"
+2296	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 2407
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2406	                if TYPE_CHECKING:
+2407	                    assert is_column_element(c)
+2408	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 2413
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2412	                if TYPE_CHECKING:
+2413	                    assert is_column_element(c)
+2414	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 2455
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2454	                if TYPE_CHECKING:
+2455	                    assert is_column_element(c)
+2456	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 2479
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2478	                            # you need two levels of duplication to be here
+2479	                            assert hash(names[required_label_name]) == hash(c)
+2480	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 4831
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4830	            elif TYPE_CHECKING:
+4831	                assert is_column_element(c)
+4832	
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 4999
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+4998	                raise exc.InvalidRequestError(
+4999	                    "Select statement '%r"
+5000	                    "' returned no FROM clauses "
+5001	                    "due to auto-correlation; "
+5002	                    "specify correlate(<tables>) "
+5003	                    "to control correlation "
+5004	                    "manually." % self.statement
+5005	                )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 5053
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5052	                if onclause is not None:
+5053	                    assert isinstance(onclause, ColumnElement)
+5054	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 5076
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5075	            if TYPE_CHECKING:
+5076	                assert isinstance(right, FromClause)
+5077	                if onclause is not None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 5078
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5077	                if onclause is not None:
+5078	                    assert isinstance(onclause, ColumnElement)
+5079	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 5099
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5098	            else:
+5099	                assert left is not None
+5100	                self.from_clauses = self.from_clauses + (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 6249
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+6248	
+6249	        assert isinstance(self._where_criteria, tuple)
+6250	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 6956
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+6955	
+6956	        assert isinstance(self.element, ScalarSelect)
+6957	        element = self.element.element
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 7191
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+7190	        if TYPE_CHECKING:
+7191	            assert isinstance(fromclause, Subquery)
+7192	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with pickle module.
+ Test ID: B403
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 17
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b403-import-pickle
+ +
+
+16	import json
+17	import pickle
+18	from typing import Any
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 112
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+111	            if TYPE_CHECKING:
+112	                assert isinstance(self.type, HasExpressionLookup)
+113	            lookup = self.type._expression_adaptations.get(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 724
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+723	    def _literal_processor_portion(self, dialect, _portion=None):
+724	        assert _portion in (None, 0, -1)
+725	        if _portion is not None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 1518
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1517	            self.enum_class = enums[0]  # type: ignore[assignment]
+1518	            assert self.enum_class is not None
+1519	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 1549
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1548	        typ = self._resolve_for_python_type(tv, tv, tv)
+1549	        assert typ is not None
+1550	        return typ
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 1764
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1763	        kw.setdefault("_create_events", False)
+1764	        assert "_enums" in kw
+1765	        return impltype(**kw)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 1798
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1797	        )
+1798	        assert e.table is table
+1799	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 2038
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2037	        )
+2038	        assert e.table is table
+2039	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 2183
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2182	        if TYPE_CHECKING:
+2183	            assert isinstance(self.impl_instance, DateTime)
+2184	        impl_processor = self.impl_instance.bind_processor(dialect)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 2215
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2214	        if TYPE_CHECKING:
+2215	            assert isinstance(self.impl_instance, DateTime)
+2216	        impl_processor = self.impl_instance.result_processor(dialect, coltype)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/traversals.py
+ Line number: 360
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+359	                # TODO: use abc classes
+360	                assert False
+361	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/traversals.py
+ Line number: 549
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+548	
+549	                assert left_visit_sym is not None
+550	                assert left_attrname is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/traversals.py
+ Line number: 550
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+549	                assert left_visit_sym is not None
+550	                assert left_attrname is not None
+551	                assert right_attrname is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/traversals.py
+ Line number: 551
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+550	                assert left_attrname is not None
+551	                assert right_attrname is not None
+552	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/traversals.py
+ Line number: 554
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+553	                dispatch = self.dispatch(left_visit_sym)
+554	                assert dispatch is not None, (
+555	                    f"{self.__class__} has no dispatch for "
+556	                    f"'{self._dispatch_lookup[left_visit_sym]}'"
+557	                )
+558	                left_child = operator.attrgetter(left_attrname)(left)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/type_api.py
+ Line number: 987
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+986	            # this can't be self, else we create a cycle
+987	            assert impl is not self
+988	            d: _TypeMemoDict = {"impl": impl, "result": {}}
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/type_api.py
+ Line number: 1745
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1744	            if TYPE_CHECKING:
+1745	                assert isinstance(self.expr.type, TypeDecorator)
+1746	            kwargs["_python_is_types"] = self.expr.type.coerce_to_is_types
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/type_api.py
+ Line number: 1753
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1752	            if TYPE_CHECKING:
+1753	                assert isinstance(self.expr.type, TypeDecorator)
+1754	            kwargs["_python_is_types"] = self.expr.type.coerce_to_is_types
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/util.py
+ Line number: 234
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+233	            if resolve_ambiguity:
+234	                assert cols_in_onclause is not None
+235	                if set(f.c).union(s.c).issuperset(cols_in_onclause):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/util.py
+ Line number: 421
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+420	        elif isinstance(element, _textual_label_reference):
+421	            assert False, "can't unwrap a textual label reference"
+422	        return None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/util.py
+ Line number: 695
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+694	            else:
+695	                assert False, "Unknown parameter type %s" % (
+696	                    type(multi_params[0])
+697	                )
+698	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/util.py
+ Line number: 863
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+862	        if prevright is not None:
+863	            assert right is not None
+864	            prevright.left = right
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/util.py
+ Line number: 1197
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1196	        if TYPE_CHECKING:
+1197	            assert isinstance(col, KeyedColumnElement)
+1198	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/util.py
+ Line number: 1207
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1206	        if TYPE_CHECKING:
+1207	            assert isinstance(col, KeyedColumnElement)
+1208	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/util.py
+ Line number: 1336
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1335	    def chain(self, visitor: ExternalTraversal) -> ColumnAdapter:
+1336	        assert isinstance(visitor, ColumnAdapter)
+1337	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/util.py
+ Line number: 1463
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1462	        else:
+1463	            assert offset_clause is not None
+1464	            offset_clause = _offset_or_limit_clause(offset_clause)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py
+ Line number: 584
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+583	            sym_name = sym.value
+584	            assert sym_name not in lookup, sym_name
+585	            lookup[sym] = lookup[sym_name] = visit_key
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 190
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+189	        # block will assert our messages
+190	        assert _SEEN is not None
+191	        assert _EXC_CLS is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 191
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+190	        assert _SEEN is not None
+191	        assert _EXC_CLS is not None
+192	        _FILTERS.extend(filters)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 249
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+248	                if assert_:
+249	                    assert not seen, "Warnings were not seen: %s" % ", ".join(
+250	                        "%r" % (s.pattern if regex else s) for s in seen
+251	                    )
+252	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 271
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+270	    deviance = int(expected * variance)
+271	    assert (
+272	        abs(received - expected) < deviance
+273	    ), "Given int value %s is not within %d%% of expected value %s" % (
+274	        received,
+275	        variance * 100,
+276	        expected,
+277	    )
+278	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 281
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+280	def eq_regex(a, b, msg=None, flags=0):
+281	    assert re.match(b, a, flags), msg or "%r !~ %r" % (a, b)
+282	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 286
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+285	    """Assert a == b, with repr messaging on failure."""
+286	    assert a == b, msg or "%r != %r" % (a, b)
+287	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 291
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+290	    """Assert a != b, with repr messaging on failure."""
+291	    assert a != b, msg or "%r == %r" % (a, b)
+292	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 296
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+295	    """Assert a <= b, with repr messaging on failure."""
+296	    assert a <= b, msg or "%r != %r" % (a, b)
+297	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 300
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+299	def is_instance_of(a, b, msg=None):
+300	    assert isinstance(a, b), msg or "%r is not an instance of %r" % (a, b)
+301	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 321
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+320	    """Assert a is b, with repr messaging on failure."""
+321	    assert a is b, msg or "%r is not %r" % (a, b)
+322	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 326
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+325	    """Assert a is not b, with repr messaging on failure."""
+326	    assert a is not b, msg or "%r is %r" % (a, b)
+327	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 335
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+334	    """Assert a in b, with repr messaging on failure."""
+335	    assert a in b, msg or "%r not in %r" % (a, b)
+336	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 340
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+339	    """Assert a in not b, with repr messaging on failure."""
+340	    assert a not in b, msg or "%r is in %r" % (a, b)
+341	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 349
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+348	    """Assert a.startswith(fragment), with repr messaging on failure."""
+349	    assert a.startswith(fragment), msg or "%r does not start with %r" % (
+350	        a,
+351	        fragment,
+352	    )
+353	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 363
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+362	
+363	    assert a == b, msg or "%r != %r" % (a, b)
+364	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 380
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+379	    ):
+380	        assert False, (
+381	            "Exception %r was correctly raised but did not set a cause, "
+382	            "within context %r as its cause."
+383	            % (exception, exception.__context__)
+384	        )
+385	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 476
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+475	            error_as_string = str(err)
+476	            assert re.search(msg, error_as_string, re.UNICODE), "%r !~ %s" % (
+477	                msg,
+478	                error_as_string,
+479	            )
+480	        if check_context and not are_we_already_in_a_traceback:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 492
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+491	    # assert outside the block so it works for AssertionError too !
+492	    assert success, "Callable did not raise an exception"
+493	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 752
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+751	                    msg = "Expected to find bindparam %r in %r" % (v, stmt)
+752	                    assert False, msg
+753	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 777
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+776	    ):
+777	        assert len(table.c) == len(reflected_table.c)
+778	        for c, reflected_c in zip(table.c, reflected_table.c):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 780
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+779	            eq_(c.name, reflected_c.name)
+780	            assert reflected_c is reflected_table.c[c.name]
+781	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 788
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+787	                msg = "Type '%s' doesn't correspond to type '%s'"
+788	                assert isinstance(reflected_c.type, type(c.type)), msg % (
+789	                    reflected_c.type,
+790	                    c.type,
+791	                )
+792	            else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 804
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+803	            if c.server_default:
+804	                assert isinstance(
+805	                    reflected_c.server_default, schema.FetchedValue
+806	                )
+807	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 809
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+808	        if strict_constraints:
+809	            assert len(table.primary_key) == len(reflected_table.primary_key)
+810	            for c in table.primary_key:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 811
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+810	            for c in table.primary_key:
+811	                assert reflected_table.primary_key.columns[c.name] is not None
+812	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 814
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+813	    def assert_types_base(self, c1, c2):
+814	        assert c1.type._compare_type_affinity(
+815	            c2.type
+816	        ), "On column %r, type '%s' doesn't correspond to type '%s'" % (
+817	            c1.name,
+818	            c1.type,
+819	            c2.type,
+820	        )
+821	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertsql.py
+ Line number: 32
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+31	    def no_more_statements(self):
+32	        assert False, (
+33	            "All statements are complete, but pending "
+34	            "assertion rules remain"
+35	        )
+36	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertsql.py
+ Line number: 103
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+102	                # to look like all the current RETURNING dialects
+103	                assert dialect.insert_executemany_returning
+104	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertsql.py
+ Line number: 351
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+350	        if self.count != self._statement_count:
+351	            assert False, "desired statement count %d does not match %d" % (
+352	                self.count,
+353	                self._statement_count,
+354	            )
+355	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertsql.py
+ Line number: 470
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+469	            elif rule.errormessage:
+470	                assert False, rule.errormessage
+471	        if observed:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertsql.py
+ Line number: 472
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+471	        if observed:
+472	            assert False, "Additional SQL statements remain:\n%s" % observed
+473	        elif not rule.is_consumed:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/config.py
+ Line number: 389
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+388	    def push_engine(cls, db, namespace):
+389	        assert _current, "Can't push without a default Config set up"
+390	        cls.push(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/engines.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+60	
+61	        assert scope in ("class", "global", "function", "fixture")
+62	        self.testing_engines[scope].add(engine)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/engines.py
+ Line number: 170
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+169	                    # are not easily preventable
+170	                    assert (
+171	                        False
+172	                    ), "%d connection recs not cleared after test suite" % (ln)
+173	        if config.options and config.options.low_connections:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/engines.py
+ Line number: 186
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+185	            if rec.is_valid:
+186	                assert False
+187	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/engines.py
+ Line number: 259
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+258	            curs.execute("select 1")
+259	            assert False, "simulated connect failure didn't work"
+260	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/engines.py
+ Line number: 420
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+419	        recv = [re.sub(r"[\n\t]", "", str(s)) for s in buffer]
+420	        assert recv == stmts, recv
+421	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/engines.py
+ Line number: 427
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+426	    engine = create_mock_engine(dialect_name + "://", executor)
+427	    assert not hasattr(engine, "mock")
+428	    engine.mock = buffer
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/exclusions.py
+ Line number: 242
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+241	        else:
+242	            assert False, "unknown predicate type: %s" % predicate
+243	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/exclusions.py
+ Line number: 310
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+309	        if self.op is not None:
+310	            assert driver is None, "DBAPI version specs not supported yet"
+311	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/exclusions.py
+ Line number: 473
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+472	def against(config, *queries):
+473	    assert queries, "no queries sent!"
+474	    return OrPredicate([Predicate.as_predicate(query) for query in queries])(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/base.py
+ Line number: 50
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+49	    def assert_(self, val, msg=None):
+50	        assert val, msg
+51	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/base.py
+ Line number: 101
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+100	                r.all()
+101	            except:
+102	                pass
+103	        for r in to_close:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/base.py
+ Line number: 106
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+105	                r.close()
+106	            except:
+107	                pass
+108	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/base.py
+ Line number: 230
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+229	            name = dialect_cls.name
+230	            assert name, "name is required"
+231	            registry.impls[name] = dialect_cls
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/base.py
+ Line number: 236
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+235	
+236	        assert name is not None
+237	        del registry.impls[name]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/mypy.py
+ Line number: 324
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+323	                    print("Remaining messages:", extra, sep="\n")
+324	                assert False, "expected messages not found, see stdout"
+325	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/mypy.py
+ Line number: 329
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+328	                print("\n".join(msg for _, msg in output))
+329	                assert False, "errors and/or notes remain, see stdout"
+330	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/orm.py
+ Line number: 119
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+118	            def __init_subclass__(cls) -> None:
+119	                assert cls_registry is not None
+120	                cls_registry[cls.__name__] = cls
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/orm.py
+ Line number: 175
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+174	            def __init_subclass__(cls, **kw) -> None:
+175	                assert cls_registry is not None
+176	                cls_registry[cls.__name__] = cls
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/sql.py
+ Line number: 86
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+85	                cls.run_create_tables = "each"
+86	            assert cls.run_inserts in ("each", None)
+87	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/sql.py
+ Line number: 328
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+327	        if a_key is None:
+328	            assert a._annotations.get("nocache")
+329	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/sql.py
+ Line number: 330
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+329	
+330	            assert b_key is None
+331	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/sql.py
+ Line number: 336
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+335	            for a_param, b_param in zip(a_key.bindparams, b_key.bindparams):
+336	                assert a_param.compare(b_param, compare_values=compare_values)
+337	        return a_key, b_key
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/sql.py
+ Line number: 358
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+357	                    if a_key is None:
+358	                        assert case_a[a]._annotations.get("nocache")
+359	                    if b_key is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/sql.py
+ Line number: 360
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+359	                    if b_key is None:
+360	                        assert case_b[b]._annotations.get("nocache")
+361	                    continue
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/bootstrap.py
+ Line number: 39
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+38	    spec = importlib.util.spec_from_file_location(name, path)
+39	    assert spec is not None
+40	    assert spec.loader is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/bootstrap.py
+ Line number: 40
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+39	    assert spec is not None
+40	    assert spec.loader is not None
+41	    mod = importlib.util.module_from_spec(spec)
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/pytestplugin.py
+ Line number: 645
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+644	        # in format_argpsec_plus()
+645	        exec(code, env)
+646	        return env[fn_name]
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_ddl.py
+ Line number: 214
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+213	                "_".join(
+214	                    "".join(random.choice("abcdef") for j in range(20))
+215	                    for i in range(10)
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_ddl.py
+ Line number: 259
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+258	                "_".join(
+259	                    "".join(random.choice("abcdef") for j in range(30))
+260	                    for i in range(10)
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_ddl.py
+ Line number: 287
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+286	                "_".join(
+287	                    "".join(random.choice("abcdef") for j in range(30))
+288	                    for i in range(10)
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_ddl.py
+ Line number: 315
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+314	                "_".join(
+315	                    "".join(random.choice("abcdef") for j in range(30))
+316	                    for i in range(10)
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_ddl.py
+ Line number: 343
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+342	                "_".join(
+343	                    "".join(random.choice("abcdef") for j in range(30))
+344	                    for i in range(10)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_ddl.py
+ Line number: 379
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+378	
+379	        assert len(actual_name) > 255
+380	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_dialect.py
+ Line number: 143
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+142	                conn.execute(select(literal_column("méil")))
+143	                assert False
+144	            except exc.DBAPIError as err:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_dialect.py
+ Line number: 147
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+146	
+147	                assert str(err.orig) in str(err)
+148	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_dialect.py
+ Line number: 149
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+148	
+149	            assert isinstance(err_str, str)
+150	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 161
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+160	        r = connection.execute(stmt, data)
+161	        assert not r.returns_rows
+162	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 168
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+167	        )
+168	        assert r._soft_closed
+169	        assert not r.closed
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 169
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+168	        assert r._soft_closed
+169	        assert not r.closed
+170	        assert r.is_insert
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 170
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+169	        assert not r.closed
+170	        assert r.is_insert
+171	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 177
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+176	        # case, the row had to have been consumed at least.
+177	        assert not r.returns_rows or r.fetchone() is None
+178	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 188
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+187	        )
+188	        assert r._soft_closed
+189	        assert not r.closed
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 189
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+188	        assert r._soft_closed
+189	        assert not r.closed
+190	        assert r.is_insert
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 190
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+189	        assert not r.closed
+190	        assert r.is_insert
+191	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 196
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+195	        # "returns rows"
+196	        assert r.returns_rows
+197	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 210
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+209	        r = connection.execute(self.tables.autoinc_pk.insert())
+210	        assert r._soft_closed
+211	        assert not r.closed
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 211
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+210	        assert r._soft_closed
+211	        assert not r.closed
+212	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 223
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+222	        r = connection.execute(self.tables.autoinc_pk.insert(), [{}, {}, {}])
+223	        assert r._soft_closed
+224	        assert not r.closed
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 224
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+223	        assert r._soft_closed
+224	        assert not r.closed
+225	
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 111
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+110	            query = (
+111	                "CREATE VIEW %s.vv AS SELECT id, data FROM %s.test_table_s"
+112	                % (
+113	                    config.test_schema,
+114	                    config.test_schema,
+115	                )
+116	            )
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 149
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+148	                DDL(
+149	                    "create temporary view user_tmp_v as "
+150	                    "select * from user_tmp_%s" % config.ident
+151	                ),
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 263
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+262	        meth = self._has_index(kind, connection)
+263	        assert meth("test_table", "my_idx")
+264	        assert not meth("test_table", "my_idx_s")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 264
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+263	        assert meth("test_table", "my_idx")
+264	        assert not meth("test_table", "my_idx_s")
+265	        assert not meth("nonexistent_table", "my_idx")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 265
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+264	        assert not meth("test_table", "my_idx_s")
+265	        assert not meth("nonexistent_table", "my_idx")
+266	        assert not meth("test_table", "nonexistent_idx")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 266
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+265	        assert not meth("nonexistent_table", "my_idx")
+266	        assert not meth("test_table", "nonexistent_idx")
+267	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 268
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+267	
+268	        assert not meth("test_table", "my_idx_2")
+269	        assert not meth("test_table_2", "my_idx_3")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 269
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+268	        assert not meth("test_table", "my_idx_2")
+269	        assert not meth("test_table_2", "my_idx_3")
+270	        idx = Index("my_idx_2", self.tables.test_table.c.data2)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 281
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+280	            if kind == "inspector":
+281	                assert not meth("test_table", "my_idx_2")
+282	                assert not meth("test_table_2", "my_idx_3")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 282
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+281	                assert not meth("test_table", "my_idx_2")
+282	                assert not meth("test_table_2", "my_idx_3")
+283	                meth.__self__.clear_cache()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 284
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+283	                meth.__self__.clear_cache()
+284	            assert meth("test_table", "my_idx_2") is True
+285	            assert meth("test_table_2", "my_idx_3") is True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 285
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+284	            assert meth("test_table", "my_idx_2") is True
+285	            assert meth("test_table_2", "my_idx_3") is True
+286	        finally:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 294
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+293	        meth = self._has_index(kind, connection)
+294	        assert meth("test_table", "my_idx_s", schema=config.test_schema)
+295	        assert not meth("test_table", "my_idx", schema=config.test_schema)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 295
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+294	        assert meth("test_table", "my_idx_s", schema=config.test_schema)
+295	        assert not meth("test_table", "my_idx", schema=config.test_schema)
+296	        assert not meth(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 296
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+295	        assert not meth("test_table", "my_idx", schema=config.test_schema)
+296	        assert not meth(
+297	            "nonexistent_table", "my_idx_s", schema=config.test_schema
+298	        )
+299	        assert not meth(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 299
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+298	        )
+299	        assert not meth(
+300	            "test_table", "nonexistent_idx_s", schema=config.test_schema
+301	        )
+302	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 369
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+368	
+369	        assert o2.c.ref.references(t1.c[0])
+370	        if use_composite:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 371
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+370	        if use_composite:
+371	            assert o2.c.ref2.references(t1.c[1])
+372	
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 513
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+512	            for name in names:
+513	                query = "CREATE VIEW %s AS SELECT * FROM %s" % (
+514	                    config.db.dialect.identifier_preparer.quote(
+515	                        "view %s" % name
+516	                    ),
+517	                    config.db.dialect.identifier_preparer.quote(name),
+518	                )
+519	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 553
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+552	        insp = inspect(config.db)
+553	        assert insp.get_view_definition("view %s" % name)
+554	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 558
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+557	        insp = inspect(config.db)
+558	        assert insp.get_columns(name)
+559	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 563
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+562	        insp = inspect(config.db)
+563	        assert insp.get_pk_constraint(name)
+564	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 569
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+568	        insp = inspect(config.db)
+569	        assert insp.get_foreign_keys(name)
+570	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 575
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+574	        insp = inspect(config.db)
+575	        assert insp.get_indexes(name)
+576	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 581
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+580	        insp = inspect(config.db)
+581	        assert insp.get_unique_constraints(name)
+582	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 587
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+586	        insp = inspect(config.db)
+587	        assert insp.get_table_comment(name)
+588	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 593
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+592	        insp = inspect(config.db)
+593	        assert insp.get_check_constraints(name)
+594	
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 845
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+844	                DDL(
+845	                    "create temporary view user_tmp_v as "
+846	                    "select * from user_tmp_%s" % config.ident
+847	                ),
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 864
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+863	            query = (
+864	                f"CREATE {prefix}VIEW {view_name} AS SELECT * FROM {fullname}"
+865	            )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 1573
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1572	        inspect(engine)
+1573	        assert hasattr(engine.dialect, "default_schema_name")
+1574	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 1757
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1756	                if not col.primary_key:
+1757	                    assert cols[i]["default"] is None
+1758	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 2057
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2056	        index_names = [idx["name"] for idx in indexes]
+2057	        assert idx_name in index_names, f"Expected {idx_name} in {index_names}"
+2058	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 2174
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2173	
+2174	        assert not idx_names.intersection(uq_names)
+2175	        if names_that_duplicate_index:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 2258
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2257	            id_ = {c["name"]: c for c in cols}[cname]
+2258	            assert id_.get("autoincrement", True)
+2259	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 2697
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2696	        m.reflect(connection)
+2697	        assert set(m.tables).intersection(["empty"])
+2698	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 3037
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3036	        ):
+3037	            assert isinstance(typ, sql_types.Numeric)
+3038	            eq_(typ.precision, 18)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 3053
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3052	        if issubclass(type_, sql_types.VARCHAR):
+3053	            assert isinstance(typ, sql_types.VARCHAR)
+3054	        elif issubclass(type_, sql_types.CHAR):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 3055
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3054	        elif issubclass(type_, sql_types.CHAR):
+3055	            assert isinstance(typ, sql_types.CHAR)
+3056	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 3057
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3056	        else:
+3057	            assert isinstance(typ, sql_types.String)
+3058	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 3060
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3059	        eq_(typ.length, 52)
+3060	        assert isinstance(typ.length, int)
+3061	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 3238
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3237	        t1_ref = m2.tables["t1"]
+3238	        assert t2_ref.c.t1id.references(t1_ref.c.id)
+3239	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 3244
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3243	        )
+3244	        assert m3.tables["t2"].c.t1id.references(m3.tables["t1"].c.id)
+3245	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_results.py
+ Line number: 384
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+383	            ).exec_driver_sql(self.stringify("select 1"))
+384	            assert self._is_server_side(result.cursor)
+385	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_results.py
+ Line number: 408
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+407	            result = conn.execution_options(stream_results=False).execute(s)
+408	            assert not self._is_server_side(result.cursor)
+409	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_results.py
+ Line number: 421
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+420	            result = conn.execute(s1.select())
+421	            assert not self._is_server_side(result.cursor)
+422	            result.close()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_results.py
+ Line number: 427
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+426	            result = conn.execute(s2)
+427	            assert not self._is_server_side(result.cursor)
+428	            result.close()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_rowcount.py
+ Line number: 116
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+115	
+116	        assert r.rowcount in (-1, 3)
+117	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_rowcount.py
+ Line number: 127
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+126	        )
+127	        assert r.rowcount == 3
+128	
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_select.py
+ Line number: 1067
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+1066	            CursorSQL(
+1067	                "SELECT some_table.id \nFROM some_table "
+1068	                "\nWHERE (some_table.x, some_table.y) "
+1069	                "IN (%s(5, 10), (12, 18))"
+1070	                % ("VALUES " if config.db.dialect.tuple_in_values else ""),
+1071	                () if config.db.dialect.positional else {},
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_select.py
+ Line number: 1091
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+1090	            CursorSQL(
+1091	                "SELECT some_table.id \nFROM some_table "
+1092	                "\nWHERE (some_table.x, some_table.z) "
+1093	                "IN (%s(5, 'z1'), (12, 'z3'))"
+1094	                % ("VALUES " if config.db.dialect.tuple_in_values else ""),
+1095	                () if config.db.dialect.positional else {},
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_sequence.py
+ Line number: 185
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+184	            stmt,
+185	            "INSERT INTO x (y, q) VALUES (%s, 5)" % (seq_nextval,),
+186	            literal_binds=True,
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 127
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+126	            rows = connection.execute(stmt).all()
+127	            assert rows, "No rows returned"
+128	            for row in rows:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 132
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+131	                    value = filter_(value)
+132	                assert value in output
+133	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 175
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+174	        eq_(row, (self.data,))
+175	        assert isinstance(row[0], str)
+176	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 190
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+189	        for row in rows:
+190	            assert isinstance(row[0], str)
+191	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 601
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+600	        eq_(row, (compare,))
+601	        assert isinstance(row[0], type(compare))
+602	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 616
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+615	        eq_(row, (compare,))
+616	        assert isinstance(row[0], type(compare))
+617	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 857
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+856	
+857	            assert isinstance(row[0], int)
+858	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 1249
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1248	        eq_(row, (True, False))
+1249	        assert isinstance(row[0], bool)
+1250	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 1659
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1658	        else:
+1659	            assert False
+1660	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 1716
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1715	        else:
+1716	            assert False
+1717	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 48
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+47	        )
+48	        assert not r.is_insert
+49	        assert not r.returns_rows
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 49
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+48	        assert not r.is_insert
+49	        assert not r.returns_rows
+50	        assert r.rowcount == 1
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 50
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+49	        assert not r.returns_rows
+50	        assert r.rowcount == 1
+51	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 60
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+59	        r = connection.execute(t.delete().where(t.c.id == 2))
+60	        assert not r.is_insert
+61	        assert not r.returns_rows
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+60	        assert not r.is_insert
+61	        assert not r.returns_rows
+62	        assert r.rowcount == 1
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 62
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+61	        assert not r.returns_rows
+62	        assert r.rowcount == 1
+63	        eq_(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 85
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+84	        r = connection.execute(stmt, dict(data="d2_new"))
+85	        assert not r.is_insert
+86	        assert r.returns_rows
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 86
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+85	        assert not r.is_insert
+86	        assert r.returns_rows
+87	        eq_(r.keys(), ["id", "data"])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 120
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+119	        r = connection.execute(stmt)
+120	        assert not r.is_insert
+121	        assert r.returns_rows
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 121
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+120	        assert not r.is_insert
+121	        assert r.returns_rows
+122	        eq_(r.keys(), ["id", "data"])
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with pickle module.
+ Test ID: B403
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/util.py
+ Line number: 18
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b403-import-pickle
+ +
+
+17	from itertools import chain
+18	import pickle
+19	import random
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/util.py
+ Line number: 67
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+66	def random_choices(population, k=1):
+67	    return random.choices(population, k=k)
+68	
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/util.py
+ Line number: 87
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+86	    def pop(self):
+87	        index = random.randint(0, len(self) - 1)
+88	        item = list(set.__iter__(self))[index]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/util.py
+ Line number: 192
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+191	def fail(msg):
+192	    assert False, msg
+193	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/util.py
+ Line number: 407
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+406	    if schema is not None:
+407	        assert consider_schemas == (
+408	            None,
+409	        ), "consider_schemas and schema are mutually exclusive"
+410	        consider_schemas = (schema,)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py
+ Line number: 276
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+275	            self._lazy_init()
+276	            assert self._loop
+277	            return self._loop
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py
+ Line number: 281
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+280	            self._lazy_init()
+281	            assert self._loop
+282	            return self._loop.run_until_complete(coro)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/compat.py
+ Line number: 105
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+104	            ann = _get_dunder_annotations(obj)
+105	        except Exception:
+106	            pass
+107	        else:
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak MD5 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/compat.py
+ Line number: 222
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+221	    def md5_not_for_security() -> Any:
+222	        return hashlib.md5()
+223	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py
+ Line number: 139
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+138	    def decorate(fn: _F) -> _F:
+139	        assert message is not None
+140	        assert warning is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py
+ Line number: 140
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+139	        assert message is not None
+140	        assert warning is not None
+141	        return _decorate_with_warning(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py
+ Line number: 184
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+183	        if not attribute_ok:
+184	            assert kw.get("enable_warnings") is False, (
+185	                "attribute %s will emit a warning on read access.  "
+186	                "If you *really* want this, "
+187	                "add warn_on_attribute_access=True.  Otherwise please add "
+188	                "enable_warnings=False." % api_name
+189	            )
+190	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py
+ Line number: 265
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+264	            ):
+265	                assert check_any_kw is not None
+266	                _warn_with_version(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py
+ Line number: 347
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+346	        if constructor is not None:
+347	            assert constructor_fn is not None
+348	            assert wtype is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py
+ Line number: 348
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+347	            assert constructor_fn is not None
+348	            assert wtype is not None
+349	            setattr(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 115
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+114	    ) -> NoReturn:
+115	        assert self._exc_info is not None
+116	        # see #2703 for notes
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 119
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+118	            exc_type, exc_value, exc_tb = self._exc_info
+119	            assert exc_value is not None
+120	            self._exc_info = None  # remove potential circular references
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 124
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+123	            self._exc_info = None  # remove potential circular references
+124	            assert value is not None
+125	            raise value.with_traceback(traceback)
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 316
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+315	) -> Callable[..., Any]:
+316	    exec(code, env)
+317	    return env[fn_name]  # type: ignore[no-any-return]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 422
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+421	        _set = set()
+422	    assert _set is not None
+423	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 769
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+768	            if default_len:
+769	                assert spec.defaults
+770	                kw_args.update(
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 792
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+791	                output.append("%s=%r" % (arg, val))
+792	        except Exception:
+793	            pass
+794	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 801
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+800	                    output.append("%s=%r" % (arg, val))
+801	            except Exception:
+802	                pass
+803	
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 950
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+949	        )
+950	        exec(py, env)
+951	        try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 1204
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1203	        for elem in self._memoized_keys:
+1204	            assert elem not in self.__dict__
+1205	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 1484
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1483	            for key in dictlike.iterkeys():
+1484	                assert getter is not None
+1485	                yield key, getter(key)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 1546
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1545	    def __set__(self, instance: Any, value: Any) -> None:
+1546	        assert self.setfn is not None
+1547	        self.setfn(instance, value)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 1605
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1604	            if sym is None:
+1605	                assert isinstance(name, str)
+1606	                if canonical is None:
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 1944
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+1943	    env = locals().copy()
+1944	    exec(code, env)
+1945	    return env["set"]
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/tool_support.py
+ Line number: 24
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+23	import shutil
+24	import subprocess
+25	import sys
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/tool_support.py
+ Line number: 46
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+45	        self.pyproject_toml_path = self.source_root / Path("pyproject.toml")
+46	        assert self.pyproject_toml_path.exists()
+47	
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/tool_support.py
+ Line number: 109
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+108	
+109	        subprocess.run(
+110	            [
+111	                sys.executable,
+112	                "-c",
+113	                "import %s; %s.%s()" % (impl.module, impl.module, impl.attr),
+114	            ]
+115	            + cmdline_options_list,
+116	            cwd=str(self.source_root),
+117	            **kw,
+118	        )
+119	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/tool_support.py
+ Line number: 166
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+165	        else:
+166	            assert False, "source or source_file is required"
+167	
+
+
+ + +
+
+ +
+
+ blacklist: Use of possibly insecure function - consider using safer ast.literal_eval.
+ Test ID: B307
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/typing.py
+ Line number: 274
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b307-eval
+ +
+
+273	
+274	            annotation = eval(expression, cls_namespace, locals_)
+275	        else:
+
+
+ + +
+
+ +
+
+ blacklist: Use of possibly insecure function - consider using safer ast.literal_eval.
+ Test ID: B307
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/typing.py
+ Line number: 276
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b307-eval
+ +
+
+275	        else:
+276	            annotation = eval(expression, base_globals, locals_)
+277	    except Exception as err:
+
+
+ + +
+
+ +
+
+ hardcoded_tmp_directory: Probable insecure usage of temp file/directory.
+ Test ID: B108
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-377
+ File: ./venv/lib/python3.12/site-packages/stevedore/_cache.py
+ Line number: 153
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b108_hardcoded_tmp_directory.html
+ +
+
+152	                os.path.isfile(os.path.join(self._dir, '.disable')),
+153	                sys.executable[0:4] == '/tmp',  # noqa: S108,
+154	            ]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/stevedore/example/load_as_driver.py
+ Line number: 42
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+41	    # okay because invoke_on_load is true
+42	    assert isinstance(mgr.driver, FormatterBase)
+43	    for chunk in mgr.driver.format(data):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/stevedore/example/load_as_extension.py
+ Line number: 44
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+43	    ) -> tuple[str, Iterable[str]]:
+44	        assert ext.obj is not None
+45	        return (ext.name, ext.obj.format(data))
+
+
+ + +
+
+ +
+
+ hardcoded_tmp_directory: Probable insecure usage of temp file/directory.
+ Test ID: B108
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-377
+ File: ./venv/lib/python3.12/site-packages/stevedore/tests/test_cache.py
+ Line number: 28
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b108_hardcoded_tmp_directory.html
+ +
+
+27	        """
+28	        with mock.patch.object(sys, 'executable', '/tmp/fake'):
+29	            sot = _cache.Cache()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/stevedore/tests/test_extension.py
+ Line number: 86
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+85	        else:
+86	            assert False, 'Failed to raise KeyError'
+87	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/stevedore/tests/test_extension.py
+ Line number: 141
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+140	        for e in em.extensions:
+141	            assert e.obj is not None
+142	            self.assertEqual(e.obj.args, ('a',))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/stevedore/tests/test_extension.py
+ Line number: 198
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+197	            em.map(mapped, 1, 2, a='A', b='B')
+198	            assert False
+199	        except RuntimeError:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/stevedore/tests/test_hook.py
+ Line number: 60
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+59	        else:
+60	            assert False, 'Failed to raise KeyError'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/stevedore/tests/test_test_manager.py
+ Line number: 154
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+153	        # This will raise KeyError if the names don't match
+154	        assert em[test_extension.name]
+155	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 411
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+410	                            deduped_pairs.remove(pair)
+411	                    assert not deduped_pairs, deduped_pairs
+412	                    parameters = tuple(new_parameters)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 1815
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1814	                if len(params) == 1 and not typing._is_param_expr(args[0]):
+1815	                    assert i == 0
+1816	                    args = (args,)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 2020
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2019	                    if len(params) == 1 and not _is_param_expr(args[0]):
+2020	                        assert i == 0
+2021	                        args = (args,)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 2500
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2499	        def __typing_unpacked_tuple_args__(self):
+2500	            assert self.__origin__ is Unpack
+2501	            assert len(self.__args__) == 1
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 2501
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2500	            assert self.__origin__ is Unpack
+2501	            assert len(self.__args__) == 1
+2502	            arg, = self.__args__
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 2511
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2510	        def __typing_is_unpacked_typevartuple__(self):
+2511	            assert self.__origin__ is Unpack
+2512	            assert len(self.__args__) == 1
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 2512
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2511	            assert self.__origin__ is Unpack
+2512	            assert len(self.__args__) == 1
+2513	            return isinstance(self.__args__[0], TypeVarTuple)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 3310
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3309	        def __new__(cls, typename, bases, ns):
+3310	            assert _NamedTuple in bases
+3311	            for base in bases:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 3382
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3381	    def _namedtuple_mro_entries(bases):
+3382	        assert NamedTuple in bases
+3383	        return (_NamedTuple,)
+
+
+ + +
+
+ +
+
+ blacklist: Use of possibly insecure function - consider using safer ast.literal_eval.
+ Test ID: B307
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 4034
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b307-eval
+ +
+
+4033	        return_value = {key:
+4034	            value if not isinstance(value, str) else eval(value, globals, locals)
+4035	            for key, value in ann.items() }
+
+
+ + +
+
+ +
+
+ blacklist: Use of possibly insecure function - consider using safer ast.literal_eval.
+ Test ID: B307
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 4116
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b307-eval
+ +
+
+4115	            code = forward_ref.__forward_code__
+4116	            value = eval(code, globals, locals)
+4117	        forward_ref.__forward_evaluated__ = True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/_internal.py
+ Line number: 39
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+38	    env = getattr(obj, "environ", obj)
+39	    assert isinstance(env, dict), (
+40	        f"{type(obj).__name__!r} is not a WSGI environment (has to be a dict)"
+41	    )
+42	    return env
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/werkzeug/_reloader.py
+ Line number: 5
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+4	import os
+5	import subprocess
+6	import sys
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/werkzeug/_reloader.py
+ Line number: 275
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+274	            new_environ["WERKZEUG_RUN_MAIN"] = "true"
+275	            exit_code = subprocess.call(args, env=new_environ, close_fds=False)
+276	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/datastructures/file_storage.py
+ Line number: 142
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+141	            self.stream.close()
+142	        except Exception:
+143	            pass
+144	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/datastructures/range.py
+ Line number: 178
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+177	        """Simple method to update the ranges."""
+178	        assert http.is_byte_range_valid(start, stop, length), "Bad range provided"
+179	        self._units: str | None = units
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/werkzeug/debug/__init__.py
+ Line number: 45
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+44	def hash_pin(pin: str) -> str:
+45	    return hashlib.sha1(f"{pin} added salt".encode("utf-8", "replace")).hexdigest()[:12]
+46	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/werkzeug/debug/__init__.py
+ Line number: 88
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+87	            # https://github.com/pallets/werkzeug/issues/925
+88	            from subprocess import PIPE
+89	            from subprocess import Popen
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/werkzeug/debug/__init__.py
+ Line number: 89
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+88	            from subprocess import PIPE
+89	            from subprocess import Popen
+90	
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/werkzeug/debug/__init__.py
+ Line number: 91
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+90	
+91	            dump = Popen(
+92	                ["ioreg", "-c", "IOPlatformExpertDevice", "-d", "2"], stdout=PIPE
+93	            ).communicate()[0]
+94	            match = re.search(b'"serial-number" = <([^>]+)', dump)
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/werkzeug/debug/__init__.py
+ Line number: 91
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+90	
+91	            dump = Popen(
+92	                ["ioreg", "-c", "IOPlatformExpertDevice", "-d", "2"], stdout=PIPE
+93	            ).communicate()[0]
+94	            match = re.search(b'"serial-number" = <([^>]+)', dump)
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/werkzeug/debug/__init__.py
+ Line number: 196
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+195	
+196	    h = hashlib.sha1()
+197	    for bit in chain(probably_public_bits, private_bits):
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/werkzeug/debug/console.py
+ Line number: 177
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+176	        try:
+177	            exec(code, self.locals)
+178	        except Exception:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/debug/repr.py
+ Line number: 260
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+259	                    items.append((key, self.repr(getattr(obj, key))))
+260	                except Exception:
+261	                    pass
+262	            title = "Details for"
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/werkzeug/http.py
+ Line number: 1019
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+1018	    """
+1019	    return sha1(data).hexdigest()
+1020	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/middleware/lint.py
+ Line number: 223
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+222	                )
+223	            except Exception:
+224	                pass
+225	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/routing/map.py
+ Line number: 729
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+728	        """
+729	        assert self.map.redirect_defaults
+730	        for r in self.map._rules_by_endpoint[rule.endpoint]:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/routing/map.py
+ Line number: 784
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+783	            url += f"?{self.encode_query_args(query_args)}"
+784	        assert url != path, "detected invalid alias setting. No canonical URL found"
+785	        return url
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/routing/rules.py
+ Line number: 700
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+699	        """Compiles the regular expression and stores it."""
+700	        assert self.map is not None, "rule not bound"
+701	
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/werkzeug/routing/rules.py
+ Line number: 736
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+735	        locs: dict[str, t.Any] = {}
+736	        exec(code, globs, locs)
+737	        return locs[name]  # type: ignore
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/serving.py
+ Line number: 262
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+261	            nonlocal status_sent, headers_sent, chunk_response
+262	            assert status_set is not None, "write() before start_response"
+263	            assert headers_set is not None, "write() before start_response"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/serving.py
+ Line number: 263
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+262	            assert status_set is not None, "write() before start_response"
+263	            assert headers_set is not None, "write() before start_response"
+264	            if status_sent is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/serving.py
+ Line number: 303
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+302	
+303	            assert isinstance(data, bytes), "applications must write bytes"
+304	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/serving.py
+ Line number: 388
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+387	                execute(InternalServerError())
+388	            except Exception:
+389	                pass
+390	
+
+
+ + +
+
+ +
+
+ hardcoded_bind_all_interfaces: Possible binding to all interfaces.
+ Test ID: B104
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-605
+ File: ./venv/lib/python3.12/site-packages/werkzeug/serving.py
+ Line number: 849
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b104_hardcoded_bind_all_interfaces.html
+ +
+
+848	
+849	            if self.host in {"0.0.0.0", "::"}:
+850	                messages.append(f" * Running on all addresses ({self.host})")
+
+
+ + +
+
+ +
+
+ hardcoded_bind_all_interfaces: Possible binding to all interfaces.
+ Test ID: B104
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-605
+ File: ./venv/lib/python3.12/site-packages/werkzeug/serving.py
+ Line number: 852
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b104_hardcoded_bind_all_interfaces.html
+ +
+
+851	
+852	                if self.host == "0.0.0.0":
+853	                    localhost = "127.0.0.1"
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/werkzeug/test.py
+ Line number: 68
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+67	    if boundary is None:
+68	        boundary = f"---------------WerkzeugFormPart_{time()}{random()}"
+69	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/test.py
+ Line number: 646
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+645	            self.close()
+646	        except Exception:
+647	            pass
+648	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/test.py
+ Line number: 663
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+662	                f.close()
+663	            except Exception:
+664	                pass
+665	        self.closed = True
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/wtforms/csrf/session.py
+ Line number: 47
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+46	        if "csrf" not in session:
+47	            session["csrf"] = sha1(os.urandom(64)).hexdigest()
+48	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/wtforms/fields/core.py
+ Line number: 445
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+444	        text = escape(text or self.text)
+445	        return Markup(f"<label {attributes}>{text}</label>")
+446	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/wtforms/fields/list.py
+ Line number: 53
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+52	            )
+53	        assert isinstance(
+54	            unbound_field, UnboundField
+55	        ), "Field must be unbound, not a field class"
+56	        self.unbound_field = unbound_field
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/wtforms/fields/list.py
+ Line number: 156
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+155	    def _add_entry(self, formdata=None, data=unset_value, index=None):
+156	        assert (
+157	            not self.max_entries or len(self.entries) < self.max_entries
+158	        ), "You cannot have more than max_entries entries in this FieldList"
+159	        if index is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/wtforms/validators.py
+ Line number: 123
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+122	    def __init__(self, min=-1, max=-1, message=None):
+123	        assert (
+124	            min != -1 or max != -1
+125	        ), "At least one of `min` or `max` must be specified."
+126	        assert max == -1 or min <= max, "`min` cannot be more than `max`."
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/wtforms/validators.py
+ Line number: 126
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+125	        ), "At least one of `min` or `max` must be specified."
+126	        assert max == -1 or min <= max, "`min` cannot be more than `max`."
+127	        self.min = min
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/wtforms/widgets/core.py
+ Line number: 100
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+99	    def __init__(self, html_tag="ul", prefix_label=True):
+100	        assert html_tag in ("ol", "ul")
+101	        self.html_tag = html_tag
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/wtforms/widgets/core.py
+ Line number: 113
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+112	        html.append(f"</{self.html_tag}>")
+113	        return Markup("".join(html))
+114	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/wtforms/widgets/core.py
+ Line number: 150
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+149	            html.append(hidden)
+150	        return Markup("".join(html))
+151	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/wtforms/widgets/core.py
+ Line number: 179
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+178	        input_params = self.html_params(name=field.name, **kwargs)
+179	        return Markup(f"<input {input_params}>")
+180	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/wtforms/widgets/core.py
+ Line number: 328
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+327	        textarea_innerhtml = escape(field._value())
+328	        return Markup(
+329	            f"<textarea {textarea_params}>\r\n{textarea_innerhtml}</textarea>"
+330	        )
+331	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/wtforms/widgets/core.py
+ Line number: 377
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+376	        html.append("</select>")
+377	        return Markup("".join(html))
+378	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/wtforms/widgets/core.py
+ Line number: 388
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+387	            options["selected"] = True
+388	        return Markup(f"<option {html_params(**options)}>{escape(label)}</option>")
+389	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/yaml/parser.py
+ Line number: 185
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+184	            event = StreamEndEvent(token.start_mark, token.end_mark)
+185	            assert not self.states
+186	            assert not self.marks
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/yaml/parser.py
+ Line number: 186
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+185	            assert not self.states
+186	            assert not self.marks
+187	            self.state = None
+
+
+ + +
+
+ +
+ + + diff --git a/Python/Flask_Blog/11-Blueprints/bandit_report_updated.html b/Python/Flask_Blog/11-Blueprints/bandit_report_updated.html new file mode 100644 index 000000000..b09a4d655 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/bandit_report_updated.html @@ -0,0 +1,57346 @@ + + + + + + + + + Bandit Report + + + + + + + +
+
+
+ Metrics:
+
+ Total lines of code: 624790
+ Total lines skipped (#nosec): 2 +
+
+ + + +
+
+
+Skipped files:

+./venv/lib/python3.12/site-packages/PIL/AvifImagePlugin.py reason: syntax error while parsing AST from file
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py
+ Line number: 261
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+260	    def _open(self) -> None:
+261	        assert self.fp is not None
+262	        self.magic = self.fp.read(4)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py
+ Line number: 316
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+315	    def _safe_read(self, length: int) -> bytes:
+316	        assert self.fd is not None
+317	        return ImageFile._safe_read(self.fd, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py
+ Line number: 371
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+370	        jpeg_header = self._safe_read(jpeg_header_size)
+371	        assert self.fd is not None
+372	        self._safe_read(self._offsets[0] - self.fd.tell())  # What IS this?
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py
+ Line number: 379
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+378	            args = image.tile[0].args
+379	            assert isinstance(args, tuple)
+380	            image.tile = [image.tile[0]._replace(args=(args[0], "CMYK"))]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py
+ Line number: 390
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+389	
+390	        assert self.fd is not None
+391	        self.fd.seek(self._offsets[0])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py
+ Line number: 437
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+436	        data = b""
+437	        assert self.im is not None
+438	        palette = self.im.getpalette("RGBA", "RGBA")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py
+ Line number: 452
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+451	
+452	        assert self.im is not None
+453	        w, h = self.im.size
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py
+ Line number: 473
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+472	
+473	    assert im.palette is not None
+474	    fp.write(struct.pack("<i", 1))  # Uncompressed or DirectX compression
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 79
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+78	        """Read relevant info about the BMP"""
+79	        assert self.fp is not None
+80	        read, seek = self.fp.read, self.fp.seek
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 91
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+90	        # read the rest of the bmp header, without its size
+91	        assert isinstance(file_info["header_size"], int)
+92	        header_data = ImageFile._safe_read(self.fp, file_info["header_size"] - 4)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 132
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+131	            file_info["palette_padding"] = 4
+132	            assert isinstance(file_info["pixels_per_meter"], tuple)
+133	            self.info["dpi"] = tuple(x / 39.3701 for x in file_info["pixels_per_meter"])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 155
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+154	                        file_info[mask] = i32(read(4))
+155	                assert isinstance(file_info["r_mask"], int)
+156	                assert isinstance(file_info["g_mask"], int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 156
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+155	                assert isinstance(file_info["r_mask"], int)
+156	                assert isinstance(file_info["g_mask"], int)
+157	                assert isinstance(file_info["b_mask"], int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 157
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+156	                assert isinstance(file_info["g_mask"], int)
+157	                assert isinstance(file_info["b_mask"], int)
+158	                assert isinstance(file_info["a_mask"], int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 158
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+157	                assert isinstance(file_info["b_mask"], int)
+158	                assert isinstance(file_info["a_mask"], int)
+159	                file_info["rgb_mask"] = (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 176
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+175	        # ---------------------- is shorter than real size for bpp >= 16
+176	        assert isinstance(file_info["width"], int)
+177	        assert isinstance(file_info["height"], int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 177
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+176	        assert isinstance(file_info["width"], int)
+177	        assert isinstance(file_info["height"], int)
+178	        self._size = file_info["width"], file_info["height"]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 181
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+180	        # ------- If color count was not found in the header, compute from bits
+181	        assert isinstance(file_info["bits"], int)
+182	        if not file_info.get("colors", 0):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 184
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+183	            file_info["colors"] = 1 << file_info["bits"]
+184	        assert isinstance(file_info["palette_padding"], int)
+185	        assert isinstance(file_info["colors"], int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 185
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+184	        assert isinstance(file_info["palette_padding"], int)
+185	        assert isinstance(file_info["colors"], int)
+186	        if offset == 14 + file_info["header_size"] and file_info["bits"] <= 8:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 230
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+229	                ):
+230	                    assert isinstance(file_info["rgba_mask"], tuple)
+231	                    raw_mode = MASK_MODES[(file_info["bits"], file_info["rgba_mask"])]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 237
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+236	                ):
+237	                    assert isinstance(file_info["rgb_mask"], tuple)
+238	                    raw_mode = MASK_MODES[(file_info["bits"], file_info["rgb_mask"])]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 297
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+296	        else:
+297	            assert isinstance(file_info["width"], int)
+298	            args.append(((file_info["width"] * file_info["bits"] + 31) >> 3) & (~3))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 312
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+311	        # read 14 bytes: magic number, filesize, reserved, header final offset
+312	        assert self.fp is not None
+313	        head_data = self.fp.read(14)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BmpImagePlugin.py
+ Line number: 328
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+327	    def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]:
+328	        assert self.fd is not None
+329	        rle4 = self.args[1]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/BufrStubImagePlugin.py
+ Line number: 44
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+43	    def _open(self) -> None:
+44	        assert self.fp is not None
+45	        if not _accept(self.fp.read(4)):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/CurImagePlugin.py
+ Line number: 41
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+40	    def _open(self) -> None:
+41	        assert self.fp is not None
+42	        offset = self.fp.tell()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/DcxImagePlugin.py
+ Line number: 48
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+47	        # Header
+48	        assert self.fp is not None
+49	        s = self.fp.read(4)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py
+ Line number: 273
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+272	for item in DDSD:
+273	    assert item.name is not None
+274	    setattr(module, f"DDSD_{item.name}", item.value)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py
+ Line number: 276
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+275	for item1 in DDSCAPS:
+276	    assert item1.name is not None
+277	    setattr(module, f"DDSCAPS_{item1.name}", item1.value)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py
+ Line number: 279
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+278	for item2 in DDSCAPS2:
+279	    assert item2.name is not None
+280	    setattr(module, f"DDSCAPS2_{item2.name}", item2.value)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py
+ Line number: 282
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+281	for item3 in DDPF:
+282	    assert item3.name is not None
+283	    setattr(module, f"DDPF_{item3.name}", item3.value)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py
+ Line number: 335
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+334	    def _open(self) -> None:
+335	        assert self.fp is not None
+336	        if not _accept(self.fp.read(4)):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py
+ Line number: 492
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+491	    def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]:
+492	        assert self.fd is not None
+493	        bitcount, masks = self.args
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py
+ Line number: 27
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+26	import re
+27	import subprocess
+28	import sys
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+60	            try:
+61	                subprocess.check_call(["gs", "--version"], stdout=subprocess.DEVNULL)
+62	                gs_binary = "gs"
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+60	            try:
+61	                subprocess.check_call(["gs", "--version"], stdout=subprocess.DEVNULL)
+62	                gs_binary = "gs"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py
+ Line number: 80
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+79	        raise OSError(msg)
+80	    assert isinstance(gs_binary, str)
+81	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py
+ Line number: 84
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+83	    args = tile[0].args
+84	    assert isinstance(args, tuple)
+85	    length, bbox = args
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py
+ Line number: 159
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+158	            startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
+159	        subprocess.check_call(command, startupinfo=startupinfo)
+160	        with Image.open(outfile) as out_im:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py
+ Line number: 192
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+191	    def _open(self) -> None:
+192	        assert self.fp is not None
+193	        length, offset = self._find_offset(self.fp)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py
+ Line number: 247
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+246	                        bounding_box = [int(float(i)) for i in v.split()]
+247	                    except Exception:
+248	                        pass
+249	            return True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py
+ Line number: 407
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+406	        if self.tile:
+407	            assert self.fp is not None
+408	            self.im = Ghostscript(self.tile, self.size, self.fp, scale, transparency)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FitsImagePlugin.py
+ Line number: 28
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+27	    def _open(self) -> None:
+28	        assert self.fp is not None
+29	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FitsImagePlugin.py
+ Line number: 130
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+129	    def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]:
+130	        assert self.fd is not None
+131	        with gzip.open(self.fd) as fp:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FliImagePlugin.py
+ Line number: 51
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+50	        # HEAD
+51	        assert self.fp is not None
+52	        s = self.fp.read(128)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FliImagePlugin.py
+ Line number: 119
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+118	        i = 0
+119	        assert self.fp is not None
+120	        for e in range(i16(self.fp.read(2))):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FpxImagePlugin.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+60	
+61	        assert self.fp is not None
+62	        try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FpxImagePlugin.py
+ Line number: 85
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+84	
+85	        assert isinstance(prop[0x1000002], int)
+86	        assert isinstance(prop[0x1000003], int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FpxImagePlugin.py
+ Line number: 86
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+85	        assert isinstance(prop[0x1000002], int)
+86	        assert isinstance(prop[0x1000003], int)
+87	        self._size = prop[0x1000002], prop[0x1000003]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FpxImagePlugin.py
+ Line number: 232
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+231	
+232	        assert self.fp is not None
+233	        self.stream = stream
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FtexImagePlugin.py
+ Line number: 75
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+74	    def _open(self) -> None:
+75	        assert self.fp is not None
+76	        if not _accept(self.fp.read(4)):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/FtexImagePlugin.py
+ Line number: 85
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+84	        # I don't know of any multi-format file.
+85	        assert format_count == 1
+86	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GbrImagePlugin.py
+ Line number: 45
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+44	    def _open(self) -> None:
+45	        assert self.fp is not None
+46	        header_size = i32(self.fp.read(4))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GbrImagePlugin.py
+ Line number: 92
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+91	        if self._im is None:
+92	            assert self.fp is not None
+93	            self.im = Image.core.new(self.mode, self.size)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GdImageFile.py
+ Line number: 52
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+51	        # Header
+52	        assert self.fp is not None
+53	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 31
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+30	import os
+31	import subprocess
+32	from enum import IntEnum
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 90
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+89	    def data(self) -> bytes | None:
+90	        assert self.fp is not None
+91	        s = self.fp.read(1)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 104
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+103	        # Screen
+104	        assert self.fp is not None
+105	        s = self.fp.read(13)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 485
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+484	            self._prev_im = expanded_im
+485	            assert self._prev_im is not None
+486	        if self._frame_transparency is not None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 495
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+494	
+495	        assert self.dispose_extent is not None
+496	        frame_im = self._crop(frame_im, self.dispose_extent)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 532
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+531	        im = im.convert("P", palette=Image.Palette.ADAPTIVE)
+532	        assert im.palette is not None
+533	        if im.palette.mode == "RGBA":
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 570
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+569	            im_palette = im.getpalette(None)
+570	            assert im_palette is not None
+571	            source_palette = bytearray(im_palette)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 576
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+575	        im.palette = ImagePalette.ImagePalette("RGB", palette=source_palette)
+576	    assert source_palette is not None
+577	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 580
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+579	        used_palette_colors: list[int | None] = []
+580	        assert im.palette is not None
+581	        for i in range(0, len(source_palette), 3):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 595
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+594	        for index in used_palette_colors:
+595	            assert index is not None
+596	            dest_map.append(index)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 611
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+610	
+611	    assert im.palette is not None
+612	    im.palette.palette = source_palette
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 716
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+715	                            first_palette = im_frames[0].im.palette
+716	                            assert first_palette is not None
+717	                            background_im.putpalette(first_palette, first_palette.mode)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 723
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+722	                    if "transparency" not in encoderinfo:
+723	                        assert im_frame.palette is not None
+724	                        try:
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 888
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+887	            if im.mode != "RGB":
+888	                subprocess.check_call(
+889	                    ["ppmtogif", tempfile], stdout=f, stderr=subprocess.DEVNULL
+890	                )
+891	            else:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 888
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+887	            if im.mode != "RGB":
+888	                subprocess.check_call(
+889	                    ["ppmtogif", tempfile], stdout=f, stderr=subprocess.DEVNULL
+890	                )
+891	            else:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 896
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+895	                togif_cmd = ["ppmtogif"]
+896	                quant_proc = subprocess.Popen(
+897	                    quant_cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL
+898	                )
+899	                togif_proc = subprocess.Popen(
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 899
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+898	                )
+899	                togif_proc = subprocess.Popen(
+900	                    togif_cmd,
+901	                    stdin=quant_proc.stdout,
+902	                    stdout=f,
+903	                    stderr=subprocess.DEVNULL,
+904	                )
+905	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 907
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+906	                # Allow ppmquant to receive SIGPIPE if ppmtogif exits
+907	                assert quant_proc.stdout is not None
+908	                quant_proc.stdout.close()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 968
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+967	
+968	            assert im.palette is not None
+969	            num_palette_colors = len(im.palette.palette) // Image.getmodebands(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py
+ Line number: 1037
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1036	            # info["background"] - a global color table index
+1037	            assert im.palette is not None
+1038	            try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GimpGradientFile.py
+ Line number: 88
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+87	    def getpalette(self, entries: int = 256) -> tuple[bytes, str]:
+88	        assert self.gradient is not None
+89	        palette = []
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/GribStubImagePlugin.py
+ Line number: 44
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+43	    def _open(self) -> None:
+44	        assert self.fp is not None
+45	        if not _accept(self.fp.read(8)):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Hdf5StubImagePlugin.py
+ Line number: 44
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+43	    def _open(self) -> None:
+44	        assert self.fp is not None
+45	        if not _accept(self.fp.read(8)):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/IcnsImagePlugin.py
+ Line number: 267
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+266	    def _open(self) -> None:
+267	        assert self.fp is not None
+268	        self.icns = IcnsFile(self.fp)
+
+
+ + +
+
+ +
+
+ start_process_with_no_shell: Starting a process without a shell.
+ Test ID: B606
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/IcnsImagePlugin.py
+ Line number: 401
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b606_start_process_with_no_shell.html
+ +
+
+400	        if sys.platform == "windows":
+401	            os.startfile("out.png")
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/IcnsImagePlugin.py
+ Line number: 401
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+400	        if sys.platform == "windows":
+401	            os.startfile("out.png")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/IcoImagePlugin.py
+ Line number: 343
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+342	    def _open(self) -> None:
+343	        assert self.fp is not None
+344	        self.ico = IcoFile(self.fp)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImImagePlugin.py
+ Line number: 128
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+127	
+128	        assert self.fp is not None
+129	        if b"\n" not in self.fp.read(100):
+
+
+ + +
+
+ +
+
+ blacklist: Using Element to parse untrusted XML data is known to be vulnerable to XML attacks. Replace Element with the equivalent defusedxml package, or make sure defusedxml.defuse_stdlib() is called.
+ Test ID: B405
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-20
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 206
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b405-import-xml-etree
+ +
+
+205	    import mmap
+206	    from xml.etree.ElementTree import Element
+207	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 443
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+442	
+443	        assert BmpImagePlugin
+444	    except ImportError:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 449
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+448	
+449	        assert GifImagePlugin
+450	    except ImportError:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 455
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+454	
+455	        assert JpegImagePlugin
+456	    except ImportError:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 461
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+460	
+461	        assert PpmImagePlugin
+462	    except ImportError:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 467
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+466	
+467	        assert PngImagePlugin
+468	    except ImportError:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 647
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+646	            raise self._im.ex
+647	        assert self._im is not None
+648	        return self._im
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 758
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+757	            return False
+758	        assert isinstance(other, Image)
+759	        return (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 1147
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1146	                    if self.mode == "P":
+1147	                        assert self.palette is not None
+1148	                        trns_im.putpalette(self.palette, self.palette.mode)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 1151
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1150	                            err = "Couldn't allocate a palette color for transparency"
+1151	                            assert trns_im.palette is not None
+1152	                            try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 1339
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1338	            new_im = self._new(im)
+1339	            assert palette.palette is not None
+1340	            new_im.palette = palette.palette.copy()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 1641
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1640	
+1641	                assert isinstance(self, TiffImagePlugin.TiffImageFile)
+1642	                self._exif.bigtiff = self.tag_v2._bigtiff
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 1645
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1644	
+1645	                assert self.fp is not None
+1646	                self._exif.load_from_fp(self.fp, self.tag_v2._offset)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 1725
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1724	        if self.mode == "P":
+1725	            assert self.palette is not None
+1726	            return self.palette.mode.endswith("A")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 1741
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1740	        palette = self.getpalette("RGBA")
+1741	        assert palette is not None
+1742	        transparency = self.info["transparency"]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 2211
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2210	                value = value[:3]
+2211	            assert self.palette is not None
+2212	            palette_index = self.palette.getcolor(tuple(value), self)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Image.py
+ Line number: 4095
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+4094	                return value[0]
+4095	        except Exception:
+4096	            pass
+4097	        return value
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageColor.py
+ Line number: 48
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+47	        rgb_tuple = getrgb(rgb)
+48	        assert len(rgb_tuple) == 3
+49	        colormap[color] = rgb_tuple
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageDraw.py
+ Line number: 578
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+577	            if ink is None:
+578	                assert fill_ink is not None
+579	                return fill_ink
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageDraw.py
+ Line number: 859
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+858	    pixel = image.load()
+859	    assert pixel is not None
+860	    x, y = xy
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 228
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+227	        if ifd1 and ifd1.get(ExifTags.Base.JpegIFOffset):
+228	            assert exif._info is not None
+229	            ifds.append((ifd1, exif._info.next))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 233
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+232	        for ifd, ifd_offset in ifds:
+233	            assert self.fp is not None
+234	            current_offset = self.fp.tell()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 246
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+245	                    length = ifd.get(ExifTags.Base.JpegIFByteCount)
+246	                    assert isinstance(length, int)
+247	                    data = self.fp.read(length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 262
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+261	        if offset is not None:
+262	            assert self.fp is not None
+263	            self.fp.seek(offset)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 305
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+304	
+305	        assert self.fp is not None
+306	        readonly = 0
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 498
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+497	        image = loader.load(self)
+498	        assert image is not None
+499	        # become the other object (!)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 529
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+528	        """
+529	        assert self.data is None, "cannot reuse parsers"
+530	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 699
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+698	                    # slight speedup: compress to real file object
+699	                    assert fh is not None
+700	                    errcode = encoder.encode_to_file(fh, bufsize)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 867
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+866	        d = Image._getdecoder(self.mode, "raw", rawmode, extra)
+867	        assert self.im is not None
+868	        d.setimage(self.im, self.state.extents())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFile.py
+ Line number: 917
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+916	        if data:
+917	            assert self.fd is not None
+918	            self.fd.write(data)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageFont.py
+ Line number: 110
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+109	                    image = Image.open(fullname)
+110	                except Exception:
+111	                    pass
+112	                else:
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageGrab.py
+ Line number: 22
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+21	import shutil
+22	import subprocess
+23	import sys
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageGrab.py
+ Line number: 52
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+51	            args += ["-x", filepath]
+52	            retcode = subprocess.call(args)
+53	            if retcode:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageGrab.py
+ Line number: 66
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+65	                    args = ["screencapture", "-l", str(window), "-o", "-x", filepath]
+66	                    retcode = subprocess.call(args)
+67	                    if retcode:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageGrab.py
+ Line number: 133
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+132	            args.append(filepath)
+133	            retcode = subprocess.call(args)
+134	            if retcode:
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageGrab.py
+ Line number: 155
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+154	    if sys.platform == "darwin":
+155	        p = subprocess.run(
+156	            ["osascript", "-e", "get the clipboard as «class PNGf»"],
+157	            capture_output=True,
+158	        )
+159	        if p.returncode != 0:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageGrab.py
+ Line number: 155
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+154	    if sys.platform == "darwin":
+155	        p = subprocess.run(
+156	            ["osascript", "-e", "get the clipboard as «class PNGf»"],
+157	            capture_output=True,
+158	        )
+159	        if p.returncode != 0:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageGrab.py
+ Line number: 204
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+203	
+204	        p = subprocess.run(args, capture_output=True)
+205	        if p.returncode != 0:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageMorph.py
+ Line number: 127
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+126	        """
+127	        assert len(permutation) == 9
+128	        return "".join(pattern[p] for p in permutation)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageMorph.py
+ Line number: 167
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+166	        self.build_default_lut()
+167	        assert self.lut is not None
+168	        patterns = []
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageOps.py
+ Line number: 199
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+198	    # Initial asserts
+199	    assert image.mode == "L"
+200	    if mid is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageOps.py
+ Line number: 201
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+200	    if mid is None:
+201	        assert 0 <= blackpoint <= whitepoint <= 255
+202	    else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageOps.py
+ Line number: 203
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+202	    else:
+203	        assert 0 <= blackpoint <= midpoint <= whitepoint <= 255
+204	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImagePalette.py
+ Line number: 169
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+168	                index = self._new_color_index(image, e)
+169	                assert isinstance(self._palette, bytearray)
+170	                self.colors[color] = index
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/PIL/ImagePalette.py
+ Line number: 249
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+248	
+249	    palette = [randint(0, 255) for _ in range(256 * len(mode))]
+250	    return ImagePalette(mode, palette)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageQt.py
+ Line number: 144
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+143	        exclusive_fp = True
+144	    assert isinstance(im, Image.Image)
+145	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageQt.py
+ Line number: 155
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+154	        palette = im.getpalette()
+155	        assert palette is not None
+156	        colortable = [rgb(*palette[i : i + 3]) for i in range(0, len(palette), 3)]
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 19
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+18	import shutil
+19	import subprocess
+20	import sys
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 177
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+176	            raise FileNotFoundError
+177	        subprocess.call(["open", "-a", "Preview.app", path])
+178	
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 177
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+176	            raise FileNotFoundError
+177	        subprocess.call(["open", "-a", "Preview.app", path])
+178	
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 182
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+181	        if executable:
+182	            subprocess.Popen(
+183	                [
+184	                    executable,
+185	                    "-c",
+186	                    "import os, sys, time; time.sleep(20); os.remove(sys.argv[1])",
+187	                    path,
+188	                ]
+189	            )
+190	        return 1
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 225
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+224	            raise FileNotFoundError
+225	        subprocess.Popen(["xdg-open", path])
+226	        return 1
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 225
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+224	            raise FileNotFoundError
+225	        subprocess.Popen(["xdg-open", path])
+226	        return 1
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 255
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+254	
+255	        subprocess.Popen(args)
+256	        return 1
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 273
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+272	            raise FileNotFoundError
+273	        subprocess.Popen(["gm", "display", path])
+274	        return 1
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 273
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+272	            raise FileNotFoundError
+273	        subprocess.Popen(["gm", "display", path])
+274	        return 1
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 291
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+290	            raise FileNotFoundError
+291	        subprocess.Popen(["eog", "-n", path])
+292	        return 1
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 291
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+290	            raise FileNotFoundError
+291	        subprocess.Popen(["eog", "-n", path])
+292	        return 1
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageShow.py
+ Line number: 323
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+322	
+323	        subprocess.Popen(args)
+324	        return 1
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageText.py
+ Line number: 507
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+506	
+507	        assert bbox is not None
+508	        return bbox
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageTk.py
+ Line number: 142
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+141	            self.__photo.tk.call("image", "delete", name)
+142	        except Exception:
+143	            pass  # ignore internal errors
+144	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageTk.py
+ Line number: 230
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+229	            self.__photo.tk.call("image", "delete", name)
+230	        except Exception:
+231	            pass  # ignore internal errors
+232	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImageWin.py
+ Line number: 90
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+89	        if image:
+90	            assert not isinstance(image, str)
+91	            self.paste(image)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/ImtImagePlugin.py
+ Line number: 40
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+39	
+40	        assert self.fp is not None
+41	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/IptcImagePlugin.py
+ Line number: 52
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+51	        # get a IPTC field header
+52	        assert self.fp is not None
+53	        s = self.fp.read(5)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/IptcImagePlugin.py
+ Line number: 80
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+79	        # load descriptive fields
+80	        assert self.fp is not None
+81	        while True:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/IptcImagePlugin.py
+ Line number: 133
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+132	            args = self.tile[0].args
+133	            assert isinstance(args, tuple)
+134	            compression, band = args
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/IptcImagePlugin.py
+ Line number: 136
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+135	
+136	            assert self.fp is not None
+137	            self.fp.seek(self.tile[0].offset)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 171
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+170	                mimetype = "image/jpx"
+171	    assert header is not None
+172	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 186
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+185	            height, width, nc, bpc = header.read_fields(">IIHB")
+186	            assert isinstance(height, int)
+187	            assert isinstance(width, int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 187
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+186	            assert isinstance(height, int)
+187	            assert isinstance(width, int)
+188	            assert isinstance(bpc, int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 188
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+187	            assert isinstance(width, int)
+188	            assert isinstance(bpc, int)
+189	            size = (width, height)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 213
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+212	            ne, npc = header.read_fields(">HB")
+213	            assert isinstance(ne, int)
+214	            assert isinstance(npc, int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 214
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+213	            assert isinstance(ne, int)
+214	            assert isinstance(npc, int)
+215	            max_bitdepth = 0
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 217
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+216	            for bitdepth in header.read_fields(">" + ("B" * npc)):
+217	                assert isinstance(bitdepth, int)
+218	                if bitdepth > max_bitdepth:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 229
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+228	                    for value in header.read_fields(">" + ("B" * npc)):
+229	                        assert isinstance(value, int)
+230	                        color.append(value)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 239
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+238	                    vrcn, vrcd, hrcn, hrcd, vrce, hrce = res.read_fields(">HHHHBB")
+239	                    assert isinstance(vrcn, int)
+240	                    assert isinstance(vrcd, int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 240
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+239	                    assert isinstance(vrcn, int)
+240	                    assert isinstance(vrcd, int)
+241	                    assert isinstance(hrcn, int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 241
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+240	                    assert isinstance(vrcd, int)
+241	                    assert isinstance(hrcn, int)
+242	                    assert isinstance(hrcd, int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 242
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+241	                    assert isinstance(hrcn, int)
+242	                    assert isinstance(hrcd, int)
+243	                    assert isinstance(vrce, int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 243
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+242	                    assert isinstance(hrcd, int)
+243	                    assert isinstance(vrce, int)
+244	                    assert isinstance(hrce, int)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 244
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+243	                    assert isinstance(vrce, int)
+244	                    assert isinstance(hrce, int)
+245	                    hres = _res_to_dpi(hrcn, hrcd, hrce)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 267
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+266	    def _open(self) -> None:
+267	        assert self.fp is not None
+268	        sig = self.fp.read(4)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 320
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+319	    def _parse_comment(self) -> None:
+320	        assert self.fp is not None
+321	        while True:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py
+ Line number: 365
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+364	            t = self.tile[0]
+365	            assert isinstance(t[3], tuple)
+366	            t3 = (t[3][0], self._reduce, self.layers, t[3][3], t[3][4])
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 41
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+40	import struct
+41	import subprocess
+42	import sys
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 64
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+63	def Skip(self: JpegImageFile, marker: int) -> None:
+64	    assert self.fp is not None
+65	    n = i16(self.fp.read(2)) - 2
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 74
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+73	
+74	    assert self.fp is not None
+75	    n = i16(self.fp.read(2)) - 2
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 91
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+90	            jfif_density = i16(s, 8), i16(s, 10)
+91	        except Exception:
+92	            pass
+93	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 179
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+178	    # Comment marker.  Store these in the APP dictionary.
+179	    assert self.fp is not None
+180	    n = i16(self.fp.read(2)) - 2
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 196
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+195	
+196	    assert self.fp is not None
+197	    n = i16(self.fp.read(2)) - 2
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 247
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+246	
+247	    assert self.fp is not None
+248	    n = i16(self.fp.read(2)) - 2
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 348
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+347	    def _open(self) -> None:
+348	        assert self.fp is not None
+349	        s = self.fp.read(3)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 417
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+416	        """
+417	        assert self.fp is not None
+418	        s = self.fp.read(read_bytes)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 442
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+441	
+442	        assert isinstance(a, tuple)
+443	        if a[0] == "RGB" and mode in ["L", "YCbCr"]:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 452
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+451	                    break
+452	            assert e is not None
+453	            e = (
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 474
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+473	        if os.path.exists(self.filename):
+474	            subprocess.check_call(["djpeg", "-outfile", path, self.filename])
+475	        else:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py
+ Line number: 474
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+473	        if os.path.exists(self.filename):
+474	            subprocess.check_call(["djpeg", "-outfile", path, self.filename])
+475	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/McIdasImagePlugin.py
+ Line number: 39
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+38	        # parse area file directory
+39	        assert self.fp is not None
+40	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/MicImagePlugin.py
+ Line number: 70
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+69	
+70	        assert self.fp is not None
+71	        self.__fp = self.fp
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/MpegImagePlugin.py
+ Line number: 66
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+65	    def _open(self) -> None:
+66	        assert self.fp is not None
+67	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/MpoImagePlugin.py
+ Line number: 108
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+107	    def _open(self) -> None:
+108	        assert self.fp is not None
+109	        self.fp.seek(0)  # prep the fp in order to pass the JPEG test
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/MpoImagePlugin.py
+ Line number: 125
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+124	        # gets broken within JpegImagePlugin.
+125	        assert self.n_frames == len(self.__mpoffsets)
+126	        del self.info["mpoffset"]  # no longer needed
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/MpoImagePlugin.py
+ Line number: 128
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+127	        self.is_animated = self.n_frames > 1
+128	        assert self.fp is not None
+129	        self._fp = self.fp  # FIXME: hack
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/MspImagePlugin.py
+ Line number: 54
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+53	        # Header
+54	        assert self.fp is not None
+55	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/MspImagePlugin.py
+ Line number: 116
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+115	    def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]:
+116	        assert self.fd is not None
+117	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PcdImagePlugin.py
+ Line number: 32
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+31	        # rough
+32	        assert self.fp is not None
+33	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PcxImagePlugin.py
+ Line number: 55
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+54	        # header
+55	        assert self.fp is not None
+56	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PcxImagePlugin.py
+ Line number: 204
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+203	
+204	    assert fp.tell() == 128
+205	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfImagePlugin.py
+ Line number: 103
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+102	        palette = im.getpalette()
+103	        assert palette is not None
+104	        dict_obj["ColorSpace"] = [
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 107
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+106	            return False
+107	        assert isinstance(other, IndirectReference)
+108	        return other.object_id == self.object_id and other.generation == self.generation
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 446
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+445	    def seek_end(self) -> None:
+446	        assert self.f is not None
+447	        self.f.seek(0, os.SEEK_END)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 450
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+449	    def write_header(self) -> None:
+450	        assert self.f is not None
+451	        self.f.write(b"%PDF-1.4\n")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 454
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+453	    def write_comment(self, s: str) -> None:
+454	        assert self.f is not None
+455	        self.f.write(f"% {s}\n".encode())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 458
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+457	    def write_catalog(self) -> IndirectReference:
+458	        assert self.f is not None
+459	        self.del_root()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 504
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+503	    ) -> None:
+504	        assert self.f is not None
+505	        if new_root_ref:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 540
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+539	    ) -> IndirectReference:
+540	        assert self.f is not None
+541	        f = self.f
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 580
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+579	    def read_pdf_info(self) -> None:
+580	        assert self.buf is not None
+581	        self.file_size_total = len(self.buf)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 588
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+587	        self.root_ref = self.trailer_dict[b"Root"]
+588	        assert self.root_ref is not None
+589	        self.info_ref = self.trailer_dict.get(b"Info", None)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 607
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+606	        self.pages_ref = self.root[b"Pages"]
+607	        assert self.pages_ref is not None
+608	        self.page_tree_root = self.read_indirect(self.pages_ref)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 666
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+665	    def read_trailer(self) -> None:
+666	        assert self.buf is not None
+667	        search_start_offset = len(self.buf) - 16384
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 679
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+678	            m = last_match
+679	        assert m is not None
+680	        trailer_data = m.group(1)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 691
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+690	    ) -> None:
+691	        assert self.buf is not None
+692	        trailer_offset = self.read_xref_table(xref_section_offset=xref_section_offset)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 697
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+696	        check_format_condition(m is not None, "previous trailer not found")
+697	        assert m is not None
+698	        trailer_data = m.group(1)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 736
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+735	            key = cls.interpret_name(m.group(1))
+736	            assert isinstance(key, bytes)
+737	            value, value_offset = cls.get_value(trailer_data, m.end())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 854
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+853	            )
+854	            assert m is not None
+855	            return object, m.end()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 877
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+876	            while not m:
+877	                assert current_offset is not None
+878	                key, current_offset = cls.get_value(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 900
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+899	                check_format_condition(m is not None, "stream end not found")
+900	                assert m is not None
+901	                current_offset = m.end()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 911
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+910	            while not m:
+911	                assert current_offset is not None
+912	                value, current_offset = cls.get_value(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 1018
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1017	    def read_xref_table(self, xref_section_offset: int) -> int:
+1018	        assert self.buf is not None
+1019	        subsection_found = False
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 1024
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1023	        check_format_condition(m is not None, "xref section start not found")
+1024	        assert m is not None
+1025	        offset = m.end()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 1040
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1039	                check_format_condition(m is not None, "xref entry not found")
+1040	                assert m is not None
+1041	                offset = m.end()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PdfParser.py
+ Line number: 1057
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1056	        )
+1057	        assert self.buf is not None
+1058	        value = self.get_value(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PixarImagePlugin.py
+ Line number: 44
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+43	        # assuming a 4-byte magic label
+44	        assert self.fp is not None
+45	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 171
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+170	
+171	        assert self.fp is not None
+172	        if self.queue:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 198
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+197	    def push(self, cid: bytes, pos: int, length: int) -> None:
+198	        assert self.queue is not None
+199	        self.queue.append((cid, pos, length))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 217
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+216	
+217	        assert self.fp is not None
+218	        try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 231
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+230	
+231	        assert self.fp is not None
+232	        self.fp.read(4)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 240
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+239	
+240	        assert self.fp is not None
+241	        while True:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 426
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+425	        # ICC profile
+426	        assert self.fp is not None
+427	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 454
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+453	        # image header
+454	        assert self.fp is not None
+455	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 464
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+463	            self.im_mode, self.im_rawmode = _MODES[(s[8], s[9])]
+464	        except Exception:
+465	            pass
+466	        if s[12]:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 492
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+491	        # palette
+492	        assert self.fp is not None
+493	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 500
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+499	        # transparency
+500	        assert self.fp is not None
+501	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 523
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+522	        # gamma setting
+523	        assert self.fp is not None
+524	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 532
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+531	
+532	        assert self.fp is not None
+533	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 545
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+544	
+545	        assert self.fp is not None
+546	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 557
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+556	        # pixels per unit
+557	        assert self.fp is not None
+558	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 575
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+574	        # text
+575	        assert self.fp is not None
+576	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 595
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+594	        # compressed text
+595	        assert self.fp is not None
+596	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 630
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+629	        # international text
+630	        assert self.fp is not None
+631	        r = s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 672
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+671	    def chunk_eXIf(self, pos: int, length: int) -> bytes:
+672	        assert self.fp is not None
+673	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 679
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+678	    def chunk_acTL(self, pos: int, length: int) -> bytes:
+679	        assert self.fp is not None
+680	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 700
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+699	    def chunk_fcTL(self, pos: int, length: int) -> bytes:
+700	        assert self.fp is not None
+701	        s = ImageFile._safe_read(self.fp, length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 730
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+729	    def chunk_fdAT(self, pos: int, length: int) -> bytes:
+730	        assert self.fp is not None
+731	        if length < 4:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 763
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+762	    def _open(self) -> None:
+763	        assert self.fp is not None
+764	        if not _accept(self.fp.read(8)):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 843
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+842	                self.seek(frame)
+843	        assert self._text is not None
+844	        return self._text
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 856
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+855	
+856	        assert self.png is not None
+857	        self.png.verify()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 878
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+877	    def _seek(self, frame: int, rewind: bool = False) -> None:
+878	        assert self.png is not None
+879	        if isinstance(self._fp, DeferredError):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 992
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+991	
+992	        assert self.png is not None
+993	        assert self.fp is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 993
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+992	        assert self.png is not None
+993	        assert self.fp is not None
+994	        while self.__idat == 0:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 1026
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1025	        """internal: finished reading image data"""
+1026	        assert self.png is not None
+1027	        assert self.fp is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py
+ Line number: 1027
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1026	        assert self.png is not None
+1027	        assert self.fp is not None
+1028	        if self.__idat != 0:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PpmImagePlugin.py
+ Line number: 62
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+61	    def _read_magic(self) -> bytes:
+62	        assert self.fp is not None
+63	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PpmImagePlugin.py
+ Line number: 74
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+73	    def _read_token(self) -> bytes:
+74	        assert self.fp is not None
+75	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PpmImagePlugin.py
+ Line number: 102
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+101	    def _open(self) -> None:
+102	        assert self.fp is not None
+103	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PpmImagePlugin.py
+ Line number: 168
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+167	    def _read_block(self) -> bytes:
+168	        assert self.fd is not None
+169	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PpmImagePlugin.py
+ Line number: 304
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+303	    def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]:
+304	        assert self.fd is not None
+305	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/PsdImagePlugin.py
+ Line number: 64
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+63	    def _open(self) -> None:
+64	        assert self.fp is not None
+65	        read = self.fp.read
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/QoiImagePlugin.py
+ Line number: 28
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+27	    def _open(self) -> None:
+28	        assert self.fp is not None
+29	        if not _accept(self.fp.read(4)):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/QoiImagePlugin.py
+ Line number: 55
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+54	    def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]:
+55	        assert self.fd is not None
+56	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/QoiImagePlugin.py
+ Line number: 155
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+154	    def encode(self, bufsize: int) -> tuple[int, int, bytes]:
+155	        assert self.im is not None
+156	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/SgiImagePlugin.py
+ Line number: 58
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+57	        # HEAD
+58	        assert self.fp is not None
+59	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/SgiImagePlugin.py
+ Line number: 202
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+201	    def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]:
+202	        assert self.fd is not None
+203	        assert self.im is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/SgiImagePlugin.py
+ Line number: 203
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+202	        assert self.fd is not None
+203	        assert self.im is not None
+204	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/SpiderImagePlugin.py
+ Line number: 107
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+106	        n = 27 * 4  # read 27 float values
+107	        assert self.fp is not None
+108	        f = self.fp.read(n)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/SpiderImagePlugin.py
+ Line number: 195
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+194	        extrema = self.getextrema()
+195	        assert isinstance(extrema[0], float)
+196	        minimum, maximum = cast(tuple[float, float], extrema)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/SpiderImagePlugin.py
+ Line number: 230
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+229	            with Image.open(img) as im:
+230	                assert isinstance(im, SpiderImageFile)
+231	                byte_im = im.convert2byte()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/SunImagePlugin.py
+ Line number: 52
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+51	
+52	        assert self.fp is not None
+53	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TgaImagePlugin.py
+ Line number: 57
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+56	        # process header
+57	        assert self.fp is not None
+58	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TgaImagePlugin.py
+ Line number: 163
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+162	        if self.mode == "RGBA":
+163	            assert self.fp is not None
+164	            self.fp.seek(-26, os.SEEK_END)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 400
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+399	
+400	        assert isinstance(self._val, Fraction)
+401	        f = self._val.limit_denominator(max_denominator)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 424
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+423	        _val, _numerator, _denominator = state
+424	        assert isinstance(_val, (float, Fraction))
+425	        self._val = _val
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 430
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+429	            self._numerator = _numerator
+430	        assert isinstance(_denominator, int)
+431	        self._denominator = _denominator
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 689
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+688	                    for v in values:
+689	                        assert isinstance(v, IFDRational)
+690	                        if v < 0:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 700
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+699	                    for v in values:
+700	                        assert isinstance(v, int)
+701	                        if short and not (0 <= v < 2**16):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 1181
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1180	        # Header
+1181	        assert self.fp is not None
+1182	        ifh = self.fp.read(8)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 1211
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1210	            self.seek(current)
+1211	        assert self._n_frames is not None
+1212	        return self._n_frames
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 1351
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1350	        # into a string in python.
+1351	        assert self.fp is not None
+1352	        try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 1365
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1364	        if fp:
+1365	            assert isinstance(args, tuple)
+1366	            args_list = list(args)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 1763
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+1762	            ifd.tagtype[key] = info.tagtype[key]
+1763	        except Exception:
+1764	            pass  # might not be an IFD. Might not have populated type
+1765	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py
+ Line number: 2110
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2109	        ifd_offset += self.offsetOfNewPage
+2110	        assert self.whereToWriteNewIFDOffset is not None
+2111	        self.f.seek(self.whereToWriteNewIFDOffset)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/WalImageFile.py
+ Line number: 43
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+42	        # read header fields
+43	        assert self.fp is not None
+44	        header = self.fp.read(32 + 24 + 32 + 12)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/WalImageFile.py
+ Line number: 59
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+58	        if self._im is None:
+59	            assert self.fp is not None
+60	            self.im = Image.core.new(self.mode, self.size)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/WebPImagePlugin.py
+ Line number: 48
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+47	        # and access muxed chunks like ICC/EXIF/XMP.
+48	        assert self.fp is not None
+49	        self._decoder = _webp.WebPAnimDecoder(self.fp.read())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/WmfImagePlugin.py
+ Line number: 51
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+50	        def load(self, im: ImageFile.StubImageFile) -> Image.Image:
+51	            assert im.fp is not None
+52	            im.fp.seek(0)  # rewind
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/WmfImagePlugin.py
+ Line number: 84
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+83	        # check placeable header
+84	        assert self.fp is not None
+85	        s = self.fp.read(44)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/XVThumbImagePlugin.py
+ Line number: 50
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+49	        # check magic
+50	        assert self.fp is not None
+51	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/XbmImagePlugin.py
+ Line number: 53
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+52	    def _open(self) -> None:
+53	        assert self.fp is not None
+54	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/XpmImagePlugin.py
+ Line number: 40
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+39	    def _open(self) -> None:
+40	        assert self.fp is not None
+41	        if not _accept(self.fp.read(9)):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/XpmImagePlugin.py
+ Line number: 112
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+111	
+112	        assert self.fp is not None
+113	        s = [self.fp.readline()[1 : xsize + 1].ljust(xsize) for i in range(ysize)]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/PIL/XpmImagePlugin.py
+ Line number: 122
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+121	    def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]:
+122	        assert self.fd is not None
+123	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/blinker/base.py
+ Line number: 420
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+419	        """
+420	        assert sender_id != ANY_ID
+421	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/_compat.py
+ Line number: 74
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+73	            self.detach()
+74	        except Exception:
+75	            pass
+76	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/_compat.py
+ Line number: 167
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+166	            return False
+167	        except Exception:
+168	            pass
+169	        return default
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/click/_compat.py
+ Line number: 429
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+428	            os.path.dirname(filename),
+429	            f".__atomic-write{random.randrange(1 << 32):08x}",
+430	        )
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/_compat.py
+ Line number: 552
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+551	            _ansi_stream_wrappers[stream] = rv
+552	        except Exception:
+553	            pass
+554	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/_compat.py
+ Line number: 600
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+599	            cache[stream] = rv
+600	        except Exception:
+601	            pass
+602	        return rv
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 439
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+438	
+439	    import subprocess
+440	
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 456
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+455	        [str(cmd_path)] + cmd_params,
+456	        shell=False,
+457	        stdin=subprocess.PIPE,
+458	        env=env,
+459	        errors="replace",
+460	        text=True,
+461	    )
+462	    assert c.stdin is not None
+463	    try:
+464	        for text in generator:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 462
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+461	    )
+462	    assert c.stdin is not None
+463	    try:
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 531
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+530	
+531	    import subprocess
+532	    import tempfile
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 543
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+542	    try:
+543	        subprocess.call([str(cmd_path), filename])
+544	    except OSError:
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 595
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+594	    def edit_files(self, filenames: cabc.Iterable[str]) -> None:
+595	        import subprocess
+596	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 677
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+676	def open_url(url: str, wait: bool = False, locate: bool = False) -> int:
+677	    import subprocess
+678	
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 696
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+695	        try:
+696	            return subprocess.Popen(args, stderr=null).wait()
+697	        finally:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 710
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+709	        try:
+710	            return subprocess.call(args)
+711	        except OSError:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 724
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+723	        try:
+724	            return subprocess.call(args)
+725	        except OSError:
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 734
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+733	            url = _unquote_file(url)
+734	        c = subprocess.Popen(["xdg-open", url])
+735	        if wait:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/_termui_impl.py
+ Line number: 734
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+733	            url = _unquote_file(url)
+734	        c = subprocess.Popen(["xdg-open", url])
+735	        if wait:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/_winconsole.py
+ Line number: 34
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+33	
+34	assert sys.platform == "win32"
+35	import msvcrt  # noqa: E402
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/_winconsole.py
+ Line number: 208
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+207	            self.flush()
+208	        except Exception:
+209	            pass
+210	        return self.buffer.write(x)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/core.py
+ Line number: 1662
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1661	        if args and callable(args[0]):
+1662	            assert len(args) == 1 and not kwargs, (
+1663	                "Use 'command(**kwargs)(callable)' to provide arguments."
+1664	            )
+1665	            (func,) = args
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/core.py
+ Line number: 1711
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1710	        if args and callable(args[0]):
+1711	            assert len(args) == 1 and not kwargs, (
+1712	                "Use 'group(**kwargs)(callable)' to provide arguments."
+1713	            )
+1714	            (func,) = args
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/core.py
+ Line number: 1868
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1867	                cmd_name, cmd, args = self.resolve_command(ctx, args)
+1868	                assert cmd is not None
+1869	                ctx.invoked_subcommand = cmd_name
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/core.py
+ Line number: 1890
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1889	                cmd_name, cmd, args = self.resolve_command(ctx, args)
+1890	                assert cmd is not None
+1891	                sub_ctx = cmd.make_context(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/core.py
+ Line number: 2602
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2601	            # not to be exposed. We still assert it here to please the type checker.
+2602	            assert self.name is not None, (
+2603	                f"{self!r} parameter's name should not be None when exposing value."
+2604	            )
+2605	            ctx.params[self.name] = value
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/core.py
+ Line number: 3142
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3141	        """
+3142	        assert self.prompt is not None
+3143	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/decorators.py
+ Line number: 211
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+210	        name = None
+211	        assert cls is None, "Use 'command(cls=cls)(callable)' to specify a class."
+212	        assert not attrs, "Use 'command(**kwargs)(callable)' to provide arguments."
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/decorators.py
+ Line number: 212
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+211	        assert cls is None, "Use 'command(cls=cls)(callable)' to specify a class."
+212	        assert not attrs, "Use 'command(**kwargs)(callable)' to provide arguments."
+213	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/decorators.py
+ Line number: 236
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+235	        if t.TYPE_CHECKING:
+236	            assert cls is not None
+237	            assert not callable(name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/decorators.py
+ Line number: 237
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+236	            assert cls is not None
+237	            assert not callable(name)
+238	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/parser.py
+ Line number: 193
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+192	        if self.nargs > 1:
+193	            assert isinstance(value, cabc.Sequence)
+194	            holes = sum(1 for x in value if x is UNSET)
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/shell_completion.py
+ Line number: 313
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+312	        import shutil
+313	        import subprocess
+314	
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/click/shell_completion.py
+ Line number: 320
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+319	        else:
+320	            output = subprocess.run(
+321	                [bash_exe, "--norc", "-c", 'echo "${BASH_VERSION}"'],
+322	                stdout=subprocess.PIPE,
+323	            )
+324	            match = re.search(r"^(\d+)\.(\d+)\.\d+", output.stdout.decode())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/shell_completion.py
+ Line number: 514
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+513	
+514	    assert param.name is not None
+515	    # Will be None if expose_value is False.
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/testing.py
+ Line number: 406
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+405	                        del os.environ[key]
+406	                    except Exception:
+407	                        pass
+408	                else:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/testing.py
+ Line number: 416
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+415	                        del os.environ[key]
+416	                    except Exception:
+417	                        pass
+418	                else:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/click/utils.py
+ Line number: 42
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+41	            return func(*args, **kwargs)
+42	        except Exception:
+43	            pass
+44	        return None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/_asyncio_backend.py
+ Line number: 81
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+80	        try:
+81	            assert self.protocol.recvfrom is None
+82	            self.protocol.recvfrom = done
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/_asyncio_backend.py
+ Line number: 179
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+178	                    return _CoreAnyIOStream(stream)
+179	                except Exception:
+180	                    pass
+181	            raise httpcore.ConnectError
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/_ddr.py
+ Line number: 109
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+108	                nameservers.append(dns.nameserver.DoHNameserver(url, bootstrap_address))
+109	            except Exception:
+110	                # continue processing other ALPN types
+111	                pass
+112	        if b"dot" in alpns:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/_ddr.py
+ Line number: 138
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+137	                nameservers.extend(info.nameservers)
+138	        except Exception:
+139	            pass
+140	    return nameservers
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/_ddr.py
+ Line number: 152
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+151	                nameservers.extend(info.nameservers)
+152	        except Exception:
+153	            pass
+154	    return nameservers
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/_trio_backend.py
+ Line number: 154
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+153	                    )
+154	                    assert isinstance(sock, StreamSocket)
+155	                    return _CoreTrioStream(sock.stream)
+
+
+ + +
+
+ +
+
+ try_except_continue: Try, Except, Continue detected.
+ Test ID: B112
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/_trio_backend.py
+ Line number: 156
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b112_try_except_continue.html
+ +
+
+155	                    return _CoreTrioStream(sock.stream)
+156	                except Exception:
+157	                    continue
+158	            raise httpcore.ConnectError
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/_trio_backend.py
+ Line number: 215
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+214	                with _maybe_timeout(timeout):
+215	                    assert destination is not None
+216	                    await s.connect(_lltuple(destination, af))
+
+
+ + +
+
+ +
+
+ hardcoded_bind_all_interfaces: Possible binding to all interfaces.
+ Test ID: B104
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-605
+ File: ./venv/lib/python3.12/site-packages/dns/asyncquery.py
+ Line number: 72
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b104_hardcoded_bind_all_interfaces.html
+ +
+
+71	            if af == socket.AF_INET:
+72	                address = "0.0.0.0"
+73	            elif af == socket.AF_INET6:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/asyncquery.py
+ Line number: 589
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+588	            resolver = _maybe_get_resolver(resolver)
+589	            assert parsed.hostname is not None  # pyright: ignore
+590	            answers = await resolver.resolve_name(  # pyright: ignore
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/dns/asyncquery.py
+ Line number: 593
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+592	            )
+593	            bootstrap_address = random.choice(list(answers.addresses()))
+594	        if client and not isinstance(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/asyncquery.py
+ Line number: 598
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+597	            raise ValueError("client parameter must be a dns.quic.AsyncQuicConnection.")
+598	        assert client is None or isinstance(client, dns.quic.AsyncQuicConnection)
+599	        return await _http3(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/asyncquery.py
+ Line number: 726
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+725	    hostname = url_parts.hostname
+726	    assert hostname is not None
+727	    if url_parts.port is not None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/asyncresolver.py
+ Line number: 86
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+85	                return answer
+86	            assert request is not None  # needed for type checking
+87	            done = False
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/asyncresolver.py
+ Line number: 259
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+258	                self.nameservers = nameservers
+259	        except Exception:
+260	            pass
+261	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/asyncresolver.py
+ Line number: 270
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+269	        reset_default_resolver()
+270	    assert default_resolver is not None
+271	    return default_resolver
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/asyncresolver.py
+ Line number: 388
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+387	            )
+388	            assert answer.rrset is not None
+389	            if answer.rrset.name == name:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+60	    def __init__(self, t: int, creator: _Creator, is_leaf: bool):
+61	        assert t >= 3
+62	        self.t = t
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 70
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+69	        """Does this node have the maximal number of keys?"""
+70	        assert len(self.elts) <= _MAX(self.t)
+71	        return len(self.elts) == _MAX(self.t)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 75
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+74	        """Does this node have the minimal number of keys?"""
+75	        assert len(self.elts) >= _MIN(self.t)
+76	        return len(self.elts) == _MIN(self.t)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 108
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+107	    def maybe_cow_child(self, index: int) -> "_Node[KT, ET]":
+108	        assert not self.is_leaf
+109	        child = self.children[index]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 162
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+161	    def insert_nonfull(self, element: ET, in_order: bool) -> ET | None:
+162	        assert not self.is_maximal()
+163	        while True:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 188
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+187	        """Split a maximal node into two minimal ones and a central element."""
+188	        assert self.is_maximal()
+189	        right = self.__class__(self.t, self.creator, self.is_leaf)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 211
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+210	                if not left.is_leaf:
+211	                    assert not self.is_leaf
+212	                    child = left.children.pop()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 230
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+229	                if not right.is_leaf:
+230	                    assert not self.is_leaf
+231	                    child = right.children.pop(0)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 240
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+239	        then the left child must already be in the Node."""
+240	        assert not self.is_maximal()
+241	        assert not self.is_leaf
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 241
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+240	        assert not self.is_maximal()
+241	        assert not self.is_leaf
+242	        key = middle.key()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 244
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+243	        i, equal = self.search_in_node(key)
+244	        assert not equal
+245	        self.elts.insert(i, middle)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 250
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+249	        else:
+250	            assert self.children[i] == left
+251	            self.children.insert(i + 1, right)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 279
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+278	        with one of them."""
+279	        assert not parent.is_leaf
+280	        if self.try_left_steal(parent, index):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 300
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+299	        minimal unless it is the root."""
+300	        assert parent is None or not self.is_minimal()
+301	        i, equal = self.search_in_node(key)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 328
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+327	            i, equal = self.search_in_node(key)
+328	            assert not equal
+329	            child = self.children[i]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 330
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+329	            child = self.children[i]
+330	            assert not child.is_minimal()
+331	        elt = child.delete(key, self, exact)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 334
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+333	            node, i = self._get_node(original_key)
+334	            assert node is not None
+335	            assert elt is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 335
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+334	            assert node is not None
+335	            assert elt is not None
+336	            oelt = node.elts[i]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 406
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+405	        # current node
+406	        assert self.current_node is not None
+407	        while not self.current_node.is_leaf:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 410
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+409	            self.current_node = self.current_node.children[self.current_index]
+410	            assert self.current_node is not None
+411	            self.current_index = 0
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 416
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+415	        # current node
+416	        assert self.current_node is not None
+417	        while not self.current_node.is_leaf:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 420
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+419	            self.current_node = self.current_node.children[self.current_index]
+420	            assert self.current_node is not None
+421	            self.current_index = len(self.current_node.elts)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 464
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+463	            else:
+464	                assert self.current_index == 1
+465	                # right boundary; seek to the actual boundary
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 504
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+503	            else:
+504	                assert self.current_index == 0
+505	                # left boundary; seek to the actual boundary
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 550
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+549	        self.current_node = self.btree.root
+550	        assert self.current_node is not None
+551	        self.recurse = False
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 568
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+567	            self.current_node = self.current_node.children[i]
+568	            assert self.current_node is not None
+569	        i, equal = self.current_node.search_in_node(key)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 707
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+706	                if not self.root.is_leaf:
+707	                    assert len(self.root.children) == 1
+708	                    self.root = self.root.children[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btree.py
+ Line number: 724
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+723	        delt = self._delete(element.key(), element)
+724	        assert delt is element
+725	        return delt
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btreezone.py
+ Line number: 144
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+143	        if not replacement:
+144	            assert isinstance(zone, dns.versioned.Zone)
+145	            version = zone._versions[-1]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btreezone.py
+ Line number: 190
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+189	                node = new_node
+190	            assert isinstance(node, Node)
+191	            if is_glue:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btreezone.py
+ Line number: 312
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+311	        """
+312	        assert self.origin is not None
+313	        # validate the origin because we may need to relativize
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/btreezone.py
+ Line number: 326
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+325	        left = c.prev()
+326	        assert left is not None
+327	        c.next()  # skip over left
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/dnssec.py
+ Line number: 117
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+116	    rdata = key.to_wire()
+117	    assert rdata is not None  # for mypy
+118	    if key.algorithm == Algorithm.RSAMD5:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/dnssec.py
+ Line number: 246
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+245	    kwire = key.to_wire(origin=origin)
+246	    assert wire is not None and kwire is not None  # for mypy
+247	    dshash.update(wire)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/dnssec.py
+ Line number: 639
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+638	    wire = rrsig.to_wire(origin=signer)
+639	    assert wire is not None  # for mypy
+640	    data += wire[:18]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/dnssec.py
+ Line number: 792
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+791	    domain_encoded = domain.canonicalize().to_wire()
+792	    assert domain_encoded is not None
+793	
+
+
+ + +
+
+ +
+
+ blacklist: Use of insecure MD2, MD4, MD5, or SHA1 hash function.
+ Test ID: B303
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/dns/dnssecalgs/rsa.py
+ Line number: 95
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b303-md5
+ +
+
+94	    algorithm = Algorithm.RSASHA1
+95	    chosen_hash = hashes.SHA1()
+96	
+
+
+ + +
+
+ +
+
+ blacklist: Use of insecure MD2, MD4, MD5, or SHA1 hash function.
+ Test ID: B303
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/dns/dnssecalgs/rsa.py
+ Line number: 104
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b303-md5
+ +
+
+103	    algorithm = Algorithm.RSASHA1NSEC3SHA1
+104	    chosen_hash = hashes.SHA1()
+105	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/edns.py
+ Line number: 95
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+94	        wire = self.to_wire()
+95	        assert wire is not None  # for mypy
+96	        return GenericOption(self.otype, wire)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/edns.py
+ Line number: 227
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+226	
+227	        assert srclen is not None
+228	        self.address = address
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/exception.py
+ Line number: 76
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+75	        if args or kwargs:
+76	            assert bool(args) != bool(
+77	                kwargs
+78	            ), "keyword arguments are mutually exclusive with positional args"
+79	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/exception.py
+ Line number: 82
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+81	        if kwargs:
+82	            assert (
+83	                set(kwargs.keys()) == self.supp_kwargs
+84	            ), f"following set of keyword args is required: {self.supp_kwargs}"
+85	        return kwargs
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/grange.py
+ Line number: 64
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+63	    else:
+64	        assert state == 2
+65	        step = int(cur)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/grange.py
+ Line number: 67
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+66	
+67	    assert step >= 1
+68	    assert start >= 0
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/grange.py
+ Line number: 68
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+67	    assert step >= 1
+68	    assert start >= 0
+69	    if start > stop:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/message.py
+ Line number: 1154
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1153	        """
+1154	        assert self.message is not None
+1155	        section = self.message.sections[section_number]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/message.py
+ Line number: 1176
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1175	        """
+1176	        assert self.message is not None
+1177	        section = self.message.sections[section_number]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/message.py
+ Line number: 1499
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1498	
+1499	        assert self.message is not None
+1500	        section = self.message.sections[section_number]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/message.py
+ Line number: 1537
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1536	
+1537	        assert self.message is not None
+1538	        section = self.message.sections[section_number]
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/message.py
+ Line number: 1654
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+1653	                        line_method = self._rr_line
+1654	                except Exception:
+1655	                    # It's just a comment.
+1656	                    pass
+1657	                self.tok.get_eol()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/message.py
+ Line number: 1746
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1745	        return from_text(f, idna_codec, one_rr_per_rrset)
+1746	    assert False  # for mypy  lgtm[py/unreachable-statement]
+1747	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/message.py
+ Line number: 1932
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1931	    if query.had_tsig and query.keyring:
+1932	        assert query.mac is not None
+1933	        assert query.keyalgorithm is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/message.py
+ Line number: 1933
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1932	        assert query.mac is not None
+1933	        assert query.keyalgorithm is not None
+1934	        response.use_tsig(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/name.py
+ Line number: 647
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+646	        digest = self.to_wire(origin=origin, canonicalize=True)
+647	        assert digest is not None
+648	        return digest
+
+
+ + +
+
+ +
+
+ hardcoded_bind_all_interfaces: Possible binding to all interfaces.
+ Test ID: B104
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-605
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 106
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b104_hardcoded_bind_all_interfaces.html
+ +
+
+105	                    if local_address is None:
+106	                        local_address = "0.0.0.0"
+107	                    source = dns.inet.low_level_address_tuple(
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 121
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+120	                    return _CoreSyncStream(sock)
+121	                except Exception:
+122	                    pass
+123	            raise httpcore.ConnectError
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 542
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+541	            resolver = _maybe_get_resolver(resolver)
+542	            assert parsed.hostname is not None  # pyright: ignore
+543	            answers = resolver.resolve_name(parsed.hostname, family)  # pyright: ignore
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 544
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+543	            answers = resolver.resolve_name(parsed.hostname, family)  # pyright: ignore
+544	            bootstrap_address = random.choice(list(answers.addresses()))
+545	        if session and not isinstance(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 604
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+603	        # GET and POST examples
+604	        assert session is not None
+605	        if post:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 671
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+670	                error = ": " + wire.decode()
+671	            except Exception:
+672	                pass
+673	        raise ValueError(f"{peer} responded with status code {status}{error}")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 695
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+694	    hostname = url_parts.hostname
+695	    assert hostname is not None
+696	    if url_parts.port is not None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 963
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+962	    else:
+963	        assert af is not None
+964	        cm = make_socket(af, socket.SOCK_DGRAM, source)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 986
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+985	        return r
+986	    assert (
+987	        False  # help mypy figure out we can't get here  lgtm[py/unreachable-statement]
+988	    )
+989	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 1255
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1254	        )
+1255	        assert af is not None
+1256	        cm = make_socket(af, socket.SOCK_STREAM, source)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 1269
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1268	        return r
+1269	    assert (
+1270	        False  # help mypy figure out we can't get here  lgtm[py/unreachable-statement]
+1271	    )
+1272	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 1407
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1406	    )
+1407	    assert af is not None  # where must be an address
+1408	    if ssl_context is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 1428
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1427	        return r
+1428	    assert (
+1429	        False  # help mypy figure out we can't get here  lgtm[py/unreachable-statement]
+1430	    )
+1431	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 1702
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1701	    )
+1702	    assert af is not None
+1703	    (_, expiration) = _compute_times(lifetime)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/query.py
+ Line number: 1768
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1767	    )
+1768	    assert af is not None
+1769	    (_, expiration) = _compute_times(lifetime)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_asyncio.py
+ Line number: 125
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+124	                    await self._wakeup()
+125	        except Exception:
+126	            pass
+127	        finally:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_asyncio.py
+ Line number: 148
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+147	            for datagram, address in datagrams:
+148	                assert address == self._peer
+149	                assert self._socket is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_asyncio.py
+ Line number: 149
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+148	                assert address == self._peer
+149	                assert self._socket is not None
+150	                await self._socket.sendto(datagram, self._peer, None)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_asyncio.py
+ Line number: 154
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+153	                await asyncio.wait_for(self._wait_for_wake_timer(), interval)
+154	            except Exception:
+155	                pass
+156	            self._handle_timer(expiration)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_asyncio.py
+ Line number: 167
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+166	                if self.is_h3():
+167	                    assert self._h3_conn is not None
+168	                    h3_events = self._h3_conn.handle_event(event)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_common.py
+ Line number: 53
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+52	    def get(self, amount):
+53	        assert self.have(amount)
+54	        data = self._buffer[:amount]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_common.py
+ Line number: 59
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+58	    def get_all(self):
+59	        assert self.seen_end()
+60	        data = self._buffer
+
+
+ + +
+
+ +
+
+ hardcoded_bind_all_interfaces: Possible binding to all interfaces.
+ Test ID: B104
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-605
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_common.py
+ Line number: 176
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b104_hardcoded_bind_all_interfaces.html
+ +
+
+175	            if self._af == socket.AF_INET:
+176	                source = "0.0.0.0"
+177	            elif self._af == socket.AF_INET6:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_common.py
+ Line number: 193
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+192	    def send_headers(self, stream_id, headers, is_end=False):
+193	        assert self._h3_conn is not None
+194	        self._h3_conn.send_headers(stream_id, headers, is_end)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_common.py
+ Line number: 197
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+196	    def send_data(self, stream_id, data, is_end=False):
+197	        assert self._h3_conn is not None
+198	        self._h3_conn.send_data(stream_id, data, is_end)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_sync.py
+ Line number: 157
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+156	                            pass
+157	        except Exception:
+158	            # Eat all exceptions as we have no way to pass them back to the
+159	            # caller currently.  It might be nice to fix this in the future.
+160	            pass
+161	        finally:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_sync.py
+ Line number: 176
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+175	                if self.is_h3():
+176	                    assert self._h3_conn is not None
+177	                    h3_events = self._h3_conn.handle_event(event)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/quic/_trio.py
+ Line number: 142
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+141	                if self.is_h3():
+142	                    assert self._h3_conn is not None
+143	                    h3_events = self._h3_conn.handle_event(event)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdata.py
+ Line number: 255
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+254	        wire = self.to_wire(origin=origin)
+255	        assert wire is not None  # for type checkers
+256	        return GenericRdata(self.rdclass, self.rdtype, wire)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdata.py
+ Line number: 265
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+264	        wire = self.to_wire(origin=origin, canonicalize=True)
+265	        assert wire is not None  # for mypy
+266	        return wire
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdata.py
+ Line number: 776
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+775	    cls = get_rdata_class(rdclass, rdtype)
+776	    assert cls is not None  # for type checkers
+777	    with dns.exception.ExceptionWrapper(dns.exception.SyntaxError):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdata.py
+ Line number: 849
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+848	    cls = get_rdata_class(rdclass, rdtype)
+849	    assert cls is not None  # for type checkers
+850	    with dns.exception.ExceptionWrapper(dns.exception.FormError):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdataset.py
+ Line number: 497
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+496	        r.add(rd)
+497	    assert r is not None
+498	    return r
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/ANY/CAA.py
+ Line number: 57
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+56	        l = len(self.tag)
+57	        assert l < 256
+58	        file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/ANY/GPOS.py
+ Line number: 94
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+93	        l = len(self.latitude)
+94	        assert l < 256
+95	        file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/ANY/GPOS.py
+ Line number: 98
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+97	        l = len(self.longitude)
+98	        assert l < 256
+99	        file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/ANY/GPOS.py
+ Line number: 102
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+101	        l = len(self.altitude)
+102	        assert l < 256
+103	        file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/ANY/HINFO.py
+ Line number: 52
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+51	        l = len(self.cpu)
+52	        assert l < 256
+53	        file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/ANY/HINFO.py
+ Line number: 56
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+55	        l = len(self.os)
+56	        assert l < 256
+57	        file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/ANY/ISDN.py
+ Line number: 62
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+61	        l = len(self.address)
+62	        assert l < 256
+63	        file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/ANY/ISDN.py
+ Line number: 67
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+66	        if l > 0:
+67	            assert l < 256
+68	            file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/ANY/X25.py
+ Line number: 50
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+49	        l = len(self.address)
+50	        assert l < 256
+51	        file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/IN/APL.py
+ Line number: 72
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+71	        l = len(address)
+72	        assert l < 128
+73	        if self.negation:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/IN/NAPTR.py
+ Line number: 29
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+28	    l = len(s)
+29	    assert l < 256
+30	    file.write(struct.pack("!B", l))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/util.py
+ Line number: 54
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+53	            # check that it's OK
+54	            assert isinstance(self.gateway, str)
+55	            dns.ipv4.inet_aton(self.gateway)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/util.py
+ Line number: 58
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+57	            # check that it's OK
+58	            assert isinstance(self.gateway, str)
+59	            dns.ipv6.inet_aton(self.gateway)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/util.py
+ Line number: 72
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+71	        elif self.type == 3:
+72	            assert isinstance(self.gateway, dns.name.Name)
+73	            return str(self.gateway.choose_relativity(origin, relativize))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/util.py
+ Line number: 96
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+95	        elif self.type == 1:
+96	            assert isinstance(self.gateway, str)
+97	            file.write(dns.ipv4.inet_aton(self.gateway))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/util.py
+ Line number: 99
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+98	        elif self.type == 2:
+99	            assert isinstance(self.gateway, str)
+100	            file.write(dns.ipv6.inet_aton(self.gateway))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/util.py
+ Line number: 102
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+101	        elif self.type == 3:
+102	            assert isinstance(self.gateway, dns.name.Name)
+103	            self.gateway.to_wire(file, None, origin, False)
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/dns/rdtypes/util.py
+ Line number: 244
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+243	        while len(rdatas) > 1:
+244	            r = random.uniform(0, total)
+245	            for n, rdata in enumerate(rdatas):  # noqa: B007
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/dns/renderer.py
+ Line number: 108
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+107	        if id is None:
+108	            self.id = random.randint(0, 65535)
+109	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/renderer.py
+ Line number: 212
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+211	            ttl = opt.ttl
+212	            assert opt_size >= 11
+213	            opt_rdata = opt[0]
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 101
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+100	                    return cname
+101	            except Exception:  # pragma: no cover
+102	                # We can just eat this exception as it means there was
+103	                # something wrong with the response.
+104	                pass
+105	        return self.kwargs["qnames"][0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 762
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+761	        if self.retry_with_tcp:
+762	            assert self.nameserver is not None
+763	            assert not self.nameserver.is_always_max_size()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 763
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+762	            assert self.nameserver is not None
+763	            assert not self.nameserver.is_always_max_size()
+764	            self.tcp_attempt = True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 787
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+786	        #
+787	        assert self.nameserver is not None
+788	        if ex:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 790
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+789	            # Exception during I/O or from_wire()
+790	            assert response is None
+791	            self.errors.append(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 816
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+815	        # We got an answer!
+816	        assert response is not None
+817	        assert isinstance(response, dns.message.QueryMessage)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 817
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+816	        assert response is not None
+817	        assert isinstance(response, dns.message.QueryMessage)
+818	        rcode = response.rcode()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1322
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1321	                return answer
+1322	            assert request is not None  # needed for type checking
+1323	            done = False
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1525
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+1524	                self.nameservers = nameservers
+1525	        except Exception:  # pragma: no cover
+1526	            pass
+1527	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1537
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1536	        reset_default_resolver()
+1537	    assert default_resolver is not None
+1538	    return default_resolver
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1716
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1715	            )
+1716	            assert answer.rrset is not None
+1717	            if answer.rrset.name == name:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1877
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+1876	        return _original_getaddrinfo(host, service, family, socktype, proto, flags)
+1877	    except Exception:
+1878	        pass
+1879	    # Something needs resolution!
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1881
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1880	    try:
+1881	        assert _resolver is not None
+1882	        answers = _resolver.resolve_name(host, family)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1903
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+1902	                port = socket.getservbyname(service)  # pyright: ignore
+1903	            except Exception:
+1904	                pass
+1905	    if port is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1944
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1943	        pname = "tcp"
+1944	    assert isinstance(addr, str)
+1945	    qname = dns.reversename.from_address(addr)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1948
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1947	        try:
+1948	            assert _resolver is not None
+1949	            answer = _resolver.resolve(qname, "PTR")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1950
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1949	            answer = _resolver.resolve(qname, "PTR")
+1950	            assert answer.rrset is not None
+1951	            rdata = cast(dns.rdtypes.ANY.PTR.PTR, answer.rrset[0])
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 1977
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+1976	        # ignores them, so we do so here as well.
+1977	    except Exception:  # pragma: no cover
+1978	        pass
+1979	    return name
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/resolver.py
+ Line number: 2024
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2023	        addr = item[4][0]
+2024	        assert isinstance(addr, str)
+2025	        bin_addr = dns.inet.inet_pton(family, addr)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/rrset.py
+ Line number: 276
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+275	        r.add(rd)
+276	    assert r is not None
+277	    return r
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/tokenizer.py
+ Line number: 273
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+272	        self.line_number = 1
+273	        assert filename is not None
+274	        self.filename = filename
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: ''
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/dns/tokenizer.py
+ Line number: 372
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+371	            return Token(WHITESPACE, " ")
+372	        token = ""
+373	        ttype = IDENTIFIER
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: ''
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/dns/tokenizer.py
+ Line number: 380
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+379	                    raise dns.exception.UnexpectedEnd
+380	                if token == "" and ttype != QUOTED_STRING:
+381	                    if c == "(":
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: ''
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/dns/tokenizer.py
+ Line number: 421
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+420	                            self.skip_whitespace()
+421	                            token = ""
+422	                            continue
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: ''
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/dns/tokenizer.py
+ Line number: 447
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+446	            token += c
+447	        if token == "" and ttype != QUOTED_STRING:
+448	            if self.multiline:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/transaction.py
+ Line number: 442
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+441	                )
+442	            assert rdataset is not None  # for type checkers
+443	            if rdataset.rdclass != self.manager.get_class():
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/tsig.py
+ Line number: 225
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+224	            ctx.update(request_mac)
+225	    assert ctx is not None  # for type checkers
+226	    ctx.update(struct.pack("!H", rdata.original_id))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/versioned.py
+ Line number: 100
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+99	                else:
+100	                    assert self.origin is not None
+101	                    oname = self.origin
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/versioned.py
+ Line number: 182
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+181	    def _prune_versions_unlocked(self):
+182	        assert len(self._versions) > 0
+183	        # Don't ever prune a version greater than or equal to one that
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/versioned.py
+ Line number: 243
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+242	    def _end_write_unlocked(self, txn):
+243	        assert self._write_txn == txn
+244	        self._write_txn = None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/wire.py
+ Line number: 33
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+32	    def get_bytes(self, size: int) -> bytes:
+33	        assert size >= 0
+34	        if size > self.remaining():
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/wire.py
+ Line number: 78
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+77	    def restrict_to(self, size: int) -> Iterator:
+78	        assert size >= 0
+79	        if size > self.remaining():
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/xfr.py
+ Line number: 139
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+138	            if self.incremental:
+139	                assert self.soa_rdataset is not None
+140	                soa = cast(dns.rdtypes.ANY.SOA.SOA, self.soa_rdataset[0])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/xfr.py
+ Line number: 170
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+169	                raise dns.exception.FormError("answers after final SOA")
+170	            assert self.txn is not None  # for mypy
+171	            if rdataset.rdtype == dns.rdatatype.SOA and name == self.origin:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 684
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+683	            if want_origin:
+684	                assert self.origin is not None
+685	                l = "$ORIGIN " + self.origin.to_text()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 766
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+765	        else:
+766	            assert self.origin is not None
+767	            name = self.origin
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 815
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+814	        else:
+815	            assert self.origin is not None
+816	            origin_name = self.origin
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 853
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+852	        else:
+853	            assert self.origin is not None
+854	            rds = self.get_rdataset(self.origin, dns.rdatatype.ZONEMD)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 863
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+862	                    return
+863	            except Exception:
+864	                pass
+865	        raise DigestVerificationFailure
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1120
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1119	    def _setup_version(self):
+1120	        assert self.version is None
+1121	        factory = self.manager.writable_version_factory  # pyright: ignore
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1127
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1126	    def _get_rdataset(self, name, rdtype, covers):
+1127	        assert self.version is not None
+1128	        return self.version.get_rdataset(name, rdtype, covers)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1131
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1130	    def _put_rdataset(self, name, rdataset):
+1131	        assert not self.read_only
+1132	        assert self.version is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1132
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1131	        assert not self.read_only
+1132	        assert self.version is not None
+1133	        self.version.put_rdataset(name, rdataset)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1136
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1135	    def _delete_name(self, name):
+1136	        assert not self.read_only
+1137	        assert self.version is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1137
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1136	        assert not self.read_only
+1137	        assert self.version is not None
+1138	        self.version.delete_node(name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1141
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1140	    def _delete_rdataset(self, name, rdtype, covers):
+1141	        assert not self.read_only
+1142	        assert self.version is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1142
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1141	        assert not self.read_only
+1142	        assert self.version is not None
+1143	        self.version.delete_rdataset(name, rdtype, covers)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1146
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1145	    def _name_exists(self, name):
+1146	        assert self.version is not None
+1147	        return self.version.get_node(name) is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1153
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1152	        else:
+1153	            assert self.version is not None
+1154	            return len(self.version.changed) > 0
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1157
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1156	    def _end_transaction(self, commit):
+1157	        assert self.zone is not None
+1158	        assert self.version is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1158
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1157	        assert self.zone is not None
+1158	        assert self.version is not None
+1159	        if self.read_only:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1178
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1177	    def _set_origin(self, origin):
+1178	        assert self.version is not None
+1179	        if self.version.origin is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1183
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1182	    def _iterate_rdatasets(self):
+1183	        assert self.version is not None
+1184	        for name, node in self.version.items():
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1189
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1188	    def _iterate_names(self):
+1189	        assert self.version is not None
+1190	        return self.version.keys()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1193
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1192	    def _get_node(self, name):
+1193	        assert self.version is not None
+1194	        return self.version.get_node(name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1197
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1196	    def _origin_information(self):
+1197	        assert self.version is not None
+1198	        (absolute, relativize, effective) = self.manager.origin_information()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zone.py
+ Line number: 1406
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1405	        )
+1406	    assert False  # make mypy happy  lgtm[py/unreachable-statement]
+1407	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zonefile.py
+ Line number: 174
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+173	                raise dns.exception.SyntaxError("the last used name is undefined")
+174	            assert self.zone_origin is not None
+175	            if not name.is_subdomain(self.zone_origin):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zonefile.py
+ Line number: 430
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+429	            name = self.last_name
+430	            assert self.zone_origin is not None
+431	            if not name.is_subdomain(self.zone_origin):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zonefile.py
+ Line number: 563
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+562	    def __init__(self, manager, replacement, read_only):
+563	        assert not read_only
+564	        super().__init__(manager, replacement, read_only)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/dns/zonefile.py
+ Line number: 646
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+645	    def writer(self, replacement=False):
+646	        assert replacement is True
+647	        return RRsetsReaderTransaction(self, True, False)
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'None'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/flask/app.py
+ Line number: 183
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+182	            "PROPAGATE_EXCEPTIONS": None,
+183	            "SECRET_KEY": None,
+184	            "SECRET_KEY_FALLBACKS": None,
+185	            "PERMANENT_SESSION_LIFETIME": timedelta(days=31),
+186	            "USE_X_SENDFILE": False,
+187	            "TRUSTED_HOSTS": None,
+188	            "SERVER_NAME": None,
+189	            "APPLICATION_ROOT": "/",
+190	            "SESSION_COOKIE_NAME": "session",
+191	            "SESSION_COOKIE_DOMAIN": None,
+192	            "SESSION_COOKIE_PATH": None,
+193	            "SESSION_COOKIE_HTTPONLY": True,
+194	            "SESSION_COOKIE_SECURE": False,
+195	            "SESSION_COOKIE_PARTITIONED": False,
+196	            "SESSION_COOKIE_SAMESITE": None,
+197	            "SESSION_REFRESH_EACH_REQUEST": True,
+198	            "MAX_CONTENT_LENGTH": None,
+199	            "MAX_FORM_MEMORY_SIZE": 500_000,
+200	            "MAX_FORM_PARTS": 1_000,
+201	            "SEND_FILE_MAX_AGE_DEFAULT": None,
+202	            "TRAP_BAD_REQUEST_ERRORS": None,
+203	            "TRAP_HTTP_EXCEPTIONS": False,
+204	            "EXPLAIN_TEMPLATE_LOADING": False,
+205	            "PREFERRED_URL_SCHEME": "http",
+206	            "TEMPLATES_AUTO_RELOAD": None,
+207	            "MAX_COOKIE_SIZE": 4093,
+208	            "PROVIDE_AUTOMATIC_OPTIONS": True,
+209	        }
+210	    )
+211	
+212	    #: The class that is used for request objects.  See :class:`~flask.Request`
+213	    #: for more information.
+214	    request_class: type[Request] = Request
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'None'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/flask/app.py
+ Line number: 184
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+183	            "SECRET_KEY": None,
+184	            "SECRET_KEY_FALLBACKS": None,
+185	            "PERMANENT_SESSION_LIFETIME": timedelta(days=31),
+186	            "USE_X_SENDFILE": False,
+187	            "TRUSTED_HOSTS": None,
+188	            "SERVER_NAME": None,
+189	            "APPLICATION_ROOT": "/",
+190	            "SESSION_COOKIE_NAME": "session",
+191	            "SESSION_COOKIE_DOMAIN": None,
+192	            "SESSION_COOKIE_PATH": None,
+193	            "SESSION_COOKIE_HTTPONLY": True,
+194	            "SESSION_COOKIE_SECURE": False,
+195	            "SESSION_COOKIE_PARTITIONED": False,
+196	            "SESSION_COOKIE_SAMESITE": None,
+197	            "SESSION_REFRESH_EACH_REQUEST": True,
+198	            "MAX_CONTENT_LENGTH": None,
+199	            "MAX_FORM_MEMORY_SIZE": 500_000,
+200	            "MAX_FORM_PARTS": 1_000,
+201	            "SEND_FILE_MAX_AGE_DEFAULT": None,
+202	            "TRAP_BAD_REQUEST_ERRORS": None,
+203	            "TRAP_HTTP_EXCEPTIONS": False,
+204	            "EXPLAIN_TEMPLATE_LOADING": False,
+205	            "PREFERRED_URL_SCHEME": "http",
+206	            "TEMPLATES_AUTO_RELOAD": None,
+207	            "MAX_COOKIE_SIZE": 4093,
+208	            "PROVIDE_AUTOMATIC_OPTIONS": True,
+209	        }
+210	    )
+211	
+212	    #: The class that is used for request objects.  See :class:`~flask.Request`
+213	    #: for more information.
+214	    request_class: type[Request] = Request
+215	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask/app.py
+ Line number: 268
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+267	        if self.has_static_folder:
+268	            assert bool(static_host) == host_matching, (
+269	                "Invalid static_host/host_matching combination"
+270	            )
+271	            # Use a weakref to avoid creating a reference cycle between the app
+
+
+ + +
+
+ +
+
+ blacklist: Use of possibly insecure function - consider using safer ast.literal_eval.
+ Test ID: B307
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/flask/cli.py
+ Line number: 1031
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b307-eval
+ +
+
+1030	        with open(startup) as f:
+1031	            eval(compile(f.read(), startup, "exec"), ctx)
+1032	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask/config.py
+ Line number: 163
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+162	                value = loads(value)
+163	            except Exception:
+164	                # Keep the value as a string if loading failed.
+165	                pass
+166	
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/flask/config.py
+ Line number: 209
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+208	            with open(filename, mode="rb") as config_file:
+209	                exec(compile(config_file.read(), filename, "exec"), d.__dict__)
+210	        except OSError as e:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask/ctx.py
+ Line number: 373
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+372	        """
+373	        assert self._session is not None, "The session has not yet been opened."
+374	        self._session.accessed = True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask/debughelpers.py
+ Line number: 59
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+58	        exc = request.routing_exception
+59	        assert isinstance(exc, RequestRedirect)
+60	        buf = [
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/flask/json/tag.py
+ Line number: 188
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+187	    def to_python(self, value: t.Any) -> t.Any:
+188	        return Markup(value)
+189	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask/sansio/scaffold.py
+ Line number: 705
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+704	    """
+705	    assert view_func is not None, "expected view func if endpoint is not provided."
+706	    return view_func.__name__
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/flask/sessions.py
+ Line number: 281
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+280	    """
+281	    return hashlib.sha1(string)
+282	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask/testing.py
+ Line number: 59
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+58	    ) -> None:
+59	        assert not (base_url or subdomain or url_scheme) or (
+60	            base_url is not None
+61	        ) != bool(subdomain or url_scheme), (
+62	            'Cannot pass "subdomain" or "url_scheme" with "base_url".'
+63	        )
+64	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask/views.py
+ Line number: 190
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+189	
+190	        assert meth is not None, f"Unimplemented method {request.method!r}"
+191	        return current_app.ensure_sync(meth)(**kwargs)  # type: ignore[no-any-return]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask_mail/__init__.py
+ Line number: 164
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+163	        """
+164	        assert message.send_to, "No recipients have been added"
+165	        assert message.sender, (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask_mail/__init__.py
+ Line number: 165
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+164	        assert message.send_to, "No recipients have been added"
+165	        assert message.sender, (
+166	            "The message does not specify a sender and a default sender "
+167	            "has not been configured"
+168	        )
+169	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/flask_sqlalchemy/model.py
+ Line number: 58
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+57	        state = sa.inspect(self)
+58	        assert state is not None
+59	
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/flask_wtf/csrf.py
+ Line number: 53
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+52	        if field_name not in session:
+53	            session[field_name] = hashlib.sha1(os.urandom(64)).hexdigest()
+54	
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/flask_wtf/csrf.py
+ Line number: 58
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+57	        except TypeError:
+58	            session[field_name] = hashlib.sha1(os.urandom(64)).hexdigest()
+59	            token = s.dumps(session[field_name])
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/flask_wtf/form.py
+ Line number: 119
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+118	
+119	        return Markup("\n".join(str(f) for f in hidden_fields(fields or self)))
+120	
+
+
+ + +
+
+ +
+
+ blacklist: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
+ Test ID: B310
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/flask_wtf/recaptcha/validators.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b310-urllib-urlopen
+ +
+
+60	
+61	        http_response = http.urlopen(verify_server, data.encode("utf-8"))
+62	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/flask_wtf/recaptcha/widgets.py
+ Line number: 20
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+19	        if html:
+20	            return Markup(html)
+21	        params = current_app.config.get("RECAPTCHA_PARAMETERS")
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/flask_wtf/recaptcha/widgets.py
+ Line number: 33
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+32	            div_class = RECAPTCHA_DIV_CLASS_DEFAULT
+33	        return Markup(RECAPTCHA_TEMPLATE % (script, div_class, snippet))
+34	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/__init__.py
+ Line number: 217
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+216	    def run_script(self, script_name, show_output=True):
+217	        import subprocess
+218	        script = os.path.join(
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/__init__.py
+ Line number: 224
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+223	        try:
+224	            return subprocess.check_output([sys.executable, script],
+225	                                           encoding='utf-8',
+226	                                           stderr=subprocess.STDOUT)
+227	        except subprocess.CalledProcessError as ex:
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/__init__.py
+ Line number: 238
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+237	    def assertScriptRaises(self, script_name, exitcodes=None):
+238	        import subprocess
+239	        with self.assertRaises(subprocess.CalledProcessError) as exc:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py
+ Line number: 34
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+33	        if name == 'run' and not self.doing_it:
+34	            assert greenlet.getcurrent() is c
+35	            self.doing_it = True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py
+ Line number: 69
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+68	# A and B should both be dead now.
+69	assert a.dead
+70	assert b.dead
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py
+ Line number: 70
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+69	assert a.dead
+70	assert b.dead
+71	assert not c.dead
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py
+ Line number: 71
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+70	assert b.dead
+71	assert not c.dead
+72	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/fail_initialstub_already_started.py
+ Line number: 76
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+75	# Now C is dead
+76	assert c.dead
+77	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/fail_slp_switch.py
+ Line number: 23
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+22	g.switch()
+23	assert runs == [1]
+24	g.switch()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/fail_slp_switch.py
+ Line number: 25
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+24	g.switch()
+25	assert runs == [1, 2]
+26	g.force_slp_switch_error = True
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_cpp.py
+ Line number: 2
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+1	import gc
+2	import subprocess
+3	import unittest
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_cpp.py
+ Line number: 33
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+32	        with self.assertRaises(subprocess.CalledProcessError) as exc:
+33	            subprocess.check_output(
+34	                args,
+35	                encoding='utf-8',
+36	                stderr=subprocess.STDOUT
+37	            )
+38	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_gc.py
+ Line number: 12
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+11	# which is no longer optional.
+12	assert greenlet.GREENLET_USE_GC
+13	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_generator_nested.py
+ Line number: 106
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+105	            x = [Yield([e] + p) for p in perms([x for x in l if x != e])]
+106	            assert x
+107	    else:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_greenlet.py
+ Line number: 503
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+502	                    raise Exception # pylint:disable=broad-exception-raised
+503	                except: # pylint:disable=bare-except
+504	                    pass
+505	                return RawGreenlet.__getattribute__(self, name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_greenlet.py
+ Line number: 1289
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1288	        # implementation detail
+1289	        assert 'main' in repr(greenlet.getcurrent())
+1290	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_greenlet.py
+ Line number: 1292
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1291	        t = type(greenlet.getcurrent())
+1292	        assert 'main' not in repr(t)
+1293	        return t
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_greenlet_trash.py
+ Line number: 48
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+47	            # what we want it to.
+48	            assert sys.version_info[:2] >= (3, 13)
+49	            def get_tstate_trash_delete_nesting():
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_greenlet_trash.py
+ Line number: 62
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+61	
+62	        assert get_tstate_trash_delete_nesting() == 0
+63	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_greenlet_trash.py
+ Line number: 118
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+117	                    x = other.switch()
+118	                    assert x == 42
+119	                    # It's important that we don't switch back to the greenlet,
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_interpreter_shutdown.py
+ Line number: 32
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+31	import sys
+32	import subprocess
+33	import unittest
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_interpreter_shutdown.py
+ Line number: 47
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+46	        full_script = textwrap.dedent(script_body)
+47	        result = subprocess.run(
+48	            [sys.executable, '-c', full_script],
+49	            capture_output=True,
+50	            text=True,
+51	            timeout=30,
+52	            check=False,
+53	        )
+54	        return result.returncode, result.stdout, result.stderr
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_leaks.py
+ Line number: 25
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+24	
+25	assert greenlet.GREENLET_USE_GC # Option to disable this was removed in 1.0
+26	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_leaks.py
+ Line number: 153
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+152	
+153	        assert gc.is_tracked([])
+154	        HasFinalizerTracksInstances.reset()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_leaks.py
+ Line number: 212
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+211	
+212	        assert len(background_greenlets) == 1
+213	        self.assertFalse(background_greenlets[0].dead)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_leaks.py
+ Line number: 322
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+321	        # resolved, so we are actually running this on 3.8+
+322	        assert sys.version_info[0] >= 3
+323	        if RUNNING_ON_MANYLINUX:
+
+
+ + +
+
+ +
+
+ start_process_with_a_shell: Starting a process with a shell, possible injection detected, security issue.
+ Test ID: B605
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/greenlet/tests/test_version.py
+ Line number: 36
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b605_start_process_with_a_shell.html
+ +
+
+35	        invoke_setup = "%s %s --version" % (sys.executable, setup_py)
+36	        with os.popen(invoke_setup) as f:
+37	            sversion = f.read().strip()
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/itsdangerous/timed.py
+ Line number: 120
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+119	            ts_int = bytes_to_int(base64_decode(ts_bytes))
+120	        except Exception:
+121	            pass
+122	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with pickle module.
+ Test ID: B403
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/jinja2/bccache.py
+ Line number: 13
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b403-import-pickle
+ +
+
+12	import os
+13	import pickle
+14	import stat
+
+
+ + +
+
+ +
+
+ blacklist: Pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue.
+ Test ID: B301
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/jinja2/bccache.py
+ Line number: 73
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b301-pickle
+ +
+
+72	        # the source code of the file changed, we need to reload
+73	        checksum = pickle.load(f)
+74	        if self.checksum != checksum:
+
+
+ + +
+
+ +
+
+ blacklist: Deserialization with the marshal module is possibly dangerous.
+ Test ID: B302
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/jinja2/bccache.py
+ Line number: 79
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b302-marshal
+ +
+
+78	        try:
+79	            self.code = marshal.load(f)
+80	        except (EOFError, ValueError, TypeError):
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/jinja2/bccache.py
+ Line number: 156
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+155	        """Returns the unique hash key for this template name."""
+156	        hash = sha1(name.encode("utf-8"))
+157	
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/jinja2/bccache.py
+ Line number: 165
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+164	        """Returns a checksum for the source."""
+165	        return sha1(source.encode("utf-8")).hexdigest()
+166	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/compiler.py
+ Line number: 832
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+831	    ) -> None:
+832	        assert frame is None, "no root frame allowed"
+833	        eval_ctx = EvalContext(self.environment, self.name)
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'environment'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/compiler.py
+ Line number: 1440
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+1439	
+1440	                if pass_arg == "environment":
+1441	
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/jinja2/debug.py
+ Line number: 145
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+144	    try:
+145	        exec(code, globals, locals)
+146	    except BaseException:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/environment.py
+ Line number: 128
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+127	    """Perform a sanity check on the environment."""
+128	    assert issubclass(
+129	        environment.undefined, Undefined
+130	    ), "'undefined' must be a subclass of 'jinja2.Undefined'."
+131	    assert (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/environment.py
+ Line number: 131
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+130	    ), "'undefined' must be a subclass of 'jinja2.Undefined'."
+131	    assert (
+132	        environment.block_start_string
+133	        != environment.variable_start_string
+134	        != environment.comment_start_string
+135	    ), "block, variable and comment start strings must be different."
+136	    assert environment.newline_sequence in {
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/environment.py
+ Line number: 136
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+135	    ), "block, variable and comment start strings must be different."
+136	    assert environment.newline_sequence in {
+137	        "\r",
+138	        "\r\n",
+139	        "\n",
+140	    }, "'newline_sequence' must be one of '\\n', '\\r\\n', or '\\r'."
+141	    return environment
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/environment.py
+ Line number: 476
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+475	                    attr = str(argument)
+476	                except Exception:
+477	                    pass
+478	                else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/environment.py
+ Line number: 851
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+850	
+851	        assert log_function is not None
+852	        assert self.loader is not None, "No loader configured."
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/environment.py
+ Line number: 852
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+851	        assert log_function is not None
+852	        assert self.loader is not None, "No loader configured."
+853	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/environment.py
+ Line number: 919
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+918	        """
+919	        assert self.loader is not None, "No loader configured."
+920	        names = self.loader.list_templates()
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/jinja2/environment.py
+ Line number: 1228
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+1227	        namespace = {"environment": environment, "__file__": code.co_filename}
+1228	        exec(code, namespace)
+1229	        rv = cls._from_namespace(environment, namespace, globals)
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/environment.py
+ Line number: 1544
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+1543	    def __html__(self) -> Markup:
+1544	        return Markup(concat(self._body_stream))
+1545	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/ext.py
+ Line number: 176
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+175	        if __context.eval_ctx.autoescape:
+176	            rv = Markup(rv)
+177	        # Always treat as a format string, even if there are no
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/ext.py
+ Line number: 197
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+196	        if __context.eval_ctx.autoescape:
+197	            rv = Markup(rv)
+198	        # Always treat as a format string, see gettext comment above.
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/ext.py
+ Line number: 213
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+212	        if __context.eval_ctx.autoescape:
+213	            rv = Markup(rv)
+214	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/ext.py
+ Line number: 238
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+237	        if __context.eval_ctx.autoescape:
+238	            rv = Markup(rv)
+239	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/filters.py
+ Line number: 316
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+315	    if eval_ctx.autoescape:
+316	        rv = Markup(rv)
+317	
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/jinja2/filters.py
+ Line number: 699
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+698	    try:
+699	        return random.choice(seq)
+700	    except IndexError:
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/filters.py
+ Line number: 820
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+819	    if eval_ctx.autoescape:
+820	        rv = Markup(rv)
+821	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/filters.py
+ Line number: 851
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+850	    if isinstance(s, Markup):
+851	        indention = Markup(indention)
+852	        newline = Markup(newline)
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/filters.py
+ Line number: 852
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+851	        indention = Markup(indention)
+852	        newline = Markup(newline)
+853	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/filters.py
+ Line number: 908
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+907	
+908	    assert length >= len(end), f"expected length >= {len(end)}, got {length}"
+909	    assert leeway >= 0, f"expected leeway >= 0, got {leeway}"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/filters.py
+ Line number: 909
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+908	    assert length >= len(end), f"expected length >= {len(end)}, got {length}"
+909	    assert leeway >= 0, f"expected leeway >= 0, got {leeway}"
+910	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/filters.py
+ Line number: 1056
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+1055	
+1056	    return Markup(str(value)).striptags()
+1057	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/filters.py
+ Line number: 1377
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+1376	    """
+1377	    return Markup(value)
+1378	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/idtracking.py
+ Line number: 138
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+137	            target = self.find_ref(name)
+138	            assert target is not None, "should not happen"
+139	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/lexer.py
+ Line number: 144
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+143	reverse_operators = {v: k for k, v in operators.items()}
+144	assert len(operators) == len(reverse_operators), "operators dropped"
+145	operator_re = re.compile(
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'keyword'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/lexer.py
+ Line number: 639
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+638	                value = self._normalize_newlines(value_str)
+639	            elif token == "keyword":
+640	                token = value_str
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/lexer.py
+ Line number: 694
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+693	        if state is not None and state != "root":
+694	            assert state in ("variable", "block"), "invalid state"
+695	            stack.append(state + "_begin")
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '#bygroup'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/lexer.py
+ Line number: 765
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+764	                        # group that matched
+765	                        elif token == "#bygroup":
+766	                            for key, value in m.groupdict().items():
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/loaders.py
+ Line number: 325
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+324	        spec = importlib.util.find_spec(package_name)
+325	        assert spec is not None, "An import spec was not found for the package."
+326	        loader = spec.loader
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/loaders.py
+ Line number: 327
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+326	        loader = spec.loader
+327	        assert loader is not None, "A loader was not found for the package."
+328	        self._loader = loader
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/jinja2/loaders.py
+ Line number: 661
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+660	    def get_template_key(name: str) -> str:
+661	        return "tmpl_" + sha1(name.encode("utf-8")).hexdigest()
+662	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/nodes.py
+ Line number: 64
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+63	            storage.extend(d.get(attr, ()))
+64	            assert len(bases) <= 1, "multiple inheritance not allowed"
+65	            assert len(storage) == len(set(storage)), "layout conflict"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/nodes.py
+ Line number: 65
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+64	            assert len(bases) <= 1, "multiple inheritance not allowed"
+65	            assert len(storage) == len(set(storage)), "layout conflict"
+66	            d[attr] = tuple(storage)
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/nodes.py
+ Line number: 619
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+618	        if eval_ctx.autoescape:
+619	            return Markup(self.data)
+620	        return self.data
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/nodes.py
+ Line number: 1091
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+1090	        eval_ctx = get_eval_context(self, eval_ctx)
+1091	        return Markup(self.expr.as_const(eval_ctx))
+1092	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/nodes.py
+ Line number: 1112
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+1111	        if eval_ctx.autoescape:
+1112	            return Markup(expr)
+1113	        return expr
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'sub'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/parser.py
+ Line number: 630
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+629	
+630	        if token_type == "sub":
+631	            next(self.stream)
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'add'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/parser.py
+ Line number: 633
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+632	            node = nodes.Neg(self.parse_unary(False), lineno=lineno)
+633	        elif token_type == "add":
+634	            next(self.stream)
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'dot'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/parser.py
+ Line number: 784
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+783	            token_type = self.stream.current.type
+784	            if token_type == "dot" or token_type == "lbracket":
+785	                node = self.parse_subscript(node)
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'lbracket'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/parser.py
+ Line number: 784
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+783	            token_type = self.stream.current.type
+784	            if token_type == "dot" or token_type == "lbracket":
+785	                node = self.parse_subscript(node)
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'lparen'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/parser.py
+ Line number: 788
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+787	            # and getitem) as well as filters and tests
+788	            elif token_type == "lparen":
+789	                node = self.parse_call(node)
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'pipe'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/parser.py
+ Line number: 797
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+796	            token_type = self.stream.current.type
+797	            if token_type == "pipe":
+798	                node = self.parse_filter(node)  # type: ignore
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'name'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/parser.py
+ Line number: 799
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+798	                node = self.parse_filter(node)  # type: ignore
+799	            elif token_type == "name" and self.stream.current.value == "is":
+800	                node = self.parse_test(node)
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'lparen'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/jinja2/parser.py
+ Line number: 803
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+802	            # and getitem) as well as filters and tests
+803	            elif token_type == "lparen":
+804	                node = self.parse_call(node)
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/runtime.py
+ Line number: 375
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+374	        if self._context.eval_ctx.autoescape:
+375	            return Markup(rv)
+376	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/runtime.py
+ Line number: 389
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+388	        if self._context.eval_ctx.autoescape:
+389	            return Markup(rv)
+390	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/runtime.py
+ Line number: 776
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+775	        if autoescape:
+776	            return Markup(rv)
+777	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/runtime.py
+ Line number: 787
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+786	        if autoescape:
+787	            rv = Markup(rv)
+788	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/jinja2/sandbox.py
+ Line number: 298
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+297	                    attr = str(argument)
+298	                except Exception:
+299	                    pass
+300	                else:
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/jinja2/utils.py
+ Line number: 370
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+369	        # each paragraph contains out of 20 to 100 words.
+370	        for idx, _ in enumerate(range(randrange(min, max))):
+371	            while True:
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/jinja2/utils.py
+ Line number: 372
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+371	            while True:
+372	                word = choice(words)
+373	                if word != last:
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/jinja2/utils.py
+ Line number: 380
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+379	            # add commas
+380	            if idx - randrange(3, 8) > last_comma:
+381	                last_comma = idx
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/jinja2/utils.py
+ Line number: 385
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+384	            # add end of sentences
+385	            if idx - randrange(10, 20) > last_fullstop:
+386	                last_comma = last_fullstop = idx
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/utils.py
+ Line number: 403
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+402	        return "\n\n".join(result)
+403	    return markupsafe.Markup(
+404	        "\n".join(f"<p>{markupsafe.escape(x)}</p>" for x in result)
+405	    )
+406	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/jinja2/utils.py
+ Line number: 668
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+667	
+668	    return markupsafe.Markup(
+669	        dumps(obj, **kwargs)
+670	        .replace("<", "\\u003c")
+671	        .replace(">", "\\u003e")
+672	        .replace("&", "\\u0026")
+673	        .replace("'", "\\u0027")
+674	    )
+675	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/markdown_it/ruler.py
+ Line number: 265
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+264	            self.__compile__()
+265	            assert self.__cache__ is not None
+266	        # Chain can be empty, if rules disabled. But we still have to return Array.
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/markdown_it/rules_core/linkify.py
+ Line number: 35
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+34	        # Use reversed logic in links start/end match
+35	        assert tokens is not None
+36	        i = len(tokens)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/markdown_it/rules_core/linkify.py
+ Line number: 39
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+38	            i -= 1
+39	            assert isinstance(tokens, list)
+40	            currentToken = tokens[i]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/markdown_it/rules_core/smartquotes.py
+ Line number: 20
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+19	    # But basically, the index will not be negative.
+20	    assert index >= 0
+21	    return string[:index] + ch + string[index + 1 :]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/markdown_it/tree.py
+ Line number: 100
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+99	            else:
+100	                assert node.nester_tokens
+101	                token_list.append(node.nester_tokens.opening)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/markdown_it/tree.py
+ Line number: 164
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+163	            return self.token.type
+164	        assert self.nester_tokens
+165	        return self.nester_tokens.opening.type.removesuffix("_open")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/__pip-runner__.py
+ Line number: 43
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+42	        spec = PathFinder.find_spec(fullname, [PIP_SOURCES_ROOT], target)
+43	        assert spec, (PIP_SOURCES_ROOT, fullname)
+44	        return spec
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/__pip-runner__.py
+ Line number: 49
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+48	
+49	assert __name__ == "__main__", "Cannot run __pip-runner__.py as a non-main module"
+50	runpy.run_module("pip", run_name="__main__", alter_sys=True)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/build_env.py
+ Line number: 213
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+212	        prefix = self._prefixes[prefix_as_string]
+213	        assert not prefix.setup
+214	        prefix.setup = True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cache.py
+ Line number: 40
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+39	        super().__init__()
+40	        assert not cache_dir or os.path.isabs(cache_dir)
+41	        self.cache_dir = cache_dir or None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cache.py
+ Line number: 124
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+123	        parts = self._get_cache_path_parts(link)
+124	        assert self.cache_dir
+125	        # Store wheels within the root cache_dir
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py
+ Line number: 89
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+88	        # are present.
+89	        assert not hasattr(options, "no_index")
+90	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/base_command.py
+ Line number: 181
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+180	                    status = run_func(*args)
+181	                    assert isinstance(status, int)
+182	                    return status
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py
+ Line number: 15
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+14	    def main_context(self) -> Generator[None, None, None]:
+15	        assert not self._in_main_context
+16	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/command_context.py
+ Line number: 25
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+24	    def enter_context(self, context_provider: ContextManager[_T]) -> _T:
+25	        assert self._in_main_context
+26	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py
+ Line number: 5
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+4	import os
+5	import subprocess
+6	import sys
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/main_parser.py
+ Line number: 101
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+100	        try:
+101	            proc = subprocess.run(pip_cmd)
+102	            returncode = proc.returncode
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py
+ Line number: 51
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+50	        if option.takes_value():
+51	            assert option.dest is not None
+52	            metavar = option.metavar or option.dest.lower()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py
+ Line number: 112
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+111	        if self.parser is not None:
+112	            assert isinstance(self.parser, ConfigOptionParser)
+113	            self.parser._update_defaults(self.parser.defaults)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py
+ Line number: 114
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+113	            self.parser._update_defaults(self.parser.defaults)
+114	            assert option.dest is not None
+115	            default_values = self.parser.defaults.get(option.dest)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py
+ Line number: 168
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+167	
+168	        assert self.name
+169	        super().__init__(*args, **kwargs)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py
+ Line number: 225
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+224	
+225	            assert option.dest is not None
+226	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py
+ Line number: 252
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+251	            elif option.action == "callback":
+252	                assert option.callback is not None
+253	                late_eval.add(option.dest)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/parser.py
+ Line number: 285
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+284	        for option in self._get_all_options():
+285	            assert option.dest is not None
+286	            default = defaults.get(option.dest)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/progress_bars.py
+ Line number: 28
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+27	) -> Generator[bytes, None, None]:
+28	    assert bar_type == "on", "This should only be used in the default mode."
+29	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py
+ Line number: 99
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+98	            # then https://github.com/python/mypy/issues/7696 kicks in
+99	            assert self._session is not None
+100	        return self._session
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py
+ Line number: 110
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+109	        cache_dir = options.cache_dir
+110	        assert not cache_dir or os.path.isabs(cache_dir)
+111	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py
+ Line number: 171
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+170	        # Make sure the index_group options are present.
+171	        assert hasattr(options, "no_index")
+172	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py
+ Line number: 240
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+239	    ) -> Optional[int]:
+240	        assert self.tempdir_registry is not None
+241	        if options.no_clean:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/req_command.py
+ Line number: 286
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+285	        temp_build_dir_path = temp_build_dir.path
+286	        assert temp_build_dir_path is not None
+287	        legacy_resolver = False
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py
+ Line number: 44
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+43	    def _write(self, status: str) -> None:
+44	        assert not self._finished
+45	        # Erase what we wrote before by backspacing to the beginning, writing
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/cli/spinners.py
+ Line number: 83
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+82	    def _update(self, status: str) -> None:
+83	        assert not self._finished
+84	        self._rate_limiter.reset()
+
+
+ + +
+
+ +
+
+ any_other_function_with_shell_equals_true: Function call with shell=True parameter identified, possible security issue.
+ Test ID: B604
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/completion.py
+ Line number: 124
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b604_any_other_function_with_shell_equals_true.html
+ +
+
+123	            )
+124	            print(BASE_COMPLETION.format(script=script, shell=options.shell))
+125	            return SUCCESS
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py
+ Line number: 3
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+2	import os
+3	import subprocess
+4	from optparse import Values
+
+
+ + +
+
+ +
+
+ subprocess_popen_with_shell_equals_true: subprocess call with shell=True identified, security issue.
+ Test ID: B602
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/configuration.py
+ Line number: 239
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b602_subprocess_popen_with_shell_equals_true.html
+ +
+
+238	        try:
+239	            subprocess.check_call(f'{editor} "{fname}"', shell=True)
+240	        except FileNotFoundError as e:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/debug.py
+ Line number: 73
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+72	        # Try to find version in debundled module info.
+73	        assert module.__file__ is not None
+74	        env = get_environment([os.path.dirname(module.__file__)])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/download.py
+ Line number: 137
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+136	            if req.satisfied_by is None:
+137	                assert req.name is not None
+138	                preparer.save_linked_requirement(req)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/install.py
+ Line number: 480
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+479	                        item = f"{item}-{installed_dist.version}"
+480	                except Exception:
+481	                    pass
+482	                items.append(item)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/install.py
+ Line number: 509
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+508	        if options.target_dir:
+509	            assert target_temp_dir
+510	            self._handle_target_dir(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/install.py
+ Line number: 598
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+597	        else:
+598	            assert resolver_variant == "resolvelib"
+599	            parts.append(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/install.py
+ Line number: 695
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+694	    # If we are here, user installs have not been explicitly requested/avoided
+695	    assert use_user_site is None
+696	
+
+
+ + +
+
+ +
+
+ blacklist: Using xmlrpc.client to parse untrusted XML data is known to be vulnerable to XML attacks. Use defusedxml.xmlrpc.monkey_patch() function to monkey-patch xmlrpclib and mitigate XML vulnerabilities.
+ Test ID: B411
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-20
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/search.py
+ Line number: 5
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b411-import-xmlrpclib
+ +
+
+4	import textwrap
+5	import xmlrpc.client
+6	from collections import OrderedDict
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/search.py
+ Line number: 84
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+83	            raise CommandError(message)
+84	        assert isinstance(hits, list)
+85	        return hits
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py
+ Line number: 168
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+167	        for req in build_successes:
+168	            assert req.link and req.link.is_wheel
+169	            assert req.local_file_path
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/commands/wheel.py
+ Line number: 169
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+168	            assert req.link and req.link.is_wheel
+169	            assert req.local_file_path
+170	            # copy from cache to target directory
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/configuration.py
+ Line number: 130
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+129	        """Returns the file with highest priority in configuration"""
+130	        assert self.load_only is not None, "Need to be specified a file to be editing"
+131	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/configuration.py
+ Line number: 160
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+159	
+160	        assert self.load_only
+161	        fname, parser = self._get_parser_to_modify()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/configuration.py
+ Line number: 180
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+179	
+180	        assert self.load_only
+181	        if key not in self._config[self.load_only]:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/configuration.py
+ Line number: 365
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+364	        # Determine which parser to modify
+365	        assert self.load_only
+366	        parsers = self._parsers[self.load_only]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/distributions/installed.py
+ Line number: 20
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+19	    def get_metadata_distribution(self) -> BaseDistribution:
+20	        assert self.req.satisfied_by is not None, "not actually installed"
+21	        return self.req.satisfied_by
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py
+ Line number: 24
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+23	        """Identify this requirement uniquely by its link."""
+24	        assert self.req.link
+25	        return self.req.link.url_without_fragment
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py
+ Line number: 59
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+58	            pyproject_requires = self.req.pyproject_requires
+59	            assert pyproject_requires is not None
+60	            conflicting, missing = self.req.build_env.check_requirements(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py
+ Line number: 73
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+72	        pyproject_requires = self.req.pyproject_requires
+73	        assert pyproject_requires is not None
+74	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py
+ Line number: 99
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+98	            backend = self.req.pep517_backend
+99	            assert backend is not None
+100	            with backend.subprocess_runner(runner):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/distributions/sdist.py
+ Line number: 109
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+108	            backend = self.req.pep517_backend
+109	            assert backend is not None
+110	            with backend.subprocess_runner(runner):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py
+ Line number: 29
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+28	        """
+29	        assert self.req.local_file_path, "Set as part of preparation during download"
+30	        assert self.req.name, "Wheels are never unnamed"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/distributions/wheel.py
+ Line number: 30
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+29	        assert self.req.local_file_path, "Set as part of preparation during download"
+30	        assert self.req.name, "Wheels are never unnamed"
+31	        wheel = FilesystemWheel(self.req.local_file_path)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/exceptions.py
+ Line number: 87
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+86	        if reference is None:
+87	            assert hasattr(self, "reference"), "error reference not provided!"
+88	            reference = self.reference
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/exceptions.py
+ Line number: 89
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+88	            reference = self.reference
+89	        assert _is_kebab_case(reference), "error reference must be kebab-case!"
+90	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/exceptions.py
+ Line number: 646
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+645	        else:
+646	            assert self.error is not None
+647	            message_part = f".\n{self.error}\n"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/index/collector.py
+ Line number: 193
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+192	    def __init__(self, page: "IndexContent") -> None:
+193	        assert page.cache_link_parsing
+194	        self.page = page
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py
+ Line number: 364
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+363	        """
+364	        assert set(applicable_candidates) <= set(candidates)
+365	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py
+ Line number: 367
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+366	        if best_candidate is None:
+367	            assert not applicable_candidates
+368	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py
+ Line number: 369
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+368	        else:
+369	            assert best_candidate in applicable_candidates
+370	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py
+ Line number: 543
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+542	                match = re.match(r"^(\d+)(.*)$", wheel.build_tag)
+543	                assert match is not None, "guaranteed by filename validation"
+544	                build_tag_groups = match.groups()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/index/package_finder.py
+ Line number: 847
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+846	            for candidate in file_candidates:
+847	                assert candidate.link.url  # we need to have a URL
+848	                try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py
+ Line number: 66
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+65	    obj = d.get_command_obj("install", create=True)
+66	    assert obj is not None
+67	    i = cast(distutils_install_command, obj)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py
+ Line number: 71
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+70	    # ideally, we'd prefer a scheme class that has no side-effects.
+71	    assert not (user and prefix), f"user={user} prefix={prefix}"
+72	    assert not (home and prefix), f"home={home} prefix={prefix}"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/locations/_distutils.py
+ Line number: 72
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+71	    assert not (user and prefix), f"user={user} prefix={prefix}"
+72	    assert not (home and prefix), f"home={home} prefix={prefix}"
+73	    i.user = user or i.user
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/metadata/pkg_resources.py
+ Line number: 92
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+91	        else:
+92	            assert dist_dir.endswith(".dist-info")
+93	            dist_cls = pkg_resources.DistInfoDistribution
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py
+ Line number: 58
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+57	        )
+58	    assert infos[0] is not None
+59	    return infos[0]
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'git'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/models/direct_url.py
+ Line number: 182
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+181	            and self.info.vcs == "git"
+182	            and user_pass == "git"
+183	        ):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/models/installation_report.py
+ Line number: 15
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+14	    def _install_req_to_dict(cls, ireq: InstallRequirement) -> Dict[str, Any]:
+15	        assert ireq.download_info, f"No download_info for {ireq}"
+16	        res = {
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/models/link.py
+ Line number: 70
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+69	    def __post_init__(self) -> None:
+70	        assert self.name in _SUPPORTED_HASHES
+71	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/models/link.py
+ Line number: 106
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+105	        if self.hashes is not None:
+106	            assert all(name in _SUPPORTED_HASHES for name in self.hashes)
+107	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/models/link.py
+ Line number: 393
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+392	        name = urllib.parse.unquote(name)
+393	        assert name, f"URL {self._url!r} produced no filename"
+394	        return name
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/auth.py
+ Line number: 9
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+8	import shutil
+9	import subprocess
+10	import sysconfig
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/auth.py
+ Line number: 136
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+135	        env["PYTHONIOENCODING"] = "utf-8"
+136	        res = subprocess.run(
+137	            cmd,
+138	            stdin=subprocess.DEVNULL,
+139	            stdout=subprocess.PIPE,
+140	            env=env,
+141	        )
+142	        if res.returncode:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/auth.py
+ Line number: 152
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+151	        env["PYTHONIOENCODING"] = "utf-8"
+152	        subprocess.run(
+153	            [self.keyring, "set", service_name, username],
+154	            input=f"{password}{os.linesep}".encode("utf-8"),
+155	            env=env,
+156	            check=True,
+157	        )
+158	        return None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/auth.py
+ Line number: 426
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+425	
+426	        assert (
+427	            # Credentials were found
+428	            (username is not None and password is not None)
+429	            # Credentials were not found
+430	            or (username is None and password is None)
+431	        ), f"Could not load credentials from url: {original_url}"
+432	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/auth.py
+ Line number: 548
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+547	        """Response callback to save credentials on success."""
+548	        assert (
+549	            self.keyring_provider.has_keyring
+550	        ), "should never reach here without keyring"
+551	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/cache.py
+ Line number: 51
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+50	    def __init__(self, directory: str) -> None:
+51	        assert directory is not None, "Cache directory must not be None."
+52	        super().__init__()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/download.py
+ Line number: 136
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+135	        except NetworkConnectionError as e:
+136	            assert e.response is not None
+137	            logger.critical(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/download.py
+ Line number: 170
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+169	            except NetworkConnectionError as e:
+170	                assert e.response is not None
+171	                logger.critical(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/lazy_wheel.py
+ Line number: 54
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+53	        raise_for_status(head)
+54	        assert head.status_code == 200
+55	        self._session, self._url, self._chunk_size = session, url, chunk_size
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/session.py
+ Line number: 14
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+13	import shutil
+14	import subprocess
+15	import sys
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/session.py
+ Line number: 182
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+181	        try:
+182	            rustc_output = subprocess.check_output(
+183	                ["rustc", "--version"], stderr=subprocess.STDOUT, timeout=0.5
+184	            )
+185	        except Exception:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/session.py
+ Line number: 182
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+181	        try:
+182	            rustc_output = subprocess.check_output(
+183	                ["rustc", "--version"], stderr=subprocess.STDOUT, timeout=0.5
+184	            )
+185	        except Exception:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/session.py
+ Line number: 185
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+184	            )
+185	        except Exception:
+186	            pass
+187	        else:
+
+
+ + +
+
+ +
+
+ blacklist: Using xmlrpc.client to parse untrusted XML data is known to be vulnerable to XML attacks. Use defusedxml.xmlrpc.monkey_patch() function to monkey-patch xmlrpclib and mitigate XML vulnerabilities.
+ Test ID: B411
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-20
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py
+ Line number: 6
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b411-import-xmlrpclib
+ +
+
+5	import urllib.parse
+6	import xmlrpc.client
+7	from typing import TYPE_CHECKING, Tuple
+
+
+ + +
+
+ +
+
+ blacklist: Using _HostType to parse untrusted XML data is known to be vulnerable to XML attacks. Use defusedxml.xmlrpc.monkey_patch() function to monkey-patch xmlrpclib and mitigate XML vulnerabilities.
+ Test ID: B411
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-20
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py
+ Line number: 14
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b411-import-xmlrpclib
+ +
+
+13	if TYPE_CHECKING:
+14	    from xmlrpc.client import _HostType, _Marshallable
+15	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py
+ Line number: 41
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+40	    ) -> Tuple["_Marshallable", ...]:
+41	        assert isinstance(host, str)
+42	        parts = (self._scheme, host, handler, None, None, None)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/network/xmlrpc.py
+ Line number: 56
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+55	        except NetworkConnectionError as exc:
+56	            assert exc.response
+57	            logger.critical(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py
+ Line number: 37
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+36	            else:
+37	                assert isinstance(original_value, str)  # for mypy
+38	                target[name] = original_value
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/build/build_tracker.py
+ Line number: 106
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+105	        # If we're here, req should really not be building already.
+106	        assert key not in self._entries
+107	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel.py
+ Line number: 22
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+21	    """
+22	    assert metadata_directory is not None
+23	    try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/build/wheel_editable.py
+ Line number: 22
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+21	    """
+22	    assert metadata_directory is not None
+23	    try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/freeze.py
+ Line number: 160
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+159	    editable_project_location = dist.editable_project_location
+160	    assert editable_project_location
+161	    location = os.path.normcase(os.path.abspath(editable_project_location))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py
+ Line number: 99
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+98	    # XXX RECORD hashes will need to be updated
+99	    assert os.path.isfile(path)
+100	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/install/wheel.py
+ Line number: 614
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+613	                        pyc_path = pyc_output_path(path)
+614	                        assert os.path.exists(pyc_path)
+615	                        pyc_record_path = cast(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 79
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+78	    vcs_backend = vcs.get_backend_for_scheme(link.scheme)
+79	    assert vcs_backend is not None
+80	    vcs_backend.unpack(location, url=hide_url(link.url), verbosity=verbosity)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 160
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+159	
+160	    assert not link.is_existing_dir()
+161	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 310
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+309	            return
+310	        assert req.source_dir is None
+311	        if req.link.is_existing_dir():
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 384
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+383	            return None
+384	        assert req.req is not None
+385	        logger.verbose(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 460
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+459	        for req in partially_downloaded_reqs:
+460	            assert req.link
+461	            links_to_fully_download[req.link] = req
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 493
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+492	        """Prepare a requirement to be obtained from req.link."""
+493	        assert req.link
+494	        self._log_preparing_link(req)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 560
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+559	    ) -> BaseDistribution:
+560	        assert req.link
+561	        link = req.link
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 566
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+565	        if hashes and req.is_wheel_from_cache:
+566	            assert req.download_info is not None
+567	            assert link.is_wheel
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 567
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+566	            assert req.download_info is not None
+567	            assert link.is_wheel
+568	            assert link.is_file
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 568
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+567	            assert link.is_wheel
+568	            assert link.is_file
+569	            # We need to verify hashes, and we have found the requirement in the cache
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 619
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+618	            # prepare_editable_requirement).
+619	            assert not req.editable
+620	            req.download_info = direct_url_from_link(link, req.source_dir)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 650
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+649	    def save_linked_requirement(self, req: InstallRequirement) -> None:
+650	        assert self.download_dir is not None
+651	        assert req.link is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 651
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+650	        assert self.download_dir is not None
+651	        assert req.link is not None
+652	        link = req.link
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 680
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+679	        """Prepare an editable requirement."""
+680	        assert req.editable, "cannot prepare a non-editable req as editable"
+681	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 693
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+692	            req.update_editable()
+693	            assert req.source_dir
+694	            req.download_info = direct_url_for_editable(req.unpacked_source_directory)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 714
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+713	        """Prepare an already-installed requirement."""
+714	        assert req.satisfied_by, "req should have been satisfied but isn't"
+715	        assert skip_reason is not None, (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/operations/prepare.py
+ Line number: 715
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+714	        assert req.satisfied_by, "req should have been satisfied but isn't"
+715	        assert skip_reason is not None, (
+716	            "did not get skip reason skipped but req.satisfied_by "
+717	            f"is set to {req.satisfied_by}"
+718	        )
+719	        logger.info(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/pyproject.py
+ Line number: 109
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+108	    # At this point, we know whether we're going to use PEP 517.
+109	    assert use_pep517 is not None
+110	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/pyproject.py
+ Line number: 134
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+133	    # specified a backend, though.
+134	    assert build_system is not None
+135	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/__init__.py
+ Line number: 33
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+32	    for req in requirements:
+33	        assert req.name, f"invalid to-be-installed requirement: {req}"
+34	        yield req.name, req
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py
+ Line number: 74
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+73	    # ireq.req is a valid requirement so the regex should always match
+74	    assert (
+75	        match is not None
+76	    ), f"regex match on requirement {req} failed, this should never happen"
+77	    pre: Optional[str] = match.group(1)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/constructors.py
+ Line number: 79
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+78	    post: Optional[str] = match.group(3)
+79	    assert (
+80	        pre is not None and post is not None
+81	    ), f"regex group selection for requirement {req} failed, this should never happen"
+82	    extras: str = "[%s]" % ",".join(sorted(new_extras)) if new_extras else ""
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py
+ Line number: 187
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+186	
+187	    assert line.is_requirement
+188	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py
+ Line number: 476
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+475	                new_line.append(line)
+476	                assert primary_line_number is not None
+477	                yield primary_line_number, "".join(new_line)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_file.py
+ Line number: 488
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+487	    if new_line:
+488	        assert primary_line_number is not None
+489	        yield primary_line_number, "".join(new_line)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 90
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+89	    ) -> None:
+90	        assert req is None or isinstance(req, Requirement), req
+91	        self.req = req
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 104
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+103	        if self.editable:
+104	            assert link
+105	            if link.is_file:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 251
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+250	            return False
+251	        assert self.pep517_backend
+252	        with self.build_env:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 261
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+260	    def specifier(self) -> SpecifierSet:
+261	        assert self.req is not None
+262	        return self.req.specifier
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 275
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+274	        """
+275	        assert self.req is not None
+276	        specifiers = self.req.specifier
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 329
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+328	        if link and link.hash:
+329	            assert link.hash_name is not None
+330	            good_hashes.setdefault(link.hash_name, []).append(link.hash)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 351
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+350	    ) -> str:
+351	        assert build_dir is not None
+352	        if self._temp_build_dir is not None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 353
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+352	        if self._temp_build_dir is not None:
+353	            assert self._temp_build_dir.path
+354	            return self._temp_build_dir.path
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 393
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+392	        """Set requirement after generating metadata."""
+393	        assert self.req is None
+394	        assert self.metadata is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 394
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+393	        assert self.req is None
+394	        assert self.metadata is not None
+395	        assert self.source_dir is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 395
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+394	        assert self.metadata is not None
+395	        assert self.source_dir is not None
+396	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 414
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+413	    def warn_on_mismatching_name(self) -> None:
+414	        assert self.req is not None
+415	        metadata_name = canonicalize_name(self.metadata["Name"])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 484
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+483	    def unpacked_source_directory(self) -> str:
+484	        assert self.source_dir, f"No source dir for {self}"
+485	        return os.path.join(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 491
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+490	    def setup_py_path(self) -> str:
+491	        assert self.source_dir, f"No source dir for {self}"
+492	        setup_py = os.path.join(self.unpacked_source_directory, "setup.py")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 498
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+497	    def setup_cfg_path(self) -> str:
+498	        assert self.source_dir, f"No source dir for {self}"
+499	        setup_cfg = os.path.join(self.unpacked_source_directory, "setup.cfg")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 505
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+504	    def pyproject_toml_path(self) -> str:
+505	        assert self.source_dir, f"No source dir for {self}"
+506	        return make_pyproject_path(self.unpacked_source_directory)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 521
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+520	        if pyproject_toml_data is None:
+521	            assert not self.config_settings
+522	            self.use_pep517 = False
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 563
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+562	        """
+563	        assert self.source_dir, f"No source dir for {self}"
+564	        details = self.name or f"from {self.link}"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 567
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+566	        if self.use_pep517:
+567	            assert self.pep517_backend is not None
+568	            if (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 612
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+611	        elif self.local_file_path and self.is_wheel:
+612	            assert self.req is not None
+613	            return get_wheel_distribution(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 623
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+622	    def assert_source_matches_version(self) -> None:
+623	        assert self.source_dir, f"No source dir for {self}"
+624	        version = self.metadata["version"]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 663
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+662	    def needs_unpacked_archive(self, archive_source: Path) -> None:
+663	        assert self._archive_source is None
+664	        self._archive_source = archive_source
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 668
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+667	        """Ensure the source directory has not yet been built in."""
+668	        assert self.source_dir is not None
+669	        if self._archive_source is not None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 691
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+690	            return
+691	        assert self.editable
+692	        assert self.source_dir
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 692
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+691	        assert self.editable
+692	        assert self.source_dir
+693	        if self.link.scheme == "file":
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 699
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+698	        # So here, if it's neither a path nor a valid VCS URL, it's a bug.
+699	        assert vcs_backend, f"Unsupported VCS URL {self.link.url}"
+700	        hidden_url = hide_url(self.link.url)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 719
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+718	        """
+719	        assert self.req
+720	        dist = get_default_environment().get_distribution(self.req.name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 732
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+731	        def _clean_zip_name(name: str, prefix: str) -> str:
+732	            assert name.startswith(
+733	                prefix + os.path.sep
+734	            ), f"name {name!r} doesn't start with prefix {prefix!r}"
+735	            name = name[len(prefix) + 1 :]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 739
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+738	
+739	        assert self.req is not None
+740	        path = os.path.join(parentdir, path)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 749
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+748	        """
+749	        assert self.source_dir
+750	        if build_dir is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 821
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+820	    ) -> None:
+821	        assert self.req is not None
+822	        scheme = get_scheme(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 853
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+852	
+853	        assert self.is_wheel
+854	        assert self.local_file_path
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_install.py
+ Line number: 854
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+853	        assert self.is_wheel
+854	        assert self.local_file_path
+855	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py
+ Line number: 45
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+44	    def add_unnamed_requirement(self, install_req: InstallRequirement) -> None:
+45	        assert not install_req.name
+46	        self.unnamed_requirements.append(install_req)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_set.py
+ Line number: 49
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+48	    def add_named_requirement(self, install_req: InstallRequirement) -> None:
+49	        assert install_req.name
+50	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py
+ Line number: 70
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+69	    location = dist.location
+70	    assert location is not None, "not installed"
+71	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/req/req_uninstall.py
+ Line number: 544
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+543	                )
+544	            assert os.path.samefile(
+545	                normalized_link_pointer, normalized_dist_location
+546	            ), (
+547	                f"Egg-link {develop_egg_link} (to {link_pointer}) does not match "
+548	                f"installed location of {dist.raw_name} (at {dist_location})"
+549	            )
+550	            paths_to_remove.add(develop_egg_link)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py
+ Line number: 135
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+134	        super().__init__()
+135	        assert upgrade_strategy in self._allowed_strategies
+136	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py
+ Line number: 238
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+237	        # This next bit is really a sanity check.
+238	        assert (
+239	            not install_req.user_supplied or parent_req_name is None
+240	        ), "a user supplied req shouldn't have a parent"
+241	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py
+ Line number: 317
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+316	        else:
+317	            assert self.upgrade_strategy == "only-if-needed"
+318	            return req.user_supplied or req.constraint
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py
+ Line number: 452
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+451	        # so it must be None here.
+452	        assert req.satisfied_by is None
+453	        skip_reason = self._check_skip_installed(req)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/legacy/resolver.py
+ Line number: 541
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+540	                # provided by the user.
+541	                assert req_to_install.user_supplied
+542	                self._add_requirement_to_set(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py
+ Line number: 56
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+55	) -> InstallRequirement:
+56	    assert not template.editable, "template is editable"
+57	    if template.req:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py
+ Line number: 81
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+80	) -> InstallRequirement:
+81	    assert template.editable, "template not editable"
+82	    ireq = install_req_from_editable(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py
+ Line number: 264
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+263	        ireq = make_install_req_from_link(link, template)
+264	        assert ireq.link == link
+265	        if ireq.link.is_wheel and not ireq.link.is_file:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py
+ Line number: 268
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+267	            wheel_name = canonicalize_name(wheel.name)
+268	            assert name == wheel_name, f"{name!r} != {wheel_name!r} for wheel"
+269	            # Version may not be present for PEP 508 direct URLs
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py
+ Line number: 272
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+271	                wheel_version = Version(wheel.version)
+272	                assert version == wheel_version, "{!r} != {!r} for wheel {}".format(
+273	                    version, wheel_version, name
+274	                )
+275	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py
+ Line number: 277
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+276	        if cache_entry is not None:
+277	            assert ireq.link.is_wheel
+278	            assert ireq.link.is_file
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/candidates.py
+ Line number: 278
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+277	            assert ireq.link.is_wheel
+278	            assert ireq.link.is_file
+279	            if cache_entry.persistent and template.link is template.original_link:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py
+ Line number: 262
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+261	        template = ireqs[0]
+262	        assert template.req, "Candidates found on index must be PEP 508"
+263	        name = canonicalize_name(template.req.name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py
+ Line number: 267
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+266	        for ireq in ireqs:
+267	            assert ireq.req, "Candidates found on index must be PEP 508"
+268	            specifier &= ireq.req.specifier
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py
+ Line number: 362
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+361	            base_cand = as_base_candidate(lookup_cand)
+362	            assert base_cand is not None, "no extras here"
+363	            yield self._make_extras_candidate(base_cand, extras)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py
+ Line number: 527
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+526	                    continue
+527	                assert ireq.name, "Constraint must be named"
+528	                name = canonicalize_name(ireq.name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py
+ Line number: 641
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+640	    ) -> UnsupportedPythonVersion:
+641	        assert causes, "Requires-Python error reported with no cause"
+642	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/factory.py
+ Line number: 717
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+716	    ) -> InstallationError:
+717	        assert e.causes, "Installation error reported with no cause"
+718	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py
+ Line number: 42
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+41	    def __init__(self, ireq: InstallRequirement) -> None:
+42	        assert ireq.link is None, "This is a link, not a specifier"
+43	        self._ireq = ireq
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py
+ Line number: 54
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+53	    def project_name(self) -> NormalizedName:
+54	        assert self._ireq.req, "Specifier-backed ireq is always PEP 508"
+55	        return canonicalize_name(self._ireq.req.name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py
+ Line number: 78
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+77	    def is_satisfied_by(self, candidate: Candidate) -> bool:
+78	        assert candidate.name == self.name, (
+79	            f"Internal issue: Candidate is not for this requirement "
+80	            f"{candidate.name} vs {self.name}"
+81	        )
+82	        # We can safely always allow prereleases here since PackageFinder
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py
+ Line number: 85
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+84	        # prerelease candidates if the user does not expect them.
+85	        assert self._ireq.req, "Specifier-backed ireq is always PEP 508"
+86	        spec = self._ireq.req.specifier
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py
+ Line number: 97
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+96	    def __init__(self, ireq: InstallRequirement) -> None:
+97	        assert ireq.link is None, "This is a link, not a specifier"
+98	        self._ireq = install_req_drop_extras(ireq)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/requirements.py
+ Line number: 132
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+131	    def is_satisfied_by(self, candidate: Candidate) -> bool:
+132	        assert candidate.name == self._candidate.name, "Not Python candidate"
+133	        # We can safely always allow prereleases here since PackageFinder
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py
+ Line number: 56
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+55	        super().__init__()
+56	        assert upgrade_strategy in self._allowed_strategies
+57	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py
+ Line number: 200
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+199	        """
+200	        assert self._result is not None, "must call resolve() first"
+201	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/resolution/resolvelib/resolver.py
+ Line number: 301
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+300	    difference = set(weights.keys()).difference(requirement_keys)
+301	    assert not difference, difference
+302	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py
+ Line number: 23
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+22	    else:
+23	        assert isinstance(direct_url.info, DirInfo)
+24	        requirement += direct_url.url
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py
+ Line number: 44
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+43	        vcs_backend = vcs.get_backend_for_scheme(link.scheme)
+44	        assert vcs_backend
+45	        url, requested_revision, _ = vcs_backend.get_url_rev_and_auth(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py
+ Line number: 55
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+54	            # with the VCS checkout.
+55	            assert requested_revision
+56	            commit_id = requested_revision
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/direct_url_helpers.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+60	            # which we can inspect to find out the commit id.
+61	            assert source_dir
+62	            commit_id = vcs_backend.get_revision(source_dir)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/encoding.py
+ Line number: 31
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+30	            result = ENCODING_RE.search(line)
+31	            assert result is not None
+32	            encoding = result.groups()[0].decode("ascii")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py
+ Line number: 22
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+21	
+22	    assert os.path.isabs(path)
+23	
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/filesystem.py
+ Line number: 100
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+99	    for _ in range(10):
+100	        name = basename + "".join(random.choice(alphabet) for _ in range(6))
+101	        file = os.path.join(path, name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py
+ Line number: 157
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+156	        # If we are given a diagnostic error to present, present it with indentation.
+157	        assert isinstance(record.args, tuple)
+158	        if getattr(record, "rich", False):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/logging.py
+ Line number: 160
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+159	            (rich_renderable,) = record.args
+160	            assert isinstance(
+161	                rich_renderable, (ConsoleRenderable, RichCast, str)
+162	            ), f"{rich_renderable} is not rich-console-renderable"
+163	
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: ''
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py
+ Line number: 517
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+516	        user = "****"
+517	        password = ""
+518	    else:
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: ':****'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/misc.py
+ Line number: 520
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+519	        user = urllib.parse.quote(user)
+520	        password = ":****"
+521	    return f"{user}{password}@{netloc}"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/setuptools_build.py
+ Line number: 113
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+112	) -> List[str]:
+113	    assert not (use_user_site and prefix)
+114	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py
+ Line number: 4
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+3	import shlex
+4	import subprocess
+5	from typing import (
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py
+ Line number: 141
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+140	    try:
+141	        proc = subprocess.Popen(
+142	            # Convert HiddenText objects to the underlying str.
+143	            reveal_command_args(cmd),
+144	            stdin=subprocess.PIPE,
+145	            stdout=subprocess.PIPE,
+146	            stderr=subprocess.STDOUT if not stdout_only else subprocess.PIPE,
+147	            cwd=cwd,
+148	            env=env,
+149	            errors="backslashreplace",
+150	        )
+151	    except Exception as exc:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py
+ Line number: 161
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+160	    if not stdout_only:
+161	        assert proc.stdout
+162	        assert proc.stdin
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py
+ Line number: 162
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+161	        assert proc.stdout
+162	        assert proc.stdin
+163	        proc.stdin.close()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py
+ Line number: 176
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+175	            if use_spinner:
+176	                assert spinner
+177	                spinner.spin()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/subprocess.py
+ Line number: 199
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+198	    if use_spinner:
+199	        assert spinner
+200	        if proc_had_error:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py
+ Line number: 146
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+145	        if globally_managed:
+146	            assert _tempdir_manager is not None
+147	            _tempdir_manager.enter_context(self)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/temp_dir.py
+ Line number: 151
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+150	    def path(self) -> str:
+151	        assert not self._deleted, f"Attempted to access deleted path: {self._path}"
+152	        return self._path
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/unpacking.py
+ Line number: 216
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+215	                ensure_dir(os.path.dirname(path))
+216	                assert fp is not None
+217	                with open(path, "wb") as destfp:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/utils/urls.py
+ Line number: 30
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+29	    """
+30	    assert url.startswith(
+31	        "file:"
+32	    ), f"You can only turn file: urls into filenames (not {url!r})"
+33	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py
+ Line number: 214
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+213	        # rev return value is always non-None.
+214	        assert rev is not None
+215	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/vcs/git.py
+ Line number: 477
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+476	        if "://" not in url:
+477	            assert "file:" not in url
+478	            url = url.replace("git+", "git+ssh://")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py
+ Line number: 65
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+64	            if base == location:
+65	                assert dirurl is not None
+66	                base = dirurl + "/"  # save the root url
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/vcs/subversion.py
+ Line number: 169
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+168	                match = _svn_info_xml_url_re.search(xml)
+169	                assert match is not None
+170	                url = match.group(1)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 105
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+104	        # unless it points to an immutable commit hash.
+105	        assert not req.editable
+106	        assert req.source_dir
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 106
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+105	        assert not req.editable
+106	        assert req.source_dir
+107	        vcs_backend = vcs.get_backend_for_scheme(req.link.scheme)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 108
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+107	        vcs_backend = vcs.get_backend_for_scheme(req.link.scheme)
+108	        assert vcs_backend
+109	        if vcs_backend.is_immutable_rev_checkout(req.link.url, req.source_dir):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 113
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+112	
+113	    assert req.link
+114	    base, ext = req.link.splitext()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 130
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+129	    cache_available = bool(wheel_cache.cache_dir)
+130	    assert req.link
+131	    if cache_available and _should_cache(req):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 213
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+212	    with TempDirectory(kind="wheel") as temp_dir:
+213	        assert req.name
+214	        if req.use_pep517:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 215
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+214	        if req.use_pep517:
+215	            assert req.metadata_directory
+216	            assert req.pep517_backend
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 216
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+215	            assert req.metadata_directory
+216	            assert req.pep517_backend
+217	            if global_options:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 317
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+316	        for req in requirements:
+317	            assert req.name
+318	            cache_dir = _get_cache_dir(req, wheel_cache)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_internal/wheel_builder.py
+ Line number: 337
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+336	                req.local_file_path = req.link.file_path
+337	                assert req.link.is_wheel
+338	                build_successes.append(req)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/adapter.py
+ Line number: 150
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+149	        if request.method in self.invalidating_methods and resp.ok:
+150	            assert request.url is not None
+151	            cache_url = self.controller.cache_url(request.url)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
+ Line number: 43
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+42	    match = URI.match(uri)
+43	    assert match is not None
+44	    groups = match.groups()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
+ Line number: 146
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+145	        cache_url = request.url
+146	        assert cache_url is not None
+147	        cache_data = self.cache.get(cache_url)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
+ Line number: 167
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+166	        """
+167	        assert request.url is not None
+168	        cache_url = self.cache_url(request.url)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
+ Line number: 215
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+214	        time_tuple = parsedate_tz(headers["date"])
+215	        assert time_tuple is not None
+216	        date = calendar.timegm(time_tuple[:6])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
+ Line number: 344
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+343	            time_tuple = parsedate_tz(response_headers["date"])
+344	            assert time_tuple is not None
+345	            date = calendar.timegm(time_tuple[:6])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
+ Line number: 364
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+363	
+364	        assert request.url is not None
+365	        cache_url = self.cache_url(request.url)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
+ Line number: 416
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+415	            time_tuple = parsedate_tz(response_headers["date"])
+416	            assert time_tuple is not None
+417	            date = calendar.timegm(time_tuple[:6])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/controller.py
+ Line number: 463
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+462	        """
+463	        assert request.url is not None
+464	        cache_url = self.cache_url(request.url)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/cachecontrol/heuristics.py
+ Line number: 137
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+136	        time_tuple = parsedate_tz(headers["date"])
+137	        assert time_tuple is not None
+138	        date = calendar.timegm(time_tuple[:6])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py
+ Line number: 59
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+58	    def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
+59	        assert self.coding_sm is not None
+60	        assert self.distribution_analyzer is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py
+ Line number: 60
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+59	        assert self.coding_sm is not None
+60	        assert self.distribution_analyzer is not None
+61	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/eucjpprober.py
+ Line number: 98
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+97	    def get_confidence(self) -> float:
+98	        assert self.distribution_analyzer is not None
+99	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py
+ Line number: 273
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+272	    def charset_name(self) -> str:
+273	        assert self._logical_prober is not None
+274	        assert self._visual_prober is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py
+ Line number: 274
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+273	        assert self._logical_prober is not None
+274	        assert self._visual_prober is not None
+275	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py
+ Line number: 308
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+307	    def state(self) -> ProbingState:
+308	        assert self._logical_prober is not None
+309	        assert self._visual_prober is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/hebrewprober.py
+ Line number: 309
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+308	        assert self._logical_prober is not None
+309	        assert self._visual_prober is not None
+310	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py
+ Line number: 58
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+57	    def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
+58	        assert self.coding_sm is not None
+59	        assert self.distribution_analyzer is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py
+ Line number: 59
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+58	        assert self.coding_sm is not None
+59	        assert self.distribution_analyzer is not None
+60	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/mbcharsetprober.py
+ Line number: 94
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+93	    def get_confidence(self) -> float:
+94	        assert self.distribution_analyzer is not None
+95	        return self.distribution_analyzer.get_confidence()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py
+ Line number: 59
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+58	    def feed(self, byte_str: Union[bytes, bytearray]) -> ProbingState:
+59	        assert self.coding_sm is not None
+60	        assert self.distribution_analyzer is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py
+ Line number: 60
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+59	        assert self.coding_sm is not None
+60	        assert self.distribution_analyzer is not None
+61	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/sjisprober.py
+ Line number: 101
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+100	    def get_confidence(self) -> float:
+101	        assert self.distribution_analyzer is not None
+102	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/chardet/universaldetector.py
+ Line number: 319
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+318	                charset_name = max_prober.charset_name
+319	                assert charset_name is not None
+320	                lower_charset_name = charset_name.lower()
+
+
+ + +
+
+ +
+
+ blacklist: Using xmlrpclib to parse untrusted XML data is known to be vulnerable to XML attacks. Use defusedxml.xmlrpc.monkey_patch() function to monkey-patch xmlrpclib and mitigate XML vulnerabilities.
+ Test ID: B411
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-20
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py
+ Line number: 42
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b411-import-xmlrpclib
+ +
+
+41	    import httplib
+42	    import xmlrpclib
+43	    import Queue as queue
+
+
+ + +
+
+ +
+
+ blacklist: Using xmlrpc.client to parse untrusted XML data is known to be vulnerable to XML attacks. Use defusedxml.xmlrpc.monkey_patch() function to monkey-patch xmlrpclib and mitigate XML vulnerabilities.
+ Test ID: B411
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-20
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py
+ Line number: 81
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b411-import-xmlrpclib
+ +
+
+80	    import urllib.request as urllib2
+81	    import xmlrpc.client as xmlrpclib
+82	    import queue
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/compat.py
+ Line number: 634
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+633	    def cache_from_source(path, debug_override=None):
+634	        assert path.endswith('.py')
+635	        if debug_override is None:
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak MD5 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/database.py
+ Line number: 1032
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+1031	                f.close()
+1032	            return hashlib.md5(content).hexdigest()
+1033	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py
+ Line number: 11
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+10	import shutil
+11	import subprocess
+12	import tempfile
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py
+ Line number: 58
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+57	                try:
+58	                    rc = subprocess.check_call([s, '--version'], stdout=sink,
+59	                                               stderr=sink)
+60	                    if rc == 0:
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py
+ Line number: 193
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+192	        stderr = []
+193	        p = subprocess.Popen(cmd, **kwargs)
+194	        # We don't use communicate() here because we may need to
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak MD5 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/index.py
+ Line number: 269
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+268	            file_data = f.read()
+269	        md5_digest = hashlib.md5(file_data).hexdigest()
+270	        sha256_digest = hashlib.sha256(file_data).hexdigest()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/locators.py
+ Line number: 953
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+952	        super(DistPathLocator, self).__init__(**kwargs)
+953	        assert isinstance(distpath, DistributionPath)
+954	        self.distpath = distpath
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py
+ Line number: 115
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+114	                parent, _ = os.path.split(d)
+115	                assert parent not in ('', '/')
+116	                add_dir(dirs, parent)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py
+ Line number: 330
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+329	            if _PYTHON_VERSION > (3, 2):
+330	                assert pattern_re.startswith(start) and pattern_re.endswith(end)
+331	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/manifest.py
+ Line number: 342
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+341	                prefix_re = self._glob_to_re(prefix)
+342	                assert prefix_re.startswith(start) and prefix_re.endswith(end)
+343	                prefix_re = prefix_re[len(start): len(prefix_re) - len(end)]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/markers.py
+ Line number: 78
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+77	        else:
+78	            assert isinstance(expr, dict)
+79	            op = expr['op']
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py
+ Line number: 930
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+929	    def _from_legacy(self):
+930	        assert self._legacy and not self._data
+931	        result = {
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/metadata.py
+ Line number: 993
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+992	
+993	        assert self._data and not self._legacy
+994	        result = LegacyMetadata()
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/scripts.py
+ Line number: 297
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+296	                        os.remove(dfname)
+297	                    except Exception:
+298	                        pass  # still in use - ignore error
+299	            else:
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 21
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+20	    ssl = None
+21	import subprocess
+22	import sys
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 287
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+286	        path = path.replace(os.path.sep, '/')
+287	        assert path.startswith(root)
+288	        return path[len(root):].lstrip('/')
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 374
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+373	                entry = get_export_entry(s)
+374	                assert entry is not None
+375	                entries[k] = entry
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 401
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+400	            entry = get_export_entry(s)
+401	            assert entry is not None
+402	            # entry.dist = self
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 552
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+551	    def copy_stream(self, instream, outfile, encoding=None):
+552	        assert not os.path.isdir(outfile)
+553	        self.ensure_dir(os.path.dirname(outfile))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 617
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+616	                else:
+617	                    assert path.startswith(prefix)
+618	                    diagpath = path[len(prefix):]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 667
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+666	        """
+667	        assert self.record
+668	        result = self.files_written, self.dirs_created
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 684
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+683	                if flist:
+684	                    assert flist == ['__pycache__']
+685	                    sd = os.path.join(d, flist[0])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 864
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+863	            break
+864	    assert i is not None
+865	    return result
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 1130
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1129	    def add(self, pred, succ):
+1130	        assert pred != succ
+1131	        self._preds.setdefault(succ, set()).add(pred)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 1135
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1134	    def remove(self, pred, succ):
+1135	        assert pred != succ
+1136	        try:
+
+
+ + +
+
+ +
+
+ tarfile_unsafe_members: tarfile.extractall used without any validation. Please check and discard dangerous members.
+ Test ID: B202
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 1310
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b202_tarfile_unsafe_members.html
+ +
+
+1309	
+1310	        archive.extractall(dest_dir)
+1311	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 1342
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1341	    def __init__(self, minval=0, maxval=100):
+1342	        assert maxval is None or maxval >= minval
+1343	        self.min = self.cur = minval
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 1350
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1349	    def update(self, curval):
+1350	        assert self.min <= curval
+1351	        assert self.max is None or curval <= self.max
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 1351
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1350	        assert self.min <= curval
+1351	        assert self.max is None or curval <= self.max
+1352	        self.cur = curval
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 1360
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1359	    def increment(self, incr):
+1360	        assert incr >= 0
+1361	        self.update(self.cur + incr)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 1451
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1450	    if len(rich_path_glob) > 1:
+1451	        assert len(rich_path_glob) == 3, rich_path_glob
+1452	        prefix, set, suffix = rich_path_glob
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/util.py
+ Line number: 1792
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+1791	    def run_command(self, cmd, **kwargs):
+1792	        p = subprocess.Popen(cmd,
+1793	                             stdout=subprocess.PIPE,
+1794	                             stderr=subprocess.PIPE,
+1795	                             **kwargs)
+1796	        t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py
+ Line number: 34
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+33	        self._parts = parts = self.parse(s)
+34	        assert isinstance(parts, tuple)
+35	        assert len(parts) > 0
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/version.py
+ Line number: 35
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+34	        assert isinstance(parts, tuple)
+35	        assert len(parts) > 0
+36	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distlib/wheel.py
+ Line number: 437
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+436	                        break
+437	                assert distinfo, '.dist-info directory expected, not found'
+438	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py
+ Line number: 37
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+36	import shlex
+37	import subprocess
+38	import sys
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py
+ Line number: 640
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+639	        def __get__(self, obj: Any, owner: Type[Any]) -> Any:
+640	            assert obj is not None, f"call {self._fname} on an instance"
+641	            ret = obj.__dict__[self._fname] = self._f(obj)
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py
+ Line number: 1161
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+1160	            cmd = ("lsb_release", "-a")
+1161	            stdout = subprocess.check_output(cmd, stderr=subprocess.DEVNULL)
+1162	        # Command not found or lsb_release returned error
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py
+ Line number: 1198
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+1197	            cmd = ("uname", "-rs")
+1198	            stdout = subprocess.check_output(cmd, stderr=subprocess.DEVNULL)
+1199	        except OSError:
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py
+ Line number: 1209
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+1208	        try:
+1209	            stdout = subprocess.check_output("oslevel", stderr=subprocess.DEVNULL)
+1210	        except (OSError, subprocess.CalledProcessError):
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/distro/distro.py
+ Line number: 1209
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+1208	        try:
+1209	            stdout = subprocess.check_output("oslevel", stderr=subprocess.DEVNULL)
+1210	        except (OSError, subprocess.CalledProcessError):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py
+ Line number: 369
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+368	    def feed(self, next_bytes):
+369	        assert self._feeding
+370	        view = _get_data_from_buffer(next_bytes)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py
+ Line number: 433
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+432	                break
+433	            assert isinstance(read_data, bytes)
+434	            self._buffer += read_data
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py
+ Line number: 617
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+616	                return self._ext_hook(n, bytes(obj))
+617	        assert typ == TYPE_IMMEDIATE
+618	        return obj
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py
+ Line number: 833
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+832	                    data = obj.data
+833	                assert isinstance(code, int)
+834	                assert isinstance(data, bytes)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/msgpack/fallback.py
+ Line number: 834
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+833	                assert isinstance(code, int)
+834	                assert isinstance(data, bytes)
+835	                L = len(data)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/packaging/_manylinux.py
+ Line number: 146
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+145	        version_string = os.confstr("CS_GNU_LIBC_VERSION")
+146	        assert version_string is not None
+147	        _, version = version_string.split()
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py
+ Line number: 13
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+12	import struct
+13	import subprocess
+14	import sys
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py
+ Line number: 106
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+105	        return None
+106	    proc = subprocess.run([ld], stderr=subprocess.PIPE, universal_newlines=True)
+107	    return _parse_musl_version(proc.stderr)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/packaging/_musllinux.py
+ Line number: 130
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+129	    plat = sysconfig.get_platform()
+130	    assert plat.startswith("linux-"), "not linux"
+131	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py
+ Line number: 152
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+151	
+152	    assert isinstance(marker, (list, tuple, str))
+153	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py
+ Line number: 226
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+225	    for marker in markers:
+226	        assert isinstance(marker, (list, tuple, str))
+227	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/packaging/markers.py
+ Line number: 242
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+241	        else:
+242	            assert marker in ["and", "or"]
+243	            if marker == "or":
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py
+ Line number: 1561
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+1560	            code = compile(source, script_filename, 'exec')
+1561	            exec(code, namespace, namespace)
+1562	        else:
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pkg_resources/__init__.py
+ Line number: 1572
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+1571	            script_code = compile(script_text, script_filename, 'exec')
+1572	            exec(script_code, namespace, namespace)
+1573	
+
+
+ + +
+
+ +
+
+ hardcoded_tmp_directory: Probable insecure usage of temp file/directory.
+ Test ID: B108
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-377
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py
+ Line number: 103
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b108_hardcoded_tmp_directory.html
+ +
+
+102	        """:return: cache directory shared by users, e.g. ``/var/tmp/$appname/$version``"""
+103	        return self._append_app_name_and_version("/var/tmp")  # noqa: S108
+104	
+
+
+ + +
+
+ +
+
+ hardcoded_tmp_directory: Probable insecure usage of temp file/directory.
+ Test ID: B108
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-377
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/platformdirs/unix.py
+ Line number: 164
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b108_hardcoded_tmp_directory.html
+ +
+
+163	                if not Path(path).exists():
+164	                    path = f"/tmp/runtime-{getuid()}"  # noqa: S108
+165	            else:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/cmdline.py
+ Line number: 522
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+521	                width = shutil.get_terminal_size().columns - 2
+522	            except Exception:
+523	                pass
+524	        argparse.HelpFormatter.__init__(self, prog, indent_increment,
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/__init__.py
+ Line number: 103
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+102	        with open(filename, 'rb') as f:
+103	            exec(f.read(), custom_namespace)
+104	        # Retrieve the class `formattername` from that namespace
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py
+ Line number: 18
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+17	
+18	import subprocess
+19	
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py
+ Line number: 85
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+84	    def _get_nix_font_path(self, name, style):
+85	        proc = subprocess.Popen(['fc-list', "%s:style=%s" % (name, style), 'file'],
+86	                                stdout=subprocess.PIPE, stderr=None)
+87	        stdout, _ = proc.communicate()
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/formatters/img.py
+ Line number: 85
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+84	    def _get_nix_font_path(self, name, style):
+85	        proc = subprocess.Popen(['fc-list', "%s:style=%s" % (name, style), 'file'],
+86	                                stdout=subprocess.PIPE, stderr=None)
+87	        stdout, _ = proc.communicate()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 492
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+491	        """Preprocess the token component of a token definition."""
+492	        assert type(token) is _TokenType or callable(token), \
+493	            'token type must be simple type or callable, not %r' % (token,)
+494	        return token
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 509
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+508	            else:
+509	                assert False, 'unknown new state %r' % new_state
+510	        elif isinstance(new_state, combined):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 516
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+515	            for istate in new_state:
+516	                assert istate != new_state, 'circular state ref %r' % istate
+517	                itokens.extend(cls._process_state(unprocessed,
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 524
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+523	            for istate in new_state:
+524	                assert (istate in unprocessed or
+525	                        istate in ('#pop', '#push')), \
+526	                    'unknown new state ' + istate
+527	            return new_state
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 529
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+528	        else:
+529	            assert False, 'unknown new state def %r' % new_state
+530	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 533
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+532	        """Preprocess a single state definition."""
+533	        assert type(state) is str, "wrong state name %r" % state
+534	        assert state[0] != '#', "invalid state name %r" % state
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 534
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+533	        assert type(state) is str, "wrong state name %r" % state
+534	        assert state[0] != '#', "invalid state name %r" % state
+535	        if state in processed:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 542
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+541	                # it's a state reference
+542	                assert tdef != state, "circular state reference %r" % state
+543	                tokens.extend(cls._process_state(unprocessed, processed,
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 556
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+555	
+556	            assert type(tdef) is tuple, "wrong rule def %r" % tdef
+557	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 723
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+722	                        else:
+723	                            assert False, "wrong state def: %r" % new_state
+724	                        statetokens = tokendefs[statestack[-1]]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexer.py
+ Line number: 811
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+810	                        else:
+811	                            assert False, "wrong state def: %r" % new_state
+812	                        statetokens = tokendefs[ctx.stack[-1]]
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/lexers/__init__.py
+ Line number: 153
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+152	        with open(filename, 'rb') as f:
+153	            exec(f.read(), custom_namespace)
+154	        # Retrieve the class `lexername` from that namespace
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pygments/style.py
+ Line number: 79
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+78	                return text
+79	            assert False, "wrong color format %r" % text
+80	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py
+ Line number: 8
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+7	from os.path import join as pjoin
+8	from subprocess import STDOUT, check_call, check_output
+9	
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py
+ Line number: 59
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+58	
+59	    check_call(cmd, cwd=cwd, env=env)
+60	
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/pyproject_hooks/_impl.py
+ Line number: 71
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+70	
+71	    check_output(cmd, cwd=cwd, env=env, stderr=STDOUT)
+72	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py
+ Line number: 57
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+56	    urllib3_version = urllib3_version.split(".")
+57	    assert urllib3_version != ["dev"]  # Verify urllib3 isn't installed from git.
+58	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py
+ Line number: 67
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+66	    # urllib3 >= 1.21.1
+67	    assert major >= 1
+68	    if major == 1:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py
+ Line number: 69
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+68	    if major == 1:
+69	        assert minor >= 21
+70	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py
+ Line number: 76
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+75	        # chardet_version >= 3.0.2, < 6.0.0
+76	        assert (3, 0, 2) <= (major, minor, patch) < (6, 0, 0)
+77	    elif charset_normalizer_version:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/requests/__init__.py
+ Line number: 81
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+80	        # charset_normalizer >= 2.0.0 < 4.0.0
+81	        assert (2, 0, 0) <= (major, minor, patch) < (4, 0, 0)
+82	    else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/requests/_internal_utils.py
+ Line number: 45
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+44	    """
+45	    assert isinstance(u_string, str)
+46	    try:
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak MD5 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py
+ Line number: 148
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+147	                    x = x.encode("utf-8")
+148	                return hashlib.md5(x).hexdigest()
+149	
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py
+ Line number: 156
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+155	                    x = x.encode("utf-8")
+156	                return hashlib.sha1(x).hexdigest()
+157	
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/requests/auth.py
+ Line number: 205
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+204	
+205	        cnonce = hashlib.sha1(s).hexdigest()[:16]
+206	        if _algorithm == "MD5-SESS":
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '㊙'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py
+ Line number: 156
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+155	    "japanese_reserved_button": "🈯",
+156	    "japanese_secret_button": "㊙",
+157	    "japanese_service_charge_button": "🈂",
+158	    "japanese_symbol_for_beginner": "🔰",
+159	    "japanese_vacancy_button": "🈳",
+160	    "jersey": "🇯🇪",
+161	    "jordan": "🇯🇴",
+162	    "kazakhstan": "🇰🇿",
+163	    "kenya": "🇰🇪",
+164	    "kiribati": "🇰🇮",
+165	    "kosovo": "🇽🇰",
+166	    "kuwait": "🇰🇼",
+167	    "kyrgyzstan": "🇰🇬",
+168	    "laos": "🇱🇦",
+169	    "latvia": "🇱🇻",
+170	    "lebanon": "🇱🇧",
+171	    "leo": "♌",
+172	    "lesotho": "🇱🇸",
+173	    "liberia": "🇱🇷",
+174	    "libra": "♎",
+175	    "libya": "🇱🇾",
+176	    "liechtenstein": "🇱🇮",
+177	    "lithuania": "🇱🇹",
+178	    "luxembourg": "🇱🇺",
+179	    "macau_sar_china": "🇲🇴",
+180	    "macedonia": "🇲🇰",
+181	    "madagascar": "🇲🇬",
+182	    "malawi": "🇲🇼",
+183	    "malaysia": "🇲🇾",
+184	    "maldives": "🇲🇻",
+185	    "mali": "🇲🇱",
+186	    "malta": "🇲🇹",
+187	    "marshall_islands": "🇲🇭",
+188	    "martinique": "🇲🇶",
+189	    "mauritania": "🇲🇷",
+190	    "mauritius": "🇲🇺",
+191	    "mayotte": "🇾🇹",
+192	    "mexico": "🇲🇽",
+193	    "micronesia": "🇫🇲",
+194	    "moldova": "🇲🇩",
+195	    "monaco": "🇲🇨",
+196	    "mongolia": "🇲🇳",
+197	    "montenegro": "🇲🇪",
+198	    "montserrat": "🇲🇸",
+199	    "morocco": "🇲🇦",
+200	    "mozambique": "🇲🇿",
+201	    "mrs._claus": "🤶",
+202	    "mrs._claus_dark_skin_tone": "🤶🏿",
+203	    "mrs._claus_light_skin_tone": "🤶🏻",
+204	    "mrs._claus_medium-dark_skin_tone": "🤶🏾",
+205	    "mrs._claus_medium-light_skin_tone": "🤶🏼",
+206	    "mrs._claus_medium_skin_tone": "🤶🏽",
+207	    "myanmar_(burma)": "🇲🇲",
+208	    "new_button": "🆕",
+209	    "ng_button": "🆖",
+210	    "namibia": "🇳🇦",
+211	    "nauru": "🇳🇷",
+212	    "nepal": "🇳🇵",
+213	    "netherlands": "🇳🇱",
+214	    "new_caledonia": "🇳🇨",
+215	    "new_zealand": "🇳🇿",
+216	    "nicaragua": "🇳🇮",
+217	    "niger": "🇳🇪",
+218	    "nigeria": "🇳🇬",
+219	    "niue": "🇳🇺",
+220	    "norfolk_island": "🇳🇫",
+221	    "north_korea": "🇰🇵",
+222	    "northern_mariana_islands": "🇲🇵",
+223	    "norway": "🇳🇴",
+224	    "ok_button": "🆗",
+225	    "ok_hand": "👌",
+226	    "ok_hand_dark_skin_tone": "👌🏿",
+227	    "ok_hand_light_skin_tone": "👌🏻",
+228	    "ok_hand_medium-dark_skin_tone": "👌🏾",
+229	    "ok_hand_medium-light_skin_tone": "👌🏼",
+230	    "ok_hand_medium_skin_tone": "👌🏽",
+231	    "on!_arrow": "🔛",
+232	    "o_button_(blood_type)": "🅾",
+233	    "oman": "🇴🇲",
+234	    "ophiuchus": "⛎",
+235	    "p_button": "🅿",
+236	    "pakistan": "🇵🇰",
+237	    "palau": "🇵🇼",
+238	    "palestinian_territories": "🇵🇸",
+239	    "panama": "🇵🇦",
+240	    "papua_new_guinea": "🇵🇬",
+241	    "paraguay": "🇵🇾",
+242	    "peru": "🇵🇪",
+243	    "philippines": "🇵🇭",
+244	    "pisces": "♓",
+245	    "pitcairn_islands": "🇵🇳",
+246	    "poland": "🇵🇱",
+247	    "portugal": "🇵🇹",
+248	    "puerto_rico": "🇵🇷",
+249	    "qatar": "🇶🇦",
+250	    "romania": "🇷🇴",
+251	    "russia": "🇷🇺",
+252	    "rwanda": "🇷🇼",
+253	    "réunion": "🇷🇪",
+254	    "soon_arrow": "🔜",
+255	    "sos_button": "🆘",
+256	    "sagittarius": "♐",
+257	    "samoa": "🇼🇸",
+258	    "san_marino": "🇸🇲",
+259	    "santa_claus": "🎅",
+260	    "santa_claus_dark_skin_tone": "🎅🏿",
+261	    "santa_claus_light_skin_tone": "🎅🏻",
+262	    "santa_claus_medium-dark_skin_tone": "🎅🏾",
+263	    "santa_claus_medium-light_skin_tone": "🎅🏼",
+264	    "santa_claus_medium_skin_tone": "🎅🏽",
+265	    "saudi_arabia": "🇸🇦",
+266	    "scorpio": "♏",
+267	    "scotland": "🏴\U000e0067\U000e0062\U000e0073\U000e0063\U000e0074\U000e007f",
+268	    "senegal": "🇸🇳",
+269	    "serbia": "🇷🇸",
+270	    "seychelles": "🇸🇨",
+271	    "sierra_leone": "🇸🇱",
+272	    "singapore": "🇸🇬",
+273	    "sint_maarten": "🇸🇽",
+274	    "slovakia": "🇸🇰",
+275	    "slovenia": "🇸🇮",
+276	    "solomon_islands": "🇸🇧",
+277	    "somalia": "🇸🇴",
+278	    "south_africa": "🇿🇦",
+279	    "south_georgia_&_south_sandwich_islands": "🇬🇸",
+280	    "south_korea": "🇰🇷",
+281	    "south_sudan": "🇸🇸",
+282	    "spain": "🇪🇸",
+283	    "sri_lanka": "🇱🇰",
+284	    "st._barthélemy": "🇧🇱",
+285	    "st._helena": "🇸🇭",
+286	    "st._kitts_&_nevis": "🇰🇳",
+287	    "st._lucia": "🇱🇨",
+288	    "st._martin": "🇲🇫",
+289	    "st._pierre_&_miquelon": "🇵🇲",
+290	    "st._vincent_&_grenadines": "🇻🇨",
+291	    "statue_of_liberty": "🗽",
+292	    "sudan": "🇸🇩",
+293	    "suriname": "🇸🇷",
+294	    "svalbard_&_jan_mayen": "🇸🇯",
+295	    "swaziland": "🇸🇿",
+296	    "sweden": "🇸🇪",
+297	    "switzerland": "🇨🇭",
+298	    "syria": "🇸🇾",
+299	    "são_tomé_&_príncipe": "🇸🇹",
+300	    "t-rex": "🦖",
+301	    "top_arrow": "🔝",
+302	    "taiwan": "🇹🇼",
+303	    "tajikistan": "🇹🇯",
+304	    "tanzania": "🇹🇿",
+305	    "taurus": "♉",
+306	    "thailand": "🇹🇭",
+307	    "timor-leste": "🇹🇱",
+308	    "togo": "🇹🇬",
+309	    "tokelau": "🇹🇰",
+310	    "tokyo_tower": "🗼",
+311	    "tonga": "🇹🇴",
+312	    "trinidad_&_tobago": "🇹🇹",
+313	    "tristan_da_cunha": "🇹🇦",
+314	    "tunisia": "🇹🇳",
+315	    "turkey": "🦃",
+316	    "turkmenistan": "🇹🇲",
+317	    "turks_&_caicos_islands": "🇹🇨",
+318	    "tuvalu": "🇹🇻",
+319	    "u.s._outlying_islands": "🇺🇲",
+320	    "u.s._virgin_islands": "🇻🇮",
+321	    "up!_button": "🆙",
+322	    "uganda": "🇺🇬",
+323	    "ukraine": "🇺🇦",
+324	    "united_arab_emirates": "🇦🇪",
+325	    "united_kingdom": "🇬🇧",
+326	    "united_nations": "🇺🇳",
+327	    "united_states": "🇺🇸",
+328	    "uruguay": "🇺🇾",
+329	    "uzbekistan": "🇺🇿",
+330	    "vs_button": "🆚",
+331	    "vanuatu": "🇻🇺",
+332	    "vatican_city": "🇻🇦",
+333	    "venezuela": "🇻🇪",
+334	    "vietnam": "🇻🇳",
+335	    "virgo": "♍",
+336	    "wales": "🏴\U000e0067\U000e0062\U000e0077\U000e006c\U000e0073\U000e007f",
+337	    "wallis_&_futuna": "🇼🇫",
+338	    "western_sahara": "🇪🇭",
+339	    "yemen": "🇾🇪",
+340	    "zambia": "🇿🇲",
+341	    "zimbabwe": "🇿🇼",
+342	    "abacus": "🧮",
+343	    "adhesive_bandage": "🩹",
+344	    "admission_tickets": "🎟",
+345	    "adult": "🧑",
+346	    "adult_dark_skin_tone": "🧑🏿",
+347	    "adult_light_skin_tone": "🧑🏻",
+348	    "adult_medium-dark_skin_tone": "🧑🏾",
+349	    "adult_medium-light_skin_tone": "🧑🏼",
+350	    "adult_medium_skin_tone": "🧑🏽",
+351	    "aerial_tramway": "🚡",
+352	    "airplane": "✈",
+353	    "airplane_arrival": "🛬",
+354	    "airplane_departure": "🛫",
+355	    "alarm_clock": "⏰",
+356	    "alembic": "⚗",
+357	    "alien": "👽",
+358	    "alien_monster": "👾",
+359	    "ambulance": "🚑",
+360	    "american_football": "🏈",
+361	    "amphora": "🏺",
+362	    "anchor": "⚓",
+363	    "anger_symbol": "💢",
+364	    "angry_face": "😠",
+365	    "angry_face_with_horns": "👿",
+366	    "anguished_face": "😧",
+367	    "ant": "🐜",
+368	    "antenna_bars": "📶",
+369	    "anxious_face_with_sweat": "😰",
+370	    "articulated_lorry": "🚛",
+371	    "artist_palette": "🎨",
+372	    "astonished_face": "😲",
+373	    "atom_symbol": "⚛",
+374	    "auto_rickshaw": "🛺",
+375	    "automobile": "🚗",
+376	    "avocado": "🥑",
+377	    "axe": "🪓",
+378	    "baby": "👶",
+379	    "baby_angel": "👼",
+380	    "baby_angel_dark_skin_tone": "👼🏿",
+381	    "baby_angel_light_skin_tone": "👼🏻",
+382	    "baby_angel_medium-dark_skin_tone": "👼🏾",
+383	    "baby_angel_medium-light_skin_tone": "👼🏼",
+384	    "baby_angel_medium_skin_tone": "👼🏽",
+385	    "baby_bottle": "🍼",
+386	    "baby_chick": "🐤",
+387	    "baby_dark_skin_tone": "👶🏿",
+388	    "baby_light_skin_tone": "👶🏻",
+389	    "baby_medium-dark_skin_tone": "👶🏾",
+390	    "baby_medium-light_skin_tone": "👶🏼",
+391	    "baby_medium_skin_tone": "👶🏽",
+392	    "baby_symbol": "🚼",
+393	    "backhand_index_pointing_down": "👇",
+394	    "backhand_index_pointing_down_dark_skin_tone": "👇🏿",
+395	    "backhand_index_pointing_down_light_skin_tone": "👇🏻",
+396	    "backhand_index_pointing_down_medium-dark_skin_tone": "👇🏾",
+397	    "backhand_index_pointing_down_medium-light_skin_tone": "👇🏼",
+398	    "backhand_index_pointing_down_medium_skin_tone": "👇🏽",
+399	    "backhand_index_pointing_left": "👈",
+400	    "backhand_index_pointing_left_dark_skin_tone": "👈🏿",
+401	    "backhand_index_pointing_left_light_skin_tone": "👈🏻",
+402	    "backhand_index_pointing_left_medium-dark_skin_tone": "👈🏾",
+403	    "backhand_index_pointing_left_medium-light_skin_tone": "👈🏼",
+404	    "backhand_index_pointing_left_medium_skin_tone": "👈🏽",
+405	    "backhand_index_pointing_right": "👉",
+406	    "backhand_index_pointing_right_dark_skin_tone": "👉🏿",
+407	    "backhand_index_pointing_right_light_skin_tone": "👉🏻",
+408	    "backhand_index_pointing_right_medium-dark_skin_tone": "👉🏾",
+409	    "backhand_index_pointing_right_medium-light_skin_tone": "👉🏼",
+410	    "backhand_index_pointing_right_medium_skin_tone": "👉🏽",
+411	    "backhand_index_pointing_up": "👆",
+412	    "backhand_index_pointing_up_dark_skin_tone": "👆🏿",
+413	    "backhand_index_pointing_up_light_skin_tone": "👆🏻",
+414	    "backhand_index_pointing_up_medium-dark_skin_tone": "👆🏾",
+415	    "backhand_index_pointing_up_medium-light_skin_tone": "👆🏼",
+416	    "backhand_index_pointing_up_medium_skin_tone": "👆🏽",
+417	    "bacon": "🥓",
+418	    "badger": "🦡",
+419	    "badminton": "🏸",
+420	    "bagel": "🥯",
+421	    "baggage_claim": "🛄",
+422	    "baguette_bread": "🥖",
+423	    "balance_scale": "⚖",
+424	    "bald": "🦲",
+425	    "bald_man": "👨\u200d🦲",
+426	    "bald_woman": "👩\u200d🦲",
+427	    "ballet_shoes": "🩰",
+428	    "balloon": "🎈",
+429	    "ballot_box_with_ballot": "🗳",
+430	    "ballot_box_with_check": "☑",
+431	    "banana": "🍌",
+432	    "banjo": "🪕",
+433	    "bank": "🏦",
+434	    "bar_chart": "📊",
+435	    "barber_pole": "💈",
+436	    "baseball": "⚾",
+437	    "basket": "🧺",
+438	    "basketball": "🏀",
+439	    "bat": "🦇",
+440	    "bathtub": "🛁",
+441	    "battery": "🔋",
+442	    "beach_with_umbrella": "🏖",
+443	    "beaming_face_with_smiling_eyes": "😁",
+444	    "bear_face": "🐻",
+445	    "bearded_person": "🧔",
+446	    "bearded_person_dark_skin_tone": "🧔🏿",
+447	    "bearded_person_light_skin_tone": "🧔🏻",
+448	    "bearded_person_medium-dark_skin_tone": "🧔🏾",
+449	    "bearded_person_medium-light_skin_tone": "🧔🏼",
+450	    "bearded_person_medium_skin_tone": "🧔🏽",
+451	    "beating_heart": "💓",
+452	    "bed": "🛏",
+453	    "beer_mug": "🍺",
+454	    "bell": "🔔",
+455	    "bell_with_slash": "🔕",
+456	    "bellhop_bell": "🛎",
+457	    "bento_box": "🍱",
+458	    "beverage_box": "🧃",
+459	    "bicycle": "🚲",
+460	    "bikini": "👙",
+461	    "billed_cap": "🧢",
+462	    "biohazard": "☣",
+463	    "bird": "🐦",
+464	    "birthday_cake": "🎂",
+465	    "black_circle": "⚫",
+466	    "black_flag": "🏴",
+467	    "black_heart": "🖤",
+468	    "black_large_square": "⬛",
+469	    "black_medium-small_square": "◾",
+470	    "black_medium_square": "◼",
+471	    "black_nib": "✒",
+472	    "black_small_square": "▪",
+473	    "black_square_button": "🔲",
+474	    "blond-haired_man": "👱\u200d♂️",
+475	    "blond-haired_man_dark_skin_tone": "👱🏿\u200d♂️",
+476	    "blond-haired_man_light_skin_tone": "👱🏻\u200d♂️",
+477	    "blond-haired_man_medium-dark_skin_tone": "👱🏾\u200d♂️",
+478	    "blond-haired_man_medium-light_skin_tone": "👱🏼\u200d♂️",
+479	    "blond-haired_man_medium_skin_tone": "👱🏽\u200d♂️",
+480	    "blond-haired_person": "👱",
+481	    "blond-haired_person_dark_skin_tone": "👱🏿",
+482	    "blond-haired_person_light_skin_tone": "👱🏻",
+483	    "blond-haired_person_medium-dark_skin_tone": "👱🏾",
+484	    "blond-haired_person_medium-light_skin_tone": "👱🏼",
+485	    "blond-haired_person_medium_skin_tone": "👱🏽",
+486	    "blond-haired_woman": "👱\u200d♀️",
+487	    "blond-haired_woman_dark_skin_tone": "👱🏿\u200d♀️",
+488	    "blond-haired_woman_light_skin_tone": "👱🏻\u200d♀️",
+489	    "blond-haired_woman_medium-dark_skin_tone": "👱🏾\u200d♀️",
+490	    "blond-haired_woman_medium-light_skin_tone": "👱🏼\u200d♀️",
+491	    "blond-haired_woman_medium_skin_tone": "👱🏽\u200d♀️",
+492	    "blossom": "🌼",
+493	    "blowfish": "🐡",
+494	    "blue_book": "📘",
+495	    "blue_circle": "🔵",
+496	    "blue_heart": "💙",
+497	    "blue_square": "🟦",
+498	    "boar": "🐗",
+499	    "bomb": "💣",
+500	    "bone": "🦴",
+501	    "bookmark": "🔖",
+502	    "bookmark_tabs": "📑",
+503	    "books": "📚",
+504	    "bottle_with_popping_cork": "🍾",
+505	    "bouquet": "💐",
+506	    "bow_and_arrow": "🏹",
+507	    "bowl_with_spoon": "🥣",
+508	    "bowling": "🎳",
+509	    "boxing_glove": "🥊",
+510	    "boy": "👦",
+511	    "boy_dark_skin_tone": "👦🏿",
+512	    "boy_light_skin_tone": "👦🏻",
+513	    "boy_medium-dark_skin_tone": "👦🏾",
+514	    "boy_medium-light_skin_tone": "👦🏼",
+515	    "boy_medium_skin_tone": "👦🏽",
+516	    "brain": "🧠",
+517	    "bread": "🍞",
+518	    "breast-feeding": "🤱",
+519	    "breast-feeding_dark_skin_tone": "🤱🏿",
+520	    "breast-feeding_light_skin_tone": "🤱🏻",
+521	    "breast-feeding_medium-dark_skin_tone": "🤱🏾",
+522	    "breast-feeding_medium-light_skin_tone": "🤱🏼",
+523	    "breast-feeding_medium_skin_tone": "🤱🏽",
+524	    "brick": "🧱",
+525	    "bride_with_veil": "👰",
+526	    "bride_with_veil_dark_skin_tone": "👰🏿",
+527	    "bride_with_veil_light_skin_tone": "👰🏻",
+528	    "bride_with_veil_medium-dark_skin_tone": "👰🏾",
+529	    "bride_with_veil_medium-light_skin_tone": "👰🏼",
+530	    "bride_with_veil_medium_skin_tone": "👰🏽",
+531	    "bridge_at_night": "🌉",
+532	    "briefcase": "💼",
+533	    "briefs": "🩲",
+534	    "bright_button": "🔆",
+535	    "broccoli": "🥦",
+536	    "broken_heart": "💔",
+537	    "broom": "🧹",
+538	    "brown_circle": "🟤",
+539	    "brown_heart": "🤎",
+540	    "brown_square": "🟫",
+541	    "bug": "🐛",
+542	    "building_construction": "🏗",
+543	    "bullet_train": "🚅",
+544	    "burrito": "🌯",
+545	    "bus": "🚌",
+546	    "bus_stop": "🚏",
+547	    "bust_in_silhouette": "👤",
+548	    "busts_in_silhouette": "👥",
+549	    "butter": "🧈",
+550	    "butterfly": "🦋",
+551	    "cactus": "🌵",
+552	    "calendar": "📆",
+553	    "call_me_hand": "🤙",
+554	    "call_me_hand_dark_skin_tone": "🤙🏿",
+555	    "call_me_hand_light_skin_tone": "🤙🏻",
+556	    "call_me_hand_medium-dark_skin_tone": "🤙🏾",
+557	    "call_me_hand_medium-light_skin_tone": "🤙🏼",
+558	    "call_me_hand_medium_skin_tone": "🤙🏽",
+559	    "camel": "🐫",
+560	    "camera": "📷",
+561	    "camera_with_flash": "📸",
+562	    "camping": "🏕",
+563	    "candle": "🕯",
+564	    "candy": "🍬",
+565	    "canned_food": "🥫",
+566	    "canoe": "🛶",
+567	    "card_file_box": "🗃",
+568	    "card_index": "📇",
+569	    "card_index_dividers": "🗂",
+570	    "carousel_horse": "🎠",
+571	    "carp_streamer": "🎏",
+572	    "carrot": "🥕",
+573	    "castle": "🏰",
+574	    "cat": "🐱",
+575	    "cat_face": "🐱",
+576	    "cat_face_with_tears_of_joy": "😹",
+577	    "cat_face_with_wry_smile": "😼",
+578	    "chains": "⛓",
+579	    "chair": "🪑",
+580	    "chart_decreasing": "📉",
+581	    "chart_increasing": "📈",
+582	    "chart_increasing_with_yen": "💹",
+583	    "cheese_wedge": "🧀",
+584	    "chequered_flag": "🏁",
+585	    "cherries": "🍒",
+586	    "cherry_blossom": "🌸",
+587	    "chess_pawn": "♟",
+588	    "chestnut": "🌰",
+589	    "chicken": "🐔",
+590	    "child": "🧒",
+591	    "child_dark_skin_tone": "🧒🏿",
+592	    "child_light_skin_tone": "🧒🏻",
+593	    "child_medium-dark_skin_tone": "🧒🏾",
+594	    "child_medium-light_skin_tone": "🧒🏼",
+595	    "child_medium_skin_tone": "🧒🏽",
+596	    "children_crossing": "🚸",
+597	    "chipmunk": "🐿",
+598	    "chocolate_bar": "🍫",
+599	    "chopsticks": "🥢",
+600	    "church": "⛪",
+601	    "cigarette": "🚬",
+602	    "cinema": "🎦",
+603	    "circled_m": "Ⓜ",
+604	    "circus_tent": "🎪",
+605	    "cityscape": "🏙",
+606	    "cityscape_at_dusk": "🌆",
+607	    "clamp": "🗜",
+608	    "clapper_board": "🎬",
+609	    "clapping_hands": "👏",
+610	    "clapping_hands_dark_skin_tone": "👏🏿",
+611	    "clapping_hands_light_skin_tone": "👏🏻",
+612	    "clapping_hands_medium-dark_skin_tone": "👏🏾",
+613	    "clapping_hands_medium-light_skin_tone": "👏🏼",
+614	    "clapping_hands_medium_skin_tone": "👏🏽",
+615	    "classical_building": "🏛",
+616	    "clinking_beer_mugs": "🍻",
+617	    "clinking_glasses": "🥂",
+618	    "clipboard": "📋",
+619	    "clockwise_vertical_arrows": "🔃",
+620	    "closed_book": "📕",
+621	    "closed_mailbox_with_lowered_flag": "📪",
+622	    "closed_mailbox_with_raised_flag": "📫",
+623	    "closed_umbrella": "🌂",
+624	    "cloud": "☁",
+625	    "cloud_with_lightning": "🌩",
+626	    "cloud_with_lightning_and_rain": "⛈",
+627	    "cloud_with_rain": "🌧",
+628	    "cloud_with_snow": "🌨",
+629	    "clown_face": "🤡",
+630	    "club_suit": "♣",
+631	    "clutch_bag": "👝",
+632	    "coat": "🧥",
+633	    "cocktail_glass": "🍸",
+634	    "coconut": "🥥",
+635	    "coffin": "⚰",
+636	    "cold_face": "🥶",
+637	    "collision": "💥",
+638	    "comet": "☄",
+639	    "compass": "🧭",
+640	    "computer_disk": "💽",
+641	    "computer_mouse": "🖱",
+642	    "confetti_ball": "🎊",
+643	    "confounded_face": "😖",
+644	    "confused_face": "😕",
+645	    "construction": "🚧",
+646	    "construction_worker": "👷",
+647	    "construction_worker_dark_skin_tone": "👷🏿",
+648	    "construction_worker_light_skin_tone": "👷🏻",
+649	    "construction_worker_medium-dark_skin_tone": "👷🏾",
+650	    "construction_worker_medium-light_skin_tone": "👷🏼",
+651	    "construction_worker_medium_skin_tone": "👷🏽",
+652	    "control_knobs": "🎛",
+653	    "convenience_store": "🏪",
+654	    "cooked_rice": "🍚",
+655	    "cookie": "🍪",
+656	    "cooking": "🍳",
+657	    "copyright": "©",
+658	    "couch_and_lamp": "🛋",
+659	    "counterclockwise_arrows_button": "🔄",
+660	    "couple_with_heart": "💑",
+661	    "couple_with_heart_man_man": "👨\u200d❤️\u200d👨",
+662	    "couple_with_heart_woman_man": "👩\u200d❤️\u200d👨",
+663	    "couple_with_heart_woman_woman": "👩\u200d❤️\u200d👩",
+664	    "cow": "🐮",
+665	    "cow_face": "🐮",
+666	    "cowboy_hat_face": "🤠",
+667	    "crab": "🦀",
+668	    "crayon": "🖍",
+669	    "credit_card": "💳",
+670	    "crescent_moon": "🌙",
+671	    "cricket": "🦗",
+672	    "cricket_game": "🏏",
+673	    "crocodile": "🐊",
+674	    "croissant": "🥐",
+675	    "cross_mark": "❌",
+676	    "cross_mark_button": "❎",
+677	    "crossed_fingers": "🤞",
+678	    "crossed_fingers_dark_skin_tone": "🤞🏿",
+679	    "crossed_fingers_light_skin_tone": "🤞🏻",
+680	    "crossed_fingers_medium-dark_skin_tone": "🤞🏾",
+681	    "crossed_fingers_medium-light_skin_tone": "🤞🏼",
+682	    "crossed_fingers_medium_skin_tone": "🤞🏽",
+683	    "crossed_flags": "🎌",
+684	    "crossed_swords": "⚔",
+685	    "crown": "👑",
+686	    "crying_cat_face": "😿",
+687	    "crying_face": "😢",
+688	    "crystal_ball": "🔮",
+689	    "cucumber": "🥒",
+690	    "cupcake": "🧁",
+691	    "cup_with_straw": "🥤",
+692	    "curling_stone": "🥌",
+693	    "curly_hair": "🦱",
+694	    "curly-haired_man": "👨\u200d🦱",
+695	    "curly-haired_woman": "👩\u200d🦱",
+696	    "curly_loop": "➰",
+697	    "currency_exchange": "💱",
+698	    "curry_rice": "🍛",
+699	    "custard": "🍮",
+700	    "customs": "🛃",
+701	    "cut_of_meat": "🥩",
+702	    "cyclone": "🌀",
+703	    "dagger": "🗡",
+704	    "dango": "🍡",
+705	    "dashing_away": "💨",
+706	    "deaf_person": "🧏",
+707	    "deciduous_tree": "🌳",
+708	    "deer": "🦌",
+709	    "delivery_truck": "🚚",
+710	    "department_store": "🏬",
+711	    "derelict_house": "🏚",
+712	    "desert": "🏜",
+713	    "desert_island": "🏝",
+714	    "desktop_computer": "🖥",
+715	    "detective": "🕵",
+716	    "detective_dark_skin_tone": "🕵🏿",
+717	    "detective_light_skin_tone": "🕵🏻",
+718	    "detective_medium-dark_skin_tone": "🕵🏾",
+719	    "detective_medium-light_skin_tone": "🕵🏼",
+720	    "detective_medium_skin_tone": "🕵🏽",
+721	    "diamond_suit": "♦",
+722	    "diamond_with_a_dot": "💠",
+723	    "dim_button": "🔅",
+724	    "direct_hit": "🎯",
+725	    "disappointed_face": "😞",
+726	    "diving_mask": "🤿",
+727	    "diya_lamp": "🪔",
+728	    "dizzy": "💫",
+729	    "dizzy_face": "😵",
+730	    "dna": "🧬",
+731	    "dog": "🐶",
+732	    "dog_face": "🐶",
+733	    "dollar_banknote": "💵",
+734	    "dolphin": "🐬",
+735	    "door": "🚪",
+736	    "dotted_six-pointed_star": "🔯",
+737	    "double_curly_loop": "➿",
+738	    "double_exclamation_mark": "‼",
+739	    "doughnut": "🍩",
+740	    "dove": "🕊",
+741	    "down-left_arrow": "↙",
+742	    "down-right_arrow": "↘",
+743	    "down_arrow": "⬇",
+744	    "downcast_face_with_sweat": "😓",
+745	    "downwards_button": "🔽",
+746	    "dragon": "🐉",
+747	    "dragon_face": "🐲",
+748	    "dress": "👗",
+749	    "drooling_face": "🤤",
+750	    "drop_of_blood": "🩸",
+751	    "droplet": "💧",
+752	    "drum": "🥁",
+753	    "duck": "🦆",
+754	    "dumpling": "🥟",
+755	    "dvd": "📀",
+756	    "e-mail": "📧",
+757	    "eagle": "🦅",
+758	    "ear": "👂",
+759	    "ear_dark_skin_tone": "👂🏿",
+760	    "ear_light_skin_tone": "👂🏻",
+761	    "ear_medium-dark_skin_tone": "👂🏾",
+762	    "ear_medium-light_skin_tone": "👂🏼",
+763	    "ear_medium_skin_tone": "👂🏽",
+764	    "ear_of_corn": "🌽",
+765	    "ear_with_hearing_aid": "🦻",
+766	    "egg": "🍳",
+767	    "eggplant": "🍆",
+768	    "eight-pointed_star": "✴",
+769	    "eight-spoked_asterisk": "✳",
+770	    "eight-thirty": "🕣",
+771	    "eight_o’clock": "🕗",
+772	    "eject_button": "⏏",
+773	    "electric_plug": "🔌",
+774	    "elephant": "🐘",
+775	    "eleven-thirty": "🕦",
+776	    "eleven_o’clock": "🕚",
+777	    "elf": "🧝",
+778	    "elf_dark_skin_tone": "🧝🏿",
+779	    "elf_light_skin_tone": "🧝🏻",
+780	    "elf_medium-dark_skin_tone": "🧝🏾",
+781	    "elf_medium-light_skin_tone": "🧝🏼",
+782	    "elf_medium_skin_tone": "🧝🏽",
+783	    "envelope": "✉",
+784	    "envelope_with_arrow": "📩",
+785	    "euro_banknote": "💶",
+786	    "evergreen_tree": "🌲",
+787	    "ewe": "🐑",
+788	    "exclamation_mark": "❗",
+789	    "exclamation_question_mark": "⁉",
+790	    "exploding_head": "🤯",
+791	    "expressionless_face": "😑",
+792	    "eye": "👁",
+793	    "eye_in_speech_bubble": "👁️\u200d🗨️",
+794	    "eyes": "👀",
+795	    "face_blowing_a_kiss": "😘",
+796	    "face_savoring_food": "😋",
+797	    "face_screaming_in_fear": "😱",
+798	    "face_vomiting": "🤮",
+799	    "face_with_hand_over_mouth": "🤭",
+800	    "face_with_head-bandage": "🤕",
+801	    "face_with_medical_mask": "😷",
+802	    "face_with_monocle": "🧐",
+803	    "face_with_open_mouth": "😮",
+804	    "face_with_raised_eyebrow": "🤨",
+805	    "face_with_rolling_eyes": "🙄",
+806	    "face_with_steam_from_nose": "😤",
+807	    "face_with_symbols_on_mouth": "🤬",
+808	    "face_with_tears_of_joy": "😂",
+809	    "face_with_thermometer": "🤒",
+810	    "face_with_tongue": "😛",
+811	    "face_without_mouth": "😶",
+812	    "factory": "🏭",
+813	    "fairy": "🧚",
+814	    "fairy_dark_skin_tone": "🧚🏿",
+815	    "fairy_light_skin_tone": "🧚🏻",
+816	    "fairy_medium-dark_skin_tone": "🧚🏾",
+817	    "fairy_medium-light_skin_tone": "🧚🏼",
+818	    "fairy_medium_skin_tone": "🧚🏽",
+819	    "falafel": "🧆",
+820	    "fallen_leaf": "🍂",
+821	    "family": "👪",
+822	    "family_man_boy": "👨\u200d👦",
+823	    "family_man_boy_boy": "👨\u200d👦\u200d👦",
+824	    "family_man_girl": "👨\u200d👧",
+825	    "family_man_girl_boy": "👨\u200d👧\u200d👦",
+826	    "family_man_girl_girl": "👨\u200d👧\u200d👧",
+827	    "family_man_man_boy": "👨\u200d👨\u200d👦",
+828	    "family_man_man_boy_boy": "👨\u200d👨\u200d👦\u200d👦",
+829	    "family_man_man_girl": "👨\u200d👨\u200d👧",
+830	    "family_man_man_girl_boy": "👨\u200d👨\u200d👧\u200d👦",
+831	    "family_man_man_girl_girl": "👨\u200d👨\u200d👧\u200d👧",
+832	    "family_man_woman_boy": "👨\u200d👩\u200d👦",
+833	    "family_man_woman_boy_boy": "👨\u200d👩\u200d👦\u200d👦",
+834	    "family_man_woman_girl": "👨\u200d👩\u200d👧",
+835	    "family_man_woman_girl_boy": "👨\u200d👩\u200d👧\u200d👦",
+836	    "family_man_woman_girl_girl": "👨\u200d👩\u200d👧\u200d👧",
+837	    "family_woman_boy": "👩\u200d👦",
+838	    "family_woman_boy_boy": "👩\u200d👦\u200d👦",
+839	    "family_woman_girl": "👩\u200d👧",
+840	    "family_woman_girl_boy": "👩\u200d👧\u200d👦",
+841	    "family_woman_girl_girl": "👩\u200d👧\u200d👧",
+842	    "family_woman_woman_boy": "👩\u200d👩\u200d👦",
+843	    "family_woman_woman_boy_boy": "👩\u200d👩\u200d👦\u200d👦",
+844	    "family_woman_woman_girl": "👩\u200d👩\u200d👧",
+845	    "family_woman_woman_girl_boy": "👩\u200d👩\u200d👧\u200d👦",
+846	    "family_woman_woman_girl_girl": "👩\u200d👩\u200d👧\u200d👧",
+847	    "fast-forward_button": "⏩",
+848	    "fast_down_button": "⏬",
+849	    "fast_reverse_button": "⏪",
+850	    "fast_up_button": "⏫",
+851	    "fax_machine": "📠",
+852	    "fearful_face": "😨",
+853	    "female_sign": "♀",
+854	    "ferris_wheel": "🎡",
+855	    "ferry": "⛴",
+856	    "field_hockey": "🏑",
+857	    "file_cabinet": "🗄",
+858	    "file_folder": "📁",
+859	    "film_frames": "🎞",
+860	    "film_projector": "📽",
+861	    "fire": "🔥",
+862	    "fire_extinguisher": "🧯",
+863	    "firecracker": "🧨",
+864	    "fire_engine": "🚒",
+865	    "fireworks": "🎆",
+866	    "first_quarter_moon": "🌓",
+867	    "first_quarter_moon_face": "🌛",
+868	    "fish": "🐟",
+869	    "fish_cake_with_swirl": "🍥",
+870	    "fishing_pole": "🎣",
+871	    "five-thirty": "🕠",
+872	    "five_o’clock": "🕔",
+873	    "flag_in_hole": "⛳",
+874	    "flamingo": "🦩",
+875	    "flashlight": "🔦",
+876	    "flat_shoe": "🥿",
+877	    "fleur-de-lis": "⚜",
+878	    "flexed_biceps": "💪",
+879	    "flexed_biceps_dark_skin_tone": "💪🏿",
+880	    "flexed_biceps_light_skin_tone": "💪🏻",
+881	    "flexed_biceps_medium-dark_skin_tone": "💪🏾",
+882	    "flexed_biceps_medium-light_skin_tone": "💪🏼",
+883	    "flexed_biceps_medium_skin_tone": "💪🏽",
+884	    "floppy_disk": "💾",
+885	    "flower_playing_cards": "🎴",
+886	    "flushed_face": "😳",
+887	    "flying_disc": "🥏",
+888	    "flying_saucer": "🛸",
+889	    "fog": "🌫",
+890	    "foggy": "🌁",
+891	    "folded_hands": "🙏",
+892	    "folded_hands_dark_skin_tone": "🙏🏿",
+893	    "folded_hands_light_skin_tone": "🙏🏻",
+894	    "folded_hands_medium-dark_skin_tone": "🙏🏾",
+895	    "folded_hands_medium-light_skin_tone": "🙏🏼",
+896	    "folded_hands_medium_skin_tone": "🙏🏽",
+897	    "foot": "🦶",
+898	    "footprints": "👣",
+899	    "fork_and_knife": "🍴",
+900	    "fork_and_knife_with_plate": "🍽",
+901	    "fortune_cookie": "🥠",
+902	    "fountain": "⛲",
+903	    "fountain_pen": "🖋",
+904	    "four-thirty": "🕟",
+905	    "four_leaf_clover": "🍀",
+906	    "four_o’clock": "🕓",
+907	    "fox_face": "🦊",
+908	    "framed_picture": "🖼",
+909	    "french_fries": "🍟",
+910	    "fried_shrimp": "🍤",
+911	    "frog_face": "🐸",
+912	    "front-facing_baby_chick": "🐥",
+913	    "frowning_face": "☹",
+914	    "frowning_face_with_open_mouth": "😦",
+915	    "fuel_pump": "⛽",
+916	    "full_moon": "🌕",
+917	    "full_moon_face": "🌝",
+918	    "funeral_urn": "⚱",
+919	    "game_die": "🎲",
+920	    "garlic": "🧄",
+921	    "gear": "⚙",
+922	    "gem_stone": "💎",
+923	    "genie": "🧞",
+924	    "ghost": "👻",
+925	    "giraffe": "🦒",
+926	    "girl": "👧",
+927	    "girl_dark_skin_tone": "👧🏿",
+928	    "girl_light_skin_tone": "👧🏻",
+929	    "girl_medium-dark_skin_tone": "👧🏾",
+930	    "girl_medium-light_skin_tone": "👧🏼",
+931	    "girl_medium_skin_tone": "👧🏽",
+932	    "glass_of_milk": "🥛",
+933	    "glasses": "👓",
+934	    "globe_showing_americas": "🌎",
+935	    "globe_showing_asia-australia": "🌏",
+936	    "globe_showing_europe-africa": "🌍",
+937	    "globe_with_meridians": "🌐",
+938	    "gloves": "🧤",
+939	    "glowing_star": "🌟",
+940	    "goal_net": "🥅",
+941	    "goat": "🐐",
+942	    "goblin": "👺",
+943	    "goggles": "🥽",
+944	    "gorilla": "🦍",
+945	    "graduation_cap": "🎓",
+946	    "grapes": "🍇",
+947	    "green_apple": "🍏",
+948	    "green_book": "📗",
+949	    "green_circle": "🟢",
+950	    "green_heart": "💚",
+951	    "green_salad": "🥗",
+952	    "green_square": "🟩",
+953	    "grimacing_face": "😬",
+954	    "grinning_cat_face": "😺",
+955	    "grinning_cat_face_with_smiling_eyes": "😸",
+956	    "grinning_face": "😀",
+957	    "grinning_face_with_big_eyes": "😃",
+958	    "grinning_face_with_smiling_eyes": "😄",
+959	    "grinning_face_with_sweat": "😅",
+960	    "grinning_squinting_face": "😆",
+961	    "growing_heart": "💗",
+962	    "guard": "💂",
+963	    "guard_dark_skin_tone": "💂🏿",
+964	    "guard_light_skin_tone": "💂🏻",
+965	    "guard_medium-dark_skin_tone": "💂🏾",
+966	    "guard_medium-light_skin_tone": "💂🏼",
+967	    "guard_medium_skin_tone": "💂🏽",
+968	    "guide_dog": "🦮",
+969	    "guitar": "🎸",
+970	    "hamburger": "🍔",
+971	    "hammer": "🔨",
+972	    "hammer_and_pick": "⚒",
+973	    "hammer_and_wrench": "🛠",
+974	    "hamster_face": "🐹",
+975	    "hand_with_fingers_splayed": "🖐",
+976	    "hand_with_fingers_splayed_dark_skin_tone": "🖐🏿",
+977	    "hand_with_fingers_splayed_light_skin_tone": "🖐🏻",
+978	    "hand_with_fingers_splayed_medium-dark_skin_tone": "🖐🏾",
+979	    "hand_with_fingers_splayed_medium-light_skin_tone": "🖐🏼",
+980	    "hand_with_fingers_splayed_medium_skin_tone": "🖐🏽",
+981	    "handbag": "👜",
+982	    "handshake": "🤝",
+983	    "hatching_chick": "🐣",
+984	    "headphone": "🎧",
+985	    "hear-no-evil_monkey": "🙉",
+986	    "heart_decoration": "💟",
+987	    "heart_suit": "♥",
+988	    "heart_with_arrow": "💘",
+989	    "heart_with_ribbon": "💝",
+990	    "heavy_check_mark": "✔",
+991	    "heavy_division_sign": "➗",
+992	    "heavy_dollar_sign": "💲",
+993	    "heavy_heart_exclamation": "❣",
+994	    "heavy_large_circle": "⭕",
+995	    "heavy_minus_sign": "➖",
+996	    "heavy_multiplication_x": "✖",
+997	    "heavy_plus_sign": "➕",
+998	    "hedgehog": "🦔",
+999	    "helicopter": "🚁",
+1000	    "herb": "🌿",
+1001	    "hibiscus": "🌺",
+1002	    "high-heeled_shoe": "👠",
+1003	    "high-speed_train": "🚄",
+1004	    "high_voltage": "⚡",
+1005	    "hiking_boot": "🥾",
+1006	    "hindu_temple": "🛕",
+1007	    "hippopotamus": "🦛",
+1008	    "hole": "🕳",
+1009	    "honey_pot": "🍯",
+1010	    "honeybee": "🐝",
+1011	    "horizontal_traffic_light": "🚥",
+1012	    "horse": "🐴",
+1013	    "horse_face": "🐴",
+1014	    "horse_racing": "🏇",
+1015	    "horse_racing_dark_skin_tone": "🏇🏿",
+1016	    "horse_racing_light_skin_tone": "🏇🏻",
+1017	    "horse_racing_medium-dark_skin_tone": "🏇🏾",
+1018	    "horse_racing_medium-light_skin_tone": "🏇🏼",
+1019	    "horse_racing_medium_skin_tone": "🏇🏽",
+1020	    "hospital": "🏥",
+1021	    "hot_beverage": "☕",
+1022	    "hot_dog": "🌭",
+1023	    "hot_face": "🥵",
+1024	    "hot_pepper": "🌶",
+1025	    "hot_springs": "♨",
+1026	    "hotel": "🏨",
+1027	    "hourglass_done": "⌛",
+1028	    "hourglass_not_done": "⏳",
+1029	    "house": "🏠",
+1030	    "house_with_garden": "🏡",
+1031	    "houses": "🏘",
+1032	    "hugging_face": "🤗",
+1033	    "hundred_points": "💯",
+1034	    "hushed_face": "😯",
+1035	    "ice": "🧊",
+1036	    "ice_cream": "🍨",
+1037	    "ice_hockey": "🏒",
+1038	    "ice_skate": "⛸",
+1039	    "inbox_tray": "📥",
+1040	    "incoming_envelope": "📨",
+1041	    "index_pointing_up": "☝",
+1042	    "index_pointing_up_dark_skin_tone": "☝🏿",
+1043	    "index_pointing_up_light_skin_tone": "☝🏻",
+1044	    "index_pointing_up_medium-dark_skin_tone": "☝🏾",
+1045	    "index_pointing_up_medium-light_skin_tone": "☝🏼",
+1046	    "index_pointing_up_medium_skin_tone": "☝🏽",
+1047	    "infinity": "♾",
+1048	    "information": "ℹ",
+1049	    "input_latin_letters": "🔤",
+1050	    "input_latin_lowercase": "🔡",
+1051	    "input_latin_uppercase": "🔠",
+1052	    "input_numbers": "🔢",
+1053	    "input_symbols": "🔣",
+1054	    "jack-o-lantern": "🎃",
+1055	    "jeans": "👖",
+1056	    "jigsaw": "🧩",
+1057	    "joker": "🃏",
+1058	    "joystick": "🕹",
+1059	    "kaaba": "🕋",
+1060	    "kangaroo": "🦘",
+1061	    "key": "🔑",
+1062	    "keyboard": "⌨",
+1063	    "keycap_#": "#️⃣",
+1064	    "keycap_*": "*️⃣",
+1065	    "keycap_0": "0️⃣",
+1066	    "keycap_1": "1️⃣",
+1067	    "keycap_10": "🔟",
+1068	    "keycap_2": "2️⃣",
+1069	    "keycap_3": "3️⃣",
+1070	    "keycap_4": "4️⃣",
+1071	    "keycap_5": "5️⃣",
+1072	    "keycap_6": "6️⃣",
+1073	    "keycap_7": "7️⃣",
+1074	    "keycap_8": "8️⃣",
+1075	    "keycap_9": "9️⃣",
+1076	    "kick_scooter": "🛴",
+1077	    "kimono": "👘",
+1078	    "kiss": "💋",
+1079	    "kiss_man_man": "👨\u200d❤️\u200d💋\u200d👨",
+1080	    "kiss_mark": "💋",
+1081	    "kiss_woman_man": "👩\u200d❤️\u200d💋\u200d👨",
+1082	    "kiss_woman_woman": "👩\u200d❤️\u200d💋\u200d👩",
+1083	    "kissing_cat_face": "😽",
+1084	    "kissing_face": "😗",
+1085	    "kissing_face_with_closed_eyes": "😚",
+1086	    "kissing_face_with_smiling_eyes": "😙",
+1087	    "kitchen_knife": "🔪",
+1088	    "kite": "🪁",
+1089	    "kiwi_fruit": "🥝",
+1090	    "koala": "🐨",
+1091	    "lab_coat": "🥼",
+1092	    "label": "🏷",
+1093	    "lacrosse": "🥍",
+1094	    "lady_beetle": "🐞",
+1095	    "laptop_computer": "💻",
+1096	    "large_blue_diamond": "🔷",
+1097	    "large_orange_diamond": "🔶",
+1098	    "last_quarter_moon": "🌗",
+1099	    "last_quarter_moon_face": "🌜",
+1100	    "last_track_button": "⏮",
+1101	    "latin_cross": "✝",
+1102	    "leaf_fluttering_in_wind": "🍃",
+1103	    "leafy_green": "🥬",
+1104	    "ledger": "📒",
+1105	    "left-facing_fist": "🤛",
+1106	    "left-facing_fist_dark_skin_tone": "🤛🏿",
+1107	    "left-facing_fist_light_skin_tone": "🤛🏻",
+1108	    "left-facing_fist_medium-dark_skin_tone": "🤛🏾",
+1109	    "left-facing_fist_medium-light_skin_tone": "🤛🏼",
+1110	    "left-facing_fist_medium_skin_tone": "🤛🏽",
+1111	    "left-right_arrow": "↔",
+1112	    "left_arrow": "⬅",
+1113	    "left_arrow_curving_right": "↪",
+1114	    "left_luggage": "🛅",
+1115	    "left_speech_bubble": "🗨",
+1116	    "leg": "🦵",
+1117	    "lemon": "🍋",
+1118	    "leopard": "🐆",
+1119	    "level_slider": "🎚",
+1120	    "light_bulb": "💡",
+1121	    "light_rail": "🚈",
+1122	    "link": "🔗",
+1123	    "linked_paperclips": "🖇",
+1124	    "lion_face": "🦁",
+1125	    "lipstick": "💄",
+1126	    "litter_in_bin_sign": "🚮",
+1127	    "lizard": "🦎",
+1128	    "llama": "🦙",
+1129	    "lobster": "🦞",
+1130	    "locked": "🔒",
+1131	    "locked_with_key": "🔐",
+1132	    "locked_with_pen": "🔏",
+1133	    "locomotive": "🚂",
+1134	    "lollipop": "🍭",
+1135	    "lotion_bottle": "🧴",
+1136	    "loudly_crying_face": "😭",
+1137	    "loudspeaker": "📢",
+1138	    "love-you_gesture": "🤟",
+1139	    "love-you_gesture_dark_skin_tone": "🤟🏿",
+1140	    "love-you_gesture_light_skin_tone": "🤟🏻",
+1141	    "love-you_gesture_medium-dark_skin_tone": "🤟🏾",
+1142	    "love-you_gesture_medium-light_skin_tone": "🤟🏼",
+1143	    "love-you_gesture_medium_skin_tone": "🤟🏽",
+1144	    "love_hotel": "🏩",
+1145	    "love_letter": "💌",
+1146	    "luggage": "🧳",
+1147	    "lying_face": "🤥",
+1148	    "mage": "🧙",
+1149	    "mage_dark_skin_tone": "🧙🏿",
+1150	    "mage_light_skin_tone": "🧙🏻",
+1151	    "mage_medium-dark_skin_tone": "🧙🏾",
+1152	    "mage_medium-light_skin_tone": "🧙🏼",
+1153	    "mage_medium_skin_tone": "🧙🏽",
+1154	    "magnet": "🧲",
+1155	    "magnifying_glass_tilted_left": "🔍",
+1156	    "magnifying_glass_tilted_right": "🔎",
+1157	    "mahjong_red_dragon": "🀄",
+1158	    "male_sign": "♂",
+1159	    "man": "👨",
+1160	    "man_and_woman_holding_hands": "👫",
+1161	    "man_artist": "👨\u200d🎨",
+1162	    "man_artist_dark_skin_tone": "👨🏿\u200d🎨",
+1163	    "man_artist_light_skin_tone": "👨🏻\u200d🎨",
+1164	    "man_artist_medium-dark_skin_tone": "👨🏾\u200d🎨",
+1165	    "man_artist_medium-light_skin_tone": "👨🏼\u200d🎨",
+1166	    "man_artist_medium_skin_tone": "👨🏽\u200d🎨",
+1167	    "man_astronaut": "👨\u200d🚀",
+1168	    "man_astronaut_dark_skin_tone": "👨🏿\u200d🚀",
+1169	    "man_astronaut_light_skin_tone": "👨🏻\u200d🚀",
+1170	    "man_astronaut_medium-dark_skin_tone": "👨🏾\u200d🚀",
+1171	    "man_astronaut_medium-light_skin_tone": "👨🏼\u200d🚀",
+1172	    "man_astronaut_medium_skin_tone": "👨🏽\u200d🚀",
+1173	    "man_biking": "🚴\u200d♂️",
+1174	    "man_biking_dark_skin_tone": "🚴🏿\u200d♂️",
+1175	    "man_biking_light_skin_tone": "🚴🏻\u200d♂️",
+1176	    "man_biking_medium-dark_skin_tone": "🚴🏾\u200d♂️",
+1177	    "man_biking_medium-light_skin_tone": "🚴🏼\u200d♂️",
+1178	    "man_biking_medium_skin_tone": "🚴🏽\u200d♂️",
+1179	    "man_bouncing_ball": "⛹️\u200d♂️",
+1180	    "man_bouncing_ball_dark_skin_tone": "⛹🏿\u200d♂️",
+1181	    "man_bouncing_ball_light_skin_tone": "⛹🏻\u200d♂️",
+1182	    "man_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♂️",
+1183	    "man_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♂️",
+1184	    "man_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♂️",
+1185	    "man_bowing": "🙇\u200d♂️",
+1186	    "man_bowing_dark_skin_tone": "🙇🏿\u200d♂️",
+1187	    "man_bowing_light_skin_tone": "🙇🏻\u200d♂️",
+1188	    "man_bowing_medium-dark_skin_tone": "🙇🏾\u200d♂️",
+1189	    "man_bowing_medium-light_skin_tone": "🙇🏼\u200d♂️",
+1190	    "man_bowing_medium_skin_tone": "🙇🏽\u200d♂️",
+1191	    "man_cartwheeling": "🤸\u200d♂️",
+1192	    "man_cartwheeling_dark_skin_tone": "🤸🏿\u200d♂️",
+1193	    "man_cartwheeling_light_skin_tone": "🤸🏻\u200d♂️",
+1194	    "man_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♂️",
+1195	    "man_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♂️",
+1196	    "man_cartwheeling_medium_skin_tone": "🤸🏽\u200d♂️",
+1197	    "man_climbing": "🧗\u200d♂️",
+1198	    "man_climbing_dark_skin_tone": "🧗🏿\u200d♂️",
+1199	    "man_climbing_light_skin_tone": "🧗🏻\u200d♂️",
+1200	    "man_climbing_medium-dark_skin_tone": "🧗🏾\u200d♂️",
+1201	    "man_climbing_medium-light_skin_tone": "🧗🏼\u200d♂️",
+1202	    "man_climbing_medium_skin_tone": "🧗🏽\u200d♂️",
+1203	    "man_construction_worker": "👷\u200d♂️",
+1204	    "man_construction_worker_dark_skin_tone": "👷🏿\u200d♂️",
+1205	    "man_construction_worker_light_skin_tone": "👷🏻\u200d♂️",
+1206	    "man_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♂️",
+1207	    "man_construction_worker_medium-light_skin_tone": "👷🏼\u200d♂️",
+1208	    "man_construction_worker_medium_skin_tone": "👷🏽\u200d♂️",
+1209	    "man_cook": "👨\u200d🍳",
+1210	    "man_cook_dark_skin_tone": "👨🏿\u200d🍳",
+1211	    "man_cook_light_skin_tone": "👨🏻\u200d🍳",
+1212	    "man_cook_medium-dark_skin_tone": "👨🏾\u200d🍳",
+1213	    "man_cook_medium-light_skin_tone": "👨🏼\u200d🍳",
+1214	    "man_cook_medium_skin_tone": "👨🏽\u200d🍳",
+1215	    "man_dancing": "🕺",
+1216	    "man_dancing_dark_skin_tone": "🕺🏿",
+1217	    "man_dancing_light_skin_tone": "🕺🏻",
+1218	    "man_dancing_medium-dark_skin_tone": "🕺🏾",
+1219	    "man_dancing_medium-light_skin_tone": "🕺🏼",
+1220	    "man_dancing_medium_skin_tone": "🕺🏽",
+1221	    "man_dark_skin_tone": "👨🏿",
+1222	    "man_detective": "🕵️\u200d♂️",
+1223	    "man_detective_dark_skin_tone": "🕵🏿\u200d♂️",
+1224	    "man_detective_light_skin_tone": "🕵🏻\u200d♂️",
+1225	    "man_detective_medium-dark_skin_tone": "🕵🏾\u200d♂️",
+1226	    "man_detective_medium-light_skin_tone": "🕵🏼\u200d♂️",
+1227	    "man_detective_medium_skin_tone": "🕵🏽\u200d♂️",
+1228	    "man_elf": "🧝\u200d♂️",
+1229	    "man_elf_dark_skin_tone": "🧝🏿\u200d♂️",
+1230	    "man_elf_light_skin_tone": "🧝🏻\u200d♂️",
+1231	    "man_elf_medium-dark_skin_tone": "🧝🏾\u200d♂️",
+1232	    "man_elf_medium-light_skin_tone": "🧝🏼\u200d♂️",
+1233	    "man_elf_medium_skin_tone": "🧝🏽\u200d♂️",
+1234	    "man_facepalming": "🤦\u200d♂️",
+1235	    "man_facepalming_dark_skin_tone": "🤦🏿\u200d♂️",
+1236	    "man_facepalming_light_skin_tone": "🤦🏻\u200d♂️",
+1237	    "man_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♂️",
+1238	    "man_facepalming_medium-light_skin_tone": "🤦🏼\u200d♂️",
+1239	    "man_facepalming_medium_skin_tone": "🤦🏽\u200d♂️",
+1240	    "man_factory_worker": "👨\u200d🏭",
+1241	    "man_factory_worker_dark_skin_tone": "👨🏿\u200d🏭",
+1242	    "man_factory_worker_light_skin_tone": "👨🏻\u200d🏭",
+1243	    "man_factory_worker_medium-dark_skin_tone": "👨🏾\u200d🏭",
+1244	    "man_factory_worker_medium-light_skin_tone": "👨🏼\u200d🏭",
+1245	    "man_factory_worker_medium_skin_tone": "👨🏽\u200d🏭",
+1246	    "man_fairy": "🧚\u200d♂️",
+1247	    "man_fairy_dark_skin_tone": "🧚🏿\u200d♂️",
+1248	    "man_fairy_light_skin_tone": "🧚🏻\u200d♂️",
+1249	    "man_fairy_medium-dark_skin_tone": "🧚🏾\u200d♂️",
+1250	    "man_fairy_medium-light_skin_tone": "🧚🏼\u200d♂️",
+1251	    "man_fairy_medium_skin_tone": "🧚🏽\u200d♂️",
+1252	    "man_farmer": "👨\u200d🌾",
+1253	    "man_farmer_dark_skin_tone": "👨🏿\u200d🌾",
+1254	    "man_farmer_light_skin_tone": "👨🏻\u200d🌾",
+1255	    "man_farmer_medium-dark_skin_tone": "👨🏾\u200d🌾",
+1256	    "man_farmer_medium-light_skin_tone": "👨🏼\u200d🌾",
+1257	    "man_farmer_medium_skin_tone": "👨🏽\u200d🌾",
+1258	    "man_firefighter": "👨\u200d🚒",
+1259	    "man_firefighter_dark_skin_tone": "👨🏿\u200d🚒",
+1260	    "man_firefighter_light_skin_tone": "👨🏻\u200d🚒",
+1261	    "man_firefighter_medium-dark_skin_tone": "👨🏾\u200d🚒",
+1262	    "man_firefighter_medium-light_skin_tone": "👨🏼\u200d🚒",
+1263	    "man_firefighter_medium_skin_tone": "👨🏽\u200d🚒",
+1264	    "man_frowning": "🙍\u200d♂️",
+1265	    "man_frowning_dark_skin_tone": "🙍🏿\u200d♂️",
+1266	    "man_frowning_light_skin_tone": "🙍🏻\u200d♂️",
+1267	    "man_frowning_medium-dark_skin_tone": "🙍🏾\u200d♂️",
+1268	    "man_frowning_medium-light_skin_tone": "🙍🏼\u200d♂️",
+1269	    "man_frowning_medium_skin_tone": "🙍🏽\u200d♂️",
+1270	    "man_genie": "🧞\u200d♂️",
+1271	    "man_gesturing_no": "🙅\u200d♂️",
+1272	    "man_gesturing_no_dark_skin_tone": "🙅🏿\u200d♂️",
+1273	    "man_gesturing_no_light_skin_tone": "🙅🏻\u200d♂️",
+1274	    "man_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♂️",
+1275	    "man_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♂️",
+1276	    "man_gesturing_no_medium_skin_tone": "🙅🏽\u200d♂️",
+1277	    "man_gesturing_ok": "🙆\u200d♂️",
+1278	    "man_gesturing_ok_dark_skin_tone": "🙆🏿\u200d♂️",
+1279	    "man_gesturing_ok_light_skin_tone": "🙆🏻\u200d♂️",
+1280	    "man_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♂️",
+1281	    "man_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♂️",
+1282	    "man_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♂️",
+1283	    "man_getting_haircut": "💇\u200d♂️",
+1284	    "man_getting_haircut_dark_skin_tone": "💇🏿\u200d♂️",
+1285	    "man_getting_haircut_light_skin_tone": "💇🏻\u200d♂️",
+1286	    "man_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♂️",
+1287	    "man_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♂️",
+1288	    "man_getting_haircut_medium_skin_tone": "💇🏽\u200d♂️",
+1289	    "man_getting_massage": "💆\u200d♂️",
+1290	    "man_getting_massage_dark_skin_tone": "💆🏿\u200d♂️",
+1291	    "man_getting_massage_light_skin_tone": "💆🏻\u200d♂️",
+1292	    "man_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♂️",
+1293	    "man_getting_massage_medium-light_skin_tone": "💆🏼\u200d♂️",
+1294	    "man_getting_massage_medium_skin_tone": "💆🏽\u200d♂️",
+1295	    "man_golfing": "🏌️\u200d♂️",
+1296	    "man_golfing_dark_skin_tone": "🏌🏿\u200d♂️",
+1297	    "man_golfing_light_skin_tone": "🏌🏻\u200d♂️",
+1298	    "man_golfing_medium-dark_skin_tone": "🏌🏾\u200d♂️",
+1299	    "man_golfing_medium-light_skin_tone": "🏌🏼\u200d♂️",
+1300	    "man_golfing_medium_skin_tone": "🏌🏽\u200d♂️",
+1301	    "man_guard": "💂\u200d♂️",
+1302	    "man_guard_dark_skin_tone": "💂🏿\u200d♂️",
+1303	    "man_guard_light_skin_tone": "💂🏻\u200d♂️",
+1304	    "man_guard_medium-dark_skin_tone": "💂🏾\u200d♂️",
+1305	    "man_guard_medium-light_skin_tone": "💂🏼\u200d♂️",
+1306	    "man_guard_medium_skin_tone": "💂🏽\u200d♂️",
+1307	    "man_health_worker": "👨\u200d⚕️",
+1308	    "man_health_worker_dark_skin_tone": "👨🏿\u200d⚕️",
+1309	    "man_health_worker_light_skin_tone": "👨🏻\u200d⚕️",
+1310	    "man_health_worker_medium-dark_skin_tone": "👨🏾\u200d⚕️",
+1311	    "man_health_worker_medium-light_skin_tone": "👨🏼\u200d⚕️",
+1312	    "man_health_worker_medium_skin_tone": "👨🏽\u200d⚕️",
+1313	    "man_in_lotus_position": "🧘\u200d♂️",
+1314	    "man_in_lotus_position_dark_skin_tone": "🧘🏿\u200d♂️",
+1315	    "man_in_lotus_position_light_skin_tone": "🧘🏻\u200d♂️",
+1316	    "man_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♂️",
+1317	    "man_in_lotus_position_medium-light_skin_tone": "🧘🏼\u200d♂️",
+1318	    "man_in_lotus_position_medium_skin_tone": "🧘🏽\u200d♂️",
+1319	    "man_in_manual_wheelchair": "👨\u200d🦽",
+1320	    "man_in_motorized_wheelchair": "👨\u200d🦼",
+1321	    "man_in_steamy_room": "🧖\u200d♂️",
+1322	    "man_in_steamy_room_dark_skin_tone": "🧖🏿\u200d♂️",
+1323	    "man_in_steamy_room_light_skin_tone": "🧖🏻\u200d♂️",
+1324	    "man_in_steamy_room_medium-dark_skin_tone": "🧖🏾\u200d♂️",
+1325	    "man_in_steamy_room_medium-light_skin_tone": "🧖🏼\u200d♂️",
+1326	    "man_in_steamy_room_medium_skin_tone": "🧖🏽\u200d♂️",
+1327	    "man_in_suit_levitating": "🕴",
+1328	    "man_in_suit_levitating_dark_skin_tone": "🕴🏿",
+1329	    "man_in_suit_levitating_light_skin_tone": "🕴🏻",
+1330	    "man_in_suit_levitating_medium-dark_skin_tone": "🕴🏾",
+1331	    "man_in_suit_levitating_medium-light_skin_tone": "🕴🏼",
+1332	    "man_in_suit_levitating_medium_skin_tone": "🕴🏽",
+1333	    "man_in_tuxedo": "🤵",
+1334	    "man_in_tuxedo_dark_skin_tone": "🤵🏿",
+1335	    "man_in_tuxedo_light_skin_tone": "🤵🏻",
+1336	    "man_in_tuxedo_medium-dark_skin_tone": "🤵🏾",
+1337	    "man_in_tuxedo_medium-light_skin_tone": "🤵🏼",
+1338	    "man_in_tuxedo_medium_skin_tone": "🤵🏽",
+1339	    "man_judge": "👨\u200d⚖️",
+1340	    "man_judge_dark_skin_tone": "👨🏿\u200d⚖️",
+1341	    "man_judge_light_skin_tone": "👨🏻\u200d⚖️",
+1342	    "man_judge_medium-dark_skin_tone": "👨🏾\u200d⚖️",
+1343	    "man_judge_medium-light_skin_tone": "👨🏼\u200d⚖️",
+1344	    "man_judge_medium_skin_tone": "👨🏽\u200d⚖️",
+1345	    "man_juggling": "🤹\u200d♂️",
+1346	    "man_juggling_dark_skin_tone": "🤹🏿\u200d♂️",
+1347	    "man_juggling_light_skin_tone": "🤹🏻\u200d♂️",
+1348	    "man_juggling_medium-dark_skin_tone": "🤹🏾\u200d♂️",
+1349	    "man_juggling_medium-light_skin_tone": "🤹🏼\u200d♂️",
+1350	    "man_juggling_medium_skin_tone": "🤹🏽\u200d♂️",
+1351	    "man_lifting_weights": "🏋️\u200d♂️",
+1352	    "man_lifting_weights_dark_skin_tone": "🏋🏿\u200d♂️",
+1353	    "man_lifting_weights_light_skin_tone": "🏋🏻\u200d♂️",
+1354	    "man_lifting_weights_medium-dark_skin_tone": "🏋🏾\u200d♂️",
+1355	    "man_lifting_weights_medium-light_skin_tone": "🏋🏼\u200d♂️",
+1356	    "man_lifting_weights_medium_skin_tone": "🏋🏽\u200d♂️",
+1357	    "man_light_skin_tone": "👨🏻",
+1358	    "man_mage": "🧙\u200d♂️",
+1359	    "man_mage_dark_skin_tone": "🧙🏿\u200d♂️",
+1360	    "man_mage_light_skin_tone": "🧙🏻\u200d♂️",
+1361	    "man_mage_medium-dark_skin_tone": "🧙🏾\u200d♂️",
+1362	    "man_mage_medium-light_skin_tone": "🧙🏼\u200d♂️",
+1363	    "man_mage_medium_skin_tone": "🧙🏽\u200d♂️",
+1364	    "man_mechanic": "👨\u200d🔧",
+1365	    "man_mechanic_dark_skin_tone": "👨🏿\u200d🔧",
+1366	    "man_mechanic_light_skin_tone": "👨🏻\u200d🔧",
+1367	    "man_mechanic_medium-dark_skin_tone": "👨🏾\u200d🔧",
+1368	    "man_mechanic_medium-light_skin_tone": "👨🏼\u200d🔧",
+1369	    "man_mechanic_medium_skin_tone": "👨🏽\u200d🔧",
+1370	    "man_medium-dark_skin_tone": "👨🏾",
+1371	    "man_medium-light_skin_tone": "👨🏼",
+1372	    "man_medium_skin_tone": "👨🏽",
+1373	    "man_mountain_biking": "🚵\u200d♂️",
+1374	    "man_mountain_biking_dark_skin_tone": "🚵🏿\u200d♂️",
+1375	    "man_mountain_biking_light_skin_tone": "🚵🏻\u200d♂️",
+1376	    "man_mountain_biking_medium-dark_skin_tone": "🚵🏾\u200d♂️",
+1377	    "man_mountain_biking_medium-light_skin_tone": "🚵🏼\u200d♂️",
+1378	    "man_mountain_biking_medium_skin_tone": "🚵🏽\u200d♂️",
+1379	    "man_office_worker": "👨\u200d💼",
+1380	    "man_office_worker_dark_skin_tone": "👨🏿\u200d💼",
+1381	    "man_office_worker_light_skin_tone": "👨🏻\u200d💼",
+1382	    "man_office_worker_medium-dark_skin_tone": "👨🏾\u200d💼",
+1383	    "man_office_worker_medium-light_skin_tone": "👨🏼\u200d💼",
+1384	    "man_office_worker_medium_skin_tone": "👨🏽\u200d💼",
+1385	    "man_pilot": "👨\u200d✈️",
+1386	    "man_pilot_dark_skin_tone": "👨🏿\u200d✈️",
+1387	    "man_pilot_light_skin_tone": "👨🏻\u200d✈️",
+1388	    "man_pilot_medium-dark_skin_tone": "👨🏾\u200d✈️",
+1389	    "man_pilot_medium-light_skin_tone": "👨🏼\u200d✈️",
+1390	    "man_pilot_medium_skin_tone": "👨🏽\u200d✈️",
+1391	    "man_playing_handball": "🤾\u200d♂️",
+1392	    "man_playing_handball_dark_skin_tone": "🤾🏿\u200d♂️",
+1393	    "man_playing_handball_light_skin_tone": "🤾🏻\u200d♂️",
+1394	    "man_playing_handball_medium-dark_skin_tone": "🤾🏾\u200d♂️",
+1395	    "man_playing_handball_medium-light_skin_tone": "🤾🏼\u200d♂️",
+1396	    "man_playing_handball_medium_skin_tone": "🤾🏽\u200d♂️",
+1397	    "man_playing_water_polo": "🤽\u200d♂️",
+1398	    "man_playing_water_polo_dark_skin_tone": "🤽🏿\u200d♂️",
+1399	    "man_playing_water_polo_light_skin_tone": "🤽🏻\u200d♂️",
+1400	    "man_playing_water_polo_medium-dark_skin_tone": "🤽🏾\u200d♂️",
+1401	    "man_playing_water_polo_medium-light_skin_tone": "🤽🏼\u200d♂️",
+1402	    "man_playing_water_polo_medium_skin_tone": "🤽🏽\u200d♂️",
+1403	    "man_police_officer": "👮\u200d♂️",
+1404	    "man_police_officer_dark_skin_tone": "👮🏿\u200d♂️",
+1405	    "man_police_officer_light_skin_tone": "👮🏻\u200d♂️",
+1406	    "man_police_officer_medium-dark_skin_tone": "👮🏾\u200d♂️",
+1407	    "man_police_officer_medium-light_skin_tone": "👮🏼\u200d♂️",
+1408	    "man_police_officer_medium_skin_tone": "👮🏽\u200d♂️",
+1409	    "man_pouting": "🙎\u200d♂️",
+1410	    "man_pouting_dark_skin_tone": "🙎🏿\u200d♂️",
+1411	    "man_pouting_light_skin_tone": "🙎🏻\u200d♂️",
+1412	    "man_pouting_medium-dark_skin_tone": "🙎🏾\u200d♂️",
+1413	    "man_pouting_medium-light_skin_tone": "🙎🏼\u200d♂️",
+1414	    "man_pouting_medium_skin_tone": "🙎🏽\u200d♂️",
+1415	    "man_raising_hand": "🙋\u200d♂️",
+1416	    "man_raising_hand_dark_skin_tone": "🙋🏿\u200d♂️",
+1417	    "man_raising_hand_light_skin_tone": "🙋🏻\u200d♂️",
+1418	    "man_raising_hand_medium-dark_skin_tone": "🙋🏾\u200d♂️",
+1419	    "man_raising_hand_medium-light_skin_tone": "🙋🏼\u200d♂️",
+1420	    "man_raising_hand_medium_skin_tone": "🙋🏽\u200d♂️",
+1421	    "man_rowing_boat": "🚣\u200d♂️",
+1422	    "man_rowing_boat_dark_skin_tone": "🚣🏿\u200d♂️",
+1423	    "man_rowing_boat_light_skin_tone": "🚣🏻\u200d♂️",
+1424	    "man_rowing_boat_medium-dark_skin_tone": "🚣🏾\u200d♂️",
+1425	    "man_rowing_boat_medium-light_skin_tone": "🚣🏼\u200d♂️",
+1426	    "man_rowing_boat_medium_skin_tone": "🚣🏽\u200d♂️",
+1427	    "man_running": "🏃\u200d♂️",
+1428	    "man_running_dark_skin_tone": "🏃🏿\u200d♂️",
+1429	    "man_running_light_skin_tone": "🏃🏻\u200d♂️",
+1430	    "man_running_medium-dark_skin_tone": "🏃🏾\u200d♂️",
+1431	    "man_running_medium-light_skin_tone": "🏃🏼\u200d♂️",
+1432	    "man_running_medium_skin_tone": "🏃🏽\u200d♂️",
+1433	    "man_scientist": "👨\u200d🔬",
+1434	    "man_scientist_dark_skin_tone": "👨🏿\u200d🔬",
+1435	    "man_scientist_light_skin_tone": "👨🏻\u200d🔬",
+1436	    "man_scientist_medium-dark_skin_tone": "👨🏾\u200d🔬",
+1437	    "man_scientist_medium-light_skin_tone": "👨🏼\u200d🔬",
+1438	    "man_scientist_medium_skin_tone": "👨🏽\u200d🔬",
+1439	    "man_shrugging": "🤷\u200d♂️",
+1440	    "man_shrugging_dark_skin_tone": "🤷🏿\u200d♂️",
+1441	    "man_shrugging_light_skin_tone": "🤷🏻\u200d♂️",
+1442	    "man_shrugging_medium-dark_skin_tone": "🤷🏾\u200d♂️",
+1443	    "man_shrugging_medium-light_skin_tone": "🤷🏼\u200d♂️",
+1444	    "man_shrugging_medium_skin_tone": "🤷🏽\u200d♂️",
+1445	    "man_singer": "👨\u200d🎤",
+1446	    "man_singer_dark_skin_tone": "👨🏿\u200d🎤",
+1447	    "man_singer_light_skin_tone": "👨🏻\u200d🎤",
+1448	    "man_singer_medium-dark_skin_tone": "👨🏾\u200d🎤",
+1449	    "man_singer_medium-light_skin_tone": "👨🏼\u200d🎤",
+1450	    "man_singer_medium_skin_tone": "👨🏽\u200d🎤",
+1451	    "man_student": "👨\u200d🎓",
+1452	    "man_student_dark_skin_tone": "👨🏿\u200d🎓",
+1453	    "man_student_light_skin_tone": "👨🏻\u200d🎓",
+1454	    "man_student_medium-dark_skin_tone": "👨🏾\u200d🎓",
+1455	    "man_student_medium-light_skin_tone": "👨🏼\u200d🎓",
+1456	    "man_student_medium_skin_tone": "👨🏽\u200d🎓",
+1457	    "man_surfing": "🏄\u200d♂️",
+1458	    "man_surfing_dark_skin_tone": "🏄🏿\u200d♂️",
+1459	    "man_surfing_light_skin_tone": "🏄🏻\u200d♂️",
+1460	    "man_surfing_medium-dark_skin_tone": "🏄🏾\u200d♂️",
+1461	    "man_surfing_medium-light_skin_tone": "🏄🏼\u200d♂️",
+1462	    "man_surfing_medium_skin_tone": "🏄🏽\u200d♂️",
+1463	    "man_swimming": "🏊\u200d♂️",
+1464	    "man_swimming_dark_skin_tone": "🏊🏿\u200d♂️",
+1465	    "man_swimming_light_skin_tone": "🏊🏻\u200d♂️",
+1466	    "man_swimming_medium-dark_skin_tone": "🏊🏾\u200d♂️",
+1467	    "man_swimming_medium-light_skin_tone": "🏊🏼\u200d♂️",
+1468	    "man_swimming_medium_skin_tone": "🏊🏽\u200d♂️",
+1469	    "man_teacher": "👨\u200d🏫",
+1470	    "man_teacher_dark_skin_tone": "👨🏿\u200d🏫",
+1471	    "man_teacher_light_skin_tone": "👨🏻\u200d🏫",
+1472	    "man_teacher_medium-dark_skin_tone": "👨🏾\u200d🏫",
+1473	    "man_teacher_medium-light_skin_tone": "👨🏼\u200d🏫",
+1474	    "man_teacher_medium_skin_tone": "👨🏽\u200d🏫",
+1475	    "man_technologist": "👨\u200d💻",
+1476	    "man_technologist_dark_skin_tone": "👨🏿\u200d💻",
+1477	    "man_technologist_light_skin_tone": "👨🏻\u200d💻",
+1478	    "man_technologist_medium-dark_skin_tone": "👨🏾\u200d💻",
+1479	    "man_technologist_medium-light_skin_tone": "👨🏼\u200d💻",
+1480	    "man_technologist_medium_skin_tone": "👨🏽\u200d💻",
+1481	    "man_tipping_hand": "💁\u200d♂️",
+1482	    "man_tipping_hand_dark_skin_tone": "💁🏿\u200d♂️",
+1483	    "man_tipping_hand_light_skin_tone": "💁🏻\u200d♂️",
+1484	    "man_tipping_hand_medium-dark_skin_tone": "💁🏾\u200d♂️",
+1485	    "man_tipping_hand_medium-light_skin_tone": "💁🏼\u200d♂️",
+1486	    "man_tipping_hand_medium_skin_tone": "💁🏽\u200d♂️",
+1487	    "man_vampire": "🧛\u200d♂️",
+1488	    "man_vampire_dark_skin_tone": "🧛🏿\u200d♂️",
+1489	    "man_vampire_light_skin_tone": "🧛🏻\u200d♂️",
+1490	    "man_vampire_medium-dark_skin_tone": "🧛🏾\u200d♂️",
+1491	    "man_vampire_medium-light_skin_tone": "🧛🏼\u200d♂️",
+1492	    "man_vampire_medium_skin_tone": "🧛🏽\u200d♂️",
+1493	    "man_walking": "🚶\u200d♂️",
+1494	    "man_walking_dark_skin_tone": "🚶🏿\u200d♂️",
+1495	    "man_walking_light_skin_tone": "🚶🏻\u200d♂️",
+1496	    "man_walking_medium-dark_skin_tone": "🚶🏾\u200d♂️",
+1497	    "man_walking_medium-light_skin_tone": "🚶🏼\u200d♂️",
+1498	    "man_walking_medium_skin_tone": "🚶🏽\u200d♂️",
+1499	    "man_wearing_turban": "👳\u200d♂️",
+1500	    "man_wearing_turban_dark_skin_tone": "👳🏿\u200d♂️",
+1501	    "man_wearing_turban_light_skin_tone": "👳🏻\u200d♂️",
+1502	    "man_wearing_turban_medium-dark_skin_tone": "👳🏾\u200d♂️",
+1503	    "man_wearing_turban_medium-light_skin_tone": "👳🏼\u200d♂️",
+1504	    "man_wearing_turban_medium_skin_tone": "👳🏽\u200d♂️",
+1505	    "man_with_probing_cane": "👨\u200d🦯",
+1506	    "man_with_chinese_cap": "👲",
+1507	    "man_with_chinese_cap_dark_skin_tone": "👲🏿",
+1508	    "man_with_chinese_cap_light_skin_tone": "👲🏻",
+1509	    "man_with_chinese_cap_medium-dark_skin_tone": "👲🏾",
+1510	    "man_with_chinese_cap_medium-light_skin_tone": "👲🏼",
+1511	    "man_with_chinese_cap_medium_skin_tone": "👲🏽",
+1512	    "man_zombie": "🧟\u200d♂️",
+1513	    "mango": "🥭",
+1514	    "mantelpiece_clock": "🕰",
+1515	    "manual_wheelchair": "🦽",
+1516	    "man’s_shoe": "👞",
+1517	    "map_of_japan": "🗾",
+1518	    "maple_leaf": "🍁",
+1519	    "martial_arts_uniform": "🥋",
+1520	    "mate": "🧉",
+1521	    "meat_on_bone": "🍖",
+1522	    "mechanical_arm": "🦾",
+1523	    "mechanical_leg": "🦿",
+1524	    "medical_symbol": "⚕",
+1525	    "megaphone": "📣",
+1526	    "melon": "🍈",
+1527	    "memo": "📝",
+1528	    "men_with_bunny_ears": "👯\u200d♂️",
+1529	    "men_wrestling": "🤼\u200d♂️",
+1530	    "menorah": "🕎",
+1531	    "men’s_room": "🚹",
+1532	    "mermaid": "🧜\u200d♀️",
+1533	    "mermaid_dark_skin_tone": "🧜🏿\u200d♀️",
+1534	    "mermaid_light_skin_tone": "🧜🏻\u200d♀️",
+1535	    "mermaid_medium-dark_skin_tone": "🧜🏾\u200d♀️",
+1536	    "mermaid_medium-light_skin_tone": "🧜🏼\u200d♀️",
+1537	    "mermaid_medium_skin_tone": "🧜🏽\u200d♀️",
+1538	    "merman": "🧜\u200d♂️",
+1539	    "merman_dark_skin_tone": "🧜🏿\u200d♂️",
+1540	    "merman_light_skin_tone": "🧜🏻\u200d♂️",
+1541	    "merman_medium-dark_skin_tone": "🧜🏾\u200d♂️",
+1542	    "merman_medium-light_skin_tone": "🧜🏼\u200d♂️",
+1543	    "merman_medium_skin_tone": "🧜🏽\u200d♂️",
+1544	    "merperson": "🧜",
+1545	    "merperson_dark_skin_tone": "🧜🏿",
+1546	    "merperson_light_skin_tone": "🧜🏻",
+1547	    "merperson_medium-dark_skin_tone": "🧜🏾",
+1548	    "merperson_medium-light_skin_tone": "🧜🏼",
+1549	    "merperson_medium_skin_tone": "🧜🏽",
+1550	    "metro": "🚇",
+1551	    "microbe": "🦠",
+1552	    "microphone": "🎤",
+1553	    "microscope": "🔬",
+1554	    "middle_finger": "🖕",
+1555	    "middle_finger_dark_skin_tone": "🖕🏿",
+1556	    "middle_finger_light_skin_tone": "🖕🏻",
+1557	    "middle_finger_medium-dark_skin_tone": "🖕🏾",
+1558	    "middle_finger_medium-light_skin_tone": "🖕🏼",
+1559	    "middle_finger_medium_skin_tone": "🖕🏽",
+1560	    "military_medal": "🎖",
+1561	    "milky_way": "🌌",
+1562	    "minibus": "🚐",
+1563	    "moai": "🗿",
+1564	    "mobile_phone": "📱",
+1565	    "mobile_phone_off": "📴",
+1566	    "mobile_phone_with_arrow": "📲",
+1567	    "money-mouth_face": "🤑",
+1568	    "money_bag": "💰",
+1569	    "money_with_wings": "💸",
+1570	    "monkey": "🐒",
+1571	    "monkey_face": "🐵",
+1572	    "monorail": "🚝",
+1573	    "moon_cake": "🥮",
+1574	    "moon_viewing_ceremony": "🎑",
+1575	    "mosque": "🕌",
+1576	    "mosquito": "🦟",
+1577	    "motor_boat": "🛥",
+1578	    "motor_scooter": "🛵",
+1579	    "motorcycle": "🏍",
+1580	    "motorized_wheelchair": "🦼",
+1581	    "motorway": "🛣",
+1582	    "mount_fuji": "🗻",
+1583	    "mountain": "⛰",
+1584	    "mountain_cableway": "🚠",
+1585	    "mountain_railway": "🚞",
+1586	    "mouse": "🐭",
+1587	    "mouse_face": "🐭",
+1588	    "mouth": "👄",
+1589	    "movie_camera": "🎥",
+1590	    "mushroom": "🍄",
+1591	    "musical_keyboard": "🎹",
+1592	    "musical_note": "🎵",
+1593	    "musical_notes": "🎶",
+1594	    "musical_score": "🎼",
+1595	    "muted_speaker": "🔇",
+1596	    "nail_polish": "💅",
+1597	    "nail_polish_dark_skin_tone": "💅🏿",
+1598	    "nail_polish_light_skin_tone": "💅🏻",
+1599	    "nail_polish_medium-dark_skin_tone": "💅🏾",
+1600	    "nail_polish_medium-light_skin_tone": "💅🏼",
+1601	    "nail_polish_medium_skin_tone": "💅🏽",
+1602	    "name_badge": "📛",
+1603	    "national_park": "🏞",
+1604	    "nauseated_face": "🤢",
+1605	    "nazar_amulet": "🧿",
+1606	    "necktie": "👔",
+1607	    "nerd_face": "🤓",
+1608	    "neutral_face": "😐",
+1609	    "new_moon": "🌑",
+1610	    "new_moon_face": "🌚",
+1611	    "newspaper": "📰",
+1612	    "next_track_button": "⏭",
+1613	    "night_with_stars": "🌃",
+1614	    "nine-thirty": "🕤",
+1615	    "nine_o’clock": "🕘",
+1616	    "no_bicycles": "🚳",
+1617	    "no_entry": "⛔",
+1618	    "no_littering": "🚯",
+1619	    "no_mobile_phones": "📵",
+1620	    "no_one_under_eighteen": "🔞",
+1621	    "no_pedestrians": "🚷",
+1622	    "no_smoking": "🚭",
+1623	    "non-potable_water": "🚱",
+1624	    "nose": "👃",
+1625	    "nose_dark_skin_tone": "👃🏿",
+1626	    "nose_light_skin_tone": "👃🏻",
+1627	    "nose_medium-dark_skin_tone": "👃🏾",
+1628	    "nose_medium-light_skin_tone": "👃🏼",
+1629	    "nose_medium_skin_tone": "👃🏽",
+1630	    "notebook": "📓",
+1631	    "notebook_with_decorative_cover": "📔",
+1632	    "nut_and_bolt": "🔩",
+1633	    "octopus": "🐙",
+1634	    "oden": "🍢",
+1635	    "office_building": "🏢",
+1636	    "ogre": "👹",
+1637	    "oil_drum": "🛢",
+1638	    "old_key": "🗝",
+1639	    "old_man": "👴",
+1640	    "old_man_dark_skin_tone": "👴🏿",
+1641	    "old_man_light_skin_tone": "👴🏻",
+1642	    "old_man_medium-dark_skin_tone": "👴🏾",
+1643	    "old_man_medium-light_skin_tone": "👴🏼",
+1644	    "old_man_medium_skin_tone": "👴🏽",
+1645	    "old_woman": "👵",
+1646	    "old_woman_dark_skin_tone": "👵🏿",
+1647	    "old_woman_light_skin_tone": "👵🏻",
+1648	    "old_woman_medium-dark_skin_tone": "👵🏾",
+1649	    "old_woman_medium-light_skin_tone": "👵🏼",
+1650	    "old_woman_medium_skin_tone": "👵🏽",
+1651	    "older_adult": "🧓",
+1652	    "older_adult_dark_skin_tone": "🧓🏿",
+1653	    "older_adult_light_skin_tone": "🧓🏻",
+1654	    "older_adult_medium-dark_skin_tone": "🧓🏾",
+1655	    "older_adult_medium-light_skin_tone": "🧓🏼",
+1656	    "older_adult_medium_skin_tone": "🧓🏽",
+1657	    "om": "🕉",
+1658	    "oncoming_automobile": "🚘",
+1659	    "oncoming_bus": "🚍",
+1660	    "oncoming_fist": "👊",
+1661	    "oncoming_fist_dark_skin_tone": "👊🏿",
+1662	    "oncoming_fist_light_skin_tone": "👊🏻",
+1663	    "oncoming_fist_medium-dark_skin_tone": "👊🏾",
+1664	    "oncoming_fist_medium-light_skin_tone": "👊🏼",
+1665	    "oncoming_fist_medium_skin_tone": "👊🏽",
+1666	    "oncoming_police_car": "🚔",
+1667	    "oncoming_taxi": "🚖",
+1668	    "one-piece_swimsuit": "🩱",
+1669	    "one-thirty": "🕜",
+1670	    "one_o’clock": "🕐",
+1671	    "onion": "🧅",
+1672	    "open_book": "📖",
+1673	    "open_file_folder": "📂",
+1674	    "open_hands": "👐",
+1675	    "open_hands_dark_skin_tone": "👐🏿",
+1676	    "open_hands_light_skin_tone": "👐🏻",
+1677	    "open_hands_medium-dark_skin_tone": "👐🏾",
+1678	    "open_hands_medium-light_skin_tone": "👐🏼",
+1679	    "open_hands_medium_skin_tone": "👐🏽",
+1680	    "open_mailbox_with_lowered_flag": "📭",
+1681	    "open_mailbox_with_raised_flag": "📬",
+1682	    "optical_disk": "💿",
+1683	    "orange_book": "📙",
+1684	    "orange_circle": "🟠",
+1685	    "orange_heart": "🧡",
+1686	    "orange_square": "🟧",
+1687	    "orangutan": "🦧",
+1688	    "orthodox_cross": "☦",
+1689	    "otter": "🦦",
+1690	    "outbox_tray": "📤",
+1691	    "owl": "🦉",
+1692	    "ox": "🐂",
+1693	    "oyster": "🦪",
+1694	    "package": "📦",
+1695	    "page_facing_up": "📄",
+1696	    "page_with_curl": "📃",
+1697	    "pager": "📟",
+1698	    "paintbrush": "🖌",
+1699	    "palm_tree": "🌴",
+1700	    "palms_up_together": "🤲",
+1701	    "palms_up_together_dark_skin_tone": "🤲🏿",
+1702	    "palms_up_together_light_skin_tone": "🤲🏻",
+1703	    "palms_up_together_medium-dark_skin_tone": "🤲🏾",
+1704	    "palms_up_together_medium-light_skin_tone": "🤲🏼",
+1705	    "palms_up_together_medium_skin_tone": "🤲🏽",
+1706	    "pancakes": "🥞",
+1707	    "panda_face": "🐼",
+1708	    "paperclip": "📎",
+1709	    "parrot": "🦜",
+1710	    "part_alternation_mark": "〽",
+1711	    "party_popper": "🎉",
+1712	    "partying_face": "🥳",
+1713	    "passenger_ship": "🛳",
+1714	    "passport_control": "🛂",
+1715	    "pause_button": "⏸",
+1716	    "paw_prints": "🐾",
+1717	    "peace_symbol": "☮",
+1718	    "peach": "🍑",
+1719	    "peacock": "🦚",
+1720	    "peanuts": "🥜",
+1721	    "pear": "🍐",
+1722	    "pen": "🖊",
+1723	    "pencil": "📝",
+1724	    "penguin": "🐧",
+1725	    "pensive_face": "😔",
+1726	    "people_holding_hands": "🧑\u200d🤝\u200d🧑",
+1727	    "people_with_bunny_ears": "👯",
+1728	    "people_wrestling": "🤼",
+1729	    "performing_arts": "🎭",
+1730	    "persevering_face": "😣",
+1731	    "person_biking": "🚴",
+1732	    "person_biking_dark_skin_tone": "🚴🏿",
+1733	    "person_biking_light_skin_tone": "🚴🏻",
+1734	    "person_biking_medium-dark_skin_tone": "🚴🏾",
+1735	    "person_biking_medium-light_skin_tone": "🚴🏼",
+1736	    "person_biking_medium_skin_tone": "🚴🏽",
+1737	    "person_bouncing_ball": "⛹",
+1738	    "person_bouncing_ball_dark_skin_tone": "⛹🏿",
+1739	    "person_bouncing_ball_light_skin_tone": "⛹🏻",
+1740	    "person_bouncing_ball_medium-dark_skin_tone": "⛹🏾",
+1741	    "person_bouncing_ball_medium-light_skin_tone": "⛹🏼",
+1742	    "person_bouncing_ball_medium_skin_tone": "⛹🏽",
+1743	    "person_bowing": "🙇",
+1744	    "person_bowing_dark_skin_tone": "🙇🏿",
+1745	    "person_bowing_light_skin_tone": "🙇🏻",
+1746	    "person_bowing_medium-dark_skin_tone": "🙇🏾",
+1747	    "person_bowing_medium-light_skin_tone": "🙇🏼",
+1748	    "person_bowing_medium_skin_tone": "🙇🏽",
+1749	    "person_cartwheeling": "🤸",
+1750	    "person_cartwheeling_dark_skin_tone": "🤸🏿",
+1751	    "person_cartwheeling_light_skin_tone": "🤸🏻",
+1752	    "person_cartwheeling_medium-dark_skin_tone": "🤸🏾",
+1753	    "person_cartwheeling_medium-light_skin_tone": "🤸🏼",
+1754	    "person_cartwheeling_medium_skin_tone": "🤸🏽",
+1755	    "person_climbing": "🧗",
+1756	    "person_climbing_dark_skin_tone": "🧗🏿",
+1757	    "person_climbing_light_skin_tone": "🧗🏻",
+1758	    "person_climbing_medium-dark_skin_tone": "🧗🏾",
+1759	    "person_climbing_medium-light_skin_tone": "🧗🏼",
+1760	    "person_climbing_medium_skin_tone": "🧗🏽",
+1761	    "person_facepalming": "🤦",
+1762	    "person_facepalming_dark_skin_tone": "🤦🏿",
+1763	    "person_facepalming_light_skin_tone": "🤦🏻",
+1764	    "person_facepalming_medium-dark_skin_tone": "🤦🏾",
+1765	    "person_facepalming_medium-light_skin_tone": "🤦🏼",
+1766	    "person_facepalming_medium_skin_tone": "🤦🏽",
+1767	    "person_fencing": "🤺",
+1768	    "person_frowning": "🙍",
+1769	    "person_frowning_dark_skin_tone": "🙍🏿",
+1770	    "person_frowning_light_skin_tone": "🙍🏻",
+1771	    "person_frowning_medium-dark_skin_tone": "🙍🏾",
+1772	    "person_frowning_medium-light_skin_tone": "🙍🏼",
+1773	    "person_frowning_medium_skin_tone": "🙍🏽",
+1774	    "person_gesturing_no": "🙅",
+1775	    "person_gesturing_no_dark_skin_tone": "🙅🏿",
+1776	    "person_gesturing_no_light_skin_tone": "🙅🏻",
+1777	    "person_gesturing_no_medium-dark_skin_tone": "🙅🏾",
+1778	    "person_gesturing_no_medium-light_skin_tone": "🙅🏼",
+1779	    "person_gesturing_no_medium_skin_tone": "🙅🏽",
+1780	    "person_gesturing_ok": "🙆",
+1781	    "person_gesturing_ok_dark_skin_tone": "🙆🏿",
+1782	    "person_gesturing_ok_light_skin_tone": "🙆🏻",
+1783	    "person_gesturing_ok_medium-dark_skin_tone": "🙆🏾",
+1784	    "person_gesturing_ok_medium-light_skin_tone": "🙆🏼",
+1785	    "person_gesturing_ok_medium_skin_tone": "🙆🏽",
+1786	    "person_getting_haircut": "💇",
+1787	    "person_getting_haircut_dark_skin_tone": "💇🏿",
+1788	    "person_getting_haircut_light_skin_tone": "💇🏻",
+1789	    "person_getting_haircut_medium-dark_skin_tone": "💇🏾",
+1790	    "person_getting_haircut_medium-light_skin_tone": "💇🏼",
+1791	    "person_getting_haircut_medium_skin_tone": "💇🏽",
+1792	    "person_getting_massage": "💆",
+1793	    "person_getting_massage_dark_skin_tone": "💆🏿",
+1794	    "person_getting_massage_light_skin_tone": "💆🏻",
+1795	    "person_getting_massage_medium-dark_skin_tone": "💆🏾",
+1796	    "person_getting_massage_medium-light_skin_tone": "💆🏼",
+1797	    "person_getting_massage_medium_skin_tone": "💆🏽",
+1798	    "person_golfing": "🏌",
+1799	    "person_golfing_dark_skin_tone": "🏌🏿",
+1800	    "person_golfing_light_skin_tone": "🏌🏻",
+1801	    "person_golfing_medium-dark_skin_tone": "🏌🏾",
+1802	    "person_golfing_medium-light_skin_tone": "🏌🏼",
+1803	    "person_golfing_medium_skin_tone": "🏌🏽",
+1804	    "person_in_bed": "🛌",
+1805	    "person_in_bed_dark_skin_tone": "🛌🏿",
+1806	    "person_in_bed_light_skin_tone": "🛌🏻",
+1807	    "person_in_bed_medium-dark_skin_tone": "🛌🏾",
+1808	    "person_in_bed_medium-light_skin_tone": "🛌🏼",
+1809	    "person_in_bed_medium_skin_tone": "🛌🏽",
+1810	    "person_in_lotus_position": "🧘",
+1811	    "person_in_lotus_position_dark_skin_tone": "🧘🏿",
+1812	    "person_in_lotus_position_light_skin_tone": "🧘🏻",
+1813	    "person_in_lotus_position_medium-dark_skin_tone": "🧘🏾",
+1814	    "person_in_lotus_position_medium-light_skin_tone": "🧘🏼",
+1815	    "person_in_lotus_position_medium_skin_tone": "🧘🏽",
+1816	    "person_in_steamy_room": "🧖",
+1817	    "person_in_steamy_room_dark_skin_tone": "🧖🏿",
+1818	    "person_in_steamy_room_light_skin_tone": "🧖🏻",
+1819	    "person_in_steamy_room_medium-dark_skin_tone": "🧖🏾",
+1820	    "person_in_steamy_room_medium-light_skin_tone": "🧖🏼",
+1821	    "person_in_steamy_room_medium_skin_tone": "🧖🏽",
+1822	    "person_juggling": "🤹",
+1823	    "person_juggling_dark_skin_tone": "🤹🏿",
+1824	    "person_juggling_light_skin_tone": "🤹🏻",
+1825	    "person_juggling_medium-dark_skin_tone": "🤹🏾",
+1826	    "person_juggling_medium-light_skin_tone": "🤹🏼",
+1827	    "person_juggling_medium_skin_tone": "🤹🏽",
+1828	    "person_kneeling": "🧎",
+1829	    "person_lifting_weights": "🏋",
+1830	    "person_lifting_weights_dark_skin_tone": "🏋🏿",
+1831	    "person_lifting_weights_light_skin_tone": "🏋🏻",
+1832	    "person_lifting_weights_medium-dark_skin_tone": "🏋🏾",
+1833	    "person_lifting_weights_medium-light_skin_tone": "🏋🏼",
+1834	    "person_lifting_weights_medium_skin_tone": "🏋🏽",
+1835	    "person_mountain_biking": "🚵",
+1836	    "person_mountain_biking_dark_skin_tone": "🚵🏿",
+1837	    "person_mountain_biking_light_skin_tone": "🚵🏻",
+1838	    "person_mountain_biking_medium-dark_skin_tone": "🚵🏾",
+1839	    "person_mountain_biking_medium-light_skin_tone": "🚵🏼",
+1840	    "person_mountain_biking_medium_skin_tone": "🚵🏽",
+1841	    "person_playing_handball": "🤾",
+1842	    "person_playing_handball_dark_skin_tone": "🤾🏿",
+1843	    "person_playing_handball_light_skin_tone": "🤾🏻",
+1844	    "person_playing_handball_medium-dark_skin_tone": "🤾🏾",
+1845	    "person_playing_handball_medium-light_skin_tone": "🤾🏼",
+1846	    "person_playing_handball_medium_skin_tone": "🤾🏽",
+1847	    "person_playing_water_polo": "🤽",
+1848	    "person_playing_water_polo_dark_skin_tone": "🤽🏿",
+1849	    "person_playing_water_polo_light_skin_tone": "🤽🏻",
+1850	    "person_playing_water_polo_medium-dark_skin_tone": "🤽🏾",
+1851	    "person_playing_water_polo_medium-light_skin_tone": "🤽🏼",
+1852	    "person_playing_water_polo_medium_skin_tone": "🤽🏽",
+1853	    "person_pouting": "🙎",
+1854	    "person_pouting_dark_skin_tone": "🙎🏿",
+1855	    "person_pouting_light_skin_tone": "🙎🏻",
+1856	    "person_pouting_medium-dark_skin_tone": "🙎🏾",
+1857	    "person_pouting_medium-light_skin_tone": "🙎🏼",
+1858	    "person_pouting_medium_skin_tone": "🙎🏽",
+1859	    "person_raising_hand": "🙋",
+1860	    "person_raising_hand_dark_skin_tone": "🙋🏿",
+1861	    "person_raising_hand_light_skin_tone": "🙋🏻",
+1862	    "person_raising_hand_medium-dark_skin_tone": "🙋🏾",
+1863	    "person_raising_hand_medium-light_skin_tone": "🙋🏼",
+1864	    "person_raising_hand_medium_skin_tone": "🙋🏽",
+1865	    "person_rowing_boat": "🚣",
+1866	    "person_rowing_boat_dark_skin_tone": "🚣🏿",
+1867	    "person_rowing_boat_light_skin_tone": "🚣🏻",
+1868	    "person_rowing_boat_medium-dark_skin_tone": "🚣🏾",
+1869	    "person_rowing_boat_medium-light_skin_tone": "🚣🏼",
+1870	    "person_rowing_boat_medium_skin_tone": "🚣🏽",
+1871	    "person_running": "🏃",
+1872	    "person_running_dark_skin_tone": "🏃🏿",
+1873	    "person_running_light_skin_tone": "🏃🏻",
+1874	    "person_running_medium-dark_skin_tone": "🏃🏾",
+1875	    "person_running_medium-light_skin_tone": "🏃🏼",
+1876	    "person_running_medium_skin_tone": "🏃🏽",
+1877	    "person_shrugging": "🤷",
+1878	    "person_shrugging_dark_skin_tone": "🤷🏿",
+1879	    "person_shrugging_light_skin_tone": "🤷🏻",
+1880	    "person_shrugging_medium-dark_skin_tone": "🤷🏾",
+1881	    "person_shrugging_medium-light_skin_tone": "🤷🏼",
+1882	    "person_shrugging_medium_skin_tone": "🤷🏽",
+1883	    "person_standing": "🧍",
+1884	    "person_surfing": "🏄",
+1885	    "person_surfing_dark_skin_tone": "🏄🏿",
+1886	    "person_surfing_light_skin_tone": "🏄🏻",
+1887	    "person_surfing_medium-dark_skin_tone": "🏄🏾",
+1888	    "person_surfing_medium-light_skin_tone": "🏄🏼",
+1889	    "person_surfing_medium_skin_tone": "🏄🏽",
+1890	    "person_swimming": "🏊",
+1891	    "person_swimming_dark_skin_tone": "🏊🏿",
+1892	    "person_swimming_light_skin_tone": "🏊🏻",
+1893	    "person_swimming_medium-dark_skin_tone": "🏊🏾",
+1894	    "person_swimming_medium-light_skin_tone": "🏊🏼",
+1895	    "person_swimming_medium_skin_tone": "🏊🏽",
+1896	    "person_taking_bath": "🛀",
+1897	    "person_taking_bath_dark_skin_tone": "🛀🏿",
+1898	    "person_taking_bath_light_skin_tone": "🛀🏻",
+1899	    "person_taking_bath_medium-dark_skin_tone": "🛀🏾",
+1900	    "person_taking_bath_medium-light_skin_tone": "🛀🏼",
+1901	    "person_taking_bath_medium_skin_tone": "🛀🏽",
+1902	    "person_tipping_hand": "💁",
+1903	    "person_tipping_hand_dark_skin_tone": "💁🏿",
+1904	    "person_tipping_hand_light_skin_tone": "💁🏻",
+1905	    "person_tipping_hand_medium-dark_skin_tone": "💁🏾",
+1906	    "person_tipping_hand_medium-light_skin_tone": "💁🏼",
+1907	    "person_tipping_hand_medium_skin_tone": "💁🏽",
+1908	    "person_walking": "🚶",
+1909	    "person_walking_dark_skin_tone": "🚶🏿",
+1910	    "person_walking_light_skin_tone": "🚶🏻",
+1911	    "person_walking_medium-dark_skin_tone": "🚶🏾",
+1912	    "person_walking_medium-light_skin_tone": "🚶🏼",
+1913	    "person_walking_medium_skin_tone": "🚶🏽",
+1914	    "person_wearing_turban": "👳",
+1915	    "person_wearing_turban_dark_skin_tone": "👳🏿",
+1916	    "person_wearing_turban_light_skin_tone": "👳🏻",
+1917	    "person_wearing_turban_medium-dark_skin_tone": "👳🏾",
+1918	    "person_wearing_turban_medium-light_skin_tone": "👳🏼",
+1919	    "person_wearing_turban_medium_skin_tone": "👳🏽",
+1920	    "petri_dish": "🧫",
+1921	    "pick": "⛏",
+1922	    "pie": "🥧",
+1923	    "pig": "🐷",
+1924	    "pig_face": "🐷",
+1925	    "pig_nose": "🐽",
+1926	    "pile_of_poo": "💩",
+1927	    "pill": "💊",
+1928	    "pinching_hand": "🤏",
+1929	    "pine_decoration": "🎍",
+1930	    "pineapple": "🍍",
+1931	    "ping_pong": "🏓",
+1932	    "pirate_flag": "🏴\u200d☠️",
+1933	    "pistol": "🔫",
+1934	    "pizza": "🍕",
+1935	    "place_of_worship": "🛐",
+1936	    "play_button": "▶",
+1937	    "play_or_pause_button": "⏯",
+1938	    "pleading_face": "🥺",
+1939	    "police_car": "🚓",
+1940	    "police_car_light": "🚨",
+1941	    "police_officer": "👮",
+1942	    "police_officer_dark_skin_tone": "👮🏿",
+1943	    "police_officer_light_skin_tone": "👮🏻",
+1944	    "police_officer_medium-dark_skin_tone": "👮🏾",
+1945	    "police_officer_medium-light_skin_tone": "👮🏼",
+1946	    "police_officer_medium_skin_tone": "👮🏽",
+1947	    "poodle": "🐩",
+1948	    "pool_8_ball": "🎱",
+1949	    "popcorn": "🍿",
+1950	    "post_office": "🏣",
+1951	    "postal_horn": "📯",
+1952	    "postbox": "📮",
+1953	    "pot_of_food": "🍲",
+1954	    "potable_water": "🚰",
+1955	    "potato": "🥔",
+1956	    "poultry_leg": "🍗",
+1957	    "pound_banknote": "💷",
+1958	    "pouting_cat_face": "😾",
+1959	    "pouting_face": "😡",
+1960	    "prayer_beads": "📿",
+1961	    "pregnant_woman": "🤰",
+1962	    "pregnant_woman_dark_skin_tone": "🤰🏿",
+1963	    "pregnant_woman_light_skin_tone": "🤰🏻",
+1964	    "pregnant_woman_medium-dark_skin_tone": "🤰🏾",
+1965	    "pregnant_woman_medium-light_skin_tone": "🤰🏼",
+1966	    "pregnant_woman_medium_skin_tone": "🤰🏽",
+1967	    "pretzel": "🥨",
+1968	    "probing_cane": "🦯",
+1969	    "prince": "🤴",
+1970	    "prince_dark_skin_tone": "🤴🏿",
+1971	    "prince_light_skin_tone": "🤴🏻",
+1972	    "prince_medium-dark_skin_tone": "🤴🏾",
+1973	    "prince_medium-light_skin_tone": "🤴🏼",
+1974	    "prince_medium_skin_tone": "🤴🏽",
+1975	    "princess": "👸",
+1976	    "princess_dark_skin_tone": "👸🏿",
+1977	    "princess_light_skin_tone": "👸🏻",
+1978	    "princess_medium-dark_skin_tone": "👸🏾",
+1979	    "princess_medium-light_skin_tone": "👸🏼",
+1980	    "princess_medium_skin_tone": "👸🏽",
+1981	    "printer": "🖨",
+1982	    "prohibited": "🚫",
+1983	    "purple_circle": "🟣",
+1984	    "purple_heart": "💜",
+1985	    "purple_square": "🟪",
+1986	    "purse": "👛",
+1987	    "pushpin": "📌",
+1988	    "question_mark": "❓",
+1989	    "rabbit": "🐰",
+1990	    "rabbit_face": "🐰",
+1991	    "raccoon": "🦝",
+1992	    "racing_car": "🏎",
+1993	    "radio": "📻",
+1994	    "radio_button": "🔘",
+1995	    "radioactive": "☢",
+1996	    "railway_car": "🚃",
+1997	    "railway_track": "🛤",
+1998	    "rainbow": "🌈",
+1999	    "rainbow_flag": "🏳️\u200d🌈",
+2000	    "raised_back_of_hand": "🤚",
+2001	    "raised_back_of_hand_dark_skin_tone": "🤚🏿",
+2002	    "raised_back_of_hand_light_skin_tone": "🤚🏻",
+2003	    "raised_back_of_hand_medium-dark_skin_tone": "🤚🏾",
+2004	    "raised_back_of_hand_medium-light_skin_tone": "🤚🏼",
+2005	    "raised_back_of_hand_medium_skin_tone": "🤚🏽",
+2006	    "raised_fist": "✊",
+2007	    "raised_fist_dark_skin_tone": "✊🏿",
+2008	    "raised_fist_light_skin_tone": "✊🏻",
+2009	    "raised_fist_medium-dark_skin_tone": "✊🏾",
+2010	    "raised_fist_medium-light_skin_tone": "✊🏼",
+2011	    "raised_fist_medium_skin_tone": "✊🏽",
+2012	    "raised_hand": "✋",
+2013	    "raised_hand_dark_skin_tone": "✋🏿",
+2014	    "raised_hand_light_skin_tone": "✋🏻",
+2015	    "raised_hand_medium-dark_skin_tone": "✋🏾",
+2016	    "raised_hand_medium-light_skin_tone": "✋🏼",
+2017	    "raised_hand_medium_skin_tone": "✋🏽",
+2018	    "raising_hands": "🙌",
+2019	    "raising_hands_dark_skin_tone": "🙌🏿",
+2020	    "raising_hands_light_skin_tone": "🙌🏻",
+2021	    "raising_hands_medium-dark_skin_tone": "🙌🏾",
+2022	    "raising_hands_medium-light_skin_tone": "🙌🏼",
+2023	    "raising_hands_medium_skin_tone": "🙌🏽",
+2024	    "ram": "🐏",
+2025	    "rat": "🐀",
+2026	    "razor": "🪒",
+2027	    "ringed_planet": "🪐",
+2028	    "receipt": "🧾",
+2029	    "record_button": "⏺",
+2030	    "recycling_symbol": "♻",
+2031	    "red_apple": "🍎",
+2032	    "red_circle": "🔴",
+2033	    "red_envelope": "🧧",
+2034	    "red_hair": "🦰",
+2035	    "red-haired_man": "👨\u200d🦰",
+2036	    "red-haired_woman": "👩\u200d🦰",
+2037	    "red_heart": "❤",
+2038	    "red_paper_lantern": "🏮",
+2039	    "red_square": "🟥",
+2040	    "red_triangle_pointed_down": "🔻",
+2041	    "red_triangle_pointed_up": "🔺",
+2042	    "registered": "®",
+2043	    "relieved_face": "😌",
+2044	    "reminder_ribbon": "🎗",
+2045	    "repeat_button": "🔁",
+2046	    "repeat_single_button": "🔂",
+2047	    "rescue_worker’s_helmet": "⛑",
+2048	    "restroom": "🚻",
+2049	    "reverse_button": "◀",
+2050	    "revolving_hearts": "💞",
+2051	    "rhinoceros": "🦏",
+2052	    "ribbon": "🎀",
+2053	    "rice_ball": "🍙",
+2054	    "rice_cracker": "🍘",
+2055	    "right-facing_fist": "🤜",
+2056	    "right-facing_fist_dark_skin_tone": "🤜🏿",
+2057	    "right-facing_fist_light_skin_tone": "🤜🏻",
+2058	    "right-facing_fist_medium-dark_skin_tone": "🤜🏾",
+2059	    "right-facing_fist_medium-light_skin_tone": "🤜🏼",
+2060	    "right-facing_fist_medium_skin_tone": "🤜🏽",
+2061	    "right_anger_bubble": "🗯",
+2062	    "right_arrow": "➡",
+2063	    "right_arrow_curving_down": "⤵",
+2064	    "right_arrow_curving_left": "↩",
+2065	    "right_arrow_curving_up": "⤴",
+2066	    "ring": "💍",
+2067	    "roasted_sweet_potato": "🍠",
+2068	    "robot_face": "🤖",
+2069	    "rocket": "🚀",
+2070	    "roll_of_paper": "🧻",
+2071	    "rolled-up_newspaper": "🗞",
+2072	    "roller_coaster": "🎢",
+2073	    "rolling_on_the_floor_laughing": "🤣",
+2074	    "rooster": "🐓",
+2075	    "rose": "🌹",
+2076	    "rosette": "🏵",
+2077	    "round_pushpin": "📍",
+2078	    "rugby_football": "🏉",
+2079	    "running_shirt": "🎽",
+2080	    "running_shoe": "👟",
+2081	    "sad_but_relieved_face": "😥",
+2082	    "safety_pin": "🧷",
+2083	    "safety_vest": "🦺",
+2084	    "salt": "🧂",
+2085	    "sailboat": "⛵",
+2086	    "sake": "🍶",
+2087	    "sandwich": "🥪",
+2088	    "sari": "🥻",
+2089	    "satellite": "📡",
+2090	    "satellite_antenna": "📡",
+2091	    "sauropod": "🦕",
+2092	    "saxophone": "🎷",
+2093	    "scarf": "🧣",
+2094	    "school": "🏫",
+2095	    "school_backpack": "🎒",
+2096	    "scissors": "✂",
+2097	    "scorpion": "🦂",
+2098	    "scroll": "📜",
+2099	    "seat": "💺",
+2100	    "see-no-evil_monkey": "🙈",
+2101	    "seedling": "🌱",
+2102	    "selfie": "🤳",
+2103	    "selfie_dark_skin_tone": "🤳🏿",
+2104	    "selfie_light_skin_tone": "🤳🏻",
+2105	    "selfie_medium-dark_skin_tone": "🤳🏾",
+2106	    "selfie_medium-light_skin_tone": "🤳🏼",
+2107	    "selfie_medium_skin_tone": "🤳🏽",
+2108	    "service_dog": "🐕\u200d🦺",
+2109	    "seven-thirty": "🕢",
+2110	    "seven_o’clock": "🕖",
+2111	    "shallow_pan_of_food": "🥘",
+2112	    "shamrock": "☘",
+2113	    "shark": "🦈",
+2114	    "shaved_ice": "🍧",
+2115	    "sheaf_of_rice": "🌾",
+2116	    "shield": "🛡",
+2117	    "shinto_shrine": "⛩",
+2118	    "ship": "🚢",
+2119	    "shooting_star": "🌠",
+2120	    "shopping_bags": "🛍",
+2121	    "shopping_cart": "🛒",
+2122	    "shortcake": "🍰",
+2123	    "shorts": "🩳",
+2124	    "shower": "🚿",
+2125	    "shrimp": "🦐",
+2126	    "shuffle_tracks_button": "🔀",
+2127	    "shushing_face": "🤫",
+2128	    "sign_of_the_horns": "🤘",
+2129	    "sign_of_the_horns_dark_skin_tone": "🤘🏿",
+2130	    "sign_of_the_horns_light_skin_tone": "🤘🏻",
+2131	    "sign_of_the_horns_medium-dark_skin_tone": "🤘🏾",
+2132	    "sign_of_the_horns_medium-light_skin_tone": "🤘🏼",
+2133	    "sign_of_the_horns_medium_skin_tone": "🤘🏽",
+2134	    "six-thirty": "🕡",
+2135	    "six_o’clock": "🕕",
+2136	    "skateboard": "🛹",
+2137	    "skier": "⛷",
+2138	    "skis": "🎿",
+2139	    "skull": "💀",
+2140	    "skull_and_crossbones": "☠",
+2141	    "skunk": "🦨",
+2142	    "sled": "🛷",
+2143	    "sleeping_face": "😴",
+2144	    "sleepy_face": "😪",
+2145	    "slightly_frowning_face": "🙁",
+2146	    "slightly_smiling_face": "🙂",
+2147	    "slot_machine": "🎰",
+2148	    "sloth": "🦥",
+2149	    "small_airplane": "🛩",
+2150	    "small_blue_diamond": "🔹",
+2151	    "small_orange_diamond": "🔸",
+2152	    "smiling_cat_face_with_heart-eyes": "😻",
+2153	    "smiling_face": "☺",
+2154	    "smiling_face_with_halo": "😇",
+2155	    "smiling_face_with_3_hearts": "🥰",
+2156	    "smiling_face_with_heart-eyes": "😍",
+2157	    "smiling_face_with_horns": "😈",
+2158	    "smiling_face_with_smiling_eyes": "😊",
+2159	    "smiling_face_with_sunglasses": "😎",
+2160	    "smirking_face": "😏",
+2161	    "snail": "🐌",
+2162	    "snake": "🐍",
+2163	    "sneezing_face": "🤧",
+2164	    "snow-capped_mountain": "🏔",
+2165	    "snowboarder": "🏂",
+2166	    "snowboarder_dark_skin_tone": "🏂🏿",
+2167	    "snowboarder_light_skin_tone": "🏂🏻",
+2168	    "snowboarder_medium-dark_skin_tone": "🏂🏾",
+2169	    "snowboarder_medium-light_skin_tone": "🏂🏼",
+2170	    "snowboarder_medium_skin_tone": "🏂🏽",
+2171	    "snowflake": "❄",
+2172	    "snowman": "☃",
+2173	    "snowman_without_snow": "⛄",
+2174	    "soap": "🧼",
+2175	    "soccer_ball": "⚽",
+2176	    "socks": "🧦",
+2177	    "softball": "🥎",
+2178	    "soft_ice_cream": "🍦",
+2179	    "spade_suit": "♠",
+2180	    "spaghetti": "🍝",
+2181	    "sparkle": "❇",
+2182	    "sparkler": "🎇",
+2183	    "sparkles": "✨",
+2184	    "sparkling_heart": "💖",
+2185	    "speak-no-evil_monkey": "🙊",
+2186	    "speaker_high_volume": "🔊",
+2187	    "speaker_low_volume": "🔈",
+2188	    "speaker_medium_volume": "🔉",
+2189	    "speaking_head": "🗣",
+2190	    "speech_balloon": "💬",
+2191	    "speedboat": "🚤",
+2192	    "spider": "🕷",
+2193	    "spider_web": "🕸",
+2194	    "spiral_calendar": "🗓",
+2195	    "spiral_notepad": "🗒",
+2196	    "spiral_shell": "🐚",
+2197	    "spoon": "🥄",
+2198	    "sponge": "🧽",
+2199	    "sport_utility_vehicle": "🚙",
+2200	    "sports_medal": "🏅",
+2201	    "spouting_whale": "🐳",
+2202	    "squid": "🦑",
+2203	    "squinting_face_with_tongue": "😝",
+2204	    "stadium": "🏟",
+2205	    "star-struck": "🤩",
+2206	    "star_and_crescent": "☪",
+2207	    "star_of_david": "✡",
+2208	    "station": "🚉",
+2209	    "steaming_bowl": "🍜",
+2210	    "stethoscope": "🩺",
+2211	    "stop_button": "⏹",
+2212	    "stop_sign": "🛑",
+2213	    "stopwatch": "⏱",
+2214	    "straight_ruler": "📏",
+2215	    "strawberry": "🍓",
+2216	    "studio_microphone": "🎙",
+2217	    "stuffed_flatbread": "🥙",
+2218	    "sun": "☀",
+2219	    "sun_behind_cloud": "⛅",
+2220	    "sun_behind_large_cloud": "🌥",
+2221	    "sun_behind_rain_cloud": "🌦",
+2222	    "sun_behind_small_cloud": "🌤",
+2223	    "sun_with_face": "🌞",
+2224	    "sunflower": "🌻",
+2225	    "sunglasses": "😎",
+2226	    "sunrise": "🌅",
+2227	    "sunrise_over_mountains": "🌄",
+2228	    "sunset": "🌇",
+2229	    "superhero": "🦸",
+2230	    "supervillain": "🦹",
+2231	    "sushi": "🍣",
+2232	    "suspension_railway": "🚟",
+2233	    "swan": "🦢",
+2234	    "sweat_droplets": "💦",
+2235	    "synagogue": "🕍",
+2236	    "syringe": "💉",
+2237	    "t-shirt": "👕",
+2238	    "taco": "🌮",
+2239	    "takeout_box": "🥡",
+2240	    "tanabata_tree": "🎋",
+2241	    "tangerine": "🍊",
+2242	    "taxi": "🚕",
+2243	    "teacup_without_handle": "🍵",
+2244	    "tear-off_calendar": "📆",
+2245	    "teddy_bear": "🧸",
+2246	    "telephone": "☎",
+2247	    "telephone_receiver": "📞",
+2248	    "telescope": "🔭",
+2249	    "television": "📺",
+2250	    "ten-thirty": "🕥",
+2251	    "ten_o’clock": "🕙",
+2252	    "tennis": "🎾",
+2253	    "tent": "⛺",
+2254	    "test_tube": "🧪",
+2255	    "thermometer": "🌡",
+2256	    "thinking_face": "🤔",
+2257	    "thought_balloon": "💭",
+2258	    "thread": "🧵",
+2259	    "three-thirty": "🕞",
+2260	    "three_o’clock": "🕒",
+2261	    "thumbs_down": "👎",
+2262	    "thumbs_down_dark_skin_tone": "👎🏿",
+2263	    "thumbs_down_light_skin_tone": "👎🏻",
+2264	    "thumbs_down_medium-dark_skin_tone": "👎🏾",
+2265	    "thumbs_down_medium-light_skin_tone": "👎🏼",
+2266	    "thumbs_down_medium_skin_tone": "👎🏽",
+2267	    "thumbs_up": "👍",
+2268	    "thumbs_up_dark_skin_tone": "👍🏿",
+2269	    "thumbs_up_light_skin_tone": "👍🏻",
+2270	    "thumbs_up_medium-dark_skin_tone": "👍🏾",
+2271	    "thumbs_up_medium-light_skin_tone": "👍🏼",
+2272	    "thumbs_up_medium_skin_tone": "👍🏽",
+2273	    "ticket": "🎫",
+2274	    "tiger": "🐯",
+2275	    "tiger_face": "🐯",
+2276	    "timer_clock": "⏲",
+2277	    "tired_face": "😫",
+2278	    "toolbox": "🧰",
+2279	    "toilet": "🚽",
+2280	    "tomato": "🍅",
+2281	    "tongue": "👅",
+2282	    "tooth": "🦷",
+2283	    "top_hat": "🎩",
+2284	    "tornado": "🌪",
+2285	    "trackball": "🖲",
+2286	    "tractor": "🚜",
+2287	    "trade_mark": "™",
+2288	    "train": "🚋",
+2289	    "tram": "🚊",
+2290	    "tram_car": "🚋",
+2291	    "triangular_flag": "🚩",
+2292	    "triangular_ruler": "📐",
+2293	    "trident_emblem": "🔱",
+2294	    "trolleybus": "🚎",
+2295	    "trophy": "🏆",
+2296	    "tropical_drink": "🍹",
+2297	    "tropical_fish": "🐠",
+2298	    "trumpet": "🎺",
+2299	    "tulip": "🌷",
+2300	    "tumbler_glass": "🥃",
+2301	    "turtle": "🐢",
+2302	    "twelve-thirty": "🕧",
+2303	    "twelve_o’clock": "🕛",
+2304	    "two-hump_camel": "🐫",
+2305	    "two-thirty": "🕝",
+2306	    "two_hearts": "💕",
+2307	    "two_men_holding_hands": "👬",
+2308	    "two_o’clock": "🕑",
+2309	    "two_women_holding_hands": "👭",
+2310	    "umbrella": "☂",
+2311	    "umbrella_on_ground": "⛱",
+2312	    "umbrella_with_rain_drops": "☔",
+2313	    "unamused_face": "😒",
+2314	    "unicorn_face": "🦄",
+2315	    "unlocked": "🔓",
+2316	    "up-down_arrow": "↕",
+2317	    "up-left_arrow": "↖",
+2318	    "up-right_arrow": "↗",
+2319	    "up_arrow": "⬆",
+2320	    "upside-down_face": "🙃",
+2321	    "upwards_button": "🔼",
+2322	    "vampire": "🧛",
+2323	    "vampire_dark_skin_tone": "🧛🏿",
+2324	    "vampire_light_skin_tone": "🧛🏻",
+2325	    "vampire_medium-dark_skin_tone": "🧛🏾",
+2326	    "vampire_medium-light_skin_tone": "🧛🏼",
+2327	    "vampire_medium_skin_tone": "🧛🏽",
+2328	    "vertical_traffic_light": "🚦",
+2329	    "vibration_mode": "📳",
+2330	    "victory_hand": "✌",
+2331	    "victory_hand_dark_skin_tone": "✌🏿",
+2332	    "victory_hand_light_skin_tone": "✌🏻",
+2333	    "victory_hand_medium-dark_skin_tone": "✌🏾",
+2334	    "victory_hand_medium-light_skin_tone": "✌🏼",
+2335	    "victory_hand_medium_skin_tone": "✌🏽",
+2336	    "video_camera": "📹",
+2337	    "video_game": "🎮",
+2338	    "videocassette": "📼",
+2339	    "violin": "🎻",
+2340	    "volcano": "🌋",
+2341	    "volleyball": "🏐",
+2342	    "vulcan_salute": "🖖",
+2343	    "vulcan_salute_dark_skin_tone": "🖖🏿",
+2344	    "vulcan_salute_light_skin_tone": "🖖🏻",
+2345	    "vulcan_salute_medium-dark_skin_tone": "🖖🏾",
+2346	    "vulcan_salute_medium-light_skin_tone": "🖖🏼",
+2347	    "vulcan_salute_medium_skin_tone": "🖖🏽",
+2348	    "waffle": "🧇",
+2349	    "waning_crescent_moon": "🌘",
+2350	    "waning_gibbous_moon": "🌖",
+2351	    "warning": "⚠",
+2352	    "wastebasket": "🗑",
+2353	    "watch": "⌚",
+2354	    "water_buffalo": "🐃",
+2355	    "water_closet": "🚾",
+2356	    "water_wave": "🌊",
+2357	    "watermelon": "🍉",
+2358	    "waving_hand": "👋",
+2359	    "waving_hand_dark_skin_tone": "👋🏿",
+2360	    "waving_hand_light_skin_tone": "👋🏻",
+2361	    "waving_hand_medium-dark_skin_tone": "👋🏾",
+2362	    "waving_hand_medium-light_skin_tone": "👋🏼",
+2363	    "waving_hand_medium_skin_tone": "👋🏽",
+2364	    "wavy_dash": "〰",
+2365	    "waxing_crescent_moon": "🌒",
+2366	    "waxing_gibbous_moon": "🌔",
+2367	    "weary_cat_face": "🙀",
+2368	    "weary_face": "😩",
+2369	    "wedding": "💒",
+2370	    "whale": "🐳",
+2371	    "wheel_of_dharma": "☸",
+2372	    "wheelchair_symbol": "♿",
+2373	    "white_circle": "⚪",
+2374	    "white_exclamation_mark": "❕",
+2375	    "white_flag": "🏳",
+2376	    "white_flower": "💮",
+2377	    "white_hair": "🦳",
+2378	    "white-haired_man": "👨\u200d🦳",
+2379	    "white-haired_woman": "👩\u200d🦳",
+2380	    "white_heart": "🤍",
+2381	    "white_heavy_check_mark": "✅",
+2382	    "white_large_square": "⬜",
+2383	    "white_medium-small_square": "◽",
+2384	    "white_medium_square": "◻",
+2385	    "white_medium_star": "⭐",
+2386	    "white_question_mark": "❔",
+2387	    "white_small_square": "▫",
+2388	    "white_square_button": "🔳",
+2389	    "wilted_flower": "🥀",
+2390	    "wind_chime": "🎐",
+2391	    "wind_face": "🌬",
+2392	    "wine_glass": "🍷",
+2393	    "winking_face": "😉",
+2394	    "winking_face_with_tongue": "😜",
+2395	    "wolf_face": "🐺",
+2396	    "woman": "👩",
+2397	    "woman_artist": "👩\u200d🎨",
+2398	    "woman_artist_dark_skin_tone": "👩🏿\u200d🎨",
+2399	    "woman_artist_light_skin_tone": "👩🏻\u200d🎨",
+2400	    "woman_artist_medium-dark_skin_tone": "👩🏾\u200d🎨",
+2401	    "woman_artist_medium-light_skin_tone": "👩🏼\u200d🎨",
+2402	    "woman_artist_medium_skin_tone": "👩🏽\u200d🎨",
+2403	    "woman_astronaut": "👩\u200d🚀",
+2404	    "woman_astronaut_dark_skin_tone": "👩🏿\u200d🚀",
+2405	    "woman_astronaut_light_skin_tone": "👩🏻\u200d🚀",
+2406	    "woman_astronaut_medium-dark_skin_tone": "👩🏾\u200d🚀",
+2407	    "woman_astronaut_medium-light_skin_tone": "👩🏼\u200d🚀",
+2408	    "woman_astronaut_medium_skin_tone": "👩🏽\u200d🚀",
+2409	    "woman_biking": "🚴\u200d♀️",
+2410	    "woman_biking_dark_skin_tone": "🚴🏿\u200d♀️",
+2411	    "woman_biking_light_skin_tone": "🚴🏻\u200d♀️",
+2412	    "woman_biking_medium-dark_skin_tone": "🚴🏾\u200d♀️",
+2413	    "woman_biking_medium-light_skin_tone": "🚴🏼\u200d♀️",
+2414	    "woman_biking_medium_skin_tone": "🚴🏽\u200d♀️",
+2415	    "woman_bouncing_ball": "⛹️\u200d♀️",
+2416	    "woman_bouncing_ball_dark_skin_tone": "⛹🏿\u200d♀️",
+2417	    "woman_bouncing_ball_light_skin_tone": "⛹🏻\u200d♀️",
+2418	    "woman_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♀️",
+2419	    "woman_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♀️",
+2420	    "woman_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♀️",
+2421	    "woman_bowing": "🙇\u200d♀️",
+2422	    "woman_bowing_dark_skin_tone": "🙇🏿\u200d♀️",
+2423	    "woman_bowing_light_skin_tone": "🙇🏻\u200d♀️",
+2424	    "woman_bowing_medium-dark_skin_tone": "🙇🏾\u200d♀️",
+2425	    "woman_bowing_medium-light_skin_tone": "🙇🏼\u200d♀️",
+2426	    "woman_bowing_medium_skin_tone": "🙇🏽\u200d♀️",
+2427	    "woman_cartwheeling": "🤸\u200d♀️",
+2428	    "woman_cartwheeling_dark_skin_tone": "🤸🏿\u200d♀️",
+2429	    "woman_cartwheeling_light_skin_tone": "🤸🏻\u200d♀️",
+2430	    "woman_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♀️",
+2431	    "woman_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♀️",
+2432	    "woman_cartwheeling_medium_skin_tone": "🤸🏽\u200d♀️",
+2433	    "woman_climbing": "🧗\u200d♀️",
+2434	    "woman_climbing_dark_skin_tone": "🧗🏿\u200d♀️",
+2435	    "woman_climbing_light_skin_tone": "🧗🏻\u200d♀️",
+2436	    "woman_climbing_medium-dark_skin_tone": "🧗🏾\u200d♀️",
+2437	    "woman_climbing_medium-light_skin_tone": "🧗🏼\u200d♀️",
+2438	    "woman_climbing_medium_skin_tone": "🧗🏽\u200d♀️",
+2439	    "woman_construction_worker": "👷\u200d♀️",
+2440	    "woman_construction_worker_dark_skin_tone": "👷🏿\u200d♀️",
+2441	    "woman_construction_worker_light_skin_tone": "👷🏻\u200d♀️",
+2442	    "woman_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♀️",
+2443	    "woman_construction_worker_medium-light_skin_tone": "👷🏼\u200d♀️",
+2444	    "woman_construction_worker_medium_skin_tone": "👷🏽\u200d♀️",
+2445	    "woman_cook": "👩\u200d🍳",
+2446	    "woman_cook_dark_skin_tone": "👩🏿\u200d🍳",
+2447	    "woman_cook_light_skin_tone": "👩🏻\u200d🍳",
+2448	    "woman_cook_medium-dark_skin_tone": "👩🏾\u200d🍳",
+2449	    "woman_cook_medium-light_skin_tone": "👩🏼\u200d🍳",
+2450	    "woman_cook_medium_skin_tone": "👩🏽\u200d🍳",
+2451	    "woman_dancing": "💃",
+2452	    "woman_dancing_dark_skin_tone": "💃🏿",
+2453	    "woman_dancing_light_skin_tone": "💃🏻",
+2454	    "woman_dancing_medium-dark_skin_tone": "💃🏾",
+2455	    "woman_dancing_medium-light_skin_tone": "💃🏼",
+2456	    "woman_dancing_medium_skin_tone": "💃🏽",
+2457	    "woman_dark_skin_tone": "👩🏿",
+2458	    "woman_detective": "🕵️\u200d♀️",
+2459	    "woman_detective_dark_skin_tone": "🕵🏿\u200d♀️",
+2460	    "woman_detective_light_skin_tone": "🕵🏻\u200d♀️",
+2461	    "woman_detective_medium-dark_skin_tone": "🕵🏾\u200d♀️",
+2462	    "woman_detective_medium-light_skin_tone": "🕵🏼\u200d♀️",
+2463	    "woman_detective_medium_skin_tone": "🕵🏽\u200d♀️",
+2464	    "woman_elf": "🧝\u200d♀️",
+2465	    "woman_elf_dark_skin_tone": "🧝🏿\u200d♀️",
+2466	    "woman_elf_light_skin_tone": "🧝🏻\u200d♀️",
+2467	    "woman_elf_medium-dark_skin_tone": "🧝🏾\u200d♀️",
+2468	    "woman_elf_medium-light_skin_tone": "🧝🏼\u200d♀️",
+2469	    "woman_elf_medium_skin_tone": "🧝🏽\u200d♀️",
+2470	    "woman_facepalming": "🤦\u200d♀️",
+2471	    "woman_facepalming_dark_skin_tone": "🤦🏿\u200d♀️",
+2472	    "woman_facepalming_light_skin_tone": "🤦🏻\u200d♀️",
+2473	    "woman_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♀️",
+2474	    "woman_facepalming_medium-light_skin_tone": "🤦🏼\u200d♀️",
+2475	    "woman_facepalming_medium_skin_tone": "🤦🏽\u200d♀️",
+2476	    "woman_factory_worker": "👩\u200d🏭",
+2477	    "woman_factory_worker_dark_skin_tone": "👩🏿\u200d🏭",
+2478	    "woman_factory_worker_light_skin_tone": "👩🏻\u200d🏭",
+2479	    "woman_factory_worker_medium-dark_skin_tone": "👩🏾\u200d🏭",
+2480	    "woman_factory_worker_medium-light_skin_tone": "👩🏼\u200d🏭",
+2481	    "woman_factory_worker_medium_skin_tone": "👩🏽\u200d🏭",
+2482	    "woman_fairy": "🧚\u200d♀️",
+2483	    "woman_fairy_dark_skin_tone": "🧚🏿\u200d♀️",
+2484	    "woman_fairy_light_skin_tone": "🧚🏻\u200d♀️",
+2485	    "woman_fairy_medium-dark_skin_tone": "🧚🏾\u200d♀️",
+2486	    "woman_fairy_medium-light_skin_tone": "🧚🏼\u200d♀️",
+2487	    "woman_fairy_medium_skin_tone": "🧚🏽\u200d♀️",
+2488	    "woman_farmer": "👩\u200d🌾",
+2489	    "woman_farmer_dark_skin_tone": "👩🏿\u200d🌾",
+2490	    "woman_farmer_light_skin_tone": "👩🏻\u200d🌾",
+2491	    "woman_farmer_medium-dark_skin_tone": "👩🏾\u200d🌾",
+2492	    "woman_farmer_medium-light_skin_tone": "👩🏼\u200d🌾",
+2493	    "woman_farmer_medium_skin_tone": "👩🏽\u200d🌾",
+2494	    "woman_firefighter": "👩\u200d🚒",
+2495	    "woman_firefighter_dark_skin_tone": "👩🏿\u200d🚒",
+2496	    "woman_firefighter_light_skin_tone": "👩🏻\u200d🚒",
+2497	    "woman_firefighter_medium-dark_skin_tone": "👩🏾\u200d🚒",
+2498	    "woman_firefighter_medium-light_skin_tone": "👩🏼\u200d🚒",
+2499	    "woman_firefighter_medium_skin_tone": "👩🏽\u200d🚒",
+2500	    "woman_frowning": "🙍\u200d♀️",
+2501	    "woman_frowning_dark_skin_tone": "🙍🏿\u200d♀️",
+2502	    "woman_frowning_light_skin_tone": "🙍🏻\u200d♀️",
+2503	    "woman_frowning_medium-dark_skin_tone": "🙍🏾\u200d♀️",
+2504	    "woman_frowning_medium-light_skin_tone": "🙍🏼\u200d♀️",
+2505	    "woman_frowning_medium_skin_tone": "🙍🏽\u200d♀️",
+2506	    "woman_genie": "🧞\u200d♀️",
+2507	    "woman_gesturing_no": "🙅\u200d♀️",
+2508	    "woman_gesturing_no_dark_skin_tone": "🙅🏿\u200d♀️",
+2509	    "woman_gesturing_no_light_skin_tone": "🙅🏻\u200d♀️",
+2510	    "woman_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♀️",
+2511	    "woman_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♀️",
+2512	    "woman_gesturing_no_medium_skin_tone": "🙅🏽\u200d♀️",
+2513	    "woman_gesturing_ok": "🙆\u200d♀️",
+2514	    "woman_gesturing_ok_dark_skin_tone": "🙆🏿\u200d♀️",
+2515	    "woman_gesturing_ok_light_skin_tone": "🙆🏻\u200d♀️",
+2516	    "woman_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♀️",
+2517	    "woman_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♀️",
+2518	    "woman_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♀️",
+2519	    "woman_getting_haircut": "💇\u200d♀️",
+2520	    "woman_getting_haircut_dark_skin_tone": "💇🏿\u200d♀️",
+2521	    "woman_getting_haircut_light_skin_tone": "💇🏻\u200d♀️",
+2522	    "woman_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♀️",
+2523	    "woman_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♀️",
+2524	    "woman_getting_haircut_medium_skin_tone": "💇🏽\u200d♀️",
+2525	    "woman_getting_massage": "💆\u200d♀️",
+2526	    "woman_getting_massage_dark_skin_tone": "💆🏿\u200d♀️",
+2527	    "woman_getting_massage_light_skin_tone": "💆🏻\u200d♀️",
+2528	    "woman_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♀️",
+2529	    "woman_getting_massage_medium-light_skin_tone": "💆🏼\u200d♀️",
+2530	    "woman_getting_massage_medium_skin_tone": "💆🏽\u200d♀️",
+2531	    "woman_golfing": "🏌️\u200d♀️",
+2532	    "woman_golfing_dark_skin_tone": "🏌🏿\u200d♀️",
+2533	    "woman_golfing_light_skin_tone": "🏌🏻\u200d♀️",
+2534	    "woman_golfing_medium-dark_skin_tone": "🏌🏾\u200d♀️",
+2535	    "woman_golfing_medium-light_skin_tone": "🏌🏼\u200d♀️",
+2536	    "woman_golfing_medium_skin_tone": "🏌🏽\u200d♀️",
+2537	    "woman_guard": "💂\u200d♀️",
+2538	    "woman_guard_dark_skin_tone": "💂🏿\u200d♀️",
+2539	    "woman_guard_light_skin_tone": "💂🏻\u200d♀️",
+2540	    "woman_guard_medium-dark_skin_tone": "💂🏾\u200d♀️",
+2541	    "woman_guard_medium-light_skin_tone": "💂🏼\u200d♀️",
+2542	    "woman_guard_medium_skin_tone": "💂🏽\u200d♀️",
+2543	    "woman_health_worker": "👩\u200d⚕️",
+2544	    "woman_health_worker_dark_skin_tone": "👩🏿\u200d⚕️",
+2545	    "woman_health_worker_light_skin_tone": "👩🏻\u200d⚕️",
+2546	    "woman_health_worker_medium-dark_skin_tone": "👩🏾\u200d⚕️",
+2547	    "woman_health_worker_medium-light_skin_tone": "👩🏼\u200d⚕️",
+2548	    "woman_health_worker_medium_skin_tone": "👩🏽\u200d⚕️",
+2549	    "woman_in_lotus_position": "🧘\u200d♀️",
+2550	    "woman_in_lotus_position_dark_skin_tone": "🧘🏿\u200d♀️",
+2551	    "woman_in_lotus_position_light_skin_tone": "🧘🏻\u200d♀️",
+2552	    "woman_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♀️",
+2553	    "woman_in_lotus_position_medium-light_skin_tone": "🧘🏼\u200d♀️",
+2554	    "woman_in_lotus_position_medium_skin_tone": "🧘🏽\u200d♀️",
+2555	    "woman_in_manual_wheelchair": "👩\u200d🦽",
+2556	    "woman_in_motorized_wheelchair": "👩\u200d🦼",
+2557	    "woman_in_steamy_room": "🧖\u200d♀️",
+2558	    "woman_in_steamy_room_dark_skin_tone": "🧖🏿\u200d♀️",
+2559	    "woman_in_steamy_room_light_skin_tone": "🧖🏻\u200d♀️",
+2560	    "woman_in_steamy_room_medium-dark_skin_tone": "🧖🏾\u200d♀️",
+2561	    "woman_in_steamy_room_medium-light_skin_tone": "🧖🏼\u200d♀️",
+2562	    "woman_in_steamy_room_medium_skin_tone": "🧖🏽\u200d♀️",
+2563	    "woman_judge": "👩\u200d⚖️",
+2564	    "woman_judge_dark_skin_tone": "👩🏿\u200d⚖️",
+2565	    "woman_judge_light_skin_tone": "👩🏻\u200d⚖️",
+2566	    "woman_judge_medium-dark_skin_tone": "👩🏾\u200d⚖️",
+2567	    "woman_judge_medium-light_skin_tone": "👩🏼\u200d⚖️",
+2568	    "woman_judge_medium_skin_tone": "👩🏽\u200d⚖️",
+2569	    "woman_juggling": "🤹\u200d♀️",
+2570	    "woman_juggling_dark_skin_tone": "🤹🏿\u200d♀️",
+2571	    "woman_juggling_light_skin_tone": "🤹🏻\u200d♀️",
+2572	    "woman_juggling_medium-dark_skin_tone": "🤹🏾\u200d♀️",
+2573	    "woman_juggling_medium-light_skin_tone": "🤹🏼\u200d♀️",
+2574	    "woman_juggling_medium_skin_tone": "🤹🏽\u200d♀️",
+2575	    "woman_lifting_weights": "🏋️\u200d♀️",
+2576	    "woman_lifting_weights_dark_skin_tone": "🏋🏿\u200d♀️",
+2577	    "woman_lifting_weights_light_skin_tone": "🏋🏻\u200d♀️",
+2578	    "woman_lifting_weights_medium-dark_skin_tone": "🏋🏾\u200d♀️",
+2579	    "woman_lifting_weights_medium-light_skin_tone": "🏋🏼\u200d♀️",
+2580	    "woman_lifting_weights_medium_skin_tone": "🏋🏽\u200d♀️",
+2581	    "woman_light_skin_tone": "👩🏻",
+2582	    "woman_mage": "🧙\u200d♀️",
+2583	    "woman_mage_dark_skin_tone": "🧙🏿\u200d♀️",
+2584	    "woman_mage_light_skin_tone": "🧙🏻\u200d♀️",
+2585	    "woman_mage_medium-dark_skin_tone": "🧙🏾\u200d♀️",
+2586	    "woman_mage_medium-light_skin_tone": "🧙🏼\u200d♀️",
+2587	    "woman_mage_medium_skin_tone": "🧙🏽\u200d♀️",
+2588	    "woman_mechanic": "👩\u200d🔧",
+2589	    "woman_mechanic_dark_skin_tone": "👩🏿\u200d🔧",
+2590	    "woman_mechanic_light_skin_tone": "👩🏻\u200d🔧",
+2591	    "woman_mechanic_medium-dark_skin_tone": "👩🏾\u200d🔧",
+2592	    "woman_mechanic_medium-light_skin_tone": "👩🏼\u200d🔧",
+2593	    "woman_mechanic_medium_skin_tone": "👩🏽\u200d🔧",
+2594	    "woman_medium-dark_skin_tone": "👩🏾",
+2595	    "woman_medium-light_skin_tone": "👩🏼",
+2596	    "woman_medium_skin_tone": "👩🏽",
+2597	    "woman_mountain_biking": "🚵\u200d♀️",
+2598	    "woman_mountain_biking_dark_skin_tone": "🚵🏿\u200d♀️",
+2599	    "woman_mountain_biking_light_skin_tone": "🚵🏻\u200d♀️",
+2600	    "woman_mountain_biking_medium-dark_skin_tone": "🚵🏾\u200d♀️",
+2601	    "woman_mountain_biking_medium-light_skin_tone": "🚵🏼\u200d♀️",
+2602	    "woman_mountain_biking_medium_skin_tone": "🚵🏽\u200d♀️",
+2603	    "woman_office_worker": "👩\u200d💼",
+2604	    "woman_office_worker_dark_skin_tone": "👩🏿\u200d💼",
+2605	    "woman_office_worker_light_skin_tone": "👩🏻\u200d💼",
+2606	    "woman_office_worker_medium-dark_skin_tone": "👩🏾\u200d💼",
+2607	    "woman_office_worker_medium-light_skin_tone": "👩🏼\u200d💼",
+2608	    "woman_office_worker_medium_skin_tone": "👩🏽\u200d💼",
+2609	    "woman_pilot": "👩\u200d✈️",
+2610	    "woman_pilot_dark_skin_tone": "👩🏿\u200d✈️",
+2611	    "woman_pilot_light_skin_tone": "👩🏻\u200d✈️",
+2612	    "woman_pilot_medium-dark_skin_tone": "👩🏾\u200d✈️",
+2613	    "woman_pilot_medium-light_skin_tone": "👩🏼\u200d✈️",
+2614	    "woman_pilot_medium_skin_tone": "👩🏽\u200d✈️",
+2615	    "woman_playing_handball": "🤾\u200d♀️",
+2616	    "woman_playing_handball_dark_skin_tone": "🤾🏿\u200d♀️",
+2617	    "woman_playing_handball_light_skin_tone": "🤾🏻\u200d♀️",
+2618	    "woman_playing_handball_medium-dark_skin_tone": "🤾🏾\u200d♀️",
+2619	    "woman_playing_handball_medium-light_skin_tone": "🤾🏼\u200d♀️",
+2620	    "woman_playing_handball_medium_skin_tone": "🤾🏽\u200d♀️",
+2621	    "woman_playing_water_polo": "🤽\u200d♀️",
+2622	    "woman_playing_water_polo_dark_skin_tone": "🤽🏿\u200d♀️",
+2623	    "woman_playing_water_polo_light_skin_tone": "🤽🏻\u200d♀️",
+2624	    "woman_playing_water_polo_medium-dark_skin_tone": "🤽🏾\u200d♀️",
+2625	    "woman_playing_water_polo_medium-light_skin_tone": "🤽🏼\u200d♀️",
+2626	    "woman_playing_water_polo_medium_skin_tone": "🤽🏽\u200d♀️",
+2627	    "woman_police_officer": "👮\u200d♀️",
+2628	    "woman_police_officer_dark_skin_tone": "👮🏿\u200d♀️",
+2629	    "woman_police_officer_light_skin_tone": "👮🏻\u200d♀️",
+2630	    "woman_police_officer_medium-dark_skin_tone": "👮🏾\u200d♀️",
+2631	    "woman_police_officer_medium-light_skin_tone": "👮🏼\u200d♀️",
+2632	    "woman_police_officer_medium_skin_tone": "👮🏽\u200d♀️",
+2633	    "woman_pouting": "🙎\u200d♀️",
+2634	    "woman_pouting_dark_skin_tone": "🙎🏿\u200d♀️",
+2635	    "woman_pouting_light_skin_tone": "🙎🏻\u200d♀️",
+2636	    "woman_pouting_medium-dark_skin_tone": "🙎🏾\u200d♀️",
+2637	    "woman_pouting_medium-light_skin_tone": "🙎🏼\u200d♀️",
+2638	    "woman_pouting_medium_skin_tone": "🙎🏽\u200d♀️",
+2639	    "woman_raising_hand": "🙋\u200d♀️",
+2640	    "woman_raising_hand_dark_skin_tone": "🙋🏿\u200d♀️",
+2641	    "woman_raising_hand_light_skin_tone": "🙋🏻\u200d♀️",
+2642	    "woman_raising_hand_medium-dark_skin_tone": "🙋🏾\u200d♀️",
+2643	    "woman_raising_hand_medium-light_skin_tone": "🙋🏼\u200d♀️",
+2644	    "woman_raising_hand_medium_skin_tone": "🙋🏽\u200d♀️",
+2645	    "woman_rowing_boat": "🚣\u200d♀️",
+2646	    "woman_rowing_boat_dark_skin_tone": "🚣🏿\u200d♀️",
+2647	    "woman_rowing_boat_light_skin_tone": "🚣🏻\u200d♀️",
+2648	    "woman_rowing_boat_medium-dark_skin_tone": "🚣🏾\u200d♀️",
+2649	    "woman_rowing_boat_medium-light_skin_tone": "🚣🏼\u200d♀️",
+2650	    "woman_rowing_boat_medium_skin_tone": "🚣🏽\u200d♀️",
+2651	    "woman_running": "🏃\u200d♀️",
+2652	    "woman_running_dark_skin_tone": "🏃🏿\u200d♀️",
+2653	    "woman_running_light_skin_tone": "🏃🏻\u200d♀️",
+2654	    "woman_running_medium-dark_skin_tone": "🏃🏾\u200d♀️",
+2655	    "woman_running_medium-light_skin_tone": "🏃🏼\u200d♀️",
+2656	    "woman_running_medium_skin_tone": "🏃🏽\u200d♀️",
+2657	    "woman_scientist": "👩\u200d🔬",
+2658	    "woman_scientist_dark_skin_tone": "👩🏿\u200d🔬",
+2659	    "woman_scientist_light_skin_tone": "👩🏻\u200d🔬",
+2660	    "woman_scientist_medium-dark_skin_tone": "👩🏾\u200d🔬",
+2661	    "woman_scientist_medium-light_skin_tone": "👩🏼\u200d🔬",
+2662	    "woman_scientist_medium_skin_tone": "👩🏽\u200d🔬",
+2663	    "woman_shrugging": "🤷\u200d♀️",
+2664	    "woman_shrugging_dark_skin_tone": "🤷🏿\u200d♀️",
+2665	    "woman_shrugging_light_skin_tone": "🤷🏻\u200d♀️",
+2666	    "woman_shrugging_medium-dark_skin_tone": "🤷🏾\u200d♀️",
+2667	    "woman_shrugging_medium-light_skin_tone": "🤷🏼\u200d♀️",
+2668	    "woman_shrugging_medium_skin_tone": "🤷🏽\u200d♀️",
+2669	    "woman_singer": "👩\u200d🎤",
+2670	    "woman_singer_dark_skin_tone": "👩🏿\u200d🎤",
+2671	    "woman_singer_light_skin_tone": "👩🏻\u200d🎤",
+2672	    "woman_singer_medium-dark_skin_tone": "👩🏾\u200d🎤",
+2673	    "woman_singer_medium-light_skin_tone": "👩🏼\u200d🎤",
+2674	    "woman_singer_medium_skin_tone": "👩🏽\u200d🎤",
+2675	    "woman_student": "👩\u200d🎓",
+2676	    "woman_student_dark_skin_tone": "👩🏿\u200d🎓",
+2677	    "woman_student_light_skin_tone": "👩🏻\u200d🎓",
+2678	    "woman_student_medium-dark_skin_tone": "👩🏾\u200d🎓",
+2679	    "woman_student_medium-light_skin_tone": "👩🏼\u200d🎓",
+2680	    "woman_student_medium_skin_tone": "👩🏽\u200d🎓",
+2681	    "woman_surfing": "🏄\u200d♀️",
+2682	    "woman_surfing_dark_skin_tone": "🏄🏿\u200d♀️",
+2683	    "woman_surfing_light_skin_tone": "🏄🏻\u200d♀️",
+2684	    "woman_surfing_medium-dark_skin_tone": "🏄🏾\u200d♀️",
+2685	    "woman_surfing_medium-light_skin_tone": "🏄🏼\u200d♀️",
+2686	    "woman_surfing_medium_skin_tone": "🏄🏽\u200d♀️",
+2687	    "woman_swimming": "🏊\u200d♀️",
+2688	    "woman_swimming_dark_skin_tone": "🏊🏿\u200d♀️",
+2689	    "woman_swimming_light_skin_tone": "🏊🏻\u200d♀️",
+2690	    "woman_swimming_medium-dark_skin_tone": "🏊🏾\u200d♀️",
+2691	    "woman_swimming_medium-light_skin_tone": "🏊🏼\u200d♀️",
+2692	    "woman_swimming_medium_skin_tone": "🏊🏽\u200d♀️",
+2693	    "woman_teacher": "👩\u200d🏫",
+2694	    "woman_teacher_dark_skin_tone": "👩🏿\u200d🏫",
+2695	    "woman_teacher_light_skin_tone": "👩🏻\u200d🏫",
+2696	    "woman_teacher_medium-dark_skin_tone": "👩🏾\u200d🏫",
+2697	    "woman_teacher_medium-light_skin_tone": "👩🏼\u200d🏫",
+2698	    "woman_teacher_medium_skin_tone": "👩🏽\u200d🏫",
+2699	    "woman_technologist": "👩\u200d💻",
+2700	    "woman_technologist_dark_skin_tone": "👩🏿\u200d💻",
+2701	    "woman_technologist_light_skin_tone": "👩🏻\u200d💻",
+2702	    "woman_technologist_medium-dark_skin_tone": "👩🏾\u200d💻",
+2703	    "woman_technologist_medium-light_skin_tone": "👩🏼\u200d💻",
+2704	    "woman_technologist_medium_skin_tone": "👩🏽\u200d💻",
+2705	    "woman_tipping_hand": "💁\u200d♀️",
+2706	    "woman_tipping_hand_dark_skin_tone": "💁🏿\u200d♀️",
+2707	    "woman_tipping_hand_light_skin_tone": "💁🏻\u200d♀️",
+2708	    "woman_tipping_hand_medium-dark_skin_tone": "💁🏾\u200d♀️",
+2709	    "woman_tipping_hand_medium-light_skin_tone": "💁🏼\u200d♀️",
+2710	    "woman_tipping_hand_medium_skin_tone": "💁🏽\u200d♀️",
+2711	    "woman_vampire": "🧛\u200d♀️",
+2712	    "woman_vampire_dark_skin_tone": "🧛🏿\u200d♀️",
+2713	    "woman_vampire_light_skin_tone": "🧛🏻\u200d♀️",
+2714	    "woman_vampire_medium-dark_skin_tone": "🧛🏾\u200d♀️",
+2715	    "woman_vampire_medium-light_skin_tone": "🧛🏼\u200d♀️",
+2716	    "woman_vampire_medium_skin_tone": "🧛🏽\u200d♀️",
+2717	    "woman_walking": "🚶\u200d♀️",
+2718	    "woman_walking_dark_skin_tone": "🚶🏿\u200d♀️",
+2719	    "woman_walking_light_skin_tone": "🚶🏻\u200d♀️",
+2720	    "woman_walking_medium-dark_skin_tone": "🚶🏾\u200d♀️",
+2721	    "woman_walking_medium-light_skin_tone": "🚶🏼\u200d♀️",
+2722	    "woman_walking_medium_skin_tone": "🚶🏽\u200d♀️",
+2723	    "woman_wearing_turban": "👳\u200d♀️",
+2724	    "woman_wearing_turban_dark_skin_tone": "👳🏿\u200d♀️",
+2725	    "woman_wearing_turban_light_skin_tone": "👳🏻\u200d♀️",
+2726	    "woman_wearing_turban_medium-dark_skin_tone": "👳🏾\u200d♀️",
+2727	    "woman_wearing_turban_medium-light_skin_tone": "👳🏼\u200d♀️",
+2728	    "woman_wearing_turban_medium_skin_tone": "👳🏽\u200d♀️",
+2729	    "woman_with_headscarf": "🧕",
+2730	    "woman_with_headscarf_dark_skin_tone": "🧕🏿",
+2731	    "woman_with_headscarf_light_skin_tone": "🧕🏻",
+2732	    "woman_with_headscarf_medium-dark_skin_tone": "🧕🏾",
+2733	    "woman_with_headscarf_medium-light_skin_tone": "🧕🏼",
+2734	    "woman_with_headscarf_medium_skin_tone": "🧕🏽",
+2735	    "woman_with_probing_cane": "👩\u200d🦯",
+2736	    "woman_zombie": "🧟\u200d♀️",
+2737	    "woman’s_boot": "👢",
+2738	    "woman’s_clothes": "👚",
+2739	    "woman’s_hat": "👒",
+2740	    "woman’s_sandal": "👡",
+2741	    "women_with_bunny_ears": "👯\u200d♀️",
+2742	    "women_wrestling": "🤼\u200d♀️",
+2743	    "women’s_room": "🚺",
+2744	    "woozy_face": "🥴",
+2745	    "world_map": "🗺",
+2746	    "worried_face": "😟",
+2747	    "wrapped_gift": "🎁",
+2748	    "wrench": "🔧",
+2749	    "writing_hand": "✍",
+2750	    "writing_hand_dark_skin_tone": "✍🏿",
+2751	    "writing_hand_light_skin_tone": "✍🏻",
+2752	    "writing_hand_medium-dark_skin_tone": "✍🏾",
+2753	    "writing_hand_medium-light_skin_tone": "✍🏼",
+2754	    "writing_hand_medium_skin_tone": "✍🏽",
+2755	    "yarn": "🧶",
+2756	    "yawning_face": "🥱",
+2757	    "yellow_circle": "🟡",
+2758	    "yellow_heart": "💛",
+2759	    "yellow_square": "🟨",
+2760	    "yen_banknote": "💴",
+2761	    "yo-yo": "🪀",
+2762	    "yin_yang": "☯",
+2763	    "zany_face": "🤪",
+2764	    "zebra": "🦓",
+2765	    "zipper-mouth_face": "🤐",
+2766	    "zombie": "🧟",
+2767	    "zzz": "💤",
+2768	    "åland_islands": "🇦🇽",
+2769	    "keycap_asterisk": "*⃣",
+2770	    "keycap_digit_eight": "8⃣",
+2771	    "keycap_digit_five": "5⃣",
+2772	    "keycap_digit_four": "4⃣",
+2773	    "keycap_digit_nine": "9⃣",
+2774	    "keycap_digit_one": "1⃣",
+2775	    "keycap_digit_seven": "7⃣",
+2776	    "keycap_digit_six": "6⃣",
+2777	    "keycap_digit_three": "3⃣",
+2778	    "keycap_digit_two": "2⃣",
+2779	    "keycap_digit_zero": "0⃣",
+2780	    "keycap_number_sign": "#⃣",
+2781	    "light_skin_tone": "🏻",
+2782	    "medium_light_skin_tone": "🏼",
+2783	    "medium_skin_tone": "🏽",
+2784	    "medium_dark_skin_tone": "🏾",
+2785	    "dark_skin_tone": "🏿",
+2786	    "regional_indicator_symbol_letter_a": "🇦",
+2787	    "regional_indicator_symbol_letter_b": "🇧",
+2788	    "regional_indicator_symbol_letter_c": "🇨",
+2789	    "regional_indicator_symbol_letter_d": "🇩",
+2790	    "regional_indicator_symbol_letter_e": "🇪",
+2791	    "regional_indicator_symbol_letter_f": "🇫",
+2792	    "regional_indicator_symbol_letter_g": "🇬",
+2793	    "regional_indicator_symbol_letter_h": "🇭",
+2794	    "regional_indicator_symbol_letter_i": "🇮",
+2795	    "regional_indicator_symbol_letter_j": "🇯",
+2796	    "regional_indicator_symbol_letter_k": "🇰",
+2797	    "regional_indicator_symbol_letter_l": "🇱",
+2798	    "regional_indicator_symbol_letter_m": "🇲",
+2799	    "regional_indicator_symbol_letter_n": "🇳",
+2800	    "regional_indicator_symbol_letter_o": "🇴",
+2801	    "regional_indicator_symbol_letter_p": "🇵",
+2802	    "regional_indicator_symbol_letter_q": "🇶",
+2803	    "regional_indicator_symbol_letter_r": "🇷",
+2804	    "regional_indicator_symbol_letter_s": "🇸",
+2805	    "regional_indicator_symbol_letter_t": "🇹",
+2806	    "regional_indicator_symbol_letter_u": "🇺",
+2807	    "regional_indicator_symbol_letter_v": "🇻",
+2808	    "regional_indicator_symbol_letter_w": "🇼",
+2809	    "regional_indicator_symbol_letter_x": "🇽",
+2810	    "regional_indicator_symbol_letter_y": "🇾",
+2811	    "regional_indicator_symbol_letter_z": "🇿",
+2812	    "airplane_arriving": "🛬",
+2813	    "space_invader": "👾",
+2814	    "football": "🏈",
+2815	    "anger": "💢",
+2816	    "angry": "😠",
+2817	    "anguished": "😧",
+2818	    "signal_strength": "📶",
+2819	    "arrows_counterclockwise": "🔄",
+2820	    "arrow_heading_down": "⤵",
+2821	    "arrow_heading_up": "⤴",
+2822	    "art": "🎨",
+2823	    "astonished": "😲",
+2824	    "athletic_shoe": "👟",
+2825	    "atm": "🏧",
+2826	    "car": "🚗",
+2827	    "red_car": "🚗",
+2828	    "angel": "👼",
+2829	    "back": "🔙",
+2830	    "badminton_racquet_and_shuttlecock": "🏸",
+2831	    "dollar": "💵",
+2832	    "euro": "💶",
+2833	    "pound": "💷",
+2834	    "yen": "💴",
+2835	    "barber": "💈",
+2836	    "bath": "🛀",
+2837	    "bear": "🐻",
+2838	    "heartbeat": "💓",
+2839	    "beer": "🍺",
+2840	    "no_bell": "🔕",
+2841	    "bento": "🍱",
+2842	    "bike": "🚲",
+2843	    "bicyclist": "🚴",
+2844	    "8ball": "🎱",
+2845	    "biohazard_sign": "☣",
+2846	    "birthday": "🎂",
+2847	    "black_circle_for_record": "⏺",
+2848	    "clubs": "♣",
+2849	    "diamonds": "♦",
+2850	    "arrow_double_down": "⏬",
+2851	    "hearts": "♥",
+2852	    "rewind": "⏪",
+2853	    "black_left__pointing_double_triangle_with_vertical_bar": "⏮",
+2854	    "arrow_backward": "◀",
+2855	    "black_medium_small_square": "◾",
+2856	    "question": "❓",
+2857	    "fast_forward": "⏩",
+2858	    "black_right__pointing_double_triangle_with_vertical_bar": "⏭",
+2859	    "arrow_forward": "▶",
+2860	    "black_right__pointing_triangle_with_double_vertical_bar": "⏯",
+2861	    "arrow_right": "➡",
+2862	    "spades": "♠",
+2863	    "black_square_for_stop": "⏹",
+2864	    "sunny": "☀",
+2865	    "phone": "☎",
+2866	    "recycle": "♻",
+2867	    "arrow_double_up": "⏫",
+2868	    "busstop": "🚏",
+2869	    "date": "📅",
+2870	    "flags": "🎏",
+2871	    "cat2": "🐈",
+2872	    "joy_cat": "😹",
+2873	    "smirk_cat": "😼",
+2874	    "chart_with_downwards_trend": "📉",
+2875	    "chart_with_upwards_trend": "📈",
+2876	    "chart": "💹",
+2877	    "mega": "📣",
+2878	    "checkered_flag": "🏁",
+2879	    "accept": "🉑",
+2880	    "ideograph_advantage": "🉐",
+2881	    "congratulations": "㊗",
+2882	    "secret": "㊙",
+2883	    "m": "Ⓜ",
+2884	    "city_sunset": "🌆",
+2885	    "clapper": "🎬",
+2886	    "clap": "👏",
+2887	    "beers": "🍻",
+2888	    "clock830": "🕣",
+2889	    "clock8": "🕗",
+2890	    "clock1130": "🕦",
+2891	    "clock11": "🕚",
+2892	    "clock530": "🕠",
+2893	    "clock5": "🕔",
+2894	    "clock430": "🕟",
+2895	    "clock4": "🕓",
+2896	    "clock930": "🕤",
+2897	    "clock9": "🕘",
+2898	    "clock130": "🕜",
+2899	    "clock1": "🕐",
+2900	    "clock730": "🕢",
+2901	    "clock7": "🕖",
+2902	    "clock630": "🕡",
+2903	    "clock6": "🕕",
+2904	    "clock1030": "🕥",
+2905	    "clock10": "🕙",
+2906	    "clock330": "🕞",
+2907	    "clock3": "🕒",
+2908	    "clock1230": "🕧",
+2909	    "clock12": "🕛",
+2910	    "clock230": "🕝",
+2911	    "clock2": "🕑",
+2912	    "arrows_clockwise": "🔃",
+2913	    "repeat": "🔁",
+2914	    "repeat_one": "🔂",
+2915	    "closed_lock_with_key": "🔐",
+2916	    "mailbox_closed": "📪",
+2917	    "mailbox": "📫",
+2918	    "cloud_with_tornado": "🌪",
+2919	    "cocktail": "🍸",
+2920	    "boom": "💥",
+2921	    "compression": "🗜",
+2922	    "confounded": "😖",
+2923	    "confused": "😕",
+2924	    "rice": "🍚",
+2925	    "cow2": "🐄",
+2926	    "cricket_bat_and_ball": "🏏",
+2927	    "x": "❌",
+2928	    "cry": "😢",
+2929	    "curry": "🍛",
+2930	    "dagger_knife": "🗡",
+2931	    "dancer": "💃",
+2932	    "dark_sunglasses": "🕶",
+2933	    "dash": "💨",
+2934	    "truck": "🚚",
+2935	    "derelict_house_building": "🏚",
+2936	    "diamond_shape_with_a_dot_inside": "💠",
+2937	    "dart": "🎯",
+2938	    "disappointed_relieved": "😥",
+2939	    "disappointed": "😞",
+2940	    "do_not_litter": "🚯",
+2941	    "dog2": "🐕",
+2942	    "flipper": "🐬",
+2943	    "loop": "➿",
+2944	    "bangbang": "‼",
+2945	    "double_vertical_bar": "⏸",
+2946	    "dove_of_peace": "🕊",
+2947	    "small_red_triangle_down": "🔻",
+2948	    "arrow_down_small": "🔽",
+2949	    "arrow_down": "⬇",
+2950	    "dromedary_camel": "🐪",
+2951	    "e__mail": "📧",
+2952	    "corn": "🌽",
+2953	    "ear_of_rice": "🌾",
+2954	    "earth_americas": "🌎",
+2955	    "earth_asia": "🌏",
+2956	    "earth_africa": "🌍",
+2957	    "eight_pointed_black_star": "✴",
+2958	    "eight_spoked_asterisk": "✳",
+2959	    "eject_symbol": "⏏",
+2960	    "bulb": "💡",
+2961	    "emoji_modifier_fitzpatrick_type__1__2": "🏻",
+2962	    "emoji_modifier_fitzpatrick_type__3": "🏼",
+2963	    "emoji_modifier_fitzpatrick_type__4": "🏽",
+2964	    "emoji_modifier_fitzpatrick_type__5": "🏾",
+2965	    "emoji_modifier_fitzpatrick_type__6": "🏿",
+2966	    "end": "🔚",
+2967	    "email": "✉",
+2968	    "european_castle": "🏰",
+2969	    "european_post_office": "🏤",
+2970	    "interrobang": "⁉",
+2971	    "expressionless": "😑",
+2972	    "eyeglasses": "👓",
+2973	    "massage": "💆",
+2974	    "yum": "😋",
+2975	    "scream": "😱",
+2976	    "kissing_heart": "😘",
+2977	    "sweat": "😓",
+2978	    "face_with_head__bandage": "🤕",
+2979	    "triumph": "😤",
+2980	    "mask": "😷",
+2981	    "no_good": "🙅",
+2982	    "ok_woman": "🙆",
+2983	    "open_mouth": "😮",
+2984	    "cold_sweat": "😰",
+2985	    "stuck_out_tongue": "😛",
+2986	    "stuck_out_tongue_closed_eyes": "😝",
+2987	    "stuck_out_tongue_winking_eye": "😜",
+2988	    "joy": "😂",
+2989	    "no_mouth": "😶",
+2990	    "santa": "🎅",
+2991	    "fax": "📠",
+2992	    "fearful": "😨",
+2993	    "field_hockey_stick_and_ball": "🏑",
+2994	    "first_quarter_moon_with_face": "🌛",
+2995	    "fish_cake": "🍥",
+2996	    "fishing_pole_and_fish": "🎣",
+2997	    "facepunch": "👊",
+2998	    "punch": "👊",
+2999	    "flag_for_afghanistan": "🇦🇫",
+3000	    "flag_for_albania": "🇦🇱",
+3001	    "flag_for_algeria": "🇩🇿",
+3002	    "flag_for_american_samoa": "🇦🇸",
+3003	    "flag_for_andorra": "🇦🇩",
+3004	    "flag_for_angola": "🇦🇴",
+3005	    "flag_for_anguilla": "🇦🇮",
+3006	    "flag_for_antarctica": "🇦🇶",
+3007	    "flag_for_antigua_&_barbuda": "🇦🇬",
+3008	    "flag_for_argentina": "🇦🇷",
+3009	    "flag_for_armenia": "🇦🇲",
+3010	    "flag_for_aruba": "🇦🇼",
+3011	    "flag_for_ascension_island": "🇦🇨",
+3012	    "flag_for_australia": "🇦🇺",
+3013	    "flag_for_austria": "🇦🇹",
+3014	    "flag_for_azerbaijan": "🇦🇿",
+3015	    "flag_for_bahamas": "🇧🇸",
+3016	    "flag_for_bahrain": "🇧🇭",
+3017	    "flag_for_bangladesh": "🇧🇩",
+3018	    "flag_for_barbados": "🇧🇧",
+3019	    "flag_for_belarus": "🇧🇾",
+3020	    "flag_for_belgium": "🇧🇪",
+3021	    "flag_for_belize": "🇧🇿",
+3022	    "flag_for_benin": "🇧🇯",
+3023	    "flag_for_bermuda": "🇧🇲",
+3024	    "flag_for_bhutan": "🇧🇹",
+3025	    "flag_for_bolivia": "🇧🇴",
+3026	    "flag_for_bosnia_&_herzegovina": "🇧🇦",
+3027	    "flag_for_botswana": "🇧🇼",
+3028	    "flag_for_bouvet_island": "🇧🇻",
+3029	    "flag_for_brazil": "🇧🇷",
+3030	    "flag_for_british_indian_ocean_territory": "🇮🇴",
+3031	    "flag_for_british_virgin_islands": "🇻🇬",
+3032	    "flag_for_brunei": "🇧🇳",
+3033	    "flag_for_bulgaria": "🇧🇬",
+3034	    "flag_for_burkina_faso": "🇧🇫",
+3035	    "flag_for_burundi": "🇧🇮",
+3036	    "flag_for_cambodia": "🇰🇭",
+3037	    "flag_for_cameroon": "🇨🇲",
+3038	    "flag_for_canada": "🇨🇦",
+3039	    "flag_for_canary_islands": "🇮🇨",
+3040	    "flag_for_cape_verde": "🇨🇻",
+3041	    "flag_for_caribbean_netherlands": "🇧🇶",
+3042	    "flag_for_cayman_islands": "🇰🇾",
+3043	    "flag_for_central_african_republic": "🇨🇫",
+3044	    "flag_for_ceuta_&_melilla": "🇪🇦",
+3045	    "flag_for_chad": "🇹🇩",
+3046	    "flag_for_chile": "🇨🇱",
+3047	    "flag_for_china": "🇨🇳",
+3048	    "flag_for_christmas_island": "🇨🇽",
+3049	    "flag_for_clipperton_island": "🇨🇵",
+3050	    "flag_for_cocos__islands": "🇨🇨",
+3051	    "flag_for_colombia": "🇨🇴",
+3052	    "flag_for_comoros": "🇰🇲",
+3053	    "flag_for_congo____brazzaville": "🇨🇬",
+3054	    "flag_for_congo____kinshasa": "🇨🇩",
+3055	    "flag_for_cook_islands": "🇨🇰",
+3056	    "flag_for_costa_rica": "🇨🇷",
+3057	    "flag_for_croatia": "🇭🇷",
+3058	    "flag_for_cuba": "🇨🇺",
+3059	    "flag_for_curaçao": "🇨🇼",
+3060	    "flag_for_cyprus": "🇨🇾",
+3061	    "flag_for_czech_republic": "🇨🇿",
+3062	    "flag_for_côte_d’ivoire": "🇨🇮",
+3063	    "flag_for_denmark": "🇩🇰",
+3064	    "flag_for_diego_garcia": "🇩🇬",
+3065	    "flag_for_djibouti": "🇩🇯",
+3066	    "flag_for_dominica": "🇩🇲",
+3067	    "flag_for_dominican_republic": "🇩🇴",
+3068	    "flag_for_ecuador": "🇪🇨",
+3069	    "flag_for_egypt": "🇪🇬",
+3070	    "flag_for_el_salvador": "🇸🇻",
+3071	    "flag_for_equatorial_guinea": "🇬🇶",
+3072	    "flag_for_eritrea": "🇪🇷",
+3073	    "flag_for_estonia": "🇪🇪",
+3074	    "flag_for_ethiopia": "🇪🇹",
+3075	    "flag_for_european_union": "🇪🇺",
+3076	    "flag_for_falkland_islands": "🇫🇰",
+3077	    "flag_for_faroe_islands": "🇫🇴",
+3078	    "flag_for_fiji": "🇫🇯",
+3079	    "flag_for_finland": "🇫🇮",
+3080	    "flag_for_france": "🇫🇷",
+3081	    "flag_for_french_guiana": "🇬🇫",
+3082	    "flag_for_french_polynesia": "🇵🇫",
+3083	    "flag_for_french_southern_territories": "🇹🇫",
+3084	    "flag_for_gabon": "🇬🇦",
+3085	    "flag_for_gambia": "🇬🇲",
+3086	    "flag_for_georgia": "🇬🇪",
+3087	    "flag_for_germany": "🇩🇪",
+3088	    "flag_for_ghana": "🇬🇭",
+3089	    "flag_for_gibraltar": "🇬🇮",
+3090	    "flag_for_greece": "🇬🇷",
+3091	    "flag_for_greenland": "🇬🇱",
+3092	    "flag_for_grenada": "🇬🇩",
+3093	    "flag_for_guadeloupe": "🇬🇵",
+3094	    "flag_for_guam": "🇬🇺",
+3095	    "flag_for_guatemala": "🇬🇹",
+3096	    "flag_for_guernsey": "🇬🇬",
+3097	    "flag_for_guinea": "🇬🇳",
+3098	    "flag_for_guinea__bissau": "🇬🇼",
+3099	    "flag_for_guyana": "🇬🇾",
+3100	    "flag_for_haiti": "🇭🇹",
+3101	    "flag_for_heard_&_mcdonald_islands": "🇭🇲",
+3102	    "flag_for_honduras": "🇭🇳",
+3103	    "flag_for_hong_kong": "🇭🇰",
+3104	    "flag_for_hungary": "🇭🇺",
+3105	    "flag_for_iceland": "🇮🇸",
+3106	    "flag_for_india": "🇮🇳",
+3107	    "flag_for_indonesia": "🇮🇩",
+3108	    "flag_for_iran": "🇮🇷",
+3109	    "flag_for_iraq": "🇮🇶",
+3110	    "flag_for_ireland": "🇮🇪",
+3111	    "flag_for_isle_of_man": "🇮🇲",
+3112	    "flag_for_israel": "🇮🇱",
+3113	    "flag_for_italy": "🇮🇹",
+3114	    "flag_for_jamaica": "🇯🇲",
+3115	    "flag_for_japan": "🇯🇵",
+3116	    "flag_for_jersey": "🇯🇪",
+3117	    "flag_for_jordan": "🇯🇴",
+3118	    "flag_for_kazakhstan": "🇰🇿",
+3119	    "flag_for_kenya": "🇰🇪",
+3120	    "flag_for_kiribati": "🇰🇮",
+3121	    "flag_for_kosovo": "🇽🇰",
+3122	    "flag_for_kuwait": "🇰🇼",
+3123	    "flag_for_kyrgyzstan": "🇰🇬",
+3124	    "flag_for_laos": "🇱🇦",
+3125	    "flag_for_latvia": "🇱🇻",
+3126	    "flag_for_lebanon": "🇱🇧",
+3127	    "flag_for_lesotho": "🇱🇸",
+3128	    "flag_for_liberia": "🇱🇷",
+3129	    "flag_for_libya": "🇱🇾",
+3130	    "flag_for_liechtenstein": "🇱🇮",
+3131	    "flag_for_lithuania": "🇱🇹",
+3132	    "flag_for_luxembourg": "🇱🇺",
+3133	    "flag_for_macau": "🇲🇴",
+3134	    "flag_for_macedonia": "🇲🇰",
+3135	    "flag_for_madagascar": "🇲🇬",
+3136	    "flag_for_malawi": "🇲🇼",
+3137	    "flag_for_malaysia": "🇲🇾",
+3138	    "flag_for_maldives": "🇲🇻",
+3139	    "flag_for_mali": "🇲🇱",
+3140	    "flag_for_malta": "🇲🇹",
+3141	    "flag_for_marshall_islands": "🇲🇭",
+3142	    "flag_for_martinique": "🇲🇶",
+3143	    "flag_for_mauritania": "🇲🇷",
+3144	    "flag_for_mauritius": "🇲🇺",
+3145	    "flag_for_mayotte": "🇾🇹",
+3146	    "flag_for_mexico": "🇲🇽",
+3147	    "flag_for_micronesia": "🇫🇲",
+3148	    "flag_for_moldova": "🇲🇩",
+3149	    "flag_for_monaco": "🇲🇨",
+3150	    "flag_for_mongolia": "🇲🇳",
+3151	    "flag_for_montenegro": "🇲🇪",
+3152	    "flag_for_montserrat": "🇲🇸",
+3153	    "flag_for_morocco": "🇲🇦",
+3154	    "flag_for_mozambique": "🇲🇿",
+3155	    "flag_for_myanmar": "🇲🇲",
+3156	    "flag_for_namibia": "🇳🇦",
+3157	    "flag_for_nauru": "🇳🇷",
+3158	    "flag_for_nepal": "🇳🇵",
+3159	    "flag_for_netherlands": "🇳🇱",
+3160	    "flag_for_new_caledonia": "🇳🇨",
+3161	    "flag_for_new_zealand": "🇳🇿",
+3162	    "flag_for_nicaragua": "🇳🇮",
+3163	    "flag_for_niger": "🇳🇪",
+3164	    "flag_for_nigeria": "🇳🇬",
+3165	    "flag_for_niue": "🇳🇺",
+3166	    "flag_for_norfolk_island": "🇳🇫",
+3167	    "flag_for_north_korea": "🇰🇵",
+3168	    "flag_for_northern_mariana_islands": "🇲🇵",
+3169	    "flag_for_norway": "🇳🇴",
+3170	    "flag_for_oman": "🇴🇲",
+3171	    "flag_for_pakistan": "🇵🇰",
+3172	    "flag_for_palau": "🇵🇼",
+3173	    "flag_for_palestinian_territories": "🇵🇸",
+3174	    "flag_for_panama": "🇵🇦",
+3175	    "flag_for_papua_new_guinea": "🇵🇬",
+3176	    "flag_for_paraguay": "🇵🇾",
+3177	    "flag_for_peru": "🇵🇪",
+3178	    "flag_for_philippines": "🇵🇭",
+3179	    "flag_for_pitcairn_islands": "🇵🇳",
+3180	    "flag_for_poland": "🇵🇱",
+3181	    "flag_for_portugal": "🇵🇹",
+3182	    "flag_for_puerto_rico": "🇵🇷",
+3183	    "flag_for_qatar": "🇶🇦",
+3184	    "flag_for_romania": "🇷🇴",
+3185	    "flag_for_russia": "🇷🇺",
+3186	    "flag_for_rwanda": "🇷🇼",
+3187	    "flag_for_réunion": "🇷🇪",
+3188	    "flag_for_samoa": "🇼🇸",
+3189	    "flag_for_san_marino": "🇸🇲",
+3190	    "flag_for_saudi_arabia": "🇸🇦",
+3191	    "flag_for_senegal": "🇸🇳",
+3192	    "flag_for_serbia": "🇷🇸",
+3193	    "flag_for_seychelles": "🇸🇨",
+3194	    "flag_for_sierra_leone": "🇸🇱",
+3195	    "flag_for_singapore": "🇸🇬",
+3196	    "flag_for_sint_maarten": "🇸🇽",
+3197	    "flag_for_slovakia": "🇸🇰",
+3198	    "flag_for_slovenia": "🇸🇮",
+3199	    "flag_for_solomon_islands": "🇸🇧",
+3200	    "flag_for_somalia": "🇸🇴",
+3201	    "flag_for_south_africa": "🇿🇦",
+3202	    "flag_for_south_georgia_&_south_sandwich_islands": "🇬🇸",
+3203	    "flag_for_south_korea": "🇰🇷",
+3204	    "flag_for_south_sudan": "🇸🇸",
+3205	    "flag_for_spain": "🇪🇸",
+3206	    "flag_for_sri_lanka": "🇱🇰",
+3207	    "flag_for_st._barthélemy": "🇧🇱",
+3208	    "flag_for_st._helena": "🇸🇭",
+3209	    "flag_for_st._kitts_&_nevis": "🇰🇳",
+3210	    "flag_for_st._lucia": "🇱🇨",
+3211	    "flag_for_st._martin": "🇲🇫",
+3212	    "flag_for_st._pierre_&_miquelon": "🇵🇲",
+3213	    "flag_for_st._vincent_&_grenadines": "🇻🇨",
+3214	    "flag_for_sudan": "🇸🇩",
+3215	    "flag_for_suriname": "🇸🇷",
+3216	    "flag_for_svalbard_&_jan_mayen": "🇸🇯",
+3217	    "flag_for_swaziland": "🇸🇿",
+3218	    "flag_for_sweden": "🇸🇪",
+3219	    "flag_for_switzerland": "🇨🇭",
+3220	    "flag_for_syria": "🇸🇾",
+3221	    "flag_for_são_tomé_&_príncipe": "🇸🇹",
+3222	    "flag_for_taiwan": "🇹🇼",
+3223	    "flag_for_tajikistan": "🇹🇯",
+3224	    "flag_for_tanzania": "🇹🇿",
+3225	    "flag_for_thailand": "🇹🇭",
+3226	    "flag_for_timor__leste": "🇹🇱",
+3227	    "flag_for_togo": "🇹🇬",
+3228	    "flag_for_tokelau": "🇹🇰",
+3229	    "flag_for_tonga": "🇹🇴",
+3230	    "flag_for_trinidad_&_tobago": "🇹🇹",
+3231	    "flag_for_tristan_da_cunha": "🇹🇦",
+3232	    "flag_for_tunisia": "🇹🇳",
+3233	    "flag_for_turkey": "🇹🇷",
+3234	    "flag_for_turkmenistan": "🇹🇲",
+3235	    "flag_for_turks_&_caicos_islands": "🇹🇨",
+3236	    "flag_for_tuvalu": "🇹🇻",
+3237	    "flag_for_u.s._outlying_islands": "🇺🇲",
+3238	    "flag_for_u.s._virgin_islands": "🇻🇮",
+3239	    "flag_for_uganda": "🇺🇬",
+3240	    "flag_for_ukraine": "🇺🇦",
+3241	    "flag_for_united_arab_emirates": "🇦🇪",
+3242	    "flag_for_united_kingdom": "🇬🇧",
+3243	    "flag_for_united_states": "🇺🇸",
+3244	    "flag_for_uruguay": "🇺🇾",
+3245	    "flag_for_uzbekistan": "🇺🇿",
+3246	    "flag_for_vanuatu": "🇻🇺",
+3247	    "flag_for_vatican_city": "🇻🇦",
+3248	    "flag_for_venezuela": "🇻🇪",
+3249	    "flag_for_vietnam": "🇻🇳",
+3250	    "flag_for_wallis_&_futuna": "🇼🇫",
+3251	    "flag_for_western_sahara": "🇪🇭",
+3252	    "flag_for_yemen": "🇾🇪",
+3253	    "flag_for_zambia": "🇿🇲",
+3254	    "flag_for_zimbabwe": "🇿🇼",
+3255	    "flag_for_åland_islands": "🇦🇽",
+3256	    "golf": "⛳",
+3257	    "fleur__de__lis": "⚜",
+3258	    "muscle": "💪",
+3259	    "flushed": "😳",
+3260	    "frame_with_picture": "🖼",
+3261	    "fries": "🍟",
+3262	    "frog": "🐸",
+3263	    "hatched_chick": "🐥",
+3264	    "frowning": "😦",
+3265	    "fuelpump": "⛽",
+3266	    "full_moon_with_face": "🌝",
+3267	    "gem": "💎",
+3268	    "star2": "🌟",
+3269	    "golfer": "🏌",
+3270	    "mortar_board": "🎓",
+3271	    "grimacing": "😬",
+3272	    "smile_cat": "😸",
+3273	    "grinning": "😀",
+3274	    "grin": "😁",
+3275	    "heartpulse": "💗",
+3276	    "guardsman": "💂",
+3277	    "haircut": "💇",
+3278	    "hamster": "🐹",
+3279	    "raising_hand": "🙋",
+3280	    "headphones": "🎧",
+3281	    "hear_no_evil": "🙉",
+3282	    "cupid": "💘",
+3283	    "gift_heart": "💝",
+3284	    "heart": "❤",
+3285	    "exclamation": "❗",
+3286	    "heavy_exclamation_mark": "❗",
+3287	    "heavy_heart_exclamation_mark_ornament": "❣",
+3288	    "o": "⭕",
+3289	    "helm_symbol": "⎈",
+3290	    "helmet_with_white_cross": "⛑",
+3291	    "high_heel": "👠",
+3292	    "bullettrain_side": "🚄",
+3293	    "bullettrain_front": "🚅",
+3294	    "high_brightness": "🔆",
+3295	    "zap": "⚡",
+3296	    "hocho": "🔪",
+3297	    "knife": "🔪",
+3298	    "bee": "🐝",
+3299	    "traffic_light": "🚥",
+3300	    "racehorse": "🐎",
+3301	    "coffee": "☕",
+3302	    "hotsprings": "♨",
+3303	    "hourglass": "⌛",
+3304	    "hourglass_flowing_sand": "⏳",
+3305	    "house_buildings": "🏘",
+3306	    "100": "💯",
+3307	    "hushed": "😯",
+3308	    "ice_hockey_stick_and_puck": "🏒",
+3309	    "imp": "👿",
+3310	    "information_desk_person": "💁",
+3311	    "information_source": "ℹ",
+3312	    "capital_abcd": "🔠",
+3313	    "abc": "🔤",
+3314	    "abcd": "🔡",
+3315	    "1234": "🔢",
+3316	    "symbols": "🔣",
+3317	    "izakaya_lantern": "🏮",
+3318	    "lantern": "🏮",
+3319	    "jack_o_lantern": "🎃",
+3320	    "dolls": "🎎",
+3321	    "japanese_goblin": "👺",
+3322	    "japanese_ogre": "👹",
+3323	    "beginner": "🔰",
+3324	    "zero": "0️⃣",
+3325	    "one": "1️⃣",
+3326	    "ten": "🔟",
+3327	    "two": "2️⃣",
+3328	    "three": "3️⃣",
+3329	    "four": "4️⃣",
+3330	    "five": "5️⃣",
+3331	    "six": "6️⃣",
+3332	    "seven": "7️⃣",
+3333	    "eight": "8️⃣",
+3334	    "nine": "9️⃣",
+3335	    "couplekiss": "💏",
+3336	    "kissing_cat": "😽",
+3337	    "kissing": "😗",
+3338	    "kissing_closed_eyes": "😚",
+3339	    "kissing_smiling_eyes": "😙",
+3340	    "beetle": "🐞",
+3341	    "large_blue_circle": "🔵",
+3342	    "last_quarter_moon_with_face": "🌜",
+3343	    "leaves": "🍃",
+3344	    "mag": "🔍",
+3345	    "left_right_arrow": "↔",
+3346	    "leftwards_arrow_with_hook": "↩",
+3347	    "arrow_left": "⬅",
+3348	    "lock": "🔒",
+3349	    "lock_with_ink_pen": "🔏",
+3350	    "sob": "😭",
+3351	    "low_brightness": "🔅",
+3352	    "lower_left_ballpoint_pen": "🖊",
+3353	    "lower_left_crayon": "🖍",
+3354	    "lower_left_fountain_pen": "🖋",
+3355	    "lower_left_paintbrush": "🖌",
+3356	    "mahjong": "🀄",
+3357	    "couple": "👫",
+3358	    "man_in_business_suit_levitating": "🕴",
+3359	    "man_with_gua_pi_mao": "👲",
+3360	    "man_with_turban": "👳",
+3361	    "mans_shoe": "👞",
+3362	    "shoe": "👞",
+3363	    "menorah_with_nine_branches": "🕎",
+3364	    "mens": "🚹",
+3365	    "minidisc": "💽",
+3366	    "iphone": "📱",
+3367	    "calling": "📲",
+3368	    "money__mouth_face": "🤑",
+3369	    "moneybag": "💰",
+3370	    "rice_scene": "🎑",
+3371	    "mountain_bicyclist": "🚵",
+3372	    "mouse2": "🐁",
+3373	    "lips": "👄",
+3374	    "moyai": "🗿",
+3375	    "notes": "🎶",
+3376	    "nail_care": "💅",
+3377	    "ab": "🆎",
+3378	    "negative_squared_cross_mark": "❎",
+3379	    "a": "🅰",
+3380	    "b": "🅱",
+3381	    "o2": "🅾",
+3382	    "parking": "🅿",
+3383	    "new_moon_with_face": "🌚",
+3384	    "no_entry_sign": "🚫",
+3385	    "underage": "🔞",
+3386	    "non__potable_water": "🚱",
+3387	    "arrow_upper_right": "↗",
+3388	    "arrow_upper_left": "↖",
+3389	    "office": "🏢",
+3390	    "older_man": "👴",
+3391	    "older_woman": "👵",
+3392	    "om_symbol": "🕉",
+3393	    "on": "🔛",
+3394	    "book": "📖",
+3395	    "unlock": "🔓",
+3396	    "mailbox_with_no_mail": "📭",
+3397	    "mailbox_with_mail": "📬",
+3398	    "cd": "💿",
+3399	    "tada": "🎉",
+3400	    "feet": "🐾",
+3401	    "walking": "🚶",
+3402	    "pencil2": "✏",
+3403	    "pensive": "😔",
+3404	    "persevere": "😣",
+3405	    "bow": "🙇",
+3406	    "raised_hands": "🙌",
+3407	    "person_with_ball": "⛹",
+3408	    "person_with_blond_hair": "👱",
+3409	    "pray": "🙏",
+3410	    "person_with_pouting_face": "🙎",
+3411	    "computer": "💻",
+3412	    "pig2": "🐖",
+3413	    "hankey": "💩",
+3414	    "poop": "💩",
+3415	    "shit": "💩",
+3416	    "bamboo": "🎍",
+3417	    "gun": "🔫",
+3418	    "black_joker": "🃏",
+3419	    "rotating_light": "🚨",
+3420	    "cop": "👮",
+3421	    "stew": "🍲",
+3422	    "pouch": "👝",
+3423	    "pouting_cat": "😾",
+3424	    "rage": "😡",
+3425	    "put_litter_in_its_place": "🚮",
+3426	    "rabbit2": "🐇",
+3427	    "racing_motorcycle": "🏍",
+3428	    "radioactive_sign": "☢",
+3429	    "fist": "✊",
+3430	    "hand": "✋",
+3431	    "raised_hand_with_fingers_splayed": "🖐",
+3432	    "raised_hand_with_part_between_middle_and_ring_fingers": "🖖",
+3433	    "blue_car": "🚙",
+3434	    "apple": "🍎",
+3435	    "relieved": "😌",
+3436	    "reversed_hand_with_middle_finger_extended": "🖕",
+3437	    "mag_right": "🔎",
+3438	    "arrow_right_hook": "↪",
+3439	    "sweet_potato": "🍠",
+3440	    "robot": "🤖",
+3441	    "rolled__up_newspaper": "🗞",
+3442	    "rowboat": "🚣",
+3443	    "runner": "🏃",
+3444	    "running": "🏃",
+3445	    "running_shirt_with_sash": "🎽",
+3446	    "boat": "⛵",
+3447	    "scales": "⚖",
+3448	    "school_satchel": "🎒",
+3449	    "scorpius": "♏",
+3450	    "see_no_evil": "🙈",
+3451	    "sheep": "🐑",
+3452	    "stars": "🌠",
+3453	    "cake": "🍰",
+3454	    "six_pointed_star": "🔯",
+3455	    "ski": "🎿",
+3456	    "sleeping_accommodation": "🛌",
+3457	    "sleeping": "😴",
+3458	    "sleepy": "😪",
+3459	    "sleuth_or_spy": "🕵",
+3460	    "heart_eyes_cat": "😻",
+3461	    "smiley_cat": "😺",
+3462	    "innocent": "😇",
+3463	    "heart_eyes": "😍",
+3464	    "smiling_imp": "😈",
+3465	    "smiley": "😃",
+3466	    "sweat_smile": "😅",
+3467	    "smile": "😄",
+3468	    "laughing": "😆",
+3469	    "satisfied": "😆",
+3470	    "blush": "😊",
+3471	    "smirk": "😏",
+3472	    "smoking": "🚬",
+3473	    "snow_capped_mountain": "🏔",
+3474	    "soccer": "⚽",
+3475	    "icecream": "🍦",
+3476	    "soon": "🔜",
+3477	    "arrow_lower_right": "↘",
+3478	    "arrow_lower_left": "↙",
+3479	    "speak_no_evil": "🙊",
+3480	    "speaker": "🔈",
+3481	    "mute": "🔇",
+3482	    "sound": "🔉",
+3483	    "loud_sound": "🔊",
+3484	    "speaking_head_in_silhouette": "🗣",
+3485	    "spiral_calendar_pad": "🗓",
+3486	    "spiral_note_pad": "🗒",
+3487	    "shell": "🐚",
+3488	    "sweat_drops": "💦",
+3489	    "u5272": "🈹",
+3490	    "u5408": "🈴",
+3491	    "u55b6": "🈺",
+3492	    "u6307": "🈯",
+3493	    "u6708": "🈷",
+3494	    "u6709": "🈶",
+3495	    "u6e80": "🈵",
+3496	    "u7121": "🈚",
+3497	    "u7533": "🈸",
+3498	    "u7981": "🈲",
+3499	    "u7a7a": "🈳",
+3500	    "cl": "🆑",
+3501	    "cool": "🆒",
+3502	    "free": "🆓",
+3503	    "id": "🆔",
+3504	    "koko": "🈁",
+3505	    "sa": "🈂",
+3506	    "new": "🆕",
+3507	    "ng": "🆖",
+3508	    "ok": "🆗",
+3509	    "sos": "🆘",
+3510	    "up": "🆙",
+3511	    "vs": "🆚",
+3512	    "steam_locomotive": "🚂",
+3513	    "ramen": "🍜",
+3514	    "partly_sunny": "⛅",
+3515	    "city_sunrise": "🌇",
+3516	    "surfer": "🏄",
+3517	    "swimmer": "🏊",
+3518	    "shirt": "👕",
+3519	    "tshirt": "👕",
+3520	    "table_tennis_paddle_and_ball": "🏓",
+3521	    "tea": "🍵",
+3522	    "tv": "📺",
+3523	    "three_button_mouse": "🖱",
+3524	    "+1": "👍",
+3525	    "thumbsup": "👍",
+3526	    "__1": "👎",
+3527	    "-1": "👎",
+3528	    "thumbsdown": "👎",
+3529	    "thunder_cloud_and_rain": "⛈",
+3530	    "tiger2": "🐅",
+3531	    "tophat": "🎩",
+3532	    "top": "🔝",
+3533	    "tm": "™",
+3534	    "train2": "🚆",
+3535	    "triangular_flag_on_post": "🚩",
+3536	    "trident": "🔱",
+3537	    "twisted_rightwards_arrows": "🔀",
+3538	    "unamused": "😒",
+3539	    "small_red_triangle": "🔺",
+3540	    "arrow_up_small": "🔼",
+3541	    "arrow_up_down": "↕",
+3542	    "upside__down_face": "🙃",
+3543	    "arrow_up": "⬆",
+3544	    "v": "✌",
+3545	    "vhs": "📼",
+3546	    "wc": "🚾",
+3547	    "ocean": "🌊",
+3548	    "waving_black_flag": "🏴",
+3549	    "wave": "👋",
+3550	    "waving_white_flag": "🏳",
+3551	    "moon": "🌔",
+3552	    "scream_cat": "🙀",
+3553	    "weary": "😩",
+3554	    "weight_lifter": "🏋",
+3555	    "whale2": "🐋",
+3556	    "wheelchair": "♿",
+3557	    "point_down": "👇",
+3558	    "grey_exclamation": "❕",
+3559	    "white_frowning_face": "☹",
+3560	    "white_check_mark": "✅",
+3561	    "point_left": "👈",
+3562	    "white_medium_small_square": "◽",
+3563	    "star": "⭐",
+3564	    "grey_question": "❔",
+3565	    "point_right": "👉",
+3566	    "relaxed": "☺",
+3567	    "white_sun_behind_cloud": "🌥",
+3568	    "white_sun_behind_cloud_with_rain": "🌦",
+3569	    "white_sun_with_small_cloud": "🌤",
+3570	    "point_up_2": "👆",
+3571	    "point_up": "☝",
+3572	    "wind_blowing_face": "🌬",
+3573	    "wink": "😉",
+3574	    "wolf": "🐺",
+3575	    "dancers": "👯",
+3576	    "boot": "👢",
+3577	    "womans_clothes": "👚",
+3578	    "womans_hat": "👒",
+3579	    "sandal": "👡",
+3580	    "womens": "🚺",
+3581	    "worried": "😟",
+3582	    "gift": "🎁",
+3583	    "zipper__mouth_face": "🤐",
+3584	    "regional_indicator_a": "🇦",
+3585	    "regional_indicator_b": "🇧",
+3586	    "regional_indicator_c": "🇨",
+3587	    "regional_indicator_d": "🇩",
+3588	    "regional_indicator_e": "🇪",
+3589	    "regional_indicator_f": "🇫",
+3590	    "regional_indicator_g": "🇬",
+3591	    "regional_indicator_h": "🇭",
+3592	    "regional_indicator_i": "🇮",
+3593	    "regional_indicator_j": "🇯",
+3594	    "regional_indicator_k": "🇰",
+3595	    "regional_indicator_l": "🇱",
+3596	    "regional_indicator_m": "🇲",
+3597	    "regional_indicator_n": "🇳",
+3598	    "regional_indicator_o": "🇴",
+3599	    "regional_indicator_p": "🇵",
+3600	    "regional_indicator_q": "🇶",
+3601	    "regional_indicator_r": "🇷",
+3602	    "regional_indicator_s": "🇸",
+3603	    "regional_indicator_t": "🇹",
+3604	    "regional_indicator_u": "🇺",
+3605	    "regional_indicator_v": "🇻",
+3606	    "regional_indicator_w": "🇼",
+3607	    "regional_indicator_x": "🇽",
+3608	    "regional_indicator_y": "🇾",
+3609	    "regional_indicator_z": "🇿",
+3610	}
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '㊙'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/_emoji_codes.py
+ Line number: 2882
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+2881	    "congratulations": "㊗",
+2882	    "secret": "㊙",
+2883	    "m": "Ⓜ",
+2884	    "city_sunset": "🌆",
+2885	    "clapper": "🎬",
+2886	    "clap": "👏",
+2887	    "beers": "🍻",
+2888	    "clock830": "🕣",
+2889	    "clock8": "🕗",
+2890	    "clock1130": "🕦",
+2891	    "clock11": "🕚",
+2892	    "clock530": "🕠",
+2893	    "clock5": "🕔",
+2894	    "clock430": "🕟",
+2895	    "clock4": "🕓",
+2896	    "clock930": "🕤",
+2897	    "clock9": "🕘",
+2898	    "clock130": "🕜",
+2899	    "clock1": "🕐",
+2900	    "clock730": "🕢",
+2901	    "clock7": "🕖",
+2902	    "clock630": "🕡",
+2903	    "clock6": "🕕",
+2904	    "clock1030": "🕥",
+2905	    "clock10": "🕙",
+2906	    "clock330": "🕞",
+2907	    "clock3": "🕒",
+2908	    "clock1230": "🕧",
+2909	    "clock12": "🕛",
+2910	    "clock230": "🕝",
+2911	    "clock2": "🕑",
+2912	    "arrows_clockwise": "🔃",
+2913	    "repeat": "🔁",
+2914	    "repeat_one": "🔂",
+2915	    "closed_lock_with_key": "🔐",
+2916	    "mailbox_closed": "📪",
+2917	    "mailbox": "📫",
+2918	    "cloud_with_tornado": "🌪",
+2919	    "cocktail": "🍸",
+2920	    "boom": "💥",
+2921	    "compression": "🗜",
+2922	    "confounded": "😖",
+2923	    "confused": "😕",
+2924	    "rice": "🍚",
+2925	    "cow2": "🐄",
+2926	    "cricket_bat_and_ball": "🏏",
+2927	    "x": "❌",
+2928	    "cry": "😢",
+2929	    "curry": "🍛",
+2930	    "dagger_knife": "🗡",
+2931	    "dancer": "💃",
+2932	    "dark_sunglasses": "🕶",
+2933	    "dash": "💨",
+2934	    "truck": "🚚",
+2935	    "derelict_house_building": "🏚",
+2936	    "diamond_shape_with_a_dot_inside": "💠",
+2937	    "dart": "🎯",
+2938	    "disappointed_relieved": "😥",
+2939	    "disappointed": "😞",
+2940	    "do_not_litter": "🚯",
+2941	    "dog2": "🐕",
+2942	    "flipper": "🐬",
+2943	    "loop": "➿",
+2944	    "bangbang": "‼",
+2945	    "double_vertical_bar": "⏸",
+2946	    "dove_of_peace": "🕊",
+2947	    "small_red_triangle_down": "🔻",
+2948	    "arrow_down_small": "🔽",
+2949	    "arrow_down": "⬇",
+2950	    "dromedary_camel": "🐪",
+2951	    "e__mail": "📧",
+2952	    "corn": "🌽",
+2953	    "ear_of_rice": "🌾",
+2954	    "earth_americas": "🌎",
+2955	    "earth_asia": "🌏",
+2956	    "earth_africa": "🌍",
+2957	    "eight_pointed_black_star": "✴",
+2958	    "eight_spoked_asterisk": "✳",
+2959	    "eject_symbol": "⏏",
+2960	    "bulb": "💡",
+2961	    "emoji_modifier_fitzpatrick_type__1__2": "🏻",
+2962	    "emoji_modifier_fitzpatrick_type__3": "🏼",
+2963	    "emoji_modifier_fitzpatrick_type__4": "🏽",
+2964	    "emoji_modifier_fitzpatrick_type__5": "🏾",
+2965	    "emoji_modifier_fitzpatrick_type__6": "🏿",
+2966	    "end": "🔚",
+2967	    "email": "✉",
+2968	    "european_castle": "🏰",
+2969	    "european_post_office": "🏤",
+2970	    "interrobang": "⁉",
+2971	    "expressionless": "😑",
+2972	    "eyeglasses": "👓",
+2973	    "massage": "💆",
+2974	    "yum": "😋",
+2975	    "scream": "😱",
+2976	    "kissing_heart": "😘",
+2977	    "sweat": "😓",
+2978	    "face_with_head__bandage": "🤕",
+2979	    "triumph": "😤",
+2980	    "mask": "😷",
+2981	    "no_good": "🙅",
+2982	    "ok_woman": "🙆",
+2983	    "open_mouth": "😮",
+2984	    "cold_sweat": "😰",
+2985	    "stuck_out_tongue": "😛",
+2986	    "stuck_out_tongue_closed_eyes": "😝",
+2987	    "stuck_out_tongue_winking_eye": "😜",
+2988	    "joy": "😂",
+2989	    "no_mouth": "😶",
+2990	    "santa": "🎅",
+2991	    "fax": "📠",
+2992	    "fearful": "😨",
+2993	    "field_hockey_stick_and_ball": "🏑",
+2994	    "first_quarter_moon_with_face": "🌛",
+2995	    "fish_cake": "🍥",
+2996	    "fishing_pole_and_fish": "🎣",
+2997	    "facepunch": "👊",
+2998	    "punch": "👊",
+2999	    "flag_for_afghanistan": "🇦🇫",
+3000	    "flag_for_albania": "🇦🇱",
+3001	    "flag_for_algeria": "🇩🇿",
+3002	    "flag_for_american_samoa": "🇦🇸",
+3003	    "flag_for_andorra": "🇦🇩",
+3004	    "flag_for_angola": "🇦🇴",
+3005	    "flag_for_anguilla": "🇦🇮",
+3006	    "flag_for_antarctica": "🇦🇶",
+3007	    "flag_for_antigua_&_barbuda": "🇦🇬",
+3008	    "flag_for_argentina": "🇦🇷",
+3009	    "flag_for_armenia": "🇦🇲",
+3010	    "flag_for_aruba": "🇦🇼",
+3011	    "flag_for_ascension_island": "🇦🇨",
+3012	    "flag_for_australia": "🇦🇺",
+3013	    "flag_for_austria": "🇦🇹",
+3014	    "flag_for_azerbaijan": "🇦🇿",
+3015	    "flag_for_bahamas": "🇧🇸",
+3016	    "flag_for_bahrain": "🇧🇭",
+3017	    "flag_for_bangladesh": "🇧🇩",
+3018	    "flag_for_barbados": "🇧🇧",
+3019	    "flag_for_belarus": "🇧🇾",
+3020	    "flag_for_belgium": "🇧🇪",
+3021	    "flag_for_belize": "🇧🇿",
+3022	    "flag_for_benin": "🇧🇯",
+3023	    "flag_for_bermuda": "🇧🇲",
+3024	    "flag_for_bhutan": "🇧🇹",
+3025	    "flag_for_bolivia": "🇧🇴",
+3026	    "flag_for_bosnia_&_herzegovina": "🇧🇦",
+3027	    "flag_for_botswana": "🇧🇼",
+3028	    "flag_for_bouvet_island": "🇧🇻",
+3029	    "flag_for_brazil": "🇧🇷",
+3030	    "flag_for_british_indian_ocean_territory": "🇮🇴",
+3031	    "flag_for_british_virgin_islands": "🇻🇬",
+3032	    "flag_for_brunei": "🇧🇳",
+3033	    "flag_for_bulgaria": "🇧🇬",
+3034	    "flag_for_burkina_faso": "🇧🇫",
+3035	    "flag_for_burundi": "🇧🇮",
+3036	    "flag_for_cambodia": "🇰🇭",
+3037	    "flag_for_cameroon": "🇨🇲",
+3038	    "flag_for_canada": "🇨🇦",
+3039	    "flag_for_canary_islands": "🇮🇨",
+3040	    "flag_for_cape_verde": "🇨🇻",
+3041	    "flag_for_caribbean_netherlands": "🇧🇶",
+3042	    "flag_for_cayman_islands": "🇰🇾",
+3043	    "flag_for_central_african_republic": "🇨🇫",
+3044	    "flag_for_ceuta_&_melilla": "🇪🇦",
+3045	    "flag_for_chad": "🇹🇩",
+3046	    "flag_for_chile": "🇨🇱",
+3047	    "flag_for_china": "🇨🇳",
+3048	    "flag_for_christmas_island": "🇨🇽",
+3049	    "flag_for_clipperton_island": "🇨🇵",
+3050	    "flag_for_cocos__islands": "🇨🇨",
+3051	    "flag_for_colombia": "🇨🇴",
+3052	    "flag_for_comoros": "🇰🇲",
+3053	    "flag_for_congo____brazzaville": "🇨🇬",
+3054	    "flag_for_congo____kinshasa": "🇨🇩",
+3055	    "flag_for_cook_islands": "🇨🇰",
+3056	    "flag_for_costa_rica": "🇨🇷",
+3057	    "flag_for_croatia": "🇭🇷",
+3058	    "flag_for_cuba": "🇨🇺",
+3059	    "flag_for_curaçao": "🇨🇼",
+3060	    "flag_for_cyprus": "🇨🇾",
+3061	    "flag_for_czech_republic": "🇨🇿",
+3062	    "flag_for_côte_d’ivoire": "🇨🇮",
+3063	    "flag_for_denmark": "🇩🇰",
+3064	    "flag_for_diego_garcia": "🇩🇬",
+3065	    "flag_for_djibouti": "🇩🇯",
+3066	    "flag_for_dominica": "🇩🇲",
+3067	    "flag_for_dominican_republic": "🇩🇴",
+3068	    "flag_for_ecuador": "🇪🇨",
+3069	    "flag_for_egypt": "🇪🇬",
+3070	    "flag_for_el_salvador": "🇸🇻",
+3071	    "flag_for_equatorial_guinea": "🇬🇶",
+3072	    "flag_for_eritrea": "🇪🇷",
+3073	    "flag_for_estonia": "🇪🇪",
+3074	    "flag_for_ethiopia": "🇪🇹",
+3075	    "flag_for_european_union": "🇪🇺",
+3076	    "flag_for_falkland_islands": "🇫🇰",
+3077	    "flag_for_faroe_islands": "🇫🇴",
+3078	    "flag_for_fiji": "🇫🇯",
+3079	    "flag_for_finland": "🇫🇮",
+3080	    "flag_for_france": "🇫🇷",
+3081	    "flag_for_french_guiana": "🇬🇫",
+3082	    "flag_for_french_polynesia": "🇵🇫",
+3083	    "flag_for_french_southern_territories": "🇹🇫",
+3084	    "flag_for_gabon": "🇬🇦",
+3085	    "flag_for_gambia": "🇬🇲",
+3086	    "flag_for_georgia": "🇬🇪",
+3087	    "flag_for_germany": "🇩🇪",
+3088	    "flag_for_ghana": "🇬🇭",
+3089	    "flag_for_gibraltar": "🇬🇮",
+3090	    "flag_for_greece": "🇬🇷",
+3091	    "flag_for_greenland": "🇬🇱",
+3092	    "flag_for_grenada": "🇬🇩",
+3093	    "flag_for_guadeloupe": "🇬🇵",
+3094	    "flag_for_guam": "🇬🇺",
+3095	    "flag_for_guatemala": "🇬🇹",
+3096	    "flag_for_guernsey": "🇬🇬",
+3097	    "flag_for_guinea": "🇬🇳",
+3098	    "flag_for_guinea__bissau": "🇬🇼",
+3099	    "flag_for_guyana": "🇬🇾",
+3100	    "flag_for_haiti": "🇭🇹",
+3101	    "flag_for_heard_&_mcdonald_islands": "🇭🇲",
+3102	    "flag_for_honduras": "🇭🇳",
+3103	    "flag_for_hong_kong": "🇭🇰",
+3104	    "flag_for_hungary": "🇭🇺",
+3105	    "flag_for_iceland": "🇮🇸",
+3106	    "flag_for_india": "🇮🇳",
+3107	    "flag_for_indonesia": "🇮🇩",
+3108	    "flag_for_iran": "🇮🇷",
+3109	    "flag_for_iraq": "🇮🇶",
+3110	    "flag_for_ireland": "🇮🇪",
+3111	    "flag_for_isle_of_man": "🇮🇲",
+3112	    "flag_for_israel": "🇮🇱",
+3113	    "flag_for_italy": "🇮🇹",
+3114	    "flag_for_jamaica": "🇯🇲",
+3115	    "flag_for_japan": "🇯🇵",
+3116	    "flag_for_jersey": "🇯🇪",
+3117	    "flag_for_jordan": "🇯🇴",
+3118	    "flag_for_kazakhstan": "🇰🇿",
+3119	    "flag_for_kenya": "🇰🇪",
+3120	    "flag_for_kiribati": "🇰🇮",
+3121	    "flag_for_kosovo": "🇽🇰",
+3122	    "flag_for_kuwait": "🇰🇼",
+3123	    "flag_for_kyrgyzstan": "🇰🇬",
+3124	    "flag_for_laos": "🇱🇦",
+3125	    "flag_for_latvia": "🇱🇻",
+3126	    "flag_for_lebanon": "🇱🇧",
+3127	    "flag_for_lesotho": "🇱🇸",
+3128	    "flag_for_liberia": "🇱🇷",
+3129	    "flag_for_libya": "🇱🇾",
+3130	    "flag_for_liechtenstein": "🇱🇮",
+3131	    "flag_for_lithuania": "🇱🇹",
+3132	    "flag_for_luxembourg": "🇱🇺",
+3133	    "flag_for_macau": "🇲🇴",
+3134	    "flag_for_macedonia": "🇲🇰",
+3135	    "flag_for_madagascar": "🇲🇬",
+3136	    "flag_for_malawi": "🇲🇼",
+3137	    "flag_for_malaysia": "🇲🇾",
+3138	    "flag_for_maldives": "🇲🇻",
+3139	    "flag_for_mali": "🇲🇱",
+3140	    "flag_for_malta": "🇲🇹",
+3141	    "flag_for_marshall_islands": "🇲🇭",
+3142	    "flag_for_martinique": "🇲🇶",
+3143	    "flag_for_mauritania": "🇲🇷",
+3144	    "flag_for_mauritius": "🇲🇺",
+3145	    "flag_for_mayotte": "🇾🇹",
+3146	    "flag_for_mexico": "🇲🇽",
+3147	    "flag_for_micronesia": "🇫🇲",
+3148	    "flag_for_moldova": "🇲🇩",
+3149	    "flag_for_monaco": "🇲🇨",
+3150	    "flag_for_mongolia": "🇲🇳",
+3151	    "flag_for_montenegro": "🇲🇪",
+3152	    "flag_for_montserrat": "🇲🇸",
+3153	    "flag_for_morocco": "🇲🇦",
+3154	    "flag_for_mozambique": "🇲🇿",
+3155	    "flag_for_myanmar": "🇲🇲",
+3156	    "flag_for_namibia": "🇳🇦",
+3157	    "flag_for_nauru": "🇳🇷",
+3158	    "flag_for_nepal": "🇳🇵",
+3159	    "flag_for_netherlands": "🇳🇱",
+3160	    "flag_for_new_caledonia": "🇳🇨",
+3161	    "flag_for_new_zealand": "🇳🇿",
+3162	    "flag_for_nicaragua": "🇳🇮",
+3163	    "flag_for_niger": "🇳🇪",
+3164	    "flag_for_nigeria": "🇳🇬",
+3165	    "flag_for_niue": "🇳🇺",
+3166	    "flag_for_norfolk_island": "🇳🇫",
+3167	    "flag_for_north_korea": "🇰🇵",
+3168	    "flag_for_northern_mariana_islands": "🇲🇵",
+3169	    "flag_for_norway": "🇳🇴",
+3170	    "flag_for_oman": "🇴🇲",
+3171	    "flag_for_pakistan": "🇵🇰",
+3172	    "flag_for_palau": "🇵🇼",
+3173	    "flag_for_palestinian_territories": "🇵🇸",
+3174	    "flag_for_panama": "🇵🇦",
+3175	    "flag_for_papua_new_guinea": "🇵🇬",
+3176	    "flag_for_paraguay": "🇵🇾",
+3177	    "flag_for_peru": "🇵🇪",
+3178	    "flag_for_philippines": "🇵🇭",
+3179	    "flag_for_pitcairn_islands": "🇵🇳",
+3180	    "flag_for_poland": "🇵🇱",
+3181	    "flag_for_portugal": "🇵🇹",
+3182	    "flag_for_puerto_rico": "🇵🇷",
+3183	    "flag_for_qatar": "🇶🇦",
+3184	    "flag_for_romania": "🇷🇴",
+3185	    "flag_for_russia": "🇷🇺",
+3186	    "flag_for_rwanda": "🇷🇼",
+3187	    "flag_for_réunion": "🇷🇪",
+3188	    "flag_for_samoa": "🇼🇸",
+3189	    "flag_for_san_marino": "🇸🇲",
+3190	    "flag_for_saudi_arabia": "🇸🇦",
+3191	    "flag_for_senegal": "🇸🇳",
+3192	    "flag_for_serbia": "🇷🇸",
+3193	    "flag_for_seychelles": "🇸🇨",
+3194	    "flag_for_sierra_leone": "🇸🇱",
+3195	    "flag_for_singapore": "🇸🇬",
+3196	    "flag_for_sint_maarten": "🇸🇽",
+3197	    "flag_for_slovakia": "🇸🇰",
+3198	    "flag_for_slovenia": "🇸🇮",
+3199	    "flag_for_solomon_islands": "🇸🇧",
+3200	    "flag_for_somalia": "🇸🇴",
+3201	    "flag_for_south_africa": "🇿🇦",
+3202	    "flag_for_south_georgia_&_south_sandwich_islands": "🇬🇸",
+3203	    "flag_for_south_korea": "🇰🇷",
+3204	    "flag_for_south_sudan": "🇸🇸",
+3205	    "flag_for_spain": "🇪🇸",
+3206	    "flag_for_sri_lanka": "🇱🇰",
+3207	    "flag_for_st._barthélemy": "🇧🇱",
+3208	    "flag_for_st._helena": "🇸🇭",
+3209	    "flag_for_st._kitts_&_nevis": "🇰🇳",
+3210	    "flag_for_st._lucia": "🇱🇨",
+3211	    "flag_for_st._martin": "🇲🇫",
+3212	    "flag_for_st._pierre_&_miquelon": "🇵🇲",
+3213	    "flag_for_st._vincent_&_grenadines": "🇻🇨",
+3214	    "flag_for_sudan": "🇸🇩",
+3215	    "flag_for_suriname": "🇸🇷",
+3216	    "flag_for_svalbard_&_jan_mayen": "🇸🇯",
+3217	    "flag_for_swaziland": "🇸🇿",
+3218	    "flag_for_sweden": "🇸🇪",
+3219	    "flag_for_switzerland": "🇨🇭",
+3220	    "flag_for_syria": "🇸🇾",
+3221	    "flag_for_são_tomé_&_príncipe": "🇸🇹",
+3222	    "flag_for_taiwan": "🇹🇼",
+3223	    "flag_for_tajikistan": "🇹🇯",
+3224	    "flag_for_tanzania": "🇹🇿",
+3225	    "flag_for_thailand": "🇹🇭",
+3226	    "flag_for_timor__leste": "🇹🇱",
+3227	    "flag_for_togo": "🇹🇬",
+3228	    "flag_for_tokelau": "🇹🇰",
+3229	    "flag_for_tonga": "🇹🇴",
+3230	    "flag_for_trinidad_&_tobago": "🇹🇹",
+3231	    "flag_for_tristan_da_cunha": "🇹🇦",
+3232	    "flag_for_tunisia": "🇹🇳",
+3233	    "flag_for_turkey": "🇹🇷",
+3234	    "flag_for_turkmenistan": "🇹🇲",
+3235	    "flag_for_turks_&_caicos_islands": "🇹🇨",
+3236	    "flag_for_tuvalu": "🇹🇻",
+3237	    "flag_for_u.s._outlying_islands": "🇺🇲",
+3238	    "flag_for_u.s._virgin_islands": "🇻🇮",
+3239	    "flag_for_uganda": "🇺🇬",
+3240	    "flag_for_ukraine": "🇺🇦",
+3241	    "flag_for_united_arab_emirates": "🇦🇪",
+3242	    "flag_for_united_kingdom": "🇬🇧",
+3243	    "flag_for_united_states": "🇺🇸",
+3244	    "flag_for_uruguay": "🇺🇾",
+3245	    "flag_for_uzbekistan": "🇺🇿",
+3246	    "flag_for_vanuatu": "🇻🇺",
+3247	    "flag_for_vatican_city": "🇻🇦",
+3248	    "flag_for_venezuela": "🇻🇪",
+3249	    "flag_for_vietnam": "🇻🇳",
+3250	    "flag_for_wallis_&_futuna": "🇼🇫",
+3251	    "flag_for_western_sahara": "🇪🇭",
+3252	    "flag_for_yemen": "🇾🇪",
+3253	    "flag_for_zambia": "🇿🇲",
+3254	    "flag_for_zimbabwe": "🇿🇼",
+3255	    "flag_for_åland_islands": "🇦🇽",
+3256	    "golf": "⛳",
+3257	    "fleur__de__lis": "⚜",
+3258	    "muscle": "💪",
+3259	    "flushed": "😳",
+3260	    "frame_with_picture": "🖼",
+3261	    "fries": "🍟",
+3262	    "frog": "🐸",
+3263	    "hatched_chick": "🐥",
+3264	    "frowning": "😦",
+3265	    "fuelpump": "⛽",
+3266	    "full_moon_with_face": "🌝",
+3267	    "gem": "💎",
+3268	    "star2": "🌟",
+3269	    "golfer": "🏌",
+3270	    "mortar_board": "🎓",
+3271	    "grimacing": "😬",
+3272	    "smile_cat": "😸",
+3273	    "grinning": "😀",
+3274	    "grin": "😁",
+3275	    "heartpulse": "💗",
+3276	    "guardsman": "💂",
+3277	    "haircut": "💇",
+3278	    "hamster": "🐹",
+3279	    "raising_hand": "🙋",
+3280	    "headphones": "🎧",
+3281	    "hear_no_evil": "🙉",
+3282	    "cupid": "💘",
+3283	    "gift_heart": "💝",
+3284	    "heart": "❤",
+3285	    "exclamation": "❗",
+3286	    "heavy_exclamation_mark": "❗",
+3287	    "heavy_heart_exclamation_mark_ornament": "❣",
+3288	    "o": "⭕",
+3289	    "helm_symbol": "⎈",
+3290	    "helmet_with_white_cross": "⛑",
+3291	    "high_heel": "👠",
+3292	    "bullettrain_side": "🚄",
+3293	    "bullettrain_front": "🚅",
+3294	    "high_brightness": "🔆",
+3295	    "zap": "⚡",
+3296	    "hocho": "🔪",
+3297	    "knife": "🔪",
+3298	    "bee": "🐝",
+3299	    "traffic_light": "🚥",
+3300	    "racehorse": "🐎",
+3301	    "coffee": "☕",
+3302	    "hotsprings": "♨",
+3303	    "hourglass": "⌛",
+3304	    "hourglass_flowing_sand": "⏳",
+3305	    "house_buildings": "🏘",
+3306	    "100": "💯",
+3307	    "hushed": "😯",
+3308	    "ice_hockey_stick_and_puck": "🏒",
+3309	    "imp": "👿",
+3310	    "information_desk_person": "💁",
+3311	    "information_source": "ℹ",
+3312	    "capital_abcd": "🔠",
+3313	    "abc": "🔤",
+3314	    "abcd": "🔡",
+3315	    "1234": "🔢",
+3316	    "symbols": "🔣",
+3317	    "izakaya_lantern": "🏮",
+3318	    "lantern": "🏮",
+3319	    "jack_o_lantern": "🎃",
+3320	    "dolls": "🎎",
+3321	    "japanese_goblin": "👺",
+3322	    "japanese_ogre": "👹",
+3323	    "beginner": "🔰",
+3324	    "zero": "0️⃣",
+3325	    "one": "1️⃣",
+3326	    "ten": "🔟",
+3327	    "two": "2️⃣",
+3328	    "three": "3️⃣",
+3329	    "four": "4️⃣",
+3330	    "five": "5️⃣",
+3331	    "six": "6️⃣",
+3332	    "seven": "7️⃣",
+3333	    "eight": "8️⃣",
+3334	    "nine": "9️⃣",
+3335	    "couplekiss": "💏",
+3336	    "kissing_cat": "😽",
+3337	    "kissing": "😗",
+3338	    "kissing_closed_eyes": "😚",
+3339	    "kissing_smiling_eyes": "😙",
+3340	    "beetle": "🐞",
+3341	    "large_blue_circle": "🔵",
+3342	    "last_quarter_moon_with_face": "🌜",
+3343	    "leaves": "🍃",
+3344	    "mag": "🔍",
+3345	    "left_right_arrow": "↔",
+3346	    "leftwards_arrow_with_hook": "↩",
+3347	    "arrow_left": "⬅",
+3348	    "lock": "🔒",
+3349	    "lock_with_ink_pen": "🔏",
+3350	    "sob": "😭",
+3351	    "low_brightness": "🔅",
+3352	    "lower_left_ballpoint_pen": "🖊",
+3353	    "lower_left_crayon": "🖍",
+3354	    "lower_left_fountain_pen": "🖋",
+3355	    "lower_left_paintbrush": "🖌",
+3356	    "mahjong": "🀄",
+3357	    "couple": "👫",
+3358	    "man_in_business_suit_levitating": "🕴",
+3359	    "man_with_gua_pi_mao": "👲",
+3360	    "man_with_turban": "👳",
+3361	    "mans_shoe": "👞",
+3362	    "shoe": "👞",
+3363	    "menorah_with_nine_branches": "🕎",
+3364	    "mens": "🚹",
+3365	    "minidisc": "💽",
+3366	    "iphone": "📱",
+3367	    "calling": "📲",
+3368	    "money__mouth_face": "🤑",
+3369	    "moneybag": "💰",
+3370	    "rice_scene": "🎑",
+3371	    "mountain_bicyclist": "🚵",
+3372	    "mouse2": "🐁",
+3373	    "lips": "👄",
+3374	    "moyai": "🗿",
+3375	    "notes": "🎶",
+3376	    "nail_care": "💅",
+3377	    "ab": "🆎",
+3378	    "negative_squared_cross_mark": "❎",
+3379	    "a": "🅰",
+3380	    "b": "🅱",
+3381	    "o2": "🅾",
+3382	    "parking": "🅿",
+3383	    "new_moon_with_face": "🌚",
+3384	    "no_entry_sign": "🚫",
+3385	    "underage": "🔞",
+3386	    "non__potable_water": "🚱",
+3387	    "arrow_upper_right": "↗",
+3388	    "arrow_upper_left": "↖",
+3389	    "office": "🏢",
+3390	    "older_man": "👴",
+3391	    "older_woman": "👵",
+3392	    "om_symbol": "🕉",
+3393	    "on": "🔛",
+3394	    "book": "📖",
+3395	    "unlock": "🔓",
+3396	    "mailbox_with_no_mail": "📭",
+3397	    "mailbox_with_mail": "📬",
+3398	    "cd": "💿",
+3399	    "tada": "🎉",
+3400	    "feet": "🐾",
+3401	    "walking": "🚶",
+3402	    "pencil2": "✏",
+3403	    "pensive": "😔",
+3404	    "persevere": "😣",
+3405	    "bow": "🙇",
+3406	    "raised_hands": "🙌",
+3407	    "person_with_ball": "⛹",
+3408	    "person_with_blond_hair": "👱",
+3409	    "pray": "🙏",
+3410	    "person_with_pouting_face": "🙎",
+3411	    "computer": "💻",
+3412	    "pig2": "🐖",
+3413	    "hankey": "💩",
+3414	    "poop": "💩",
+3415	    "shit": "💩",
+3416	    "bamboo": "🎍",
+3417	    "gun": "🔫",
+3418	    "black_joker": "🃏",
+3419	    "rotating_light": "🚨",
+3420	    "cop": "👮",
+3421	    "stew": "🍲",
+3422	    "pouch": "👝",
+3423	    "pouting_cat": "😾",
+3424	    "rage": "😡",
+3425	    "put_litter_in_its_place": "🚮",
+3426	    "rabbit2": "🐇",
+3427	    "racing_motorcycle": "🏍",
+3428	    "radioactive_sign": "☢",
+3429	    "fist": "✊",
+3430	    "hand": "✋",
+3431	    "raised_hand_with_fingers_splayed": "🖐",
+3432	    "raised_hand_with_part_between_middle_and_ring_fingers": "🖖",
+3433	    "blue_car": "🚙",
+3434	    "apple": "🍎",
+3435	    "relieved": "😌",
+3436	    "reversed_hand_with_middle_finger_extended": "🖕",
+3437	    "mag_right": "🔎",
+3438	    "arrow_right_hook": "↪",
+3439	    "sweet_potato": "🍠",
+3440	    "robot": "🤖",
+3441	    "rolled__up_newspaper": "🗞",
+3442	    "rowboat": "🚣",
+3443	    "runner": "🏃",
+3444	    "running": "🏃",
+3445	    "running_shirt_with_sash": "🎽",
+3446	    "boat": "⛵",
+3447	    "scales": "⚖",
+3448	    "school_satchel": "🎒",
+3449	    "scorpius": "♏",
+3450	    "see_no_evil": "🙈",
+3451	    "sheep": "🐑",
+3452	    "stars": "🌠",
+3453	    "cake": "🍰",
+3454	    "six_pointed_star": "🔯",
+3455	    "ski": "🎿",
+3456	    "sleeping_accommodation": "🛌",
+3457	    "sleeping": "😴",
+3458	    "sleepy": "😪",
+3459	    "sleuth_or_spy": "🕵",
+3460	    "heart_eyes_cat": "😻",
+3461	    "smiley_cat": "😺",
+3462	    "innocent": "😇",
+3463	    "heart_eyes": "😍",
+3464	    "smiling_imp": "😈",
+3465	    "smiley": "😃",
+3466	    "sweat_smile": "😅",
+3467	    "smile": "😄",
+3468	    "laughing": "😆",
+3469	    "satisfied": "😆",
+3470	    "blush": "😊",
+3471	    "smirk": "😏",
+3472	    "smoking": "🚬",
+3473	    "snow_capped_mountain": "🏔",
+3474	    "soccer": "⚽",
+3475	    "icecream": "🍦",
+3476	    "soon": "🔜",
+3477	    "arrow_lower_right": "↘",
+3478	    "arrow_lower_left": "↙",
+3479	    "speak_no_evil": "🙊",
+3480	    "speaker": "🔈",
+3481	    "mute": "🔇",
+3482	    "sound": "🔉",
+3483	    "loud_sound": "🔊",
+3484	    "speaking_head_in_silhouette": "🗣",
+3485	    "spiral_calendar_pad": "🗓",
+3486	    "spiral_note_pad": "🗒",
+3487	    "shell": "🐚",
+3488	    "sweat_drops": "💦",
+3489	    "u5272": "🈹",
+3490	    "u5408": "🈴",
+3491	    "u55b6": "🈺",
+3492	    "u6307": "🈯",
+3493	    "u6708": "🈷",
+3494	    "u6709": "🈶",
+3495	    "u6e80": "🈵",
+3496	    "u7121": "🈚",
+3497	    "u7533": "🈸",
+3498	    "u7981": "🈲",
+3499	    "u7a7a": "🈳",
+3500	    "cl": "🆑",
+3501	    "cool": "🆒",
+3502	    "free": "🆓",
+3503	    "id": "🆔",
+3504	    "koko": "🈁",
+3505	    "sa": "🈂",
+3506	    "new": "🆕",
+3507	    "ng": "🆖",
+3508	    "ok": "🆗",
+3509	    "sos": "🆘",
+3510	    "up": "🆙",
+3511	    "vs": "🆚",
+3512	    "steam_locomotive": "🚂",
+3513	    "ramen": "🍜",
+3514	    "partly_sunny": "⛅",
+3515	    "city_sunrise": "🌇",
+3516	    "surfer": "🏄",
+3517	    "swimmer": "🏊",
+3518	    "shirt": "👕",
+3519	    "tshirt": "👕",
+3520	    "table_tennis_paddle_and_ball": "🏓",
+3521	    "tea": "🍵",
+3522	    "tv": "📺",
+3523	    "three_button_mouse": "🖱",
+3524	    "+1": "👍",
+3525	    "thumbsup": "👍",
+3526	    "__1": "👎",
+3527	    "-1": "👎",
+3528	    "thumbsdown": "👎",
+3529	    "thunder_cloud_and_rain": "⛈",
+3530	    "tiger2": "🐅",
+3531	    "tophat": "🎩",
+3532	    "top": "🔝",
+3533	    "tm": "™",
+3534	    "train2": "🚆",
+3535	    "triangular_flag_on_post": "🚩",
+3536	    "trident": "🔱",
+3537	    "twisted_rightwards_arrows": "🔀",
+3538	    "unamused": "😒",
+3539	    "small_red_triangle": "🔺",
+3540	    "arrow_up_small": "🔼",
+3541	    "arrow_up_down": "↕",
+3542	    "upside__down_face": "🙃",
+3543	    "arrow_up": "⬆",
+3544	    "v": "✌",
+3545	    "vhs": "📼",
+3546	    "wc": "🚾",
+3547	    "ocean": "🌊",
+3548	    "waving_black_flag": "🏴",
+3549	    "wave": "👋",
+3550	    "waving_white_flag": "🏳",
+3551	    "moon": "🌔",
+3552	    "scream_cat": "🙀",
+3553	    "weary": "😩",
+3554	    "weight_lifter": "🏋",
+3555	    "whale2": "🐋",
+3556	    "wheelchair": "♿",
+3557	    "point_down": "👇",
+3558	    "grey_exclamation": "❕",
+3559	    "white_frowning_face": "☹",
+3560	    "white_check_mark": "✅",
+3561	    "point_left": "👈",
+3562	    "white_medium_small_square": "◽",
+3563	    "star": "⭐",
+3564	    "grey_question": "❔",
+3565	    "point_right": "👉",
+3566	    "relaxed": "☺",
+3567	    "white_sun_behind_cloud": "🌥",
+3568	    "white_sun_behind_cloud_with_rain": "🌦",
+3569	    "white_sun_with_small_cloud": "🌤",
+3570	    "point_up_2": "👆",
+3571	    "point_up": "☝",
+3572	    "wind_blowing_face": "🌬",
+3573	    "wink": "😉",
+3574	    "wolf": "🐺",
+3575	    "dancers": "👯",
+3576	    "boot": "👢",
+3577	    "womans_clothes": "👚",
+3578	    "womans_hat": "👒",
+3579	    "sandal": "👡",
+3580	    "womens": "🚺",
+3581	    "worried": "😟",
+3582	    "gift": "🎁",
+3583	    "zipper__mouth_face": "🤐",
+3584	    "regional_indicator_a": "🇦",
+3585	    "regional_indicator_b": "🇧",
+3586	    "regional_indicator_c": "🇨",
+3587	    "regional_indicator_d": "🇩",
+3588	    "regional_indicator_e": "🇪",
+3589	    "regional_indicator_f": "🇫",
+3590	    "regional_indicator_g": "🇬",
+3591	    "regional_indicator_h": "🇭",
+3592	    "regional_indicator_i": "🇮",
+3593	    "regional_indicator_j": "🇯",
+3594	    "regional_indicator_k": "🇰",
+3595	    "regional_indicator_l": "🇱",
+3596	    "regional_indicator_m": "🇲",
+3597	    "regional_indicator_n": "🇳",
+3598	    "regional_indicator_o": "🇴",
+3599	    "regional_indicator_p": "🇵",
+3600	    "regional_indicator_q": "🇶",
+3601	    "regional_indicator_r": "🇷",
+3602	    "regional_indicator_s": "🇸",
+3603	    "regional_indicator_t": "🇹",
+3604	    "regional_indicator_u": "🇺",
+3605	    "regional_indicator_v": "🇻",
+3606	    "regional_indicator_w": "🇼",
+3607	    "regional_indicator_x": "🇽",
+3608	    "regional_indicator_y": "🇾",
+3609	    "regional_indicator_z": "🇿",
+3610	}
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/_pick.py
+ Line number: 13
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+12	    """
+13	    assert values, "1 or more values required"
+14	    for value in values:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/_ratio.py
+ Line number: 129
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+128	    total_ratio = sum(ratios)
+129	    assert total_ratio > 0, "Sum of ratios must be > 0"
+130	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py
+ Line number: 436
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+435	
+436	        assert fore is not None
+437	        assert back is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py
+ Line number: 437
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+436	        assert fore is not None
+437	        assert back is not None
+438	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/_win32_console.py
+ Line number: 566
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+565	        """
+566	        assert len(title) < 255, "Console title must be less than 255 characters"
+567	        SetConsoleTitle(title)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 365
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+364	        if self.type == ColorType.TRUECOLOR:
+365	            assert self.triplet is not None
+366	            return self.triplet
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 368
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+367	        elif self.type == ColorType.EIGHT_BIT:
+368	            assert self.number is not None
+369	            return EIGHT_BIT_PALETTE[self.number]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 371
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+370	        elif self.type == ColorType.STANDARD:
+371	            assert self.number is not None
+372	            return theme.ansi_colors[self.number]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 374
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+373	        elif self.type == ColorType.WINDOWS:
+374	            assert self.number is not None
+375	            return WINDOWS_PALETTE[self.number]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 377
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+376	        else:  # self.type == ColorType.DEFAULT:
+377	            assert self.number is None
+378	            return theme.foreground_color if foreground else theme.background_color
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 493
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+492	            number = self.number
+493	            assert number is not None
+494	            fore, back = (30, 40) if number < 8 else (82, 92)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 499
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+498	            number = self.number
+499	            assert number is not None
+500	            fore, back = (30, 40) if number < 8 else (82, 92)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 504
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+503	        elif _type == ColorType.EIGHT_BIT:
+504	            assert self.number is not None
+505	            return ("38" if foreground else "48", "5", str(self.number))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 508
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+507	        else:  # self.standard == ColorStandard.TRUECOLOR:
+508	            assert self.triplet is not None
+509	            red, green, blue = self.triplet
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 520
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+519	        if system == ColorSystem.EIGHT_BIT and self.system == ColorSystem.TRUECOLOR:
+520	            assert self.triplet is not None
+521	            _h, l, s = rgb_to_hls(*self.triplet.normalized)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 546
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+545	            if self.system == ColorSystem.TRUECOLOR:
+546	                assert self.triplet is not None
+547	                triplet = self.triplet
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 549
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+548	            else:  # self.system == ColorSystem.EIGHT_BIT
+549	                assert self.number is not None
+550	                triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 557
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+556	            if self.system == ColorSystem.TRUECOLOR:
+557	                assert self.triplet is not None
+558	                triplet = self.triplet
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 560
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+559	            else:  # self.system == ColorSystem.EIGHT_BIT
+560	                assert self.number is not None
+561	                if self.number < 16:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/color.py
+ Line number: 573
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+572	    """Parse six hex characters in to RGB triplet."""
+573	    assert len(hex_color) == 6, "must be 6 characters"
+574	    color = ColorTriplet(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py
+ Line number: 1135
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1134	
+1135	        assert count >= 0, "count must be >= 0"
+1136	        self.print(NewLine(count))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py
+ Line number: 1900
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1899	                offset -= 1
+1900	            assert frame is not None
+1901	            return frame.f_code.co_filename, frame.f_lineno, frame.f_locals
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py
+ Line number: 2138
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2137	        """
+2138	        assert (
+2139	            self.record
+2140	        ), "To export console contents set record=True in the constructor or instance"
+2141	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/console.py
+ Line number: 2194
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2193	        """
+2194	        assert (
+2195	            self.record
+2196	        ), "To export console contents set record=True in the constructor or instance"
+2197	        fragments: List[str] = []
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py
+ Line number: 65
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+64	    ) -> None:
+65	        assert refresh_per_second > 0, "refresh_per_second must be > 0"
+66	        self._renderable = renderable
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py
+ Line number: 352
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+351	                time.sleep(0.4)
+352	                if random.randint(0, 10) < 1:
+353	                    console.log(next(examples))
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/live.py
+ Line number: 355
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+354	                exchange_rate_dict[(select_exchange, exchange)] = 200 / (
+355	                    (random.random() * 320) + 1
+356	                )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py
+ Line number: 136
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+135	            exc_type, exc_value, exc_traceback = record.exc_info
+136	            assert exc_type is not None
+137	            assert exc_value is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/logging.py
+ Line number: 137
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+136	            assert exc_type is not None
+137	            assert exc_value is not None
+138	            traceback = Traceback.from_exception(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py
+ Line number: 191
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+190	    console = console or get_console()
+191	    assert console is not None
+192	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py
+ Line number: 196
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+195	        if value is not None:
+196	            assert console is not None
+197	            builtins._ = None  # type: ignore[attr-defined]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py
+ Line number: 496
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+495	        )
+496	        assert self.node is not None
+497	        return self.node.check_length(start_length, max_length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py
+ Line number: 502
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+501	        node = self.node
+502	        assert node is not None
+503	        whitespace = self.whitespace
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py
+ Line number: 504
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+503	        whitespace = self.whitespace
+504	        assert node.children
+505	        if node.key_repr:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/pretty.py
+ Line number: 641
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+640	                    rich_repr_result = obj.__rich_repr__()
+641	            except Exception:
+642	                pass
+643	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py
+ Line number: 1080
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1079	    ) -> None:
+1080	        assert refresh_per_second > 0, "refresh_per_second must be > 0"
+1081	        self._lock = RLock()
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/progress.py
+ Line number: 1701
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+1700	            time.sleep(0.01)
+1701	            if random.randint(0, 100) < 1:
+1702	                progress.log(next(examples))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/prompt.py
+ Line number: 214
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+213	        """
+214	        assert self.choices is not None
+215	        return value.strip() in self.choices
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py
+ Line number: 193
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+192	        self._link_id = (
+193	            f"{randint(0, 999999)}{hash(self._meta)}" if (link or meta) else ""
+194	        )
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py
+ Line number: 243
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+242	        style._meta = dumps(meta)
+243	        style._link_id = f"{randint(0, 999999)}{hash(style._meta)}"
+244	        style._hash = None
+
+
+ + +
+
+ +
+
+ blacklist: Deserialization with the marshal module is possibly dangerous.
+ Test ID: B302
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py
+ Line number: 475
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b302-marshal
+ +
+
+474	        """Get meta information (can not be changed after construction)."""
+475	        return {} if self._meta is None else cast(Dict[str, Any], loads(self._meta))
+476	
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py
+ Line number: 490
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+489	        style._link = self._link
+490	        style._link_id = f"{randint(0, 999999)}" if self._link else ""
+491	        style._null = False
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py
+ Line number: 642
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+641	        style._link = self._link
+642	        style._link_id = f"{randint(0, 999999)}" if self._link else ""
+643	        style._hash = self._hash
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/style.py
+ Line number: 688
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+687	        style._link = link
+688	        style._link_id = f"{randint(0, 999999)}" if link else ""
+689	        style._hash = None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/syntax.py
+ Line number: 482
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+481	                    """Split tokens to one per line."""
+482	                    assert lexer  # required to make MyPy happy - we know lexer is not None at this point
+483	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py
+ Line number: 787
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+786	            tab_size = self.tab_size
+787	        assert tab_size is not None
+788	        result = self.blank_copy()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py
+ Line number: 856
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+855	        """
+856	        assert len(character) == 1, "Character must be a string of length 1"
+857	        if count:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py
+ Line number: 873
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+872	        """
+873	        assert len(character) == 1, "Character must be a string of length 1"
+874	        if count:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py
+ Line number: 889
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+888	        """
+889	        assert len(character) == 1, "Character must be a string of length 1"
+890	        if count:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/text.py
+ Line number: 1024
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1023	        """
+1024	        assert separator, "separator must not be empty"
+1025	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py
+ Line number: 282
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+281	            if not isinstance(suppress_entity, str):
+282	                assert (
+283	                    suppress_entity.__file__ is not None
+284	                ), f"{suppress_entity!r} must be a module with '__file__' attribute"
+285	                path = os.path.dirname(suppress_entity.__file__)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/rich/traceback.py
+ Line number: 645
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+644	            if excluded:
+645	                assert exclude_frames is not None
+646	                yield Text(
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/six.py
+ Line number: 735
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+734	            _locs_ = _globs_
+735	        exec("""exec _code_ in _globs_, _locs_""")
+736	
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py
+ Line number: 72
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+71	    def __call__(self, retry_state: "RetryCallState") -> float:
+72	        return self.wait_random_min + (random.random() * (self.wait_random_max - self.wait_random_min))
+73	
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py
+ Line number: 194
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+193	        high = super().__call__(retry_state=retry_state)
+194	        return random.uniform(0, high)
+195	
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/tenacity/wait.py
+ Line number: 222
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+221	    def __call__(self, retry_state: "RetryCallState") -> float:
+222	        jitter = random.uniform(0, self.jitter)
+223	        try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py
+ Line number: 374
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+373	                            deduped_pairs.remove(pair)
+374	                    assert not deduped_pairs, deduped_pairs
+375	                    parameters = tuple(new_parameters)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py
+ Line number: 1300
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1299	        def copy_with(self, params):
+1300	            assert len(params) == 1
+1301	            new_type = params[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py
+ Line number: 2613
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2612	        def __new__(cls, typename, bases, ns):
+2613	            assert _NamedTuple in bases
+2614	            for base in bases:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/typing_extensions.py
+ Line number: 2654
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2653	    def _namedtuple_mro_entries(bases):
+2654	        assert NamedTuple in bases
+2655	        return (_NamedTuple,)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py
+ Line number: 719
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+718	            leaf = Security.SecTrustGetCertificateAtIndex(trust, 0)
+719	            assert leaf
+720	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py
+ Line number: 723
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+722	            certdata = Security.SecCertificateCopyData(leaf)
+723	            assert certdata
+724	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py
+ Line number: 901
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+900	        # See PEP 543 for the real deal.
+901	        assert not server_side
+902	        assert do_handshake_on_connect
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py
+ Line number: 902
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+901	        assert not server_side
+902	        assert do_handshake_on_connect
+903	        assert suppress_ragged_eofs
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/contrib/securetransport.py
+ Line number: 903
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+902	        assert do_handshake_on_connect
+903	        assert suppress_ragged_eofs
+904	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py
+ Line number: 23
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+22	    reading = "r" in mode or not writing
+23	    assert reading or writing
+24	    binary = "b" in mode
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py
+ Line number: 45
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+44	    else:
+45	        assert writing
+46	        buffer = io.BufferedWriter(raw, buffering)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/backports/weakref_finalize.py
+ Line number: 150
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+149	                        sys.excepthook(*sys.exc_info())
+150	                    assert f not in cls._registry
+151	        finally:
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/packages/six.py
+ Line number: 787
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+786	            _locs_ = _globs_
+787	        exec ("""exec _code_ in _globs_, _locs_""")
+788	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/response.py
+ Line number: 495
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+494	        """
+495	        assert self._fp
+496	        c_int_max = 2 ** 31 - 1
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/connection.py
+ Line number: 141
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+140	            has_ipv6 = True
+141	        except Exception:
+142	            pass
+143	
+
+
+ + +
+
+ +
+
+ ssl_with_no_version: ssl.wrap_socket call with no SSL/TLS protocol version specified, the default SSLv23 could be insecure, possible security issue.
+ Test ID: B504
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssl_.py
+ Line number: 179
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b504_ssl_with_no_version.html
+ +
+
+178	            }
+179	            return wrap_socket(socket, ciphers=self.ciphers, **kwargs)
+180	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py
+ Line number: 120
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+119	        reading = "r" in mode or not writing
+120	        assert reading or writing
+121	        binary = "b" in mode
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/urllib3/util/ssltransport.py
+ Line number: 142
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+141	        else:
+142	            assert writing
+143	            buffer = io.BufferedWriter(raw, buffering)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py
+ Line number: 224
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+223	        if output:
+224	            assert decoder.encoding is not None
+225	            yield decoder.encoding
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/__init__.py
+ Line number: 231
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+230	        output = decode(b'', final=True)
+231	        assert decoder.encoding is not None
+232	        yield decoder.encoding
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py
+ Line number: 21
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+20	def assert_lower(string):
+21	    assert string == string.lower()
+22	    return string
+
+
+ + +
+
+ +
+
+ blacklist: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
+ Test ID: B310
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/mklabels.py
+ Line number: 47
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b310-urllib-urlopen
+ +
+
+46	         repr(encoding['name']).lstrip('u'))
+47	        for category in json.loads(urlopen(url).read().decode('ascii'))
+48	        for encoding in category['encodings']
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 30
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+29	def test_labels():
+30	    assert lookup('utf-8').name == 'utf-8'
+31	    assert lookup('Utf-8').name == 'utf-8'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 31
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+30	    assert lookup('utf-8').name == 'utf-8'
+31	    assert lookup('Utf-8').name == 'utf-8'
+32	    assert lookup('UTF-8').name == 'utf-8'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 32
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+31	    assert lookup('Utf-8').name == 'utf-8'
+32	    assert lookup('UTF-8').name == 'utf-8'
+33	    assert lookup('utf8').name == 'utf-8'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 33
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+32	    assert lookup('UTF-8').name == 'utf-8'
+33	    assert lookup('utf8').name == 'utf-8'
+34	    assert lookup('utf8').name == 'utf-8'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 34
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+33	    assert lookup('utf8').name == 'utf-8'
+34	    assert lookup('utf8').name == 'utf-8'
+35	    assert lookup('utf8 ').name == 'utf-8'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 35
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+34	    assert lookup('utf8').name == 'utf-8'
+35	    assert lookup('utf8 ').name == 'utf-8'
+36	    assert lookup(' \r\nutf8\t').name == 'utf-8'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 36
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+35	    assert lookup('utf8 ').name == 'utf-8'
+36	    assert lookup(' \r\nutf8\t').name == 'utf-8'
+37	    assert lookup('u8') is None  # Python label.
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 37
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+36	    assert lookup(' \r\nutf8\t').name == 'utf-8'
+37	    assert lookup('u8') is None  # Python label.
+38	    assert lookup('utf-8 ') is None  # Non-ASCII white space.
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 38
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+37	    assert lookup('u8') is None  # Python label.
+38	    assert lookup('utf-8 ') is None  # Non-ASCII white space.
+39	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 40
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+39	
+40	    assert lookup('US-ASCII').name == 'windows-1252'
+41	    assert lookup('iso-8859-1').name == 'windows-1252'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 41
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+40	    assert lookup('US-ASCII').name == 'windows-1252'
+41	    assert lookup('iso-8859-1').name == 'windows-1252'
+42	    assert lookup('latin1').name == 'windows-1252'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 42
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+41	    assert lookup('iso-8859-1').name == 'windows-1252'
+42	    assert lookup('latin1').name == 'windows-1252'
+43	    assert lookup('LATIN1').name == 'windows-1252'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 43
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+42	    assert lookup('latin1').name == 'windows-1252'
+43	    assert lookup('LATIN1').name == 'windows-1252'
+44	    assert lookup('latin-1') is None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 44
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+43	    assert lookup('LATIN1').name == 'windows-1252'
+44	    assert lookup('latin-1') is None
+45	    assert lookup('LATİN1') is None  # ASCII-only case insensitivity.
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 45
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+44	    assert lookup('latin-1') is None
+45	    assert lookup('LATİN1') is None  # ASCII-only case insensitivity.
+46	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 50
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+49	    for label in LABELS:
+50	        assert decode(b'', label) == ('', lookup(label))
+51	        assert encode('', label) == b''
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 51
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+50	        assert decode(b'', label) == ('', lookup(label))
+51	        assert encode('', label) == b''
+52	        for repeat in [0, 1, 12]:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 54
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+53	            output, _ = iter_decode([b''] * repeat, label)
+54	            assert list(output) == []
+55	            assert list(iter_encode([''] * repeat, label)) == []
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 55
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+54	            assert list(output) == []
+55	            assert list(iter_encode([''] * repeat, label)) == []
+56	        decoder = IncrementalDecoder(label)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 57
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+56	        decoder = IncrementalDecoder(label)
+57	        assert decoder.decode(b'') == ''
+58	        assert decoder.decode(b'', final=True) == ''
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 58
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+57	        assert decoder.decode(b'') == ''
+58	        assert decoder.decode(b'', final=True) == ''
+59	        encoder = IncrementalEncoder(label)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 60
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+59	        encoder = IncrementalEncoder(label)
+60	        assert encoder.encode('') == b''
+61	        assert encoder.encode('', final=True) == b''
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+60	        assert encoder.encode('') == b''
+61	        assert encoder.encode('', final=True) == b''
+62	    # All encoding names are valid labels too:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 64
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+63	    for name in set(LABELS.values()):
+64	        assert lookup(name).name == name
+65	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 77
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+76	def test_decode():
+77	    assert decode(b'\x80', 'latin1') == ('€', lookup('latin1'))
+78	    assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 78
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+77	    assert decode(b'\x80', 'latin1') == ('€', lookup('latin1'))
+78	    assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1'))
+79	    assert decode(b'\xc3\xa9', 'utf8') == ('é', lookup('utf8'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 79
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+78	    assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1'))
+79	    assert decode(b'\xc3\xa9', 'utf8') == ('é', lookup('utf8'))
+80	    assert decode(b'\xc3\xa9', UTF8) == ('é', lookup('utf8'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 80
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+79	    assert decode(b'\xc3\xa9', 'utf8') == ('é', lookup('utf8'))
+80	    assert decode(b'\xc3\xa9', UTF8) == ('é', lookup('utf8'))
+81	    assert decode(b'\xc3\xa9', 'ascii') == ('é', lookup('ascii'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 81
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+80	    assert decode(b'\xc3\xa9', UTF8) == ('é', lookup('utf8'))
+81	    assert decode(b'\xc3\xa9', 'ascii') == ('é', lookup('ascii'))
+82	    assert decode(b'\xEF\xBB\xBF\xc3\xa9', 'ascii') == ('é', lookup('utf8'))  # UTF-8 with BOM
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 82
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+81	    assert decode(b'\xc3\xa9', 'ascii') == ('é', lookup('ascii'))
+82	    assert decode(b'\xEF\xBB\xBF\xc3\xa9', 'ascii') == ('é', lookup('utf8'))  # UTF-8 with BOM
+83	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 84
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+83	
+84	    assert decode(b'\xFE\xFF\x00\xe9', 'ascii') == ('é', lookup('utf-16be'))  # UTF-16-BE with BOM
+85	    assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('é', lookup('utf-16le'))  # UTF-16-LE with BOM
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 85
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+84	    assert decode(b'\xFE\xFF\x00\xe9', 'ascii') == ('é', lookup('utf-16be'))  # UTF-16-BE with BOM
+85	    assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('é', lookup('utf-16le'))  # UTF-16-LE with BOM
+86	    assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 86
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+85	    assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('é', lookup('utf-16le'))  # UTF-16-LE with BOM
+86	    assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be'))
+87	    assert decode(b'\xFF\xFE\x00\xe9', 'ascii') == ('\ue900', lookup('utf-16le'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 87
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+86	    assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be'))
+87	    assert decode(b'\xFF\xFE\x00\xe9', 'ascii') == ('\ue900', lookup('utf-16le'))
+88	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 89
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+88	
+89	    assert decode(b'\x00\xe9', 'UTF-16BE') == ('é', lookup('utf-16be'))
+90	    assert decode(b'\xe9\x00', 'UTF-16LE') == ('é', lookup('utf-16le'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 90
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+89	    assert decode(b'\x00\xe9', 'UTF-16BE') == ('é', lookup('utf-16be'))
+90	    assert decode(b'\xe9\x00', 'UTF-16LE') == ('é', lookup('utf-16le'))
+91	    assert decode(b'\xe9\x00', 'UTF-16') == ('é', lookup('utf-16le'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 91
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+90	    assert decode(b'\xe9\x00', 'UTF-16LE') == ('é', lookup('utf-16le'))
+91	    assert decode(b'\xe9\x00', 'UTF-16') == ('é', lookup('utf-16le'))
+92	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 93
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+92	
+93	    assert decode(b'\xe9\x00', 'UTF-16BE') == ('\ue900', lookup('utf-16be'))
+94	    assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 94
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+93	    assert decode(b'\xe9\x00', 'UTF-16BE') == ('\ue900', lookup('utf-16be'))
+94	    assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le'))
+95	    assert decode(b'\x00\xe9', 'UTF-16') == ('\ue900', lookup('utf-16le'))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 95
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+94	    assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le'))
+95	    assert decode(b'\x00\xe9', 'UTF-16') == ('\ue900', lookup('utf-16le'))
+96	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 99
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+98	def test_encode():
+99	    assert encode('é', 'latin1') == b'\xe9'
+100	    assert encode('é', 'utf8') == b'\xc3\xa9'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 100
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+99	    assert encode('é', 'latin1') == b'\xe9'
+100	    assert encode('é', 'utf8') == b'\xc3\xa9'
+101	    assert encode('é', 'utf8') == b'\xc3\xa9'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 101
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+100	    assert encode('é', 'utf8') == b'\xc3\xa9'
+101	    assert encode('é', 'utf8') == b'\xc3\xa9'
+102	    assert encode('é', 'utf-16') == b'\xe9\x00'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 102
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+101	    assert encode('é', 'utf8') == b'\xc3\xa9'
+102	    assert encode('é', 'utf-16') == b'\xe9\x00'
+103	    assert encode('é', 'utf-16le') == b'\xe9\x00'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 103
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+102	    assert encode('é', 'utf-16') == b'\xe9\x00'
+103	    assert encode('é', 'utf-16le') == b'\xe9\x00'
+104	    assert encode('é', 'utf-16be') == b'\x00\xe9'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 104
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+103	    assert encode('é', 'utf-16le') == b'\xe9\x00'
+104	    assert encode('é', 'utf-16be') == b'\x00\xe9'
+105	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 111
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+110	        return ''.join(output)
+111	    assert iter_decode_to_string([], 'latin1') == ''
+112	    assert iter_decode_to_string([b''], 'latin1') == ''
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 112
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+111	    assert iter_decode_to_string([], 'latin1') == ''
+112	    assert iter_decode_to_string([b''], 'latin1') == ''
+113	    assert iter_decode_to_string([b'\xe9'], 'latin1') == 'é'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 113
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+112	    assert iter_decode_to_string([b''], 'latin1') == ''
+113	    assert iter_decode_to_string([b'\xe9'], 'latin1') == 'é'
+114	    assert iter_decode_to_string([b'hello'], 'latin1') == 'hello'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 114
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+113	    assert iter_decode_to_string([b'\xe9'], 'latin1') == 'é'
+114	    assert iter_decode_to_string([b'hello'], 'latin1') == 'hello'
+115	    assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 115
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+114	    assert iter_decode_to_string([b'hello'], 'latin1') == 'hello'
+115	    assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello'
+116	    assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 116
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+115	    assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello'
+116	    assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello'
+117	    assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'é'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 117
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+116	    assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello'
+117	    assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'é'
+118	    assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'é'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 118
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+117	    assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'é'
+118	    assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'é'
+119	    assert iter_decode_to_string([
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 119
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+118	    assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'é'
+119	    assert iter_decode_to_string([
+120	        b'\xEF\xBB\xBF', b'\xc3', b'\xa9'], 'latin1') == 'é'
+121	    assert iter_decode_to_string([
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 121
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+120	        b'\xEF\xBB\xBF', b'\xc3', b'\xa9'], 'latin1') == 'é'
+121	    assert iter_decode_to_string([
+122	        b'\xEF\xBB\xBF', b'a', b'\xc3'], 'latin1') == 'a\uFFFD'
+123	    assert iter_decode_to_string([
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 123
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+122	        b'\xEF\xBB\xBF', b'a', b'\xc3'], 'latin1') == 'a\uFFFD'
+123	    assert iter_decode_to_string([
+124	        b'', b'\xEF', b'', b'', b'\xBB\xBF\xc3', b'\xa9'], 'latin1') == 'é'
+125	    assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == ''
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 125
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+124	        b'', b'\xEF', b'', b'', b'\xBB\xBF\xc3', b'\xa9'], 'latin1') == 'é'
+125	    assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == ''
+126	    assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 126
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+125	    assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == ''
+126	    assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»'
+127	    assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'é'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 127
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+126	    assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»'
+127	    assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'é'
+128	    assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'é'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 128
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+127	    assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'é'
+128	    assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'é'
+129	    assert iter_decode_to_string([
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 129
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+128	    assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'é'
+129	    assert iter_decode_to_string([
+130	        b'', b'\xFF', b'', b'', b'\xFE\xe9', b'\x00'], 'latin1') == 'é'
+131	    assert iter_decode_to_string([
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 131
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+130	        b'', b'\xFF', b'', b'', b'\xFE\xe9', b'\x00'], 'latin1') == 'é'
+131	    assert iter_decode_to_string([
+132	        b'', b'h\xe9', b'llo'], 'x-user-defined') == 'h\uF7E9llo'
+133	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 136
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+135	def test_iter_encode():
+136	    assert b''.join(iter_encode([], 'latin1')) == b''
+137	    assert b''.join(iter_encode([''], 'latin1')) == b''
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 137
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+136	    assert b''.join(iter_encode([], 'latin1')) == b''
+137	    assert b''.join(iter_encode([''], 'latin1')) == b''
+138	    assert b''.join(iter_encode(['é'], 'latin1')) == b'\xe9'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 138
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+137	    assert b''.join(iter_encode([''], 'latin1')) == b''
+138	    assert b''.join(iter_encode(['é'], 'latin1')) == b'\xe9'
+139	    assert b''.join(iter_encode(['', 'é', '', ''], 'latin1')) == b'\xe9'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 139
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+138	    assert b''.join(iter_encode(['é'], 'latin1')) == b'\xe9'
+139	    assert b''.join(iter_encode(['', 'é', '', ''], 'latin1')) == b'\xe9'
+140	    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16')) == b'\xe9\x00'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 140
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+139	    assert b''.join(iter_encode(['', 'é', '', ''], 'latin1')) == b'\xe9'
+140	    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16')) == b'\xe9\x00'
+141	    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16le')) == b'\xe9\x00'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 141
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+140	    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16')) == b'\xe9\x00'
+141	    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16le')) == b'\xe9\x00'
+142	    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16be')) == b'\x00\xe9'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 142
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+141	    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16le')) == b'\xe9\x00'
+142	    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16be')) == b'\x00\xe9'
+143	    assert b''.join(iter_encode([
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 143
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+142	    assert b''.join(iter_encode(['', 'é', '', ''], 'utf-16be')) == b'\x00\xe9'
+143	    assert b''.join(iter_encode([
+144	        '', 'h\uF7E9', '', 'llo'], 'x-user-defined')) == b'h\xe9llo'
+145	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 152
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+151	    decoded = 'aa'
+152	    assert decode(encoded, 'x-user-defined') == (decoded, lookup('x-user-defined'))
+153	    assert encode(decoded, 'x-user-defined') == encoded
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pip/_vendor/webencodings/tests.py
+ Line number: 153
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+152	    assert decode(encoded, 'x-user-defined') == (decoded, lookup('x-user-defined'))
+153	    assert encode(decoded, 'x-user-defined') == encoded
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/cmdline.py
+ Line number: 522
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+521	                width = shutil.get_terminal_size().columns - 2
+522	            except Exception:
+523	                pass
+524	        argparse.HelpFormatter.__init__(self, prog, indent_increment,
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pygments/formatters/__init__.py
+ Line number: 103
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+102	        with open(filename, 'rb') as f:
+103	            exec(f.read(), custom_namespace)
+104	        # Retrieve the class `formattername` from that namespace
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pygments/formatters/img.py
+ Line number: 17
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+16	
+17	import subprocess
+18	
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pygments/formatters/img.py
+ Line number: 93
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+92	    def _get_nix_font_path(self, name, style):
+93	        proc = subprocess.Popen(['fc-list', f"{name}:style={style}", 'file'],
+94	                                stdout=subprocess.PIPE, stderr=None)
+95	        stdout, _ = proc.communicate()
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pygments/formatters/img.py
+ Line number: 93
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+92	    def _get_nix_font_path(self, name, style):
+93	        proc = subprocess.Popen(['fc-list', f"{name}:style={style}", 'file'],
+94	                                stdout=subprocess.PIPE, stderr=None)
+95	        stdout, _ = proc.communicate()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 514
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+513	        """Preprocess the token component of a token definition."""
+514	        assert type(token) is _TokenType or callable(token), \
+515	            f'token type must be simple type or callable, not {token!r}'
+516	        return token
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 531
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+530	            else:
+531	                assert False, f'unknown new state {new_state!r}'
+532	        elif isinstance(new_state, combined):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 538
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+537	            for istate in new_state:
+538	                assert istate != new_state, f'circular state ref {istate!r}'
+539	                itokens.extend(cls._process_state(unprocessed,
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 546
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+545	            for istate in new_state:
+546	                assert (istate in unprocessed or
+547	                        istate in ('#pop', '#push')), \
+548	                    'unknown new state ' + istate
+549	            return new_state
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 551
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+550	        else:
+551	            assert False, f'unknown new state def {new_state!r}'
+552	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 555
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+554	        """Preprocess a single state definition."""
+555	        assert isinstance(state, str), f"wrong state name {state!r}"
+556	        assert state[0] != '#', f"invalid state name {state!r}"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 556
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+555	        assert isinstance(state, str), f"wrong state name {state!r}"
+556	        assert state[0] != '#', f"invalid state name {state!r}"
+557	        if state in processed:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 564
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+563	                # it's a state reference
+564	                assert tdef != state, f"circular state reference {state!r}"
+565	                tokens.extend(cls._process_state(unprocessed, processed,
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 578
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+577	
+578	            assert type(tdef) is tuple, f"wrong rule def {tdef!r}"
+579	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 744
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+743	                        else:
+744	                            assert False, f"wrong state def: {new_state!r}"
+745	                        statetokens = tokendefs[statestack[-1]]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexer.py
+ Line number: 831
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+830	                        else:
+831	                            assert False, f"wrong state def: {new_state!r}"
+832	                        statetokens = tokendefs[ctx.stack[-1]]
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/__init__.py
+ Line number: 154
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+153	        with open(filename, 'rb') as f:
+154	            exec(f.read(), custom_namespace)
+155	        # Retrieve the class `lexername` from that namespace
+
+
+ + +
+
+ +
+
+ blacklist: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
+ Test ID: B310
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_lua_builtins.py
+ Line number: 225
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b310-urllib-urlopen
+ +
+
+224	    def get_newest_version():
+225	        f = urlopen('http://www.lua.org/manual/')
+226	        r = re.compile(r'^<A HREF="(\d\.\d)/">(Lua )?\1</A>')
+
+
+ + +
+
+ +
+
+ blacklist: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
+ Test ID: B310
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_lua_builtins.py
+ Line number: 233
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b310-urllib-urlopen
+ +
+
+232	    def get_lua_functions(version):
+233	        f = urlopen(f'http://www.lua.org/manual/{version}/')
+234	        r = re.compile(r'^<A HREF="manual.html#pdf-(?!lua|LUA)([^:]+)">\1</A>')
+
+
+ + +
+
+ +
+
+ blacklist: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
+ Test ID: B310
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_mysql_builtins.py
+ Line number: 1297
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b310-urllib-urlopen
+ +
+
+1296	        # Pull content from lex.h.
+1297	        lex_file = urlopen(LEX_URL).read().decode('utf8', errors='ignore')
+1298	        keywords = parse_lex_keywords(lex_file)
+
+
+ + +
+
+ +
+
+ blacklist: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
+ Test ID: B310
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_mysql_builtins.py
+ Line number: 1303
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b310-urllib-urlopen
+ +
+
+1302	        # Parse content in item_create.cc.
+1303	        item_create_file = urlopen(ITEM_CREATE_URL).read().decode('utf8', errors='ignore')
+1304	        functions.update(parse_item_create_functions(item_create_file))
+
+
+ + +
+
+ +
+
+ blacklist: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
+ Test ID: B310
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_php_builtins.py
+ Line number: 3299
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b310-urllib-urlopen
+ +
+
+3298	    def get_php_references():
+3299	        download = urlretrieve(PHP_MANUAL_URL)
+3300	        with tarfile.open(download[0]) as tar:
+
+
+ + +
+
+ +
+
+ tarfile_unsafe_members: tarfile.extractall used without any validation. Please check and discard dangerous members.
+ Test ID: B202
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_php_builtins.py
+ Line number: 3304
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b202_tarfile_unsafe_members.html
+ +
+
+3303	            else:
+3304	                tar.extractall()
+3305	        yield from glob.glob(f"{PHP_MANUAL_DIR}{PHP_REFERENCE_GLOB}")
+
+
+ + +
+
+ +
+
+ blacklist: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
+ Test ID: B310
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_postgres_builtins.py
+ Line number: 642
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b310-urllib-urlopen
+ +
+
+641	    def update_myself():
+642	        content = urlopen(DATATYPES_URL).read().decode('utf-8', errors='ignore')
+643	        data_file = list(content.splitlines())
+
+
+ + +
+
+ +
+
+ blacklist: Audit url open for permitted schemes. Allowing use of file:/ or custom schemes is often unexpected.
+ Test ID: B310
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-22
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_postgres_builtins.py
+ Line number: 647
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b310-urllib-urlopen
+ +
+
+646	
+647	        content = urlopen(KEYWORDS_URL).read().decode('utf-8', errors='ignore')
+648	        keywords = parse_keywords(content)
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_scilab_builtins.py
+ Line number: 3055
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+3054	if __name__ == '__main__':  # pragma: no cover
+3055	    import subprocess
+3056	    from pygments.util import format_lines, duplicates_removed
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_scilab_builtins.py
+ Line number: 3061
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+3060	    def extract_completion(var_type):
+3061	        s = subprocess.Popen(['scilab', '-nwni'], stdin=subprocess.PIPE,
+3062	                             stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+3063	        output = s.communicate(f'''\
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/_scilab_builtins.py
+ Line number: 3061
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+3060	    def extract_completion(var_type):
+3061	        s = subprocess.Popen(['scilab', '-nwni'], stdin=subprocess.PIPE,
+3062	                             stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+3063	        output = s.communicate(f'''\
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'root'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/int_fiction.py
+ Line number: 728
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+727	        for token in Inform6Lexer.tokens:
+728	            if token == 'root':
+729	                continue
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '[^\W\d]\w*'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/jsonnet.py
+ Line number: 17
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+16	
+17	jsonnet_token = r'[^\W\d]\w*'
+18	jsonnet_function_token = jsonnet_token + r'(?=\()'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/lilypond.py
+ Line number: 43
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+42	    else:
+43	        assert backslash == "disallowed"
+44	    return words(names, prefix, suffix)
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: ' + (?= + \s # whitespace + | ; # comment + | \#[;|!] # fancy comments + | [)\]] # end delimiters + | $ # end of file + ) + '
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/lisp.py
+ Line number: 50
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+49	    # Use within verbose regexes
+50	    token_end = r'''
+51	      (?=
+52	        \s         # whitespace
+53	        | ;        # comment
+54	        | \#[;|!] # fancy comments
+55	        | [)\]]    # end delimiters
+56	        | $        # end of file
+57	      )
+58	    '''
+59	
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '(?=\s|#|[)\]]|$)'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/lisp.py
+ Line number: 3047
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+3046	    # ...so, express it like this
+3047	    _token_end = r'(?=\s|#|[)\]]|$)'
+3048	
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '[A-Z]\w*'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/parsers.py
+ Line number: 334
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+333	    _id = r'[A-Za-z]\w*'
+334	    _TOKEN_REF = r'[A-Z]\w*'
+335	    _RULE_REF = r'[a-z]\w*'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/scripting.py
+ Line number: 1499
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1498	                        result += 0.01
+1499	        assert 0.0 <= result <= 1.0
+1500	        return result
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/scripting.py
+ Line number: 1583
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1582	                result = 1.0
+1583	        assert 0.0 <= result <= 1.0
+1584	        return result
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/lexers/sql.py
+ Line number: 236
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+235	    else:
+236	        assert 0, "SQL keywords not found"
+237	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/pygments/style.py
+ Line number: 79
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+78	                return text
+79	            assert False, f"wrong color format {text!r}"
+80	
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '㊙'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/rich/_emoji_codes.py
+ Line number: 156
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+155	    "japanese_reserved_button": "🈯",
+156	    "japanese_secret_button": "㊙",
+157	    "japanese_service_charge_button": "🈂",
+158	    "japanese_symbol_for_beginner": "🔰",
+159	    "japanese_vacancy_button": "🈳",
+160	    "jersey": "🇯🇪",
+161	    "jordan": "🇯🇴",
+162	    "kazakhstan": "🇰🇿",
+163	    "kenya": "🇰🇪",
+164	    "kiribati": "🇰🇮",
+165	    "kosovo": "🇽🇰",
+166	    "kuwait": "🇰🇼",
+167	    "kyrgyzstan": "🇰🇬",
+168	    "laos": "🇱🇦",
+169	    "latvia": "🇱🇻",
+170	    "lebanon": "🇱🇧",
+171	    "leo": "♌",
+172	    "lesotho": "🇱🇸",
+173	    "liberia": "🇱🇷",
+174	    "libra": "♎",
+175	    "libya": "🇱🇾",
+176	    "liechtenstein": "🇱🇮",
+177	    "lithuania": "🇱🇹",
+178	    "luxembourg": "🇱🇺",
+179	    "macau_sar_china": "🇲🇴",
+180	    "macedonia": "🇲🇰",
+181	    "madagascar": "🇲🇬",
+182	    "malawi": "🇲🇼",
+183	    "malaysia": "🇲🇾",
+184	    "maldives": "🇲🇻",
+185	    "mali": "🇲🇱",
+186	    "malta": "🇲🇹",
+187	    "marshall_islands": "🇲🇭",
+188	    "martinique": "🇲🇶",
+189	    "mauritania": "🇲🇷",
+190	    "mauritius": "🇲🇺",
+191	    "mayotte": "🇾🇹",
+192	    "mexico": "🇲🇽",
+193	    "micronesia": "🇫🇲",
+194	    "moldova": "🇲🇩",
+195	    "monaco": "🇲🇨",
+196	    "mongolia": "🇲🇳",
+197	    "montenegro": "🇲🇪",
+198	    "montserrat": "🇲🇸",
+199	    "morocco": "🇲🇦",
+200	    "mozambique": "🇲🇿",
+201	    "mrs._claus": "🤶",
+202	    "mrs._claus_dark_skin_tone": "🤶🏿",
+203	    "mrs._claus_light_skin_tone": "🤶🏻",
+204	    "mrs._claus_medium-dark_skin_tone": "🤶🏾",
+205	    "mrs._claus_medium-light_skin_tone": "🤶🏼",
+206	    "mrs._claus_medium_skin_tone": "🤶🏽",
+207	    "myanmar_(burma)": "🇲🇲",
+208	    "new_button": "🆕",
+209	    "ng_button": "🆖",
+210	    "namibia": "🇳🇦",
+211	    "nauru": "🇳🇷",
+212	    "nepal": "🇳🇵",
+213	    "netherlands": "🇳🇱",
+214	    "new_caledonia": "🇳🇨",
+215	    "new_zealand": "🇳🇿",
+216	    "nicaragua": "🇳🇮",
+217	    "niger": "🇳🇪",
+218	    "nigeria": "🇳🇬",
+219	    "niue": "🇳🇺",
+220	    "norfolk_island": "🇳🇫",
+221	    "north_korea": "🇰🇵",
+222	    "northern_mariana_islands": "🇲🇵",
+223	    "norway": "🇳🇴",
+224	    "ok_button": "🆗",
+225	    "ok_hand": "👌",
+226	    "ok_hand_dark_skin_tone": "👌🏿",
+227	    "ok_hand_light_skin_tone": "👌🏻",
+228	    "ok_hand_medium-dark_skin_tone": "👌🏾",
+229	    "ok_hand_medium-light_skin_tone": "👌🏼",
+230	    "ok_hand_medium_skin_tone": "👌🏽",
+231	    "on!_arrow": "🔛",
+232	    "o_button_(blood_type)": "🅾",
+233	    "oman": "🇴🇲",
+234	    "ophiuchus": "⛎",
+235	    "p_button": "🅿",
+236	    "pakistan": "🇵🇰",
+237	    "palau": "🇵🇼",
+238	    "palestinian_territories": "🇵🇸",
+239	    "panama": "🇵🇦",
+240	    "papua_new_guinea": "🇵🇬",
+241	    "paraguay": "🇵🇾",
+242	    "peru": "🇵🇪",
+243	    "philippines": "🇵🇭",
+244	    "pisces": "♓",
+245	    "pitcairn_islands": "🇵🇳",
+246	    "poland": "🇵🇱",
+247	    "portugal": "🇵🇹",
+248	    "puerto_rico": "🇵🇷",
+249	    "qatar": "🇶🇦",
+250	    "romania": "🇷🇴",
+251	    "russia": "🇷🇺",
+252	    "rwanda": "🇷🇼",
+253	    "réunion": "🇷🇪",
+254	    "soon_arrow": "🔜",
+255	    "sos_button": "🆘",
+256	    "sagittarius": "♐",
+257	    "samoa": "🇼🇸",
+258	    "san_marino": "🇸🇲",
+259	    "santa_claus": "🎅",
+260	    "santa_claus_dark_skin_tone": "🎅🏿",
+261	    "santa_claus_light_skin_tone": "🎅🏻",
+262	    "santa_claus_medium-dark_skin_tone": "🎅🏾",
+263	    "santa_claus_medium-light_skin_tone": "🎅🏼",
+264	    "santa_claus_medium_skin_tone": "🎅🏽",
+265	    "saudi_arabia": "🇸🇦",
+266	    "scorpio": "♏",
+267	    "scotland": "🏴\U000e0067\U000e0062\U000e0073\U000e0063\U000e0074\U000e007f",
+268	    "senegal": "🇸🇳",
+269	    "serbia": "🇷🇸",
+270	    "seychelles": "🇸🇨",
+271	    "sierra_leone": "🇸🇱",
+272	    "singapore": "🇸🇬",
+273	    "sint_maarten": "🇸🇽",
+274	    "slovakia": "🇸🇰",
+275	    "slovenia": "🇸🇮",
+276	    "solomon_islands": "🇸🇧",
+277	    "somalia": "🇸🇴",
+278	    "south_africa": "🇿🇦",
+279	    "south_georgia_&_south_sandwich_islands": "🇬🇸",
+280	    "south_korea": "🇰🇷",
+281	    "south_sudan": "🇸🇸",
+282	    "spain": "🇪🇸",
+283	    "sri_lanka": "🇱🇰",
+284	    "st._barthélemy": "🇧🇱",
+285	    "st._helena": "🇸🇭",
+286	    "st._kitts_&_nevis": "🇰🇳",
+287	    "st._lucia": "🇱🇨",
+288	    "st._martin": "🇲🇫",
+289	    "st._pierre_&_miquelon": "🇵🇲",
+290	    "st._vincent_&_grenadines": "🇻🇨",
+291	    "statue_of_liberty": "🗽",
+292	    "sudan": "🇸🇩",
+293	    "suriname": "🇸🇷",
+294	    "svalbard_&_jan_mayen": "🇸🇯",
+295	    "swaziland": "🇸🇿",
+296	    "sweden": "🇸🇪",
+297	    "switzerland": "🇨🇭",
+298	    "syria": "🇸🇾",
+299	    "são_tomé_&_príncipe": "🇸🇹",
+300	    "t-rex": "🦖",
+301	    "top_arrow": "🔝",
+302	    "taiwan": "🇹🇼",
+303	    "tajikistan": "🇹🇯",
+304	    "tanzania": "🇹🇿",
+305	    "taurus": "♉",
+306	    "thailand": "🇹🇭",
+307	    "timor-leste": "🇹🇱",
+308	    "togo": "🇹🇬",
+309	    "tokelau": "🇹🇰",
+310	    "tokyo_tower": "🗼",
+311	    "tonga": "🇹🇴",
+312	    "trinidad_&_tobago": "🇹🇹",
+313	    "tristan_da_cunha": "🇹🇦",
+314	    "tunisia": "🇹🇳",
+315	    "turkey": "🦃",
+316	    "turkmenistan": "🇹🇲",
+317	    "turks_&_caicos_islands": "🇹🇨",
+318	    "tuvalu": "🇹🇻",
+319	    "u.s._outlying_islands": "🇺🇲",
+320	    "u.s._virgin_islands": "🇻🇮",
+321	    "up!_button": "🆙",
+322	    "uganda": "🇺🇬",
+323	    "ukraine": "🇺🇦",
+324	    "united_arab_emirates": "🇦🇪",
+325	    "united_kingdom": "🇬🇧",
+326	    "united_nations": "🇺🇳",
+327	    "united_states": "🇺🇸",
+328	    "uruguay": "🇺🇾",
+329	    "uzbekistan": "🇺🇿",
+330	    "vs_button": "🆚",
+331	    "vanuatu": "🇻🇺",
+332	    "vatican_city": "🇻🇦",
+333	    "venezuela": "🇻🇪",
+334	    "vietnam": "🇻🇳",
+335	    "virgo": "♍",
+336	    "wales": "🏴\U000e0067\U000e0062\U000e0077\U000e006c\U000e0073\U000e007f",
+337	    "wallis_&_futuna": "🇼🇫",
+338	    "western_sahara": "🇪🇭",
+339	    "yemen": "🇾🇪",
+340	    "zambia": "🇿🇲",
+341	    "zimbabwe": "🇿🇼",
+342	    "abacus": "🧮",
+343	    "adhesive_bandage": "🩹",
+344	    "admission_tickets": "🎟",
+345	    "adult": "🧑",
+346	    "adult_dark_skin_tone": "🧑🏿",
+347	    "adult_light_skin_tone": "🧑🏻",
+348	    "adult_medium-dark_skin_tone": "🧑🏾",
+349	    "adult_medium-light_skin_tone": "🧑🏼",
+350	    "adult_medium_skin_tone": "🧑🏽",
+351	    "aerial_tramway": "🚡",
+352	    "airplane": "✈",
+353	    "airplane_arrival": "🛬",
+354	    "airplane_departure": "🛫",
+355	    "alarm_clock": "⏰",
+356	    "alembic": "⚗",
+357	    "alien": "👽",
+358	    "alien_monster": "👾",
+359	    "ambulance": "🚑",
+360	    "american_football": "🏈",
+361	    "amphora": "🏺",
+362	    "anchor": "⚓",
+363	    "anger_symbol": "💢",
+364	    "angry_face": "😠",
+365	    "angry_face_with_horns": "👿",
+366	    "anguished_face": "😧",
+367	    "ant": "🐜",
+368	    "antenna_bars": "📶",
+369	    "anxious_face_with_sweat": "😰",
+370	    "articulated_lorry": "🚛",
+371	    "artist_palette": "🎨",
+372	    "astonished_face": "😲",
+373	    "atom_symbol": "⚛",
+374	    "auto_rickshaw": "🛺",
+375	    "automobile": "🚗",
+376	    "avocado": "🥑",
+377	    "axe": "🪓",
+378	    "baby": "👶",
+379	    "baby_angel": "👼",
+380	    "baby_angel_dark_skin_tone": "👼🏿",
+381	    "baby_angel_light_skin_tone": "👼🏻",
+382	    "baby_angel_medium-dark_skin_tone": "👼🏾",
+383	    "baby_angel_medium-light_skin_tone": "👼🏼",
+384	    "baby_angel_medium_skin_tone": "👼🏽",
+385	    "baby_bottle": "🍼",
+386	    "baby_chick": "🐤",
+387	    "baby_dark_skin_tone": "👶🏿",
+388	    "baby_light_skin_tone": "👶🏻",
+389	    "baby_medium-dark_skin_tone": "👶🏾",
+390	    "baby_medium-light_skin_tone": "👶🏼",
+391	    "baby_medium_skin_tone": "👶🏽",
+392	    "baby_symbol": "🚼",
+393	    "backhand_index_pointing_down": "👇",
+394	    "backhand_index_pointing_down_dark_skin_tone": "👇🏿",
+395	    "backhand_index_pointing_down_light_skin_tone": "👇🏻",
+396	    "backhand_index_pointing_down_medium-dark_skin_tone": "👇🏾",
+397	    "backhand_index_pointing_down_medium-light_skin_tone": "👇🏼",
+398	    "backhand_index_pointing_down_medium_skin_tone": "👇🏽",
+399	    "backhand_index_pointing_left": "👈",
+400	    "backhand_index_pointing_left_dark_skin_tone": "👈🏿",
+401	    "backhand_index_pointing_left_light_skin_tone": "👈🏻",
+402	    "backhand_index_pointing_left_medium-dark_skin_tone": "👈🏾",
+403	    "backhand_index_pointing_left_medium-light_skin_tone": "👈🏼",
+404	    "backhand_index_pointing_left_medium_skin_tone": "👈🏽",
+405	    "backhand_index_pointing_right": "👉",
+406	    "backhand_index_pointing_right_dark_skin_tone": "👉🏿",
+407	    "backhand_index_pointing_right_light_skin_tone": "👉🏻",
+408	    "backhand_index_pointing_right_medium-dark_skin_tone": "👉🏾",
+409	    "backhand_index_pointing_right_medium-light_skin_tone": "👉🏼",
+410	    "backhand_index_pointing_right_medium_skin_tone": "👉🏽",
+411	    "backhand_index_pointing_up": "👆",
+412	    "backhand_index_pointing_up_dark_skin_tone": "👆🏿",
+413	    "backhand_index_pointing_up_light_skin_tone": "👆🏻",
+414	    "backhand_index_pointing_up_medium-dark_skin_tone": "👆🏾",
+415	    "backhand_index_pointing_up_medium-light_skin_tone": "👆🏼",
+416	    "backhand_index_pointing_up_medium_skin_tone": "👆🏽",
+417	    "bacon": "🥓",
+418	    "badger": "🦡",
+419	    "badminton": "🏸",
+420	    "bagel": "🥯",
+421	    "baggage_claim": "🛄",
+422	    "baguette_bread": "🥖",
+423	    "balance_scale": "⚖",
+424	    "bald": "🦲",
+425	    "bald_man": "👨\u200d🦲",
+426	    "bald_woman": "👩\u200d🦲",
+427	    "ballet_shoes": "🩰",
+428	    "balloon": "🎈",
+429	    "ballot_box_with_ballot": "🗳",
+430	    "ballot_box_with_check": "☑",
+431	    "banana": "🍌",
+432	    "banjo": "🪕",
+433	    "bank": "🏦",
+434	    "bar_chart": "📊",
+435	    "barber_pole": "💈",
+436	    "baseball": "⚾",
+437	    "basket": "🧺",
+438	    "basketball": "🏀",
+439	    "bat": "🦇",
+440	    "bathtub": "🛁",
+441	    "battery": "🔋",
+442	    "beach_with_umbrella": "🏖",
+443	    "beaming_face_with_smiling_eyes": "😁",
+444	    "bear_face": "🐻",
+445	    "bearded_person": "🧔",
+446	    "bearded_person_dark_skin_tone": "🧔🏿",
+447	    "bearded_person_light_skin_tone": "🧔🏻",
+448	    "bearded_person_medium-dark_skin_tone": "🧔🏾",
+449	    "bearded_person_medium-light_skin_tone": "🧔🏼",
+450	    "bearded_person_medium_skin_tone": "🧔🏽",
+451	    "beating_heart": "💓",
+452	    "bed": "🛏",
+453	    "beer_mug": "🍺",
+454	    "bell": "🔔",
+455	    "bell_with_slash": "🔕",
+456	    "bellhop_bell": "🛎",
+457	    "bento_box": "🍱",
+458	    "beverage_box": "🧃",
+459	    "bicycle": "🚲",
+460	    "bikini": "👙",
+461	    "billed_cap": "🧢",
+462	    "biohazard": "☣",
+463	    "bird": "🐦",
+464	    "birthday_cake": "🎂",
+465	    "black_circle": "⚫",
+466	    "black_flag": "🏴",
+467	    "black_heart": "🖤",
+468	    "black_large_square": "⬛",
+469	    "black_medium-small_square": "◾",
+470	    "black_medium_square": "◼",
+471	    "black_nib": "✒",
+472	    "black_small_square": "▪",
+473	    "black_square_button": "🔲",
+474	    "blond-haired_man": "👱\u200d♂️",
+475	    "blond-haired_man_dark_skin_tone": "👱🏿\u200d♂️",
+476	    "blond-haired_man_light_skin_tone": "👱🏻\u200d♂️",
+477	    "blond-haired_man_medium-dark_skin_tone": "👱🏾\u200d♂️",
+478	    "blond-haired_man_medium-light_skin_tone": "👱🏼\u200d♂️",
+479	    "blond-haired_man_medium_skin_tone": "👱🏽\u200d♂️",
+480	    "blond-haired_person": "👱",
+481	    "blond-haired_person_dark_skin_tone": "👱🏿",
+482	    "blond-haired_person_light_skin_tone": "👱🏻",
+483	    "blond-haired_person_medium-dark_skin_tone": "👱🏾",
+484	    "blond-haired_person_medium-light_skin_tone": "👱🏼",
+485	    "blond-haired_person_medium_skin_tone": "👱🏽",
+486	    "blond-haired_woman": "👱\u200d♀️",
+487	    "blond-haired_woman_dark_skin_tone": "👱🏿\u200d♀️",
+488	    "blond-haired_woman_light_skin_tone": "👱🏻\u200d♀️",
+489	    "blond-haired_woman_medium-dark_skin_tone": "👱🏾\u200d♀️",
+490	    "blond-haired_woman_medium-light_skin_tone": "👱🏼\u200d♀️",
+491	    "blond-haired_woman_medium_skin_tone": "👱🏽\u200d♀️",
+492	    "blossom": "🌼",
+493	    "blowfish": "🐡",
+494	    "blue_book": "📘",
+495	    "blue_circle": "🔵",
+496	    "blue_heart": "💙",
+497	    "blue_square": "🟦",
+498	    "boar": "🐗",
+499	    "bomb": "💣",
+500	    "bone": "🦴",
+501	    "bookmark": "🔖",
+502	    "bookmark_tabs": "📑",
+503	    "books": "📚",
+504	    "bottle_with_popping_cork": "🍾",
+505	    "bouquet": "💐",
+506	    "bow_and_arrow": "🏹",
+507	    "bowl_with_spoon": "🥣",
+508	    "bowling": "🎳",
+509	    "boxing_glove": "🥊",
+510	    "boy": "👦",
+511	    "boy_dark_skin_tone": "👦🏿",
+512	    "boy_light_skin_tone": "👦🏻",
+513	    "boy_medium-dark_skin_tone": "👦🏾",
+514	    "boy_medium-light_skin_tone": "👦🏼",
+515	    "boy_medium_skin_tone": "👦🏽",
+516	    "brain": "🧠",
+517	    "bread": "🍞",
+518	    "breast-feeding": "🤱",
+519	    "breast-feeding_dark_skin_tone": "🤱🏿",
+520	    "breast-feeding_light_skin_tone": "🤱🏻",
+521	    "breast-feeding_medium-dark_skin_tone": "🤱🏾",
+522	    "breast-feeding_medium-light_skin_tone": "🤱🏼",
+523	    "breast-feeding_medium_skin_tone": "🤱🏽",
+524	    "brick": "🧱",
+525	    "bride_with_veil": "👰",
+526	    "bride_with_veil_dark_skin_tone": "👰🏿",
+527	    "bride_with_veil_light_skin_tone": "👰🏻",
+528	    "bride_with_veil_medium-dark_skin_tone": "👰🏾",
+529	    "bride_with_veil_medium-light_skin_tone": "👰🏼",
+530	    "bride_with_veil_medium_skin_tone": "👰🏽",
+531	    "bridge_at_night": "🌉",
+532	    "briefcase": "💼",
+533	    "briefs": "🩲",
+534	    "bright_button": "🔆",
+535	    "broccoli": "🥦",
+536	    "broken_heart": "💔",
+537	    "broom": "🧹",
+538	    "brown_circle": "🟤",
+539	    "brown_heart": "🤎",
+540	    "brown_square": "🟫",
+541	    "bug": "🐛",
+542	    "building_construction": "🏗",
+543	    "bullet_train": "🚅",
+544	    "burrito": "🌯",
+545	    "bus": "🚌",
+546	    "bus_stop": "🚏",
+547	    "bust_in_silhouette": "👤",
+548	    "busts_in_silhouette": "👥",
+549	    "butter": "🧈",
+550	    "butterfly": "🦋",
+551	    "cactus": "🌵",
+552	    "calendar": "📆",
+553	    "call_me_hand": "🤙",
+554	    "call_me_hand_dark_skin_tone": "🤙🏿",
+555	    "call_me_hand_light_skin_tone": "🤙🏻",
+556	    "call_me_hand_medium-dark_skin_tone": "🤙🏾",
+557	    "call_me_hand_medium-light_skin_tone": "🤙🏼",
+558	    "call_me_hand_medium_skin_tone": "🤙🏽",
+559	    "camel": "🐫",
+560	    "camera": "📷",
+561	    "camera_with_flash": "📸",
+562	    "camping": "🏕",
+563	    "candle": "🕯",
+564	    "candy": "🍬",
+565	    "canned_food": "🥫",
+566	    "canoe": "🛶",
+567	    "card_file_box": "🗃",
+568	    "card_index": "📇",
+569	    "card_index_dividers": "🗂",
+570	    "carousel_horse": "🎠",
+571	    "carp_streamer": "🎏",
+572	    "carrot": "🥕",
+573	    "castle": "🏰",
+574	    "cat": "🐱",
+575	    "cat_face": "🐱",
+576	    "cat_face_with_tears_of_joy": "😹",
+577	    "cat_face_with_wry_smile": "😼",
+578	    "chains": "⛓",
+579	    "chair": "🪑",
+580	    "chart_decreasing": "📉",
+581	    "chart_increasing": "📈",
+582	    "chart_increasing_with_yen": "💹",
+583	    "cheese_wedge": "🧀",
+584	    "chequered_flag": "🏁",
+585	    "cherries": "🍒",
+586	    "cherry_blossom": "🌸",
+587	    "chess_pawn": "♟",
+588	    "chestnut": "🌰",
+589	    "chicken": "🐔",
+590	    "child": "🧒",
+591	    "child_dark_skin_tone": "🧒🏿",
+592	    "child_light_skin_tone": "🧒🏻",
+593	    "child_medium-dark_skin_tone": "🧒🏾",
+594	    "child_medium-light_skin_tone": "🧒🏼",
+595	    "child_medium_skin_tone": "🧒🏽",
+596	    "children_crossing": "🚸",
+597	    "chipmunk": "🐿",
+598	    "chocolate_bar": "🍫",
+599	    "chopsticks": "🥢",
+600	    "church": "⛪",
+601	    "cigarette": "🚬",
+602	    "cinema": "🎦",
+603	    "circled_m": "Ⓜ",
+604	    "circus_tent": "🎪",
+605	    "cityscape": "🏙",
+606	    "cityscape_at_dusk": "🌆",
+607	    "clamp": "🗜",
+608	    "clapper_board": "🎬",
+609	    "clapping_hands": "👏",
+610	    "clapping_hands_dark_skin_tone": "👏🏿",
+611	    "clapping_hands_light_skin_tone": "👏🏻",
+612	    "clapping_hands_medium-dark_skin_tone": "👏🏾",
+613	    "clapping_hands_medium-light_skin_tone": "👏🏼",
+614	    "clapping_hands_medium_skin_tone": "👏🏽",
+615	    "classical_building": "🏛",
+616	    "clinking_beer_mugs": "🍻",
+617	    "clinking_glasses": "🥂",
+618	    "clipboard": "📋",
+619	    "clockwise_vertical_arrows": "🔃",
+620	    "closed_book": "📕",
+621	    "closed_mailbox_with_lowered_flag": "📪",
+622	    "closed_mailbox_with_raised_flag": "📫",
+623	    "closed_umbrella": "🌂",
+624	    "cloud": "☁",
+625	    "cloud_with_lightning": "🌩",
+626	    "cloud_with_lightning_and_rain": "⛈",
+627	    "cloud_with_rain": "🌧",
+628	    "cloud_with_snow": "🌨",
+629	    "clown_face": "🤡",
+630	    "club_suit": "♣",
+631	    "clutch_bag": "👝",
+632	    "coat": "🧥",
+633	    "cocktail_glass": "🍸",
+634	    "coconut": "🥥",
+635	    "coffin": "⚰",
+636	    "cold_face": "🥶",
+637	    "collision": "💥",
+638	    "comet": "☄",
+639	    "compass": "🧭",
+640	    "computer_disk": "💽",
+641	    "computer_mouse": "🖱",
+642	    "confetti_ball": "🎊",
+643	    "confounded_face": "😖",
+644	    "confused_face": "😕",
+645	    "construction": "🚧",
+646	    "construction_worker": "👷",
+647	    "construction_worker_dark_skin_tone": "👷🏿",
+648	    "construction_worker_light_skin_tone": "👷🏻",
+649	    "construction_worker_medium-dark_skin_tone": "👷🏾",
+650	    "construction_worker_medium-light_skin_tone": "👷🏼",
+651	    "construction_worker_medium_skin_tone": "👷🏽",
+652	    "control_knobs": "🎛",
+653	    "convenience_store": "🏪",
+654	    "cooked_rice": "🍚",
+655	    "cookie": "🍪",
+656	    "cooking": "🍳",
+657	    "copyright": "©",
+658	    "couch_and_lamp": "🛋",
+659	    "counterclockwise_arrows_button": "🔄",
+660	    "couple_with_heart": "💑",
+661	    "couple_with_heart_man_man": "👨\u200d❤️\u200d👨",
+662	    "couple_with_heart_woman_man": "👩\u200d❤️\u200d👨",
+663	    "couple_with_heart_woman_woman": "👩\u200d❤️\u200d👩",
+664	    "cow": "🐮",
+665	    "cow_face": "🐮",
+666	    "cowboy_hat_face": "🤠",
+667	    "crab": "🦀",
+668	    "crayon": "🖍",
+669	    "credit_card": "💳",
+670	    "crescent_moon": "🌙",
+671	    "cricket": "🦗",
+672	    "cricket_game": "🏏",
+673	    "crocodile": "🐊",
+674	    "croissant": "🥐",
+675	    "cross_mark": "❌",
+676	    "cross_mark_button": "❎",
+677	    "crossed_fingers": "🤞",
+678	    "crossed_fingers_dark_skin_tone": "🤞🏿",
+679	    "crossed_fingers_light_skin_tone": "🤞🏻",
+680	    "crossed_fingers_medium-dark_skin_tone": "🤞🏾",
+681	    "crossed_fingers_medium-light_skin_tone": "🤞🏼",
+682	    "crossed_fingers_medium_skin_tone": "🤞🏽",
+683	    "crossed_flags": "🎌",
+684	    "crossed_swords": "⚔",
+685	    "crown": "👑",
+686	    "crying_cat_face": "😿",
+687	    "crying_face": "😢",
+688	    "crystal_ball": "🔮",
+689	    "cucumber": "🥒",
+690	    "cupcake": "🧁",
+691	    "cup_with_straw": "🥤",
+692	    "curling_stone": "🥌",
+693	    "curly_hair": "🦱",
+694	    "curly-haired_man": "👨\u200d🦱",
+695	    "curly-haired_woman": "👩\u200d🦱",
+696	    "curly_loop": "➰",
+697	    "currency_exchange": "💱",
+698	    "curry_rice": "🍛",
+699	    "custard": "🍮",
+700	    "customs": "🛃",
+701	    "cut_of_meat": "🥩",
+702	    "cyclone": "🌀",
+703	    "dagger": "🗡",
+704	    "dango": "🍡",
+705	    "dashing_away": "💨",
+706	    "deaf_person": "🧏",
+707	    "deciduous_tree": "🌳",
+708	    "deer": "🦌",
+709	    "delivery_truck": "🚚",
+710	    "department_store": "🏬",
+711	    "derelict_house": "🏚",
+712	    "desert": "🏜",
+713	    "desert_island": "🏝",
+714	    "desktop_computer": "🖥",
+715	    "detective": "🕵",
+716	    "detective_dark_skin_tone": "🕵🏿",
+717	    "detective_light_skin_tone": "🕵🏻",
+718	    "detective_medium-dark_skin_tone": "🕵🏾",
+719	    "detective_medium-light_skin_tone": "🕵🏼",
+720	    "detective_medium_skin_tone": "🕵🏽",
+721	    "diamond_suit": "♦",
+722	    "diamond_with_a_dot": "💠",
+723	    "dim_button": "🔅",
+724	    "direct_hit": "🎯",
+725	    "disappointed_face": "😞",
+726	    "diving_mask": "🤿",
+727	    "diya_lamp": "🪔",
+728	    "dizzy": "💫",
+729	    "dizzy_face": "😵",
+730	    "dna": "🧬",
+731	    "dog": "🐶",
+732	    "dog_face": "🐶",
+733	    "dollar_banknote": "💵",
+734	    "dolphin": "🐬",
+735	    "door": "🚪",
+736	    "dotted_six-pointed_star": "🔯",
+737	    "double_curly_loop": "➿",
+738	    "double_exclamation_mark": "‼",
+739	    "doughnut": "🍩",
+740	    "dove": "🕊",
+741	    "down-left_arrow": "↙",
+742	    "down-right_arrow": "↘",
+743	    "down_arrow": "⬇",
+744	    "downcast_face_with_sweat": "😓",
+745	    "downwards_button": "🔽",
+746	    "dragon": "🐉",
+747	    "dragon_face": "🐲",
+748	    "dress": "👗",
+749	    "drooling_face": "🤤",
+750	    "drop_of_blood": "🩸",
+751	    "droplet": "💧",
+752	    "drum": "🥁",
+753	    "duck": "🦆",
+754	    "dumpling": "🥟",
+755	    "dvd": "📀",
+756	    "e-mail": "📧",
+757	    "eagle": "🦅",
+758	    "ear": "👂",
+759	    "ear_dark_skin_tone": "👂🏿",
+760	    "ear_light_skin_tone": "👂🏻",
+761	    "ear_medium-dark_skin_tone": "👂🏾",
+762	    "ear_medium-light_skin_tone": "👂🏼",
+763	    "ear_medium_skin_tone": "👂🏽",
+764	    "ear_of_corn": "🌽",
+765	    "ear_with_hearing_aid": "🦻",
+766	    "egg": "🍳",
+767	    "eggplant": "🍆",
+768	    "eight-pointed_star": "✴",
+769	    "eight-spoked_asterisk": "✳",
+770	    "eight-thirty": "🕣",
+771	    "eight_o’clock": "🕗",
+772	    "eject_button": "⏏",
+773	    "electric_plug": "🔌",
+774	    "elephant": "🐘",
+775	    "eleven-thirty": "🕦",
+776	    "eleven_o’clock": "🕚",
+777	    "elf": "🧝",
+778	    "elf_dark_skin_tone": "🧝🏿",
+779	    "elf_light_skin_tone": "🧝🏻",
+780	    "elf_medium-dark_skin_tone": "🧝🏾",
+781	    "elf_medium-light_skin_tone": "🧝🏼",
+782	    "elf_medium_skin_tone": "🧝🏽",
+783	    "envelope": "✉",
+784	    "envelope_with_arrow": "📩",
+785	    "euro_banknote": "💶",
+786	    "evergreen_tree": "🌲",
+787	    "ewe": "🐑",
+788	    "exclamation_mark": "❗",
+789	    "exclamation_question_mark": "⁉",
+790	    "exploding_head": "🤯",
+791	    "expressionless_face": "😑",
+792	    "eye": "👁",
+793	    "eye_in_speech_bubble": "👁️\u200d🗨️",
+794	    "eyes": "👀",
+795	    "face_blowing_a_kiss": "😘",
+796	    "face_savoring_food": "😋",
+797	    "face_screaming_in_fear": "😱",
+798	    "face_vomiting": "🤮",
+799	    "face_with_hand_over_mouth": "🤭",
+800	    "face_with_head-bandage": "🤕",
+801	    "face_with_medical_mask": "😷",
+802	    "face_with_monocle": "🧐",
+803	    "face_with_open_mouth": "😮",
+804	    "face_with_raised_eyebrow": "🤨",
+805	    "face_with_rolling_eyes": "🙄",
+806	    "face_with_steam_from_nose": "😤",
+807	    "face_with_symbols_on_mouth": "🤬",
+808	    "face_with_tears_of_joy": "😂",
+809	    "face_with_thermometer": "🤒",
+810	    "face_with_tongue": "😛",
+811	    "face_without_mouth": "😶",
+812	    "factory": "🏭",
+813	    "fairy": "🧚",
+814	    "fairy_dark_skin_tone": "🧚🏿",
+815	    "fairy_light_skin_tone": "🧚🏻",
+816	    "fairy_medium-dark_skin_tone": "🧚🏾",
+817	    "fairy_medium-light_skin_tone": "🧚🏼",
+818	    "fairy_medium_skin_tone": "🧚🏽",
+819	    "falafel": "🧆",
+820	    "fallen_leaf": "🍂",
+821	    "family": "👪",
+822	    "family_man_boy": "👨\u200d👦",
+823	    "family_man_boy_boy": "👨\u200d👦\u200d👦",
+824	    "family_man_girl": "👨\u200d👧",
+825	    "family_man_girl_boy": "👨\u200d👧\u200d👦",
+826	    "family_man_girl_girl": "👨\u200d👧\u200d👧",
+827	    "family_man_man_boy": "👨\u200d👨\u200d👦",
+828	    "family_man_man_boy_boy": "👨\u200d👨\u200d👦\u200d👦",
+829	    "family_man_man_girl": "👨\u200d👨\u200d👧",
+830	    "family_man_man_girl_boy": "👨\u200d👨\u200d👧\u200d👦",
+831	    "family_man_man_girl_girl": "👨\u200d👨\u200d👧\u200d👧",
+832	    "family_man_woman_boy": "👨\u200d👩\u200d👦",
+833	    "family_man_woman_boy_boy": "👨\u200d👩\u200d👦\u200d👦",
+834	    "family_man_woman_girl": "👨\u200d👩\u200d👧",
+835	    "family_man_woman_girl_boy": "👨\u200d👩\u200d👧\u200d👦",
+836	    "family_man_woman_girl_girl": "👨\u200d👩\u200d👧\u200d👧",
+837	    "family_woman_boy": "👩\u200d👦",
+838	    "family_woman_boy_boy": "👩\u200d👦\u200d👦",
+839	    "family_woman_girl": "👩\u200d👧",
+840	    "family_woman_girl_boy": "👩\u200d👧\u200d👦",
+841	    "family_woman_girl_girl": "👩\u200d👧\u200d👧",
+842	    "family_woman_woman_boy": "👩\u200d👩\u200d👦",
+843	    "family_woman_woman_boy_boy": "👩\u200d👩\u200d👦\u200d👦",
+844	    "family_woman_woman_girl": "👩\u200d👩\u200d👧",
+845	    "family_woman_woman_girl_boy": "👩\u200d👩\u200d👧\u200d👦",
+846	    "family_woman_woman_girl_girl": "👩\u200d👩\u200d👧\u200d👧",
+847	    "fast-forward_button": "⏩",
+848	    "fast_down_button": "⏬",
+849	    "fast_reverse_button": "⏪",
+850	    "fast_up_button": "⏫",
+851	    "fax_machine": "📠",
+852	    "fearful_face": "😨",
+853	    "female_sign": "♀",
+854	    "ferris_wheel": "🎡",
+855	    "ferry": "⛴",
+856	    "field_hockey": "🏑",
+857	    "file_cabinet": "🗄",
+858	    "file_folder": "📁",
+859	    "film_frames": "🎞",
+860	    "film_projector": "📽",
+861	    "fire": "🔥",
+862	    "fire_extinguisher": "🧯",
+863	    "firecracker": "🧨",
+864	    "fire_engine": "🚒",
+865	    "fireworks": "🎆",
+866	    "first_quarter_moon": "🌓",
+867	    "first_quarter_moon_face": "🌛",
+868	    "fish": "🐟",
+869	    "fish_cake_with_swirl": "🍥",
+870	    "fishing_pole": "🎣",
+871	    "five-thirty": "🕠",
+872	    "five_o’clock": "🕔",
+873	    "flag_in_hole": "⛳",
+874	    "flamingo": "🦩",
+875	    "flashlight": "🔦",
+876	    "flat_shoe": "🥿",
+877	    "fleur-de-lis": "⚜",
+878	    "flexed_biceps": "💪",
+879	    "flexed_biceps_dark_skin_tone": "💪🏿",
+880	    "flexed_biceps_light_skin_tone": "💪🏻",
+881	    "flexed_biceps_medium-dark_skin_tone": "💪🏾",
+882	    "flexed_biceps_medium-light_skin_tone": "💪🏼",
+883	    "flexed_biceps_medium_skin_tone": "💪🏽",
+884	    "floppy_disk": "💾",
+885	    "flower_playing_cards": "🎴",
+886	    "flushed_face": "😳",
+887	    "flying_disc": "🥏",
+888	    "flying_saucer": "🛸",
+889	    "fog": "🌫",
+890	    "foggy": "🌁",
+891	    "folded_hands": "🙏",
+892	    "folded_hands_dark_skin_tone": "🙏🏿",
+893	    "folded_hands_light_skin_tone": "🙏🏻",
+894	    "folded_hands_medium-dark_skin_tone": "🙏🏾",
+895	    "folded_hands_medium-light_skin_tone": "🙏🏼",
+896	    "folded_hands_medium_skin_tone": "🙏🏽",
+897	    "foot": "🦶",
+898	    "footprints": "👣",
+899	    "fork_and_knife": "🍴",
+900	    "fork_and_knife_with_plate": "🍽",
+901	    "fortune_cookie": "🥠",
+902	    "fountain": "⛲",
+903	    "fountain_pen": "🖋",
+904	    "four-thirty": "🕟",
+905	    "four_leaf_clover": "🍀",
+906	    "four_o’clock": "🕓",
+907	    "fox_face": "🦊",
+908	    "framed_picture": "🖼",
+909	    "french_fries": "🍟",
+910	    "fried_shrimp": "🍤",
+911	    "frog_face": "🐸",
+912	    "front-facing_baby_chick": "🐥",
+913	    "frowning_face": "☹",
+914	    "frowning_face_with_open_mouth": "😦",
+915	    "fuel_pump": "⛽",
+916	    "full_moon": "🌕",
+917	    "full_moon_face": "🌝",
+918	    "funeral_urn": "⚱",
+919	    "game_die": "🎲",
+920	    "garlic": "🧄",
+921	    "gear": "⚙",
+922	    "gem_stone": "💎",
+923	    "genie": "🧞",
+924	    "ghost": "👻",
+925	    "giraffe": "🦒",
+926	    "girl": "👧",
+927	    "girl_dark_skin_tone": "👧🏿",
+928	    "girl_light_skin_tone": "👧🏻",
+929	    "girl_medium-dark_skin_tone": "👧🏾",
+930	    "girl_medium-light_skin_tone": "👧🏼",
+931	    "girl_medium_skin_tone": "👧🏽",
+932	    "glass_of_milk": "🥛",
+933	    "glasses": "👓",
+934	    "globe_showing_americas": "🌎",
+935	    "globe_showing_asia-australia": "🌏",
+936	    "globe_showing_europe-africa": "🌍",
+937	    "globe_with_meridians": "🌐",
+938	    "gloves": "🧤",
+939	    "glowing_star": "🌟",
+940	    "goal_net": "🥅",
+941	    "goat": "🐐",
+942	    "goblin": "👺",
+943	    "goggles": "🥽",
+944	    "gorilla": "🦍",
+945	    "graduation_cap": "🎓",
+946	    "grapes": "🍇",
+947	    "green_apple": "🍏",
+948	    "green_book": "📗",
+949	    "green_circle": "🟢",
+950	    "green_heart": "💚",
+951	    "green_salad": "🥗",
+952	    "green_square": "🟩",
+953	    "grimacing_face": "😬",
+954	    "grinning_cat_face": "😺",
+955	    "grinning_cat_face_with_smiling_eyes": "😸",
+956	    "grinning_face": "😀",
+957	    "grinning_face_with_big_eyes": "😃",
+958	    "grinning_face_with_smiling_eyes": "😄",
+959	    "grinning_face_with_sweat": "😅",
+960	    "grinning_squinting_face": "😆",
+961	    "growing_heart": "💗",
+962	    "guard": "💂",
+963	    "guard_dark_skin_tone": "💂🏿",
+964	    "guard_light_skin_tone": "💂🏻",
+965	    "guard_medium-dark_skin_tone": "💂🏾",
+966	    "guard_medium-light_skin_tone": "💂🏼",
+967	    "guard_medium_skin_tone": "💂🏽",
+968	    "guide_dog": "🦮",
+969	    "guitar": "🎸",
+970	    "hamburger": "🍔",
+971	    "hammer": "🔨",
+972	    "hammer_and_pick": "⚒",
+973	    "hammer_and_wrench": "🛠",
+974	    "hamster_face": "🐹",
+975	    "hand_with_fingers_splayed": "🖐",
+976	    "hand_with_fingers_splayed_dark_skin_tone": "🖐🏿",
+977	    "hand_with_fingers_splayed_light_skin_tone": "🖐🏻",
+978	    "hand_with_fingers_splayed_medium-dark_skin_tone": "🖐🏾",
+979	    "hand_with_fingers_splayed_medium-light_skin_tone": "🖐🏼",
+980	    "hand_with_fingers_splayed_medium_skin_tone": "🖐🏽",
+981	    "handbag": "👜",
+982	    "handshake": "🤝",
+983	    "hatching_chick": "🐣",
+984	    "headphone": "🎧",
+985	    "hear-no-evil_monkey": "🙉",
+986	    "heart_decoration": "💟",
+987	    "heart_suit": "♥",
+988	    "heart_with_arrow": "💘",
+989	    "heart_with_ribbon": "💝",
+990	    "heavy_check_mark": "✔",
+991	    "heavy_division_sign": "➗",
+992	    "heavy_dollar_sign": "💲",
+993	    "heavy_heart_exclamation": "❣",
+994	    "heavy_large_circle": "⭕",
+995	    "heavy_minus_sign": "➖",
+996	    "heavy_multiplication_x": "✖",
+997	    "heavy_plus_sign": "➕",
+998	    "hedgehog": "🦔",
+999	    "helicopter": "🚁",
+1000	    "herb": "🌿",
+1001	    "hibiscus": "🌺",
+1002	    "high-heeled_shoe": "👠",
+1003	    "high-speed_train": "🚄",
+1004	    "high_voltage": "⚡",
+1005	    "hiking_boot": "🥾",
+1006	    "hindu_temple": "🛕",
+1007	    "hippopotamus": "🦛",
+1008	    "hole": "🕳",
+1009	    "honey_pot": "🍯",
+1010	    "honeybee": "🐝",
+1011	    "horizontal_traffic_light": "🚥",
+1012	    "horse": "🐴",
+1013	    "horse_face": "🐴",
+1014	    "horse_racing": "🏇",
+1015	    "horse_racing_dark_skin_tone": "🏇🏿",
+1016	    "horse_racing_light_skin_tone": "🏇🏻",
+1017	    "horse_racing_medium-dark_skin_tone": "🏇🏾",
+1018	    "horse_racing_medium-light_skin_tone": "🏇🏼",
+1019	    "horse_racing_medium_skin_tone": "🏇🏽",
+1020	    "hospital": "🏥",
+1021	    "hot_beverage": "☕",
+1022	    "hot_dog": "🌭",
+1023	    "hot_face": "🥵",
+1024	    "hot_pepper": "🌶",
+1025	    "hot_springs": "♨",
+1026	    "hotel": "🏨",
+1027	    "hourglass_done": "⌛",
+1028	    "hourglass_not_done": "⏳",
+1029	    "house": "🏠",
+1030	    "house_with_garden": "🏡",
+1031	    "houses": "🏘",
+1032	    "hugging_face": "🤗",
+1033	    "hundred_points": "💯",
+1034	    "hushed_face": "😯",
+1035	    "ice": "🧊",
+1036	    "ice_cream": "🍨",
+1037	    "ice_hockey": "🏒",
+1038	    "ice_skate": "⛸",
+1039	    "inbox_tray": "📥",
+1040	    "incoming_envelope": "📨",
+1041	    "index_pointing_up": "☝",
+1042	    "index_pointing_up_dark_skin_tone": "☝🏿",
+1043	    "index_pointing_up_light_skin_tone": "☝🏻",
+1044	    "index_pointing_up_medium-dark_skin_tone": "☝🏾",
+1045	    "index_pointing_up_medium-light_skin_tone": "☝🏼",
+1046	    "index_pointing_up_medium_skin_tone": "☝🏽",
+1047	    "infinity": "♾",
+1048	    "information": "ℹ",
+1049	    "input_latin_letters": "🔤",
+1050	    "input_latin_lowercase": "🔡",
+1051	    "input_latin_uppercase": "🔠",
+1052	    "input_numbers": "🔢",
+1053	    "input_symbols": "🔣",
+1054	    "jack-o-lantern": "🎃",
+1055	    "jeans": "👖",
+1056	    "jigsaw": "🧩",
+1057	    "joker": "🃏",
+1058	    "joystick": "🕹",
+1059	    "kaaba": "🕋",
+1060	    "kangaroo": "🦘",
+1061	    "key": "🔑",
+1062	    "keyboard": "⌨",
+1063	    "keycap_#": "#️⃣",
+1064	    "keycap_*": "*️⃣",
+1065	    "keycap_0": "0️⃣",
+1066	    "keycap_1": "1️⃣",
+1067	    "keycap_10": "🔟",
+1068	    "keycap_2": "2️⃣",
+1069	    "keycap_3": "3️⃣",
+1070	    "keycap_4": "4️⃣",
+1071	    "keycap_5": "5️⃣",
+1072	    "keycap_6": "6️⃣",
+1073	    "keycap_7": "7️⃣",
+1074	    "keycap_8": "8️⃣",
+1075	    "keycap_9": "9️⃣",
+1076	    "kick_scooter": "🛴",
+1077	    "kimono": "👘",
+1078	    "kiss": "💋",
+1079	    "kiss_man_man": "👨\u200d❤️\u200d💋\u200d👨",
+1080	    "kiss_mark": "💋",
+1081	    "kiss_woman_man": "👩\u200d❤️\u200d💋\u200d👨",
+1082	    "kiss_woman_woman": "👩\u200d❤️\u200d💋\u200d👩",
+1083	    "kissing_cat_face": "😽",
+1084	    "kissing_face": "😗",
+1085	    "kissing_face_with_closed_eyes": "😚",
+1086	    "kissing_face_with_smiling_eyes": "😙",
+1087	    "kitchen_knife": "🔪",
+1088	    "kite": "🪁",
+1089	    "kiwi_fruit": "🥝",
+1090	    "koala": "🐨",
+1091	    "lab_coat": "🥼",
+1092	    "label": "🏷",
+1093	    "lacrosse": "🥍",
+1094	    "lady_beetle": "🐞",
+1095	    "laptop_computer": "💻",
+1096	    "large_blue_diamond": "🔷",
+1097	    "large_orange_diamond": "🔶",
+1098	    "last_quarter_moon": "🌗",
+1099	    "last_quarter_moon_face": "🌜",
+1100	    "last_track_button": "⏮",
+1101	    "latin_cross": "✝",
+1102	    "leaf_fluttering_in_wind": "🍃",
+1103	    "leafy_green": "🥬",
+1104	    "ledger": "📒",
+1105	    "left-facing_fist": "🤛",
+1106	    "left-facing_fist_dark_skin_tone": "🤛🏿",
+1107	    "left-facing_fist_light_skin_tone": "🤛🏻",
+1108	    "left-facing_fist_medium-dark_skin_tone": "🤛🏾",
+1109	    "left-facing_fist_medium-light_skin_tone": "🤛🏼",
+1110	    "left-facing_fist_medium_skin_tone": "🤛🏽",
+1111	    "left-right_arrow": "↔",
+1112	    "left_arrow": "⬅",
+1113	    "left_arrow_curving_right": "↪",
+1114	    "left_luggage": "🛅",
+1115	    "left_speech_bubble": "🗨",
+1116	    "leg": "🦵",
+1117	    "lemon": "🍋",
+1118	    "leopard": "🐆",
+1119	    "level_slider": "🎚",
+1120	    "light_bulb": "💡",
+1121	    "light_rail": "🚈",
+1122	    "link": "🔗",
+1123	    "linked_paperclips": "🖇",
+1124	    "lion_face": "🦁",
+1125	    "lipstick": "💄",
+1126	    "litter_in_bin_sign": "🚮",
+1127	    "lizard": "🦎",
+1128	    "llama": "🦙",
+1129	    "lobster": "🦞",
+1130	    "locked": "🔒",
+1131	    "locked_with_key": "🔐",
+1132	    "locked_with_pen": "🔏",
+1133	    "locomotive": "🚂",
+1134	    "lollipop": "🍭",
+1135	    "lotion_bottle": "🧴",
+1136	    "loudly_crying_face": "😭",
+1137	    "loudspeaker": "📢",
+1138	    "love-you_gesture": "🤟",
+1139	    "love-you_gesture_dark_skin_tone": "🤟🏿",
+1140	    "love-you_gesture_light_skin_tone": "🤟🏻",
+1141	    "love-you_gesture_medium-dark_skin_tone": "🤟🏾",
+1142	    "love-you_gesture_medium-light_skin_tone": "🤟🏼",
+1143	    "love-you_gesture_medium_skin_tone": "🤟🏽",
+1144	    "love_hotel": "🏩",
+1145	    "love_letter": "💌",
+1146	    "luggage": "🧳",
+1147	    "lying_face": "🤥",
+1148	    "mage": "🧙",
+1149	    "mage_dark_skin_tone": "🧙🏿",
+1150	    "mage_light_skin_tone": "🧙🏻",
+1151	    "mage_medium-dark_skin_tone": "🧙🏾",
+1152	    "mage_medium-light_skin_tone": "🧙🏼",
+1153	    "mage_medium_skin_tone": "🧙🏽",
+1154	    "magnet": "🧲",
+1155	    "magnifying_glass_tilted_left": "🔍",
+1156	    "magnifying_glass_tilted_right": "🔎",
+1157	    "mahjong_red_dragon": "🀄",
+1158	    "male_sign": "♂",
+1159	    "man": "👨",
+1160	    "man_and_woman_holding_hands": "👫",
+1161	    "man_artist": "👨\u200d🎨",
+1162	    "man_artist_dark_skin_tone": "👨🏿\u200d🎨",
+1163	    "man_artist_light_skin_tone": "👨🏻\u200d🎨",
+1164	    "man_artist_medium-dark_skin_tone": "👨🏾\u200d🎨",
+1165	    "man_artist_medium-light_skin_tone": "👨🏼\u200d🎨",
+1166	    "man_artist_medium_skin_tone": "👨🏽\u200d🎨",
+1167	    "man_astronaut": "👨\u200d🚀",
+1168	    "man_astronaut_dark_skin_tone": "👨🏿\u200d🚀",
+1169	    "man_astronaut_light_skin_tone": "👨🏻\u200d🚀",
+1170	    "man_astronaut_medium-dark_skin_tone": "👨🏾\u200d🚀",
+1171	    "man_astronaut_medium-light_skin_tone": "👨🏼\u200d🚀",
+1172	    "man_astronaut_medium_skin_tone": "👨🏽\u200d🚀",
+1173	    "man_biking": "🚴\u200d♂️",
+1174	    "man_biking_dark_skin_tone": "🚴🏿\u200d♂️",
+1175	    "man_biking_light_skin_tone": "🚴🏻\u200d♂️",
+1176	    "man_biking_medium-dark_skin_tone": "🚴🏾\u200d♂️",
+1177	    "man_biking_medium-light_skin_tone": "🚴🏼\u200d♂️",
+1178	    "man_biking_medium_skin_tone": "🚴🏽\u200d♂️",
+1179	    "man_bouncing_ball": "⛹️\u200d♂️",
+1180	    "man_bouncing_ball_dark_skin_tone": "⛹🏿\u200d♂️",
+1181	    "man_bouncing_ball_light_skin_tone": "⛹🏻\u200d♂️",
+1182	    "man_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♂️",
+1183	    "man_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♂️",
+1184	    "man_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♂️",
+1185	    "man_bowing": "🙇\u200d♂️",
+1186	    "man_bowing_dark_skin_tone": "🙇🏿\u200d♂️",
+1187	    "man_bowing_light_skin_tone": "🙇🏻\u200d♂️",
+1188	    "man_bowing_medium-dark_skin_tone": "🙇🏾\u200d♂️",
+1189	    "man_bowing_medium-light_skin_tone": "🙇🏼\u200d♂️",
+1190	    "man_bowing_medium_skin_tone": "🙇🏽\u200d♂️",
+1191	    "man_cartwheeling": "🤸\u200d♂️",
+1192	    "man_cartwheeling_dark_skin_tone": "🤸🏿\u200d♂️",
+1193	    "man_cartwheeling_light_skin_tone": "🤸🏻\u200d♂️",
+1194	    "man_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♂️",
+1195	    "man_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♂️",
+1196	    "man_cartwheeling_medium_skin_tone": "🤸🏽\u200d♂️",
+1197	    "man_climbing": "🧗\u200d♂️",
+1198	    "man_climbing_dark_skin_tone": "🧗🏿\u200d♂️",
+1199	    "man_climbing_light_skin_tone": "🧗🏻\u200d♂️",
+1200	    "man_climbing_medium-dark_skin_tone": "🧗🏾\u200d♂️",
+1201	    "man_climbing_medium-light_skin_tone": "🧗🏼\u200d♂️",
+1202	    "man_climbing_medium_skin_tone": "🧗🏽\u200d♂️",
+1203	    "man_construction_worker": "👷\u200d♂️",
+1204	    "man_construction_worker_dark_skin_tone": "👷🏿\u200d♂️",
+1205	    "man_construction_worker_light_skin_tone": "👷🏻\u200d♂️",
+1206	    "man_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♂️",
+1207	    "man_construction_worker_medium-light_skin_tone": "👷🏼\u200d♂️",
+1208	    "man_construction_worker_medium_skin_tone": "👷🏽\u200d♂️",
+1209	    "man_cook": "👨\u200d🍳",
+1210	    "man_cook_dark_skin_tone": "👨🏿\u200d🍳",
+1211	    "man_cook_light_skin_tone": "👨🏻\u200d🍳",
+1212	    "man_cook_medium-dark_skin_tone": "👨🏾\u200d🍳",
+1213	    "man_cook_medium-light_skin_tone": "👨🏼\u200d🍳",
+1214	    "man_cook_medium_skin_tone": "👨🏽\u200d🍳",
+1215	    "man_dancing": "🕺",
+1216	    "man_dancing_dark_skin_tone": "🕺🏿",
+1217	    "man_dancing_light_skin_tone": "🕺🏻",
+1218	    "man_dancing_medium-dark_skin_tone": "🕺🏾",
+1219	    "man_dancing_medium-light_skin_tone": "🕺🏼",
+1220	    "man_dancing_medium_skin_tone": "🕺🏽",
+1221	    "man_dark_skin_tone": "👨🏿",
+1222	    "man_detective": "🕵️\u200d♂️",
+1223	    "man_detective_dark_skin_tone": "🕵🏿\u200d♂️",
+1224	    "man_detective_light_skin_tone": "🕵🏻\u200d♂️",
+1225	    "man_detective_medium-dark_skin_tone": "🕵🏾\u200d♂️",
+1226	    "man_detective_medium-light_skin_tone": "🕵🏼\u200d♂️",
+1227	    "man_detective_medium_skin_tone": "🕵🏽\u200d♂️",
+1228	    "man_elf": "🧝\u200d♂️",
+1229	    "man_elf_dark_skin_tone": "🧝🏿\u200d♂️",
+1230	    "man_elf_light_skin_tone": "🧝🏻\u200d♂️",
+1231	    "man_elf_medium-dark_skin_tone": "🧝🏾\u200d♂️",
+1232	    "man_elf_medium-light_skin_tone": "🧝🏼\u200d♂️",
+1233	    "man_elf_medium_skin_tone": "🧝🏽\u200d♂️",
+1234	    "man_facepalming": "🤦\u200d♂️",
+1235	    "man_facepalming_dark_skin_tone": "🤦🏿\u200d♂️",
+1236	    "man_facepalming_light_skin_tone": "🤦🏻\u200d♂️",
+1237	    "man_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♂️",
+1238	    "man_facepalming_medium-light_skin_tone": "🤦🏼\u200d♂️",
+1239	    "man_facepalming_medium_skin_tone": "🤦🏽\u200d♂️",
+1240	    "man_factory_worker": "👨\u200d🏭",
+1241	    "man_factory_worker_dark_skin_tone": "👨🏿\u200d🏭",
+1242	    "man_factory_worker_light_skin_tone": "👨🏻\u200d🏭",
+1243	    "man_factory_worker_medium-dark_skin_tone": "👨🏾\u200d🏭",
+1244	    "man_factory_worker_medium-light_skin_tone": "👨🏼\u200d🏭",
+1245	    "man_factory_worker_medium_skin_tone": "👨🏽\u200d🏭",
+1246	    "man_fairy": "🧚\u200d♂️",
+1247	    "man_fairy_dark_skin_tone": "🧚🏿\u200d♂️",
+1248	    "man_fairy_light_skin_tone": "🧚🏻\u200d♂️",
+1249	    "man_fairy_medium-dark_skin_tone": "🧚🏾\u200d♂️",
+1250	    "man_fairy_medium-light_skin_tone": "🧚🏼\u200d♂️",
+1251	    "man_fairy_medium_skin_tone": "🧚🏽\u200d♂️",
+1252	    "man_farmer": "👨\u200d🌾",
+1253	    "man_farmer_dark_skin_tone": "👨🏿\u200d🌾",
+1254	    "man_farmer_light_skin_tone": "👨🏻\u200d🌾",
+1255	    "man_farmer_medium-dark_skin_tone": "👨🏾\u200d🌾",
+1256	    "man_farmer_medium-light_skin_tone": "👨🏼\u200d🌾",
+1257	    "man_farmer_medium_skin_tone": "👨🏽\u200d🌾",
+1258	    "man_firefighter": "👨\u200d🚒",
+1259	    "man_firefighter_dark_skin_tone": "👨🏿\u200d🚒",
+1260	    "man_firefighter_light_skin_tone": "👨🏻\u200d🚒",
+1261	    "man_firefighter_medium-dark_skin_tone": "👨🏾\u200d🚒",
+1262	    "man_firefighter_medium-light_skin_tone": "👨🏼\u200d🚒",
+1263	    "man_firefighter_medium_skin_tone": "👨🏽\u200d🚒",
+1264	    "man_frowning": "🙍\u200d♂️",
+1265	    "man_frowning_dark_skin_tone": "🙍🏿\u200d♂️",
+1266	    "man_frowning_light_skin_tone": "🙍🏻\u200d♂️",
+1267	    "man_frowning_medium-dark_skin_tone": "🙍🏾\u200d♂️",
+1268	    "man_frowning_medium-light_skin_tone": "🙍🏼\u200d♂️",
+1269	    "man_frowning_medium_skin_tone": "🙍🏽\u200d♂️",
+1270	    "man_genie": "🧞\u200d♂️",
+1271	    "man_gesturing_no": "🙅\u200d♂️",
+1272	    "man_gesturing_no_dark_skin_tone": "🙅🏿\u200d♂️",
+1273	    "man_gesturing_no_light_skin_tone": "🙅🏻\u200d♂️",
+1274	    "man_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♂️",
+1275	    "man_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♂️",
+1276	    "man_gesturing_no_medium_skin_tone": "🙅🏽\u200d♂️",
+1277	    "man_gesturing_ok": "🙆\u200d♂️",
+1278	    "man_gesturing_ok_dark_skin_tone": "🙆🏿\u200d♂️",
+1279	    "man_gesturing_ok_light_skin_tone": "🙆🏻\u200d♂️",
+1280	    "man_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♂️",
+1281	    "man_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♂️",
+1282	    "man_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♂️",
+1283	    "man_getting_haircut": "💇\u200d♂️",
+1284	    "man_getting_haircut_dark_skin_tone": "💇🏿\u200d♂️",
+1285	    "man_getting_haircut_light_skin_tone": "💇🏻\u200d♂️",
+1286	    "man_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♂️",
+1287	    "man_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♂️",
+1288	    "man_getting_haircut_medium_skin_tone": "💇🏽\u200d♂️",
+1289	    "man_getting_massage": "💆\u200d♂️",
+1290	    "man_getting_massage_dark_skin_tone": "💆🏿\u200d♂️",
+1291	    "man_getting_massage_light_skin_tone": "💆🏻\u200d♂️",
+1292	    "man_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♂️",
+1293	    "man_getting_massage_medium-light_skin_tone": "💆🏼\u200d♂️",
+1294	    "man_getting_massage_medium_skin_tone": "💆🏽\u200d♂️",
+1295	    "man_golfing": "🏌️\u200d♂️",
+1296	    "man_golfing_dark_skin_tone": "🏌🏿\u200d♂️",
+1297	    "man_golfing_light_skin_tone": "🏌🏻\u200d♂️",
+1298	    "man_golfing_medium-dark_skin_tone": "🏌🏾\u200d♂️",
+1299	    "man_golfing_medium-light_skin_tone": "🏌🏼\u200d♂️",
+1300	    "man_golfing_medium_skin_tone": "🏌🏽\u200d♂️",
+1301	    "man_guard": "💂\u200d♂️",
+1302	    "man_guard_dark_skin_tone": "💂🏿\u200d♂️",
+1303	    "man_guard_light_skin_tone": "💂🏻\u200d♂️",
+1304	    "man_guard_medium-dark_skin_tone": "💂🏾\u200d♂️",
+1305	    "man_guard_medium-light_skin_tone": "💂🏼\u200d♂️",
+1306	    "man_guard_medium_skin_tone": "💂🏽\u200d♂️",
+1307	    "man_health_worker": "👨\u200d⚕️",
+1308	    "man_health_worker_dark_skin_tone": "👨🏿\u200d⚕️",
+1309	    "man_health_worker_light_skin_tone": "👨🏻\u200d⚕️",
+1310	    "man_health_worker_medium-dark_skin_tone": "👨🏾\u200d⚕️",
+1311	    "man_health_worker_medium-light_skin_tone": "👨🏼\u200d⚕️",
+1312	    "man_health_worker_medium_skin_tone": "👨🏽\u200d⚕️",
+1313	    "man_in_lotus_position": "🧘\u200d♂️",
+1314	    "man_in_lotus_position_dark_skin_tone": "🧘🏿\u200d♂️",
+1315	    "man_in_lotus_position_light_skin_tone": "🧘🏻\u200d♂️",
+1316	    "man_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♂️",
+1317	    "man_in_lotus_position_medium-light_skin_tone": "🧘🏼\u200d♂️",
+1318	    "man_in_lotus_position_medium_skin_tone": "🧘🏽\u200d♂️",
+1319	    "man_in_manual_wheelchair": "👨\u200d🦽",
+1320	    "man_in_motorized_wheelchair": "👨\u200d🦼",
+1321	    "man_in_steamy_room": "🧖\u200d♂️",
+1322	    "man_in_steamy_room_dark_skin_tone": "🧖🏿\u200d♂️",
+1323	    "man_in_steamy_room_light_skin_tone": "🧖🏻\u200d♂️",
+1324	    "man_in_steamy_room_medium-dark_skin_tone": "🧖🏾\u200d♂️",
+1325	    "man_in_steamy_room_medium-light_skin_tone": "🧖🏼\u200d♂️",
+1326	    "man_in_steamy_room_medium_skin_tone": "🧖🏽\u200d♂️",
+1327	    "man_in_suit_levitating": "🕴",
+1328	    "man_in_suit_levitating_dark_skin_tone": "🕴🏿",
+1329	    "man_in_suit_levitating_light_skin_tone": "🕴🏻",
+1330	    "man_in_suit_levitating_medium-dark_skin_tone": "🕴🏾",
+1331	    "man_in_suit_levitating_medium-light_skin_tone": "🕴🏼",
+1332	    "man_in_suit_levitating_medium_skin_tone": "🕴🏽",
+1333	    "man_in_tuxedo": "🤵",
+1334	    "man_in_tuxedo_dark_skin_tone": "🤵🏿",
+1335	    "man_in_tuxedo_light_skin_tone": "🤵🏻",
+1336	    "man_in_tuxedo_medium-dark_skin_tone": "🤵🏾",
+1337	    "man_in_tuxedo_medium-light_skin_tone": "🤵🏼",
+1338	    "man_in_tuxedo_medium_skin_tone": "🤵🏽",
+1339	    "man_judge": "👨\u200d⚖️",
+1340	    "man_judge_dark_skin_tone": "👨🏿\u200d⚖️",
+1341	    "man_judge_light_skin_tone": "👨🏻\u200d⚖️",
+1342	    "man_judge_medium-dark_skin_tone": "👨🏾\u200d⚖️",
+1343	    "man_judge_medium-light_skin_tone": "👨🏼\u200d⚖️",
+1344	    "man_judge_medium_skin_tone": "👨🏽\u200d⚖️",
+1345	    "man_juggling": "🤹\u200d♂️",
+1346	    "man_juggling_dark_skin_tone": "🤹🏿\u200d♂️",
+1347	    "man_juggling_light_skin_tone": "🤹🏻\u200d♂️",
+1348	    "man_juggling_medium-dark_skin_tone": "🤹🏾\u200d♂️",
+1349	    "man_juggling_medium-light_skin_tone": "🤹🏼\u200d♂️",
+1350	    "man_juggling_medium_skin_tone": "🤹🏽\u200d♂️",
+1351	    "man_lifting_weights": "🏋️\u200d♂️",
+1352	    "man_lifting_weights_dark_skin_tone": "🏋🏿\u200d♂️",
+1353	    "man_lifting_weights_light_skin_tone": "🏋🏻\u200d♂️",
+1354	    "man_lifting_weights_medium-dark_skin_tone": "🏋🏾\u200d♂️",
+1355	    "man_lifting_weights_medium-light_skin_tone": "🏋🏼\u200d♂️",
+1356	    "man_lifting_weights_medium_skin_tone": "🏋🏽\u200d♂️",
+1357	    "man_light_skin_tone": "👨🏻",
+1358	    "man_mage": "🧙\u200d♂️",
+1359	    "man_mage_dark_skin_tone": "🧙🏿\u200d♂️",
+1360	    "man_mage_light_skin_tone": "🧙🏻\u200d♂️",
+1361	    "man_mage_medium-dark_skin_tone": "🧙🏾\u200d♂️",
+1362	    "man_mage_medium-light_skin_tone": "🧙🏼\u200d♂️",
+1363	    "man_mage_medium_skin_tone": "🧙🏽\u200d♂️",
+1364	    "man_mechanic": "👨\u200d🔧",
+1365	    "man_mechanic_dark_skin_tone": "👨🏿\u200d🔧",
+1366	    "man_mechanic_light_skin_tone": "👨🏻\u200d🔧",
+1367	    "man_mechanic_medium-dark_skin_tone": "👨🏾\u200d🔧",
+1368	    "man_mechanic_medium-light_skin_tone": "👨🏼\u200d🔧",
+1369	    "man_mechanic_medium_skin_tone": "👨🏽\u200d🔧",
+1370	    "man_medium-dark_skin_tone": "👨🏾",
+1371	    "man_medium-light_skin_tone": "👨🏼",
+1372	    "man_medium_skin_tone": "👨🏽",
+1373	    "man_mountain_biking": "🚵\u200d♂️",
+1374	    "man_mountain_biking_dark_skin_tone": "🚵🏿\u200d♂️",
+1375	    "man_mountain_biking_light_skin_tone": "🚵🏻\u200d♂️",
+1376	    "man_mountain_biking_medium-dark_skin_tone": "🚵🏾\u200d♂️",
+1377	    "man_mountain_biking_medium-light_skin_tone": "🚵🏼\u200d♂️",
+1378	    "man_mountain_biking_medium_skin_tone": "🚵🏽\u200d♂️",
+1379	    "man_office_worker": "👨\u200d💼",
+1380	    "man_office_worker_dark_skin_tone": "👨🏿\u200d💼",
+1381	    "man_office_worker_light_skin_tone": "👨🏻\u200d💼",
+1382	    "man_office_worker_medium-dark_skin_tone": "👨🏾\u200d💼",
+1383	    "man_office_worker_medium-light_skin_tone": "👨🏼\u200d💼",
+1384	    "man_office_worker_medium_skin_tone": "👨🏽\u200d💼",
+1385	    "man_pilot": "👨\u200d✈️",
+1386	    "man_pilot_dark_skin_tone": "👨🏿\u200d✈️",
+1387	    "man_pilot_light_skin_tone": "👨🏻\u200d✈️",
+1388	    "man_pilot_medium-dark_skin_tone": "👨🏾\u200d✈️",
+1389	    "man_pilot_medium-light_skin_tone": "👨🏼\u200d✈️",
+1390	    "man_pilot_medium_skin_tone": "👨🏽\u200d✈️",
+1391	    "man_playing_handball": "🤾\u200d♂️",
+1392	    "man_playing_handball_dark_skin_tone": "🤾🏿\u200d♂️",
+1393	    "man_playing_handball_light_skin_tone": "🤾🏻\u200d♂️",
+1394	    "man_playing_handball_medium-dark_skin_tone": "🤾🏾\u200d♂️",
+1395	    "man_playing_handball_medium-light_skin_tone": "🤾🏼\u200d♂️",
+1396	    "man_playing_handball_medium_skin_tone": "🤾🏽\u200d♂️",
+1397	    "man_playing_water_polo": "🤽\u200d♂️",
+1398	    "man_playing_water_polo_dark_skin_tone": "🤽🏿\u200d♂️",
+1399	    "man_playing_water_polo_light_skin_tone": "🤽🏻\u200d♂️",
+1400	    "man_playing_water_polo_medium-dark_skin_tone": "🤽🏾\u200d♂️",
+1401	    "man_playing_water_polo_medium-light_skin_tone": "🤽🏼\u200d♂️",
+1402	    "man_playing_water_polo_medium_skin_tone": "🤽🏽\u200d♂️",
+1403	    "man_police_officer": "👮\u200d♂️",
+1404	    "man_police_officer_dark_skin_tone": "👮🏿\u200d♂️",
+1405	    "man_police_officer_light_skin_tone": "👮🏻\u200d♂️",
+1406	    "man_police_officer_medium-dark_skin_tone": "👮🏾\u200d♂️",
+1407	    "man_police_officer_medium-light_skin_tone": "👮🏼\u200d♂️",
+1408	    "man_police_officer_medium_skin_tone": "👮🏽\u200d♂️",
+1409	    "man_pouting": "🙎\u200d♂️",
+1410	    "man_pouting_dark_skin_tone": "🙎🏿\u200d♂️",
+1411	    "man_pouting_light_skin_tone": "🙎🏻\u200d♂️",
+1412	    "man_pouting_medium-dark_skin_tone": "🙎🏾\u200d♂️",
+1413	    "man_pouting_medium-light_skin_tone": "🙎🏼\u200d♂️",
+1414	    "man_pouting_medium_skin_tone": "🙎🏽\u200d♂️",
+1415	    "man_raising_hand": "🙋\u200d♂️",
+1416	    "man_raising_hand_dark_skin_tone": "🙋🏿\u200d♂️",
+1417	    "man_raising_hand_light_skin_tone": "🙋🏻\u200d♂️",
+1418	    "man_raising_hand_medium-dark_skin_tone": "🙋🏾\u200d♂️",
+1419	    "man_raising_hand_medium-light_skin_tone": "🙋🏼\u200d♂️",
+1420	    "man_raising_hand_medium_skin_tone": "🙋🏽\u200d♂️",
+1421	    "man_rowing_boat": "🚣\u200d♂️",
+1422	    "man_rowing_boat_dark_skin_tone": "🚣🏿\u200d♂️",
+1423	    "man_rowing_boat_light_skin_tone": "🚣🏻\u200d♂️",
+1424	    "man_rowing_boat_medium-dark_skin_tone": "🚣🏾\u200d♂️",
+1425	    "man_rowing_boat_medium-light_skin_tone": "🚣🏼\u200d♂️",
+1426	    "man_rowing_boat_medium_skin_tone": "🚣🏽\u200d♂️",
+1427	    "man_running": "🏃\u200d♂️",
+1428	    "man_running_dark_skin_tone": "🏃🏿\u200d♂️",
+1429	    "man_running_light_skin_tone": "🏃🏻\u200d♂️",
+1430	    "man_running_medium-dark_skin_tone": "🏃🏾\u200d♂️",
+1431	    "man_running_medium-light_skin_tone": "🏃🏼\u200d♂️",
+1432	    "man_running_medium_skin_tone": "🏃🏽\u200d♂️",
+1433	    "man_scientist": "👨\u200d🔬",
+1434	    "man_scientist_dark_skin_tone": "👨🏿\u200d🔬",
+1435	    "man_scientist_light_skin_tone": "👨🏻\u200d🔬",
+1436	    "man_scientist_medium-dark_skin_tone": "👨🏾\u200d🔬",
+1437	    "man_scientist_medium-light_skin_tone": "👨🏼\u200d🔬",
+1438	    "man_scientist_medium_skin_tone": "👨🏽\u200d🔬",
+1439	    "man_shrugging": "🤷\u200d♂️",
+1440	    "man_shrugging_dark_skin_tone": "🤷🏿\u200d♂️",
+1441	    "man_shrugging_light_skin_tone": "🤷🏻\u200d♂️",
+1442	    "man_shrugging_medium-dark_skin_tone": "🤷🏾\u200d♂️",
+1443	    "man_shrugging_medium-light_skin_tone": "🤷🏼\u200d♂️",
+1444	    "man_shrugging_medium_skin_tone": "🤷🏽\u200d♂️",
+1445	    "man_singer": "👨\u200d🎤",
+1446	    "man_singer_dark_skin_tone": "👨🏿\u200d🎤",
+1447	    "man_singer_light_skin_tone": "👨🏻\u200d🎤",
+1448	    "man_singer_medium-dark_skin_tone": "👨🏾\u200d🎤",
+1449	    "man_singer_medium-light_skin_tone": "👨🏼\u200d🎤",
+1450	    "man_singer_medium_skin_tone": "👨🏽\u200d🎤",
+1451	    "man_student": "👨\u200d🎓",
+1452	    "man_student_dark_skin_tone": "👨🏿\u200d🎓",
+1453	    "man_student_light_skin_tone": "👨🏻\u200d🎓",
+1454	    "man_student_medium-dark_skin_tone": "👨🏾\u200d🎓",
+1455	    "man_student_medium-light_skin_tone": "👨🏼\u200d🎓",
+1456	    "man_student_medium_skin_tone": "👨🏽\u200d🎓",
+1457	    "man_surfing": "🏄\u200d♂️",
+1458	    "man_surfing_dark_skin_tone": "🏄🏿\u200d♂️",
+1459	    "man_surfing_light_skin_tone": "🏄🏻\u200d♂️",
+1460	    "man_surfing_medium-dark_skin_tone": "🏄🏾\u200d♂️",
+1461	    "man_surfing_medium-light_skin_tone": "🏄🏼\u200d♂️",
+1462	    "man_surfing_medium_skin_tone": "🏄🏽\u200d♂️",
+1463	    "man_swimming": "🏊\u200d♂️",
+1464	    "man_swimming_dark_skin_tone": "🏊🏿\u200d♂️",
+1465	    "man_swimming_light_skin_tone": "🏊🏻\u200d♂️",
+1466	    "man_swimming_medium-dark_skin_tone": "🏊🏾\u200d♂️",
+1467	    "man_swimming_medium-light_skin_tone": "🏊🏼\u200d♂️",
+1468	    "man_swimming_medium_skin_tone": "🏊🏽\u200d♂️",
+1469	    "man_teacher": "👨\u200d🏫",
+1470	    "man_teacher_dark_skin_tone": "👨🏿\u200d🏫",
+1471	    "man_teacher_light_skin_tone": "👨🏻\u200d🏫",
+1472	    "man_teacher_medium-dark_skin_tone": "👨🏾\u200d🏫",
+1473	    "man_teacher_medium-light_skin_tone": "👨🏼\u200d🏫",
+1474	    "man_teacher_medium_skin_tone": "👨🏽\u200d🏫",
+1475	    "man_technologist": "👨\u200d💻",
+1476	    "man_technologist_dark_skin_tone": "👨🏿\u200d💻",
+1477	    "man_technologist_light_skin_tone": "👨🏻\u200d💻",
+1478	    "man_technologist_medium-dark_skin_tone": "👨🏾\u200d💻",
+1479	    "man_technologist_medium-light_skin_tone": "👨🏼\u200d💻",
+1480	    "man_technologist_medium_skin_tone": "👨🏽\u200d💻",
+1481	    "man_tipping_hand": "💁\u200d♂️",
+1482	    "man_tipping_hand_dark_skin_tone": "💁🏿\u200d♂️",
+1483	    "man_tipping_hand_light_skin_tone": "💁🏻\u200d♂️",
+1484	    "man_tipping_hand_medium-dark_skin_tone": "💁🏾\u200d♂️",
+1485	    "man_tipping_hand_medium-light_skin_tone": "💁🏼\u200d♂️",
+1486	    "man_tipping_hand_medium_skin_tone": "💁🏽\u200d♂️",
+1487	    "man_vampire": "🧛\u200d♂️",
+1488	    "man_vampire_dark_skin_tone": "🧛🏿\u200d♂️",
+1489	    "man_vampire_light_skin_tone": "🧛🏻\u200d♂️",
+1490	    "man_vampire_medium-dark_skin_tone": "🧛🏾\u200d♂️",
+1491	    "man_vampire_medium-light_skin_tone": "🧛🏼\u200d♂️",
+1492	    "man_vampire_medium_skin_tone": "🧛🏽\u200d♂️",
+1493	    "man_walking": "🚶\u200d♂️",
+1494	    "man_walking_dark_skin_tone": "🚶🏿\u200d♂️",
+1495	    "man_walking_light_skin_tone": "🚶🏻\u200d♂️",
+1496	    "man_walking_medium-dark_skin_tone": "🚶🏾\u200d♂️",
+1497	    "man_walking_medium-light_skin_tone": "🚶🏼\u200d♂️",
+1498	    "man_walking_medium_skin_tone": "🚶🏽\u200d♂️",
+1499	    "man_wearing_turban": "👳\u200d♂️",
+1500	    "man_wearing_turban_dark_skin_tone": "👳🏿\u200d♂️",
+1501	    "man_wearing_turban_light_skin_tone": "👳🏻\u200d♂️",
+1502	    "man_wearing_turban_medium-dark_skin_tone": "👳🏾\u200d♂️",
+1503	    "man_wearing_turban_medium-light_skin_tone": "👳🏼\u200d♂️",
+1504	    "man_wearing_turban_medium_skin_tone": "👳🏽\u200d♂️",
+1505	    "man_with_probing_cane": "👨\u200d🦯",
+1506	    "man_with_chinese_cap": "👲",
+1507	    "man_with_chinese_cap_dark_skin_tone": "👲🏿",
+1508	    "man_with_chinese_cap_light_skin_tone": "👲🏻",
+1509	    "man_with_chinese_cap_medium-dark_skin_tone": "👲🏾",
+1510	    "man_with_chinese_cap_medium-light_skin_tone": "👲🏼",
+1511	    "man_with_chinese_cap_medium_skin_tone": "👲🏽",
+1512	    "man_zombie": "🧟\u200d♂️",
+1513	    "mango": "🥭",
+1514	    "mantelpiece_clock": "🕰",
+1515	    "manual_wheelchair": "🦽",
+1516	    "man’s_shoe": "👞",
+1517	    "map_of_japan": "🗾",
+1518	    "maple_leaf": "🍁",
+1519	    "martial_arts_uniform": "🥋",
+1520	    "mate": "🧉",
+1521	    "meat_on_bone": "🍖",
+1522	    "mechanical_arm": "🦾",
+1523	    "mechanical_leg": "🦿",
+1524	    "medical_symbol": "⚕",
+1525	    "megaphone": "📣",
+1526	    "melon": "🍈",
+1527	    "memo": "📝",
+1528	    "men_with_bunny_ears": "👯\u200d♂️",
+1529	    "men_wrestling": "🤼\u200d♂️",
+1530	    "menorah": "🕎",
+1531	    "men’s_room": "🚹",
+1532	    "mermaid": "🧜\u200d♀️",
+1533	    "mermaid_dark_skin_tone": "🧜🏿\u200d♀️",
+1534	    "mermaid_light_skin_tone": "🧜🏻\u200d♀️",
+1535	    "mermaid_medium-dark_skin_tone": "🧜🏾\u200d♀️",
+1536	    "mermaid_medium-light_skin_tone": "🧜🏼\u200d♀️",
+1537	    "mermaid_medium_skin_tone": "🧜🏽\u200d♀️",
+1538	    "merman": "🧜\u200d♂️",
+1539	    "merman_dark_skin_tone": "🧜🏿\u200d♂️",
+1540	    "merman_light_skin_tone": "🧜🏻\u200d♂️",
+1541	    "merman_medium-dark_skin_tone": "🧜🏾\u200d♂️",
+1542	    "merman_medium-light_skin_tone": "🧜🏼\u200d♂️",
+1543	    "merman_medium_skin_tone": "🧜🏽\u200d♂️",
+1544	    "merperson": "🧜",
+1545	    "merperson_dark_skin_tone": "🧜🏿",
+1546	    "merperson_light_skin_tone": "🧜🏻",
+1547	    "merperson_medium-dark_skin_tone": "🧜🏾",
+1548	    "merperson_medium-light_skin_tone": "🧜🏼",
+1549	    "merperson_medium_skin_tone": "🧜🏽",
+1550	    "metro": "🚇",
+1551	    "microbe": "🦠",
+1552	    "microphone": "🎤",
+1553	    "microscope": "🔬",
+1554	    "middle_finger": "🖕",
+1555	    "middle_finger_dark_skin_tone": "🖕🏿",
+1556	    "middle_finger_light_skin_tone": "🖕🏻",
+1557	    "middle_finger_medium-dark_skin_tone": "🖕🏾",
+1558	    "middle_finger_medium-light_skin_tone": "🖕🏼",
+1559	    "middle_finger_medium_skin_tone": "🖕🏽",
+1560	    "military_medal": "🎖",
+1561	    "milky_way": "🌌",
+1562	    "minibus": "🚐",
+1563	    "moai": "🗿",
+1564	    "mobile_phone": "📱",
+1565	    "mobile_phone_off": "📴",
+1566	    "mobile_phone_with_arrow": "📲",
+1567	    "money-mouth_face": "🤑",
+1568	    "money_bag": "💰",
+1569	    "money_with_wings": "💸",
+1570	    "monkey": "🐒",
+1571	    "monkey_face": "🐵",
+1572	    "monorail": "🚝",
+1573	    "moon_cake": "🥮",
+1574	    "moon_viewing_ceremony": "🎑",
+1575	    "mosque": "🕌",
+1576	    "mosquito": "🦟",
+1577	    "motor_boat": "🛥",
+1578	    "motor_scooter": "🛵",
+1579	    "motorcycle": "🏍",
+1580	    "motorized_wheelchair": "🦼",
+1581	    "motorway": "🛣",
+1582	    "mount_fuji": "🗻",
+1583	    "mountain": "⛰",
+1584	    "mountain_cableway": "🚠",
+1585	    "mountain_railway": "🚞",
+1586	    "mouse": "🐭",
+1587	    "mouse_face": "🐭",
+1588	    "mouth": "👄",
+1589	    "movie_camera": "🎥",
+1590	    "mushroom": "🍄",
+1591	    "musical_keyboard": "🎹",
+1592	    "musical_note": "🎵",
+1593	    "musical_notes": "🎶",
+1594	    "musical_score": "🎼",
+1595	    "muted_speaker": "🔇",
+1596	    "nail_polish": "💅",
+1597	    "nail_polish_dark_skin_tone": "💅🏿",
+1598	    "nail_polish_light_skin_tone": "💅🏻",
+1599	    "nail_polish_medium-dark_skin_tone": "💅🏾",
+1600	    "nail_polish_medium-light_skin_tone": "💅🏼",
+1601	    "nail_polish_medium_skin_tone": "💅🏽",
+1602	    "name_badge": "📛",
+1603	    "national_park": "🏞",
+1604	    "nauseated_face": "🤢",
+1605	    "nazar_amulet": "🧿",
+1606	    "necktie": "👔",
+1607	    "nerd_face": "🤓",
+1608	    "neutral_face": "😐",
+1609	    "new_moon": "🌑",
+1610	    "new_moon_face": "🌚",
+1611	    "newspaper": "📰",
+1612	    "next_track_button": "⏭",
+1613	    "night_with_stars": "🌃",
+1614	    "nine-thirty": "🕤",
+1615	    "nine_o’clock": "🕘",
+1616	    "no_bicycles": "🚳",
+1617	    "no_entry": "⛔",
+1618	    "no_littering": "🚯",
+1619	    "no_mobile_phones": "📵",
+1620	    "no_one_under_eighteen": "🔞",
+1621	    "no_pedestrians": "🚷",
+1622	    "no_smoking": "🚭",
+1623	    "non-potable_water": "🚱",
+1624	    "nose": "👃",
+1625	    "nose_dark_skin_tone": "👃🏿",
+1626	    "nose_light_skin_tone": "👃🏻",
+1627	    "nose_medium-dark_skin_tone": "👃🏾",
+1628	    "nose_medium-light_skin_tone": "👃🏼",
+1629	    "nose_medium_skin_tone": "👃🏽",
+1630	    "notebook": "📓",
+1631	    "notebook_with_decorative_cover": "📔",
+1632	    "nut_and_bolt": "🔩",
+1633	    "octopus": "🐙",
+1634	    "oden": "🍢",
+1635	    "office_building": "🏢",
+1636	    "ogre": "👹",
+1637	    "oil_drum": "🛢",
+1638	    "old_key": "🗝",
+1639	    "old_man": "👴",
+1640	    "old_man_dark_skin_tone": "👴🏿",
+1641	    "old_man_light_skin_tone": "👴🏻",
+1642	    "old_man_medium-dark_skin_tone": "👴🏾",
+1643	    "old_man_medium-light_skin_tone": "👴🏼",
+1644	    "old_man_medium_skin_tone": "👴🏽",
+1645	    "old_woman": "👵",
+1646	    "old_woman_dark_skin_tone": "👵🏿",
+1647	    "old_woman_light_skin_tone": "👵🏻",
+1648	    "old_woman_medium-dark_skin_tone": "👵🏾",
+1649	    "old_woman_medium-light_skin_tone": "👵🏼",
+1650	    "old_woman_medium_skin_tone": "👵🏽",
+1651	    "older_adult": "🧓",
+1652	    "older_adult_dark_skin_tone": "🧓🏿",
+1653	    "older_adult_light_skin_tone": "🧓🏻",
+1654	    "older_adult_medium-dark_skin_tone": "🧓🏾",
+1655	    "older_adult_medium-light_skin_tone": "🧓🏼",
+1656	    "older_adult_medium_skin_tone": "🧓🏽",
+1657	    "om": "🕉",
+1658	    "oncoming_automobile": "🚘",
+1659	    "oncoming_bus": "🚍",
+1660	    "oncoming_fist": "👊",
+1661	    "oncoming_fist_dark_skin_tone": "👊🏿",
+1662	    "oncoming_fist_light_skin_tone": "👊🏻",
+1663	    "oncoming_fist_medium-dark_skin_tone": "👊🏾",
+1664	    "oncoming_fist_medium-light_skin_tone": "👊🏼",
+1665	    "oncoming_fist_medium_skin_tone": "👊🏽",
+1666	    "oncoming_police_car": "🚔",
+1667	    "oncoming_taxi": "🚖",
+1668	    "one-piece_swimsuit": "🩱",
+1669	    "one-thirty": "🕜",
+1670	    "one_o’clock": "🕐",
+1671	    "onion": "🧅",
+1672	    "open_book": "📖",
+1673	    "open_file_folder": "📂",
+1674	    "open_hands": "👐",
+1675	    "open_hands_dark_skin_tone": "👐🏿",
+1676	    "open_hands_light_skin_tone": "👐🏻",
+1677	    "open_hands_medium-dark_skin_tone": "👐🏾",
+1678	    "open_hands_medium-light_skin_tone": "👐🏼",
+1679	    "open_hands_medium_skin_tone": "👐🏽",
+1680	    "open_mailbox_with_lowered_flag": "📭",
+1681	    "open_mailbox_with_raised_flag": "📬",
+1682	    "optical_disk": "💿",
+1683	    "orange_book": "📙",
+1684	    "orange_circle": "🟠",
+1685	    "orange_heart": "🧡",
+1686	    "orange_square": "🟧",
+1687	    "orangutan": "🦧",
+1688	    "orthodox_cross": "☦",
+1689	    "otter": "🦦",
+1690	    "outbox_tray": "📤",
+1691	    "owl": "🦉",
+1692	    "ox": "🐂",
+1693	    "oyster": "🦪",
+1694	    "package": "📦",
+1695	    "page_facing_up": "📄",
+1696	    "page_with_curl": "📃",
+1697	    "pager": "📟",
+1698	    "paintbrush": "🖌",
+1699	    "palm_tree": "🌴",
+1700	    "palms_up_together": "🤲",
+1701	    "palms_up_together_dark_skin_tone": "🤲🏿",
+1702	    "palms_up_together_light_skin_tone": "🤲🏻",
+1703	    "palms_up_together_medium-dark_skin_tone": "🤲🏾",
+1704	    "palms_up_together_medium-light_skin_tone": "🤲🏼",
+1705	    "palms_up_together_medium_skin_tone": "🤲🏽",
+1706	    "pancakes": "🥞",
+1707	    "panda_face": "🐼",
+1708	    "paperclip": "📎",
+1709	    "parrot": "🦜",
+1710	    "part_alternation_mark": "〽",
+1711	    "party_popper": "🎉",
+1712	    "partying_face": "🥳",
+1713	    "passenger_ship": "🛳",
+1714	    "passport_control": "🛂",
+1715	    "pause_button": "⏸",
+1716	    "paw_prints": "🐾",
+1717	    "peace_symbol": "☮",
+1718	    "peach": "🍑",
+1719	    "peacock": "🦚",
+1720	    "peanuts": "🥜",
+1721	    "pear": "🍐",
+1722	    "pen": "🖊",
+1723	    "pencil": "📝",
+1724	    "penguin": "🐧",
+1725	    "pensive_face": "😔",
+1726	    "people_holding_hands": "🧑\u200d🤝\u200d🧑",
+1727	    "people_with_bunny_ears": "👯",
+1728	    "people_wrestling": "🤼",
+1729	    "performing_arts": "🎭",
+1730	    "persevering_face": "😣",
+1731	    "person_biking": "🚴",
+1732	    "person_biking_dark_skin_tone": "🚴🏿",
+1733	    "person_biking_light_skin_tone": "🚴🏻",
+1734	    "person_biking_medium-dark_skin_tone": "🚴🏾",
+1735	    "person_biking_medium-light_skin_tone": "🚴🏼",
+1736	    "person_biking_medium_skin_tone": "🚴🏽",
+1737	    "person_bouncing_ball": "⛹",
+1738	    "person_bouncing_ball_dark_skin_tone": "⛹🏿",
+1739	    "person_bouncing_ball_light_skin_tone": "⛹🏻",
+1740	    "person_bouncing_ball_medium-dark_skin_tone": "⛹🏾",
+1741	    "person_bouncing_ball_medium-light_skin_tone": "⛹🏼",
+1742	    "person_bouncing_ball_medium_skin_tone": "⛹🏽",
+1743	    "person_bowing": "🙇",
+1744	    "person_bowing_dark_skin_tone": "🙇🏿",
+1745	    "person_bowing_light_skin_tone": "🙇🏻",
+1746	    "person_bowing_medium-dark_skin_tone": "🙇🏾",
+1747	    "person_bowing_medium-light_skin_tone": "🙇🏼",
+1748	    "person_bowing_medium_skin_tone": "🙇🏽",
+1749	    "person_cartwheeling": "🤸",
+1750	    "person_cartwheeling_dark_skin_tone": "🤸🏿",
+1751	    "person_cartwheeling_light_skin_tone": "🤸🏻",
+1752	    "person_cartwheeling_medium-dark_skin_tone": "🤸🏾",
+1753	    "person_cartwheeling_medium-light_skin_tone": "🤸🏼",
+1754	    "person_cartwheeling_medium_skin_tone": "🤸🏽",
+1755	    "person_climbing": "🧗",
+1756	    "person_climbing_dark_skin_tone": "🧗🏿",
+1757	    "person_climbing_light_skin_tone": "🧗🏻",
+1758	    "person_climbing_medium-dark_skin_tone": "🧗🏾",
+1759	    "person_climbing_medium-light_skin_tone": "🧗🏼",
+1760	    "person_climbing_medium_skin_tone": "🧗🏽",
+1761	    "person_facepalming": "🤦",
+1762	    "person_facepalming_dark_skin_tone": "🤦🏿",
+1763	    "person_facepalming_light_skin_tone": "🤦🏻",
+1764	    "person_facepalming_medium-dark_skin_tone": "🤦🏾",
+1765	    "person_facepalming_medium-light_skin_tone": "🤦🏼",
+1766	    "person_facepalming_medium_skin_tone": "🤦🏽",
+1767	    "person_fencing": "🤺",
+1768	    "person_frowning": "🙍",
+1769	    "person_frowning_dark_skin_tone": "🙍🏿",
+1770	    "person_frowning_light_skin_tone": "🙍🏻",
+1771	    "person_frowning_medium-dark_skin_tone": "🙍🏾",
+1772	    "person_frowning_medium-light_skin_tone": "🙍🏼",
+1773	    "person_frowning_medium_skin_tone": "🙍🏽",
+1774	    "person_gesturing_no": "🙅",
+1775	    "person_gesturing_no_dark_skin_tone": "🙅🏿",
+1776	    "person_gesturing_no_light_skin_tone": "🙅🏻",
+1777	    "person_gesturing_no_medium-dark_skin_tone": "🙅🏾",
+1778	    "person_gesturing_no_medium-light_skin_tone": "🙅🏼",
+1779	    "person_gesturing_no_medium_skin_tone": "🙅🏽",
+1780	    "person_gesturing_ok": "🙆",
+1781	    "person_gesturing_ok_dark_skin_tone": "🙆🏿",
+1782	    "person_gesturing_ok_light_skin_tone": "🙆🏻",
+1783	    "person_gesturing_ok_medium-dark_skin_tone": "🙆🏾",
+1784	    "person_gesturing_ok_medium-light_skin_tone": "🙆🏼",
+1785	    "person_gesturing_ok_medium_skin_tone": "🙆🏽",
+1786	    "person_getting_haircut": "💇",
+1787	    "person_getting_haircut_dark_skin_tone": "💇🏿",
+1788	    "person_getting_haircut_light_skin_tone": "💇🏻",
+1789	    "person_getting_haircut_medium-dark_skin_tone": "💇🏾",
+1790	    "person_getting_haircut_medium-light_skin_tone": "💇🏼",
+1791	    "person_getting_haircut_medium_skin_tone": "💇🏽",
+1792	    "person_getting_massage": "💆",
+1793	    "person_getting_massage_dark_skin_tone": "💆🏿",
+1794	    "person_getting_massage_light_skin_tone": "💆🏻",
+1795	    "person_getting_massage_medium-dark_skin_tone": "💆🏾",
+1796	    "person_getting_massage_medium-light_skin_tone": "💆🏼",
+1797	    "person_getting_massage_medium_skin_tone": "💆🏽",
+1798	    "person_golfing": "🏌",
+1799	    "person_golfing_dark_skin_tone": "🏌🏿",
+1800	    "person_golfing_light_skin_tone": "🏌🏻",
+1801	    "person_golfing_medium-dark_skin_tone": "🏌🏾",
+1802	    "person_golfing_medium-light_skin_tone": "🏌🏼",
+1803	    "person_golfing_medium_skin_tone": "🏌🏽",
+1804	    "person_in_bed": "🛌",
+1805	    "person_in_bed_dark_skin_tone": "🛌🏿",
+1806	    "person_in_bed_light_skin_tone": "🛌🏻",
+1807	    "person_in_bed_medium-dark_skin_tone": "🛌🏾",
+1808	    "person_in_bed_medium-light_skin_tone": "🛌🏼",
+1809	    "person_in_bed_medium_skin_tone": "🛌🏽",
+1810	    "person_in_lotus_position": "🧘",
+1811	    "person_in_lotus_position_dark_skin_tone": "🧘🏿",
+1812	    "person_in_lotus_position_light_skin_tone": "🧘🏻",
+1813	    "person_in_lotus_position_medium-dark_skin_tone": "🧘🏾",
+1814	    "person_in_lotus_position_medium-light_skin_tone": "🧘🏼",
+1815	    "person_in_lotus_position_medium_skin_tone": "🧘🏽",
+1816	    "person_in_steamy_room": "🧖",
+1817	    "person_in_steamy_room_dark_skin_tone": "🧖🏿",
+1818	    "person_in_steamy_room_light_skin_tone": "🧖🏻",
+1819	    "person_in_steamy_room_medium-dark_skin_tone": "🧖🏾",
+1820	    "person_in_steamy_room_medium-light_skin_tone": "🧖🏼",
+1821	    "person_in_steamy_room_medium_skin_tone": "🧖🏽",
+1822	    "person_juggling": "🤹",
+1823	    "person_juggling_dark_skin_tone": "🤹🏿",
+1824	    "person_juggling_light_skin_tone": "🤹🏻",
+1825	    "person_juggling_medium-dark_skin_tone": "🤹🏾",
+1826	    "person_juggling_medium-light_skin_tone": "🤹🏼",
+1827	    "person_juggling_medium_skin_tone": "🤹🏽",
+1828	    "person_kneeling": "🧎",
+1829	    "person_lifting_weights": "🏋",
+1830	    "person_lifting_weights_dark_skin_tone": "🏋🏿",
+1831	    "person_lifting_weights_light_skin_tone": "🏋🏻",
+1832	    "person_lifting_weights_medium-dark_skin_tone": "🏋🏾",
+1833	    "person_lifting_weights_medium-light_skin_tone": "🏋🏼",
+1834	    "person_lifting_weights_medium_skin_tone": "🏋🏽",
+1835	    "person_mountain_biking": "🚵",
+1836	    "person_mountain_biking_dark_skin_tone": "🚵🏿",
+1837	    "person_mountain_biking_light_skin_tone": "🚵🏻",
+1838	    "person_mountain_biking_medium-dark_skin_tone": "🚵🏾",
+1839	    "person_mountain_biking_medium-light_skin_tone": "🚵🏼",
+1840	    "person_mountain_biking_medium_skin_tone": "🚵🏽",
+1841	    "person_playing_handball": "🤾",
+1842	    "person_playing_handball_dark_skin_tone": "🤾🏿",
+1843	    "person_playing_handball_light_skin_tone": "🤾🏻",
+1844	    "person_playing_handball_medium-dark_skin_tone": "🤾🏾",
+1845	    "person_playing_handball_medium-light_skin_tone": "🤾🏼",
+1846	    "person_playing_handball_medium_skin_tone": "🤾🏽",
+1847	    "person_playing_water_polo": "🤽",
+1848	    "person_playing_water_polo_dark_skin_tone": "🤽🏿",
+1849	    "person_playing_water_polo_light_skin_tone": "🤽🏻",
+1850	    "person_playing_water_polo_medium-dark_skin_tone": "🤽🏾",
+1851	    "person_playing_water_polo_medium-light_skin_tone": "🤽🏼",
+1852	    "person_playing_water_polo_medium_skin_tone": "🤽🏽",
+1853	    "person_pouting": "🙎",
+1854	    "person_pouting_dark_skin_tone": "🙎🏿",
+1855	    "person_pouting_light_skin_tone": "🙎🏻",
+1856	    "person_pouting_medium-dark_skin_tone": "🙎🏾",
+1857	    "person_pouting_medium-light_skin_tone": "🙎🏼",
+1858	    "person_pouting_medium_skin_tone": "🙎🏽",
+1859	    "person_raising_hand": "🙋",
+1860	    "person_raising_hand_dark_skin_tone": "🙋🏿",
+1861	    "person_raising_hand_light_skin_tone": "🙋🏻",
+1862	    "person_raising_hand_medium-dark_skin_tone": "🙋🏾",
+1863	    "person_raising_hand_medium-light_skin_tone": "🙋🏼",
+1864	    "person_raising_hand_medium_skin_tone": "🙋🏽",
+1865	    "person_rowing_boat": "🚣",
+1866	    "person_rowing_boat_dark_skin_tone": "🚣🏿",
+1867	    "person_rowing_boat_light_skin_tone": "🚣🏻",
+1868	    "person_rowing_boat_medium-dark_skin_tone": "🚣🏾",
+1869	    "person_rowing_boat_medium-light_skin_tone": "🚣🏼",
+1870	    "person_rowing_boat_medium_skin_tone": "🚣🏽",
+1871	    "person_running": "🏃",
+1872	    "person_running_dark_skin_tone": "🏃🏿",
+1873	    "person_running_light_skin_tone": "🏃🏻",
+1874	    "person_running_medium-dark_skin_tone": "🏃🏾",
+1875	    "person_running_medium-light_skin_tone": "🏃🏼",
+1876	    "person_running_medium_skin_tone": "🏃🏽",
+1877	    "person_shrugging": "🤷",
+1878	    "person_shrugging_dark_skin_tone": "🤷🏿",
+1879	    "person_shrugging_light_skin_tone": "🤷🏻",
+1880	    "person_shrugging_medium-dark_skin_tone": "🤷🏾",
+1881	    "person_shrugging_medium-light_skin_tone": "🤷🏼",
+1882	    "person_shrugging_medium_skin_tone": "🤷🏽",
+1883	    "person_standing": "🧍",
+1884	    "person_surfing": "🏄",
+1885	    "person_surfing_dark_skin_tone": "🏄🏿",
+1886	    "person_surfing_light_skin_tone": "🏄🏻",
+1887	    "person_surfing_medium-dark_skin_tone": "🏄🏾",
+1888	    "person_surfing_medium-light_skin_tone": "🏄🏼",
+1889	    "person_surfing_medium_skin_tone": "🏄🏽",
+1890	    "person_swimming": "🏊",
+1891	    "person_swimming_dark_skin_tone": "🏊🏿",
+1892	    "person_swimming_light_skin_tone": "🏊🏻",
+1893	    "person_swimming_medium-dark_skin_tone": "🏊🏾",
+1894	    "person_swimming_medium-light_skin_tone": "🏊🏼",
+1895	    "person_swimming_medium_skin_tone": "🏊🏽",
+1896	    "person_taking_bath": "🛀",
+1897	    "person_taking_bath_dark_skin_tone": "🛀🏿",
+1898	    "person_taking_bath_light_skin_tone": "🛀🏻",
+1899	    "person_taking_bath_medium-dark_skin_tone": "🛀🏾",
+1900	    "person_taking_bath_medium-light_skin_tone": "🛀🏼",
+1901	    "person_taking_bath_medium_skin_tone": "🛀🏽",
+1902	    "person_tipping_hand": "💁",
+1903	    "person_tipping_hand_dark_skin_tone": "💁🏿",
+1904	    "person_tipping_hand_light_skin_tone": "💁🏻",
+1905	    "person_tipping_hand_medium-dark_skin_tone": "💁🏾",
+1906	    "person_tipping_hand_medium-light_skin_tone": "💁🏼",
+1907	    "person_tipping_hand_medium_skin_tone": "💁🏽",
+1908	    "person_walking": "🚶",
+1909	    "person_walking_dark_skin_tone": "🚶🏿",
+1910	    "person_walking_light_skin_tone": "🚶🏻",
+1911	    "person_walking_medium-dark_skin_tone": "🚶🏾",
+1912	    "person_walking_medium-light_skin_tone": "🚶🏼",
+1913	    "person_walking_medium_skin_tone": "🚶🏽",
+1914	    "person_wearing_turban": "👳",
+1915	    "person_wearing_turban_dark_skin_tone": "👳🏿",
+1916	    "person_wearing_turban_light_skin_tone": "👳🏻",
+1917	    "person_wearing_turban_medium-dark_skin_tone": "👳🏾",
+1918	    "person_wearing_turban_medium-light_skin_tone": "👳🏼",
+1919	    "person_wearing_turban_medium_skin_tone": "👳🏽",
+1920	    "petri_dish": "🧫",
+1921	    "pick": "⛏",
+1922	    "pie": "🥧",
+1923	    "pig": "🐷",
+1924	    "pig_face": "🐷",
+1925	    "pig_nose": "🐽",
+1926	    "pile_of_poo": "💩",
+1927	    "pill": "💊",
+1928	    "pinching_hand": "🤏",
+1929	    "pine_decoration": "🎍",
+1930	    "pineapple": "🍍",
+1931	    "ping_pong": "🏓",
+1932	    "pirate_flag": "🏴\u200d☠️",
+1933	    "pistol": "🔫",
+1934	    "pizza": "🍕",
+1935	    "place_of_worship": "🛐",
+1936	    "play_button": "▶",
+1937	    "play_or_pause_button": "⏯",
+1938	    "pleading_face": "🥺",
+1939	    "police_car": "🚓",
+1940	    "police_car_light": "🚨",
+1941	    "police_officer": "👮",
+1942	    "police_officer_dark_skin_tone": "👮🏿",
+1943	    "police_officer_light_skin_tone": "👮🏻",
+1944	    "police_officer_medium-dark_skin_tone": "👮🏾",
+1945	    "police_officer_medium-light_skin_tone": "👮🏼",
+1946	    "police_officer_medium_skin_tone": "👮🏽",
+1947	    "poodle": "🐩",
+1948	    "pool_8_ball": "🎱",
+1949	    "popcorn": "🍿",
+1950	    "post_office": "🏣",
+1951	    "postal_horn": "📯",
+1952	    "postbox": "📮",
+1953	    "pot_of_food": "🍲",
+1954	    "potable_water": "🚰",
+1955	    "potato": "🥔",
+1956	    "poultry_leg": "🍗",
+1957	    "pound_banknote": "💷",
+1958	    "pouting_cat_face": "😾",
+1959	    "pouting_face": "😡",
+1960	    "prayer_beads": "📿",
+1961	    "pregnant_woman": "🤰",
+1962	    "pregnant_woman_dark_skin_tone": "🤰🏿",
+1963	    "pregnant_woman_light_skin_tone": "🤰🏻",
+1964	    "pregnant_woman_medium-dark_skin_tone": "🤰🏾",
+1965	    "pregnant_woman_medium-light_skin_tone": "🤰🏼",
+1966	    "pregnant_woman_medium_skin_tone": "🤰🏽",
+1967	    "pretzel": "🥨",
+1968	    "probing_cane": "🦯",
+1969	    "prince": "🤴",
+1970	    "prince_dark_skin_tone": "🤴🏿",
+1971	    "prince_light_skin_tone": "🤴🏻",
+1972	    "prince_medium-dark_skin_tone": "🤴🏾",
+1973	    "prince_medium-light_skin_tone": "🤴🏼",
+1974	    "prince_medium_skin_tone": "🤴🏽",
+1975	    "princess": "👸",
+1976	    "princess_dark_skin_tone": "👸🏿",
+1977	    "princess_light_skin_tone": "👸🏻",
+1978	    "princess_medium-dark_skin_tone": "👸🏾",
+1979	    "princess_medium-light_skin_tone": "👸🏼",
+1980	    "princess_medium_skin_tone": "👸🏽",
+1981	    "printer": "🖨",
+1982	    "prohibited": "🚫",
+1983	    "purple_circle": "🟣",
+1984	    "purple_heart": "💜",
+1985	    "purple_square": "🟪",
+1986	    "purse": "👛",
+1987	    "pushpin": "📌",
+1988	    "question_mark": "❓",
+1989	    "rabbit": "🐰",
+1990	    "rabbit_face": "🐰",
+1991	    "raccoon": "🦝",
+1992	    "racing_car": "🏎",
+1993	    "radio": "📻",
+1994	    "radio_button": "🔘",
+1995	    "radioactive": "☢",
+1996	    "railway_car": "🚃",
+1997	    "railway_track": "🛤",
+1998	    "rainbow": "🌈",
+1999	    "rainbow_flag": "🏳️\u200d🌈",
+2000	    "raised_back_of_hand": "🤚",
+2001	    "raised_back_of_hand_dark_skin_tone": "🤚🏿",
+2002	    "raised_back_of_hand_light_skin_tone": "🤚🏻",
+2003	    "raised_back_of_hand_medium-dark_skin_tone": "🤚🏾",
+2004	    "raised_back_of_hand_medium-light_skin_tone": "🤚🏼",
+2005	    "raised_back_of_hand_medium_skin_tone": "🤚🏽",
+2006	    "raised_fist": "✊",
+2007	    "raised_fist_dark_skin_tone": "✊🏿",
+2008	    "raised_fist_light_skin_tone": "✊🏻",
+2009	    "raised_fist_medium-dark_skin_tone": "✊🏾",
+2010	    "raised_fist_medium-light_skin_tone": "✊🏼",
+2011	    "raised_fist_medium_skin_tone": "✊🏽",
+2012	    "raised_hand": "✋",
+2013	    "raised_hand_dark_skin_tone": "✋🏿",
+2014	    "raised_hand_light_skin_tone": "✋🏻",
+2015	    "raised_hand_medium-dark_skin_tone": "✋🏾",
+2016	    "raised_hand_medium-light_skin_tone": "✋🏼",
+2017	    "raised_hand_medium_skin_tone": "✋🏽",
+2018	    "raising_hands": "🙌",
+2019	    "raising_hands_dark_skin_tone": "🙌🏿",
+2020	    "raising_hands_light_skin_tone": "🙌🏻",
+2021	    "raising_hands_medium-dark_skin_tone": "🙌🏾",
+2022	    "raising_hands_medium-light_skin_tone": "🙌🏼",
+2023	    "raising_hands_medium_skin_tone": "🙌🏽",
+2024	    "ram": "🐏",
+2025	    "rat": "🐀",
+2026	    "razor": "🪒",
+2027	    "ringed_planet": "🪐",
+2028	    "receipt": "🧾",
+2029	    "record_button": "⏺",
+2030	    "recycling_symbol": "♻",
+2031	    "red_apple": "🍎",
+2032	    "red_circle": "🔴",
+2033	    "red_envelope": "🧧",
+2034	    "red_hair": "🦰",
+2035	    "red-haired_man": "👨\u200d🦰",
+2036	    "red-haired_woman": "👩\u200d🦰",
+2037	    "red_heart": "❤",
+2038	    "red_paper_lantern": "🏮",
+2039	    "red_square": "🟥",
+2040	    "red_triangle_pointed_down": "🔻",
+2041	    "red_triangle_pointed_up": "🔺",
+2042	    "registered": "®",
+2043	    "relieved_face": "😌",
+2044	    "reminder_ribbon": "🎗",
+2045	    "repeat_button": "🔁",
+2046	    "repeat_single_button": "🔂",
+2047	    "rescue_worker’s_helmet": "⛑",
+2048	    "restroom": "🚻",
+2049	    "reverse_button": "◀",
+2050	    "revolving_hearts": "💞",
+2051	    "rhinoceros": "🦏",
+2052	    "ribbon": "🎀",
+2053	    "rice_ball": "🍙",
+2054	    "rice_cracker": "🍘",
+2055	    "right-facing_fist": "🤜",
+2056	    "right-facing_fist_dark_skin_tone": "🤜🏿",
+2057	    "right-facing_fist_light_skin_tone": "🤜🏻",
+2058	    "right-facing_fist_medium-dark_skin_tone": "🤜🏾",
+2059	    "right-facing_fist_medium-light_skin_tone": "🤜🏼",
+2060	    "right-facing_fist_medium_skin_tone": "🤜🏽",
+2061	    "right_anger_bubble": "🗯",
+2062	    "right_arrow": "➡",
+2063	    "right_arrow_curving_down": "⤵",
+2064	    "right_arrow_curving_left": "↩",
+2065	    "right_arrow_curving_up": "⤴",
+2066	    "ring": "💍",
+2067	    "roasted_sweet_potato": "🍠",
+2068	    "robot_face": "🤖",
+2069	    "rocket": "🚀",
+2070	    "roll_of_paper": "🧻",
+2071	    "rolled-up_newspaper": "🗞",
+2072	    "roller_coaster": "🎢",
+2073	    "rolling_on_the_floor_laughing": "🤣",
+2074	    "rooster": "🐓",
+2075	    "rose": "🌹",
+2076	    "rosette": "🏵",
+2077	    "round_pushpin": "📍",
+2078	    "rugby_football": "🏉",
+2079	    "running_shirt": "🎽",
+2080	    "running_shoe": "👟",
+2081	    "sad_but_relieved_face": "😥",
+2082	    "safety_pin": "🧷",
+2083	    "safety_vest": "🦺",
+2084	    "salt": "🧂",
+2085	    "sailboat": "⛵",
+2086	    "sake": "🍶",
+2087	    "sandwich": "🥪",
+2088	    "sari": "🥻",
+2089	    "satellite": "📡",
+2090	    "satellite_antenna": "📡",
+2091	    "sauropod": "🦕",
+2092	    "saxophone": "🎷",
+2093	    "scarf": "🧣",
+2094	    "school": "🏫",
+2095	    "school_backpack": "🎒",
+2096	    "scissors": "✂",
+2097	    "scorpion": "🦂",
+2098	    "scroll": "📜",
+2099	    "seat": "💺",
+2100	    "see-no-evil_monkey": "🙈",
+2101	    "seedling": "🌱",
+2102	    "selfie": "🤳",
+2103	    "selfie_dark_skin_tone": "🤳🏿",
+2104	    "selfie_light_skin_tone": "🤳🏻",
+2105	    "selfie_medium-dark_skin_tone": "🤳🏾",
+2106	    "selfie_medium-light_skin_tone": "🤳🏼",
+2107	    "selfie_medium_skin_tone": "🤳🏽",
+2108	    "service_dog": "🐕\u200d🦺",
+2109	    "seven-thirty": "🕢",
+2110	    "seven_o’clock": "🕖",
+2111	    "shallow_pan_of_food": "🥘",
+2112	    "shamrock": "☘",
+2113	    "shark": "🦈",
+2114	    "shaved_ice": "🍧",
+2115	    "sheaf_of_rice": "🌾",
+2116	    "shield": "🛡",
+2117	    "shinto_shrine": "⛩",
+2118	    "ship": "🚢",
+2119	    "shooting_star": "🌠",
+2120	    "shopping_bags": "🛍",
+2121	    "shopping_cart": "🛒",
+2122	    "shortcake": "🍰",
+2123	    "shorts": "🩳",
+2124	    "shower": "🚿",
+2125	    "shrimp": "🦐",
+2126	    "shuffle_tracks_button": "🔀",
+2127	    "shushing_face": "🤫",
+2128	    "sign_of_the_horns": "🤘",
+2129	    "sign_of_the_horns_dark_skin_tone": "🤘🏿",
+2130	    "sign_of_the_horns_light_skin_tone": "🤘🏻",
+2131	    "sign_of_the_horns_medium-dark_skin_tone": "🤘🏾",
+2132	    "sign_of_the_horns_medium-light_skin_tone": "🤘🏼",
+2133	    "sign_of_the_horns_medium_skin_tone": "🤘🏽",
+2134	    "six-thirty": "🕡",
+2135	    "six_o’clock": "🕕",
+2136	    "skateboard": "🛹",
+2137	    "skier": "⛷",
+2138	    "skis": "🎿",
+2139	    "skull": "💀",
+2140	    "skull_and_crossbones": "☠",
+2141	    "skunk": "🦨",
+2142	    "sled": "🛷",
+2143	    "sleeping_face": "😴",
+2144	    "sleepy_face": "😪",
+2145	    "slightly_frowning_face": "🙁",
+2146	    "slightly_smiling_face": "🙂",
+2147	    "slot_machine": "🎰",
+2148	    "sloth": "🦥",
+2149	    "small_airplane": "🛩",
+2150	    "small_blue_diamond": "🔹",
+2151	    "small_orange_diamond": "🔸",
+2152	    "smiling_cat_face_with_heart-eyes": "😻",
+2153	    "smiling_face": "☺",
+2154	    "smiling_face_with_halo": "😇",
+2155	    "smiling_face_with_3_hearts": "🥰",
+2156	    "smiling_face_with_heart-eyes": "😍",
+2157	    "smiling_face_with_horns": "😈",
+2158	    "smiling_face_with_smiling_eyes": "😊",
+2159	    "smiling_face_with_sunglasses": "😎",
+2160	    "smirking_face": "😏",
+2161	    "snail": "🐌",
+2162	    "snake": "🐍",
+2163	    "sneezing_face": "🤧",
+2164	    "snow-capped_mountain": "🏔",
+2165	    "snowboarder": "🏂",
+2166	    "snowboarder_dark_skin_tone": "🏂🏿",
+2167	    "snowboarder_light_skin_tone": "🏂🏻",
+2168	    "snowboarder_medium-dark_skin_tone": "🏂🏾",
+2169	    "snowboarder_medium-light_skin_tone": "🏂🏼",
+2170	    "snowboarder_medium_skin_tone": "🏂🏽",
+2171	    "snowflake": "❄",
+2172	    "snowman": "☃",
+2173	    "snowman_without_snow": "⛄",
+2174	    "soap": "🧼",
+2175	    "soccer_ball": "⚽",
+2176	    "socks": "🧦",
+2177	    "softball": "🥎",
+2178	    "soft_ice_cream": "🍦",
+2179	    "spade_suit": "♠",
+2180	    "spaghetti": "🍝",
+2181	    "sparkle": "❇",
+2182	    "sparkler": "🎇",
+2183	    "sparkles": "✨",
+2184	    "sparkling_heart": "💖",
+2185	    "speak-no-evil_monkey": "🙊",
+2186	    "speaker_high_volume": "🔊",
+2187	    "speaker_low_volume": "🔈",
+2188	    "speaker_medium_volume": "🔉",
+2189	    "speaking_head": "🗣",
+2190	    "speech_balloon": "💬",
+2191	    "speedboat": "🚤",
+2192	    "spider": "🕷",
+2193	    "spider_web": "🕸",
+2194	    "spiral_calendar": "🗓",
+2195	    "spiral_notepad": "🗒",
+2196	    "spiral_shell": "🐚",
+2197	    "spoon": "🥄",
+2198	    "sponge": "🧽",
+2199	    "sport_utility_vehicle": "🚙",
+2200	    "sports_medal": "🏅",
+2201	    "spouting_whale": "🐳",
+2202	    "squid": "🦑",
+2203	    "squinting_face_with_tongue": "😝",
+2204	    "stadium": "🏟",
+2205	    "star-struck": "🤩",
+2206	    "star_and_crescent": "☪",
+2207	    "star_of_david": "✡",
+2208	    "station": "🚉",
+2209	    "steaming_bowl": "🍜",
+2210	    "stethoscope": "🩺",
+2211	    "stop_button": "⏹",
+2212	    "stop_sign": "🛑",
+2213	    "stopwatch": "⏱",
+2214	    "straight_ruler": "📏",
+2215	    "strawberry": "🍓",
+2216	    "studio_microphone": "🎙",
+2217	    "stuffed_flatbread": "🥙",
+2218	    "sun": "☀",
+2219	    "sun_behind_cloud": "⛅",
+2220	    "sun_behind_large_cloud": "🌥",
+2221	    "sun_behind_rain_cloud": "🌦",
+2222	    "sun_behind_small_cloud": "🌤",
+2223	    "sun_with_face": "🌞",
+2224	    "sunflower": "🌻",
+2225	    "sunglasses": "😎",
+2226	    "sunrise": "🌅",
+2227	    "sunrise_over_mountains": "🌄",
+2228	    "sunset": "🌇",
+2229	    "superhero": "🦸",
+2230	    "supervillain": "🦹",
+2231	    "sushi": "🍣",
+2232	    "suspension_railway": "🚟",
+2233	    "swan": "🦢",
+2234	    "sweat_droplets": "💦",
+2235	    "synagogue": "🕍",
+2236	    "syringe": "💉",
+2237	    "t-shirt": "👕",
+2238	    "taco": "🌮",
+2239	    "takeout_box": "🥡",
+2240	    "tanabata_tree": "🎋",
+2241	    "tangerine": "🍊",
+2242	    "taxi": "🚕",
+2243	    "teacup_without_handle": "🍵",
+2244	    "tear-off_calendar": "📆",
+2245	    "teddy_bear": "🧸",
+2246	    "telephone": "☎",
+2247	    "telephone_receiver": "📞",
+2248	    "telescope": "🔭",
+2249	    "television": "📺",
+2250	    "ten-thirty": "🕥",
+2251	    "ten_o’clock": "🕙",
+2252	    "tennis": "🎾",
+2253	    "tent": "⛺",
+2254	    "test_tube": "🧪",
+2255	    "thermometer": "🌡",
+2256	    "thinking_face": "🤔",
+2257	    "thought_balloon": "💭",
+2258	    "thread": "🧵",
+2259	    "three-thirty": "🕞",
+2260	    "three_o’clock": "🕒",
+2261	    "thumbs_down": "👎",
+2262	    "thumbs_down_dark_skin_tone": "👎🏿",
+2263	    "thumbs_down_light_skin_tone": "👎🏻",
+2264	    "thumbs_down_medium-dark_skin_tone": "👎🏾",
+2265	    "thumbs_down_medium-light_skin_tone": "👎🏼",
+2266	    "thumbs_down_medium_skin_tone": "👎🏽",
+2267	    "thumbs_up": "👍",
+2268	    "thumbs_up_dark_skin_tone": "👍🏿",
+2269	    "thumbs_up_light_skin_tone": "👍🏻",
+2270	    "thumbs_up_medium-dark_skin_tone": "👍🏾",
+2271	    "thumbs_up_medium-light_skin_tone": "👍🏼",
+2272	    "thumbs_up_medium_skin_tone": "👍🏽",
+2273	    "ticket": "🎫",
+2274	    "tiger": "🐯",
+2275	    "tiger_face": "🐯",
+2276	    "timer_clock": "⏲",
+2277	    "tired_face": "😫",
+2278	    "toolbox": "🧰",
+2279	    "toilet": "🚽",
+2280	    "tomato": "🍅",
+2281	    "tongue": "👅",
+2282	    "tooth": "🦷",
+2283	    "top_hat": "🎩",
+2284	    "tornado": "🌪",
+2285	    "trackball": "🖲",
+2286	    "tractor": "🚜",
+2287	    "trade_mark": "™",
+2288	    "train": "🚋",
+2289	    "tram": "🚊",
+2290	    "tram_car": "🚋",
+2291	    "triangular_flag": "🚩",
+2292	    "triangular_ruler": "📐",
+2293	    "trident_emblem": "🔱",
+2294	    "trolleybus": "🚎",
+2295	    "trophy": "🏆",
+2296	    "tropical_drink": "🍹",
+2297	    "tropical_fish": "🐠",
+2298	    "trumpet": "🎺",
+2299	    "tulip": "🌷",
+2300	    "tumbler_glass": "🥃",
+2301	    "turtle": "🐢",
+2302	    "twelve-thirty": "🕧",
+2303	    "twelve_o’clock": "🕛",
+2304	    "two-hump_camel": "🐫",
+2305	    "two-thirty": "🕝",
+2306	    "two_hearts": "💕",
+2307	    "two_men_holding_hands": "👬",
+2308	    "two_o’clock": "🕑",
+2309	    "two_women_holding_hands": "👭",
+2310	    "umbrella": "☂",
+2311	    "umbrella_on_ground": "⛱",
+2312	    "umbrella_with_rain_drops": "☔",
+2313	    "unamused_face": "😒",
+2314	    "unicorn_face": "🦄",
+2315	    "unlocked": "🔓",
+2316	    "up-down_arrow": "↕",
+2317	    "up-left_arrow": "↖",
+2318	    "up-right_arrow": "↗",
+2319	    "up_arrow": "⬆",
+2320	    "upside-down_face": "🙃",
+2321	    "upwards_button": "🔼",
+2322	    "vampire": "🧛",
+2323	    "vampire_dark_skin_tone": "🧛🏿",
+2324	    "vampire_light_skin_tone": "🧛🏻",
+2325	    "vampire_medium-dark_skin_tone": "🧛🏾",
+2326	    "vampire_medium-light_skin_tone": "🧛🏼",
+2327	    "vampire_medium_skin_tone": "🧛🏽",
+2328	    "vertical_traffic_light": "🚦",
+2329	    "vibration_mode": "📳",
+2330	    "victory_hand": "✌",
+2331	    "victory_hand_dark_skin_tone": "✌🏿",
+2332	    "victory_hand_light_skin_tone": "✌🏻",
+2333	    "victory_hand_medium-dark_skin_tone": "✌🏾",
+2334	    "victory_hand_medium-light_skin_tone": "✌🏼",
+2335	    "victory_hand_medium_skin_tone": "✌🏽",
+2336	    "video_camera": "📹",
+2337	    "video_game": "🎮",
+2338	    "videocassette": "📼",
+2339	    "violin": "🎻",
+2340	    "volcano": "🌋",
+2341	    "volleyball": "🏐",
+2342	    "vulcan_salute": "🖖",
+2343	    "vulcan_salute_dark_skin_tone": "🖖🏿",
+2344	    "vulcan_salute_light_skin_tone": "🖖🏻",
+2345	    "vulcan_salute_medium-dark_skin_tone": "🖖🏾",
+2346	    "vulcan_salute_medium-light_skin_tone": "🖖🏼",
+2347	    "vulcan_salute_medium_skin_tone": "🖖🏽",
+2348	    "waffle": "🧇",
+2349	    "waning_crescent_moon": "🌘",
+2350	    "waning_gibbous_moon": "🌖",
+2351	    "warning": "⚠",
+2352	    "wastebasket": "🗑",
+2353	    "watch": "⌚",
+2354	    "water_buffalo": "🐃",
+2355	    "water_closet": "🚾",
+2356	    "water_wave": "🌊",
+2357	    "watermelon": "🍉",
+2358	    "waving_hand": "👋",
+2359	    "waving_hand_dark_skin_tone": "👋🏿",
+2360	    "waving_hand_light_skin_tone": "👋🏻",
+2361	    "waving_hand_medium-dark_skin_tone": "👋🏾",
+2362	    "waving_hand_medium-light_skin_tone": "👋🏼",
+2363	    "waving_hand_medium_skin_tone": "👋🏽",
+2364	    "wavy_dash": "〰",
+2365	    "waxing_crescent_moon": "🌒",
+2366	    "waxing_gibbous_moon": "🌔",
+2367	    "weary_cat_face": "🙀",
+2368	    "weary_face": "😩",
+2369	    "wedding": "💒",
+2370	    "whale": "🐳",
+2371	    "wheel_of_dharma": "☸",
+2372	    "wheelchair_symbol": "♿",
+2373	    "white_circle": "⚪",
+2374	    "white_exclamation_mark": "❕",
+2375	    "white_flag": "🏳",
+2376	    "white_flower": "💮",
+2377	    "white_hair": "🦳",
+2378	    "white-haired_man": "👨\u200d🦳",
+2379	    "white-haired_woman": "👩\u200d🦳",
+2380	    "white_heart": "🤍",
+2381	    "white_heavy_check_mark": "✅",
+2382	    "white_large_square": "⬜",
+2383	    "white_medium-small_square": "◽",
+2384	    "white_medium_square": "◻",
+2385	    "white_medium_star": "⭐",
+2386	    "white_question_mark": "❔",
+2387	    "white_small_square": "▫",
+2388	    "white_square_button": "🔳",
+2389	    "wilted_flower": "🥀",
+2390	    "wind_chime": "🎐",
+2391	    "wind_face": "🌬",
+2392	    "wine_glass": "🍷",
+2393	    "winking_face": "😉",
+2394	    "winking_face_with_tongue": "😜",
+2395	    "wolf_face": "🐺",
+2396	    "woman": "👩",
+2397	    "woman_artist": "👩\u200d🎨",
+2398	    "woman_artist_dark_skin_tone": "👩🏿\u200d🎨",
+2399	    "woman_artist_light_skin_tone": "👩🏻\u200d🎨",
+2400	    "woman_artist_medium-dark_skin_tone": "👩🏾\u200d🎨",
+2401	    "woman_artist_medium-light_skin_tone": "👩🏼\u200d🎨",
+2402	    "woman_artist_medium_skin_tone": "👩🏽\u200d🎨",
+2403	    "woman_astronaut": "👩\u200d🚀",
+2404	    "woman_astronaut_dark_skin_tone": "👩🏿\u200d🚀",
+2405	    "woman_astronaut_light_skin_tone": "👩🏻\u200d🚀",
+2406	    "woman_astronaut_medium-dark_skin_tone": "👩🏾\u200d🚀",
+2407	    "woman_astronaut_medium-light_skin_tone": "👩🏼\u200d🚀",
+2408	    "woman_astronaut_medium_skin_tone": "👩🏽\u200d🚀",
+2409	    "woman_biking": "🚴\u200d♀️",
+2410	    "woman_biking_dark_skin_tone": "🚴🏿\u200d♀️",
+2411	    "woman_biking_light_skin_tone": "🚴🏻\u200d♀️",
+2412	    "woman_biking_medium-dark_skin_tone": "🚴🏾\u200d♀️",
+2413	    "woman_biking_medium-light_skin_tone": "🚴🏼\u200d♀️",
+2414	    "woman_biking_medium_skin_tone": "🚴🏽\u200d♀️",
+2415	    "woman_bouncing_ball": "⛹️\u200d♀️",
+2416	    "woman_bouncing_ball_dark_skin_tone": "⛹🏿\u200d♀️",
+2417	    "woman_bouncing_ball_light_skin_tone": "⛹🏻\u200d♀️",
+2418	    "woman_bouncing_ball_medium-dark_skin_tone": "⛹🏾\u200d♀️",
+2419	    "woman_bouncing_ball_medium-light_skin_tone": "⛹🏼\u200d♀️",
+2420	    "woman_bouncing_ball_medium_skin_tone": "⛹🏽\u200d♀️",
+2421	    "woman_bowing": "🙇\u200d♀️",
+2422	    "woman_bowing_dark_skin_tone": "🙇🏿\u200d♀️",
+2423	    "woman_bowing_light_skin_tone": "🙇🏻\u200d♀️",
+2424	    "woman_bowing_medium-dark_skin_tone": "🙇🏾\u200d♀️",
+2425	    "woman_bowing_medium-light_skin_tone": "🙇🏼\u200d♀️",
+2426	    "woman_bowing_medium_skin_tone": "🙇🏽\u200d♀️",
+2427	    "woman_cartwheeling": "🤸\u200d♀️",
+2428	    "woman_cartwheeling_dark_skin_tone": "🤸🏿\u200d♀️",
+2429	    "woman_cartwheeling_light_skin_tone": "🤸🏻\u200d♀️",
+2430	    "woman_cartwheeling_medium-dark_skin_tone": "🤸🏾\u200d♀️",
+2431	    "woman_cartwheeling_medium-light_skin_tone": "🤸🏼\u200d♀️",
+2432	    "woman_cartwheeling_medium_skin_tone": "🤸🏽\u200d♀️",
+2433	    "woman_climbing": "🧗\u200d♀️",
+2434	    "woman_climbing_dark_skin_tone": "🧗🏿\u200d♀️",
+2435	    "woman_climbing_light_skin_tone": "🧗🏻\u200d♀️",
+2436	    "woman_climbing_medium-dark_skin_tone": "🧗🏾\u200d♀️",
+2437	    "woman_climbing_medium-light_skin_tone": "🧗🏼\u200d♀️",
+2438	    "woman_climbing_medium_skin_tone": "🧗🏽\u200d♀️",
+2439	    "woman_construction_worker": "👷\u200d♀️",
+2440	    "woman_construction_worker_dark_skin_tone": "👷🏿\u200d♀️",
+2441	    "woman_construction_worker_light_skin_tone": "👷🏻\u200d♀️",
+2442	    "woman_construction_worker_medium-dark_skin_tone": "👷🏾\u200d♀️",
+2443	    "woman_construction_worker_medium-light_skin_tone": "👷🏼\u200d♀️",
+2444	    "woman_construction_worker_medium_skin_tone": "👷🏽\u200d♀️",
+2445	    "woman_cook": "👩\u200d🍳",
+2446	    "woman_cook_dark_skin_tone": "👩🏿\u200d🍳",
+2447	    "woman_cook_light_skin_tone": "👩🏻\u200d🍳",
+2448	    "woman_cook_medium-dark_skin_tone": "👩🏾\u200d🍳",
+2449	    "woman_cook_medium-light_skin_tone": "👩🏼\u200d🍳",
+2450	    "woman_cook_medium_skin_tone": "👩🏽\u200d🍳",
+2451	    "woman_dancing": "💃",
+2452	    "woman_dancing_dark_skin_tone": "💃🏿",
+2453	    "woman_dancing_light_skin_tone": "💃🏻",
+2454	    "woman_dancing_medium-dark_skin_tone": "💃🏾",
+2455	    "woman_dancing_medium-light_skin_tone": "💃🏼",
+2456	    "woman_dancing_medium_skin_tone": "💃🏽",
+2457	    "woman_dark_skin_tone": "👩🏿",
+2458	    "woman_detective": "🕵️\u200d♀️",
+2459	    "woman_detective_dark_skin_tone": "🕵🏿\u200d♀️",
+2460	    "woman_detective_light_skin_tone": "🕵🏻\u200d♀️",
+2461	    "woman_detective_medium-dark_skin_tone": "🕵🏾\u200d♀️",
+2462	    "woman_detective_medium-light_skin_tone": "🕵🏼\u200d♀️",
+2463	    "woman_detective_medium_skin_tone": "🕵🏽\u200d♀️",
+2464	    "woman_elf": "🧝\u200d♀️",
+2465	    "woman_elf_dark_skin_tone": "🧝🏿\u200d♀️",
+2466	    "woman_elf_light_skin_tone": "🧝🏻\u200d♀️",
+2467	    "woman_elf_medium-dark_skin_tone": "🧝🏾\u200d♀️",
+2468	    "woman_elf_medium-light_skin_tone": "🧝🏼\u200d♀️",
+2469	    "woman_elf_medium_skin_tone": "🧝🏽\u200d♀️",
+2470	    "woman_facepalming": "🤦\u200d♀️",
+2471	    "woman_facepalming_dark_skin_tone": "🤦🏿\u200d♀️",
+2472	    "woman_facepalming_light_skin_tone": "🤦🏻\u200d♀️",
+2473	    "woman_facepalming_medium-dark_skin_tone": "🤦🏾\u200d♀️",
+2474	    "woman_facepalming_medium-light_skin_tone": "🤦🏼\u200d♀️",
+2475	    "woman_facepalming_medium_skin_tone": "🤦🏽\u200d♀️",
+2476	    "woman_factory_worker": "👩\u200d🏭",
+2477	    "woman_factory_worker_dark_skin_tone": "👩🏿\u200d🏭",
+2478	    "woman_factory_worker_light_skin_tone": "👩🏻\u200d🏭",
+2479	    "woman_factory_worker_medium-dark_skin_tone": "👩🏾\u200d🏭",
+2480	    "woman_factory_worker_medium-light_skin_tone": "👩🏼\u200d🏭",
+2481	    "woman_factory_worker_medium_skin_tone": "👩🏽\u200d🏭",
+2482	    "woman_fairy": "🧚\u200d♀️",
+2483	    "woman_fairy_dark_skin_tone": "🧚🏿\u200d♀️",
+2484	    "woman_fairy_light_skin_tone": "🧚🏻\u200d♀️",
+2485	    "woman_fairy_medium-dark_skin_tone": "🧚🏾\u200d♀️",
+2486	    "woman_fairy_medium-light_skin_tone": "🧚🏼\u200d♀️",
+2487	    "woman_fairy_medium_skin_tone": "🧚🏽\u200d♀️",
+2488	    "woman_farmer": "👩\u200d🌾",
+2489	    "woman_farmer_dark_skin_tone": "👩🏿\u200d🌾",
+2490	    "woman_farmer_light_skin_tone": "👩🏻\u200d🌾",
+2491	    "woman_farmer_medium-dark_skin_tone": "👩🏾\u200d🌾",
+2492	    "woman_farmer_medium-light_skin_tone": "👩🏼\u200d🌾",
+2493	    "woman_farmer_medium_skin_tone": "👩🏽\u200d🌾",
+2494	    "woman_firefighter": "👩\u200d🚒",
+2495	    "woman_firefighter_dark_skin_tone": "👩🏿\u200d🚒",
+2496	    "woman_firefighter_light_skin_tone": "👩🏻\u200d🚒",
+2497	    "woman_firefighter_medium-dark_skin_tone": "👩🏾\u200d🚒",
+2498	    "woman_firefighter_medium-light_skin_tone": "👩🏼\u200d🚒",
+2499	    "woman_firefighter_medium_skin_tone": "👩🏽\u200d🚒",
+2500	    "woman_frowning": "🙍\u200d♀️",
+2501	    "woman_frowning_dark_skin_tone": "🙍🏿\u200d♀️",
+2502	    "woman_frowning_light_skin_tone": "🙍🏻\u200d♀️",
+2503	    "woman_frowning_medium-dark_skin_tone": "🙍🏾\u200d♀️",
+2504	    "woman_frowning_medium-light_skin_tone": "🙍🏼\u200d♀️",
+2505	    "woman_frowning_medium_skin_tone": "🙍🏽\u200d♀️",
+2506	    "woman_genie": "🧞\u200d♀️",
+2507	    "woman_gesturing_no": "🙅\u200d♀️",
+2508	    "woman_gesturing_no_dark_skin_tone": "🙅🏿\u200d♀️",
+2509	    "woman_gesturing_no_light_skin_tone": "🙅🏻\u200d♀️",
+2510	    "woman_gesturing_no_medium-dark_skin_tone": "🙅🏾\u200d♀️",
+2511	    "woman_gesturing_no_medium-light_skin_tone": "🙅🏼\u200d♀️",
+2512	    "woman_gesturing_no_medium_skin_tone": "🙅🏽\u200d♀️",
+2513	    "woman_gesturing_ok": "🙆\u200d♀️",
+2514	    "woman_gesturing_ok_dark_skin_tone": "🙆🏿\u200d♀️",
+2515	    "woman_gesturing_ok_light_skin_tone": "🙆🏻\u200d♀️",
+2516	    "woman_gesturing_ok_medium-dark_skin_tone": "🙆🏾\u200d♀️",
+2517	    "woman_gesturing_ok_medium-light_skin_tone": "🙆🏼\u200d♀️",
+2518	    "woman_gesturing_ok_medium_skin_tone": "🙆🏽\u200d♀️",
+2519	    "woman_getting_haircut": "💇\u200d♀️",
+2520	    "woman_getting_haircut_dark_skin_tone": "💇🏿\u200d♀️",
+2521	    "woman_getting_haircut_light_skin_tone": "💇🏻\u200d♀️",
+2522	    "woman_getting_haircut_medium-dark_skin_tone": "💇🏾\u200d♀️",
+2523	    "woman_getting_haircut_medium-light_skin_tone": "💇🏼\u200d♀️",
+2524	    "woman_getting_haircut_medium_skin_tone": "💇🏽\u200d♀️",
+2525	    "woman_getting_massage": "💆\u200d♀️",
+2526	    "woman_getting_massage_dark_skin_tone": "💆🏿\u200d♀️",
+2527	    "woman_getting_massage_light_skin_tone": "💆🏻\u200d♀️",
+2528	    "woman_getting_massage_medium-dark_skin_tone": "💆🏾\u200d♀️",
+2529	    "woman_getting_massage_medium-light_skin_tone": "💆🏼\u200d♀️",
+2530	    "woman_getting_massage_medium_skin_tone": "💆🏽\u200d♀️",
+2531	    "woman_golfing": "🏌️\u200d♀️",
+2532	    "woman_golfing_dark_skin_tone": "🏌🏿\u200d♀️",
+2533	    "woman_golfing_light_skin_tone": "🏌🏻\u200d♀️",
+2534	    "woman_golfing_medium-dark_skin_tone": "🏌🏾\u200d♀️",
+2535	    "woman_golfing_medium-light_skin_tone": "🏌🏼\u200d♀️",
+2536	    "woman_golfing_medium_skin_tone": "🏌🏽\u200d♀️",
+2537	    "woman_guard": "💂\u200d♀️",
+2538	    "woman_guard_dark_skin_tone": "💂🏿\u200d♀️",
+2539	    "woman_guard_light_skin_tone": "💂🏻\u200d♀️",
+2540	    "woman_guard_medium-dark_skin_tone": "💂🏾\u200d♀️",
+2541	    "woman_guard_medium-light_skin_tone": "💂🏼\u200d♀️",
+2542	    "woman_guard_medium_skin_tone": "💂🏽\u200d♀️",
+2543	    "woman_health_worker": "👩\u200d⚕️",
+2544	    "woman_health_worker_dark_skin_tone": "👩🏿\u200d⚕️",
+2545	    "woman_health_worker_light_skin_tone": "👩🏻\u200d⚕️",
+2546	    "woman_health_worker_medium-dark_skin_tone": "👩🏾\u200d⚕️",
+2547	    "woman_health_worker_medium-light_skin_tone": "👩🏼\u200d⚕️",
+2548	    "woman_health_worker_medium_skin_tone": "👩🏽\u200d⚕️",
+2549	    "woman_in_lotus_position": "🧘\u200d♀️",
+2550	    "woman_in_lotus_position_dark_skin_tone": "🧘🏿\u200d♀️",
+2551	    "woman_in_lotus_position_light_skin_tone": "🧘🏻\u200d♀️",
+2552	    "woman_in_lotus_position_medium-dark_skin_tone": "🧘🏾\u200d♀️",
+2553	    "woman_in_lotus_position_medium-light_skin_tone": "🧘🏼\u200d♀️",
+2554	    "woman_in_lotus_position_medium_skin_tone": "🧘🏽\u200d♀️",
+2555	    "woman_in_manual_wheelchair": "👩\u200d🦽",
+2556	    "woman_in_motorized_wheelchair": "👩\u200d🦼",
+2557	    "woman_in_steamy_room": "🧖\u200d♀️",
+2558	    "woman_in_steamy_room_dark_skin_tone": "🧖🏿\u200d♀️",
+2559	    "woman_in_steamy_room_light_skin_tone": "🧖🏻\u200d♀️",
+2560	    "woman_in_steamy_room_medium-dark_skin_tone": "🧖🏾\u200d♀️",
+2561	    "woman_in_steamy_room_medium-light_skin_tone": "🧖🏼\u200d♀️",
+2562	    "woman_in_steamy_room_medium_skin_tone": "🧖🏽\u200d♀️",
+2563	    "woman_judge": "👩\u200d⚖️",
+2564	    "woman_judge_dark_skin_tone": "👩🏿\u200d⚖️",
+2565	    "woman_judge_light_skin_tone": "👩🏻\u200d⚖️",
+2566	    "woman_judge_medium-dark_skin_tone": "👩🏾\u200d⚖️",
+2567	    "woman_judge_medium-light_skin_tone": "👩🏼\u200d⚖️",
+2568	    "woman_judge_medium_skin_tone": "👩🏽\u200d⚖️",
+2569	    "woman_juggling": "🤹\u200d♀️",
+2570	    "woman_juggling_dark_skin_tone": "🤹🏿\u200d♀️",
+2571	    "woman_juggling_light_skin_tone": "🤹🏻\u200d♀️",
+2572	    "woman_juggling_medium-dark_skin_tone": "🤹🏾\u200d♀️",
+2573	    "woman_juggling_medium-light_skin_tone": "🤹🏼\u200d♀️",
+2574	    "woman_juggling_medium_skin_tone": "🤹🏽\u200d♀️",
+2575	    "woman_lifting_weights": "🏋️\u200d♀️",
+2576	    "woman_lifting_weights_dark_skin_tone": "🏋🏿\u200d♀️",
+2577	    "woman_lifting_weights_light_skin_tone": "🏋🏻\u200d♀️",
+2578	    "woman_lifting_weights_medium-dark_skin_tone": "🏋🏾\u200d♀️",
+2579	    "woman_lifting_weights_medium-light_skin_tone": "🏋🏼\u200d♀️",
+2580	    "woman_lifting_weights_medium_skin_tone": "🏋🏽\u200d♀️",
+2581	    "woman_light_skin_tone": "👩🏻",
+2582	    "woman_mage": "🧙\u200d♀️",
+2583	    "woman_mage_dark_skin_tone": "🧙🏿\u200d♀️",
+2584	    "woman_mage_light_skin_tone": "🧙🏻\u200d♀️",
+2585	    "woman_mage_medium-dark_skin_tone": "🧙🏾\u200d♀️",
+2586	    "woman_mage_medium-light_skin_tone": "🧙🏼\u200d♀️",
+2587	    "woman_mage_medium_skin_tone": "🧙🏽\u200d♀️",
+2588	    "woman_mechanic": "👩\u200d🔧",
+2589	    "woman_mechanic_dark_skin_tone": "👩🏿\u200d🔧",
+2590	    "woman_mechanic_light_skin_tone": "👩🏻\u200d🔧",
+2591	    "woman_mechanic_medium-dark_skin_tone": "👩🏾\u200d🔧",
+2592	    "woman_mechanic_medium-light_skin_tone": "👩🏼\u200d🔧",
+2593	    "woman_mechanic_medium_skin_tone": "👩🏽\u200d🔧",
+2594	    "woman_medium-dark_skin_tone": "👩🏾",
+2595	    "woman_medium-light_skin_tone": "👩🏼",
+2596	    "woman_medium_skin_tone": "👩🏽",
+2597	    "woman_mountain_biking": "🚵\u200d♀️",
+2598	    "woman_mountain_biking_dark_skin_tone": "🚵🏿\u200d♀️",
+2599	    "woman_mountain_biking_light_skin_tone": "🚵🏻\u200d♀️",
+2600	    "woman_mountain_biking_medium-dark_skin_tone": "🚵🏾\u200d♀️",
+2601	    "woman_mountain_biking_medium-light_skin_tone": "🚵🏼\u200d♀️",
+2602	    "woman_mountain_biking_medium_skin_tone": "🚵🏽\u200d♀️",
+2603	    "woman_office_worker": "👩\u200d💼",
+2604	    "woman_office_worker_dark_skin_tone": "👩🏿\u200d💼",
+2605	    "woman_office_worker_light_skin_tone": "👩🏻\u200d💼",
+2606	    "woman_office_worker_medium-dark_skin_tone": "👩🏾\u200d💼",
+2607	    "woman_office_worker_medium-light_skin_tone": "👩🏼\u200d💼",
+2608	    "woman_office_worker_medium_skin_tone": "👩🏽\u200d💼",
+2609	    "woman_pilot": "👩\u200d✈️",
+2610	    "woman_pilot_dark_skin_tone": "👩🏿\u200d✈️",
+2611	    "woman_pilot_light_skin_tone": "👩🏻\u200d✈️",
+2612	    "woman_pilot_medium-dark_skin_tone": "👩🏾\u200d✈️",
+2613	    "woman_pilot_medium-light_skin_tone": "👩🏼\u200d✈️",
+2614	    "woman_pilot_medium_skin_tone": "👩🏽\u200d✈️",
+2615	    "woman_playing_handball": "🤾\u200d♀️",
+2616	    "woman_playing_handball_dark_skin_tone": "🤾🏿\u200d♀️",
+2617	    "woman_playing_handball_light_skin_tone": "🤾🏻\u200d♀️",
+2618	    "woman_playing_handball_medium-dark_skin_tone": "🤾🏾\u200d♀️",
+2619	    "woman_playing_handball_medium-light_skin_tone": "🤾🏼\u200d♀️",
+2620	    "woman_playing_handball_medium_skin_tone": "🤾🏽\u200d♀️",
+2621	    "woman_playing_water_polo": "🤽\u200d♀️",
+2622	    "woman_playing_water_polo_dark_skin_tone": "🤽🏿\u200d♀️",
+2623	    "woman_playing_water_polo_light_skin_tone": "🤽🏻\u200d♀️",
+2624	    "woman_playing_water_polo_medium-dark_skin_tone": "🤽🏾\u200d♀️",
+2625	    "woman_playing_water_polo_medium-light_skin_tone": "🤽🏼\u200d♀️",
+2626	    "woman_playing_water_polo_medium_skin_tone": "🤽🏽\u200d♀️",
+2627	    "woman_police_officer": "👮\u200d♀️",
+2628	    "woman_police_officer_dark_skin_tone": "👮🏿\u200d♀️",
+2629	    "woman_police_officer_light_skin_tone": "👮🏻\u200d♀️",
+2630	    "woman_police_officer_medium-dark_skin_tone": "👮🏾\u200d♀️",
+2631	    "woman_police_officer_medium-light_skin_tone": "👮🏼\u200d♀️",
+2632	    "woman_police_officer_medium_skin_tone": "👮🏽\u200d♀️",
+2633	    "woman_pouting": "🙎\u200d♀️",
+2634	    "woman_pouting_dark_skin_tone": "🙎🏿\u200d♀️",
+2635	    "woman_pouting_light_skin_tone": "🙎🏻\u200d♀️",
+2636	    "woman_pouting_medium-dark_skin_tone": "🙎🏾\u200d♀️",
+2637	    "woman_pouting_medium-light_skin_tone": "🙎🏼\u200d♀️",
+2638	    "woman_pouting_medium_skin_tone": "🙎🏽\u200d♀️",
+2639	    "woman_raising_hand": "🙋\u200d♀️",
+2640	    "woman_raising_hand_dark_skin_tone": "🙋🏿\u200d♀️",
+2641	    "woman_raising_hand_light_skin_tone": "🙋🏻\u200d♀️",
+2642	    "woman_raising_hand_medium-dark_skin_tone": "🙋🏾\u200d♀️",
+2643	    "woman_raising_hand_medium-light_skin_tone": "🙋🏼\u200d♀️",
+2644	    "woman_raising_hand_medium_skin_tone": "🙋🏽\u200d♀️",
+2645	    "woman_rowing_boat": "🚣\u200d♀️",
+2646	    "woman_rowing_boat_dark_skin_tone": "🚣🏿\u200d♀️",
+2647	    "woman_rowing_boat_light_skin_tone": "🚣🏻\u200d♀️",
+2648	    "woman_rowing_boat_medium-dark_skin_tone": "🚣🏾\u200d♀️",
+2649	    "woman_rowing_boat_medium-light_skin_tone": "🚣🏼\u200d♀️",
+2650	    "woman_rowing_boat_medium_skin_tone": "🚣🏽\u200d♀️",
+2651	    "woman_running": "🏃\u200d♀️",
+2652	    "woman_running_dark_skin_tone": "🏃🏿\u200d♀️",
+2653	    "woman_running_light_skin_tone": "🏃🏻\u200d♀️",
+2654	    "woman_running_medium-dark_skin_tone": "🏃🏾\u200d♀️",
+2655	    "woman_running_medium-light_skin_tone": "🏃🏼\u200d♀️",
+2656	    "woman_running_medium_skin_tone": "🏃🏽\u200d♀️",
+2657	    "woman_scientist": "👩\u200d🔬",
+2658	    "woman_scientist_dark_skin_tone": "👩🏿\u200d🔬",
+2659	    "woman_scientist_light_skin_tone": "👩🏻\u200d🔬",
+2660	    "woman_scientist_medium-dark_skin_tone": "👩🏾\u200d🔬",
+2661	    "woman_scientist_medium-light_skin_tone": "👩🏼\u200d🔬",
+2662	    "woman_scientist_medium_skin_tone": "👩🏽\u200d🔬",
+2663	    "woman_shrugging": "🤷\u200d♀️",
+2664	    "woman_shrugging_dark_skin_tone": "🤷🏿\u200d♀️",
+2665	    "woman_shrugging_light_skin_tone": "🤷🏻\u200d♀️",
+2666	    "woman_shrugging_medium-dark_skin_tone": "🤷🏾\u200d♀️",
+2667	    "woman_shrugging_medium-light_skin_tone": "🤷🏼\u200d♀️",
+2668	    "woman_shrugging_medium_skin_tone": "🤷🏽\u200d♀️",
+2669	    "woman_singer": "👩\u200d🎤",
+2670	    "woman_singer_dark_skin_tone": "👩🏿\u200d🎤",
+2671	    "woman_singer_light_skin_tone": "👩🏻\u200d🎤",
+2672	    "woman_singer_medium-dark_skin_tone": "👩🏾\u200d🎤",
+2673	    "woman_singer_medium-light_skin_tone": "👩🏼\u200d🎤",
+2674	    "woman_singer_medium_skin_tone": "👩🏽\u200d🎤",
+2675	    "woman_student": "👩\u200d🎓",
+2676	    "woman_student_dark_skin_tone": "👩🏿\u200d🎓",
+2677	    "woman_student_light_skin_tone": "👩🏻\u200d🎓",
+2678	    "woman_student_medium-dark_skin_tone": "👩🏾\u200d🎓",
+2679	    "woman_student_medium-light_skin_tone": "👩🏼\u200d🎓",
+2680	    "woman_student_medium_skin_tone": "👩🏽\u200d🎓",
+2681	    "woman_surfing": "🏄\u200d♀️",
+2682	    "woman_surfing_dark_skin_tone": "🏄🏿\u200d♀️",
+2683	    "woman_surfing_light_skin_tone": "🏄🏻\u200d♀️",
+2684	    "woman_surfing_medium-dark_skin_tone": "🏄🏾\u200d♀️",
+2685	    "woman_surfing_medium-light_skin_tone": "🏄🏼\u200d♀️",
+2686	    "woman_surfing_medium_skin_tone": "🏄🏽\u200d♀️",
+2687	    "woman_swimming": "🏊\u200d♀️",
+2688	    "woman_swimming_dark_skin_tone": "🏊🏿\u200d♀️",
+2689	    "woman_swimming_light_skin_tone": "🏊🏻\u200d♀️",
+2690	    "woman_swimming_medium-dark_skin_tone": "🏊🏾\u200d♀️",
+2691	    "woman_swimming_medium-light_skin_tone": "🏊🏼\u200d♀️",
+2692	    "woman_swimming_medium_skin_tone": "🏊🏽\u200d♀️",
+2693	    "woman_teacher": "👩\u200d🏫",
+2694	    "woman_teacher_dark_skin_tone": "👩🏿\u200d🏫",
+2695	    "woman_teacher_light_skin_tone": "👩🏻\u200d🏫",
+2696	    "woman_teacher_medium-dark_skin_tone": "👩🏾\u200d🏫",
+2697	    "woman_teacher_medium-light_skin_tone": "👩🏼\u200d🏫",
+2698	    "woman_teacher_medium_skin_tone": "👩🏽\u200d🏫",
+2699	    "woman_technologist": "👩\u200d💻",
+2700	    "woman_technologist_dark_skin_tone": "👩🏿\u200d💻",
+2701	    "woman_technologist_light_skin_tone": "👩🏻\u200d💻",
+2702	    "woman_technologist_medium-dark_skin_tone": "👩🏾\u200d💻",
+2703	    "woman_technologist_medium-light_skin_tone": "👩🏼\u200d💻",
+2704	    "woman_technologist_medium_skin_tone": "👩🏽\u200d💻",
+2705	    "woman_tipping_hand": "💁\u200d♀️",
+2706	    "woman_tipping_hand_dark_skin_tone": "💁🏿\u200d♀️",
+2707	    "woman_tipping_hand_light_skin_tone": "💁🏻\u200d♀️",
+2708	    "woman_tipping_hand_medium-dark_skin_tone": "💁🏾\u200d♀️",
+2709	    "woman_tipping_hand_medium-light_skin_tone": "💁🏼\u200d♀️",
+2710	    "woman_tipping_hand_medium_skin_tone": "💁🏽\u200d♀️",
+2711	    "woman_vampire": "🧛\u200d♀️",
+2712	    "woman_vampire_dark_skin_tone": "🧛🏿\u200d♀️",
+2713	    "woman_vampire_light_skin_tone": "🧛🏻\u200d♀️",
+2714	    "woman_vampire_medium-dark_skin_tone": "🧛🏾\u200d♀️",
+2715	    "woman_vampire_medium-light_skin_tone": "🧛🏼\u200d♀️",
+2716	    "woman_vampire_medium_skin_tone": "🧛🏽\u200d♀️",
+2717	    "woman_walking": "🚶\u200d♀️",
+2718	    "woman_walking_dark_skin_tone": "🚶🏿\u200d♀️",
+2719	    "woman_walking_light_skin_tone": "🚶🏻\u200d♀️",
+2720	    "woman_walking_medium-dark_skin_tone": "🚶🏾\u200d♀️",
+2721	    "woman_walking_medium-light_skin_tone": "🚶🏼\u200d♀️",
+2722	    "woman_walking_medium_skin_tone": "🚶🏽\u200d♀️",
+2723	    "woman_wearing_turban": "👳\u200d♀️",
+2724	    "woman_wearing_turban_dark_skin_tone": "👳🏿\u200d♀️",
+2725	    "woman_wearing_turban_light_skin_tone": "👳🏻\u200d♀️",
+2726	    "woman_wearing_turban_medium-dark_skin_tone": "👳🏾\u200d♀️",
+2727	    "woman_wearing_turban_medium-light_skin_tone": "👳🏼\u200d♀️",
+2728	    "woman_wearing_turban_medium_skin_tone": "👳🏽\u200d♀️",
+2729	    "woman_with_headscarf": "🧕",
+2730	    "woman_with_headscarf_dark_skin_tone": "🧕🏿",
+2731	    "woman_with_headscarf_light_skin_tone": "🧕🏻",
+2732	    "woman_with_headscarf_medium-dark_skin_tone": "🧕🏾",
+2733	    "woman_with_headscarf_medium-light_skin_tone": "🧕🏼",
+2734	    "woman_with_headscarf_medium_skin_tone": "🧕🏽",
+2735	    "woman_with_probing_cane": "👩\u200d🦯",
+2736	    "woman_zombie": "🧟\u200d♀️",
+2737	    "woman’s_boot": "👢",
+2738	    "woman’s_clothes": "👚",
+2739	    "woman’s_hat": "👒",
+2740	    "woman’s_sandal": "👡",
+2741	    "women_with_bunny_ears": "👯\u200d♀️",
+2742	    "women_wrestling": "🤼\u200d♀️",
+2743	    "women’s_room": "🚺",
+2744	    "woozy_face": "🥴",
+2745	    "world_map": "🗺",
+2746	    "worried_face": "😟",
+2747	    "wrapped_gift": "🎁",
+2748	    "wrench": "🔧",
+2749	    "writing_hand": "✍",
+2750	    "writing_hand_dark_skin_tone": "✍🏿",
+2751	    "writing_hand_light_skin_tone": "✍🏻",
+2752	    "writing_hand_medium-dark_skin_tone": "✍🏾",
+2753	    "writing_hand_medium-light_skin_tone": "✍🏼",
+2754	    "writing_hand_medium_skin_tone": "✍🏽",
+2755	    "yarn": "🧶",
+2756	    "yawning_face": "🥱",
+2757	    "yellow_circle": "🟡",
+2758	    "yellow_heart": "💛",
+2759	    "yellow_square": "🟨",
+2760	    "yen_banknote": "💴",
+2761	    "yo-yo": "🪀",
+2762	    "yin_yang": "☯",
+2763	    "zany_face": "🤪",
+2764	    "zebra": "🦓",
+2765	    "zipper-mouth_face": "🤐",
+2766	    "zombie": "🧟",
+2767	    "zzz": "💤",
+2768	    "åland_islands": "🇦🇽",
+2769	    "keycap_asterisk": "*⃣",
+2770	    "keycap_digit_eight": "8⃣",
+2771	    "keycap_digit_five": "5⃣",
+2772	    "keycap_digit_four": "4⃣",
+2773	    "keycap_digit_nine": "9⃣",
+2774	    "keycap_digit_one": "1⃣",
+2775	    "keycap_digit_seven": "7⃣",
+2776	    "keycap_digit_six": "6⃣",
+2777	    "keycap_digit_three": "3⃣",
+2778	    "keycap_digit_two": "2⃣",
+2779	    "keycap_digit_zero": "0⃣",
+2780	    "keycap_number_sign": "#⃣",
+2781	    "light_skin_tone": "🏻",
+2782	    "medium_light_skin_tone": "🏼",
+2783	    "medium_skin_tone": "🏽",
+2784	    "medium_dark_skin_tone": "🏾",
+2785	    "dark_skin_tone": "🏿",
+2786	    "regional_indicator_symbol_letter_a": "🇦",
+2787	    "regional_indicator_symbol_letter_b": "🇧",
+2788	    "regional_indicator_symbol_letter_c": "🇨",
+2789	    "regional_indicator_symbol_letter_d": "🇩",
+2790	    "regional_indicator_symbol_letter_e": "🇪",
+2791	    "regional_indicator_symbol_letter_f": "🇫",
+2792	    "regional_indicator_symbol_letter_g": "🇬",
+2793	    "regional_indicator_symbol_letter_h": "🇭",
+2794	    "regional_indicator_symbol_letter_i": "🇮",
+2795	    "regional_indicator_symbol_letter_j": "🇯",
+2796	    "regional_indicator_symbol_letter_k": "🇰",
+2797	    "regional_indicator_symbol_letter_l": "🇱",
+2798	    "regional_indicator_symbol_letter_m": "🇲",
+2799	    "regional_indicator_symbol_letter_n": "🇳",
+2800	    "regional_indicator_symbol_letter_o": "🇴",
+2801	    "regional_indicator_symbol_letter_p": "🇵",
+2802	    "regional_indicator_symbol_letter_q": "🇶",
+2803	    "regional_indicator_symbol_letter_r": "🇷",
+2804	    "regional_indicator_symbol_letter_s": "🇸",
+2805	    "regional_indicator_symbol_letter_t": "🇹",
+2806	    "regional_indicator_symbol_letter_u": "🇺",
+2807	    "regional_indicator_symbol_letter_v": "🇻",
+2808	    "regional_indicator_symbol_letter_w": "🇼",
+2809	    "regional_indicator_symbol_letter_x": "🇽",
+2810	    "regional_indicator_symbol_letter_y": "🇾",
+2811	    "regional_indicator_symbol_letter_z": "🇿",
+2812	    "airplane_arriving": "🛬",
+2813	    "space_invader": "👾",
+2814	    "football": "🏈",
+2815	    "anger": "💢",
+2816	    "angry": "😠",
+2817	    "anguished": "😧",
+2818	    "signal_strength": "📶",
+2819	    "arrows_counterclockwise": "🔄",
+2820	    "arrow_heading_down": "⤵",
+2821	    "arrow_heading_up": "⤴",
+2822	    "art": "🎨",
+2823	    "astonished": "😲",
+2824	    "athletic_shoe": "👟",
+2825	    "atm": "🏧",
+2826	    "car": "🚗",
+2827	    "red_car": "🚗",
+2828	    "angel": "👼",
+2829	    "back": "🔙",
+2830	    "badminton_racquet_and_shuttlecock": "🏸",
+2831	    "dollar": "💵",
+2832	    "euro": "💶",
+2833	    "pound": "💷",
+2834	    "yen": "💴",
+2835	    "barber": "💈",
+2836	    "bath": "🛀",
+2837	    "bear": "🐻",
+2838	    "heartbeat": "💓",
+2839	    "beer": "🍺",
+2840	    "no_bell": "🔕",
+2841	    "bento": "🍱",
+2842	    "bike": "🚲",
+2843	    "bicyclist": "🚴",
+2844	    "8ball": "🎱",
+2845	    "biohazard_sign": "☣",
+2846	    "birthday": "🎂",
+2847	    "black_circle_for_record": "⏺",
+2848	    "clubs": "♣",
+2849	    "diamonds": "♦",
+2850	    "arrow_double_down": "⏬",
+2851	    "hearts": "♥",
+2852	    "rewind": "⏪",
+2853	    "black_left__pointing_double_triangle_with_vertical_bar": "⏮",
+2854	    "arrow_backward": "◀",
+2855	    "black_medium_small_square": "◾",
+2856	    "question": "❓",
+2857	    "fast_forward": "⏩",
+2858	    "black_right__pointing_double_triangle_with_vertical_bar": "⏭",
+2859	    "arrow_forward": "▶",
+2860	    "black_right__pointing_triangle_with_double_vertical_bar": "⏯",
+2861	    "arrow_right": "➡",
+2862	    "spades": "♠",
+2863	    "black_square_for_stop": "⏹",
+2864	    "sunny": "☀",
+2865	    "phone": "☎",
+2866	    "recycle": "♻",
+2867	    "arrow_double_up": "⏫",
+2868	    "busstop": "🚏",
+2869	    "date": "📅",
+2870	    "flags": "🎏",
+2871	    "cat2": "🐈",
+2872	    "joy_cat": "😹",
+2873	    "smirk_cat": "😼",
+2874	    "chart_with_downwards_trend": "📉",
+2875	    "chart_with_upwards_trend": "📈",
+2876	    "chart": "💹",
+2877	    "mega": "📣",
+2878	    "checkered_flag": "🏁",
+2879	    "accept": "🉑",
+2880	    "ideograph_advantage": "🉐",
+2881	    "congratulations": "㊗",
+2882	    "secret": "㊙",
+2883	    "m": "Ⓜ",
+2884	    "city_sunset": "🌆",
+2885	    "clapper": "🎬",
+2886	    "clap": "👏",
+2887	    "beers": "🍻",
+2888	    "clock830": "🕣",
+2889	    "clock8": "🕗",
+2890	    "clock1130": "🕦",
+2891	    "clock11": "🕚",
+2892	    "clock530": "🕠",
+2893	    "clock5": "🕔",
+2894	    "clock430": "🕟",
+2895	    "clock4": "🕓",
+2896	    "clock930": "🕤",
+2897	    "clock9": "🕘",
+2898	    "clock130": "🕜",
+2899	    "clock1": "🕐",
+2900	    "clock730": "🕢",
+2901	    "clock7": "🕖",
+2902	    "clock630": "🕡",
+2903	    "clock6": "🕕",
+2904	    "clock1030": "🕥",
+2905	    "clock10": "🕙",
+2906	    "clock330": "🕞",
+2907	    "clock3": "🕒",
+2908	    "clock1230": "🕧",
+2909	    "clock12": "🕛",
+2910	    "clock230": "🕝",
+2911	    "clock2": "🕑",
+2912	    "arrows_clockwise": "🔃",
+2913	    "repeat": "🔁",
+2914	    "repeat_one": "🔂",
+2915	    "closed_lock_with_key": "🔐",
+2916	    "mailbox_closed": "📪",
+2917	    "mailbox": "📫",
+2918	    "cloud_with_tornado": "🌪",
+2919	    "cocktail": "🍸",
+2920	    "boom": "💥",
+2921	    "compression": "🗜",
+2922	    "confounded": "😖",
+2923	    "confused": "😕",
+2924	    "rice": "🍚",
+2925	    "cow2": "🐄",
+2926	    "cricket_bat_and_ball": "🏏",
+2927	    "x": "❌",
+2928	    "cry": "😢",
+2929	    "curry": "🍛",
+2930	    "dagger_knife": "🗡",
+2931	    "dancer": "💃",
+2932	    "dark_sunglasses": "🕶",
+2933	    "dash": "💨",
+2934	    "truck": "🚚",
+2935	    "derelict_house_building": "🏚",
+2936	    "diamond_shape_with_a_dot_inside": "💠",
+2937	    "dart": "🎯",
+2938	    "disappointed_relieved": "😥",
+2939	    "disappointed": "😞",
+2940	    "do_not_litter": "🚯",
+2941	    "dog2": "🐕",
+2942	    "flipper": "🐬",
+2943	    "loop": "➿",
+2944	    "bangbang": "‼",
+2945	    "double_vertical_bar": "⏸",
+2946	    "dove_of_peace": "🕊",
+2947	    "small_red_triangle_down": "🔻",
+2948	    "arrow_down_small": "🔽",
+2949	    "arrow_down": "⬇",
+2950	    "dromedary_camel": "🐪",
+2951	    "e__mail": "📧",
+2952	    "corn": "🌽",
+2953	    "ear_of_rice": "🌾",
+2954	    "earth_americas": "🌎",
+2955	    "earth_asia": "🌏",
+2956	    "earth_africa": "🌍",
+2957	    "eight_pointed_black_star": "✴",
+2958	    "eight_spoked_asterisk": "✳",
+2959	    "eject_symbol": "⏏",
+2960	    "bulb": "💡",
+2961	    "emoji_modifier_fitzpatrick_type__1__2": "🏻",
+2962	    "emoji_modifier_fitzpatrick_type__3": "🏼",
+2963	    "emoji_modifier_fitzpatrick_type__4": "🏽",
+2964	    "emoji_modifier_fitzpatrick_type__5": "🏾",
+2965	    "emoji_modifier_fitzpatrick_type__6": "🏿",
+2966	    "end": "🔚",
+2967	    "email": "✉",
+2968	    "european_castle": "🏰",
+2969	    "european_post_office": "🏤",
+2970	    "interrobang": "⁉",
+2971	    "expressionless": "😑",
+2972	    "eyeglasses": "👓",
+2973	    "massage": "💆",
+2974	    "yum": "😋",
+2975	    "scream": "😱",
+2976	    "kissing_heart": "😘",
+2977	    "sweat": "😓",
+2978	    "face_with_head__bandage": "🤕",
+2979	    "triumph": "😤",
+2980	    "mask": "😷",
+2981	    "no_good": "🙅",
+2982	    "ok_woman": "🙆",
+2983	    "open_mouth": "😮",
+2984	    "cold_sweat": "😰",
+2985	    "stuck_out_tongue": "😛",
+2986	    "stuck_out_tongue_closed_eyes": "😝",
+2987	    "stuck_out_tongue_winking_eye": "😜",
+2988	    "joy": "😂",
+2989	    "no_mouth": "😶",
+2990	    "santa": "🎅",
+2991	    "fax": "📠",
+2992	    "fearful": "😨",
+2993	    "field_hockey_stick_and_ball": "🏑",
+2994	    "first_quarter_moon_with_face": "🌛",
+2995	    "fish_cake": "🍥",
+2996	    "fishing_pole_and_fish": "🎣",
+2997	    "facepunch": "👊",
+2998	    "punch": "👊",
+2999	    "flag_for_afghanistan": "🇦🇫",
+3000	    "flag_for_albania": "🇦🇱",
+3001	    "flag_for_algeria": "🇩🇿",
+3002	    "flag_for_american_samoa": "🇦🇸",
+3003	    "flag_for_andorra": "🇦🇩",
+3004	    "flag_for_angola": "🇦🇴",
+3005	    "flag_for_anguilla": "🇦🇮",
+3006	    "flag_for_antarctica": "🇦🇶",
+3007	    "flag_for_antigua_&_barbuda": "🇦🇬",
+3008	    "flag_for_argentina": "🇦🇷",
+3009	    "flag_for_armenia": "🇦🇲",
+3010	    "flag_for_aruba": "🇦🇼",
+3011	    "flag_for_ascension_island": "🇦🇨",
+3012	    "flag_for_australia": "🇦🇺",
+3013	    "flag_for_austria": "🇦🇹",
+3014	    "flag_for_azerbaijan": "🇦🇿",
+3015	    "flag_for_bahamas": "🇧🇸",
+3016	    "flag_for_bahrain": "🇧🇭",
+3017	    "flag_for_bangladesh": "🇧🇩",
+3018	    "flag_for_barbados": "🇧🇧",
+3019	    "flag_for_belarus": "🇧🇾",
+3020	    "flag_for_belgium": "🇧🇪",
+3021	    "flag_for_belize": "🇧🇿",
+3022	    "flag_for_benin": "🇧🇯",
+3023	    "flag_for_bermuda": "🇧🇲",
+3024	    "flag_for_bhutan": "🇧🇹",
+3025	    "flag_for_bolivia": "🇧🇴",
+3026	    "flag_for_bosnia_&_herzegovina": "🇧🇦",
+3027	    "flag_for_botswana": "🇧🇼",
+3028	    "flag_for_bouvet_island": "🇧🇻",
+3029	    "flag_for_brazil": "🇧🇷",
+3030	    "flag_for_british_indian_ocean_territory": "🇮🇴",
+3031	    "flag_for_british_virgin_islands": "🇻🇬",
+3032	    "flag_for_brunei": "🇧🇳",
+3033	    "flag_for_bulgaria": "🇧🇬",
+3034	    "flag_for_burkina_faso": "🇧🇫",
+3035	    "flag_for_burundi": "🇧🇮",
+3036	    "flag_for_cambodia": "🇰🇭",
+3037	    "flag_for_cameroon": "🇨🇲",
+3038	    "flag_for_canada": "🇨🇦",
+3039	    "flag_for_canary_islands": "🇮🇨",
+3040	    "flag_for_cape_verde": "🇨🇻",
+3041	    "flag_for_caribbean_netherlands": "🇧🇶",
+3042	    "flag_for_cayman_islands": "🇰🇾",
+3043	    "flag_for_central_african_republic": "🇨🇫",
+3044	    "flag_for_ceuta_&_melilla": "🇪🇦",
+3045	    "flag_for_chad": "🇹🇩",
+3046	    "flag_for_chile": "🇨🇱",
+3047	    "flag_for_china": "🇨🇳",
+3048	    "flag_for_christmas_island": "🇨🇽",
+3049	    "flag_for_clipperton_island": "🇨🇵",
+3050	    "flag_for_cocos__islands": "🇨🇨",
+3051	    "flag_for_colombia": "🇨🇴",
+3052	    "flag_for_comoros": "🇰🇲",
+3053	    "flag_for_congo____brazzaville": "🇨🇬",
+3054	    "flag_for_congo____kinshasa": "🇨🇩",
+3055	    "flag_for_cook_islands": "🇨🇰",
+3056	    "flag_for_costa_rica": "🇨🇷",
+3057	    "flag_for_croatia": "🇭🇷",
+3058	    "flag_for_cuba": "🇨🇺",
+3059	    "flag_for_curaçao": "🇨🇼",
+3060	    "flag_for_cyprus": "🇨🇾",
+3061	    "flag_for_czech_republic": "🇨🇿",
+3062	    "flag_for_côte_d’ivoire": "🇨🇮",
+3063	    "flag_for_denmark": "🇩🇰",
+3064	    "flag_for_diego_garcia": "🇩🇬",
+3065	    "flag_for_djibouti": "🇩🇯",
+3066	    "flag_for_dominica": "🇩🇲",
+3067	    "flag_for_dominican_republic": "🇩🇴",
+3068	    "flag_for_ecuador": "🇪🇨",
+3069	    "flag_for_egypt": "🇪🇬",
+3070	    "flag_for_el_salvador": "🇸🇻",
+3071	    "flag_for_equatorial_guinea": "🇬🇶",
+3072	    "flag_for_eritrea": "🇪🇷",
+3073	    "flag_for_estonia": "🇪🇪",
+3074	    "flag_for_ethiopia": "🇪🇹",
+3075	    "flag_for_european_union": "🇪🇺",
+3076	    "flag_for_falkland_islands": "🇫🇰",
+3077	    "flag_for_faroe_islands": "🇫🇴",
+3078	    "flag_for_fiji": "🇫🇯",
+3079	    "flag_for_finland": "🇫🇮",
+3080	    "flag_for_france": "🇫🇷",
+3081	    "flag_for_french_guiana": "🇬🇫",
+3082	    "flag_for_french_polynesia": "🇵🇫",
+3083	    "flag_for_french_southern_territories": "🇹🇫",
+3084	    "flag_for_gabon": "🇬🇦",
+3085	    "flag_for_gambia": "🇬🇲",
+3086	    "flag_for_georgia": "🇬🇪",
+3087	    "flag_for_germany": "🇩🇪",
+3088	    "flag_for_ghana": "🇬🇭",
+3089	    "flag_for_gibraltar": "🇬🇮",
+3090	    "flag_for_greece": "🇬🇷",
+3091	    "flag_for_greenland": "🇬🇱",
+3092	    "flag_for_grenada": "🇬🇩",
+3093	    "flag_for_guadeloupe": "🇬🇵",
+3094	    "flag_for_guam": "🇬🇺",
+3095	    "flag_for_guatemala": "🇬🇹",
+3096	    "flag_for_guernsey": "🇬🇬",
+3097	    "flag_for_guinea": "🇬🇳",
+3098	    "flag_for_guinea__bissau": "🇬🇼",
+3099	    "flag_for_guyana": "🇬🇾",
+3100	    "flag_for_haiti": "🇭🇹",
+3101	    "flag_for_heard_&_mcdonald_islands": "🇭🇲",
+3102	    "flag_for_honduras": "🇭🇳",
+3103	    "flag_for_hong_kong": "🇭🇰",
+3104	    "flag_for_hungary": "🇭🇺",
+3105	    "flag_for_iceland": "🇮🇸",
+3106	    "flag_for_india": "🇮🇳",
+3107	    "flag_for_indonesia": "🇮🇩",
+3108	    "flag_for_iran": "🇮🇷",
+3109	    "flag_for_iraq": "🇮🇶",
+3110	    "flag_for_ireland": "🇮🇪",
+3111	    "flag_for_isle_of_man": "🇮🇲",
+3112	    "flag_for_israel": "🇮🇱",
+3113	    "flag_for_italy": "🇮🇹",
+3114	    "flag_for_jamaica": "🇯🇲",
+3115	    "flag_for_japan": "🇯🇵",
+3116	    "flag_for_jersey": "🇯🇪",
+3117	    "flag_for_jordan": "🇯🇴",
+3118	    "flag_for_kazakhstan": "🇰🇿",
+3119	    "flag_for_kenya": "🇰🇪",
+3120	    "flag_for_kiribati": "🇰🇮",
+3121	    "flag_for_kosovo": "🇽🇰",
+3122	    "flag_for_kuwait": "🇰🇼",
+3123	    "flag_for_kyrgyzstan": "🇰🇬",
+3124	    "flag_for_laos": "🇱🇦",
+3125	    "flag_for_latvia": "🇱🇻",
+3126	    "flag_for_lebanon": "🇱🇧",
+3127	    "flag_for_lesotho": "🇱🇸",
+3128	    "flag_for_liberia": "🇱🇷",
+3129	    "flag_for_libya": "🇱🇾",
+3130	    "flag_for_liechtenstein": "🇱🇮",
+3131	    "flag_for_lithuania": "🇱🇹",
+3132	    "flag_for_luxembourg": "🇱🇺",
+3133	    "flag_for_macau": "🇲🇴",
+3134	    "flag_for_macedonia": "🇲🇰",
+3135	    "flag_for_madagascar": "🇲🇬",
+3136	    "flag_for_malawi": "🇲🇼",
+3137	    "flag_for_malaysia": "🇲🇾",
+3138	    "flag_for_maldives": "🇲🇻",
+3139	    "flag_for_mali": "🇲🇱",
+3140	    "flag_for_malta": "🇲🇹",
+3141	    "flag_for_marshall_islands": "🇲🇭",
+3142	    "flag_for_martinique": "🇲🇶",
+3143	    "flag_for_mauritania": "🇲🇷",
+3144	    "flag_for_mauritius": "🇲🇺",
+3145	    "flag_for_mayotte": "🇾🇹",
+3146	    "flag_for_mexico": "🇲🇽",
+3147	    "flag_for_micronesia": "🇫🇲",
+3148	    "flag_for_moldova": "🇲🇩",
+3149	    "flag_for_monaco": "🇲🇨",
+3150	    "flag_for_mongolia": "🇲🇳",
+3151	    "flag_for_montenegro": "🇲🇪",
+3152	    "flag_for_montserrat": "🇲🇸",
+3153	    "flag_for_morocco": "🇲🇦",
+3154	    "flag_for_mozambique": "🇲🇿",
+3155	    "flag_for_myanmar": "🇲🇲",
+3156	    "flag_for_namibia": "🇳🇦",
+3157	    "flag_for_nauru": "🇳🇷",
+3158	    "flag_for_nepal": "🇳🇵",
+3159	    "flag_for_netherlands": "🇳🇱",
+3160	    "flag_for_new_caledonia": "🇳🇨",
+3161	    "flag_for_new_zealand": "🇳🇿",
+3162	    "flag_for_nicaragua": "🇳🇮",
+3163	    "flag_for_niger": "🇳🇪",
+3164	    "flag_for_nigeria": "🇳🇬",
+3165	    "flag_for_niue": "🇳🇺",
+3166	    "flag_for_norfolk_island": "🇳🇫",
+3167	    "flag_for_north_korea": "🇰🇵",
+3168	    "flag_for_northern_mariana_islands": "🇲🇵",
+3169	    "flag_for_norway": "🇳🇴",
+3170	    "flag_for_oman": "🇴🇲",
+3171	    "flag_for_pakistan": "🇵🇰",
+3172	    "flag_for_palau": "🇵🇼",
+3173	    "flag_for_palestinian_territories": "🇵🇸",
+3174	    "flag_for_panama": "🇵🇦",
+3175	    "flag_for_papua_new_guinea": "🇵🇬",
+3176	    "flag_for_paraguay": "🇵🇾",
+3177	    "flag_for_peru": "🇵🇪",
+3178	    "flag_for_philippines": "🇵🇭",
+3179	    "flag_for_pitcairn_islands": "🇵🇳",
+3180	    "flag_for_poland": "🇵🇱",
+3181	    "flag_for_portugal": "🇵🇹",
+3182	    "flag_for_puerto_rico": "🇵🇷",
+3183	    "flag_for_qatar": "🇶🇦",
+3184	    "flag_for_romania": "🇷🇴",
+3185	    "flag_for_russia": "🇷🇺",
+3186	    "flag_for_rwanda": "🇷🇼",
+3187	    "flag_for_réunion": "🇷🇪",
+3188	    "flag_for_samoa": "🇼🇸",
+3189	    "flag_for_san_marino": "🇸🇲",
+3190	    "flag_for_saudi_arabia": "🇸🇦",
+3191	    "flag_for_senegal": "🇸🇳",
+3192	    "flag_for_serbia": "🇷🇸",
+3193	    "flag_for_seychelles": "🇸🇨",
+3194	    "flag_for_sierra_leone": "🇸🇱",
+3195	    "flag_for_singapore": "🇸🇬",
+3196	    "flag_for_sint_maarten": "🇸🇽",
+3197	    "flag_for_slovakia": "🇸🇰",
+3198	    "flag_for_slovenia": "🇸🇮",
+3199	    "flag_for_solomon_islands": "🇸🇧",
+3200	    "flag_for_somalia": "🇸🇴",
+3201	    "flag_for_south_africa": "🇿🇦",
+3202	    "flag_for_south_georgia_&_south_sandwich_islands": "🇬🇸",
+3203	    "flag_for_south_korea": "🇰🇷",
+3204	    "flag_for_south_sudan": "🇸🇸",
+3205	    "flag_for_spain": "🇪🇸",
+3206	    "flag_for_sri_lanka": "🇱🇰",
+3207	    "flag_for_st._barthélemy": "🇧🇱",
+3208	    "flag_for_st._helena": "🇸🇭",
+3209	    "flag_for_st._kitts_&_nevis": "🇰🇳",
+3210	    "flag_for_st._lucia": "🇱🇨",
+3211	    "flag_for_st._martin": "🇲🇫",
+3212	    "flag_for_st._pierre_&_miquelon": "🇵🇲",
+3213	    "flag_for_st._vincent_&_grenadines": "🇻🇨",
+3214	    "flag_for_sudan": "🇸🇩",
+3215	    "flag_for_suriname": "🇸🇷",
+3216	    "flag_for_svalbard_&_jan_mayen": "🇸🇯",
+3217	    "flag_for_swaziland": "🇸🇿",
+3218	    "flag_for_sweden": "🇸🇪",
+3219	    "flag_for_switzerland": "🇨🇭",
+3220	    "flag_for_syria": "🇸🇾",
+3221	    "flag_for_são_tomé_&_príncipe": "🇸🇹",
+3222	    "flag_for_taiwan": "🇹🇼",
+3223	    "flag_for_tajikistan": "🇹🇯",
+3224	    "flag_for_tanzania": "🇹🇿",
+3225	    "flag_for_thailand": "🇹🇭",
+3226	    "flag_for_timor__leste": "🇹🇱",
+3227	    "flag_for_togo": "🇹🇬",
+3228	    "flag_for_tokelau": "🇹🇰",
+3229	    "flag_for_tonga": "🇹🇴",
+3230	    "flag_for_trinidad_&_tobago": "🇹🇹",
+3231	    "flag_for_tristan_da_cunha": "🇹🇦",
+3232	    "flag_for_tunisia": "🇹🇳",
+3233	    "flag_for_turkey": "🇹🇷",
+3234	    "flag_for_turkmenistan": "🇹🇲",
+3235	    "flag_for_turks_&_caicos_islands": "🇹🇨",
+3236	    "flag_for_tuvalu": "🇹🇻",
+3237	    "flag_for_u.s._outlying_islands": "🇺🇲",
+3238	    "flag_for_u.s._virgin_islands": "🇻🇮",
+3239	    "flag_for_uganda": "🇺🇬",
+3240	    "flag_for_ukraine": "🇺🇦",
+3241	    "flag_for_united_arab_emirates": "🇦🇪",
+3242	    "flag_for_united_kingdom": "🇬🇧",
+3243	    "flag_for_united_states": "🇺🇸",
+3244	    "flag_for_uruguay": "🇺🇾",
+3245	    "flag_for_uzbekistan": "🇺🇿",
+3246	    "flag_for_vanuatu": "🇻🇺",
+3247	    "flag_for_vatican_city": "🇻🇦",
+3248	    "flag_for_venezuela": "🇻🇪",
+3249	    "flag_for_vietnam": "🇻🇳",
+3250	    "flag_for_wallis_&_futuna": "🇼🇫",
+3251	    "flag_for_western_sahara": "🇪🇭",
+3252	    "flag_for_yemen": "🇾🇪",
+3253	    "flag_for_zambia": "🇿🇲",
+3254	    "flag_for_zimbabwe": "🇿🇼",
+3255	    "flag_for_åland_islands": "🇦🇽",
+3256	    "golf": "⛳",
+3257	    "fleur__de__lis": "⚜",
+3258	    "muscle": "💪",
+3259	    "flushed": "😳",
+3260	    "frame_with_picture": "🖼",
+3261	    "fries": "🍟",
+3262	    "frog": "🐸",
+3263	    "hatched_chick": "🐥",
+3264	    "frowning": "😦",
+3265	    "fuelpump": "⛽",
+3266	    "full_moon_with_face": "🌝",
+3267	    "gem": "💎",
+3268	    "star2": "🌟",
+3269	    "golfer": "🏌",
+3270	    "mortar_board": "🎓",
+3271	    "grimacing": "😬",
+3272	    "smile_cat": "😸",
+3273	    "grinning": "😀",
+3274	    "grin": "😁",
+3275	    "heartpulse": "💗",
+3276	    "guardsman": "💂",
+3277	    "haircut": "💇",
+3278	    "hamster": "🐹",
+3279	    "raising_hand": "🙋",
+3280	    "headphones": "🎧",
+3281	    "hear_no_evil": "🙉",
+3282	    "cupid": "💘",
+3283	    "gift_heart": "💝",
+3284	    "heart": "❤",
+3285	    "exclamation": "❗",
+3286	    "heavy_exclamation_mark": "❗",
+3287	    "heavy_heart_exclamation_mark_ornament": "❣",
+3288	    "o": "⭕",
+3289	    "helm_symbol": "⎈",
+3290	    "helmet_with_white_cross": "⛑",
+3291	    "high_heel": "👠",
+3292	    "bullettrain_side": "🚄",
+3293	    "bullettrain_front": "🚅",
+3294	    "high_brightness": "🔆",
+3295	    "zap": "⚡",
+3296	    "hocho": "🔪",
+3297	    "knife": "🔪",
+3298	    "bee": "🐝",
+3299	    "traffic_light": "🚥",
+3300	    "racehorse": "🐎",
+3301	    "coffee": "☕",
+3302	    "hotsprings": "♨",
+3303	    "hourglass": "⌛",
+3304	    "hourglass_flowing_sand": "⏳",
+3305	    "house_buildings": "🏘",
+3306	    "100": "💯",
+3307	    "hushed": "😯",
+3308	    "ice_hockey_stick_and_puck": "🏒",
+3309	    "imp": "👿",
+3310	    "information_desk_person": "💁",
+3311	    "information_source": "ℹ",
+3312	    "capital_abcd": "🔠",
+3313	    "abc": "🔤",
+3314	    "abcd": "🔡",
+3315	    "1234": "🔢",
+3316	    "symbols": "🔣",
+3317	    "izakaya_lantern": "🏮",
+3318	    "lantern": "🏮",
+3319	    "jack_o_lantern": "🎃",
+3320	    "dolls": "🎎",
+3321	    "japanese_goblin": "👺",
+3322	    "japanese_ogre": "👹",
+3323	    "beginner": "🔰",
+3324	    "zero": "0️⃣",
+3325	    "one": "1️⃣",
+3326	    "ten": "🔟",
+3327	    "two": "2️⃣",
+3328	    "three": "3️⃣",
+3329	    "four": "4️⃣",
+3330	    "five": "5️⃣",
+3331	    "six": "6️⃣",
+3332	    "seven": "7️⃣",
+3333	    "eight": "8️⃣",
+3334	    "nine": "9️⃣",
+3335	    "couplekiss": "💏",
+3336	    "kissing_cat": "😽",
+3337	    "kissing": "😗",
+3338	    "kissing_closed_eyes": "😚",
+3339	    "kissing_smiling_eyes": "😙",
+3340	    "beetle": "🐞",
+3341	    "large_blue_circle": "🔵",
+3342	    "last_quarter_moon_with_face": "🌜",
+3343	    "leaves": "🍃",
+3344	    "mag": "🔍",
+3345	    "left_right_arrow": "↔",
+3346	    "leftwards_arrow_with_hook": "↩",
+3347	    "arrow_left": "⬅",
+3348	    "lock": "🔒",
+3349	    "lock_with_ink_pen": "🔏",
+3350	    "sob": "😭",
+3351	    "low_brightness": "🔅",
+3352	    "lower_left_ballpoint_pen": "🖊",
+3353	    "lower_left_crayon": "🖍",
+3354	    "lower_left_fountain_pen": "🖋",
+3355	    "lower_left_paintbrush": "🖌",
+3356	    "mahjong": "🀄",
+3357	    "couple": "👫",
+3358	    "man_in_business_suit_levitating": "🕴",
+3359	    "man_with_gua_pi_mao": "👲",
+3360	    "man_with_turban": "👳",
+3361	    "mans_shoe": "👞",
+3362	    "shoe": "👞",
+3363	    "menorah_with_nine_branches": "🕎",
+3364	    "mens": "🚹",
+3365	    "minidisc": "💽",
+3366	    "iphone": "📱",
+3367	    "calling": "📲",
+3368	    "money__mouth_face": "🤑",
+3369	    "moneybag": "💰",
+3370	    "rice_scene": "🎑",
+3371	    "mountain_bicyclist": "🚵",
+3372	    "mouse2": "🐁",
+3373	    "lips": "👄",
+3374	    "moyai": "🗿",
+3375	    "notes": "🎶",
+3376	    "nail_care": "💅",
+3377	    "ab": "🆎",
+3378	    "negative_squared_cross_mark": "❎",
+3379	    "a": "🅰",
+3380	    "b": "🅱",
+3381	    "o2": "🅾",
+3382	    "parking": "🅿",
+3383	    "new_moon_with_face": "🌚",
+3384	    "no_entry_sign": "🚫",
+3385	    "underage": "🔞",
+3386	    "non__potable_water": "🚱",
+3387	    "arrow_upper_right": "↗",
+3388	    "arrow_upper_left": "↖",
+3389	    "office": "🏢",
+3390	    "older_man": "👴",
+3391	    "older_woman": "👵",
+3392	    "om_symbol": "🕉",
+3393	    "on": "🔛",
+3394	    "book": "📖",
+3395	    "unlock": "🔓",
+3396	    "mailbox_with_no_mail": "📭",
+3397	    "mailbox_with_mail": "📬",
+3398	    "cd": "💿",
+3399	    "tada": "🎉",
+3400	    "feet": "🐾",
+3401	    "walking": "🚶",
+3402	    "pencil2": "✏",
+3403	    "pensive": "😔",
+3404	    "persevere": "😣",
+3405	    "bow": "🙇",
+3406	    "raised_hands": "🙌",
+3407	    "person_with_ball": "⛹",
+3408	    "person_with_blond_hair": "👱",
+3409	    "pray": "🙏",
+3410	    "person_with_pouting_face": "🙎",
+3411	    "computer": "💻",
+3412	    "pig2": "🐖",
+3413	    "hankey": "💩",
+3414	    "poop": "💩",
+3415	    "shit": "💩",
+3416	    "bamboo": "🎍",
+3417	    "gun": "🔫",
+3418	    "black_joker": "🃏",
+3419	    "rotating_light": "🚨",
+3420	    "cop": "👮",
+3421	    "stew": "🍲",
+3422	    "pouch": "👝",
+3423	    "pouting_cat": "😾",
+3424	    "rage": "😡",
+3425	    "put_litter_in_its_place": "🚮",
+3426	    "rabbit2": "🐇",
+3427	    "racing_motorcycle": "🏍",
+3428	    "radioactive_sign": "☢",
+3429	    "fist": "✊",
+3430	    "hand": "✋",
+3431	    "raised_hand_with_fingers_splayed": "🖐",
+3432	    "raised_hand_with_part_between_middle_and_ring_fingers": "🖖",
+3433	    "blue_car": "🚙",
+3434	    "apple": "🍎",
+3435	    "relieved": "😌",
+3436	    "reversed_hand_with_middle_finger_extended": "🖕",
+3437	    "mag_right": "🔎",
+3438	    "arrow_right_hook": "↪",
+3439	    "sweet_potato": "🍠",
+3440	    "robot": "🤖",
+3441	    "rolled__up_newspaper": "🗞",
+3442	    "rowboat": "🚣",
+3443	    "runner": "🏃",
+3444	    "running": "🏃",
+3445	    "running_shirt_with_sash": "🎽",
+3446	    "boat": "⛵",
+3447	    "scales": "⚖",
+3448	    "school_satchel": "🎒",
+3449	    "scorpius": "♏",
+3450	    "see_no_evil": "🙈",
+3451	    "sheep": "🐑",
+3452	    "stars": "🌠",
+3453	    "cake": "🍰",
+3454	    "six_pointed_star": "🔯",
+3455	    "ski": "🎿",
+3456	    "sleeping_accommodation": "🛌",
+3457	    "sleeping": "😴",
+3458	    "sleepy": "😪",
+3459	    "sleuth_or_spy": "🕵",
+3460	    "heart_eyes_cat": "😻",
+3461	    "smiley_cat": "😺",
+3462	    "innocent": "😇",
+3463	    "heart_eyes": "😍",
+3464	    "smiling_imp": "😈",
+3465	    "smiley": "😃",
+3466	    "sweat_smile": "😅",
+3467	    "smile": "😄",
+3468	    "laughing": "😆",
+3469	    "satisfied": "😆",
+3470	    "blush": "😊",
+3471	    "smirk": "😏",
+3472	    "smoking": "🚬",
+3473	    "snow_capped_mountain": "🏔",
+3474	    "soccer": "⚽",
+3475	    "icecream": "🍦",
+3476	    "soon": "🔜",
+3477	    "arrow_lower_right": "↘",
+3478	    "arrow_lower_left": "↙",
+3479	    "speak_no_evil": "🙊",
+3480	    "speaker": "🔈",
+3481	    "mute": "🔇",
+3482	    "sound": "🔉",
+3483	    "loud_sound": "🔊",
+3484	    "speaking_head_in_silhouette": "🗣",
+3485	    "spiral_calendar_pad": "🗓",
+3486	    "spiral_note_pad": "🗒",
+3487	    "shell": "🐚",
+3488	    "sweat_drops": "💦",
+3489	    "u5272": "🈹",
+3490	    "u5408": "🈴",
+3491	    "u55b6": "🈺",
+3492	    "u6307": "🈯",
+3493	    "u6708": "🈷",
+3494	    "u6709": "🈶",
+3495	    "u6e80": "🈵",
+3496	    "u7121": "🈚",
+3497	    "u7533": "🈸",
+3498	    "u7981": "🈲",
+3499	    "u7a7a": "🈳",
+3500	    "cl": "🆑",
+3501	    "cool": "🆒",
+3502	    "free": "🆓",
+3503	    "id": "🆔",
+3504	    "koko": "🈁",
+3505	    "sa": "🈂",
+3506	    "new": "🆕",
+3507	    "ng": "🆖",
+3508	    "ok": "🆗",
+3509	    "sos": "🆘",
+3510	    "up": "🆙",
+3511	    "vs": "🆚",
+3512	    "steam_locomotive": "🚂",
+3513	    "ramen": "🍜",
+3514	    "partly_sunny": "⛅",
+3515	    "city_sunrise": "🌇",
+3516	    "surfer": "🏄",
+3517	    "swimmer": "🏊",
+3518	    "shirt": "👕",
+3519	    "tshirt": "👕",
+3520	    "table_tennis_paddle_and_ball": "🏓",
+3521	    "tea": "🍵",
+3522	    "tv": "📺",
+3523	    "three_button_mouse": "🖱",
+3524	    "+1": "👍",
+3525	    "thumbsup": "👍",
+3526	    "__1": "👎",
+3527	    "-1": "👎",
+3528	    "thumbsdown": "👎",
+3529	    "thunder_cloud_and_rain": "⛈",
+3530	    "tiger2": "🐅",
+3531	    "tophat": "🎩",
+3532	    "top": "🔝",
+3533	    "tm": "™",
+3534	    "train2": "🚆",
+3535	    "triangular_flag_on_post": "🚩",
+3536	    "trident": "🔱",
+3537	    "twisted_rightwards_arrows": "🔀",
+3538	    "unamused": "😒",
+3539	    "small_red_triangle": "🔺",
+3540	    "arrow_up_small": "🔼",
+3541	    "arrow_up_down": "↕",
+3542	    "upside__down_face": "🙃",
+3543	    "arrow_up": "⬆",
+3544	    "v": "✌",
+3545	    "vhs": "📼",
+3546	    "wc": "🚾",
+3547	    "ocean": "🌊",
+3548	    "waving_black_flag": "🏴",
+3549	    "wave": "👋",
+3550	    "waving_white_flag": "🏳",
+3551	    "moon": "🌔",
+3552	    "scream_cat": "🙀",
+3553	    "weary": "😩",
+3554	    "weight_lifter": "🏋",
+3555	    "whale2": "🐋",
+3556	    "wheelchair": "♿",
+3557	    "point_down": "👇",
+3558	    "grey_exclamation": "❕",
+3559	    "white_frowning_face": "☹",
+3560	    "white_check_mark": "✅",
+3561	    "point_left": "👈",
+3562	    "white_medium_small_square": "◽",
+3563	    "star": "⭐",
+3564	    "grey_question": "❔",
+3565	    "point_right": "👉",
+3566	    "relaxed": "☺",
+3567	    "white_sun_behind_cloud": "🌥",
+3568	    "white_sun_behind_cloud_with_rain": "🌦",
+3569	    "white_sun_with_small_cloud": "🌤",
+3570	    "point_up_2": "👆",
+3571	    "point_up": "☝",
+3572	    "wind_blowing_face": "🌬",
+3573	    "wink": "😉",
+3574	    "wolf": "🐺",
+3575	    "dancers": "👯",
+3576	    "boot": "👢",
+3577	    "womans_clothes": "👚",
+3578	    "womans_hat": "👒",
+3579	    "sandal": "👡",
+3580	    "womens": "🚺",
+3581	    "worried": "😟",
+3582	    "gift": "🎁",
+3583	    "zipper__mouth_face": "🤐",
+3584	    "regional_indicator_a": "🇦",
+3585	    "regional_indicator_b": "🇧",
+3586	    "regional_indicator_c": "🇨",
+3587	    "regional_indicator_d": "🇩",
+3588	    "regional_indicator_e": "🇪",
+3589	    "regional_indicator_f": "🇫",
+3590	    "regional_indicator_g": "🇬",
+3591	    "regional_indicator_h": "🇭",
+3592	    "regional_indicator_i": "🇮",
+3593	    "regional_indicator_j": "🇯",
+3594	    "regional_indicator_k": "🇰",
+3595	    "regional_indicator_l": "🇱",
+3596	    "regional_indicator_m": "🇲",
+3597	    "regional_indicator_n": "🇳",
+3598	    "regional_indicator_o": "🇴",
+3599	    "regional_indicator_p": "🇵",
+3600	    "regional_indicator_q": "🇶",
+3601	    "regional_indicator_r": "🇷",
+3602	    "regional_indicator_s": "🇸",
+3603	    "regional_indicator_t": "🇹",
+3604	    "regional_indicator_u": "🇺",
+3605	    "regional_indicator_v": "🇻",
+3606	    "regional_indicator_w": "🇼",
+3607	    "regional_indicator_x": "🇽",
+3608	    "regional_indicator_y": "🇾",
+3609	    "regional_indicator_z": "🇿",
+3610	}
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '㊙'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/rich/_emoji_codes.py
+ Line number: 2882
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+2881	    "congratulations": "㊗",
+2882	    "secret": "㊙",
+2883	    "m": "Ⓜ",
+2884	    "city_sunset": "🌆",
+2885	    "clapper": "🎬",
+2886	    "clap": "👏",
+2887	    "beers": "🍻",
+2888	    "clock830": "🕣",
+2889	    "clock8": "🕗",
+2890	    "clock1130": "🕦",
+2891	    "clock11": "🕚",
+2892	    "clock530": "🕠",
+2893	    "clock5": "🕔",
+2894	    "clock430": "🕟",
+2895	    "clock4": "🕓",
+2896	    "clock930": "🕤",
+2897	    "clock9": "🕘",
+2898	    "clock130": "🕜",
+2899	    "clock1": "🕐",
+2900	    "clock730": "🕢",
+2901	    "clock7": "🕖",
+2902	    "clock630": "🕡",
+2903	    "clock6": "🕕",
+2904	    "clock1030": "🕥",
+2905	    "clock10": "🕙",
+2906	    "clock330": "🕞",
+2907	    "clock3": "🕒",
+2908	    "clock1230": "🕧",
+2909	    "clock12": "🕛",
+2910	    "clock230": "🕝",
+2911	    "clock2": "🕑",
+2912	    "arrows_clockwise": "🔃",
+2913	    "repeat": "🔁",
+2914	    "repeat_one": "🔂",
+2915	    "closed_lock_with_key": "🔐",
+2916	    "mailbox_closed": "📪",
+2917	    "mailbox": "📫",
+2918	    "cloud_with_tornado": "🌪",
+2919	    "cocktail": "🍸",
+2920	    "boom": "💥",
+2921	    "compression": "🗜",
+2922	    "confounded": "😖",
+2923	    "confused": "😕",
+2924	    "rice": "🍚",
+2925	    "cow2": "🐄",
+2926	    "cricket_bat_and_ball": "🏏",
+2927	    "x": "❌",
+2928	    "cry": "😢",
+2929	    "curry": "🍛",
+2930	    "dagger_knife": "🗡",
+2931	    "dancer": "💃",
+2932	    "dark_sunglasses": "🕶",
+2933	    "dash": "💨",
+2934	    "truck": "🚚",
+2935	    "derelict_house_building": "🏚",
+2936	    "diamond_shape_with_a_dot_inside": "💠",
+2937	    "dart": "🎯",
+2938	    "disappointed_relieved": "😥",
+2939	    "disappointed": "😞",
+2940	    "do_not_litter": "🚯",
+2941	    "dog2": "🐕",
+2942	    "flipper": "🐬",
+2943	    "loop": "➿",
+2944	    "bangbang": "‼",
+2945	    "double_vertical_bar": "⏸",
+2946	    "dove_of_peace": "🕊",
+2947	    "small_red_triangle_down": "🔻",
+2948	    "arrow_down_small": "🔽",
+2949	    "arrow_down": "⬇",
+2950	    "dromedary_camel": "🐪",
+2951	    "e__mail": "📧",
+2952	    "corn": "🌽",
+2953	    "ear_of_rice": "🌾",
+2954	    "earth_americas": "🌎",
+2955	    "earth_asia": "🌏",
+2956	    "earth_africa": "🌍",
+2957	    "eight_pointed_black_star": "✴",
+2958	    "eight_spoked_asterisk": "✳",
+2959	    "eject_symbol": "⏏",
+2960	    "bulb": "💡",
+2961	    "emoji_modifier_fitzpatrick_type__1__2": "🏻",
+2962	    "emoji_modifier_fitzpatrick_type__3": "🏼",
+2963	    "emoji_modifier_fitzpatrick_type__4": "🏽",
+2964	    "emoji_modifier_fitzpatrick_type__5": "🏾",
+2965	    "emoji_modifier_fitzpatrick_type__6": "🏿",
+2966	    "end": "🔚",
+2967	    "email": "✉",
+2968	    "european_castle": "🏰",
+2969	    "european_post_office": "🏤",
+2970	    "interrobang": "⁉",
+2971	    "expressionless": "😑",
+2972	    "eyeglasses": "👓",
+2973	    "massage": "💆",
+2974	    "yum": "😋",
+2975	    "scream": "😱",
+2976	    "kissing_heart": "😘",
+2977	    "sweat": "😓",
+2978	    "face_with_head__bandage": "🤕",
+2979	    "triumph": "😤",
+2980	    "mask": "😷",
+2981	    "no_good": "🙅",
+2982	    "ok_woman": "🙆",
+2983	    "open_mouth": "😮",
+2984	    "cold_sweat": "😰",
+2985	    "stuck_out_tongue": "😛",
+2986	    "stuck_out_tongue_closed_eyes": "😝",
+2987	    "stuck_out_tongue_winking_eye": "😜",
+2988	    "joy": "😂",
+2989	    "no_mouth": "😶",
+2990	    "santa": "🎅",
+2991	    "fax": "📠",
+2992	    "fearful": "😨",
+2993	    "field_hockey_stick_and_ball": "🏑",
+2994	    "first_quarter_moon_with_face": "🌛",
+2995	    "fish_cake": "🍥",
+2996	    "fishing_pole_and_fish": "🎣",
+2997	    "facepunch": "👊",
+2998	    "punch": "👊",
+2999	    "flag_for_afghanistan": "🇦🇫",
+3000	    "flag_for_albania": "🇦🇱",
+3001	    "flag_for_algeria": "🇩🇿",
+3002	    "flag_for_american_samoa": "🇦🇸",
+3003	    "flag_for_andorra": "🇦🇩",
+3004	    "flag_for_angola": "🇦🇴",
+3005	    "flag_for_anguilla": "🇦🇮",
+3006	    "flag_for_antarctica": "🇦🇶",
+3007	    "flag_for_antigua_&_barbuda": "🇦🇬",
+3008	    "flag_for_argentina": "🇦🇷",
+3009	    "flag_for_armenia": "🇦🇲",
+3010	    "flag_for_aruba": "🇦🇼",
+3011	    "flag_for_ascension_island": "🇦🇨",
+3012	    "flag_for_australia": "🇦🇺",
+3013	    "flag_for_austria": "🇦🇹",
+3014	    "flag_for_azerbaijan": "🇦🇿",
+3015	    "flag_for_bahamas": "🇧🇸",
+3016	    "flag_for_bahrain": "🇧🇭",
+3017	    "flag_for_bangladesh": "🇧🇩",
+3018	    "flag_for_barbados": "🇧🇧",
+3019	    "flag_for_belarus": "🇧🇾",
+3020	    "flag_for_belgium": "🇧🇪",
+3021	    "flag_for_belize": "🇧🇿",
+3022	    "flag_for_benin": "🇧🇯",
+3023	    "flag_for_bermuda": "🇧🇲",
+3024	    "flag_for_bhutan": "🇧🇹",
+3025	    "flag_for_bolivia": "🇧🇴",
+3026	    "flag_for_bosnia_&_herzegovina": "🇧🇦",
+3027	    "flag_for_botswana": "🇧🇼",
+3028	    "flag_for_bouvet_island": "🇧🇻",
+3029	    "flag_for_brazil": "🇧🇷",
+3030	    "flag_for_british_indian_ocean_territory": "🇮🇴",
+3031	    "flag_for_british_virgin_islands": "🇻🇬",
+3032	    "flag_for_brunei": "🇧🇳",
+3033	    "flag_for_bulgaria": "🇧🇬",
+3034	    "flag_for_burkina_faso": "🇧🇫",
+3035	    "flag_for_burundi": "🇧🇮",
+3036	    "flag_for_cambodia": "🇰🇭",
+3037	    "flag_for_cameroon": "🇨🇲",
+3038	    "flag_for_canada": "🇨🇦",
+3039	    "flag_for_canary_islands": "🇮🇨",
+3040	    "flag_for_cape_verde": "🇨🇻",
+3041	    "flag_for_caribbean_netherlands": "🇧🇶",
+3042	    "flag_for_cayman_islands": "🇰🇾",
+3043	    "flag_for_central_african_republic": "🇨🇫",
+3044	    "flag_for_ceuta_&_melilla": "🇪🇦",
+3045	    "flag_for_chad": "🇹🇩",
+3046	    "flag_for_chile": "🇨🇱",
+3047	    "flag_for_china": "🇨🇳",
+3048	    "flag_for_christmas_island": "🇨🇽",
+3049	    "flag_for_clipperton_island": "🇨🇵",
+3050	    "flag_for_cocos__islands": "🇨🇨",
+3051	    "flag_for_colombia": "🇨🇴",
+3052	    "flag_for_comoros": "🇰🇲",
+3053	    "flag_for_congo____brazzaville": "🇨🇬",
+3054	    "flag_for_congo____kinshasa": "🇨🇩",
+3055	    "flag_for_cook_islands": "🇨🇰",
+3056	    "flag_for_costa_rica": "🇨🇷",
+3057	    "flag_for_croatia": "🇭🇷",
+3058	    "flag_for_cuba": "🇨🇺",
+3059	    "flag_for_curaçao": "🇨🇼",
+3060	    "flag_for_cyprus": "🇨🇾",
+3061	    "flag_for_czech_republic": "🇨🇿",
+3062	    "flag_for_côte_d’ivoire": "🇨🇮",
+3063	    "flag_for_denmark": "🇩🇰",
+3064	    "flag_for_diego_garcia": "🇩🇬",
+3065	    "flag_for_djibouti": "🇩🇯",
+3066	    "flag_for_dominica": "🇩🇲",
+3067	    "flag_for_dominican_republic": "🇩🇴",
+3068	    "flag_for_ecuador": "🇪🇨",
+3069	    "flag_for_egypt": "🇪🇬",
+3070	    "flag_for_el_salvador": "🇸🇻",
+3071	    "flag_for_equatorial_guinea": "🇬🇶",
+3072	    "flag_for_eritrea": "🇪🇷",
+3073	    "flag_for_estonia": "🇪🇪",
+3074	    "flag_for_ethiopia": "🇪🇹",
+3075	    "flag_for_european_union": "🇪🇺",
+3076	    "flag_for_falkland_islands": "🇫🇰",
+3077	    "flag_for_faroe_islands": "🇫🇴",
+3078	    "flag_for_fiji": "🇫🇯",
+3079	    "flag_for_finland": "🇫🇮",
+3080	    "flag_for_france": "🇫🇷",
+3081	    "flag_for_french_guiana": "🇬🇫",
+3082	    "flag_for_french_polynesia": "🇵🇫",
+3083	    "flag_for_french_southern_territories": "🇹🇫",
+3084	    "flag_for_gabon": "🇬🇦",
+3085	    "flag_for_gambia": "🇬🇲",
+3086	    "flag_for_georgia": "🇬🇪",
+3087	    "flag_for_germany": "🇩🇪",
+3088	    "flag_for_ghana": "🇬🇭",
+3089	    "flag_for_gibraltar": "🇬🇮",
+3090	    "flag_for_greece": "🇬🇷",
+3091	    "flag_for_greenland": "🇬🇱",
+3092	    "flag_for_grenada": "🇬🇩",
+3093	    "flag_for_guadeloupe": "🇬🇵",
+3094	    "flag_for_guam": "🇬🇺",
+3095	    "flag_for_guatemala": "🇬🇹",
+3096	    "flag_for_guernsey": "🇬🇬",
+3097	    "flag_for_guinea": "🇬🇳",
+3098	    "flag_for_guinea__bissau": "🇬🇼",
+3099	    "flag_for_guyana": "🇬🇾",
+3100	    "flag_for_haiti": "🇭🇹",
+3101	    "flag_for_heard_&_mcdonald_islands": "🇭🇲",
+3102	    "flag_for_honduras": "🇭🇳",
+3103	    "flag_for_hong_kong": "🇭🇰",
+3104	    "flag_for_hungary": "🇭🇺",
+3105	    "flag_for_iceland": "🇮🇸",
+3106	    "flag_for_india": "🇮🇳",
+3107	    "flag_for_indonesia": "🇮🇩",
+3108	    "flag_for_iran": "🇮🇷",
+3109	    "flag_for_iraq": "🇮🇶",
+3110	    "flag_for_ireland": "🇮🇪",
+3111	    "flag_for_isle_of_man": "🇮🇲",
+3112	    "flag_for_israel": "🇮🇱",
+3113	    "flag_for_italy": "🇮🇹",
+3114	    "flag_for_jamaica": "🇯🇲",
+3115	    "flag_for_japan": "🇯🇵",
+3116	    "flag_for_jersey": "🇯🇪",
+3117	    "flag_for_jordan": "🇯🇴",
+3118	    "flag_for_kazakhstan": "🇰🇿",
+3119	    "flag_for_kenya": "🇰🇪",
+3120	    "flag_for_kiribati": "🇰🇮",
+3121	    "flag_for_kosovo": "🇽🇰",
+3122	    "flag_for_kuwait": "🇰🇼",
+3123	    "flag_for_kyrgyzstan": "🇰🇬",
+3124	    "flag_for_laos": "🇱🇦",
+3125	    "flag_for_latvia": "🇱🇻",
+3126	    "flag_for_lebanon": "🇱🇧",
+3127	    "flag_for_lesotho": "🇱🇸",
+3128	    "flag_for_liberia": "🇱🇷",
+3129	    "flag_for_libya": "🇱🇾",
+3130	    "flag_for_liechtenstein": "🇱🇮",
+3131	    "flag_for_lithuania": "🇱🇹",
+3132	    "flag_for_luxembourg": "🇱🇺",
+3133	    "flag_for_macau": "🇲🇴",
+3134	    "flag_for_macedonia": "🇲🇰",
+3135	    "flag_for_madagascar": "🇲🇬",
+3136	    "flag_for_malawi": "🇲🇼",
+3137	    "flag_for_malaysia": "🇲🇾",
+3138	    "flag_for_maldives": "🇲🇻",
+3139	    "flag_for_mali": "🇲🇱",
+3140	    "flag_for_malta": "🇲🇹",
+3141	    "flag_for_marshall_islands": "🇲🇭",
+3142	    "flag_for_martinique": "🇲🇶",
+3143	    "flag_for_mauritania": "🇲🇷",
+3144	    "flag_for_mauritius": "🇲🇺",
+3145	    "flag_for_mayotte": "🇾🇹",
+3146	    "flag_for_mexico": "🇲🇽",
+3147	    "flag_for_micronesia": "🇫🇲",
+3148	    "flag_for_moldova": "🇲🇩",
+3149	    "flag_for_monaco": "🇲🇨",
+3150	    "flag_for_mongolia": "🇲🇳",
+3151	    "flag_for_montenegro": "🇲🇪",
+3152	    "flag_for_montserrat": "🇲🇸",
+3153	    "flag_for_morocco": "🇲🇦",
+3154	    "flag_for_mozambique": "🇲🇿",
+3155	    "flag_for_myanmar": "🇲🇲",
+3156	    "flag_for_namibia": "🇳🇦",
+3157	    "flag_for_nauru": "🇳🇷",
+3158	    "flag_for_nepal": "🇳🇵",
+3159	    "flag_for_netherlands": "🇳🇱",
+3160	    "flag_for_new_caledonia": "🇳🇨",
+3161	    "flag_for_new_zealand": "🇳🇿",
+3162	    "flag_for_nicaragua": "🇳🇮",
+3163	    "flag_for_niger": "🇳🇪",
+3164	    "flag_for_nigeria": "🇳🇬",
+3165	    "flag_for_niue": "🇳🇺",
+3166	    "flag_for_norfolk_island": "🇳🇫",
+3167	    "flag_for_north_korea": "🇰🇵",
+3168	    "flag_for_northern_mariana_islands": "🇲🇵",
+3169	    "flag_for_norway": "🇳🇴",
+3170	    "flag_for_oman": "🇴🇲",
+3171	    "flag_for_pakistan": "🇵🇰",
+3172	    "flag_for_palau": "🇵🇼",
+3173	    "flag_for_palestinian_territories": "🇵🇸",
+3174	    "flag_for_panama": "🇵🇦",
+3175	    "flag_for_papua_new_guinea": "🇵🇬",
+3176	    "flag_for_paraguay": "🇵🇾",
+3177	    "flag_for_peru": "🇵🇪",
+3178	    "flag_for_philippines": "🇵🇭",
+3179	    "flag_for_pitcairn_islands": "🇵🇳",
+3180	    "flag_for_poland": "🇵🇱",
+3181	    "flag_for_portugal": "🇵🇹",
+3182	    "flag_for_puerto_rico": "🇵🇷",
+3183	    "flag_for_qatar": "🇶🇦",
+3184	    "flag_for_romania": "🇷🇴",
+3185	    "flag_for_russia": "🇷🇺",
+3186	    "flag_for_rwanda": "🇷🇼",
+3187	    "flag_for_réunion": "🇷🇪",
+3188	    "flag_for_samoa": "🇼🇸",
+3189	    "flag_for_san_marino": "🇸🇲",
+3190	    "flag_for_saudi_arabia": "🇸🇦",
+3191	    "flag_for_senegal": "🇸🇳",
+3192	    "flag_for_serbia": "🇷🇸",
+3193	    "flag_for_seychelles": "🇸🇨",
+3194	    "flag_for_sierra_leone": "🇸🇱",
+3195	    "flag_for_singapore": "🇸🇬",
+3196	    "flag_for_sint_maarten": "🇸🇽",
+3197	    "flag_for_slovakia": "🇸🇰",
+3198	    "flag_for_slovenia": "🇸🇮",
+3199	    "flag_for_solomon_islands": "🇸🇧",
+3200	    "flag_for_somalia": "🇸🇴",
+3201	    "flag_for_south_africa": "🇿🇦",
+3202	    "flag_for_south_georgia_&_south_sandwich_islands": "🇬🇸",
+3203	    "flag_for_south_korea": "🇰🇷",
+3204	    "flag_for_south_sudan": "🇸🇸",
+3205	    "flag_for_spain": "🇪🇸",
+3206	    "flag_for_sri_lanka": "🇱🇰",
+3207	    "flag_for_st._barthélemy": "🇧🇱",
+3208	    "flag_for_st._helena": "🇸🇭",
+3209	    "flag_for_st._kitts_&_nevis": "🇰🇳",
+3210	    "flag_for_st._lucia": "🇱🇨",
+3211	    "flag_for_st._martin": "🇲🇫",
+3212	    "flag_for_st._pierre_&_miquelon": "🇵🇲",
+3213	    "flag_for_st._vincent_&_grenadines": "🇻🇨",
+3214	    "flag_for_sudan": "🇸🇩",
+3215	    "flag_for_suriname": "🇸🇷",
+3216	    "flag_for_svalbard_&_jan_mayen": "🇸🇯",
+3217	    "flag_for_swaziland": "🇸🇿",
+3218	    "flag_for_sweden": "🇸🇪",
+3219	    "flag_for_switzerland": "🇨🇭",
+3220	    "flag_for_syria": "🇸🇾",
+3221	    "flag_for_são_tomé_&_príncipe": "🇸🇹",
+3222	    "flag_for_taiwan": "🇹🇼",
+3223	    "flag_for_tajikistan": "🇹🇯",
+3224	    "flag_for_tanzania": "🇹🇿",
+3225	    "flag_for_thailand": "🇹🇭",
+3226	    "flag_for_timor__leste": "🇹🇱",
+3227	    "flag_for_togo": "🇹🇬",
+3228	    "flag_for_tokelau": "🇹🇰",
+3229	    "flag_for_tonga": "🇹🇴",
+3230	    "flag_for_trinidad_&_tobago": "🇹🇹",
+3231	    "flag_for_tristan_da_cunha": "🇹🇦",
+3232	    "flag_for_tunisia": "🇹🇳",
+3233	    "flag_for_turkey": "🇹🇷",
+3234	    "flag_for_turkmenistan": "🇹🇲",
+3235	    "flag_for_turks_&_caicos_islands": "🇹🇨",
+3236	    "flag_for_tuvalu": "🇹🇻",
+3237	    "flag_for_u.s._outlying_islands": "🇺🇲",
+3238	    "flag_for_u.s._virgin_islands": "🇻🇮",
+3239	    "flag_for_uganda": "🇺🇬",
+3240	    "flag_for_ukraine": "🇺🇦",
+3241	    "flag_for_united_arab_emirates": "🇦🇪",
+3242	    "flag_for_united_kingdom": "🇬🇧",
+3243	    "flag_for_united_states": "🇺🇸",
+3244	    "flag_for_uruguay": "🇺🇾",
+3245	    "flag_for_uzbekistan": "🇺🇿",
+3246	    "flag_for_vanuatu": "🇻🇺",
+3247	    "flag_for_vatican_city": "🇻🇦",
+3248	    "flag_for_venezuela": "🇻🇪",
+3249	    "flag_for_vietnam": "🇻🇳",
+3250	    "flag_for_wallis_&_futuna": "🇼🇫",
+3251	    "flag_for_western_sahara": "🇪🇭",
+3252	    "flag_for_yemen": "🇾🇪",
+3253	    "flag_for_zambia": "🇿🇲",
+3254	    "flag_for_zimbabwe": "🇿🇼",
+3255	    "flag_for_åland_islands": "🇦🇽",
+3256	    "golf": "⛳",
+3257	    "fleur__de__lis": "⚜",
+3258	    "muscle": "💪",
+3259	    "flushed": "😳",
+3260	    "frame_with_picture": "🖼",
+3261	    "fries": "🍟",
+3262	    "frog": "🐸",
+3263	    "hatched_chick": "🐥",
+3264	    "frowning": "😦",
+3265	    "fuelpump": "⛽",
+3266	    "full_moon_with_face": "🌝",
+3267	    "gem": "💎",
+3268	    "star2": "🌟",
+3269	    "golfer": "🏌",
+3270	    "mortar_board": "🎓",
+3271	    "grimacing": "😬",
+3272	    "smile_cat": "😸",
+3273	    "grinning": "😀",
+3274	    "grin": "😁",
+3275	    "heartpulse": "💗",
+3276	    "guardsman": "💂",
+3277	    "haircut": "💇",
+3278	    "hamster": "🐹",
+3279	    "raising_hand": "🙋",
+3280	    "headphones": "🎧",
+3281	    "hear_no_evil": "🙉",
+3282	    "cupid": "💘",
+3283	    "gift_heart": "💝",
+3284	    "heart": "❤",
+3285	    "exclamation": "❗",
+3286	    "heavy_exclamation_mark": "❗",
+3287	    "heavy_heart_exclamation_mark_ornament": "❣",
+3288	    "o": "⭕",
+3289	    "helm_symbol": "⎈",
+3290	    "helmet_with_white_cross": "⛑",
+3291	    "high_heel": "👠",
+3292	    "bullettrain_side": "🚄",
+3293	    "bullettrain_front": "🚅",
+3294	    "high_brightness": "🔆",
+3295	    "zap": "⚡",
+3296	    "hocho": "🔪",
+3297	    "knife": "🔪",
+3298	    "bee": "🐝",
+3299	    "traffic_light": "🚥",
+3300	    "racehorse": "🐎",
+3301	    "coffee": "☕",
+3302	    "hotsprings": "♨",
+3303	    "hourglass": "⌛",
+3304	    "hourglass_flowing_sand": "⏳",
+3305	    "house_buildings": "🏘",
+3306	    "100": "💯",
+3307	    "hushed": "😯",
+3308	    "ice_hockey_stick_and_puck": "🏒",
+3309	    "imp": "👿",
+3310	    "information_desk_person": "💁",
+3311	    "information_source": "ℹ",
+3312	    "capital_abcd": "🔠",
+3313	    "abc": "🔤",
+3314	    "abcd": "🔡",
+3315	    "1234": "🔢",
+3316	    "symbols": "🔣",
+3317	    "izakaya_lantern": "🏮",
+3318	    "lantern": "🏮",
+3319	    "jack_o_lantern": "🎃",
+3320	    "dolls": "🎎",
+3321	    "japanese_goblin": "👺",
+3322	    "japanese_ogre": "👹",
+3323	    "beginner": "🔰",
+3324	    "zero": "0️⃣",
+3325	    "one": "1️⃣",
+3326	    "ten": "🔟",
+3327	    "two": "2️⃣",
+3328	    "three": "3️⃣",
+3329	    "four": "4️⃣",
+3330	    "five": "5️⃣",
+3331	    "six": "6️⃣",
+3332	    "seven": "7️⃣",
+3333	    "eight": "8️⃣",
+3334	    "nine": "9️⃣",
+3335	    "couplekiss": "💏",
+3336	    "kissing_cat": "😽",
+3337	    "kissing": "😗",
+3338	    "kissing_closed_eyes": "😚",
+3339	    "kissing_smiling_eyes": "😙",
+3340	    "beetle": "🐞",
+3341	    "large_blue_circle": "🔵",
+3342	    "last_quarter_moon_with_face": "🌜",
+3343	    "leaves": "🍃",
+3344	    "mag": "🔍",
+3345	    "left_right_arrow": "↔",
+3346	    "leftwards_arrow_with_hook": "↩",
+3347	    "arrow_left": "⬅",
+3348	    "lock": "🔒",
+3349	    "lock_with_ink_pen": "🔏",
+3350	    "sob": "😭",
+3351	    "low_brightness": "🔅",
+3352	    "lower_left_ballpoint_pen": "🖊",
+3353	    "lower_left_crayon": "🖍",
+3354	    "lower_left_fountain_pen": "🖋",
+3355	    "lower_left_paintbrush": "🖌",
+3356	    "mahjong": "🀄",
+3357	    "couple": "👫",
+3358	    "man_in_business_suit_levitating": "🕴",
+3359	    "man_with_gua_pi_mao": "👲",
+3360	    "man_with_turban": "👳",
+3361	    "mans_shoe": "👞",
+3362	    "shoe": "👞",
+3363	    "menorah_with_nine_branches": "🕎",
+3364	    "mens": "🚹",
+3365	    "minidisc": "💽",
+3366	    "iphone": "📱",
+3367	    "calling": "📲",
+3368	    "money__mouth_face": "🤑",
+3369	    "moneybag": "💰",
+3370	    "rice_scene": "🎑",
+3371	    "mountain_bicyclist": "🚵",
+3372	    "mouse2": "🐁",
+3373	    "lips": "👄",
+3374	    "moyai": "🗿",
+3375	    "notes": "🎶",
+3376	    "nail_care": "💅",
+3377	    "ab": "🆎",
+3378	    "negative_squared_cross_mark": "❎",
+3379	    "a": "🅰",
+3380	    "b": "🅱",
+3381	    "o2": "🅾",
+3382	    "parking": "🅿",
+3383	    "new_moon_with_face": "🌚",
+3384	    "no_entry_sign": "🚫",
+3385	    "underage": "🔞",
+3386	    "non__potable_water": "🚱",
+3387	    "arrow_upper_right": "↗",
+3388	    "arrow_upper_left": "↖",
+3389	    "office": "🏢",
+3390	    "older_man": "👴",
+3391	    "older_woman": "👵",
+3392	    "om_symbol": "🕉",
+3393	    "on": "🔛",
+3394	    "book": "📖",
+3395	    "unlock": "🔓",
+3396	    "mailbox_with_no_mail": "📭",
+3397	    "mailbox_with_mail": "📬",
+3398	    "cd": "💿",
+3399	    "tada": "🎉",
+3400	    "feet": "🐾",
+3401	    "walking": "🚶",
+3402	    "pencil2": "✏",
+3403	    "pensive": "😔",
+3404	    "persevere": "😣",
+3405	    "bow": "🙇",
+3406	    "raised_hands": "🙌",
+3407	    "person_with_ball": "⛹",
+3408	    "person_with_blond_hair": "👱",
+3409	    "pray": "🙏",
+3410	    "person_with_pouting_face": "🙎",
+3411	    "computer": "💻",
+3412	    "pig2": "🐖",
+3413	    "hankey": "💩",
+3414	    "poop": "💩",
+3415	    "shit": "💩",
+3416	    "bamboo": "🎍",
+3417	    "gun": "🔫",
+3418	    "black_joker": "🃏",
+3419	    "rotating_light": "🚨",
+3420	    "cop": "👮",
+3421	    "stew": "🍲",
+3422	    "pouch": "👝",
+3423	    "pouting_cat": "😾",
+3424	    "rage": "😡",
+3425	    "put_litter_in_its_place": "🚮",
+3426	    "rabbit2": "🐇",
+3427	    "racing_motorcycle": "🏍",
+3428	    "radioactive_sign": "☢",
+3429	    "fist": "✊",
+3430	    "hand": "✋",
+3431	    "raised_hand_with_fingers_splayed": "🖐",
+3432	    "raised_hand_with_part_between_middle_and_ring_fingers": "🖖",
+3433	    "blue_car": "🚙",
+3434	    "apple": "🍎",
+3435	    "relieved": "😌",
+3436	    "reversed_hand_with_middle_finger_extended": "🖕",
+3437	    "mag_right": "🔎",
+3438	    "arrow_right_hook": "↪",
+3439	    "sweet_potato": "🍠",
+3440	    "robot": "🤖",
+3441	    "rolled__up_newspaper": "🗞",
+3442	    "rowboat": "🚣",
+3443	    "runner": "🏃",
+3444	    "running": "🏃",
+3445	    "running_shirt_with_sash": "🎽",
+3446	    "boat": "⛵",
+3447	    "scales": "⚖",
+3448	    "school_satchel": "🎒",
+3449	    "scorpius": "♏",
+3450	    "see_no_evil": "🙈",
+3451	    "sheep": "🐑",
+3452	    "stars": "🌠",
+3453	    "cake": "🍰",
+3454	    "six_pointed_star": "🔯",
+3455	    "ski": "🎿",
+3456	    "sleeping_accommodation": "🛌",
+3457	    "sleeping": "😴",
+3458	    "sleepy": "😪",
+3459	    "sleuth_or_spy": "🕵",
+3460	    "heart_eyes_cat": "😻",
+3461	    "smiley_cat": "😺",
+3462	    "innocent": "😇",
+3463	    "heart_eyes": "😍",
+3464	    "smiling_imp": "😈",
+3465	    "smiley": "😃",
+3466	    "sweat_smile": "😅",
+3467	    "smile": "😄",
+3468	    "laughing": "😆",
+3469	    "satisfied": "😆",
+3470	    "blush": "😊",
+3471	    "smirk": "😏",
+3472	    "smoking": "🚬",
+3473	    "snow_capped_mountain": "🏔",
+3474	    "soccer": "⚽",
+3475	    "icecream": "🍦",
+3476	    "soon": "🔜",
+3477	    "arrow_lower_right": "↘",
+3478	    "arrow_lower_left": "↙",
+3479	    "speak_no_evil": "🙊",
+3480	    "speaker": "🔈",
+3481	    "mute": "🔇",
+3482	    "sound": "🔉",
+3483	    "loud_sound": "🔊",
+3484	    "speaking_head_in_silhouette": "🗣",
+3485	    "spiral_calendar_pad": "🗓",
+3486	    "spiral_note_pad": "🗒",
+3487	    "shell": "🐚",
+3488	    "sweat_drops": "💦",
+3489	    "u5272": "🈹",
+3490	    "u5408": "🈴",
+3491	    "u55b6": "🈺",
+3492	    "u6307": "🈯",
+3493	    "u6708": "🈷",
+3494	    "u6709": "🈶",
+3495	    "u6e80": "🈵",
+3496	    "u7121": "🈚",
+3497	    "u7533": "🈸",
+3498	    "u7981": "🈲",
+3499	    "u7a7a": "🈳",
+3500	    "cl": "🆑",
+3501	    "cool": "🆒",
+3502	    "free": "🆓",
+3503	    "id": "🆔",
+3504	    "koko": "🈁",
+3505	    "sa": "🈂",
+3506	    "new": "🆕",
+3507	    "ng": "🆖",
+3508	    "ok": "🆗",
+3509	    "sos": "🆘",
+3510	    "up": "🆙",
+3511	    "vs": "🆚",
+3512	    "steam_locomotive": "🚂",
+3513	    "ramen": "🍜",
+3514	    "partly_sunny": "⛅",
+3515	    "city_sunrise": "🌇",
+3516	    "surfer": "🏄",
+3517	    "swimmer": "🏊",
+3518	    "shirt": "👕",
+3519	    "tshirt": "👕",
+3520	    "table_tennis_paddle_and_ball": "🏓",
+3521	    "tea": "🍵",
+3522	    "tv": "📺",
+3523	    "three_button_mouse": "🖱",
+3524	    "+1": "👍",
+3525	    "thumbsup": "👍",
+3526	    "__1": "👎",
+3527	    "-1": "👎",
+3528	    "thumbsdown": "👎",
+3529	    "thunder_cloud_and_rain": "⛈",
+3530	    "tiger2": "🐅",
+3531	    "tophat": "🎩",
+3532	    "top": "🔝",
+3533	    "tm": "™",
+3534	    "train2": "🚆",
+3535	    "triangular_flag_on_post": "🚩",
+3536	    "trident": "🔱",
+3537	    "twisted_rightwards_arrows": "🔀",
+3538	    "unamused": "😒",
+3539	    "small_red_triangle": "🔺",
+3540	    "arrow_up_small": "🔼",
+3541	    "arrow_up_down": "↕",
+3542	    "upside__down_face": "🙃",
+3543	    "arrow_up": "⬆",
+3544	    "v": "✌",
+3545	    "vhs": "📼",
+3546	    "wc": "🚾",
+3547	    "ocean": "🌊",
+3548	    "waving_black_flag": "🏴",
+3549	    "wave": "👋",
+3550	    "waving_white_flag": "🏳",
+3551	    "moon": "🌔",
+3552	    "scream_cat": "🙀",
+3553	    "weary": "😩",
+3554	    "weight_lifter": "🏋",
+3555	    "whale2": "🐋",
+3556	    "wheelchair": "♿",
+3557	    "point_down": "👇",
+3558	    "grey_exclamation": "❕",
+3559	    "white_frowning_face": "☹",
+3560	    "white_check_mark": "✅",
+3561	    "point_left": "👈",
+3562	    "white_medium_small_square": "◽",
+3563	    "star": "⭐",
+3564	    "grey_question": "❔",
+3565	    "point_right": "👉",
+3566	    "relaxed": "☺",
+3567	    "white_sun_behind_cloud": "🌥",
+3568	    "white_sun_behind_cloud_with_rain": "🌦",
+3569	    "white_sun_with_small_cloud": "🌤",
+3570	    "point_up_2": "👆",
+3571	    "point_up": "☝",
+3572	    "wind_blowing_face": "🌬",
+3573	    "wink": "😉",
+3574	    "wolf": "🐺",
+3575	    "dancers": "👯",
+3576	    "boot": "👢",
+3577	    "womans_clothes": "👚",
+3578	    "womans_hat": "👒",
+3579	    "sandal": "👡",
+3580	    "womens": "🚺",
+3581	    "worried": "😟",
+3582	    "gift": "🎁",
+3583	    "zipper__mouth_face": "🤐",
+3584	    "regional_indicator_a": "🇦",
+3585	    "regional_indicator_b": "🇧",
+3586	    "regional_indicator_c": "🇨",
+3587	    "regional_indicator_d": "🇩",
+3588	    "regional_indicator_e": "🇪",
+3589	    "regional_indicator_f": "🇫",
+3590	    "regional_indicator_g": "🇬",
+3591	    "regional_indicator_h": "🇭",
+3592	    "regional_indicator_i": "🇮",
+3593	    "regional_indicator_j": "🇯",
+3594	    "regional_indicator_k": "🇰",
+3595	    "regional_indicator_l": "🇱",
+3596	    "regional_indicator_m": "🇲",
+3597	    "regional_indicator_n": "🇳",
+3598	    "regional_indicator_o": "🇴",
+3599	    "regional_indicator_p": "🇵",
+3600	    "regional_indicator_q": "🇶",
+3601	    "regional_indicator_r": "🇷",
+3602	    "regional_indicator_s": "🇸",
+3603	    "regional_indicator_t": "🇹",
+3604	    "regional_indicator_u": "🇺",
+3605	    "regional_indicator_v": "🇻",
+3606	    "regional_indicator_w": "🇼",
+3607	    "regional_indicator_x": "🇽",
+3608	    "regional_indicator_y": "🇾",
+3609	    "regional_indicator_z": "🇿",
+3610	}
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/_pick.py
+ Line number: 13
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+12	    """
+13	    assert values, "1 or more values required"
+14	    for value in values:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/_ratio.py
+ Line number: 123
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+122	    total_ratio = sum(ratios)
+123	    assert total_ratio > 0, "Sum of ratios must be > 0"
+124	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/_unicode_data/__init__.py
+ Line number: 92
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+91	    if TYPE_CHECKING:
+92	        assert isinstance(module.cell_table, CellTable)
+93	    return module.cell_table
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/_win32_console.py
+ Line number: 435
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+434	
+435	        assert fore is not None
+436	        assert back is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/_win32_console.py
+ Line number: 436
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+435	        assert fore is not None
+436	        assert back is not None
+437	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/_win32_console.py
+ Line number: 565
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+564	        """
+565	        assert len(title) < 255, "Console title must be less than 255 characters"
+566	        SetConsoleTitle(title)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 365
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+364	        if self.type == ColorType.TRUECOLOR:
+365	            assert self.triplet is not None
+366	            return self.triplet
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 368
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+367	        elif self.type == ColorType.EIGHT_BIT:
+368	            assert self.number is not None
+369	            return EIGHT_BIT_PALETTE[self.number]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 371
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+370	        elif self.type == ColorType.STANDARD:
+371	            assert self.number is not None
+372	            return theme.ansi_colors[self.number]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 374
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+373	        elif self.type == ColorType.WINDOWS:
+374	            assert self.number is not None
+375	            return WINDOWS_PALETTE[self.number]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 377
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+376	        else:  # self.type == ColorType.DEFAULT:
+377	            assert self.number is None
+378	            return theme.foreground_color if foreground else theme.background_color
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 493
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+492	            number = self.number
+493	            assert number is not None
+494	            fore, back = (30, 40) if number < 8 else (82, 92)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 499
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+498	            number = self.number
+499	            assert number is not None
+500	            fore, back = (30, 40) if number < 8 else (82, 92)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 504
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+503	        elif _type == ColorType.EIGHT_BIT:
+504	            assert self.number is not None
+505	            return ("38" if foreground else "48", "5", str(self.number))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 508
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+507	        else:  # self.standard == ColorStandard.TRUECOLOR:
+508	            assert self.triplet is not None
+509	            red, green, blue = self.triplet
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 520
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+519	        if system == ColorSystem.EIGHT_BIT and self.system == ColorSystem.TRUECOLOR:
+520	            assert self.triplet is not None
+521	            _h, l, s = rgb_to_hls(*self.triplet.normalized)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 546
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+545	            if self.system == ColorSystem.TRUECOLOR:
+546	                assert self.triplet is not None
+547	                triplet = self.triplet
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 549
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+548	            else:  # self.system == ColorSystem.EIGHT_BIT
+549	                assert self.number is not None
+550	                triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 557
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+556	            if self.system == ColorSystem.TRUECOLOR:
+557	                assert self.triplet is not None
+558	                triplet = self.triplet
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 560
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+559	            else:  # self.system == ColorSystem.EIGHT_BIT
+560	                assert self.number is not None
+561	                if self.number < 16:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/color.py
+ Line number: 573
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+572	    """Parse six hex characters in to RGB triplet."""
+573	    assert len(hex_color) == 6, "must be 6 characters"
+574	    color = ColorTriplet(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/console.py
+ Line number: 1149
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1148	
+1149	        assert count >= 0, "count must be >= 0"
+1150	        self.print(NewLine(count))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/console.py
+ Line number: 1929
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1928	                offset -= 1
+1929	            assert frame is not None
+1930	            return frame.f_code.co_filename, frame.f_lineno, frame.f_locals
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/console.py
+ Line number: 2189
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2188	        """
+2189	        assert (
+2190	            self.record
+2191	        ), "To export console contents set record=True in the constructor or instance"
+2192	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/console.py
+ Line number: 2245
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2244	        """
+2245	        assert (
+2246	            self.record
+2247	        ), "To export console contents set record=True in the constructor or instance"
+2248	        fragments: List[str] = []
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/live.py
+ Line number: 71
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+70	    ) -> None:
+71	        assert refresh_per_second > 0, "refresh_per_second must be > 0"
+72	        self._renderable = renderable
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/rich/live.py
+ Line number: 381
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+380	                time.sleep(0.4)
+381	                if random.randint(0, 10) < 1:
+382	                    console.log(next(examples))
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/rich/live.py
+ Line number: 384
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+383	                exchange_rate_dict[(select_exchange, exchange)] = 200 / (
+384	                    (random.random() * 320) + 1
+385	                )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/logging.py
+ Line number: 142
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+141	            exc_type, exc_value, exc_traceback = record.exc_info
+142	            assert exc_type is not None
+143	            assert exc_value is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/logging.py
+ Line number: 143
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+142	            assert exc_type is not None
+143	            assert exc_value is not None
+144	            traceback = Traceback.from_exception(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/markdown.py
+ Line number: 279
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+278	    def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool:
+279	        assert isinstance(child, TableRowElement)
+280	        self.row = child
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/markdown.py
+ Line number: 291
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+290	    def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool:
+291	        assert isinstance(child, TableRowElement)
+292	        self.rows.append(child)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/markdown.py
+ Line number: 303
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+302	    def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool:
+303	        assert isinstance(child, TableDataElement)
+304	        self.cells.append(child)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/markdown.py
+ Line number: 326
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+325	
+326	        assert justify in get_args(JustifyMethod)
+327	        return cls(justify=justify)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/markdown.py
+ Line number: 352
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+351	    def on_child_close(self, context: MarkdownContext, child: MarkdownElement) -> bool:
+352	        assert isinstance(child, ListItem)
+353	        self.items.append(child)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/markdown.py
+ Line number: 623
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+622	                    element = context.stack.pop()
+623	                    assert isinstance(element, Link)
+624	                    link_style = console.get_style("markdown.link", default="none")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/pretty.py
+ Line number: 198
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+197	    console = console or get_console()
+198	    assert console is not None
+199	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/pretty.py
+ Line number: 203
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+202	        if value is not None:
+203	            assert console is not None
+204	            builtins._ = None  # type: ignore[attr-defined]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/pretty.py
+ Line number: 516
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+515	        )
+516	        assert self.node is not None
+517	        return self.node.check_length(start_length, max_length)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/pretty.py
+ Line number: 522
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+521	        node = self.node
+522	        assert node is not None
+523	        whitespace = self.whitespace
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/pretty.py
+ Line number: 524
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+523	        whitespace = self.whitespace
+524	        assert node.children
+525	        if node.key_repr:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/pretty.py
+ Line number: 661
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+660	                    rich_repr_result = obj.__rich_repr__()
+661	            except Exception:
+662	                pass
+663	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/progress.py
+ Line number: 1091
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1090	    ) -> None:
+1091	        assert refresh_per_second > 0, "refresh_per_second must be > 0"
+1092	        self._lock = RLock()
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/rich/progress.py
+ Line number: 1715
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+1714	            time.sleep(0.01)
+1715	            if random.randint(0, 100) < 1:
+1716	                progress.log(next(examples))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/prompt.py
+ Line number: 222
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+221	        """
+222	        assert self.choices is not None
+223	        if self.case_sensitive:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/segment.py
+ Line number: 171
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+170	        text, style, control = self
+171	        assert cut >= 0
+172	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with dumps module.
+ Test ID: B403
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/rich/style.py
+ Line number: 4
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b403-import-pickle
+ +
+
+3	from operator import attrgetter
+4	from pickle import dumps, loads
+5	from random import randint
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/rich/style.py
+ Line number: 198
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+197	        self._link_id = (
+198	            f"{randint(0, 999999)}{hash(self._meta)}" if (link or meta) else ""
+199	        )
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/rich/style.py
+ Line number: 248
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+247	        style._meta = dumps(meta)
+248	        style._link_id = f"{randint(0, 999999)}{hash(style._meta)}"
+249	        style._hash = None
+
+
+ + +
+
+ +
+
+ blacklist: Pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue.
+ Test ID: B301
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/rich/style.py
+ Line number: 471
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b301-pickle
+ +
+
+470	        """Get meta information (can not be changed after construction)."""
+471	        return {} if self._meta is None else cast(Dict[str, Any], loads(self._meta))
+472	
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/rich/style.py
+ Line number: 486
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+485	        style._link = self._link
+486	        style._link_id = f"{randint(0, 999999)}" if self._link else ""
+487	        style._null = False
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/rich/style.py
+ Line number: 638
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+637	        style._link = self._link
+638	        style._link_id = f"{randint(0, 999999)}" if self._link else ""
+639	        style._hash = self._hash
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/rich/style.py
+ Line number: 684
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+683	        style._link = link
+684	        style._link_id = f"{randint(0, 999999)}" if link else ""
+685	        style._hash = None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/syntax.py
+ Line number: 507
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+506	                    """Split tokens to one per line."""
+507	                    assert lexer  # required to make MyPy happy - we know lexer is not None at this point
+508	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/text.py
+ Line number: 907
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+906	        """
+907	        assert len(character) == 1, "Character must be a string of length 1"
+908	        if count:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/text.py
+ Line number: 924
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+923	        """
+924	        assert len(character) == 1, "Character must be a string of length 1"
+925	        if count:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/text.py
+ Line number: 940
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+939	        """
+940	        assert len(character) == 1, "Character must be a string of length 1"
+941	        if count:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/text.py
+ Line number: 1079
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1078	        """
+1079	        assert separator, "separator must not be empty"
+1080	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/traceback.py
+ Line number: 342
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+341	            if not isinstance(suppress_entity, str):
+342	                assert (
+343	                    suppress_entity.__file__ is not None
+344	                ), f"{suppress_entity!r} must be a module with '__file__' attribute"
+345	                path = os.path.dirname(suppress_entity.__file__)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/rich/traceback.py
+ Line number: 798
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+797	            if excluded:
+798	                assert exclude_frames is not None
+799	                yield Text(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 1885
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1884	            if TYPE_CHECKING:
+1885	                assert is_sql_compiler(self.compiled)
+1886	                assert isinstance(self.compiled.compile_state, DMLState)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 1886
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1885	                assert is_sql_compiler(self.compiled)
+1886	                assert isinstance(self.compiled.compile_state, DMLState)
+1887	                assert isinstance(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 1887
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1886	                assert isinstance(self.compiled.compile_state, DMLState)
+1887	                assert isinstance(
+1888	                    self.compiled.compile_state.dml_table, TableClause
+1889	                )
+1890	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 1969
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1968	            if TYPE_CHECKING:
+1969	                assert is_sql_compiler(self.compiled)
+1970	                assert isinstance(self.compiled.compile_state, DMLState)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 1970
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1969	                assert is_sql_compiler(self.compiled)
+1970	                assert isinstance(self.compiled.compile_state, DMLState)
+1971	                assert isinstance(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 1971
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1970	                assert isinstance(self.compiled.compile_state, DMLState)
+1971	                assert isinstance(
+1972	                    self.compiled.compile_state.dml_table, TableClause
+1973	                )
+1974	            conn._cursor_execute(
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 2000
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+1999	                )
+2000	            except Exception:
+2001	                pass
+2002	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 2339
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2338	        else:
+2339	            assert False, "expected Insert, Update or Delete statement"
+2340	
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '['
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 2973
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+2972	            continue
+2973	        if token == "[":
+2974	            bracket = True
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: ']'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 2976
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+2975	            has_brackets = True
+2976	        elif token == "]":
+2977	            bracket = False
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '.'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 2978
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+2977	            bracket = False
+2978	        elif not bracket and token == ".":
+2979	            if has_brackets:
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 3210
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+3209	                (
+3210	                    "SELECT name FROM {} WHERE name IN "
+3211	                    "('dm_exec_sessions', 'dm_pdw_nodes_exec_sessions')"
+3212	                ).format(view_name)
+3213	            )
+3214	            row = cursor.fetchone()
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 3224
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+3223	            cursor.execute(
+3224	                """
+3225	                    SELECT CASE transaction_isolation_level
+3226	                    WHEN 0 THEN NULL
+3227	                    WHEN 1 THEN 'READ UNCOMMITTED'
+3228	                    WHEN 2 THEN 'READ COMMITTED'
+3229	                    WHEN 3 THEN 'REPEATABLE READ'
+3230	                    WHEN 4 THEN 'SERIALIZABLE'
+3231	                    WHEN 5 THEN 'SNAPSHOT' END
+3232	                    AS TRANSACTION_ISOLATION_LEVEL
+3233	                    FROM {}
+3234	                    where session_id = @@SPID
+3235	                """.format(
+3236	                    view_name
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mssql/base.py
+ Line number: 3436
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+3435	            sql.text(
+3436	                f"""
+3437	select
+3438	    ind.index_id,
+3439	    ind.is_unique,
+3440	    ind.name,
+3441	    ind.type,
+3442	    {filter_definition}
+3443	from
+3444	    sys.indexes as ind
+3445	join sys.tables as tab on
+3446	    ind.object_id = tab.object_id
+3447	join sys.schemas as sch on
+3448	    sch.schema_id = tab.schema_id
+3449	where
+3450	    tab.name = :tabname
+3451	    and sch.name = :schname
+3452	    and ind.is_primary_key = 0
+3453	    and ind.type != 0
+3454	order by
+3455	    ind.name
+3456	                """
+3457	            )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/aiomysql.py
+ Line number: 95
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+94	    def ping(self, reconnect: bool) -> None:
+95	        assert not reconnect
+96	        self.await_(self._connection.ping(reconnect))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/asyncmy.py
+ Line number: 94
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+93	    def ping(self, reconnect: bool) -> None:
+94	        assert not reconnect
+95	        return self.await_(self._do_ping())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 1771
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1770	    ) -> str:
+1771	        assert select._for_update_arg is not None
+1772	        if select._for_update_arg.read:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 1836
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1835	        else:
+1836	            assert limit_clause is not None
+1837	            # No offset provided, so just use the limit
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 1911
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+1910	        return (
+1911	            "SELECT %(outer)s FROM (SELECT %(inner)s) "
+1912	            "as _empty_set WHERE 1!=1"
+1913	            % {
+1914	                "inner": ", ".join(
+1915	                    "1 AS _in_%s" % idx
+1916	                    for idx, type_ in enumerate(element_types)
+1917	                ),
+1918	                "outer": ", ".join(
+1919	                    "_in_%s" % idx for idx, type_ in enumerate(element_types)
+1920	                ),
+1921	            }
+1922	        )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 1955
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1954	    ) -> str:
+1955	        assert binary.modifiers is not None
+1956	        flags = binary.modifiers["flags"]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 1989
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1988	    ) -> str:
+1989	        assert binary.modifiers is not None
+1990	        flags = binary.modifiers["flags"]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 3059
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3058	
+3059	        assert schema is not None
+3060	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 3210
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3209	            mdb_version = self._mariadb_normalized_version_info
+3210	            assert mdb_version is not None
+3211	            if mdb_version > (10, 2) and mdb_version < (10, 2, 9):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 3297
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3296	            schema = self.default_schema_name
+3297	        assert schema is not None
+3298	        charset = self._connection_charset
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 3821
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3820	        if full_name is None:
+3821	            assert table is not None
+3822	            full_name = self.identifier_preparer.format_table(table)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/base.py
+ Line number: 3867
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3866	        if full_name is None:
+3867	            assert table is not None
+3868	            full_name = self.identifier_preparer.format_table(table)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/enumerated.py
+ Line number: 96
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+95	        if TYPE_CHECKING:
+96	            assert isinstance(impl, ENUM)
+97	        kw.setdefault("validate_strings", impl.validate_strings)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/enumerated.py
+ Line number: 221
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+220	                        value = super_convert(value)
+221	                        assert value is not None
+222	                    if TYPE_CHECKING:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/enumerated.py
+ Line number: 223
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+222	                    if TYPE_CHECKING:
+223	                        assert isinstance(value, str)
+224	                    return set(re.findall(r"[^,]+", value))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mariadbconnector.py
+ Line number: 109
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+108	        if TYPE_CHECKING:
+109	            assert isinstance(self.compiled, SQLCompiler)
+110	        if self.isinsert and self.compiled.postfetch_lastrowid:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mariadbconnector.py
+ Line number: 115
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+114	        if TYPE_CHECKING:
+115	            assert self._lastrowid is not None
+116	        return self._lastrowid
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mysqlconnector.py
+ Line number: 215
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+214	                opts["client_flags"] = client_flags
+215	            except Exception:
+216	                pass
+217	
+
+
+ + +
+
+ +
+
+ hardcoded_password_funcarg: Possible hardcoded password: 'passwd'
+ Test ID: B106
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/mysqldb.py
+ Line number: 205
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b106_hardcoded_password_funcarg.html
+ +
+
+204	            _translate_args = dict(
+205	                database="db", username="user", password="passwd"
+206	            )
+207	
+208	        opts = url.translate_connect_args(**_translate_args)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/mysql/provision.py
+ Line number: 67
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+66	            _mysql_drop_db(cfg, conn, ident)
+67	        except Exception:
+68	            pass
+69	
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/base.py
+ Line number: 1914
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+1913	        return self._execute_scalar(
+1914	            "SELECT "
+1915	            + self.identifier_preparer.format_sequence(seq)
+1916	            + ".nextval FROM DUAL",
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/base.py
+ Line number: 3264
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3263	                if row_dict["descend"].lower() != "asc":
+3264	                    assert row_dict["descend"].lower() == "desc"
+3265	                    cs = index_dict.setdefault("column_sorting", {})
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/base.py
+ Line number: 3268
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3267	            else:
+3268	                assert row_dict["descend"].lower() == "asc"
+3269	                cn = self.normalize_name(row_dict["column_name"])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/base.py
+ Line number: 3481
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3480	
+3481	            assert constraint_name is not None
+3482	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/base.py
+ Line number: 3633
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3632	
+3633	            assert constraint_name is not None
+3634	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/base.py
+ Line number: 3684
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3683	            if synonyms:
+3684	                assert len(synonyms) == 1
+3685	                row_dict = synonyms[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py
+ Line number: 835
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+834	            out_parameters = self.out_parameters
+835	            assert out_parameters is not None
+836	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py
+ Line number: 854
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+853	
+854	                        assert cx_Oracle is not None
+855	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py
+ Line number: 1026
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1025	        # False.
+1026	        assert not self.compiled.returning
+1027	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py
+ Line number: 1270
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1269	            decimal_char = value.lstrip("0")[1]
+1270	            assert not decimal_char[0].isdigit()
+1271	
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/cx_oracle.py
+ Line number: 1496
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+1495	    def create_xid(self):
+1496	        id_ = random.randint(0, 2**128)
+1497	        return (0x1234, "%032x" % id_, "%032x" % 9)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/provision.py
+ Line number: 171
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+170	def _connect_with_retry(dialect, conn_rec, cargs, cparams):
+171	    assert dialect.driver == "cx_oracle"
+172	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/provision.py
+ Line number: 226
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+225	            sc = dbapi_connection.stmtcachesize
+226	        except:
+227	            # connection closed
+228	            pass
+229	        else:
+
+
+ + +
+
+ +
+
+ hardcoded_password_funcarg: Possible hardcoded password: 'xe'
+ Test ID: B106
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/oracle/provision.py
+ Line number: 270
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b106_hardcoded_password_funcarg.html
+ +
+
+269	    url = sa_url.make_url(url)
+270	    return url.set(username=ident, password="xe")
+271	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py
+ Line number: 633
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+632	    def _buffer_rows(self):
+633	        assert self._cursor is not None
+634	        new_rows = self._adapt_connection.await_(self._cursor.fetch(50))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py
+ Line number: 663
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+662	
+663	        assert self._cursor is not None
+664	        rb = self._rowbuffer
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/asyncpg.py
+ Line number: 1136
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1135	        if multihosts:
+1136	            assert multiports
+1137	            if len(multihosts) == 1:
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/base.py
+ Line number: 2291
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+2290	
+2291	        return "ON CONFLICT %s DO UPDATE SET %s" % (target_text, action_text)
+2292	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/base.py
+ Line number: 3431
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3430	                        if TYPE_CHECKING:
+3431	                            assert isinstance(h, str)
+3432	                            assert isinstance(p, str)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/base.py
+ Line number: 3432
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3431	                            assert isinstance(h, str)
+3432	                            assert isinstance(p, str)
+3433	                        hosts = (h,)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/base.py
+ Line number: 4889
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4888	                        # supported in included columns".
+4889	                        assert all(
+4890	                            not is_expr
+4891	                            for is_expr in all_elements_is_expr[indnkeyatts:]
+4892	                        )
+4893	                        idx_elements_opclass = all_elements_opclass[
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py
+ Line number: 485
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+484	                # this one
+485	                assert self._psycopg_adapters_map
+486	                register_hstore(info, self._psycopg_adapters_map)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/psycopg.py
+ Line number: 489
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+488	                # register the adapter for this connection
+489	                assert connection.connection
+490	                register_hstore(info, connection.connection.driver_connection)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/ranges.py
+ Line number: 653
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+652	
+653	        assert False, f"Unhandled case computing {self} - {other}"
+654	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/types.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+60	        if TYPE_CHECKING:
+61	            assert isinstance(self, TypeEngine)
+62	        return self
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.py
+ Line number: 242
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+241	    def fetchone(self) -> Optional[Any]:
+242	        assert self._cursor is not None
+243	        return self.await_(self._cursor.fetchone())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.py
+ Line number: 246
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+245	    def fetchmany(self, size: Optional[int] = None) -> Sequence[Any]:
+246	        assert self._cursor is not None
+247	        if size is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/aiosqlite.py
+ Line number: 252
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+251	    def fetchall(self) -> Sequence[Any]:
+252	        assert self._cursor is not None
+253	        return self.await_(self._cursor.fetchall())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 1163
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1162	        if truncate_microseconds:
+1163	            assert "storage_format" not in kwargs, (
+1164	                "You can specify only "
+1165	                "one of truncate_microseconds or storage_format."
+1166	            )
+1167	            assert "regexp" not in kwargs, (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 1167
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1166	            )
+1167	            assert "regexp" not in kwargs, (
+1168	                "You can specify only one of "
+1169	                "truncate_microseconds or regexp."
+1170	            )
+1171	            self._storage_format = (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 1357
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1356	        if truncate_microseconds:
+1357	            assert "storage_format" not in kwargs, (
+1358	                "You can specify only "
+1359	                "one of truncate_microseconds or storage_format."
+1360	            )
+1361	            assert "regexp" not in kwargs, (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 1361
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1360	            )
+1361	            assert "regexp" not in kwargs, (
+1362	                "You can specify only one of "
+1363	                "truncate_microseconds or regexp."
+1364	            )
+1365	            self._storage_format = "%(hour)02d:%(minute)02d:%(second)02d"
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 1573
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+1572	    def visit_empty_set_expr(self, element_types, **kw):
+1573	        return "SELECT %s FROM (SELECT %s) WHERE 1!=1" % (
+1574	            ", ".join("1" for type_ in element_types or [INTEGER()]),
+1575	            ", ".join("1" for type_ in element_types or [INTEGER()]),
+1576	        )
+1577	
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 1691
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+1690	
+1691	        return "ON CONFLICT %s DO UPDATE SET %s" % (target_text, action_text)
+1692	
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'NULL'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 2104
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+2103	
+2104	    default_metavalue_token = "NULL"
+2105	    """for INSERT... VALUES (DEFAULT) syntax, the token to put in the
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 2260
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2259	        else:
+2260	            assert False, "Unknown isolation level %s" % value
+2261	
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 2290
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+2289	        query = (
+2290	            f"SELECT name FROM {main} "
+2291	            f"WHERE type='{type_}'{filter_table} "
+2292	            "ORDER BY name"
+2293	        )
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 2358
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+2357	            master = f"{qschema}.sqlite_master"
+2358	            s = ("SELECT sql FROM %s WHERE name = ? AND type='view'") % (
+2359	                master,
+2360	            )
+2361	            rs = connection.exec_driver_sql(s, (view_name,))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 2428
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2427	                )
+2428	                assert match, f"create table not found in {tablesql}"
+2429	                tablesql = match.group(1).strip()
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 2946
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+2945	                s = (
+2946	                    "SELECT sql FROM %(schema)ssqlite_master "
+2947	                    "WHERE name = ? "
+2948	                    "AND type = 'index'" % {"schema": schema_expr}
+2949	                )
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 3012
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+3011	            s = (
+3012	                "SELECT sql FROM "
+3013	                " (SELECT * FROM %(schema)ssqlite_master UNION ALL "
+3014	                "  SELECT * FROM %(schema)ssqlite_temp_master) "
+3015	                "WHERE name = ? "
+3016	                "AND type in ('table', 'view')" % {"schema": schema_expr}
+3017	            )
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/base.py
+ Line number: 3021
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+3020	            s = (
+3021	                "SELECT sql FROM %(schema)ssqlite_master "
+3022	                "WHERE name = ? "
+3023	                "AND type in ('table', 'view')" % {"schema": schema_expr}
+3024	            )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/provision.py
+ Line number: 54
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+53	    if filename and filename != ":memory:":
+54	        assert "test_schema" not in filename
+55	        tokens = re.split(r"[_\.]", filename)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/provision.py
+ Line number: 67
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+66	
+67	        assert name_token, f"sqlite filename has no name token: {url.database}"
+68	
+
+
+ + +
+
+ +
+
+ hardcoded_password_funcarg: Possible hardcoded password: 'test'
+ Test ID: B106
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/provision.py
+ Line number: 78
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b106_hardcoded_password_funcarg.html
+ +
+
+77	    if needs_enc:
+78	        url = url.set(password="test")
+79	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py
+ Line number: 674
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+673	                m = nis.search(sql)
+674	                assert not m, f"Found {nis.pattern!r} in {sql!r}"
+675	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/dialects/sqlite/pysqlite.py
+ Line number: 685
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+684	            if parameters:
+685	                assert isinstance(parameters, tuple)
+686	                return {
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 627
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+626	        dbapi_connection = self.connection.dbapi_connection
+627	        assert dbapi_connection is not None
+628	        try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 746
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+745	            pool_proxied_connection = self._dbapi_connection
+746	            assert pool_proxied_connection is not None
+747	            pool_proxied_connection.invalidate(exception)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 1190
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1189	
+1190	        assert isinstance(self._transaction, TwoPhaseTransaction)
+1191	        try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 1201
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1200	        if self._still_open_and_dbapi_connection_is_valid:
+1201	            assert isinstance(self._transaction, TwoPhaseTransaction)
+1202	            try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 1213
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1212	
+1213	        assert isinstance(self._transaction, TwoPhaseTransaction)
+1214	        try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2362
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2361	            elif should_wrap:
+2362	                assert sqlalchemy_exception is not None
+2363	                raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2365
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2364	            else:
+2365	                assert exc_info[1] is not None
+2366	                raise exc_info[1].with_traceback(exc_info[2])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2373
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2372	                    dbapi_conn_wrapper = self._dbapi_connection
+2373	                    assert dbapi_conn_wrapper is not None
+2374	                    if invalidate_pool_on_disconnect:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2447
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2446	        elif should_wrap:
+2447	            assert sqlalchemy_exception is not None
+2448	            raise sqlalchemy_exception.with_traceback(exc_info[2]) from e
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2450
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2449	        else:
+2450	            assert exc_info[1] is not None
+2451	            raise exc_info[1].with_traceback(exc_info[2])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2599
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2598	        finally:
+2599	            assert not self.is_active
+2600	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2621
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2620	        finally:
+2621	            assert not self.is_active
+2622	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2642
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2641	        finally:
+2642	            assert not self.is_active
+2643	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2688
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2687	    def __init__(self, connection: Connection):
+2688	        assert connection._transaction is None
+2689	        if connection._trans_context_manager:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2699
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2698	        if self.is_active:
+2699	            assert self.connection._transaction is self
+2700	            self.is_active = False
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2731
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2730	
+2731	        assert not self.is_active
+2732	        assert self.connection._transaction is not self
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2732
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2731	        assert not self.is_active
+2732	        assert self.connection._transaction is not self
+2733	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2742
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2741	        if self.is_active:
+2742	            assert self.connection._transaction is self
+2743	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2765
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2764	
+2765	        assert not self.is_active
+2766	        assert self.connection._transaction is not self
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2766
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2765	        assert not self.is_active
+2766	        assert self.connection._transaction is not self
+2767	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2806
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2805	    def __init__(self, connection: Connection):
+2806	        assert connection._transaction is not None
+2807	        if connection._trans_context_manager:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2852
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2851	
+2852	        assert not self.is_active
+2853	        if deactivate_from_connection:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/base.py
+ Line number: 2854
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2853	        if deactivate_from_connection:
+2854	            assert self.connection._nested_transaction is not self
+2855	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/create.py
+ Line number: 744
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+743	            ) -> None:
+744	                assert do_on_connect is not None
+745	                do_on_connect(dbapi_connection)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py
+ Line number: 218
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+217	    def _remove_processors(self) -> CursorResultMetaData:
+218	        assert not self._tuplefilter
+219	        return self._make_new_metadata(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py
+ Line number: 236
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+235	    ) -> CursorResultMetaData:
+236	        assert not self._tuplefilter
+237	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py
+ Line number: 313
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+312	        if TYPE_CHECKING:
+313	            assert isinstance(invoked_statement, elements.ClauseElement)
+314	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py
+ Line number: 318
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+317	
+318	        assert invoked_statement is not None
+319	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py
+ Line number: 338
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+337	
+338	        assert not self._tuplefilter
+339	        return self._make_new_metadata(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py
+ Line number: 874
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+873	            x = self._key_fallback(key, ke, raiseerr)
+874	            assert x is None
+875	            return None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py
+ Line number: 1112
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1111	        # we only expect to have a _NoResultMetaData() here right now.
+1112	        assert not result._metadata.returns_rows
+1113	        result._metadata._we_dont_return_rows(err)  # type: ignore[union-attr]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py
+ Line number: 1384
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1383	        else:
+1384	            assert dbapi_cursor is not None
+1385	            self._rowbuffer = collections.deque(dbapi_cursor.fetchall())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/cursor.py
+ Line number: 1589
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1588	        else:
+1589	            assert context._num_sentinel_cols == 0
+1590	            self._metadata = self._no_result_metadata
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'DEFAULT'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 226
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+225	
+226	    default_metavalue_token = "DEFAULT"
+227	    """for INSERT... VALUES (DEFAULT) syntax, the token to put in the
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 765
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+764	
+765	        return "_sa_%032x" % random.randint(0, 2**128)
+766	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 797
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+796	        imv = compiled._insertmanyvalues
+797	        assert imv is not None
+798	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 848
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+847	                # would have assured this but pylance thinks not
+848	                assert result is not None
+849	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 855
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+854	                        # integer autoincrement, do a simple sort.
+855	                        assert not composite_sentinel
+856	                        result.extend(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 863
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+862	                    # with parameters
+863	                    assert imv.sentinel_param_keys
+864	                    assert imv.sentinel_columns
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 864
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+863	                    assert imv.sentinel_param_keys
+864	                    assert imv.sentinel_columns
+865	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1006
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1005	        if self._on_connect_isolation_level is not None:
+1006	            assert (
+1007	                self._on_connect_isolation_level == "AUTOCOMMIT"
+1008	                or self._on_connect_isolation_level
+1009	                == self.default_isolation_level
+1010	            )
+1011	            self._assert_and_set_isolation_level(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1015
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1014	        else:
+1015	            assert self.default_isolation_level is not None
+1016	            self._assert_and_set_isolation_level(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1355
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1354	            if TYPE_CHECKING:
+1355	                assert isinstance(dml_statement, UpdateBase)
+1356	            self.is_crud = True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1365
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1364	            # dont mix implicit and explicit returning
+1365	            assert not (iir and ier)
+1366	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1492
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1491	            core_positional_parameters: MutableSequence[Sequence[Any]] = []
+1492	            assert positiontup is not None
+1493	            for compiled_params in self.compiled_parameters:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1614
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1613	        gen_time = self.compiled._gen_time
+1614	        assert gen_time is not None
+1615	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1664
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1663	        if TYPE_CHECKING:
+1664	            assert isinstance(self.compiled, SQLCompiler)
+1665	        return self.compiled.postfetch
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1670
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1669	        if TYPE_CHECKING:
+1670	            assert isinstance(self.compiled, SQLCompiler)
+1671	        if self.isinsert:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1965
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1964	        elif self._num_sentinel_cols:
+1965	            assert self.execute_style is ExecuteStyle.INSERTMANYVALUES
+1966	            # strip out the sentinel columns from cursor description
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 1990
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1989	                # support is added here.
+1990	                assert result._metadata.returns_rows
+1991	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 2022
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2021	            # the rows have all been fetched however.
+2022	            assert result._metadata.returns_rows
+2023	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 2301
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2300	        else:
+2301	            assert column is not None
+2302	            assert parameters is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 2302
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2301	            assert column is not None
+2302	            assert parameters is not None
+2303	        compile_state = cast(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 2306
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2305	        )
+2306	        assert compile_state is not None
+2307	        if (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/default.py
+ Line number: 2318
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2317	                index = 0
+2318	            assert compile_state._dict_parameters is not None
+2319	            keys = compile_state._dict_parameters.keys()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/reflection.py
+ Line number: 1672
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1671	            default_text = col_d["default"]
+1672	            assert default_text is not None
+1673	            if isinstance(default_text, TextClause):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py
+ Line number: 149
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+148	    ) -> Optional[NoReturn]:
+149	        assert raiseerr
+150	        raise KeyError(key) from err
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py
+ Line number: 551
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+550	        make_row = self._row_getter
+551	        assert make_row is not None
+552	        rows = self._fetchall_impl()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py
+ Line number: 691
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+690	                        num = len(rows)
+691	                        assert make_row is not None
+692	                        collect.extend(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py
+ Line number: 699
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+698	
+699	                assert num is not None
+700	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py
+ Line number: 808
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+807	                        if strategy:
+808	                            assert next_row is not _NO_ROW
+809	                            if existing_row_hash == strategy(next_row):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py
+ Line number: 867
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+866	
+867	        assert self._generate_rows
+868	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/result.py
+ Line number: 873
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+872	    def _unique_strategy(self) -> _UniqueFilterStateType:
+873	        assert self._unique_filter_state is not None
+874	        uniques, strategy = self._unique_filter_state
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/util.py
+ Line number: 152
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+151	                if not out_of_band_exit:
+152	                    assert subject is not None
+153	                    subject._trans_context_manager = self._outer_trans_ctx
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/engine/util.py
+ Line number: 165
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+164	                if not out_of_band_exit:
+165	                    assert subject is not None
+166	                    subject._trans_context_manager = self._outer_trans_ctx
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/attr.py
+ Line number: 182
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+181	        target = event_key.dispatch_target
+182	        assert isinstance(
+183	            target, type
+184	        ), "Class-level Event targets must be classes."
+185	        if not getattr(target, "_sa_propagate_class_events", True):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/attr.py
+ Line number: 345
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+344	
+345	        assert obj._instance_cls is not None
+346	        existing = getattr(obj, self.name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/attr.py
+ Line number: 355
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+354	                # with freethreaded.
+355	                assert isinstance(existing, _ListenerCollection)
+356	                return existing
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/base.py
+ Line number: 146
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+145	        if instance_cls:
+146	            assert parent is not None
+147	            try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/base.py
+ Line number: 194
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+193	        """
+194	        assert "_joined_dispatch_cls" in self.__class__.__dict__
+195	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/base.py
+ Line number: 317
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+316	            dispatch_target_cls = cls._dispatch_target
+317	            assert dispatch_target_cls is not None
+318	            if (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/legacy.py
+ Line number: 102
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+101	            if conv is not None:
+102	                assert not has_kw
+103	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/legacy.py
+ Line number: 106
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+105	                    util.warn_deprecated(warning_txt, version=since)
+106	                    assert conv is not None
+107	                    return fn(*conv(*args))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/legacy.py
+ Line number: 234
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+233	    if getattr(fn, "_omit_standard_example", False):
+234	        assert fn.__doc__
+235	        return fn.__doc__
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/event/registry.py
+ Line number: 193
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+192	        if newowner_ref in dispatch_reg:
+193	            assert dispatch_reg[newowner_ref] == listen_ref
+194	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/associationproxy.py
+ Line number: 453
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+452	
+453	        assert instance is None
+454	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/associationproxy.py
+ Line number: 735
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+734	        attr = getattr(target_class, value_attr)
+735	        assert not isinstance(attr, AssociationProxy)
+736	        if isinstance(attr, AssociationProxyInstance):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/associationproxy.py
+ Line number: 900
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+899	                if id(obj) == creator_id and id(self) == self_id:
+900	                    assert self.collection_class is not None
+901	                    return proxy
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/associationproxy.py
+ Line number: 933
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+932	            proxy = self.get(obj)
+933	            assert self.collection_class is not None
+934	            if proxy is not values:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py
+ Line number: 332
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+331	        """Begin a transaction prior to autobegin occurring."""
+332	        assert self._proxied
+333	        return AsyncTransaction(self)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py
+ Line number: 337
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+336	        """Begin a nested transaction and return a transaction handle."""
+337	        assert self._proxied
+338	        return AsyncTransaction(self, nested=True)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py
+ Line number: 443
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+442	        c2 = await greenlet_spawn(conn.execution_options, **opt)
+443	        assert c2 is conn
+444	        return self
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py
+ Line number: 593
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+592	        )
+593	        assert result.context._is_server_side
+594	        ar = AsyncResult(result)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/asyncio/engine.py
+ Line number: 1360
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1359	        )
+1360	        assert async_connection is not None
+1361	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/automap.py
+ Line number: 1232
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1231	        else:
+1232	            assert False, "Can't locate automap base in class hierarchy"
+1233	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/automap.py
+ Line number: 1257
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1256	        if reflect:
+1257	            assert autoload_with
+1258	            opts = dict(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/automap.py
+ Line number: 1294
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1293	                if lcl_m2m is not None:
+1294	                    assert rem_m2m is not None
+1295	                    assert m2m_const is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/automap.py
+ Line number: 1295
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1294	                    assert rem_m2m is not None
+1295	                    assert m2m_const is not None
+1296	                    many_to_many.append((lcl_m2m, rem_m2m, m2m_const, table))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/automap.py
+ Line number: 1330
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1329	                    )
+1330	                    assert map_config.cls.__name__ == newname
+1331	                    if new_module is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/automap.py
+ Line number: 1345
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1344	                        # see test_cls_schema_name_conflict
+1345	                        assert isinstance(props, Properties)
+1346	                        by_module_properties = props
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/baked.py
+ Line number: 204
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+203	                else:
+204	                    assert not ck[1], (
+205	                        "loader options with variable bound parameters "
+206	                        "not supported with baked queries.  Please "
+207	                        "use new-style select() statements for cached "
+208	                        "ORM queries."
+209	                    )
+210	                    key += ck[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/horizontal_shard.py
+ Line number: 113
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+112	        super().__init__(*args, **kwargs)
+113	        assert isinstance(self.session, ShardedSession)
+114	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/horizontal_shard.py
+ Line number: 310
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+309	                token = state.key[2]
+310	                assert token is not None
+311	                return token
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/horizontal_shard.py
+ Line number: 315
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+314	
+315	        assert isinstance(mapper, Mapper)
+316	        shard_id = self.shard_chooser(mapper, instance, **kw)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/horizontal_shard.py
+ Line number: 338
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+337	            trans = self.get_transaction()
+338	            assert trans is not None
+339	            return trans.connection(mapper, shard_id=shard_id)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/horizontal_shard.py
+ Line number: 348
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+347	            else:
+348	                assert isinstance(bind, Connection)
+349	                return bind
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/horizontal_shard.py
+ Line number: 364
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+363	            )
+364	            assert shard_id is not None
+365	        return self.__shards[shard_id]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/horizontal_shard.py
+ Line number: 443
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+442	    session = orm_context.session
+443	    assert isinstance(session, ShardedSession)
+444	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/hybrid.py
+ Line number: 1471
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1470	            if TYPE_CHECKING:
+1471	                assert isinstance(expr, ColumnElement)
+1472	            ret_expr = expr
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/hybrid.py
+ Line number: 1478
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1477	            # true
+1478	            assert isinstance(ret_expr, ColumnElement)
+1479	        return ret_expr
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mutable.py
+ Line number: 525
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+524	                    val = cls.coerce(key, val)
+525	                    assert val is not None
+526	                    state.dict[key] = val
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/apply.py
+ Line number: 79
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+78	    left_hand_explicit_type = get_proper_type(stmt.type)
+79	    assert isinstance(
+80	        left_hand_explicit_type, (Instance, UnionType, UnboundType)
+81	    )
+82	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/apply.py
+ Line number: 174
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+173	            ):
+174	                assert python_type_for_type is not None
+175	                left_node.type = api.named_type(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/apply.py
+ Line number: 213
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+212	    left_node = lvalue.node
+213	    assert isinstance(left_node, Var)
+214	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/apply.py
+ Line number: 316
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+315	    if sym:
+316	        assert isinstance(sym.node, TypeInfo)
+317	        type_: ProperType = Instance(sym.node, [])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/decl_class.py
+ Line number: 191
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+190	    if left_hand_explicit_type is not None:
+191	        assert value.node is not None
+192	        attributes.append(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/decl_class.py
+ Line number: 378
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+377	    # hook.
+378	    assert sym is not None
+379	    node = sym.node
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/decl_class.py
+ Line number: 384
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+383	
+384	    assert node is lvalue.node
+385	    assert isinstance(node, Var)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/decl_class.py
+ Line number: 385
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+384	    assert node is lvalue.node
+385	    assert isinstance(node, Var)
+386	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/decl_class.py
+ Line number: 468
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+467	
+468	    assert python_type_for_type is not None
+469	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 110
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+109	
+110	    assert isinstance(stmt.rvalue, CallExpr)
+111	    target_cls_arg = stmt.rvalue.args[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 230
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+229	        if type_is_a_collection:
+230	            assert isinstance(left_hand_explicit_type, Instance)
+231	            assert isinstance(python_type_for_type, Instance)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 231
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+230	            assert isinstance(left_hand_explicit_type, Instance)
+231	            assert isinstance(python_type_for_type, Instance)
+232	            return _infer_collection_type_from_left_and_inferred_right(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 254
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+253	
+254	    assert isinstance(stmt.rvalue, CallExpr)
+255	    target_cls_arg = stmt.rvalue.args[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 290
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+289	    """
+290	    assert isinstance(stmt.rvalue, CallExpr)
+291	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 322
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+321	    """
+322	    assert isinstance(stmt.rvalue, CallExpr)
+323	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 397
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+396	    """
+397	    assert isinstance(node, Var)
+398	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 431
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+430	        else:
+431	            assert False
+432	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 516
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+515	
+516	    assert isinstance(left_hand_arg, (Instance, UnionType))
+517	    assert isinstance(python_type_arg, (Instance, UnionType))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 517
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+516	    assert isinstance(left_hand_arg, (Instance, UnionType))
+517	    assert isinstance(python_type_arg, (Instance, UnionType))
+518	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 575
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+574	
+575	    assert node.has_base("sqlalchemy.sql.type_api.TypeEngine"), (
+576	        "could not extract Python type from node: %s" % node
+577	    )
+578	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/infer.py
+ Line number: 583
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+582	
+583	    assert type_engine_sym is not None and isinstance(
+584	        type_engine_sym.node, TypeInfo
+585	    )
+586	    type_engine = map_instance_to_supertype(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/plugin.py
+ Line number: 235
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+234	    _add_globals(ctx)
+235	    assert isinstance(ctx.reason, nodes.MemberExpr)
+236	    expr = ctx.reason.expr
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/plugin.py
+ Line number: 238
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+237	
+238	    assert isinstance(expr, nodes.RefExpr) and isinstance(expr.node, nodes.Var)
+239	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/plugin.py
+ Line number: 242
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+241	
+242	    assert (
+243	        isinstance(node_type, Instance)
+244	        and names.type_id_for_named_node(node_type.type) is names.REGISTRY
+245	    )
+246	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/plugin.py
+ Line number: 302
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+301	    )
+302	    assert sym is not None and isinstance(sym.node, TypeInfo)
+303	    info.declared_metaclass = info.metaclass_type = Instance(sym.node, [])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/util.py
+ Line number: 78
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+77	    def serialize(self) -> JsonDict:
+78	        assert self.type
+79	        return {
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/util.py
+ Line number: 335
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+334	            return None
+335	        assert sym and isinstance(sym.node, TypeInfo)
+336	        return sym.node
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/mypy/util.py
+ Line number: 344
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+343	        return typ.serialize()
+344	    except Exception:
+345	        pass
+346	    if hasattr(typ, "args"):
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with pickle module.
+ Test ID: B403
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/serializer.py
+ Line number: 72
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b403-import-pickle
+ +
+
+71	from io import BytesIO
+72	import pickle
+73	import re
+
+
+ + +
+
+ +
+
+ blacklist: Pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue.
+ Test ID: B301
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/serializer.py
+ Line number: 150
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b301-pickle
+ +
+
+149	                key, clsarg = args.split(":")
+150	                cls = pickle.loads(b64decode(clsarg))
+151	                return getattr(cls, key)
+
+
+ + +
+
+ +
+
+ blacklist: Pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue.
+ Test ID: B301
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/serializer.py
+ Line number: 153
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b301-pickle
+ +
+
+152	            elif type_ == "mapper":
+153	                cls = pickle.loads(b64decode(args))
+154	                return class_mapper(cls)
+
+
+ + +
+
+ +
+
+ blacklist: Pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue.
+ Test ID: B301
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/serializer.py
+ Line number: 156
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b301-pickle
+ +
+
+155	            elif type_ == "mapper_selectable":
+156	                cls = pickle.loads(b64decode(args))
+157	                return class_mapper(cls).__clause_element__()
+
+
+ + +
+
+ +
+
+ blacklist: Pickle and modules that wrap it can be unsafe when used to deserialize untrusted data, possible security issue.
+ Test ID: B301
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/ext/serializer.py
+ Line number: 160
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b301-pickle
+ +
+
+159	                mapper, keyname = args.split(":")
+160	                cls = pickle.loads(b64decode(mapper))
+161	                return class_mapper(cls).attrs[keyname]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 218
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+217	
+218	        assert comparator is not None
+219	        self.comparator = comparator
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 336
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+335	        entity_namespace = self._entity_namespace
+336	        assert isinstance(entity_namespace, HasCacheKey)
+337	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 350
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+349	            if TYPE_CHECKING:
+350	                assert isinstance(ce, ColumnElement)
+351	            anno = ce._annotate
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 395
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+394	    def adapt_to_entity(self, adapt_to_entity: AliasedInsp[Any]) -> Self:
+395	        assert not self._of_type
+396	        return self.__class__(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 419
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+418	        if TYPE_CHECKING:
+419	            assert isinstance(self.comparator, RelationshipProperty.Comparator)
+420	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 975
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+974	        msg = "This AttributeImpl is not configured to track parents."
+975	        assert self.trackparent, msg
+976	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 993
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+992	        msg = "This AttributeImpl is not configured to track parents."
+993	        assert self.trackparent, msg
+994	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 1060
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1059	
+1060	        assert self.key not in dict_, (
+1061	            "_default_value should only be invoked for an "
+1062	            "uninitialized or expired attribute"
+1063	        )
+1064	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 1704
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1703	                # pending mutations
+1704	                assert self.key not in state._pending_mutations
+1705	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 1835
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1834	
+1835	        assert self.key not in dict_, (
+1836	            "_default_value should only be invoked for an "
+1837	            "uninitialized or expired attribute"
+1838	        )
+1839	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 1873
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1872	            )
+1873	            assert (
+1874	                self.key not in dict_
+1875	            ), "Collection was loaded during event handling."
+1876	            state._get_pending_mutation(self.key).append(value)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 1879
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1878	            if TYPE_CHECKING:
+1879	                assert isinstance(collection, CollectionAdapter)
+1880	            collection.append_with_event(value, initiator)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 1895
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1894	            self.fire_remove_event(state, dict_, value, initiator, key=NO_KEY)
+1895	            assert (
+1896	                self.key not in dict_
+1897	            ), "Collection was loaded during event handling."
+1898	            state._get_pending_mutation(self.key).remove(value)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 1901
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1900	            if TYPE_CHECKING:
+1901	                assert isinstance(collection, CollectionAdapter)
+1902	            collection.remove_with_event(value, initiator)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py
+ Line number: 2704
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2703	    if TYPE_CHECKING:
+2704	        assert isinstance(attr, HasCollectionAdapter)
+2705	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/base.py
+ Line number: 443
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+442	    else:
+443	        assert isinstance(class_or_mapper, type)
+444	        raise exc.UnmappedClassError(class_or_mapper)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 236
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+235	            elif result.returns_rows:
+236	                assert bookkeeping
+237	                return_result = return_result.splice_horizontally(result)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 250
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+249	    if use_orm_insert_stmt is not None:
+250	        assert return_result is not None
+251	        return return_result
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 480
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+479	    def _get_crud_kv_pairs(cls, statement, kv_iterator, needs_to_be_cacheable):
+480	        assert (
+481	            needs_to_be_cacheable
+482	        ), "no test coverage for needs_to_be_cacheable=False"
+483	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 705
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+704	        except KeyError:
+705	            assert False, "statement had 'orm' plugin but no plugin_subject"
+706	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 1199
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1198	        except KeyError:
+1199	            assert False, "statement had 'orm' plugin but no plugin_subject"
+1200	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 1290
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1289	
+1290	            assert mapper is not None
+1291	            assert session._transaction is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 1291
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1290	            assert mapper is not None
+1291	            assert session._transaction is not None
+1292	            result = _bulk_insert(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 1623
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1622	
+1623	            assert update_options._synchronize_session != "fetch"
+1624	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 1637
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1636	            mapper = update_options._subject_mapper
+1637	            assert mapper is not None
+1638	            assert session._transaction is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/bulk_persistence.py
+ Line number: 1638
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1637	            assert mapper is not None
+1638	            assert session._transaction is not None
+1639	            result = _bulk_update(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/clsregistry.py
+ Line number: 348
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+347	                else:
+348	                    assert isinstance(value, _MultipleClassMarker)
+349	                    return value.attempt_get(self.__parent.path, key)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/clsregistry.py
+ Line number: 375
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+374	            if desc.extension_type is interfaces.NotExtension.NOT_EXTENSION:
+375	                assert isinstance(desc, attributes.QueryableAttribute)
+376	                prop = desc.property
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/clsregistry.py
+ Line number: 452
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+451	        decl_base = manager.registry
+452	        assert decl_base is not None
+453	        decl_class_registry = decl_base._class_registry
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/clsregistry.py
+ Line number: 528
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+527	                if TYPE_CHECKING:
+528	                    assert isinstance(rval, (type, Table, _ModNS))
+529	                return rval
+
+
+ + +
+
+ +
+
+ blacklist: Use of possibly insecure function - consider using safer ast.literal_eval.
+ Test ID: B307
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/clsregistry.py
+ Line number: 533
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b307-eval
+ +
+
+532	        try:
+533	            x = eval(self.arg, globals(), self._dict)
+534	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/collections.py
+ Line number: 548
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+547	    def _set_empty(self, user_data):
+548	        assert (
+549	            not self.empty
+550	        ), "This collection adapter is already in the 'empty' state"
+551	        self.empty = True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/collections.py
+ Line number: 555
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+554	    def _reset_empty(self) -> None:
+555	        assert (
+556	            self.empty
+557	        ), "This collection adapter is not in the 'empty' state"
+558	        self.empty = False
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/collections.py
+ Line number: 799
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+798	
+799	    assert isinstance(values, list)
+800	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/collections.py
+ Line number: 908
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+907	                role = method._sa_instrument_role
+908	                assert role in (
+909	                    "appender",
+910	                    "remover",
+911	                    "iterator",
+912	                    "converter",
+913	                )
+914	                roles.setdefault(role, name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/collections.py
+ Line number: 923
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+922	                op, argument = method._sa_instrument_before
+923	                assert op in ("fire_append_event", "fire_remove_event")
+924	                before = op, argument
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/collections.py
+ Line number: 927
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+926	                op = method._sa_instrument_after
+927	                assert op in ("fire_append_event", "fire_remove_event")
+928	                after = op
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/collections.py
+ Line number: 945
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+944	    if collection_type in __interfaces:
+945	        assert collection_type is not None
+946	        canned_roles, decorators = __interfaces[collection_type]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 235
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+234	            self.global_attributes = {}
+235	            assert toplevel
+236	            return
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 571
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+570	        except KeyError:
+571	            assert False, "statement had 'orm' plugin but no plugin_subject"
+572	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 783
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+782	
+783	        assert isinstance(statement_container, FromStatement)
+784	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 1374
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1373	            if self.compile_options._only_load_props:
+1374	                assert False, "no columns were included in _only_load_props"
+1375	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 1491
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1490	
+1491	        assert self.compile_options._set_base_alias
+1492	        assert len(query._from_obj) == 1
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 1492
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1491	        assert self.compile_options._set_base_alias
+1492	        assert len(query._from_obj) == 1
+1493	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 1518
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1517	            equivs = self._all_equivs()
+1518	            assert info is info.selectable
+1519	            return ORMStatementAdapter(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 1952
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1951	            # entities
+1952	            assert prop is None
+1953	            (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 2013
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2012	                # might be distinct
+2013	                assert isinstance(
+2014	                    entities_collection[use_entity_index], _MapperEntity
+2015	                )
+2016	                left_clause = entities_collection[use_entity_index].selectable
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 2342
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2341	            # a warning has been emitted.
+2342	            assert right_mapper
+2343	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/context.py
+ Line number: 3285
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3284	            if column is None:
+3285	                assert compile_state.is_dml_returning
+3286	                self._fetch_column = self.column
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_api.py
+ Line number: 299
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+298	        # assert that we are in fact in the declarative scan
+299	        assert declarative_scan is not None
+300	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_api.py
+ Line number: 1309
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1308	                if res_after_fallback is not None:
+1309	                    assert kind is not None
+1310	                    if kind == "pep-695 type":
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_api.py
+ Line number: 1425
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1424	            )
+1425	        assert manager.registry is None
+1426	        manager.registry = self
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 203
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+202	    # make sure we've moved it out.  transitional
+203	    assert attrname != "__abstract__"
+204	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 880
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+879	                        # _include_dunders
+880	                        assert False
+881	                elif class_mapped:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 910
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+909	                        # pylance, no luck
+910	                        assert obj is not None
+911	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 990
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+989	                        if not fixed_table:
+990	                            assert (
+991	                                name in collected_attributes
+992	                                or attribute_is_overridden(name, None)
+993	                            )
+994	                        continue
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 1012
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1011	
+1012	                    assert not attribute_is_overridden(name, obj)
+1013	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 1095
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1094	        manager = instrumentation.manager_of_class(self.cls)
+1095	        assert manager is not None
+1096	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 1165
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1164	            else:
+1165	                assert False
+1166	            annotations[name] = tp
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 1590
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1589	                        # by util._extract_mapped_subtype before we got here.
+1590	                        assert expect_annotations_wo_mapped
+1591	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 1689
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1688	                # ensure every column we get here has been named
+1689	                assert c.name is not None
+1690	                name_to_prop_key[c.name].add(key)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 1846
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1845	            inherited_mapper_or_config = _declared_mapping_info(self.inherits)
+1846	            assert inherited_mapper_or_config is not None
+1847	            inherited_table = inherited_mapper_or_config.local_table
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 1870
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1869	                for col in declared_columns:
+1870	                    assert inherited_table is not None
+1871	                    if col.name in inherited_table.c:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/decl_base.py
+ Line number: 1889
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1888	                    if TYPE_CHECKING:
+1889	                        assert isinstance(inherited_table, Table)
+1890	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/dependency.py
+ Line number: 136
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+135	            # this method a bit more.
+136	            assert child_deletes not in uow.cycles
+137	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/dependency.py
+ Line number: 916
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+915	    def process_deletes(self, uowcommit, states):
+916	        assert False
+917	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/dependency.py
+ Line number: 923
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+922	        # statements being emitted
+923	        assert self.passive_updates
+924	        self._process_key_switches(states, uowcommit)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/descriptor_props.py
+ Line number: 856
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+855	            if self._adapt_to_entity:
+856	                assert self.adapter is not None
+857	                comparisons = [self.adapter(x) for x in comparisons]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/descriptor_props.py
+ Line number: 910
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+909	                break
+910	        assert comparator_callable is not None
+911	        return comparator_callable(p, mapper)  # type: ignore
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/exc.py
+ Line number: 195
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+194	        else:
+195	            assert applies_to is not None
+196	            sa_exc.InvalidRequestError.__init__(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/identity.py
+ Line number: 151
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+150	            if TYPE_CHECKING:
+151	                assert state.key is not None
+152	            try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/identity.py
+ Line number: 162
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+161	    ) -> Optional[InstanceState[Any]]:
+162	        assert state.key is not None
+163	        if state.key in self._dict:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/identity.py
+ Line number: 183
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+182	        key = state.key
+183	        assert key is not None
+184	        # inline of self.__contains__
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/identity.py
+ Line number: 241
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+240	            key = state.key
+241	            assert key is not None
+242	            if value is not None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/identity.py
+ Line number: 266
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+265	        key = state.key
+266	        assert key is not None
+267	        try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/identity.py
+ Line number: 282
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+281	        if key in self._dict:
+282	            assert key is not None
+283	            try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/instrumentation.py
+ Line number: 214
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+213	        if init_method:
+214	            assert not self._finalized, (
+215	                "class is already instrumented, "
+216	                "init_method %s can't be applied" % init_method
+217	            )
+218	            self.init_method = init_method
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/instrumentation.py
+ Line number: 483
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+482	        impl = self.get_impl(key)
+483	        assert _is_collection_attribute_impl(impl)
+484	        adapter = collections.CollectionAdapter(impl, state, user_data)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/instrumentation.py
+ Line number: 613
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+612	    def create_manager_for_cls(self, class_: Type[_O]) -> ClassManager[_O]:
+613	        assert class_ is not None
+614	        assert opt_manager_of_class(class_) is None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/instrumentation.py
+ Line number: 614
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+613	        assert class_ is not None
+614	        assert opt_manager_of_class(class_) is None
+615	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/instrumentation.py
+ Line number: 624
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+623	        else:
+624	            assert manager is not None
+625	
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/instrumentation.py
+ Line number: 744
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+743	    env["__name__"] = __name__
+744	    exec(func_text, env)
+745	    __init__ = env["__init__"]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/interfaces.py
+ Line number: 296
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+295	
+296	            assert False, "Mapped[] received without a mapping declaration"
+297	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/interfaces.py
+ Line number: 1148
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1147	                if TYPE_CHECKING:
+1148	                    assert issubclass(prop_cls, MapperProperty)
+1149	                strategies = cls._all_strategies[prop_cls]
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py
+ Line number: 148
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+147	                        return hash(obj)
+148	                    except:
+149	                        pass
+150	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py
+ Line number: 172
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+171	                        return hash(obj)
+172	                    except:
+173	                        pass
+174	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py
+ Line number: 548
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+547	
+548	    assert not q._is_lambda_element
+549	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py
+ Line number: 1012
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1011	            # loading does not apply
+1012	            assert only_load_props is None
+1013	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1241
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1240	                        except sa_exc.NoForeignKeysError as nfe:
+1241	                            assert self.inherits.local_table is not None
+1242	                            assert self.local_table is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1242
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1241	                            assert self.inherits.local_table is not None
+1242	                            assert self.local_table is not None
+1243	                            raise sa_exc.NoForeignKeysError(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1261
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1260	                        except sa_exc.AmbiguousForeignKeysError as afe:
+1261	                            assert self.inherits.local_table is not None
+1262	                            assert self.local_table is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1262
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1261	                            assert self.inherits.local_table is not None
+1262	                            assert self.local_table is not None
+1263	                            raise sa_exc.AmbiguousForeignKeysError(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1276
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1275	                            ) from afe
+1276	                    assert self.inherits.persist_selectable is not None
+1277	                    self.persist_selectable = sql.join(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1377
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1376	            self.base_mapper = self
+1377	            assert self.local_table is not None
+1378	            self.persist_selectable = self.local_table
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1433
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1432	        elif self.with_polymorphic[0] != "*":
+1433	            assert isinstance(self.with_polymorphic[0], tuple)
+1434	            self._set_with_polymorphic(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1443
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1442	
+1443	        assert self.concrete
+1444	        assert not self.inherits
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1444
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1443	        assert self.concrete
+1444	        assert not self.inherits
+1445	        assert isinstance(mapper, Mapper)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1445
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1444	        assert not self.inherits
+1445	        assert isinstance(mapper, Mapper)
+1446	        self.inherits = mapper
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1495
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1494	
+1495	            assert manager.registry is not None
+1496	            self.registry = manager.registry
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 1530
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1529	
+1530	        assert manager.registry is not None
+1531	        self.registry = manager.registry
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 2318
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2317	        if incoming_prop is None:
+2318	            assert single_column is not None
+2319	            incoming_column = single_column
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 2322
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2321	        else:
+2322	            assert single_column is None
+2323	            incoming_column = incoming_prop.columns[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 2457
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2456	        )
+2457	        assert isinstance(prop, MapperProperty)
+2458	        self._init_properties[key] = prop
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: 'True'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 2902
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+2901	                    "parentmapper": self,
+2902	                    "identity_token": True,
+2903	                }
+2904	            )
+2905	            ._set_propagate_attrs(
+2906	                {"compile_state_plugin": "orm", "plugin_subject": self}
+2907	            )
+2908	        )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 3700
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3699	            if start and not mapper.single:
+3700	                assert mapper.inherits
+3701	                assert not mapper.concrete
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 3701
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3700	                assert mapper.inherits
+3701	                assert not mapper.concrete
+3702	                assert mapper.inherit_condition is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 3702
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3701	                assert not mapper.concrete
+3702	                assert mapper.inherit_condition is not None
+3703	                allconds.append(mapper.inherit_condition)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 3790
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3789	        # mappers or other objects.
+3790	        assert self.isa(super_mapper)
+3791	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 3834
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3833	
+3834	        assert self.inherits
+3835	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 3902
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3901	        if entity.is_aliased_class:
+3902	            assert entity.mapper is self
+3903	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 3963
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3962	
+3963	        assert state.mapper.isa(self)
+3964	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 3990
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3989	                    continue
+3990	                assert parent_state is not None
+3991	                assert parent_dict is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/mapper.py
+ Line number: 3991
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3990	                assert parent_state is not None
+3991	                assert parent_dict is not None
+3992	                queue = deque(
+
+
+ + +
+
+ +
+
+ hardcoded_password_string: Possible hardcoded password: '_sa_default'
+ Test ID: B105
+ Severity: LOW
+ Confidence: MEDIUM
+ CWE: CWE-259
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py
+ Line number: 83
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b105_hardcoded_password_string.html
+ +
+
+82	_WILDCARD_TOKEN: _LiteralStar = "*"
+83	_DEFAULT_TOKEN = "_sa_default"
+84	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py
+ Line number: 286
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+285	                mp = orm_base._inspect_mapped_class(mcls, configure=True)
+286	                assert mp is not None
+287	                return mp.attrs[key]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py
+ Line number: 310
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+309	    def deserialize(cls, path: _SerializedPath) -> PathRegistry:
+310	        assert path is not None
+311	        p = cls._deserialize_path(path)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py
+ Line number: 388
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+387	            if TYPE_CHECKING:
+388	                assert isinstance(entity, _StrPathToken)
+389	            return TokenRegistry(self, PathToken._intern[entity])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py
+ Line number: 459
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+458	        if TYPE_CHECKING:
+459	            assert isinstance(parent, AbstractEntityRegistry)
+460	        if not parent.is_aliased_class:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py
+ Line number: 487
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+486	        if TYPE_CHECKING:
+487	            assert isinstance(parent, AbstractEntityRegistry)
+488	        for mp_ent in parent.mapper.iterate_to_root():
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py
+ Line number: 614
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+613	            if TYPE_CHECKING:
+614	                assert isinstance(prop, RelationshipProperty)
+615	            self.entity = prop.entity
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/path_registry.py
+ Line number: 641
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+640	    def entity_path(self) -> AbstractEntityRegistry:
+641	        assert self.entity is not None
+642	        return self[self.entity]
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/persistence.py
+ Line number: 715
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+714	                raise orm_exc.FlushError(
+715	                    "Can't delete from table %s "
+716	                    "using NULL for primary "
+717	                    "key value on column %s" % (table, col)
+718	                )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/persistence.py
+ Line number: 1214
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1213	            else:
+1214	                assert not returning_is_required_anyway
+1215	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/properties.py
+ Line number: 762
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+761	        ):
+762	            assert originating_module is not None
+763	            argument = de_stringify_annotation(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/query.py
+ Line number: 648
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+647	        if TYPE_CHECKING:
+648	            assert isinstance(stmt, Select)
+649	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/query.py
+ Line number: 3344
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3343	        stmt = self._statement_20(for_statement=for_statement, **kw)
+3344	        assert for_statement == stmt._compile_options._for_statement
+3345	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 785
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+784	                )
+785	                assert info is not None
+786	                target_mapper, to_selectable, is_aliased_class = (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 1170
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1169	    ) -> ColumnElement[bool]:
+1170	        assert instance is not None
+1171	        adapt_source: Optional[_CoreAdapterProto] = None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 1174
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1173	            insp: Optional[_InternalEntityType[Any]] = inspect(from_entity)
+1174	            assert insp is not None
+1175	            if insp_is_aliased_class(insp):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 1311
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1310	        def _go() -> Any:
+1311	            assert lkv_fixed is not None
+1312	            last_known = to_return = lkv_fixed[prop.key]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 1409
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1408	
+1409	            assert is_has_collection_adapter(impl)
+1410	            instances_iterable = impl.get_collection(source_state, source_dict)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 1415
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1414	            # True
+1415	            assert not instances_iterable.empty if impl.collection else True
+1416	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 1450
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1449	                dest_impl = dest_state.get_impl(self.key)
+1450	                assert is_has_collection_adapter(dest_impl)
+1451	                dest_impl.set(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 1544
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1543	
+1544	            assert instance_state is not None
+1545	            instance_dict = attributes.instance_dict(c)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 1767
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1766	        argument = extracted_mapped_annotation
+1767	        assert originating_module is not None
+1768	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 2322
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2321	        self._determine_joins()
+2322	        assert self.primaryjoin is not None
+2323	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 2494
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2493	    def secondaryjoin_minus_local(self) -> ColumnElement[bool]:
+2494	        assert self.secondaryjoin is not None
+2495	        return _deep_deannotate(self.secondaryjoin, values=("local", "remote"))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 2687
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2686	
+2687	        assert self.secondary is not None
+2688	        fixed_secondary = self.secondary
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/relationships.py
+ Line number: 2699
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2698	
+2699	        assert self.secondaryjoin is not None
+2700	        self.secondaryjoin = visitors.replacement_traverse(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 952
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+951	        elif origin is SessionTransactionOrigin.SUBTRANSACTION:
+952	            assert parent is not None
+953	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 954
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+953	        else:
+954	            assert parent is None
+955	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1075
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1074	            parent = self._parent
+1075	            assert parent is not None
+1076	            self._new = parent._new
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1100
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1099	        """
+1100	        assert self._is_transaction_boundary
+1101	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1120
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1119	
+1120	        assert not self.session._deleted
+1121	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1132
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1131	        """
+1132	        assert self._is_transaction_boundary
+1133	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1144
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1143	            parent = self._parent
+1144	            assert parent is not None
+1145	            parent._new.update(self._new)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1238
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1237	                    else:
+1238	                        assert False, join_transaction_mode
+1239	                else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1277
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1276	        stx = self.session._transaction
+1277	        assert stx is not None
+1278	        if stx is not self:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1343
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1342	        stx = self.session._transaction
+1343	        assert stx is not None
+1344	        if stx is not self:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1887
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1886	            )
+1887	            assert self._transaction is trans
+1888	            return trans
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1934
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1933	
+1934	        assert trans is not None
+1935	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 1938
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1937	            trans = trans._begin(nested=nested)
+1938	            assert self._transaction is trans
+1939	            self._nested_transaction = trans
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 2162
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2161	            if TYPE_CHECKING:
+2162	                assert isinstance(
+2163	                    compile_state_cls, context.AbstractORMCompileState
+2164	                )
+2165	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 2606
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2605	            if TYPE_CHECKING:
+2606	                assert isinstance(insp, Inspectable)
+2607	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 2817
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2816	                        if TYPE_CHECKING:
+2817	                            assert isinstance(obj, Table)
+2818	                        return self.__binds[obj]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 3362
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3361	                    trans = self._transaction
+3362	                    assert trans is not None
+3363	                    if state in trans._key_switches:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 3565
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3564	            if TYPE_CHECKING:
+3565	                assert cascade_states is not None
+3566	            for o, m, st_, dct_ in cascade_states:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 3841
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3840	            # TODO: this was being tested before, but this is not possible
+3841	            assert instance is not LoaderCallableStatus.PASSIVE_CLASS_MISMATCH
+3842	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 4408
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4407	                )
+4408	                assert _reg, "Failed to add object to the flush context!"
+4409	                processed.add(state)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/session.py
+ Line number: 4418
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4417	            _reg = flush_context.register_object(state, isdelete=True)
+4418	            assert _reg, "Failed to add object to the flush context!"
+4419	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/state.py
+ Line number: 527
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+526	        # so make sure this is not set
+527	        assert self._strong_obj is None
+528	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/state.py
+ Line number: 909
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+908	                    if TYPE_CHECKING:
+909	                        assert is_collection_impl(attr)
+910	                    if previous is NEVER_SET:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py
+ Line number: 83
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+82	        """
+83	        assert prerequisite_states, "no prerequisite states sent"
+84	        has_prerequisite_states = (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/state_changes.py
+ Line number: 180
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+179	        """
+180	        assert self._next_state is _StateChangeStates.CHANGE_IN_PROGRESS, (
+181	            "Unexpected call to _expect_state outside of "
+182	            "state-changing method"
+183	        )
+184	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py
+ Line number: 1810
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1809	            q = self.subq
+1810	            assert q.session is None
+1811	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py
+ Line number: 2043
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2042	
+2043	        assert subq.session is None
+2044	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py
+ Line number: 2397
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2396	
+2397	        assert clauses.is_aliased_class
+2398	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py
+ Line number: 2519
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2518	
+2519	        assert clauses.is_aliased_class
+2520	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py
+ Line number: 2609
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2608	
+2609	        assert entity_we_want_to_splice_onto is path[-2]
+2610	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py
+ Line number: 2612
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2611	        if entity_inside_join_structure is False:
+2612	            assert isinstance(join_obj, orm_util._ORMJoin)
+2613	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py
+ Line number: 2690
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2689	            if entity_inside_join_structure is False:
+2690	                assert (
+2691	                    False
+2692	                ), "assertion failed attempting to produce joined eager loads"
+2693	            return None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategies.py
+ Line number: 2712
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2711	            # and entity_inside_join_structure=join_obj._right_memo.mapper
+2712	            assert detected_existing_path[-3] is entity_inside_join_structure
+2713	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 148
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+147	        elif getattr(attr, "_of_type", None):
+148	            assert isinstance(attr, QueryableAttribute)
+149	            ot: Optional[_InternalEntityType[Any]] = inspect(attr._of_type)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 150
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+149	            ot: Optional[_InternalEntityType[Any]] = inspect(attr._of_type)
+150	            assert ot is not None
+151	            coerced_alias = ot.selectable
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1071
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1070	        orig_cache_key = orig_query._generate_cache_key()
+1071	        assert orig_cache_key is not None
+1072	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1160
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1159	
+1160	        assert cloned.propagate_to_loaders == self.propagate_to_loaders
+1161	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1279
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1278	                self.context += (load_element,)
+1279	                assert opts is not None
+1280	                self.additional_source_entities += cast(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1374
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1373	    ):
+1374	        assert attrs is not None
+1375	        attr = attrs[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1376
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1375	        attr = attrs[0]
+1376	        assert (
+1377	            wildcard_key
+1378	            and isinstance(attr, str)
+1379	            and attr in (_WILDCARD_TOKEN, _DEFAULT_TOKEN)
+1380	        )
+1381	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1389
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1388	
+1389	        assert extra_criteria is None
+1390	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1403
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1402	        """
+1403	        assert self.path
+1404	        attr = self.path[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1410
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1409	
+1410	        assert effective_path.is_token
+1411	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1443
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1442	            # just returns it
+1443	            assert new_path == start_path
+1444	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1446
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1445	        # start_path is a single-token tuple
+1446	        assert start_path and len(start_path) == 1
+1447	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1449
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1448	        token = start_path[0]
+1449	        assert isinstance(token, str)
+1450	        entity = self._find_entity_basestring(entities, token, raiseerr)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1462
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1461	
+1462	        assert isinstance(token, str)
+1463	        loader = _TokenStrategyLoad.create(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1475
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1474	
+1475	        assert loader.path.is_token
+1476	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1771
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1770	
+1771	        assert opt.is_token_strategy == path.is_token
+1772	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1813
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1812	
+1813	        assert cloned.strategy == self.strategy
+1814	        assert cloned.local_opts == self.local_opts
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1814
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1813	        assert cloned.strategy == self.strategy
+1814	        assert cloned.local_opts == self.local_opts
+1815	        assert cloned.is_class_strategy == self.is_class_strategy
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1815
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1814	        assert cloned.local_opts == self.local_opts
+1815	        assert cloned.is_class_strategy == self.is_class_strategy
+1816	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1911
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1910	    ):
+1911	        assert attr is not None
+1912	        self._of_type = None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1930
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1929	            # should not reach here;
+1930	            assert False
+1931	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 1957
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1956	        if extra_criteria:
+1957	            assert not attr._extra_criteria
+1958	            self._extra_criteria = extra_criteria
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 2009
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2008	
+2009	        assert (
+2010	            self._extra_criteria
+2011	        ), "this should only be called if _extra_criteria is present"
+2012	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 2035
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2034	    def _set_of_type_info(self, context, current_path):
+2035	        assert self._path_with_polymorphic_path
+2036	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 2038
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2037	        pwpi = self._of_type
+2038	        assert pwpi
+2039	        if not pwpi.is_aliased_class:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 2080
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2079	        is_refresh = compile_state.compile_options._for_refresh_state
+2080	        assert not self.path.is_token
+2081	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 2103
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2102	        if current_path:
+2103	            assert effective_path is not None
+2104	            effective_path = self._adjust_effective_path_for_current_path(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 2132
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2131	            else:
+2132	                assert False, "unexpected object for _of_type"
+2133	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 2203
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2202	
+2203	        assert self.path.is_token
+2204	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/strategy_options.py
+ Line number: 2357
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2356	
+2357	    assert lead_element
+2358	    return lead_element
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/unitofwork.py
+ Line number: 638
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+637	        self.sort_key = ("SaveUpdateAll", mapper._sort_key)
+638	        assert mapper is mapper.base_mapper
+639	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/unitofwork.py
+ Line number: 675
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+674	        self.sort_key = ("DeleteAll", mapper._sort_key)
+675	        assert mapper is mapper.base_mapper
+676	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 727
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+726	
+727	        assert alias is not None
+728	        self._aliased_insp = AliasedInsp(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1004
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1003	            # supports "aliased class of aliased class" use case
+1004	            assert isinstance(inspected, AliasedInsp)
+1005	            self._adapter = inspected._adapter.wrap(self._adapter)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1065
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1064	        if aliased or flat:
+1065	            assert selectable is not None
+1066	            selectable = selectable._anonymous_fromclause(flat=flat)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1160
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1159	
+1160	        assert self.mapper is primary_mapper
+1161	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1187
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1186	    ) -> _ORMCOLEXPR:
+1187	        assert isinstance(expr, ColumnElement)
+1188	        d: Dict[str, Any] = {
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1230
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1229	        else:
+1230	            assert False, "mapper %s doesn't correspond to %s" % (mapper, self)
+1231	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1388
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1387	            else:
+1388	                assert entity is not None
+1389	                wrap_entity = entity.entity
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1435
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1434	        else:
+1435	            assert self.root_entity
+1436	            stack = list(self.root_entity.__subclasses__())
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1468
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1467	            crit = self.where_criteria  # type: ignore
+1468	        assert isinstance(crit, ColumnElement)
+1469	        return sql_util._deep_annotate(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1813
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1812	            if TYPE_CHECKING:
+1813	                assert isinstance(
+1814	                    onclause.comparator, RelationshipProperty.Comparator
+1815	                )
+1816	            on_selectable = onclause.comparator._source_selectable()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1833
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1832	            else:
+1833	                assert isinstance(left_selectable, FromClause)
+1834	                adapt_from = left_selectable
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1886
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1885	
+1886	        assert self.onclause is not None
+1887	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 1916
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1915	
+1916	        assert self.right is leftmost
+1917	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/util.py
+ Line number: 2081
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2080	
+2081	    assert insp_is_mapper(given)
+2082	    return entity.common_parent(given)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/orm/writeonly.py
+ Line number: 503
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+502	        if TYPE_CHECKING:
+503	            assert instance
+504	        self.instance = instance
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 868
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+867	
+868	        assert self.dbapi_connection is not None
+869	        return self.dbapi_connection
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 882
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+881	            self.__pool.dispatch.close(self.dbapi_connection, self)
+882	        assert self.dbapi_connection is not None
+883	        self.__pool._close_connection(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 940
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+939	    if is_gc_cleanup:
+940	        assert ref is not None
+941	        _strong_ref_connection_records.pop(ref, None)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 942
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+941	        _strong_ref_connection_records.pop(ref, None)
+942	        assert connection_record is not None
+943	        if connection_record.fairy_ref is not ref:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 945
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+944	            return
+945	        assert dbapi_connection is None
+946	        dbapi_connection = connection_record.dbapi_connection
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 977
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+976	            if not fairy:
+977	                assert connection_record is not None
+978	                fairy = _ConnectionFairy(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 984
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+983	                )
+984	            assert fairy.dbapi_connection is dbapi_connection
+985	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 1277
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1276	
+1277	        assert (
+1278	            fairy._connection_record is not None
+1279	        ), "can't 'checkout' a detached connection fairy"
+1280	        assert (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 1280
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1279	        ), "can't 'checkout' a detached connection fairy"
+1280	        assert (
+1281	            fairy.dbapi_connection is not None
+1282	        ), "can't 'checkout' an invalidated connection fairy"
+1283	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/base.py
+ Line number: 1493
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1492	    def cursor(self, *args: Any, **kwargs: Any) -> DBAPICursor:
+1493	        assert self.dbapi_connection is not None
+1494	        return self.dbapi_connection.cursor(*args, **kwargs)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/events.py
+ Line number: 78
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+77	            else:
+78	                assert issubclass(target, Pool)
+79	                return target
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/impl.py
+ Line number: 392
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+391	        # losing the state of an existing SQLite :memory: connection
+392	        assert not hasattr(other_singleton_pool._fairy, "current")
+393	        self._conn = other_singleton_pool._conn
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/impl.py
+ Line number: 402
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+401	                conn.close()
+402	            except Exception:
+403	                # pysqlite won't even let you close a conn from a thread
+404	                # that didn't create it
+405	                pass
+406	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/impl.py
+ Line number: 502
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+501	            conn = other_static_pool.connection.dbapi_connection
+502	            assert conn is not None
+503	            return conn
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/pool/impl.py
+ Line number: 552
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+551	        self._checked_out = False
+552	        assert record is self._conn
+553	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/_py_util.py
+ Line number: 63
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+62	            s_val = self[idself]
+63	            assert s_val is not True
+64	            return s_val, True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/base.py
+ Line number: 286
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+285	        x = fn(self, *args, **kw)
+286	        assert x is self, "generative methods must return self"
+287	        return self
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/base.py
+ Line number: 1223
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1222	
+1223	        assert self._compile_options is not None
+1224	        self._compile_options += options
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/cache_key.py
+ Line number: 165
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+164	                try:
+165	                    assert issubclass(cls, HasTraverseInternals)
+166	                    _cache_key_traversal = cls._traverse_internals
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/cache_key.py
+ Line number: 171
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+170	
+171	            assert _cache_key_traversal is not NO_CACHE, (
+172	                f"class {cls} has _cache_key_traversal=NO_CACHE, "
+173	                "which conflicts with inherit_cache=True"
+174	            )
+175	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/cache_key.py
+ Line number: 386
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+385	        else:
+386	            assert key is not None
+387	            return CacheKey(key, bindparams)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/cache_key.py
+ Line number: 400
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+399	        else:
+400	            assert key is not None
+401	            return CacheKey(key, bindparams)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/coercions.py
+ Line number: 408
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+407	        if typing.TYPE_CHECKING:
+408	            assert isinstance(resolved, (SQLCoreOperations, ClauseElement))
+409	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/coercions.py
+ Line number: 454
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+453	        if isinstance(resolved, str):
+454	            assert isinstance(expr, str)
+455	            strname = resolved = expr
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/coercions.py
+ Line number: 706
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+705	        # never reached
+706	        assert False
+707	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/coercions.py
+ Line number: 887
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+886	        elif isinstance(element, elements.ClauseList):
+887	            assert not len(element.clauses) == 0
+888	            return element.self_group(against=operator)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/coercions.py
+ Line number: 1331
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1330	    def _post_coercion(self, element, *, flat=False, name=None, **kw):
+1331	        assert name is None
+1332	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 899
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+898	                if TYPE_CHECKING:
+899	                    assert isinstance(statement, Executable)
+900	                self.execution_options = statement._execution_options
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 904
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+903	            if render_schema_translate:
+904	                assert schema_translate_map is not None
+905	                self.string = self.preparer._render_schema_translates(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1465
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1464	            if TYPE_CHECKING:
+1465	                assert isinstance(statement, UpdateBase)
+1466	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1469
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1468	                if TYPE_CHECKING:
+1469	                    assert isinstance(statement, ValuesBase)
+1470	                if statement._inline:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1662
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1661	    def _process_positional(self):
+1662	        assert not self.positiontup
+1663	        assert self.state is CompilerState.STRING_APPLIED
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1663
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1662	        assert not self.positiontup
+1663	        assert self.state is CompilerState.STRING_APPLIED
+1664	        assert not self._numeric_binds
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1664
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1663	        assert self.state is CompilerState.STRING_APPLIED
+1664	        assert not self._numeric_binds
+1665	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1669
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1668	        else:
+1669	            assert self.dialect.paramstyle == "qmark"
+1670	            placeholder = "?"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1690
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1689	            reverse_escape = {v: k for k, v in self.escaped_bind_names.items()}
+1690	            assert len(self.escaped_bind_names) == len(reverse_escape)
+1691	            self.positiontup = [
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1721
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1720	    def _process_numeric(self):
+1721	        assert self._numeric_binds
+1722	        assert self.state is CompilerState.STRING_APPLIED
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1722
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1721	        assert self._numeric_binds
+1722	        assert self.state is CompilerState.STRING_APPLIED
+1723	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1767
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1766	            }
+1767	            assert len(param_pos) == len_before
+1768	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1864
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1863	        if self._render_postcompile and not _no_postcompile:
+1864	            assert self._post_compile_expanded_state is not None
+1865	            if not params:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 1893
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1892	            ckbm_tuple = self._cache_key_bind_match
+1893	            assert ckbm_tuple is not None
+1894	            ckbm, _ = ckbm_tuple
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 2140
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2139	                    if parameter.type._is_tuple_type:
+2140	                        assert values is not None
+2141	                        new_processors.update(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 2192
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2191	        if numeric_positiontup is not None:
+2192	            assert new_positiontup is not None
+2193	            param_pos = {
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 2252
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2251	
+2252	        assert self.compile_state is not None
+2253	        statement = self.compile_state.statement
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 2256
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2255	        if TYPE_CHECKING:
+2256	            assert isinstance(statement, Insert)
+2257	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 2334
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2333	
+2334	        assert self.compile_state is not None
+2335	        statement = self.compile_state.statement
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 2338
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2337	        if TYPE_CHECKING:
+2338	            assert isinstance(statement, Insert)
+2339	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 2344
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2343	        returning = self.implicit_returning
+2344	        assert returning is not None
+2345	        ret = {col: idx for idx, col in enumerate(returning)}
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 2648
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2647	            if TYPE_CHECKING:
+2648	                assert isinstance(table, NamedFromClause)
+2649	            tablename = table.name
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 3291
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3290	                m = post_compile_pattern.search(bind_expression_template)
+3291	                assert m and m.group(
+3292	                    2
+3293	                ), "unexpected format for expanding parameter"
+3294	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 3361
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3360	        ):
+3361	            assert not typ_dialect_impl._is_array
+3362	            to_update = [
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 3725
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3724	                    )
+3725	                    assert m, "unexpected format for expanding parameter"
+3726	                    wrapped = "(__[POSTCOMPILE_%s~~%s~~REPL~~%s~~])" % (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4058
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4057	        self_ctes = self._init_cte_state()
+4058	        assert self_ctes is self.ctes
+4059	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4079
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4078	            ]
+4079	            assert _ == cte_name
+4080	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4128
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4127	
+4128	                assert existing_cte_reference_cte is _reference_cte
+4129	                assert existing_cte_reference_cte is existing_cte
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4129
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4128	                assert existing_cte_reference_cte is _reference_cte
+4129	                assert existing_cte_reference_cte is existing_cte
+4130	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4218
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4217	
+4218	                assert kwargs.get("subquery", False) is False
+4219	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4291
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4290	                # from visit_lateral() and we need to set enclosing_lateral.
+4291	                assert alias._is_lateral
+4292	                kwargs["enclosing_lateral"] = alias
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4473
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4472	        # collection properly
+4473	        assert objects
+4474	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4568
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4567	        # these assertions right now set up the current expected inputs
+4568	        assert within_columns_clause, (
+4569	            "_label_select_column is only relevant within "
+4570	            "the columns clause of a SELECT or RETURNING"
+4571	        )
+4572	        result_expr: Union[elements.Label[Any], _CompileLabel]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4588
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4587	
+4588	            assert (
+4589	                proxy_name is not None
+4590	            ), "proxy_name is required if 'name' is passed"
+4591	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4696
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4695	                    # just-added _label_returning_column method
+4696	                    assert not column_is_repeated
+4697	                    fallback_label_name = column._anon_name_label
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 4795
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4794	    ):
+4795	        assert select_wraps_for is None, (
+4796	            "SQLAlchemy 1.4 requires use of "
+4797	            "the translate_select_structure hook for structural "
+4798	            "translations of SELECT objects"
+4799	        )
+4800	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 5123
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5122	        if warn_linting:
+5123	            assert from_linter is not None
+5124	            from_linter.warn()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 5541
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5540	        imv = self._insertmanyvalues
+5541	        assert imv is not None
+5542	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 5674
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5673	        insert_crud_params = imv.insert_crud_params
+5674	        assert insert_crud_params is not None
+5675	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 5745
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5744	                positiontup = self.positiontup
+5745	                assert positiontup is not None
+5746	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 5754
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5753	                expand_pos_upper_index = max(all_expand_positions) + 1
+5754	                assert (
+5755	                    len(all_expand_positions)
+5756	                    == expand_pos_upper_index - expand_pos_lower_index
+5757	                )
+5758	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 5833
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5832	                    # parameters
+5833	                    assert not extra_params_right
+5834	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 6033
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+6032	            if add_sentinel_cols is not None:
+6033	                assert use_insertmanyvalues
+6034	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 6082
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+6081	                        # _get_sentinel_column_for_table.
+6082	                        assert not add_sentinel_cols[0]._insert_sentinel, (
+6083	                            "sentinel selection rules should have prevented "
+6084	                            "us from getting here for this dialect"
+6085	                        )
+6086	
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 6224
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+6223	                text += (
+6224	                    f" SELECT {colnames_w_cast} FROM "
+6225	                    f"(VALUES ({insert_single_values_expr})) "
+6226	                    f"AS imp_sen({colnames}, sen_counter) "
+6227	                    "ORDER BY sen_counter"
+6228	                )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 6332
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+6331	        if TYPE_CHECKING:
+6332	            assert isinstance(compile_state, UpdateDMLState)
+6333	        update_stmt = compile_state.statement  # type: ignore[assignment]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 6463
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+6462	        if warn_linting:
+6463	            assert from_linter is not None
+6464	            from_linter.warn(stmt_type="UPDATE")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 6615
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+6614	        if warn_linting:
+6615	            assert from_linter is not None
+6616	            from_linter.warn(stmt_type="DELETE")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 7869
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+7868	        if name is None:
+7869	            assert alias is not None
+7870	            return self.quote(alias.name)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 7899
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+7898	
+7899	        assert name is not None
+7900	        if constraint.__visit_name__ == "index":
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 7953
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+7952	        name = self.format_constraint(index)
+7953	        assert name is not None
+7954	        return name
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 7965
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+7964	            if TYPE_CHECKING:
+7965	                assert isinstance(table, NamedFromClause)
+7966	            name = table.name
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/compiler.py
+ Line number: 8008
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+8007	            name = column.name
+8008	            assert name is not None
+8009	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 166
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+165	        kw.pop("accumulate_bind_names", None)
+166	    assert (
+167	        "accumulate_bind_names" not in kw
+168	    ), "Don't know how to handle insert within insert without a CTE"
+169	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 230
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+229	        mp = compile_state._multi_parameters
+230	        assert mp is not None
+231	        spd = mp[0]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 237
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+236	        stmt_parameter_tuples = compile_state._ordered_values
+237	        assert spd is not None
+238	        spd_str_key = {_column_as_key(key) for key in spd}
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 251
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+250	    elif stmt_parameter_tuples:
+251	        assert spd_str_key is not None
+252	        parameters = {
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 296
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+295	
+296	        assert not compile_state._has_multi_parameters
+297	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 370
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+369	                elif multi_not_in_from:
+370	                    assert compiler.render_table_with_column_in_update_from
+371	                    raise exc.CompileError(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 393
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+392	        # is a multiparams, is not an insert from a select
+393	        assert not stmt._select_names
+394	        multi_extended_values = _extend_values_for_multiparams(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 559
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+558	                if TYPE_CHECKING:
+559	                    assert isinstance(col.table, TableClause)
+560	                return "%s_%s" % (col.table.name, col.key)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 588
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+587	
+588	    assert compiler.stack[-1]["selectable"] is stmt
+589	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 664
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+663	
+664	    assert compile_state.isupdate or compile_state.isinsert
+665	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 1392
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1391	        col = _multiparam_column(c, index)
+1392	        assert isinstance(stmt, dml.Insert)
+1393	        return _create_insert_prefetch_bind_param(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/crud.py
+ Line number: 1513
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1512	    mp = compile_state._multi_parameters
+1513	    assert mp is not None
+1514	    for i, row in enumerate(mp[1:]):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py
+ Line number: 126
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+125	        else:
+126	            assert False, "compiler or dialect is required"
+127	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py
+ Line number: 443
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+442	    def stringify_dialect(self):  # type: ignore[override]
+443	        assert not isinstance(self.element, str)
+444	        return self.element.create_drop_stringify_dialect
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/ddl.py
+ Line number: 872
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+871	        self.connection = connection
+872	        assert not kw, f"Unexpected keywords: {kw.keys()}"
+873	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/dml.py
+ Line number: 235
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+234	    def _process_select_values(self, statement: ValuesBase) -> None:
+235	        assert statement._select_names is not None
+236	        parameters: MutableMapping[_DMLColumnElement, Any] = {
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/dml.py
+ Line number: 246
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+245	            # does not allow this construction to occur
+246	            assert False, "This statement already has parameters"
+247	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/dml.py
+ Line number: 330
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+329	            else:
+330	                assert self._multi_parameters
+331	                self._multi_parameters.extend(multi_parameters)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/dml.py
+ Line number: 364
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+363	            self._no_parameters = False
+364	            assert parameters is not None
+365	            self._dict_parameters = dict(parameters)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/dml.py
+ Line number: 1175
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1174	                    # case
+1175	                    assert isinstance(self, Insert)
+1176	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 323
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+322	        if TYPE_CHECKING:
+323	            assert isinstance(self, ClauseElement)
+324	        return dialect.statement_compiler(dialect, self, **kw)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 526
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+525	            if TYPE_CHECKING:
+526	                assert isinstance(self, Executable)
+527	            return connection._execute_clauseelement(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 702
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+701	            if TYPE_CHECKING:
+702	                assert compiled_cache is not None
+703	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 759
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+758	        grouped = self.self_group(against=operators.inv)
+759	        assert isinstance(grouped, ColumnElement)
+760	        return UnaryExpression(grouped, operator=operators.inv)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 1485
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1484	            grouped = self.self_group(against=operators.inv)
+1485	            assert isinstance(grouped, ColumnElement)
+1486	            return UnaryExpression(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 1682
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1681	
+1682	        assert key is not None
+1683	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 1747
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1746	            # 16 bits leftward.  fill extra add_hash on right
+1747	            assert add_hash < (2 << 15)
+1748	            assert seed
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 1748
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1747	            assert add_hash < (2 << 15)
+1748	            assert seed
+1749	            hash_value = (hash_value << 16) | add_hash
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 2883
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2882	        if operators.is_associative(op):
+2883	            assert (
+2884	                negate is None
+2885	            ), f"negate not supported for associative operator {op}"
+2886	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 3008
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3007	        grouped = self.self_group(against=operators.inv)
+3008	        assert isinstance(grouped, ColumnElement)
+3009	        return UnaryExpression(grouped, operator=operators.inv)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 3120
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3119	        else:
+3120	            assert lcc
+3121	            # just one element.  return it as a single boolean element,
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 3850
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3849	        # comparison operators should never call reverse_operate
+3850	        assert not operators.is_comparison(op)
+3851	        raise exc.ArgumentError(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 4071
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4070	    def self_group(self, against: Optional[OperatorType] = None) -> Self:
+4071	        assert against is operator.getitem
+4072	        return self
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 4121
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4120	    def _ungroup(self) -> ColumnElement[_T]:
+4121	        assert isinstance(self.element, ColumnElement)
+4122	        return self.element._ungroup()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 5074
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5073	            else:
+5074	                assert not TYPE_CHECKING or isinstance(t, NamedFromClause)
+5075	                label = t.name + "_" + name
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 5086
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5085	                # assert false on it for now
+5086	                assert not isinstance(label, quoted_name)
+5087	                label = quoted_name(label, t.name.quote)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 5314
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5313	    def __new__(cls, value: str, quote: Optional[bool]) -> quoted_name:
+5314	        assert (
+5315	            value is not None
+5316	        ), "use quoted_name.construct() for None passthrough"
+5317	        if isinstance(value, cls) and (quote is None or value.quote == quote):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/elements.py
+ Line number: 5445
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5444	        if TYPE_CHECKING:
+5445	            assert isinstance(self._Annotated__element, Column)
+5446	        return self._Annotated__element.info
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/functions.py
+ Line number: 1600
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1599	    def __init__(self, seq: schema.Sequence, **kw: Any) -> None:
+1600	        assert isinstance(
+1601	            seq, schema.Sequence
+1602	        ), "next_value() accepts a Sequence object as input."
+1603	        self.sequence = seq
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/lambdas.py
+ Line number: 408
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+407	        while parent is not None:
+408	            assert parent.closure_cache_key is not CacheConst.NO_CACHE
+409	            parent_closure_cache_key: Tuple[Any, ...] = (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/lambdas.py
+ Line number: 451
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+450	    def _resolve_with_args(self, *lambda_args: Any) -> ClauseElement:
+451	        assert isinstance(self._rec, AnalyzedFunction)
+452	        tracker_fn = self._rec.tracker_instrumented_fn
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/lambdas.py
+ Line number: 594
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+593	        if TYPE_CHECKING:
+594	            assert isinstance(self._rec.expected_expr, ClauseElement)
+595	        if self._rec.expected_expr.supports_execution:
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/lambdas.py
+ Line number: 1045
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+1044	        raise exc.InvalidRequestError(
+1045	            "Closure variable named '%s' inside of lambda callable %s "
+1046	            "does not refer to a cacheable SQL element, and also does not "
+1047	            "appear to be serving as a SQL literal bound value based on "
+1048	            "the default "
+1049	            "SQL expression returned by the function.   This variable "
+1050	            "needs to remain outside the scope of a SQL-generating lambda "
+1051	            "so that a proper cache key may be generated from the "
+1052	            "lambda's state.  Evaluate this variable outside of the "
+1053	            "lambda, set track_on=[<elements>] to explicitly select "
+1054	            "closure elements to track, or set "
+1055	            "track_closure_variables=False to exclude "
+1056	            "closure variables from being part of the cache key."
+1057	            % (variable_name, fn.__code__),
+1058	        ) from from_
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/lambdas.py
+ Line number: 1264
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+1263	        vars_ = {"o%d" % i: cell_values[i] for i in argrange}
+1264	        exec(code, vars_, vars_)
+1265	        closure = vars_["make_cells"]()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 824
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+823	            quote_schema = quote_schema
+824	            assert isinstance(schema, str)
+825	            self.schema = quoted_name(schema, quote_schema)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 948
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+947	
+948	        assert extend_existing
+949	        assert not keep_existing
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 949
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+948	        assert extend_existing
+949	        assert not keep_existing
+950	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 1046
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1045	        if sentinel_is_explicit and explicit_sentinel_col is autoinc_col:
+1046	            assert autoinc_col is not None
+1047	            sentinel_is_autoinc = True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 1125
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1124	        if the_sentinel is None and self.primary_key:
+1125	            assert autoinc_col is None
+1126	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 1272
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1271	        metadata = parent
+1272	        assert isinstance(metadata, MetaData)
+1273	        metadata._add_table(self.name, self.schema, self)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 2224
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2223	    def _set_type(self, type_: TypeEngine[Any]) -> None:
+2224	        assert self.type._isnull or type_ is self.type
+2225	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 2322
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2321	        table = parent
+2322	        assert isinstance(table, Table)
+2323	        if not self.name:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3023
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3022	        else:
+3023	            assert isinstance(self._colspec, str)
+3024	            return self._colspec
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3121
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3120	            if isinstance(c, Column):
+3121	                assert c.table is parenttable
+3122	                break
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3124
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3123	        else:
+3124	            assert False
+3125	        ######################
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3147
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3146	            parent = self.parent
+3147	            assert parent is not None
+3148	            key = parent.key
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3172
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3171	    def _set_target_column(self, column: Column[Any]) -> None:
+3172	        assert self.parent is not None
+3173	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3250
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3249	    def _set_parent(self, parent: SchemaEventTarget, **kw: Any) -> None:
+3250	        assert isinstance(parent, Column)
+3251	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3264
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3263	        self._set_target_column(_column)
+3264	        assert self.constraint is not None
+3265	        self.constraint._validate_dest_table(table)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3278
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3277	        # on the hosting Table when attached to the Table.
+3278	        assert isinstance(table, Table)
+3279	        if self.constraint is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3370
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3369	        if TYPE_CHECKING:
+3370	            assert isinstance(parent, Column)
+3371	        self.column = parent
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 3936
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3935	        column = parent
+3936	        assert isinstance(column, Column)
+3937	        super()._set_parent(column)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4035
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4034	        column = parent
+4035	        assert isinstance(column, Column)
+4036	        self.column = column
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4189
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4188	    def _set_parent(self, parent: SchemaEventTarget, **kw: Any) -> None:
+4189	        assert isinstance(parent, (Table, Column))
+4190	        self.parent = parent
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4245
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4244	            # this is expected to be an empty list
+4245	            assert not processed_expressions
+4246	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4276
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4275	            # such that when all those cols are attached, we autoattach.
+4276	            assert not evt, "Should not reach here on event call"
+4277	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4330
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4329	            ]
+4330	            assert len(result) == len(self._pending_colargs)
+4331	            return result
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4346
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4345	    def _set_parent(self, parent: SchemaEventTarget, **kw: Any) -> None:
+4346	        assert isinstance(parent, (Table, Column))
+4347	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4407
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4406	    def _set_parent(self, parent: SchemaEventTarget, **kw: Any) -> None:
+4407	        assert isinstance(parent, (Column, Table))
+4408	        Constraint._set_parent(self, parent)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4445
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4444	
+4445	        assert isinstance(self.parent, Table)
+4446	        c = self.__class__(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4753
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4752	            if hasattr(self, "parent"):
+4753	                assert table is self.parent
+4754	            self._set_parent_with_dispatch(table)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4836
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4835	        table = parent
+4836	        assert isinstance(table, Table)
+4837	        Constraint._set_parent(self, table)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 4986
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4985	        table = parent
+4986	        assert isinstance(table, Table)
+4987	        super()._set_parent(table)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 5298
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5297	        table = parent
+5298	        assert isinstance(table, Table)
+5299	        ColumnCollectionMixin._set_parent(self, table)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 5312
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5311	        col_expressions = self._col_expressions(table)
+5312	        assert len(expressions) == len(col_expressions)
+5313	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 5321
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5320	            else:
+5321	                assert False
+5322	        self.expressions = self._table_bound_expressions = exprs
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 6032
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+6031	    def _set_parent(self, parent: SchemaEventTarget, **kw: Any) -> None:
+6032	        assert isinstance(parent, Column)
+6033	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/schema.py
+ Line number: 6178
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+6177	    def _set_parent(self, parent: SchemaEventTarget, **kw: Any) -> None:
+6178	        assert isinstance(parent, Column)
+6179	        if not isinstance(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 919
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+918	            if "_columns" in self.__dict__:
+919	                assert "primary_key" in self.__dict__
+920	                assert "foreign_keys" in self.__dict__
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 920
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+919	                assert "primary_key" in self.__dict__
+920	                assert "foreign_keys" in self.__dict__
+921	                return
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 2106
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2105	    ) -> None:
+2106	        assert sampling is not None
+2107	        functions = util.preloaded.sql_functions
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 2261
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2260	        """
+2261	        assert is_select_statement(
+2262	            self.element
+2263	        ), f"CTE element f{self.element} does not support union()"
+2264	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 2293
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2292	
+2293	        assert is_select_statement(
+2294	            self.element
+2295	        ), f"CTE element f{self.element} does not support union_all()"
+2296	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 2407
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2406	                if TYPE_CHECKING:
+2407	                    assert is_column_element(c)
+2408	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 2413
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2412	                if TYPE_CHECKING:
+2413	                    assert is_column_element(c)
+2414	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 2455
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2454	                if TYPE_CHECKING:
+2455	                    assert is_column_element(c)
+2456	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 2479
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2478	                            # you need two levels of duplication to be here
+2479	                            assert hash(names[required_label_name]) == hash(c)
+2480	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 4831
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+4830	            elif TYPE_CHECKING:
+4831	                assert is_column_element(c)
+4832	
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 4999
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+4998	                raise exc.InvalidRequestError(
+4999	                    "Select statement '%r"
+5000	                    "' returned no FROM clauses "
+5001	                    "due to auto-correlation; "
+5002	                    "specify correlate(<tables>) "
+5003	                    "to control correlation "
+5004	                    "manually." % self.statement
+5005	                )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 5053
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5052	                if onclause is not None:
+5053	                    assert isinstance(onclause, ColumnElement)
+5054	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 5076
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5075	            if TYPE_CHECKING:
+5076	                assert isinstance(right, FromClause)
+5077	                if onclause is not None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 5078
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5077	                if onclause is not None:
+5078	                    assert isinstance(onclause, ColumnElement)
+5079	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 5099
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+5098	            else:
+5099	                assert left is not None
+5100	                self.from_clauses = self.from_clauses + (
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 6249
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+6248	
+6249	        assert isinstance(self._where_criteria, tuple)
+6250	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 6956
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+6955	
+6956	        assert isinstance(self.element, ScalarSelect)
+6957	        element = self.element.element
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/selectable.py
+ Line number: 7191
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+7190	        if TYPE_CHECKING:
+7191	            assert isinstance(fromclause, Subquery)
+7192	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with pickle module.
+ Test ID: B403
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 17
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b403-import-pickle
+ +
+
+16	import json
+17	import pickle
+18	from typing import Any
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 112
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+111	            if TYPE_CHECKING:
+112	                assert isinstance(self.type, HasExpressionLookup)
+113	            lookup = self.type._expression_adaptations.get(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 724
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+723	    def _literal_processor_portion(self, dialect, _portion=None):
+724	        assert _portion in (None, 0, -1)
+725	        if _portion is not None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 1518
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1517	            self.enum_class = enums[0]  # type: ignore[assignment]
+1518	            assert self.enum_class is not None
+1519	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 1549
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1548	        typ = self._resolve_for_python_type(tv, tv, tv)
+1549	        assert typ is not None
+1550	        return typ
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 1764
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1763	        kw.setdefault("_create_events", False)
+1764	        assert "_enums" in kw
+1765	        return impltype(**kw)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 1798
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1797	        )
+1798	        assert e.table is table
+1799	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 2038
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2037	        )
+2038	        assert e.table is table
+2039	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 2183
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2182	        if TYPE_CHECKING:
+2183	            assert isinstance(self.impl_instance, DateTime)
+2184	        impl_processor = self.impl_instance.bind_processor(dialect)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/sqltypes.py
+ Line number: 2215
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2214	        if TYPE_CHECKING:
+2215	            assert isinstance(self.impl_instance, DateTime)
+2216	        impl_processor = self.impl_instance.result_processor(dialect, coltype)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/traversals.py
+ Line number: 360
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+359	                # TODO: use abc classes
+360	                assert False
+361	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/traversals.py
+ Line number: 549
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+548	
+549	                assert left_visit_sym is not None
+550	                assert left_attrname is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/traversals.py
+ Line number: 550
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+549	                assert left_visit_sym is not None
+550	                assert left_attrname is not None
+551	                assert right_attrname is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/traversals.py
+ Line number: 551
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+550	                assert left_attrname is not None
+551	                assert right_attrname is not None
+552	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/traversals.py
+ Line number: 554
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+553	                dispatch = self.dispatch(left_visit_sym)
+554	                assert dispatch is not None, (
+555	                    f"{self.__class__} has no dispatch for "
+556	                    f"'{self._dispatch_lookup[left_visit_sym]}'"
+557	                )
+558	                left_child = operator.attrgetter(left_attrname)(left)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/type_api.py
+ Line number: 987
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+986	            # this can't be self, else we create a cycle
+987	            assert impl is not self
+988	            d: _TypeMemoDict = {"impl": impl, "result": {}}
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/type_api.py
+ Line number: 1745
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1744	            if TYPE_CHECKING:
+1745	                assert isinstance(self.expr.type, TypeDecorator)
+1746	            kwargs["_python_is_types"] = self.expr.type.coerce_to_is_types
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/type_api.py
+ Line number: 1753
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1752	            if TYPE_CHECKING:
+1753	                assert isinstance(self.expr.type, TypeDecorator)
+1754	            kwargs["_python_is_types"] = self.expr.type.coerce_to_is_types
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/util.py
+ Line number: 234
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+233	            if resolve_ambiguity:
+234	                assert cols_in_onclause is not None
+235	                if set(f.c).union(s.c).issuperset(cols_in_onclause):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/util.py
+ Line number: 421
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+420	        elif isinstance(element, _textual_label_reference):
+421	            assert False, "can't unwrap a textual label reference"
+422	        return None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/util.py
+ Line number: 695
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+694	            else:
+695	                assert False, "Unknown parameter type %s" % (
+696	                    type(multi_params[0])
+697	                )
+698	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/util.py
+ Line number: 863
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+862	        if prevright is not None:
+863	            assert right is not None
+864	            prevright.left = right
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/util.py
+ Line number: 1197
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1196	        if TYPE_CHECKING:
+1197	            assert isinstance(col, KeyedColumnElement)
+1198	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/util.py
+ Line number: 1207
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1206	        if TYPE_CHECKING:
+1207	            assert isinstance(col, KeyedColumnElement)
+1208	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/util.py
+ Line number: 1336
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1335	    def chain(self, visitor: ExternalTraversal) -> ColumnAdapter:
+1336	        assert isinstance(visitor, ColumnAdapter)
+1337	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/util.py
+ Line number: 1463
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1462	        else:
+1463	            assert offset_clause is not None
+1464	            offset_clause = _offset_or_limit_clause(offset_clause)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/sql/visitors.py
+ Line number: 584
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+583	            sym_name = sym.value
+584	            assert sym_name not in lookup, sym_name
+585	            lookup[sym] = lookup[sym_name] = visit_key
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 190
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+189	        # block will assert our messages
+190	        assert _SEEN is not None
+191	        assert _EXC_CLS is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 191
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+190	        assert _SEEN is not None
+191	        assert _EXC_CLS is not None
+192	        _FILTERS.extend(filters)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 249
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+248	                if assert_:
+249	                    assert not seen, "Warnings were not seen: %s" % ", ".join(
+250	                        "%r" % (s.pattern if regex else s) for s in seen
+251	                    )
+252	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 271
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+270	    deviance = int(expected * variance)
+271	    assert (
+272	        abs(received - expected) < deviance
+273	    ), "Given int value %s is not within %d%% of expected value %s" % (
+274	        received,
+275	        variance * 100,
+276	        expected,
+277	    )
+278	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 281
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+280	def eq_regex(a, b, msg=None, flags=0):
+281	    assert re.match(b, a, flags), msg or "%r !~ %r" % (a, b)
+282	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 286
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+285	    """Assert a == b, with repr messaging on failure."""
+286	    assert a == b, msg or "%r != %r" % (a, b)
+287	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 291
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+290	    """Assert a != b, with repr messaging on failure."""
+291	    assert a != b, msg or "%r == %r" % (a, b)
+292	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 296
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+295	    """Assert a <= b, with repr messaging on failure."""
+296	    assert a <= b, msg or "%r != %r" % (a, b)
+297	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 300
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+299	def is_instance_of(a, b, msg=None):
+300	    assert isinstance(a, b), msg or "%r is not an instance of %r" % (a, b)
+301	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 321
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+320	    """Assert a is b, with repr messaging on failure."""
+321	    assert a is b, msg or "%r is not %r" % (a, b)
+322	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 326
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+325	    """Assert a is not b, with repr messaging on failure."""
+326	    assert a is not b, msg or "%r is %r" % (a, b)
+327	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 335
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+334	    """Assert a in b, with repr messaging on failure."""
+335	    assert a in b, msg or "%r not in %r" % (a, b)
+336	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 340
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+339	    """Assert a in not b, with repr messaging on failure."""
+340	    assert a not in b, msg or "%r is in %r" % (a, b)
+341	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 349
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+348	    """Assert a.startswith(fragment), with repr messaging on failure."""
+349	    assert a.startswith(fragment), msg or "%r does not start with %r" % (
+350	        a,
+351	        fragment,
+352	    )
+353	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 363
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+362	
+363	    assert a == b, msg or "%r != %r" % (a, b)
+364	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 380
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+379	    ):
+380	        assert False, (
+381	            "Exception %r was correctly raised but did not set a cause, "
+382	            "within context %r as its cause."
+383	            % (exception, exception.__context__)
+384	        )
+385	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 476
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+475	            error_as_string = str(err)
+476	            assert re.search(msg, error_as_string, re.UNICODE), "%r !~ %s" % (
+477	                msg,
+478	                error_as_string,
+479	            )
+480	        if check_context and not are_we_already_in_a_traceback:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 492
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+491	    # assert outside the block so it works for AssertionError too !
+492	    assert success, "Callable did not raise an exception"
+493	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 752
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+751	                    msg = "Expected to find bindparam %r in %r" % (v, stmt)
+752	                    assert False, msg
+753	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 777
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+776	    ):
+777	        assert len(table.c) == len(reflected_table.c)
+778	        for c, reflected_c in zip(table.c, reflected_table.c):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 780
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+779	            eq_(c.name, reflected_c.name)
+780	            assert reflected_c is reflected_table.c[c.name]
+781	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 788
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+787	                msg = "Type '%s' doesn't correspond to type '%s'"
+788	                assert isinstance(reflected_c.type, type(c.type)), msg % (
+789	                    reflected_c.type,
+790	                    c.type,
+791	                )
+792	            else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 804
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+803	            if c.server_default:
+804	                assert isinstance(
+805	                    reflected_c.server_default, schema.FetchedValue
+806	                )
+807	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 809
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+808	        if strict_constraints:
+809	            assert len(table.primary_key) == len(reflected_table.primary_key)
+810	            for c in table.primary_key:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 811
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+810	            for c in table.primary_key:
+811	                assert reflected_table.primary_key.columns[c.name] is not None
+812	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertions.py
+ Line number: 814
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+813	    def assert_types_base(self, c1, c2):
+814	        assert c1.type._compare_type_affinity(
+815	            c2.type
+816	        ), "On column %r, type '%s' doesn't correspond to type '%s'" % (
+817	            c1.name,
+818	            c1.type,
+819	            c2.type,
+820	        )
+821	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertsql.py
+ Line number: 32
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+31	    def no_more_statements(self):
+32	        assert False, (
+33	            "All statements are complete, but pending "
+34	            "assertion rules remain"
+35	        )
+36	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertsql.py
+ Line number: 103
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+102	                # to look like all the current RETURNING dialects
+103	                assert dialect.insert_executemany_returning
+104	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertsql.py
+ Line number: 351
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+350	        if self.count != self._statement_count:
+351	            assert False, "desired statement count %d does not match %d" % (
+352	                self.count,
+353	                self._statement_count,
+354	            )
+355	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertsql.py
+ Line number: 470
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+469	            elif rule.errormessage:
+470	                assert False, rule.errormessage
+471	        if observed:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/assertsql.py
+ Line number: 472
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+471	        if observed:
+472	            assert False, "Additional SQL statements remain:\n%s" % observed
+473	        elif not rule.is_consumed:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/config.py
+ Line number: 389
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+388	    def push_engine(cls, db, namespace):
+389	        assert _current, "Can't push without a default Config set up"
+390	        cls.push(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/engines.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+60	
+61	        assert scope in ("class", "global", "function", "fixture")
+62	        self.testing_engines[scope].add(engine)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/engines.py
+ Line number: 170
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+169	                    # are not easily preventable
+170	                    assert (
+171	                        False
+172	                    ), "%d connection recs not cleared after test suite" % (ln)
+173	        if config.options and config.options.low_connections:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/engines.py
+ Line number: 186
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+185	            if rec.is_valid:
+186	                assert False
+187	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/engines.py
+ Line number: 259
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+258	            curs.execute("select 1")
+259	            assert False, "simulated connect failure didn't work"
+260	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/engines.py
+ Line number: 420
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+419	        recv = [re.sub(r"[\n\t]", "", str(s)) for s in buffer]
+420	        assert recv == stmts, recv
+421	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/engines.py
+ Line number: 427
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+426	    engine = create_mock_engine(dialect_name + "://", executor)
+427	    assert not hasattr(engine, "mock")
+428	    engine.mock = buffer
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/exclusions.py
+ Line number: 242
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+241	        else:
+242	            assert False, "unknown predicate type: %s" % predicate
+243	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/exclusions.py
+ Line number: 310
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+309	        if self.op is not None:
+310	            assert driver is None, "DBAPI version specs not supported yet"
+311	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/exclusions.py
+ Line number: 473
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+472	def against(config, *queries):
+473	    assert queries, "no queries sent!"
+474	    return OrPredicate([Predicate.as_predicate(query) for query in queries])(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/base.py
+ Line number: 50
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+49	    def assert_(self, val, msg=None):
+50	        assert val, msg
+51	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/base.py
+ Line number: 101
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+100	                r.all()
+101	            except:
+102	                pass
+103	        for r in to_close:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/base.py
+ Line number: 106
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+105	                r.close()
+106	            except:
+107	                pass
+108	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/base.py
+ Line number: 230
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+229	            name = dialect_cls.name
+230	            assert name, "name is required"
+231	            registry.impls[name] = dialect_cls
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/base.py
+ Line number: 236
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+235	
+236	        assert name is not None
+237	        del registry.impls[name]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/mypy.py
+ Line number: 324
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+323	                    print("Remaining messages:", extra, sep="\n")
+324	                assert False, "expected messages not found, see stdout"
+325	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/mypy.py
+ Line number: 329
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+328	                print("\n".join(msg for _, msg in output))
+329	                assert False, "errors and/or notes remain, see stdout"
+330	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/orm.py
+ Line number: 119
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+118	            def __init_subclass__(cls) -> None:
+119	                assert cls_registry is not None
+120	                cls_registry[cls.__name__] = cls
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/orm.py
+ Line number: 175
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+174	            def __init_subclass__(cls, **kw) -> None:
+175	                assert cls_registry is not None
+176	                cls_registry[cls.__name__] = cls
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/sql.py
+ Line number: 86
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+85	                cls.run_create_tables = "each"
+86	            assert cls.run_inserts in ("each", None)
+87	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/sql.py
+ Line number: 328
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+327	        if a_key is None:
+328	            assert a._annotations.get("nocache")
+329	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/sql.py
+ Line number: 330
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+329	
+330	            assert b_key is None
+331	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/sql.py
+ Line number: 336
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+335	            for a_param, b_param in zip(a_key.bindparams, b_key.bindparams):
+336	                assert a_param.compare(b_param, compare_values=compare_values)
+337	        return a_key, b_key
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/sql.py
+ Line number: 358
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+357	                    if a_key is None:
+358	                        assert case_a[a]._annotations.get("nocache")
+359	                    if b_key is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/fixtures/sql.py
+ Line number: 360
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+359	                    if b_key is None:
+360	                        assert case_b[b]._annotations.get("nocache")
+361	                    continue
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/bootstrap.py
+ Line number: 39
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+38	    spec = importlib.util.spec_from_file_location(name, path)
+39	    assert spec is not None
+40	    assert spec.loader is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/bootstrap.py
+ Line number: 40
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+39	    assert spec is not None
+40	    assert spec.loader is not None
+41	    mod = importlib.util.module_from_spec(spec)
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/plugin/pytestplugin.py
+ Line number: 645
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+644	        # in format_argpsec_plus()
+645	        exec(code, env)
+646	        return env[fn_name]
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_ddl.py
+ Line number: 214
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+213	                "_".join(
+214	                    "".join(random.choice("abcdef") for j in range(20))
+215	                    for i in range(10)
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_ddl.py
+ Line number: 259
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+258	                "_".join(
+259	                    "".join(random.choice("abcdef") for j in range(30))
+260	                    for i in range(10)
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_ddl.py
+ Line number: 287
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+286	                "_".join(
+287	                    "".join(random.choice("abcdef") for j in range(30))
+288	                    for i in range(10)
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_ddl.py
+ Line number: 315
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+314	                "_".join(
+315	                    "".join(random.choice("abcdef") for j in range(30))
+316	                    for i in range(10)
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_ddl.py
+ Line number: 343
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+342	                "_".join(
+343	                    "".join(random.choice("abcdef") for j in range(30))
+344	                    for i in range(10)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_ddl.py
+ Line number: 379
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+378	
+379	        assert len(actual_name) > 255
+380	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_dialect.py
+ Line number: 143
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+142	                conn.execute(select(literal_column("méil")))
+143	                assert False
+144	            except exc.DBAPIError as err:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_dialect.py
+ Line number: 147
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+146	
+147	                assert str(err.orig) in str(err)
+148	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_dialect.py
+ Line number: 149
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+148	
+149	            assert isinstance(err_str, str)
+150	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 161
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+160	        r = connection.execute(stmt, data)
+161	        assert not r.returns_rows
+162	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 168
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+167	        )
+168	        assert r._soft_closed
+169	        assert not r.closed
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 169
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+168	        assert r._soft_closed
+169	        assert not r.closed
+170	        assert r.is_insert
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 170
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+169	        assert not r.closed
+170	        assert r.is_insert
+171	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 177
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+176	        # case, the row had to have been consumed at least.
+177	        assert not r.returns_rows or r.fetchone() is None
+178	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 188
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+187	        )
+188	        assert r._soft_closed
+189	        assert not r.closed
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 189
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+188	        assert r._soft_closed
+189	        assert not r.closed
+190	        assert r.is_insert
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 190
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+189	        assert not r.closed
+190	        assert r.is_insert
+191	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 196
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+195	        # "returns rows"
+196	        assert r.returns_rows
+197	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 210
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+209	        r = connection.execute(self.tables.autoinc_pk.insert())
+210	        assert r._soft_closed
+211	        assert not r.closed
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 211
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+210	        assert r._soft_closed
+211	        assert not r.closed
+212	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 223
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+222	        r = connection.execute(self.tables.autoinc_pk.insert(), [{}, {}, {}])
+223	        assert r._soft_closed
+224	        assert not r.closed
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_insert.py
+ Line number: 224
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+223	        assert r._soft_closed
+224	        assert not r.closed
+225	
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 111
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+110	            query = (
+111	                "CREATE VIEW %s.vv AS SELECT id, data FROM %s.test_table_s"
+112	                % (
+113	                    config.test_schema,
+114	                    config.test_schema,
+115	                )
+116	            )
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 149
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+148	                DDL(
+149	                    "create temporary view user_tmp_v as "
+150	                    "select * from user_tmp_%s" % config.ident
+151	                ),
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 263
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+262	        meth = self._has_index(kind, connection)
+263	        assert meth("test_table", "my_idx")
+264	        assert not meth("test_table", "my_idx_s")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 264
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+263	        assert meth("test_table", "my_idx")
+264	        assert not meth("test_table", "my_idx_s")
+265	        assert not meth("nonexistent_table", "my_idx")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 265
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+264	        assert not meth("test_table", "my_idx_s")
+265	        assert not meth("nonexistent_table", "my_idx")
+266	        assert not meth("test_table", "nonexistent_idx")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 266
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+265	        assert not meth("nonexistent_table", "my_idx")
+266	        assert not meth("test_table", "nonexistent_idx")
+267	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 268
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+267	
+268	        assert not meth("test_table", "my_idx_2")
+269	        assert not meth("test_table_2", "my_idx_3")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 269
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+268	        assert not meth("test_table", "my_idx_2")
+269	        assert not meth("test_table_2", "my_idx_3")
+270	        idx = Index("my_idx_2", self.tables.test_table.c.data2)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 281
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+280	            if kind == "inspector":
+281	                assert not meth("test_table", "my_idx_2")
+282	                assert not meth("test_table_2", "my_idx_3")
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 282
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+281	                assert not meth("test_table", "my_idx_2")
+282	                assert not meth("test_table_2", "my_idx_3")
+283	                meth.__self__.clear_cache()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 284
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+283	                meth.__self__.clear_cache()
+284	            assert meth("test_table", "my_idx_2") is True
+285	            assert meth("test_table_2", "my_idx_3") is True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 285
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+284	            assert meth("test_table", "my_idx_2") is True
+285	            assert meth("test_table_2", "my_idx_3") is True
+286	        finally:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 294
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+293	        meth = self._has_index(kind, connection)
+294	        assert meth("test_table", "my_idx_s", schema=config.test_schema)
+295	        assert not meth("test_table", "my_idx", schema=config.test_schema)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 295
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+294	        assert meth("test_table", "my_idx_s", schema=config.test_schema)
+295	        assert not meth("test_table", "my_idx", schema=config.test_schema)
+296	        assert not meth(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 296
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+295	        assert not meth("test_table", "my_idx", schema=config.test_schema)
+296	        assert not meth(
+297	            "nonexistent_table", "my_idx_s", schema=config.test_schema
+298	        )
+299	        assert not meth(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 299
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+298	        )
+299	        assert not meth(
+300	            "test_table", "nonexistent_idx_s", schema=config.test_schema
+301	        )
+302	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 369
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+368	
+369	        assert o2.c.ref.references(t1.c[0])
+370	        if use_composite:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 371
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+370	        if use_composite:
+371	            assert o2.c.ref2.references(t1.c[1])
+372	
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 513
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+512	            for name in names:
+513	                query = "CREATE VIEW %s AS SELECT * FROM %s" % (
+514	                    config.db.dialect.identifier_preparer.quote(
+515	                        "view %s" % name
+516	                    ),
+517	                    config.db.dialect.identifier_preparer.quote(name),
+518	                )
+519	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 553
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+552	        insp = inspect(config.db)
+553	        assert insp.get_view_definition("view %s" % name)
+554	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 558
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+557	        insp = inspect(config.db)
+558	        assert insp.get_columns(name)
+559	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 563
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+562	        insp = inspect(config.db)
+563	        assert insp.get_pk_constraint(name)
+564	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 569
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+568	        insp = inspect(config.db)
+569	        assert insp.get_foreign_keys(name)
+570	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 575
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+574	        insp = inspect(config.db)
+575	        assert insp.get_indexes(name)
+576	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 581
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+580	        insp = inspect(config.db)
+581	        assert insp.get_unique_constraints(name)
+582	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 587
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+586	        insp = inspect(config.db)
+587	        assert insp.get_table_comment(name)
+588	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 593
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+592	        insp = inspect(config.db)
+593	        assert insp.get_check_constraints(name)
+594	
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 845
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+844	                DDL(
+845	                    "create temporary view user_tmp_v as "
+846	                    "select * from user_tmp_%s" % config.ident
+847	                ),
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 864
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+863	            query = (
+864	                f"CREATE {prefix}VIEW {view_name} AS SELECT * FROM {fullname}"
+865	            )
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 1573
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1572	        inspect(engine)
+1573	        assert hasattr(engine.dialect, "default_schema_name")
+1574	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 1757
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1756	                if not col.primary_key:
+1757	                    assert cols[i]["default"] is None
+1758	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 2057
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2056	        index_names = [idx["name"] for idx in indexes]
+2057	        assert idx_name in index_names, f"Expected {idx_name} in {index_names}"
+2058	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 2174
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2173	
+2174	        assert not idx_names.intersection(uq_names)
+2175	        if names_that_duplicate_index:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 2258
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2257	            id_ = {c["name"]: c for c in cols}[cname]
+2258	            assert id_.get("autoincrement", True)
+2259	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 2697
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2696	        m.reflect(connection)
+2697	        assert set(m.tables).intersection(["empty"])
+2698	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 3037
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3036	        ):
+3037	            assert isinstance(typ, sql_types.Numeric)
+3038	            eq_(typ.precision, 18)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 3053
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3052	        if issubclass(type_, sql_types.VARCHAR):
+3053	            assert isinstance(typ, sql_types.VARCHAR)
+3054	        elif issubclass(type_, sql_types.CHAR):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 3055
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3054	        elif issubclass(type_, sql_types.CHAR):
+3055	            assert isinstance(typ, sql_types.CHAR)
+3056	        else:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 3057
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3056	        else:
+3057	            assert isinstance(typ, sql_types.String)
+3058	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 3060
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3059	        eq_(typ.length, 52)
+3060	        assert isinstance(typ.length, int)
+3061	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 3238
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3237	        t1_ref = m2.tables["t1"]
+3238	        assert t2_ref.c.t1id.references(t1_ref.c.id)
+3239	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_reflection.py
+ Line number: 3244
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3243	        )
+3244	        assert m3.tables["t2"].c.t1id.references(m3.tables["t1"].c.id)
+3245	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_results.py
+ Line number: 384
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+383	            ).exec_driver_sql(self.stringify("select 1"))
+384	            assert self._is_server_side(result.cursor)
+385	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_results.py
+ Line number: 408
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+407	            result = conn.execution_options(stream_results=False).execute(s)
+408	            assert not self._is_server_side(result.cursor)
+409	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_results.py
+ Line number: 421
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+420	            result = conn.execute(s1.select())
+421	            assert not self._is_server_side(result.cursor)
+422	            result.close()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_results.py
+ Line number: 427
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+426	            result = conn.execute(s2)
+427	            assert not self._is_server_side(result.cursor)
+428	            result.close()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_rowcount.py
+ Line number: 116
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+115	
+116	        assert r.rowcount in (-1, 3)
+117	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_rowcount.py
+ Line number: 127
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+126	        )
+127	        assert r.rowcount == 3
+128	
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_select.py
+ Line number: 1067
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+1066	            CursorSQL(
+1067	                "SELECT some_table.id \nFROM some_table "
+1068	                "\nWHERE (some_table.x, some_table.y) "
+1069	                "IN (%s(5, 10), (12, 18))"
+1070	                % ("VALUES " if config.db.dialect.tuple_in_values else ""),
+1071	                () if config.db.dialect.positional else {},
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_select.py
+ Line number: 1091
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+1090	            CursorSQL(
+1091	                "SELECT some_table.id \nFROM some_table "
+1092	                "\nWHERE (some_table.x, some_table.z) "
+1093	                "IN (%s(5, 'z1'), (12, 'z3'))"
+1094	                % ("VALUES " if config.db.dialect.tuple_in_values else ""),
+1095	                () if config.db.dialect.positional else {},
+
+
+ + +
+
+ +
+
+ hardcoded_sql_expressions: Possible SQL injection vector through string-based query construction.
+ Test ID: B608
+ Severity: MEDIUM
+ Confidence: LOW
+ CWE: CWE-89
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_sequence.py
+ Line number: 185
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b608_hardcoded_sql_expressions.html
+ +
+
+184	            stmt,
+185	            "INSERT INTO x (y, q) VALUES (%s, 5)" % (seq_nextval,),
+186	            literal_binds=True,
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 127
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+126	            rows = connection.execute(stmt).all()
+127	            assert rows, "No rows returned"
+128	            for row in rows:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 132
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+131	                    value = filter_(value)
+132	                assert value in output
+133	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 175
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+174	        eq_(row, (self.data,))
+175	        assert isinstance(row[0], str)
+176	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 190
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+189	        for row in rows:
+190	            assert isinstance(row[0], str)
+191	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 601
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+600	        eq_(row, (compare,))
+601	        assert isinstance(row[0], type(compare))
+602	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 616
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+615	        eq_(row, (compare,))
+616	        assert isinstance(row[0], type(compare))
+617	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 857
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+856	
+857	            assert isinstance(row[0], int)
+858	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 1249
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1248	        eq_(row, (True, False))
+1249	        assert isinstance(row[0], bool)
+1250	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 1659
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1658	        else:
+1659	            assert False
+1660	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_types.py
+ Line number: 1716
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1715	        else:
+1716	            assert False
+1717	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 48
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+47	        )
+48	        assert not r.is_insert
+49	        assert not r.returns_rows
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 49
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+48	        assert not r.is_insert
+49	        assert not r.returns_rows
+50	        assert r.rowcount == 1
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 50
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+49	        assert not r.returns_rows
+50	        assert r.rowcount == 1
+51	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 60
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+59	        r = connection.execute(t.delete().where(t.c.id == 2))
+60	        assert not r.is_insert
+61	        assert not r.returns_rows
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 61
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+60	        assert not r.is_insert
+61	        assert not r.returns_rows
+62	        assert r.rowcount == 1
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 62
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+61	        assert not r.returns_rows
+62	        assert r.rowcount == 1
+63	        eq_(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 85
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+84	        r = connection.execute(stmt, dict(data="d2_new"))
+85	        assert not r.is_insert
+86	        assert r.returns_rows
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 86
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+85	        assert not r.is_insert
+86	        assert r.returns_rows
+87	        eq_(r.keys(), ["id", "data"])
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 120
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+119	        r = connection.execute(stmt)
+120	        assert not r.is_insert
+121	        assert r.returns_rows
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/suite/test_update_delete.py
+ Line number: 121
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+120	        assert not r.is_insert
+121	        assert r.returns_rows
+122	        eq_(r.keys(), ["id", "data"])
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with pickle module.
+ Test ID: B403
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-502
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/util.py
+ Line number: 18
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b403-import-pickle
+ +
+
+17	from itertools import chain
+18	import pickle
+19	import random
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/util.py
+ Line number: 67
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+66	def random_choices(population, k=1):
+67	    return random.choices(population, k=k)
+68	
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/util.py
+ Line number: 87
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+86	    def pop(self):
+87	        index = random.randint(0, len(self) - 1)
+88	        item = list(set.__iter__(self))[index]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/util.py
+ Line number: 192
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+191	def fail(msg):
+192	    assert False, msg
+193	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/testing/util.py
+ Line number: 407
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+406	    if schema is not None:
+407	        assert consider_schemas == (
+408	            None,
+409	        ), "consider_schemas and schema are mutually exclusive"
+410	        consider_schemas = (schema,)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py
+ Line number: 276
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+275	            self._lazy_init()
+276	            assert self._loop
+277	            return self._loop
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/_concurrency_py3k.py
+ Line number: 281
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+280	            self._lazy_init()
+281	            assert self._loop
+282	            return self._loop.run_until_complete(coro)
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/compat.py
+ Line number: 105
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+104	            ann = _get_dunder_annotations(obj)
+105	        except Exception:
+106	            pass
+107	        else:
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak MD5 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/compat.py
+ Line number: 222
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+221	    def md5_not_for_security() -> Any:
+222	        return hashlib.md5()
+223	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py
+ Line number: 139
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+138	    def decorate(fn: _F) -> _F:
+139	        assert message is not None
+140	        assert warning is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py
+ Line number: 140
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+139	        assert message is not None
+140	        assert warning is not None
+141	        return _decorate_with_warning(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py
+ Line number: 184
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+183	        if not attribute_ok:
+184	            assert kw.get("enable_warnings") is False, (
+185	                "attribute %s will emit a warning on read access.  "
+186	                "If you *really* want this, "
+187	                "add warn_on_attribute_access=True.  Otherwise please add "
+188	                "enable_warnings=False." % api_name
+189	            )
+190	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py
+ Line number: 265
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+264	            ):
+265	                assert check_any_kw is not None
+266	                _warn_with_version(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py
+ Line number: 347
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+346	        if constructor is not None:
+347	            assert constructor_fn is not None
+348	            assert wtype is not None
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/deprecations.py
+ Line number: 348
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+347	            assert constructor_fn is not None
+348	            assert wtype is not None
+349	            setattr(
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 115
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+114	    ) -> NoReturn:
+115	        assert self._exc_info is not None
+116	        # see #2703 for notes
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 119
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+118	            exc_type, exc_value, exc_tb = self._exc_info
+119	            assert exc_value is not None
+120	            self._exc_info = None  # remove potential circular references
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 124
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+123	            self._exc_info = None  # remove potential circular references
+124	            assert value is not None
+125	            raise value.with_traceback(traceback)
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 316
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+315	) -> Callable[..., Any]:
+316	    exec(code, env)
+317	    return env[fn_name]  # type: ignore[no-any-return]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 422
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+421	        _set = set()
+422	    assert _set is not None
+423	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 769
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+768	            if default_len:
+769	                assert spec.defaults
+770	                kw_args.update(
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 792
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+791	                output.append("%s=%r" % (arg, val))
+792	        except Exception:
+793	            pass
+794	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 801
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+800	                    output.append("%s=%r" % (arg, val))
+801	            except Exception:
+802	                pass
+803	
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 950
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+949	        )
+950	        exec(py, env)
+951	        try:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 1204
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1203	        for elem in self._memoized_keys:
+1204	            assert elem not in self.__dict__
+1205	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 1484
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1483	            for key in dictlike.iterkeys():
+1484	                assert getter is not None
+1485	                yield key, getter(key)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 1546
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1545	    def __set__(self, instance: Any, value: Any) -> None:
+1546	        assert self.setfn is not None
+1547	        self.setfn(instance, value)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 1605
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1604	            if sym is None:
+1605	                assert isinstance(name, str)
+1606	                if canonical is None:
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/langhelpers.py
+ Line number: 1944
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+1943	    env = locals().copy()
+1944	    exec(code, env)
+1945	    return env["set"]
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/tool_support.py
+ Line number: 24
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+23	import shutil
+24	import subprocess
+25	import sys
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/tool_support.py
+ Line number: 46
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+45	        self.pyproject_toml_path = self.source_root / Path("pyproject.toml")
+46	        assert self.pyproject_toml_path.exists()
+47	
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/tool_support.py
+ Line number: 109
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+108	
+109	        subprocess.run(
+110	            [
+111	                sys.executable,
+112	                "-c",
+113	                "import %s; %s.%s()" % (impl.module, impl.module, impl.attr),
+114	            ]
+115	            + cmdline_options_list,
+116	            cwd=str(self.source_root),
+117	            **kw,
+118	        )
+119	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/tool_support.py
+ Line number: 166
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+165	        else:
+166	            assert False, "source or source_file is required"
+167	
+
+
+ + +
+
+ +
+
+ blacklist: Use of possibly insecure function - consider using safer ast.literal_eval.
+ Test ID: B307
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/typing.py
+ Line number: 274
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b307-eval
+ +
+
+273	
+274	            annotation = eval(expression, cls_namespace, locals_)
+275	        else:
+
+
+ + +
+
+ +
+
+ blacklist: Use of possibly insecure function - consider using safer ast.literal_eval.
+ Test ID: B307
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/sqlalchemy/util/typing.py
+ Line number: 276
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b307-eval
+ +
+
+275	        else:
+276	            annotation = eval(expression, base_globals, locals_)
+277	    except Exception as err:
+
+
+ + +
+
+ +
+
+ hardcoded_tmp_directory: Probable insecure usage of temp file/directory.
+ Test ID: B108
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-377
+ File: ./venv/lib/python3.12/site-packages/stevedore/_cache.py
+ Line number: 153
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b108_hardcoded_tmp_directory.html
+ +
+
+152	                os.path.isfile(os.path.join(self._dir, '.disable')),
+153	                sys.executable[0:4] == '/tmp',  # noqa: S108,
+154	            ]
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/stevedore/example/load_as_driver.py
+ Line number: 42
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+41	    # okay because invoke_on_load is true
+42	    assert isinstance(mgr.driver, FormatterBase)
+43	    for chunk in mgr.driver.format(data):
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/stevedore/example/load_as_extension.py
+ Line number: 44
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+43	    ) -> tuple[str, Iterable[str]]:
+44	        assert ext.obj is not None
+45	        return (ext.name, ext.obj.format(data))
+
+
+ + +
+
+ +
+
+ hardcoded_tmp_directory: Probable insecure usage of temp file/directory.
+ Test ID: B108
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-377
+ File: ./venv/lib/python3.12/site-packages/stevedore/tests/test_cache.py
+ Line number: 28
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b108_hardcoded_tmp_directory.html
+ +
+
+27	        """
+28	        with mock.patch.object(sys, 'executable', '/tmp/fake'):
+29	            sot = _cache.Cache()
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/stevedore/tests/test_extension.py
+ Line number: 86
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+85	        else:
+86	            assert False, 'Failed to raise KeyError'
+87	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/stevedore/tests/test_extension.py
+ Line number: 141
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+140	        for e in em.extensions:
+141	            assert e.obj is not None
+142	            self.assertEqual(e.obj.args, ('a',))
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/stevedore/tests/test_extension.py
+ Line number: 198
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+197	            em.map(mapped, 1, 2, a='A', b='B')
+198	            assert False
+199	        except RuntimeError:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/stevedore/tests/test_hook.py
+ Line number: 60
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+59	        else:
+60	            assert False, 'Failed to raise KeyError'
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/stevedore/tests/test_test_manager.py
+ Line number: 154
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+153	        # This will raise KeyError if the names don't match
+154	        assert em[test_extension.name]
+155	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 411
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+410	                            deduped_pairs.remove(pair)
+411	                    assert not deduped_pairs, deduped_pairs
+412	                    parameters = tuple(new_parameters)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 1815
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+1814	                if len(params) == 1 and not typing._is_param_expr(args[0]):
+1815	                    assert i == 0
+1816	                    args = (args,)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 2020
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2019	                    if len(params) == 1 and not _is_param_expr(args[0]):
+2020	                        assert i == 0
+2021	                        args = (args,)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 2500
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2499	        def __typing_unpacked_tuple_args__(self):
+2500	            assert self.__origin__ is Unpack
+2501	            assert len(self.__args__) == 1
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 2501
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2500	            assert self.__origin__ is Unpack
+2501	            assert len(self.__args__) == 1
+2502	            arg, = self.__args__
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 2511
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2510	        def __typing_is_unpacked_typevartuple__(self):
+2511	            assert self.__origin__ is Unpack
+2512	            assert len(self.__args__) == 1
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 2512
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+2511	            assert self.__origin__ is Unpack
+2512	            assert len(self.__args__) == 1
+2513	            return isinstance(self.__args__[0], TypeVarTuple)
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 3310
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3309	        def __new__(cls, typename, bases, ns):
+3310	            assert _NamedTuple in bases
+3311	            for base in bases:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 3382
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+3381	    def _namedtuple_mro_entries(bases):
+3382	        assert NamedTuple in bases
+3383	        return (_NamedTuple,)
+
+
+ + +
+
+ +
+
+ blacklist: Use of possibly insecure function - consider using safer ast.literal_eval.
+ Test ID: B307
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 4034
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b307-eval
+ +
+
+4033	        return_value = {key:
+4034	            value if not isinstance(value, str) else eval(value, globals, locals)
+4035	            for key, value in ann.items() }
+
+
+ + +
+
+ +
+
+ blacklist: Use of possibly insecure function - consider using safer ast.literal_eval.
+ Test ID: B307
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/typing_extensions.py
+ Line number: 4116
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b307-eval
+ +
+
+4115	            code = forward_ref.__forward_code__
+4116	            value = eval(code, globals, locals)
+4117	        forward_ref.__forward_evaluated__ = True
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/_internal.py
+ Line number: 39
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+38	    env = getattr(obj, "environ", obj)
+39	    assert isinstance(env, dict), (
+40	        f"{type(obj).__name__!r} is not a WSGI environment (has to be a dict)"
+41	    )
+42	    return env
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/werkzeug/_reloader.py
+ Line number: 5
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+4	import os
+5	import subprocess
+6	import sys
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/werkzeug/_reloader.py
+ Line number: 275
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+274	            new_environ["WERKZEUG_RUN_MAIN"] = "true"
+275	            exit_code = subprocess.call(args, env=new_environ, close_fds=False)
+276	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/datastructures/file_storage.py
+ Line number: 142
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+141	            self.stream.close()
+142	        except Exception:
+143	            pass
+144	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/datastructures/range.py
+ Line number: 178
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+177	        """Simple method to update the ranges."""
+178	        assert http.is_byte_range_valid(start, stop, length), "Bad range provided"
+179	        self._units: str | None = units
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/werkzeug/debug/__init__.py
+ Line number: 45
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+44	def hash_pin(pin: str) -> str:
+45	    return hashlib.sha1(f"{pin} added salt".encode("utf-8", "replace")).hexdigest()[:12]
+46	
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/werkzeug/debug/__init__.py
+ Line number: 88
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+87	            # https://github.com/pallets/werkzeug/issues/925
+88	            from subprocess import PIPE
+89	            from subprocess import Popen
+
+
+ + +
+
+ +
+
+ blacklist: Consider possible security implications associated with the subprocess module.
+ Test ID: B404
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/werkzeug/debug/__init__.py
+ Line number: 89
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_imports.html#b404-import-subprocess
+ +
+
+88	            from subprocess import PIPE
+89	            from subprocess import Popen
+90	
+
+
+ + +
+
+ +
+
+ start_process_with_partial_path: Starting a process with a partial executable path
+ Test ID: B607
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/werkzeug/debug/__init__.py
+ Line number: 91
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b607_start_process_with_partial_path.html
+ +
+
+90	
+91	            dump = Popen(
+92	                ["ioreg", "-c", "IOPlatformExpertDevice", "-d", "2"], stdout=PIPE
+93	            ).communicate()[0]
+94	            match = re.search(b'"serial-number" = <([^>]+)', dump)
+
+
+ + +
+
+ +
+
+ subprocess_without_shell_equals_true: subprocess call - check for execution of untrusted input.
+ Test ID: B603
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/werkzeug/debug/__init__.py
+ Line number: 91
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b603_subprocess_without_shell_equals_true.html
+ +
+
+90	
+91	            dump = Popen(
+92	                ["ioreg", "-c", "IOPlatformExpertDevice", "-d", "2"], stdout=PIPE
+93	            ).communicate()[0]
+94	            match = re.search(b'"serial-number" = <([^>]+)', dump)
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/werkzeug/debug/__init__.py
+ Line number: 196
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+195	
+196	    h = hashlib.sha1()
+197	    for bit in chain(probably_public_bits, private_bits):
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/werkzeug/debug/console.py
+ Line number: 177
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+176	        try:
+177	            exec(code, self.locals)
+178	        except Exception:
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/debug/repr.py
+ Line number: 260
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+259	                    items.append((key, self.repr(getattr(obj, key))))
+260	                except Exception:
+261	                    pass
+262	            title = "Details for"
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/werkzeug/http.py
+ Line number: 1019
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+1018	    """
+1019	    return sha1(data).hexdigest()
+1020	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/middleware/lint.py
+ Line number: 223
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+222	                )
+223	            except Exception:
+224	                pass
+225	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/routing/map.py
+ Line number: 729
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+728	        """
+729	        assert self.map.redirect_defaults
+730	        for r in self.map._rules_by_endpoint[rule.endpoint]:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/routing/map.py
+ Line number: 784
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+783	            url += f"?{self.encode_query_args(query_args)}"
+784	        assert url != path, "detected invalid alias setting. No canonical URL found"
+785	        return url
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/routing/rules.py
+ Line number: 700
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+699	        """Compiles the regular expression and stores it."""
+700	        assert self.map is not None, "rule not bound"
+701	
+
+
+ + +
+
+ +
+
+ exec_used: Use of exec detected.
+ Test ID: B102
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-78
+ File: ./venv/lib/python3.12/site-packages/werkzeug/routing/rules.py
+ Line number: 736
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b102_exec_used.html
+ +
+
+735	        locs: dict[str, t.Any] = {}
+736	        exec(code, globs, locs)
+737	        return locs[name]  # type: ignore
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/serving.py
+ Line number: 262
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+261	            nonlocal status_sent, headers_sent, chunk_response
+262	            assert status_set is not None, "write() before start_response"
+263	            assert headers_set is not None, "write() before start_response"
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/serving.py
+ Line number: 263
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+262	            assert status_set is not None, "write() before start_response"
+263	            assert headers_set is not None, "write() before start_response"
+264	            if status_sent is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/serving.py
+ Line number: 303
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+302	
+303	            assert isinstance(data, bytes), "applications must write bytes"
+304	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/serving.py
+ Line number: 388
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+387	                execute(InternalServerError())
+388	            except Exception:
+389	                pass
+390	
+
+
+ + +
+
+ +
+
+ hardcoded_bind_all_interfaces: Possible binding to all interfaces.
+ Test ID: B104
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-605
+ File: ./venv/lib/python3.12/site-packages/werkzeug/serving.py
+ Line number: 849
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b104_hardcoded_bind_all_interfaces.html
+ +
+
+848	
+849	            if self.host in {"0.0.0.0", "::"}:
+850	                messages.append(f" * Running on all addresses ({self.host})")
+
+
+ + +
+
+ +
+
+ hardcoded_bind_all_interfaces: Possible binding to all interfaces.
+ Test ID: B104
+ Severity: MEDIUM
+ Confidence: MEDIUM
+ CWE: CWE-605
+ File: ./venv/lib/python3.12/site-packages/werkzeug/serving.py
+ Line number: 852
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b104_hardcoded_bind_all_interfaces.html
+ +
+
+851	
+852	                if self.host == "0.0.0.0":
+853	                    localhost = "127.0.0.1"
+
+
+ + +
+
+ +
+
+ blacklist: Standard pseudo-random generators are not suitable for security/cryptographic purposes.
+ Test ID: B311
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-330
+ File: ./venv/lib/python3.12/site-packages/werkzeug/test.py
+ Line number: 68
+ More info: https://bandit.readthedocs.io/en/1.9.4/blacklists/blacklist_calls.html#b311-random
+ +
+
+67	    if boundary is None:
+68	        boundary = f"---------------WerkzeugFormPart_{time()}{random()}"
+69	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/test.py
+ Line number: 646
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+645	            self.close()
+646	        except Exception:
+647	            pass
+648	
+
+
+ + +
+
+ +
+
+ try_except_pass: Try, Except, Pass detected.
+ Test ID: B110
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/werkzeug/test.py
+ Line number: 663
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b110_try_except_pass.html
+ +
+
+662	                f.close()
+663	            except Exception:
+664	                pass
+665	        self.closed = True
+
+
+ + +
+
+ +
+
+ hashlib: Use of weak SHA1 hash for security. Consider usedforsecurity=False
+ Test ID: B324
+ Severity: HIGH
+ Confidence: HIGH
+ CWE: CWE-327
+ File: ./venv/lib/python3.12/site-packages/wtforms/csrf/session.py
+ Line number: 47
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b324_hashlib.html
+ +
+
+46	        if "csrf" not in session:
+47	            session["csrf"] = sha1(os.urandom(64)).hexdigest()
+48	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/wtforms/fields/core.py
+ Line number: 445
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+444	        text = escape(text or self.text)
+445	        return Markup(f"<label {attributes}>{text}</label>")
+446	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/wtforms/fields/list.py
+ Line number: 53
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+52	            )
+53	        assert isinstance(
+54	            unbound_field, UnboundField
+55	        ), "Field must be unbound, not a field class"
+56	        self.unbound_field = unbound_field
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/wtforms/fields/list.py
+ Line number: 156
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+155	    def _add_entry(self, formdata=None, data=unset_value, index=None):
+156	        assert (
+157	            not self.max_entries or len(self.entries) < self.max_entries
+158	        ), "You cannot have more than max_entries entries in this FieldList"
+159	        if index is None:
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/wtforms/validators.py
+ Line number: 123
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+122	    def __init__(self, min=-1, max=-1, message=None):
+123	        assert (
+124	            min != -1 or max != -1
+125	        ), "At least one of `min` or `max` must be specified."
+126	        assert max == -1 or min <= max, "`min` cannot be more than `max`."
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/wtforms/validators.py
+ Line number: 126
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+125	        ), "At least one of `min` or `max` must be specified."
+126	        assert max == -1 or min <= max, "`min` cannot be more than `max`."
+127	        self.min = min
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/wtforms/widgets/core.py
+ Line number: 100
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+99	    def __init__(self, html_tag="ul", prefix_label=True):
+100	        assert html_tag in ("ol", "ul")
+101	        self.html_tag = html_tag
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/wtforms/widgets/core.py
+ Line number: 113
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+112	        html.append(f"</{self.html_tag}>")
+113	        return Markup("".join(html))
+114	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/wtforms/widgets/core.py
+ Line number: 150
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+149	            html.append(hidden)
+150	        return Markup("".join(html))
+151	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/wtforms/widgets/core.py
+ Line number: 179
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+178	        input_params = self.html_params(name=field.name, **kwargs)
+179	        return Markup(f"<input {input_params}>")
+180	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/wtforms/widgets/core.py
+ Line number: 328
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+327	        textarea_innerhtml = escape(field._value())
+328	        return Markup(
+329	            f"<textarea {textarea_params}>\r\n{textarea_innerhtml}</textarea>"
+330	        )
+331	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/wtforms/widgets/core.py
+ Line number: 377
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+376	        html.append("</select>")
+377	        return Markup("".join(html))
+378	
+
+
+ + +
+
+ +
+
+ markupsafe_markup_xss: Potential XSS with ``markupsafe.Markup`` detected. Do not use ``Markup`` on untrusted data.
+ Test ID: B704
+ Severity: MEDIUM
+ Confidence: HIGH
+ CWE: CWE-79
+ File: ./venv/lib/python3.12/site-packages/wtforms/widgets/core.py
+ Line number: 388
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b704_markupsafe_markup_xss.html
+ +
+
+387	            options["selected"] = True
+388	        return Markup(f"<option {html_params(**options)}>{escape(label)}</option>")
+389	
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/yaml/parser.py
+ Line number: 185
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+184	            event = StreamEndEvent(token.start_mark, token.end_mark)
+185	            assert not self.states
+186	            assert not self.marks
+
+
+ + +
+
+ +
+
+ assert_used: Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
+ Test ID: B101
+ Severity: LOW
+ Confidence: HIGH
+ CWE: CWE-703
+ File: ./venv/lib/python3.12/site-packages/yaml/parser.py
+ Line number: 186
+ More info: https://bandit.readthedocs.io/en/1.9.4/plugins/b101_assert_used.html
+ +
+
+185	            assert not self.states
+186	            assert not self.marks
+187	            self.state = None
+
+
+ + +
+
+ +
+ + + diff --git a/Python/Flask_Blog/11-Blueprints/instance/site.db b/Python/Flask_Blog/11-Blueprints/instance/site.db new file mode 100644 index 0000000000000000000000000000000000000000..ae845bf897869acb8b09e55f33a1d7cdc250d5e8 GIT binary patch literal 20480 zcmeI(O^?z*7zgm_0`5YBH711XB$6!68UpOPG4Zk$hZlkFQi|C@g3zun1y;gBOhqec!p5@VF@_!R%OMsRV#Kc$uSwq}5&rXQm6cM^<#A@@JYU**rdfdT;tKmY;|fB*y_009U< z00Ms&m`#HF@mNfHU-hhJ*BK7Ro~WUm&Qya@Lw#OhRP@kfB<$L>q#3NhbgG>jRBKc! zk7*?Axn9?yuT(u(RP|&gomSR{ZOd~^F@p+< znOkmpp_i(venrddiY8rK5evzm>#S7JL|^jfcNMC$Jkyz$V|6O}{NRW(dne8FHvPQC zh^TvOdC%jw<}HT%R&SYlb|Z7AXSv-a%;vD$vpSC1c31E=Lx$FP{AMt+e@$|_af{zE zG_+E!!KhCl*5}(SI{h^%5#=y&Fa9hh5w~wUZ^t)XzGXM9i8t`CO_7?J73bjL-d_VV zB2et@55$ix%Bv)QB>X^u00bZa0SG_<0uX=z1Rwwb2teQ;2sEXA5h1KlI4VEQTc?)=Z&JQ)<)1W1#h0zL zk 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/Python/Flask_Blog/11-Blueprints/venv/bin/activate b/Python/Flask_Blog/11-Blueprints/venv/bin/activate new file mode 100644 index 000000000..11040b145 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/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/zarmeena/SecureApp-Sprint-Flask-Blog-App/Python/Flask_Blog/11-Blueprints/venv) +else + # use the path as-is + export VIRTUAL_ENV=/home/zarmeena/SecureApp-Sprint-Flask-Blog-App/Python/Flask_Blog/11-Blueprints/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/Python/Flask_Blog/11-Blueprints/venv/bin/activate.csh b/Python/Flask_Blog/11-Blueprints/venv/bin/activate.csh new file mode 100644 index 000000000..5eb93bc53 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/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/zarmeena/SecureApp-Sprint-Flask-Blog-App/Python/Flask_Blog/11-Blueprints/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/Python/Flask_Blog/11-Blueprints/venv/bin/activate.fish b/Python/Flask_Blog/11-Blueprints/venv/bin/activate.fish new file mode 100644 index 000000000..a3ae67c78 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/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/zarmeena/SecureApp-Sprint-Flask-Blog-App/Python/Flask_Blog/11-Blueprints/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/Python/Flask_Blog/11-Blueprints/venv/bin/bandit b/Python/Flask_Blog/11-Blueprints/venv/bin/bandit new file mode 100755 index 000000000..54ad50b74 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/bin/bandit @@ -0,0 +1,8 @@ +#!/home/zarmeena/SecureApp-Sprint-Flask-Blog-App/Python/Flask_Blog/11-Blueprints/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from bandit.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/Python/Flask_Blog/11-Blueprints/venv/bin/bandit-baseline b/Python/Flask_Blog/11-Blueprints/venv/bin/bandit-baseline new file mode 100755 index 000000000..3a1d32079 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/bin/bandit-baseline @@ -0,0 +1,8 @@ +#!/home/zarmeena/SecureApp-Sprint-Flask-Blog-App/Python/Flask_Blog/11-Blueprints/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from bandit.cli.baseline import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Python/Flask_Blog/11-Blueprints/venv/bin/bandit-config-generator b/Python/Flask_Blog/11-Blueprints/venv/bin/bandit-config-generator new file mode 100755 index 000000000..f53fcc4fe --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/bin/bandit-config-generator @@ -0,0 +1,8 @@ +#!/home/zarmeena/SecureApp-Sprint-Flask-Blog-App/Python/Flask_Blog/11-Blueprints/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from bandit.cli.config_generator import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Python/Flask_Blog/11-Blueprints/venv/bin/email_validator b/Python/Flask_Blog/11-Blueprints/venv/bin/email_validator new file mode 100755 index 000000000..fcfae1eb0 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/bin/email_validator @@ -0,0 +1,8 @@ +#!/home/zarmeena/SecureApp-Sprint-Flask-Blog-App/Python/Flask_Blog/11-Blueprints/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from email_validator.__main__ import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Python/Flask_Blog/11-Blueprints/venv/bin/flask b/Python/Flask_Blog/11-Blueprints/venv/bin/flask new file mode 100755 index 000000000..6bced877d --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/bin/flask @@ -0,0 +1,8 @@ +#!/home/zarmeena/SecureApp-Sprint-Flask-Blog-App/Python/Flask_Blog/11-Blueprints/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from flask.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Python/Flask_Blog/11-Blueprints/venv/bin/markdown-it b/Python/Flask_Blog/11-Blueprints/venv/bin/markdown-it new file mode 100755 index 000000000..1e283e63d --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/bin/markdown-it @@ -0,0 +1,8 @@ +#!/home/zarmeena/SecureApp-Sprint-Flask-Blog-App/Python/Flask_Blog/11-Blueprints/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from markdown_it.cli.parse import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Python/Flask_Blog/11-Blueprints/venv/bin/pip b/Python/Flask_Blog/11-Blueprints/venv/bin/pip new file mode 100755 index 000000000..e0e3576c5 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/bin/pip @@ -0,0 +1,8 @@ +#!/home/zarmeena/SecureApp-Sprint-Flask-Blog-App/Python/Flask_Blog/11-Blueprints/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/Python/Flask_Blog/11-Blueprints/venv/bin/pip3 b/Python/Flask_Blog/11-Blueprints/venv/bin/pip3 new file mode 100755 index 000000000..e0e3576c5 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/bin/pip3 @@ -0,0 +1,8 @@ +#!/home/zarmeena/SecureApp-Sprint-Flask-Blog-App/Python/Flask_Blog/11-Blueprints/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/Python/Flask_Blog/11-Blueprints/venv/bin/pip3.12 b/Python/Flask_Blog/11-Blueprints/venv/bin/pip3.12 new file mode 100755 index 000000000..e0e3576c5 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/bin/pip3.12 @@ -0,0 +1,8 @@ +#!/home/zarmeena/SecureApp-Sprint-Flask-Blog-App/Python/Flask_Blog/11-Blueprints/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/Python/Flask_Blog/11-Blueprints/venv/bin/pygmentize b/Python/Flask_Blog/11-Blueprints/venv/bin/pygmentize new file mode 100755 index 000000000..e861b4b02 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/bin/pygmentize @@ -0,0 +1,8 @@ +#!/home/zarmeena/SecureApp-Sprint-Flask-Blog-App/Python/Flask_Blog/11-Blueprints/venv/bin/python3 +# -*- coding: utf-8 -*- +import re +import sys +from pygments.cmdline import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/Python/Flask_Blog/11-Blueprints/venv/bin/python b/Python/Flask_Blog/11-Blueprints/venv/bin/python new file mode 120000 index 000000000..b8a0adbbb --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/bin/python @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/Python/Flask_Blog/11-Blueprints/venv/bin/python3 b/Python/Flask_Blog/11-Blueprints/venv/bin/python3 new file mode 120000 index 000000000..ae65fdaa1 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/bin/python3 @@ -0,0 +1 @@ +/usr/bin/python3 \ No newline at end of file diff --git a/Python/Flask_Blog/11-Blueprints/venv/bin/python3.12 b/Python/Flask_Blog/11-Blueprints/venv/bin/python3.12 new file mode 120000 index 000000000..b8a0adbbb --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/bin/python3.12 @@ -0,0 +1 @@ +python3 \ No newline at end of file diff --git a/Python/Flask_Blog/11-Blueprints/venv/include/site/python3.12/greenlet/greenlet.h b/Python/Flask_Blog/11-Blueprints/venv/include/site/python3.12/greenlet/greenlet.h new file mode 100644 index 000000000..d02a16e43 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/include/site/python3.12/greenlet/greenlet.h @@ -0,0 +1,164 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; -*- */ + +/* Greenlet object interface */ + +#ifndef Py_GREENLETOBJECT_H +#define Py_GREENLETOBJECT_H + + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* This is deprecated and undocumented. It does not change. */ +#define GREENLET_VERSION "1.0.0" + +#ifndef GREENLET_MODULE +#define implementation_ptr_t void* +#endif + +typedef struct _greenlet { + PyObject_HEAD + PyObject* weakreflist; + PyObject* dict; + implementation_ptr_t pimpl; +} PyGreenlet; + +#define PyGreenlet_Check(op) (op && PyObject_TypeCheck(op, &PyGreenlet_Type)) + + +/* C API functions */ + +/* Total number of symbols that are exported */ +#define PyGreenlet_API_pointers 12 + +#define PyGreenlet_Type_NUM 0 +#define PyExc_GreenletError_NUM 1 +#define PyExc_GreenletExit_NUM 2 + +#define PyGreenlet_New_NUM 3 +#define PyGreenlet_GetCurrent_NUM 4 +#define PyGreenlet_Throw_NUM 5 +#define PyGreenlet_Switch_NUM 6 +#define PyGreenlet_SetParent_NUM 7 + +#define PyGreenlet_MAIN_NUM 8 +#define PyGreenlet_STARTED_NUM 9 +#define PyGreenlet_ACTIVE_NUM 10 +#define PyGreenlet_GET_PARENT_NUM 11 + +#ifndef GREENLET_MODULE +/* This section is used by modules that uses the greenlet C API */ +static void** _PyGreenlet_API = NULL; + +# define PyGreenlet_Type \ + (*(PyTypeObject*)_PyGreenlet_API[PyGreenlet_Type_NUM]) + +# define PyExc_GreenletError \ + ((PyObject*)_PyGreenlet_API[PyExc_GreenletError_NUM]) + +# define PyExc_GreenletExit \ + ((PyObject*)_PyGreenlet_API[PyExc_GreenletExit_NUM]) + +/* + * PyGreenlet_New(PyObject *args) + * + * greenlet.greenlet(run, parent=None) + */ +# define PyGreenlet_New \ + (*(PyGreenlet * (*)(PyObject * run, PyGreenlet * parent)) \ + _PyGreenlet_API[PyGreenlet_New_NUM]) + +/* + * PyGreenlet_GetCurrent(void) + * + * greenlet.getcurrent() + */ +# define PyGreenlet_GetCurrent \ + (*(PyGreenlet * (*)(void)) _PyGreenlet_API[PyGreenlet_GetCurrent_NUM]) + +/* + * PyGreenlet_Throw( + * PyGreenlet *greenlet, + * PyObject *typ, + * PyObject *val, + * PyObject *tb) + * + * g.throw(...) + */ +# define PyGreenlet_Throw \ + (*(PyObject * (*)(PyGreenlet * self, \ + PyObject * typ, \ + PyObject * val, \ + PyObject * tb)) \ + _PyGreenlet_API[PyGreenlet_Throw_NUM]) + +/* + * PyGreenlet_Switch(PyGreenlet *greenlet, PyObject *args) + * + * g.switch(*args, **kwargs) + */ +# define PyGreenlet_Switch \ + (*(PyObject * \ + (*)(PyGreenlet * greenlet, PyObject * args, PyObject * kwargs)) \ + _PyGreenlet_API[PyGreenlet_Switch_NUM]) + +/* + * PyGreenlet_SetParent(PyObject *greenlet, PyObject *new_parent) + * + * g.parent = new_parent + */ +# define PyGreenlet_SetParent \ + (*(int (*)(PyGreenlet * greenlet, PyGreenlet * nparent)) \ + _PyGreenlet_API[PyGreenlet_SetParent_NUM]) + +/* + * PyGreenlet_GetParent(PyObject* greenlet) + * + * return greenlet.parent; + * + * This could return NULL even if there is no exception active. + * If it does not return NULL, you are responsible for decrementing the + * reference count. + */ +# define PyGreenlet_GetParent \ + (*(PyGreenlet* (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_GET_PARENT_NUM]) + +/* + * deprecated, undocumented alias. + */ +# define PyGreenlet_GET_PARENT PyGreenlet_GetParent + +# define PyGreenlet_MAIN \ + (*(int (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_MAIN_NUM]) + +# define PyGreenlet_STARTED \ + (*(int (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_STARTED_NUM]) + +# define PyGreenlet_ACTIVE \ + (*(int (*)(PyGreenlet*)) \ + _PyGreenlet_API[PyGreenlet_ACTIVE_NUM]) + + + + +/* Macro that imports greenlet and initializes C API */ +/* NOTE: This has actually moved to ``greenlet._greenlet._C_API``, but we + keep the older definition to be sure older code that might have a copy of + the header still works. */ +# define PyGreenlet_Import() \ + { \ + _PyGreenlet_API = (void**)PyCapsule_Import("greenlet._C_API", 0); \ + } + +#endif /* GREENLET_MODULE */ + +#ifdef __cplusplus +} +#endif +#endif /* !Py_GREENLETOBJECT_H */ diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/INSTALLER b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/LICENSE b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/LICENSE new file mode 100644 index 000000000..237ce8a36 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/LICENSE @@ -0,0 +1,31 @@ +Copyright (c) 2011 by Max Countryman. + +Some rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +* Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + +* The names of the contributors may not be used to endorse or + promote products derived from this software without specific + prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/METADATA b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/METADATA new file mode 100644 index 000000000..7f0b3869f --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/METADATA @@ -0,0 +1,74 @@ +Metadata-Version: 2.1 +Name: Flask-Bcrypt +Version: 1.0.1 +Summary: Brcrypt hashing for Flask. +Home-page: https://github.com/maxcountryman/flask-bcrypt +Author: Max Countryman +Author-email: maxc@me.com +License: BSD +Platform: any +Classifier: Environment :: Web Environment +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Description-Content-Type: text/markdown +Requires-Dist: Flask +Requires-Dist: bcrypt (>=3.1.1) + +[![Tests](https://img.shields.io/github/workflow/status/maxcountryman/flask-bcrypt/Tests/master?label=tests)](https://github.com/maxcountryman/flask-bcrypt/actions) +[![Version](https://img.shields.io/pypi/v/Flask-Bcrypt.svg)](https://pypi.python.org/pypi/Flask-Bcrypt) +[![Supported Python Versions](https://img.shields.io/pypi/pyversions/Flask-Bcrypt.svg)](https://pypi.python.org/pypi/Flask-Bcrypt) + +# Flask-Bcrypt + +Flask-Bcrypt is a Flask extension that provides bcrypt hashing utilities for +your application. + +Due to the recent increased prevalence of powerful hardware, such as modern +GPUs, hashes have become increasingly easy to crack. A proactive solution to +this is to use a hash that was designed to be "de-optimized". Bcrypt is such +a hashing facility; unlike hashing algorithms such as MD5 and SHA1, which are +optimized for speed, bcrypt is intentionally structured to be slow. + +For sensitive data that must be protected, such as passwords, bcrypt is an +advisable choice. + +## Installation + +Install the extension with one of the following commands: + + $ easy_install flask-bcrypt + +or alternatively if you have pip installed: + + $ pip install flask-bcrypt + +## Usage + +To use the extension simply import the class wrapper and pass the Flask app +object back to here. Do so like this: + + from flask import Flask + from flask_bcrypt import Bcrypt + + app = Flask(__name__) + bcrypt = Bcrypt(app) + +Two primary hashing methods are now exposed by way of the bcrypt object. Use +them like so: + + pw_hash = bcrypt.generate_password_hash('hunter2') + bcrypt.check_password_hash(pw_hash, 'hunter2') # returns True + +## Documentation + +The Sphinx-compiled documentation is available here: https://flask-bcrypt.readthedocs.io/ + + diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/RECORD b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/RECORD new file mode 100644 index 000000000..a84085870 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/RECORD @@ -0,0 +1,9 @@ +Flask_Bcrypt-1.0.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_Bcrypt-1.0.1.dist-info/LICENSE,sha256=RFRom0T_iGtIZZvvW5_AD14IAYQvR45h2hYe0Xp0Jak,1456 +Flask_Bcrypt-1.0.1.dist-info/METADATA,sha256=wO9naenfHK7Lgz41drDpI6BlMg_CpzjwGWsAiko2wsk,2615 +Flask_Bcrypt-1.0.1.dist-info/RECORD,, +Flask_Bcrypt-1.0.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Flask_Bcrypt-1.0.1.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +Flask_Bcrypt-1.0.1.dist-info/top_level.txt,sha256=HUgQw7e42Bb9jcMgo5popKpplnimwUQw3cyTi0K1N7o,13 +__pycache__/flask_bcrypt.cpython-312.pyc,, +flask_bcrypt.py,sha256=thnztmOYR9M6afp-bTRdSKsPef6R2cOFo4j_DD88-Ls,8856 diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/REQUESTED b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/REQUESTED new file mode 100644 index 000000000..e69de29bb diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/WHEEL b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/WHEEL new file mode 100644 index 000000000..becc9a66e --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/top_level.txt b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/top_level.txt new file mode 100644 index 000000000..f7f0e8875 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Bcrypt-1.0.1.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_bcrypt diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/INSTALLER b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/INSTALLER new file mode 100644 index 000000000..a1b589e38 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/LICENSE b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/LICENSE new file mode 100644 index 000000000..04463812d --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/LICENSE @@ -0,0 +1,22 @@ +Copyright (c) 2011 Matthew Frazier + +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/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/METADATA b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/METADATA new file mode 100644 index 000000000..445a0b23e --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/METADATA @@ -0,0 +1,183 @@ +Metadata-Version: 2.1 +Name: Flask-Login +Version: 0.6.3 +Summary: User authentication and session management for Flask. +Home-page: https://github.com/maxcountryman/flask-login +Author: Matthew Frazier +Author-email: leafstormrush@gmail.com +Maintainer: Max Countryman +License: MIT +Project-URL: Documentation, https://flask-login.readthedocs.io/ +Project-URL: Changes, https://github.com/maxcountryman/flask-login/blob/main/CHANGES.md +Project-URL: Source Code, https://github.com/maxcountryman/flask-login +Project-URL: Issue Tracker, https://github.com/maxcountryman/flask-login/issues +Classifier: Development Status :: 4 - Beta +Classifier: Environment :: Web Environment +Classifier: Framework :: Flask +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=3.7 +Description-Content-Type: text/markdown +License-File: LICENSE +Requires-Dist: Flask >=1.0.4 +Requires-Dist: Werkzeug >=1.0.1 + +# Flask-Login + +![Tests](https://github.com/maxcountryman/flask-login/workflows/Tests/badge.svg) +[![coverage](https://coveralls.io/repos/maxcountryman/flask-login/badge.svg?branch=main&service=github)](https://coveralls.io/github/maxcountryman/flask-login?branch=main) +[![Software License](https://img.shields.io/badge/license-MIT-brightgreen.svg)](LICENSE) + +Flask-Login provides user session management for Flask. It handles the common +tasks of logging in, logging out, and remembering your users' sessions over +extended periods of time. + +Flask-Login is not bound to any particular database system or permissions +model. The only requirement is that your user objects implement a few methods, +and that you provide a callback to the extension capable of loading users from +their ID. + +## Installation + +Install the extension with pip: + +```sh +$ pip install flask-login +``` + +## Usage + +Once installed, the Flask-Login is easy to use. Let's walk through setting up +a basic application. Also please note that this is a very basic guide: we will +be taking shortcuts here that you should never take in a real application. + +To begin we'll set up a Flask app: + +```python +import flask + +app = flask.Flask(__name__) +app.secret_key = 'super secret string' # Change this! +``` + +Flask-Login works via a login manager. To kick things off, we'll set up the +login manager by instantiating it and telling it about our Flask app: + +```python +import flask_login + +login_manager = flask_login.LoginManager() + +login_manager.init_app(app) +``` + +To keep things simple we're going to use a dictionary to represent a database +of users. In a real application, this would be an actual persistence layer. +However it's important to point out this is a feature of Flask-Login: it +doesn't care how your data is stored so long as you tell it how to retrieve it! + +```python +# Our mock database. +users = {'foo@bar.tld': {'password': 'secret'}} +``` + +We also need to tell Flask-Login how to load a user from a Flask request and +from its session. To do this we need to define our user object, a +`user_loader` callback, and a `request_loader` callback. + +```python +class User(flask_login.UserMixin): + pass + + +@login_manager.user_loader +def user_loader(email): + if email not in users: + return + + user = User() + user.id = email + return user + + +@login_manager.request_loader +def request_loader(request): + email = request.form.get('email') + if email not in users: + return + + user = User() + user.id = email + return user +``` + +Now we're ready to define our views. We can start with a login view, which will +populate the session with authentication bits. After that we can define a view +that requires authentication. + +```python +@app.route('/login', methods=['GET', 'POST']) +def login(): + if flask.request.method == 'GET': + return ''' +
+ + + +
+ ''' + + email = flask.request.form['email'] + if email in users and flask.request.form['password'] == users[email]['password']: + user = User() + user.id = email + flask_login.login_user(user) + return flask.redirect(flask.url_for('protected')) + + return 'Bad login' + + +@app.route('/protected') +@flask_login.login_required +def protected(): + return 'Logged in as: ' + flask_login.current_user.id +``` + +Finally we can define a view to clear the session and log users out: + +```python +@app.route('/logout') +def logout(): + flask_login.logout_user() + return 'Logged out' +``` + +We now have a basic working application that makes use of session-based +authentication. To round things off, we should provide a callback for login +failures: + +```python +@login_manager.unauthorized_handler +def unauthorized_handler(): + return 'Unauthorized', 401 +``` + +Documentation for Flask-Login is available on [ReadTheDocs](https://flask-login.readthedocs.io/en/latest/). +For complete understanding of available configuration, please refer to the [source code](https://github.com/maxcountryman/flask-login). + + +## Contributing + +We welcome contributions! If you would like to hack on Flask-Login, please +follow these steps: + +1. Fork this repository +2. Make your changes +3. Install the dev requirements with `pip install -r requirements/dev.txt` +4. Submit a pull request after running `tox` (ensure it does not error!) + +Please give us adequate time to review your submission. Thanks! diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/RECORD b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/RECORD new file mode 100644 index 000000000..c66089e48 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/RECORD @@ -0,0 +1,23 @@ +Flask_Login-0.6.3.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +Flask_Login-0.6.3.dist-info/LICENSE,sha256=ep37nF2iBO0TcPO2LBPimSoS2h2nB_R-FWiX7rQ0Tls,1059 +Flask_Login-0.6.3.dist-info/METADATA,sha256=AUSHR5Po6-Cwmz1KBrAZbTzR-iVVFvtb2NQKYl7UuAU,5799 +Flask_Login-0.6.3.dist-info/RECORD,, +Flask_Login-0.6.3.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +Flask_Login-0.6.3.dist-info/WHEEL,sha256=Xo9-1PvkuimrydujYJAjF7pCkriuXBpUPEjma1nZyJ0,92 +Flask_Login-0.6.3.dist-info/top_level.txt,sha256=OuXmIpiFnXLvW-iBbW2km7ZIy5EZvwSBnYaOC3Kt7j8,12 +flask_login/__about__.py,sha256=Kkp5e9mV9G7vK_FqZof-g9RFmyyBzq1gge5aKXgvilE,389 +flask_login/__init__.py,sha256=wYQiQCikT_Ndp3PhOD-1gRTGCrUPIE-FrjQUrT9aVAg,2681 +flask_login/__pycache__/__about__.cpython-312.pyc,, +flask_login/__pycache__/__init__.cpython-312.pyc,, +flask_login/__pycache__/config.cpython-312.pyc,, +flask_login/__pycache__/login_manager.cpython-312.pyc,, +flask_login/__pycache__/mixins.cpython-312.pyc,, +flask_login/__pycache__/signals.cpython-312.pyc,, +flask_login/__pycache__/test_client.cpython-312.pyc,, +flask_login/__pycache__/utils.cpython-312.pyc,, +flask_login/config.py,sha256=YAocv18La7YGQyNY5aT7rU1GQIZnX6pvchwqx3kA9p8,1813 +flask_login/login_manager.py,sha256=h20F_iv3mqc6rIJ4-V6_XookzOUl8Rcpasua-dCByQY,20073 +flask_login/mixins.py,sha256=gPd7otMRljxw0eUhUMbHsnEBc_jK2cYdxg5KFLuJcoI,1528 +flask_login/signals.py,sha256=xCMoFHKU1RTVt1NY-Gfl0OiVKpiyNt6YJw_PsgkjY3w,2464 +flask_login/test_client.py,sha256=6mrjiBRLGJpgvvFlLypXPTBLiMp0BAN-Ft-uogqC81g,517 +flask_login/utils.py,sha256=Y1wxjCVxpYohBaQJ0ADLypQ-VvBNycwG-gVXFF7k99I,14021 diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/REQUESTED b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/REQUESTED new file mode 100644 index 000000000..e69de29bb diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/WHEEL b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/WHEEL new file mode 100644 index 000000000..ba48cbcf9 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.41.3) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/top_level.txt b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/top_level.txt new file mode 100644 index 000000000..31514bd20 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/Flask_Login-0.6.3.dist-info/top_level.txt @@ -0,0 +1 @@ +flask_login diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/AvifImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/AvifImagePlugin.py new file mode 100644 index 000000000..2343499c2 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/AvifImagePlugin.py @@ -0,0 +1,294 @@ +from __future__ import annotations + +import os +from io import BytesIO +from typing import IO + +from . import ExifTags, Image, ImageFile + +try: + from . import _avif + + SUPPORTED = True +except ImportError: + SUPPORTED = False + +# Decoder options as module globals, until there is a way to pass parameters +# to Image.open (see https://github.com/python-pillow/Pillow/issues/569) +DECODE_CODEC_CHOICE = "auto" +DEFAULT_MAX_THREADS = 0 + + +def get_codec_version(codec_name: str) -> str | None: + versions = _avif.codec_versions() + for version in versions.split(", "): + if version.split(" [")[0] == codec_name: + return version.split(":")[-1].split(" ")[0] + return None + + +def _accept(prefix: bytes) -> bool | str: + if prefix[4:8] != b"ftyp": + return False + major_brand = prefix[8:12] + if major_brand in ( + # coding brands + b"avif", + b"avis", + # We accept files with AVIF container brands; we can't yet know if + # the ftyp box has the correct compatible brands, but if it doesn't + # then the plugin will raise a SyntaxError which Pillow will catch + # before moving on to the next plugin that accepts the file. + # + # Also, because this file might not actually be an AVIF file, we + # don't raise an error if AVIF support isn't properly compiled. + b"mif1", + b"msf1", + ): + if not SUPPORTED: + return ( + "image file could not be identified because AVIF support not installed" + ) + return True + return False + + +def _get_default_max_threads() -> int: + if DEFAULT_MAX_THREADS: + return DEFAULT_MAX_THREADS + if hasattr(os, "sched_getaffinity"): + return len(os.sched_getaffinity(0)) + else: + return os.cpu_count() or 1 + + +class AvifImageFile(ImageFile.ImageFile): + format = "AVIF" + format_description = "AVIF image" + __frame = -1 + + def _open(self) -> None: + if not SUPPORTED: + msg = "image file could not be opened because AVIF support not installed" + raise SyntaxError(msg) + + if DECODE_CODEC_CHOICE != "auto" and not _avif.decoder_codec_available( + DECODE_CODEC_CHOICE + ): + msg = "Invalid opening codec" + raise ValueError(msg) + + assert self.fp is not None + raise RuntimeError("File pointer (fp) is not initialized.") + self._decoder = _avif.AvifDecoder( + self.fp.read(), + DECODE_CODEC_CHOICE, + _get_default_max_threads(), + ) + + # Get info from decoder + self._size, self.n_frames, self._mode, icc, exif, exif_orientation, xmp = ( + self._decoder.get_info() + ) + self.is_animated = self.n_frames > 1 + + if icc: + self.info["icc_profile"] = icc + if xmp: + self.info["xmp"] = xmp + + if exif_orientation != 1 or exif: + exif_data = Image.Exif() + if exif: + exif_data.load(exif) + original_orientation = exif_data.get(ExifTags.Base.Orientation, 1) + else: + original_orientation = 1 + if exif_orientation != original_orientation: + exif_data[ExifTags.Base.Orientation] = exif_orientation + exif = exif_data.tobytes() + if exif: + self.info["exif"] = exif + self.seek(0) + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + + # Set tile + self.__frame = frame + self.tile = [ImageFile._Tile("raw", (0, 0) + self.size, 0, self.mode)] + + def load(self) -> Image.core.PixelAccess | None: + if self.tile: + # We need to load the image data for this frame + data, timescale, pts_in_timescales, duration_in_timescales = ( + self._decoder.get_frame(self.__frame) + ) + self.info["timestamp"] = round(1000 * (pts_in_timescales / timescale)) + self.info["duration"] = round(1000 * (duration_in_timescales / timescale)) + + if self.fp and self._exclusive_fp: + self.fp.close() + self.fp = BytesIO(data) + + return super().load() + + def load_seek(self, pos: int) -> None: + pass + + def tell(self) -> int: + return self.__frame + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + _save(im, fp, filename, save_all=True) + + +def _save( + im: Image.Image, fp: IO[bytes], filename: str | bytes, save_all: bool = False +) -> None: + info = im.encoderinfo.copy() + if save_all: + append_images = list(info.get("append_images", [])) + else: + append_images = [] + + total = 0 + for ims in [im] + append_images: + total += getattr(ims, "n_frames", 1) + + quality = info.get("quality", 75) + if not isinstance(quality, int) or quality < 0 or quality > 100: + msg = "Invalid quality setting" + raise ValueError(msg) + + duration = info.get("duration", 0) + subsampling = info.get("subsampling", "4:2:0") + speed = info.get("speed", 6) + max_threads = info.get("max_threads", _get_default_max_threads()) + codec = info.get("codec", "auto") + if codec != "auto" and not _avif.encoder_codec_available(codec): + msg = "Invalid saving codec" + raise ValueError(msg) + range_ = info.get("range", "full") + tile_rows_log2 = info.get("tile_rows", 0) + tile_cols_log2 = info.get("tile_cols", 0) + alpha_premultiplied = bool(info.get("alpha_premultiplied", False)) + autotiling = bool(info.get("autotiling", tile_rows_log2 == tile_cols_log2 == 0)) + + icc_profile = info.get("icc_profile", im.info.get("icc_profile")) + exif_orientation = 1 + if exif := info.get("exif"): + if isinstance(exif, Image.Exif): + exif_data = exif + else: + exif_data = Image.Exif() + exif_data.load(exif) + if ExifTags.Base.Orientation in exif_data: + exif_orientation = exif_data.pop(ExifTags.Base.Orientation) + exif = exif_data.tobytes() if exif_data else b"" + elif isinstance(exif, Image.Exif): + exif = exif_data.tobytes() + + xmp = info.get("xmp") + + if isinstance(xmp, str): + xmp = xmp.encode("utf-8") + + advanced = info.get("advanced") + if advanced is not None: + if isinstance(advanced, dict): + advanced = advanced.items() + try: + advanced = tuple(advanced) + except TypeError: + invalid = True + else: + invalid = any(not isinstance(v, tuple) or len(v) != 2 for v in advanced) + if invalid: + msg = ( + "advanced codec options must be a dict of key-value string " + "pairs or a series of key-value two-tuples" + ) + raise ValueError(msg) + + # Setup the AVIF encoder + enc = _avif.AvifEncoder( + im.size, + subsampling, + quality, + speed, + max_threads, + codec, + range_, + tile_rows_log2, + tile_cols_log2, + alpha_premultiplied, + autotiling, + icc_profile or b"", + exif or b"", + exif_orientation, + xmp or b"", + advanced, + ) + + # Add each frame + frame_idx = 0 + frame_duration = 0 + cur_idx = im.tell() + is_single_frame = total == 1 + try: + for ims in [im] + append_images: + # Get number of frames in this image + nfr = getattr(ims, "n_frames", 1) + + for idx in range(nfr): + ims.seek(idx) + + # Make sure image mode is supported + frame = ims + rawmode = ims.mode + if ims.mode not in {"RGB", "RGBA"}: + rawmode = "RGBA" if ims.has_transparency_data else "RGB" + frame = ims.convert(rawmode) + + # Update frame duration + if isinstance(duration, (list, tuple)): + frame_duration = duration[frame_idx] + else: + frame_duration = duration + + # Append the frame to the animation encoder + enc.add( + frame.tobytes("raw", rawmode), + frame_duration, + frame.size, + rawmode, + is_single_frame, + ) + + # Update frame index + frame_idx += 1 + + if not save_all: + break + + finally: + im.seek(cur_idx) + + # Get the final output from the encoder + data = enc.finish() + if data is None: + msg = "cannot write file as AVIF (encoder returned None)" + raise OSError(msg) + + fp.write(data) + + +Image.register_open(AvifImageFile.format, AvifImageFile, _accept) +if SUPPORTED: + Image.register_save(AvifImageFile.format, _save) + Image.register_save_all(AvifImageFile.format, _save_all) + Image.register_extensions(AvifImageFile.format, [".avif", ".avifs"]) + Image.register_mime(AvifImageFile.format, "image/avif") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/BdfFontFile.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/BdfFontFile.py new file mode 100644 index 000000000..1c8c28ff0 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/BdfFontFile.py @@ -0,0 +1,123 @@ +# +# The Python Imaging Library +# $Id$ +# +# bitmap distribution font (bdf) file parser +# +# history: +# 1996-05-16 fl created (as bdf2pil) +# 1997-08-25 fl converted to FontFile driver +# 2001-05-25 fl removed bogus __init__ call +# 2002-11-20 fl robustification (from Kevin Cazabon, Dmitry Vasiliev) +# 2003-04-22 fl more robustification (from Graham Dumpleton) +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1997-2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +""" +Parse X Bitmap Distribution Format (BDF) +""" + +from __future__ import annotations + +from typing import BinaryIO + +from . import FontFile, Image + + +def bdf_char( + f: BinaryIO, +) -> ( + tuple[ + str, + int, + tuple[tuple[int, int], tuple[int, int, int, int], tuple[int, int, int, int]], + Image.Image, + ] + | None +): + # skip to STARTCHAR + while True: + s = f.readline() + if not s: + return None + if s.startswith(b"STARTCHAR"): + break + id = s[9:].strip().decode("ascii") + + # load symbol properties + props = {} + while True: + s = f.readline() + if not s or s.startswith(b"BITMAP"): + break + i = s.find(b" ") + props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii") + + # load bitmap + bitmap = bytearray() + while True: + s = f.readline() + if not s or s.startswith(b"ENDCHAR"): + break + bitmap += s[:-1] + + # The word BBX + # followed by the width in x (BBw), height in y (BBh), + # and x and y displacement (BBxoff0, BByoff0) + # of the lower left corner from the origin of the character. + width, height, x_disp, y_disp = (int(p) for p in props["BBX"].split()) + + # The word DWIDTH + # followed by the width in x and y of the character in device pixels. + dwx, dwy = (int(p) for p in props["DWIDTH"].split()) + + bbox = ( + (dwx, dwy), + (x_disp, -y_disp - height, width + x_disp, -y_disp), + (0, 0, width, height), + ) + + try: + im = Image.frombytes("1", (width, height), bitmap, "hex", "1") + except ValueError: + # deal with zero-width characters + im = Image.new("1", (width, height)) + + return id, int(props["ENCODING"]), bbox, im + + +class BdfFontFile(FontFile.FontFile): + """Font file plugin for the X11 BDF format.""" + + def __init__(self, fp: BinaryIO) -> None: + super().__init__() + + s = fp.readline() + if not s.startswith(b"STARTFONT 2.1"): + msg = "not a valid BDF file" + raise SyntaxError(msg) + + props = {} + comments = [] + + while True: + s = fp.readline() + if not s or s.startswith(b"ENDPROPERTIES"): + break + i = s.find(b" ") + props[s[:i].decode("ascii")] = s[i + 1 : -1].decode("ascii") + if s[:i] in [b"COMMENT", b"COPYRIGHT"]: + if s.find(b"LogicalFontDescription") < 0: + comments.append(s[i + 1 : -1].decode("ascii")) + + while True: + c = bdf_char(fp) + if not c: + break + id, ch, (xy, dst, src), im = c + if 0 <= ch < len(self.glyph): + self.glyph[ch] = xy, dst, src, im diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py new file mode 100644 index 000000000..6bb92edf8 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/BlpImagePlugin.py @@ -0,0 +1,498 @@ +""" +Blizzard Mipmap Format (.blp) +Jerome Leclanche + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: + https://creativecommons.org/publicdomain/zero/1.0/ + +BLP1 files, used mostly in Warcraft III, are not fully supported. +All types of BLP2 files used in World of Warcraft are supported. + +The BLP file structure consists of a header, up to 16 mipmaps of the +texture + +Texture sizes must be powers of two, though the two dimensions do +not have to be equal; 512x256 is valid, but 512x200 is not. +The first mipmap (mipmap #0) is the full size image; each subsequent +mipmap halves both dimensions. The final mipmap should be 1x1. + +BLP files come in many different flavours: +* JPEG-compressed (type == 0) - only supported for BLP1. +* RAW images (type == 1, encoding == 1). Each mipmap is stored as an + array of 8-bit values, one per pixel, left to right, top to bottom. + Each value is an index to the palette. +* DXT-compressed (type == 1, encoding == 2): +- DXT1 compression is used if alpha_encoding == 0. + - An additional alpha bit is used if alpha_depth == 1. + - DXT3 compression is used if alpha_encoding == 1. + - DXT5 compression is used if alpha_encoding == 7. +""" + +from __future__ import annotations + +import abc +import os +import struct +from enum import IntEnum +from io import BytesIO +from typing import IO + +from . import Image, ImageFile + + +class Format(IntEnum): + JPEG = 0 + + +class Encoding(IntEnum): + UNCOMPRESSED = 1 + DXT = 2 + UNCOMPRESSED_RAW_BGRA = 3 + + +class AlphaEncoding(IntEnum): + DXT1 = 0 + DXT3 = 1 + DXT5 = 7 + + +def unpack_565(i: int) -> tuple[int, int, int]: + return ((i >> 11) & 0x1F) << 3, ((i >> 5) & 0x3F) << 2, (i & 0x1F) << 3 + + +def decode_dxt1( + data: bytes, alpha: bool = False +) -> tuple[bytearray, bytearray, bytearray, bytearray]: + """ + input: one "row" of data (i.e. will produce 4*width pixels) + """ + + blocks = len(data) // 8 # number of blocks in row + ret = (bytearray(), bytearray(), bytearray(), bytearray()) + + for block_index in range(blocks): + # Decode next 8-byte block. + idx = block_index * 8 + color0, color1, bits = struct.unpack_from("> 2 + + a = 0xFF + if control == 0: + r, g, b = r0, g0, b0 + elif control == 1: + r, g, b = r1, g1, b1 + elif control == 2: + if color0 > color1: + r = (2 * r0 + r1) // 3 + g = (2 * g0 + g1) // 3 + b = (2 * b0 + b1) // 3 + else: + r = (r0 + r1) // 2 + g = (g0 + g1) // 2 + b = (b0 + b1) // 2 + elif control == 3: + if color0 > color1: + r = (2 * r1 + r0) // 3 + g = (2 * g1 + g0) // 3 + b = (2 * b1 + b0) // 3 + else: + r, g, b, a = 0, 0, 0, 0 + + if alpha: + ret[j].extend([r, g, b, a]) + else: + ret[j].extend([r, g, b]) + + return ret + + +def decode_dxt3(data: bytes) -> tuple[bytearray, bytearray, bytearray, bytearray]: + """ + input: one "row" of data (i.e. will produce 4*width pixels) + """ + + blocks = len(data) // 16 # number of blocks in row + ret = (bytearray(), bytearray(), bytearray(), bytearray()) + + for block_index in range(blocks): + idx = block_index * 16 + block = data[idx : idx + 16] + # Decode next 16-byte block. + bits = struct.unpack_from("<8B", block) + color0, color1 = struct.unpack_from(">= 4 + else: + high = True + a &= 0xF + a *= 17 # We get a value between 0 and 15 + + color_code = (code >> 2 * (4 * j + i)) & 0x03 + + if color_code == 0: + r, g, b = r0, g0, b0 + elif color_code == 1: + r, g, b = r1, g1, b1 + elif color_code == 2: + r = (2 * r0 + r1) // 3 + g = (2 * g0 + g1) // 3 + b = (2 * b0 + b1) // 3 + elif color_code == 3: + r = (2 * r1 + r0) // 3 + g = (2 * g1 + g0) // 3 + b = (2 * b1 + b0) // 3 + + ret[j].extend([r, g, b, a]) + + return ret + + +def decode_dxt5(data: bytes) -> tuple[bytearray, bytearray, bytearray, bytearray]: + """ + input: one "row" of data (i.e. will produce 4 * width pixels) + """ + + blocks = len(data) // 16 # number of blocks in row + ret = (bytearray(), bytearray(), bytearray(), bytearray()) + + for block_index in range(blocks): + idx = block_index * 16 + block = data[idx : idx + 16] + # Decode next 16-byte block. + a0, a1 = struct.unpack_from("> alphacode_index) & 0x07 + elif alphacode_index == 15: + alphacode = (alphacode2 >> 15) | ((alphacode1 << 1) & 0x06) + else: # alphacode_index >= 18 and alphacode_index <= 45 + alphacode = (alphacode1 >> (alphacode_index - 16)) & 0x07 + + if alphacode == 0: + a = a0 + elif alphacode == 1: + a = a1 + elif a0 > a1: + a = ((8 - alphacode) * a0 + (alphacode - 1) * a1) // 7 + elif alphacode == 6: + a = 0 + elif alphacode == 7: + a = 255 + else: + a = ((6 - alphacode) * a0 + (alphacode - 1) * a1) // 5 + + color_code = (code >> 2 * (4 * j + i)) & 0x03 + + if color_code == 0: + r, g, b = r0, g0, b0 + elif color_code == 1: + r, g, b = r1, g1, b1 + elif color_code == 2: + r = (2 * r0 + r1) // 3 + g = (2 * g0 + g1) // 3 + b = (2 * b0 + b1) // 3 + elif color_code == 3: + r = (2 * r1 + r0) // 3 + g = (2 * g1 + g0) // 3 + b = (2 * b1 + b0) // 3 + + ret[j].extend([r, g, b, a]) + + return ret + + +class BLPFormatError(NotImplementedError): + pass + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith((b"BLP1", b"BLP2")) + + +class BlpImageFile(ImageFile.ImageFile): + """ + Blizzard Mipmap Format + """ + + format = "BLP" + format_description = "Blizzard Mipmap Format" + + def _open(self) -> None: + assert self.fp is not None + self.magic = self.fp.read(4) + if not _accept(self.magic): + msg = f"Bad BLP magic {repr(self.magic)}" + raise BLPFormatError(msg) + + compression = struct.unpack(" tuple[int, int]: + try: + self._read_header() + self._load() + except struct.error as e: + msg = "Truncated BLP file" + raise OSError(msg) from e + return -1, 0 + + @abc.abstractmethod + def _load(self) -> None: + pass + + def _read_header(self) -> None: + self._offsets = struct.unpack("<16I", self._safe_read(16 * 4)) + self._lengths = struct.unpack("<16I", self._safe_read(16 * 4)) + + def _safe_read(self, length: int) -> bytes: + assert self.fd is not None + return ImageFile._safe_read(self.fd, length) + + def _read_palette(self) -> list[tuple[int, int, int, int]]: + ret = [] + for i in range(256): + try: + b, g, r, a = struct.unpack("<4B", self._safe_read(4)) + except struct.error: + break + ret.append((b, g, r, a)) + return ret + + def _read_bgra( + self, palette: list[tuple[int, int, int, int]], alpha: bool + ) -> bytearray: + data = bytearray() + _data = BytesIO(self._safe_read(self._lengths[0])) + while True: + try: + (offset,) = struct.unpack(" None: + self._compression, self._encoding, alpha = self.args + + if self._compression == Format.JPEG: + self._decode_jpeg_stream() + + elif self._compression == 1: + if self._encoding in (4, 5): + palette = self._read_palette() + data = self._read_bgra(palette, alpha) + self.set_as_raw(data) + else: + msg = f"Unsupported BLP encoding {repr(self._encoding)}" + raise BLPFormatError(msg) + else: + msg = f"Unsupported BLP compression {repr(self._encoding)}" + raise BLPFormatError(msg) + + def _decode_jpeg_stream(self) -> None: + from .JpegImagePlugin import JpegImageFile + + (jpeg_header_size,) = struct.unpack(" None: + self._compression, self._encoding, alpha, self._alpha_encoding = self.args + + palette = self._read_palette() + + assert self.fd is not None + self.fd.seek(self._offsets[0]) + + if self._compression == 1: + # Uncompressed or DirectX compression + + if self._encoding == Encoding.UNCOMPRESSED: + data = self._read_bgra(palette, alpha) + + elif self._encoding == Encoding.DXT: + data = bytearray() + if self._alpha_encoding == AlphaEncoding.DXT1: + linesize = (self.state.xsize + 3) // 4 * 8 + for yb in range((self.state.ysize + 3) // 4): + for d in decode_dxt1(self._safe_read(linesize), alpha): + data += d + + elif self._alpha_encoding == AlphaEncoding.DXT3: + linesize = (self.state.xsize + 3) // 4 * 16 + for yb in range((self.state.ysize + 3) // 4): + for d in decode_dxt3(self._safe_read(linesize)): + data += d + + elif self._alpha_encoding == AlphaEncoding.DXT5: + linesize = (self.state.xsize + 3) // 4 * 16 + for yb in range((self.state.ysize + 3) // 4): + for d in decode_dxt5(self._safe_read(linesize)): + data += d + else: + msg = f"Unsupported alpha encoding {repr(self._alpha_encoding)}" + raise BLPFormatError(msg) + else: + msg = f"Unknown BLP encoding {repr(self._encoding)}" + raise BLPFormatError(msg) + + else: + msg = f"Unknown BLP compression {repr(self._compression)}" + raise BLPFormatError(msg) + + self.set_as_raw(data) + + +class BLPEncoder(ImageFile.PyEncoder): + _pushes_fd = True + + def _write_palette(self) -> bytes: + data = b"" + assert self.im is not None + palette = self.im.getpalette("RGBA", "RGBA") + for i in range(len(palette) // 4): + r, g, b, a = palette[i * 4 : (i + 1) * 4] + data += struct.pack("<4B", b, g, r, a) + while len(data) < 256 * 4: + data += b"\x00" * 4 + return data + + def encode(self, bufsize: int) -> tuple[int, int, bytes]: + palette_data = self._write_palette() + + offset = 20 + 16 * 4 * 2 + len(palette_data) + data = struct.pack("<16I", offset, *((0,) * 15)) + + assert self.im is not None + w, h = self.im.size + data += struct.pack("<16I", w * h, *((0,) * 15)) + + data += palette_data + + for y in range(h): + for x in range(w): + data += struct.pack(" None: + if im.mode != "P": + msg = "Unsupported BLP image mode" + raise ValueError(msg) + + magic = b"BLP1" if im.encoderinfo.get("blp_version") == "BLP1" else b"BLP2" + fp.write(magic) + + assert im.palette is not None + fp.write(struct.pack(" mode, rawmode + 1: ("P", "P;1"), + 4: ("P", "P;4"), + 8: ("P", "P"), + 16: ("RGB", "BGR;15"), + 24: ("RGB", "BGR"), + 32: ("RGB", "BGRX"), +} + +USE_RAW_ALPHA = False + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(b"BM") + + +def _dib_accept(prefix: bytes) -> bool: + return i32(prefix) in [12, 40, 52, 56, 64, 108, 124] + + +# ============================================================================= +# Image plugin for the Windows BMP format. +# ============================================================================= +class BmpImageFile(ImageFile.ImageFile): + """Image plugin for the Windows Bitmap format (BMP)""" + + # ------------------------------------------------------------- Description + format_description = "Windows Bitmap" + format = "BMP" + + # -------------------------------------------------- BMP Compression values + COMPRESSIONS = {"RAW": 0, "RLE8": 1, "RLE4": 2, "BITFIELDS": 3, "JPEG": 4, "PNG": 5} + for k, v in COMPRESSIONS.items(): + vars()[k] = v + + def _bitmap(self, header: int = 0, offset: int = 0) -> None: + """Read relevant info about the BMP""" + assert self.fp is not None + read, seek = self.fp.read, self.fp.seek + if header: + seek(header) + # read bmp header size @offset 14 (this is part of the header size) + file_info: dict[str, bool | int | tuple[int, ...]] = { + "header_size": i32(read(4)), + "direction": -1, + } + + # -------------------- If requested, read header at a specific position + # read the rest of the bmp header, without its size + assert isinstance(file_info["header_size"], int) + header_data = ImageFile._safe_read(self.fp, file_info["header_size"] - 4) + + # ------------------------------- Windows Bitmap v2, IBM OS/2 Bitmap v1 + # ----- This format has different offsets because of width/height types + # 12: BITMAPCOREHEADER/OS21XBITMAPHEADER + if file_info["header_size"] == 12: + file_info["width"] = i16(header_data, 0) + file_info["height"] = i16(header_data, 2) + file_info["planes"] = i16(header_data, 4) + file_info["bits"] = i16(header_data, 6) + file_info["compression"] = self.COMPRESSIONS["RAW"] + file_info["palette_padding"] = 3 + + # --------------------------------------------- Windows Bitmap v3 to v5 + # 40: BITMAPINFOHEADER + # 52: BITMAPV2HEADER + # 56: BITMAPV3HEADER + # 64: BITMAPCOREHEADER2/OS22XBITMAPHEADER + # 108: BITMAPV4HEADER + # 124: BITMAPV5HEADER + elif file_info["header_size"] in (40, 52, 56, 64, 108, 124): + file_info["y_flip"] = header_data[7] == 0xFF + file_info["direction"] = 1 if file_info["y_flip"] else -1 + file_info["width"] = i32(header_data, 0) + file_info["height"] = ( + i32(header_data, 4) + if not file_info["y_flip"] + else 2**32 - i32(header_data, 4) + ) + file_info["planes"] = i16(header_data, 8) + file_info["bits"] = i16(header_data, 10) + file_info["compression"] = i32(header_data, 12) + # byte size of pixel data + file_info["data_size"] = i32(header_data, 16) + file_info["pixels_per_meter"] = ( + i32(header_data, 20), + i32(header_data, 24), + ) + file_info["colors"] = i32(header_data, 28) + file_info["palette_padding"] = 4 + assert isinstance(file_info["pixels_per_meter"], tuple) + self.info["dpi"] = tuple(x / 39.3701 for x in file_info["pixels_per_meter"]) + if file_info["compression"] == self.COMPRESSIONS["BITFIELDS"]: + masks = ["r_mask", "g_mask", "b_mask"] + if len(header_data) >= 48: + if len(header_data) >= 52: + masks.append("a_mask") + else: + file_info["a_mask"] = 0x0 + for idx, mask in enumerate(masks): + file_info[mask] = i32(header_data, 36 + idx * 4) + else: + # 40 byte headers only have the three components in the + # bitfields masks, ref: + # https://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx + # See also + # https://github.com/python-pillow/Pillow/issues/1293 + # There is a 4th component in the RGBQuad, in the alpha + # location, but it is listed as a reserved component, + # and it is not generally an alpha channel + file_info["a_mask"] = 0x0 + for mask in masks: + file_info[mask] = i32(read(4)) + assert isinstance(file_info["r_mask"], int) + assert isinstance(file_info["g_mask"], int) + assert isinstance(file_info["b_mask"], int) + assert isinstance(file_info["a_mask"], int) + file_info["rgb_mask"] = ( + file_info["r_mask"], + file_info["g_mask"], + file_info["b_mask"], + ) + file_info["rgba_mask"] = ( + file_info["r_mask"], + file_info["g_mask"], + file_info["b_mask"], + file_info["a_mask"], + ) + else: + msg = f"Unsupported BMP header type ({file_info['header_size']})" + raise OSError(msg) + + # ------------------ Special case : header is reported 40, which + # ---------------------- is shorter than real size for bpp >= 16 + assert isinstance(file_info["width"], int) + assert isinstance(file_info["height"], int) + self._size = file_info["width"], file_info["height"] + + # ------- If color count was not found in the header, compute from bits + assert isinstance(file_info["bits"], int) + if not file_info.get("colors", 0): + file_info["colors"] = 1 << file_info["bits"] + assert isinstance(file_info["palette_padding"], int) + assert isinstance(file_info["colors"], int) + if offset == 14 + file_info["header_size"] and file_info["bits"] <= 8: + offset += file_info["palette_padding"] * file_info["colors"] + + # ---------------------- Check bit depth for unusual unsupported values + self._mode, raw_mode = BIT2MODE.get(file_info["bits"], ("", "")) + if not self.mode: + msg = f"Unsupported BMP pixel depth ({file_info['bits']})" + raise OSError(msg) + + # ---------------- Process BMP with Bitfields compression (not palette) + decoder_name = "raw" + if file_info["compression"] == self.COMPRESSIONS["BITFIELDS"]: + SUPPORTED: dict[int, list[tuple[int, ...]]] = { + 32: [ + (0xFF0000, 0xFF00, 0xFF, 0x0), + (0xFF000000, 0xFF0000, 0xFF00, 0x0), + (0xFF000000, 0xFF00, 0xFF, 0x0), + (0xFF000000, 0xFF0000, 0xFF00, 0xFF), + (0xFF, 0xFF00, 0xFF0000, 0xFF000000), + (0xFF0000, 0xFF00, 0xFF, 0xFF000000), + (0xFF000000, 0xFF00, 0xFF, 0xFF0000), + (0x0, 0x0, 0x0, 0x0), + ], + 24: [(0xFF0000, 0xFF00, 0xFF)], + 16: [(0xF800, 0x7E0, 0x1F), (0x7C00, 0x3E0, 0x1F)], + } + MASK_MODES = { + (32, (0xFF0000, 0xFF00, 0xFF, 0x0)): "BGRX", + (32, (0xFF000000, 0xFF0000, 0xFF00, 0x0)): "XBGR", + (32, (0xFF000000, 0xFF00, 0xFF, 0x0)): "BGXR", + (32, (0xFF000000, 0xFF0000, 0xFF00, 0xFF)): "ABGR", + (32, (0xFF, 0xFF00, 0xFF0000, 0xFF000000)): "RGBA", + (32, (0xFF0000, 0xFF00, 0xFF, 0xFF000000)): "BGRA", + (32, (0xFF000000, 0xFF00, 0xFF, 0xFF0000)): "BGAR", + (32, (0x0, 0x0, 0x0, 0x0)): "BGRA", + (24, (0xFF0000, 0xFF00, 0xFF)): "BGR", + (16, (0xF800, 0x7E0, 0x1F)): "BGR;16", + (16, (0x7C00, 0x3E0, 0x1F)): "BGR;15", + } + if file_info["bits"] in SUPPORTED: + if ( + file_info["bits"] == 32 + and file_info["rgba_mask"] in SUPPORTED[file_info["bits"]] + ): + assert isinstance(file_info["rgba_mask"], tuple) + raw_mode = MASK_MODES[(file_info["bits"], file_info["rgba_mask"])] + self._mode = "RGBA" if "A" in raw_mode else self.mode + elif ( + file_info["bits"] in (24, 16) + and file_info["rgb_mask"] in SUPPORTED[file_info["bits"]] + ): + assert isinstance(file_info["rgb_mask"], tuple) + raw_mode = MASK_MODES[(file_info["bits"], file_info["rgb_mask"])] + else: + msg = "Unsupported BMP bitfields layout" + raise OSError(msg) + else: + msg = "Unsupported BMP bitfields layout" + raise OSError(msg) + elif file_info["compression"] == self.COMPRESSIONS["RAW"]: + if file_info["bits"] == 32 and ( + header == 22 or USE_RAW_ALPHA # 32-bit .cur offset + ): + raw_mode, self._mode = "BGRA", "RGBA" + elif file_info["compression"] in ( + self.COMPRESSIONS["RLE8"], + self.COMPRESSIONS["RLE4"], + ): + decoder_name = "bmp_rle" + else: + msg = f"Unsupported BMP compression ({file_info['compression']})" + raise OSError(msg) + + # --------------- Once the header is processed, process the palette/LUT + if self.mode == "P": # Paletted for 1, 4 and 8 bit images + # ---------------------------------------------------- 1-bit images + if not (0 < file_info["colors"] <= 65536): + msg = f"Unsupported BMP Palette size ({file_info['colors']})" + raise OSError(msg) + else: + padding = file_info["palette_padding"] + palette = read(padding * file_info["colors"]) + grayscale = True + indices = ( + (0, 255) + if file_info["colors"] == 2 + else list(range(file_info["colors"])) + ) + + # ----------------- Check if grayscale and ignore palette if so + for ind, val in enumerate(indices): + rgb = palette[ind * padding : ind * padding + 3] + if rgb != o8(val) * 3: + grayscale = False + + # ------- If all colors are gray, white or black, ditch palette + if grayscale: + self._mode = "1" if file_info["colors"] == 2 else "L" + raw_mode = self.mode + else: + self._mode = "P" + self.palette = ImagePalette.raw( + "BGRX" if padding == 4 else "BGR", palette + ) + + # ---------------------------- Finally set the tile data for the plugin + self.info["compression"] = file_info["compression"] + args: list[Any] = [raw_mode] + if decoder_name == "bmp_rle": + args.append(file_info["compression"] == self.COMPRESSIONS["RLE4"]) + else: + assert isinstance(file_info["width"], int) + args.append(((file_info["width"] * file_info["bits"] + 31) >> 3) & (~3)) + args.append(file_info["direction"]) + self.tile = [ + ImageFile._Tile( + decoder_name, + (0, 0, file_info["width"], file_info["height"]), + offset or self.fp.tell(), + tuple(args), + ) + ] + + def _open(self) -> None: + """Open file, check magic number and read header""" + # read 14 bytes: magic number, filesize, reserved, header final offset + assert self.fp is not None + head_data = self.fp.read(14) + # choke if the file does not have the required magic bytes + if not _accept(head_data): + msg = "Not a BMP file" + raise SyntaxError(msg) + # read the start position of the BMP image data (u32) + offset = i32(head_data, 10) + # load bitmap information (offset=raster info) + self._bitmap(offset=offset) + + +class BmpRleDecoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + assert self.fd is not None + rle4 = self.args[1] + data = bytearray() + x = 0 + dest_length = self.state.xsize * self.state.ysize + while len(data) < dest_length: + pixels = self.fd.read(1) + byte = self.fd.read(1) + if not pixels or not byte: + break + num_pixels = pixels[0] + if num_pixels: + # encoded mode + if x + num_pixels > self.state.xsize: + # Too much data for row + num_pixels = max(0, self.state.xsize - x) + if rle4: + first_pixel = o8(byte[0] >> 4) + second_pixel = o8(byte[0] & 0x0F) + for index in range(num_pixels): + if index % 2 == 0: + data += first_pixel + else: + data += second_pixel + else: + data += byte * num_pixels + x += num_pixels + else: + if byte[0] == 0: + # end of line + while len(data) % self.state.xsize != 0: + data += b"\x00" + x = 0 + elif byte[0] == 1: + # end of bitmap + break + elif byte[0] == 2: + # delta + bytes_read = self.fd.read(2) + if len(bytes_read) < 2: + break + right, up = bytes_read + data += b"\x00" * (right + up * self.state.xsize) + x = len(data) % self.state.xsize + else: + # absolute mode + if rle4: + # 2 pixels per byte + byte_count = byte[0] // 2 + bytes_read = self.fd.read(byte_count) + for byte_read in bytes_read: + data += o8(byte_read >> 4) + data += o8(byte_read & 0x0F) + else: + byte_count = byte[0] + bytes_read = self.fd.read(byte_count) + data += bytes_read + if len(bytes_read) < byte_count: + break + x += byte[0] + + # align to 16-bit word boundary + if self.fd.tell() % 2 != 0: + self.fd.seek(1, os.SEEK_CUR) + rawmode = "L" if self.mode == "L" else "P" + self.set_as_raw(bytes(data), rawmode, (0, self.args[-1])) + return -1, 0 + + +# ============================================================================= +# Image plugin for the DIB format (BMP alias) +# ============================================================================= +class DibImageFile(BmpImageFile): + format = "DIB" + format_description = "Windows Bitmap" + + def _open(self) -> None: + self._bitmap() + + +# +# -------------------------------------------------------------------- +# Write BMP file + + +SAVE = { + "1": ("1", 1, 2), + "L": ("L", 8, 256), + "P": ("P", 8, 256), + "RGB": ("BGR", 24, 0), + "RGBA": ("BGRA", 32, 0), +} + + +def _dib_save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + _save(im, fp, filename, False) + + +def _save( + im: Image.Image, fp: IO[bytes], filename: str | bytes, bitmap_header: bool = True +) -> None: + try: + rawmode, bits, colors = SAVE[im.mode] + except KeyError as e: + msg = f"cannot write mode {im.mode} as BMP" + raise OSError(msg) from e + + info = im.encoderinfo + + dpi = info.get("dpi", (96, 96)) + + # 1 meter == 39.3701 inches + ppm = tuple(int(x * 39.3701 + 0.5) for x in dpi) + + stride = ((im.size[0] * bits + 7) // 8 + 3) & (~3) + header = 40 # or 64 for OS/2 version 2 + image = stride * im.size[1] + + if im.mode == "1": + palette = b"".join(o8(i) * 3 + b"\x00" for i in (0, 255)) + elif im.mode == "L": + palette = b"".join(o8(i) * 3 + b"\x00" for i in range(256)) + elif im.mode == "P": + palette = im.im.getpalette("RGB", "BGRX") + colors = len(palette) // 4 + else: + palette = None + + # bitmap header + if bitmap_header: + offset = 14 + header + colors * 4 + file_size = offset + image + if file_size > 2**32 - 1: + msg = "File size is too large for the BMP format" + raise ValueError(msg) + fp.write( + b"BM" # file type (magic) + + o32(file_size) # file size + + o32(0) # reserved + + o32(offset) # image data offset + ) + + # bitmap info header + fp.write( + o32(header) # info header size + + o32(im.size[0]) # width + + o32(im.size[1]) # height + + o16(1) # planes + + o16(bits) # depth + + o32(0) # compression (0=uncompressed) + + o32(image) # size of bitmap + + o32(ppm[0]) # resolution + + o32(ppm[1]) # resolution + + o32(colors) # colors used + + o32(colors) # colors important + ) + + fp.write(b"\0" * (header - 40)) # padding (for OS/2 format) + + if palette: + fp.write(palette) + + ImageFile._save( + im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, stride, -1))] + ) + + +# +# -------------------------------------------------------------------- +# Registry + + +Image.register_open(BmpImageFile.format, BmpImageFile, _accept) +Image.register_save(BmpImageFile.format, _save) + +Image.register_extension(BmpImageFile.format, ".bmp") + +Image.register_mime(BmpImageFile.format, "image/bmp") + +Image.register_decoder("bmp_rle", BmpRleDecoder) + +Image.register_open(DibImageFile.format, DibImageFile, _dib_accept) +Image.register_save(DibImageFile.format, _dib_save) + +Image.register_extension(DibImageFile.format, ".dib") + +Image.register_mime(DibImageFile.format, "image/bmp") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/BufrStubImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/BufrStubImagePlugin.py new file mode 100644 index 000000000..d82c4c746 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/BufrStubImagePlugin.py @@ -0,0 +1,72 @@ +# +# The Python Imaging Library +# $Id$ +# +# BUFR stub adapter +# +# Copyright (c) 1996-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os +from typing import IO + +from . import Image, ImageFile + +_handler = None + + +def register_handler(handler: ImageFile.StubHandler | None) -> None: + """ + Install application-specific BUFR image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith((b"BUFR", b"ZCZC")) + + +class BufrStubImageFile(ImageFile.StubImageFile): + format = "BUFR" + format_description = "BUFR" + + def _open(self) -> None: + assert self.fp is not None + if not _accept(self.fp.read(4)): + msg = "Not a BUFR file" + raise SyntaxError(msg) + + self.fp.seek(-4, os.SEEK_CUR) + + # make something up + self._mode = "F" + self._size = 1, 1 + + def _load(self) -> ImageFile.StubHandler | None: + return _handler + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if _handler is None or not hasattr(_handler, "save"): + msg = "BUFR save handler not installed" + raise OSError(msg) + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(BufrStubImageFile.format, BufrStubImageFile, _accept) +Image.register_save(BufrStubImageFile.format, _save) + +Image.register_extension(BufrStubImageFile.format, ".bufr") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ContainerIO.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ContainerIO.py new file mode 100644 index 000000000..ec9e66c71 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ContainerIO.py @@ -0,0 +1,173 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a class to read from a container file +# +# History: +# 1995-06-18 fl Created +# 1995-09-07 fl Added readline(), readlines() +# +# Copyright (c) 1997-2001 by Secret Labs AB +# Copyright (c) 1995 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +from collections.abc import Iterable +from typing import IO, AnyStr, NoReturn + + +class ContainerIO(IO[AnyStr]): + """ + A file object that provides read access to a part of an existing + file (for example a TAR file). + """ + + def __init__(self, file: IO[AnyStr], offset: int, length: int) -> None: + """ + Create file object. + + :param file: Existing file. + :param offset: Start of region, in bytes. + :param length: Size of region, in bytes. + """ + self.fh: IO[AnyStr] = file + self.pos = 0 + self.offset = offset + self.length = length + self.fh.seek(offset) + + ## + # Always false. + + def isatty(self) -> bool: + return False + + def seekable(self) -> bool: + return True + + def seek(self, offset: int, mode: int = io.SEEK_SET) -> int: + """ + Move file pointer. + + :param offset: Offset in bytes. + :param mode: Starting position. Use 0 for beginning of region, 1 + for current offset, and 2 for end of region. You cannot move + the pointer outside the defined region. + :returns: Offset from start of region, in bytes. + """ + if mode == 1: + self.pos = self.pos + offset + elif mode == 2: + self.pos = self.length + offset + else: + self.pos = offset + # clamp + self.pos = max(0, min(self.pos, self.length)) + self.fh.seek(self.offset + self.pos) + return self.pos + + def tell(self) -> int: + """ + Get current file pointer. + + :returns: Offset from start of region, in bytes. + """ + return self.pos + + def readable(self) -> bool: + return True + + def read(self, n: int = -1) -> AnyStr: + """ + Read data. + + :param n: Number of bytes to read. If omitted, zero or negative, + read until end of region. + :returns: An 8-bit string. + """ + if n > 0: + n = min(n, self.length - self.pos) + else: + n = self.length - self.pos + if n <= 0: # EOF + return b"" if "b" in self.fh.mode else "" # type: ignore[return-value] + self.pos = self.pos + n + return self.fh.read(n) + + def readline(self, n: int = -1) -> AnyStr: + """ + Read a line of text. + + :param n: Number of bytes to read. If omitted, zero or negative, + read until end of line. + :returns: An 8-bit string. + """ + s: AnyStr = b"" if "b" in self.fh.mode else "" # type: ignore[assignment] + newline_character = b"\n" if "b" in self.fh.mode else "\n" + while True: + c = self.read(1) + if not c: + break + s = s + c + if c == newline_character or len(s) == n: + break + return s + + def readlines(self, n: int | None = -1) -> list[AnyStr]: + """ + Read multiple lines of text. + + :param n: Number of lines to read. If omitted, zero, negative or None, + read until end of region. + :returns: A list of 8-bit strings. + """ + lines = [] + while True: + s = self.readline() + if not s: + break + lines.append(s) + if len(lines) == n: + break + return lines + + def writable(self) -> bool: + return False + + def write(self, b: AnyStr) -> NoReturn: + raise NotImplementedError() + + def writelines(self, lines: Iterable[AnyStr]) -> NoReturn: + raise NotImplementedError() + + def truncate(self, size: int | None = None) -> int: + raise NotImplementedError() + + def __enter__(self) -> ContainerIO[AnyStr]: + return self + + def __exit__(self, *args: object) -> None: + self.close() + + def __iter__(self) -> ContainerIO[AnyStr]: + return self + + def __next__(self) -> AnyStr: + line = self.readline() + if not line: + msg = "end of region" + raise StopIteration(msg) + return line + + def fileno(self) -> int: + return self.fh.fileno() + + def flush(self) -> None: + self.fh.flush() + + def close(self) -> None: + self.fh.close() diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/CurImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/CurImagePlugin.py new file mode 100644 index 000000000..9c188e084 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/CurImagePlugin.py @@ -0,0 +1,75 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Windows Cursor support for PIL +# +# notes: +# uses BmpImagePlugin.py to read the bitmap data. +# +# history: +# 96-05-27 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import BmpImagePlugin, Image +from ._binary import i16le as i16 +from ._binary import i32le as i32 + +# +# -------------------------------------------------------------------- + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(b"\0\0\2\0") + + +## +# Image plugin for Windows Cursor files. + + +class CurImageFile(BmpImagePlugin.BmpImageFile): + format = "CUR" + format_description = "Windows Cursor" + + def _open(self) -> None: + assert self.fp is not None + offset = self.fp.tell() + + # check magic + s = self.fp.read(6) + if not _accept(s): + msg = "not a CUR file" + raise SyntaxError(msg) + + # pick the largest cursor in the file + m = b"" + for i in range(i16(s, 4)): + s = self.fp.read(16) + if not m: + m = s + elif s[0] > m[0] and s[1] > m[1]: + m = s + if not m: + msg = "No cursors were found" + raise TypeError(msg) + + # load as bitmap + self._bitmap(i32(m, 12) + offset) + + # patch up the bitmap height + self._size = self.size[0], self.size[1] // 2 + self.tile = [self.tile[0]._replace(extents=(0, 0) + self.size)] + + +# +# -------------------------------------------------------------------- + +Image.register_open(CurImageFile.format, CurImageFile, _accept) + +Image.register_extension(CurImageFile.format, ".cur") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/DcxImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/DcxImagePlugin.py new file mode 100644 index 000000000..d3f456ddc --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/DcxImagePlugin.py @@ -0,0 +1,84 @@ +# +# The Python Imaging Library. +# $Id$ +# +# DCX file handling +# +# DCX is a container file format defined by Intel, commonly used +# for fax applications. Each DCX file consists of a directory +# (a list of file offsets) followed by a set of (usually 1-bit) +# PCX files. +# +# History: +# 1995-09-09 fl Created +# 1996-03-20 fl Properly derived from PcxImageFile. +# 1998-07-15 fl Renamed offset attribute to avoid name clash +# 2002-07-30 fl Fixed file handling +# +# Copyright (c) 1997-98 by Secret Labs AB. +# Copyright (c) 1995-96 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image +from ._binary import i32le as i32 +from ._util import DeferredError +from .PcxImagePlugin import PcxImageFile + +MAGIC = 0x3ADE68B1 # QUIZ: what's this value, then? + + +def _accept(prefix: bytes) -> bool: + return len(prefix) >= 4 and i32(prefix) == MAGIC + + +## +# Image plugin for the Intel DCX format. + + +class DcxImageFile(PcxImageFile): + format = "DCX" + format_description = "Intel DCX" + _close_exclusive_fp_after_loading = False + + def _open(self) -> None: + # Header + assert self.fp is not None + s = self.fp.read(4) + if not _accept(s): + msg = "not a DCX file" + raise SyntaxError(msg) + + # Component directory + self._offset = [] + for i in range(1024): + offset = i32(self.fp.read(4)) + if not offset: + break + self._offset.append(offset) + + self._fp = self.fp + self.frame = -1 + self.n_frames = len(self._offset) + self.is_animated = self.n_frames > 1 + self.seek(0) + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + if isinstance(self._fp, DeferredError): + raise self._fp.ex + self.frame = frame + self.fp = self._fp + self.fp.seek(self._offset[frame]) + PcxImageFile._open(self) + + def tell(self) -> int: + return self.frame + + +Image.register_open(DcxImageFile.format, DcxImageFile, _accept) + +Image.register_extension(DcxImageFile.format, ".dcx") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py new file mode 100644 index 000000000..312f602a6 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/DdsImagePlugin.py @@ -0,0 +1,625 @@ +""" +A Pillow plugin for .dds files (S3TC-compressed aka DXTC) +Jerome Leclanche + +Documentation: +https://web.archive.org/web/20170802060935/http://oss.sgi.com/projects/ogl-sample/registry/EXT/texture_compression_s3tc.txt + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: +https://creativecommons.org/publicdomain/zero/1.0/ +""" + +from __future__ import annotations + +import struct +import sys +from enum import IntEnum, IntFlag +from typing import IO + +from . import Image, ImageFile, ImagePalette +from ._binary import i32le as i32 +from ._binary import o8 +from ._binary import o32le as o32 + +# Magic ("DDS ") +DDS_MAGIC = 0x20534444 + + +# DDS flags +class DDSD(IntFlag): + CAPS = 0x1 + HEIGHT = 0x2 + WIDTH = 0x4 + PITCH = 0x8 + PIXELFORMAT = 0x1000 + MIPMAPCOUNT = 0x20000 + LINEARSIZE = 0x80000 + DEPTH = 0x800000 + + +# DDS caps +class DDSCAPS(IntFlag): + COMPLEX = 0x8 + TEXTURE = 0x1000 + MIPMAP = 0x400000 + + +class DDSCAPS2(IntFlag): + CUBEMAP = 0x200 + CUBEMAP_POSITIVEX = 0x400 + CUBEMAP_NEGATIVEX = 0x800 + CUBEMAP_POSITIVEY = 0x1000 + CUBEMAP_NEGATIVEY = 0x2000 + CUBEMAP_POSITIVEZ = 0x4000 + CUBEMAP_NEGATIVEZ = 0x8000 + VOLUME = 0x200000 + + +# Pixel Format +class DDPF(IntFlag): + ALPHAPIXELS = 0x1 + ALPHA = 0x2 + FOURCC = 0x4 + PALETTEINDEXED8 = 0x20 + RGB = 0x40 + LUMINANCE = 0x20000 + + +# dxgiformat.h +class DXGI_FORMAT(IntEnum): + UNKNOWN = 0 + R32G32B32A32_TYPELESS = 1 + R32G32B32A32_FLOAT = 2 + R32G32B32A32_UINT = 3 + R32G32B32A32_SINT = 4 + R32G32B32_TYPELESS = 5 + R32G32B32_FLOAT = 6 + R32G32B32_UINT = 7 + R32G32B32_SINT = 8 + R16G16B16A16_TYPELESS = 9 + R16G16B16A16_FLOAT = 10 + R16G16B16A16_UNORM = 11 + R16G16B16A16_UINT = 12 + R16G16B16A16_SNORM = 13 + R16G16B16A16_SINT = 14 + R32G32_TYPELESS = 15 + R32G32_FLOAT = 16 + R32G32_UINT = 17 + R32G32_SINT = 18 + R32G8X24_TYPELESS = 19 + D32_FLOAT_S8X24_UINT = 20 + R32_FLOAT_X8X24_TYPELESS = 21 + X32_TYPELESS_G8X24_UINT = 22 + R10G10B10A2_TYPELESS = 23 + R10G10B10A2_UNORM = 24 + R10G10B10A2_UINT = 25 + R11G11B10_FLOAT = 26 + R8G8B8A8_TYPELESS = 27 + R8G8B8A8_UNORM = 28 + R8G8B8A8_UNORM_SRGB = 29 + R8G8B8A8_UINT = 30 + R8G8B8A8_SNORM = 31 + R8G8B8A8_SINT = 32 + R16G16_TYPELESS = 33 + R16G16_FLOAT = 34 + R16G16_UNORM = 35 + R16G16_UINT = 36 + R16G16_SNORM = 37 + R16G16_SINT = 38 + R32_TYPELESS = 39 + D32_FLOAT = 40 + R32_FLOAT = 41 + R32_UINT = 42 + R32_SINT = 43 + R24G8_TYPELESS = 44 + D24_UNORM_S8_UINT = 45 + R24_UNORM_X8_TYPELESS = 46 + X24_TYPELESS_G8_UINT = 47 + R8G8_TYPELESS = 48 + R8G8_UNORM = 49 + R8G8_UINT = 50 + R8G8_SNORM = 51 + R8G8_SINT = 52 + R16_TYPELESS = 53 + R16_FLOAT = 54 + D16_UNORM = 55 + R16_UNORM = 56 + R16_UINT = 57 + R16_SNORM = 58 + R16_SINT = 59 + R8_TYPELESS = 60 + R8_UNORM = 61 + R8_UINT = 62 + R8_SNORM = 63 + R8_SINT = 64 + A8_UNORM = 65 + R1_UNORM = 66 + R9G9B9E5_SHAREDEXP = 67 + R8G8_B8G8_UNORM = 68 + G8R8_G8B8_UNORM = 69 + BC1_TYPELESS = 70 + BC1_UNORM = 71 + BC1_UNORM_SRGB = 72 + BC2_TYPELESS = 73 + BC2_UNORM = 74 + BC2_UNORM_SRGB = 75 + BC3_TYPELESS = 76 + BC3_UNORM = 77 + BC3_UNORM_SRGB = 78 + BC4_TYPELESS = 79 + BC4_UNORM = 80 + BC4_SNORM = 81 + BC5_TYPELESS = 82 + BC5_UNORM = 83 + BC5_SNORM = 84 + B5G6R5_UNORM = 85 + B5G5R5A1_UNORM = 86 + B8G8R8A8_UNORM = 87 + B8G8R8X8_UNORM = 88 + R10G10B10_XR_BIAS_A2_UNORM = 89 + B8G8R8A8_TYPELESS = 90 + B8G8R8A8_UNORM_SRGB = 91 + B8G8R8X8_TYPELESS = 92 + B8G8R8X8_UNORM_SRGB = 93 + BC6H_TYPELESS = 94 + BC6H_UF16 = 95 + BC6H_SF16 = 96 + BC7_TYPELESS = 97 + BC7_UNORM = 98 + BC7_UNORM_SRGB = 99 + AYUV = 100 + Y410 = 101 + Y416 = 102 + NV12 = 103 + P010 = 104 + P016 = 105 + OPAQUE_420 = 106 + YUY2 = 107 + Y210 = 108 + Y216 = 109 + NV11 = 110 + AI44 = 111 + IA44 = 112 + P8 = 113 + A8P8 = 114 + B4G4R4A4_UNORM = 115 + P208 = 130 + V208 = 131 + V408 = 132 + SAMPLER_FEEDBACK_MIN_MIP_OPAQUE = 189 + SAMPLER_FEEDBACK_MIP_REGION_USED_OPAQUE = 190 + + +class D3DFMT(IntEnum): + UNKNOWN = 0 + R8G8B8 = 20 + A8R8G8B8 = 21 + X8R8G8B8 = 22 + R5G6B5 = 23 + X1R5G5B5 = 24 + A1R5G5B5 = 25 + A4R4G4B4 = 26 + R3G3B2 = 27 + A8 = 28 + A8R3G3B2 = 29 + X4R4G4B4 = 30 + A2B10G10R10 = 31 + A8B8G8R8 = 32 + X8B8G8R8 = 33 + G16R16 = 34 + A2R10G10B10 = 35 + A16B16G16R16 = 36 + A8P8 = 40 + P8 = 41 + L8 = 50 + A8L8 = 51 + A4L4 = 52 + V8U8 = 60 + L6V5U5 = 61 + X8L8V8U8 = 62 + Q8W8V8U8 = 63 + V16U16 = 64 + A2W10V10U10 = 67 + D16_LOCKABLE = 70 + D32 = 71 + D15S1 = 73 + D24S8 = 75 + D24X8 = 77 + D24X4S4 = 79 + D16 = 80 + D32F_LOCKABLE = 82 + D24FS8 = 83 + D32_LOCKABLE = 84 + S8_LOCKABLE = 85 + L16 = 81 + VERTEXDATA = 100 + INDEX16 = 101 + INDEX32 = 102 + Q16W16V16U16 = 110 + R16F = 111 + G16R16F = 112 + A16B16G16R16F = 113 + R32F = 114 + G32R32F = 115 + A32B32G32R32F = 116 + CxV8U8 = 117 + A1 = 118 + A2B10G10R10_XR_BIAS = 119 + BINARYBUFFER = 199 + + UYVY = i32(b"UYVY") + R8G8_B8G8 = i32(b"RGBG") + YUY2 = i32(b"YUY2") + G8R8_G8B8 = i32(b"GRGB") + DXT1 = i32(b"DXT1") + DXT2 = i32(b"DXT2") + DXT3 = i32(b"DXT3") + DXT4 = i32(b"DXT4") + DXT5 = i32(b"DXT5") + DX10 = i32(b"DX10") + BC4S = i32(b"BC4S") + BC4U = i32(b"BC4U") + BC5S = i32(b"BC5S") + BC5U = i32(b"BC5U") + ATI1 = i32(b"ATI1") + ATI2 = i32(b"ATI2") + MULTI2_ARGB8 = i32(b"MET1") + + +# Backward compatibility layer +module = sys.modules[__name__] +for item in DDSD: + assert item.name is not None + setattr(module, f"DDSD_{item.name}", item.value) +for item1 in DDSCAPS: + assert item1.name is not None + setattr(module, f"DDSCAPS_{item1.name}", item1.value) +for item2 in DDSCAPS2: + assert item2.name is not None + setattr(module, f"DDSCAPS2_{item2.name}", item2.value) +for item3 in DDPF: + assert item3.name is not None + setattr(module, f"DDPF_{item3.name}", item3.value) + +DDS_FOURCC = DDPF.FOURCC +DDS_RGB = DDPF.RGB +DDS_RGBA = DDPF.RGB | DDPF.ALPHAPIXELS +DDS_LUMINANCE = DDPF.LUMINANCE +DDS_LUMINANCEA = DDPF.LUMINANCE | DDPF.ALPHAPIXELS +DDS_ALPHA = DDPF.ALPHA +DDS_PAL8 = DDPF.PALETTEINDEXED8 + +DDS_HEADER_FLAGS_TEXTURE = DDSD.CAPS | DDSD.HEIGHT | DDSD.WIDTH | DDSD.PIXELFORMAT +DDS_HEADER_FLAGS_MIPMAP = DDSD.MIPMAPCOUNT +DDS_HEADER_FLAGS_VOLUME = DDSD.DEPTH +DDS_HEADER_FLAGS_PITCH = DDSD.PITCH +DDS_HEADER_FLAGS_LINEARSIZE = DDSD.LINEARSIZE + +DDS_HEIGHT = DDSD.HEIGHT +DDS_WIDTH = DDSD.WIDTH + +DDS_SURFACE_FLAGS_TEXTURE = DDSCAPS.TEXTURE +DDS_SURFACE_FLAGS_MIPMAP = DDSCAPS.COMPLEX | DDSCAPS.MIPMAP +DDS_SURFACE_FLAGS_CUBEMAP = DDSCAPS.COMPLEX + +DDS_CUBEMAP_POSITIVEX = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_POSITIVEX +DDS_CUBEMAP_NEGATIVEX = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEX +DDS_CUBEMAP_POSITIVEY = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_POSITIVEY +DDS_CUBEMAP_NEGATIVEY = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEY +DDS_CUBEMAP_POSITIVEZ = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_POSITIVEZ +DDS_CUBEMAP_NEGATIVEZ = DDSCAPS2.CUBEMAP | DDSCAPS2.CUBEMAP_NEGATIVEZ + +DXT1_FOURCC = D3DFMT.DXT1 +DXT3_FOURCC = D3DFMT.DXT3 +DXT5_FOURCC = D3DFMT.DXT5 + +DXGI_FORMAT_R8G8B8A8_TYPELESS = DXGI_FORMAT.R8G8B8A8_TYPELESS +DXGI_FORMAT_R8G8B8A8_UNORM = DXGI_FORMAT.R8G8B8A8_UNORM +DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = DXGI_FORMAT.R8G8B8A8_UNORM_SRGB +DXGI_FORMAT_BC5_TYPELESS = DXGI_FORMAT.BC5_TYPELESS +DXGI_FORMAT_BC5_UNORM = DXGI_FORMAT.BC5_UNORM +DXGI_FORMAT_BC5_SNORM = DXGI_FORMAT.BC5_SNORM +DXGI_FORMAT_BC6H_UF16 = DXGI_FORMAT.BC6H_UF16 +DXGI_FORMAT_BC6H_SF16 = DXGI_FORMAT.BC6H_SF16 +DXGI_FORMAT_BC7_TYPELESS = DXGI_FORMAT.BC7_TYPELESS +DXGI_FORMAT_BC7_UNORM = DXGI_FORMAT.BC7_UNORM +DXGI_FORMAT_BC7_UNORM_SRGB = DXGI_FORMAT.BC7_UNORM_SRGB + + +class DdsImageFile(ImageFile.ImageFile): + format = "DDS" + format_description = "DirectDraw Surface" + + def _open(self) -> None: + assert self.fp is not None + if not _accept(self.fp.read(4)): + msg = "not a DDS file" + raise SyntaxError(msg) + (header_size,) = struct.unpack(" None: + pass + + +class DdsRgbDecoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + assert self.fd is not None + bitcount, masks = self.args + + # Some masks will be padded with zeros, e.g. R 0b11 G 0b1100 + # Calculate how many zeros each mask is padded with + mask_offsets = [] + # And the maximum value of each channel without the padding + mask_totals = [] + for mask in masks: + offset = 0 + if mask != 0: + while mask >> (offset + 1) << (offset + 1) == mask: + offset += 1 + mask_offsets.append(offset) + mask_totals.append(mask >> offset) + + data = bytearray() + bytecount = bitcount // 8 + dest_length = self.state.xsize * self.state.ysize * len(masks) + while len(data) < dest_length: + value = int.from_bytes(self.fd.read(bytecount), "little") + for i, mask in enumerate(masks): + masked_value = value & mask + # Remove the zero padding, and scale it to 8 bits + data += o8( + int(((masked_value >> mask_offsets[i]) / mask_totals[i]) * 255) + if mask_totals[i] + else 0 + ) + self.set_as_raw(data) + return -1, 0 + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode not in ("RGB", "RGBA", "L", "LA"): + msg = f"cannot write mode {im.mode} as DDS" + raise OSError(msg) + + flags = DDSD.CAPS | DDSD.HEIGHT | DDSD.WIDTH | DDSD.PIXELFORMAT + bitcount = len(im.getbands()) * 8 + pixel_format = im.encoderinfo.get("pixel_format") + args: tuple[int] | str + if pixel_format: + codec_name = "bcn" + flags |= DDSD.LINEARSIZE + pitch = (im.width + 3) * 4 + rgba_mask = [0, 0, 0, 0] + pixel_flags = DDPF.FOURCC + if pixel_format == "DXT1": + fourcc = D3DFMT.DXT1 + args = (1,) + elif pixel_format == "DXT3": + fourcc = D3DFMT.DXT3 + args = (2,) + elif pixel_format == "DXT5": + fourcc = D3DFMT.DXT5 + args = (3,) + else: + fourcc = D3DFMT.DX10 + if pixel_format == "BC2": + args = (2,) + dxgi_format = DXGI_FORMAT.BC2_TYPELESS + elif pixel_format == "BC3": + args = (3,) + dxgi_format = DXGI_FORMAT.BC3_TYPELESS + elif pixel_format == "BC5": + args = (5,) + dxgi_format = DXGI_FORMAT.BC5_TYPELESS + if im.mode != "RGB": + msg = "only RGB mode can be written as BC5" + raise OSError(msg) + else: + msg = f"cannot write pixel format {pixel_format}" + raise OSError(msg) + else: + codec_name = "raw" + flags |= DDSD.PITCH + pitch = (im.width * bitcount + 7) // 8 + + alpha = im.mode[-1] == "A" + if im.mode[0] == "L": + pixel_flags = DDPF.LUMINANCE + args = im.mode + if alpha: + rgba_mask = [0x000000FF, 0x000000FF, 0x000000FF] + else: + rgba_mask = [0xFF000000, 0xFF000000, 0xFF000000] + else: + pixel_flags = DDPF.RGB + args = im.mode[::-1] + rgba_mask = [0x00FF0000, 0x0000FF00, 0x000000FF] + + if alpha: + r, g, b, a = im.split() + im = Image.merge("RGBA", (a, r, g, b)) + if alpha: + pixel_flags |= DDPF.ALPHAPIXELS + rgba_mask.append(0xFF000000 if alpha else 0) + + fourcc = D3DFMT.UNKNOWN + fp.write( + o32(DDS_MAGIC) + + struct.pack( + "<7I", + 124, # header size + flags, # flags + im.height, + im.width, + pitch, + 0, # depth + 0, # mipmaps + ) + + struct.pack("11I", *((0,) * 11)) # reserved + # pfsize, pfflags, fourcc, bitcount + + struct.pack("<4I", 32, pixel_flags, fourcc, bitcount) + + struct.pack("<4I", *rgba_mask) # dwRGBABitMask + + struct.pack("<5I", DDSCAPS.TEXTURE, 0, 0, 0, 0) + ) + if fourcc == D3DFMT.DX10: + fp.write( + # dxgi_format, 2D resource, misc, array size, straight alpha + struct.pack("<5I", dxgi_format, 3, 0, 0, 1) + ) + ImageFile._save(im, fp, [ImageFile._Tile(codec_name, (0, 0) + im.size, 0, args)]) + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(b"DDS ") + + +Image.register_open(DdsImageFile.format, DdsImageFile, _accept) +Image.register_decoder("dds_rgb", DdsRgbDecoder) +Image.register_save(DdsImageFile.format, _save) +Image.register_extension(DdsImageFile.format, ".dds") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py new file mode 100644 index 000000000..aeb7b0c93 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/EpsImagePlugin.py @@ -0,0 +1,481 @@ +# +# The Python Imaging Library. +# $Id$ +# +# EPS file handling +# +# History: +# 1995-09-01 fl Created (0.1) +# 1996-05-18 fl Don't choke on "atend" fields, Ghostscript interface (0.2) +# 1996-08-22 fl Don't choke on floating point BoundingBox values +# 1996-08-23 fl Handle files from Macintosh (0.3) +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) +# 2003-09-07 fl Check gs.close status (from Federico Di Gregorio) (0.5) +# 2014-05-07 e Handling of EPS with binary preview and fixed resolution +# resizing +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +import os +import re +import subprocess +import sys +import tempfile +from typing import IO + +from . import Image, ImageFile +from ._binary import i32le as i32 + +# -------------------------------------------------------------------- + + +split = re.compile(r"^%%([^:]*):[ \t]*(.*)[ \t]*$") +field = re.compile(r"^%[%!\w]([^:]*)[ \t]*$") + +gs_binary: str | bool | None = None +gs_windows_binary = None + + +def has_ghostscript() -> bool: + global gs_binary, gs_windows_binary + if gs_binary is None: + if sys.platform.startswith("win"): + if gs_windows_binary is None: + import shutil + + for binary in ("gswin32c", "gswin64c", "gs"): + if shutil.which(binary) is not None: + gs_windows_binary = binary + break + else: + gs_windows_binary = False + gs_binary = gs_windows_binary + else: + try: + subprocess.check_call(["gs", "--version"], stdout=subprocess.DEVNULL) + gs_binary = "gs" + except OSError: + gs_binary = False + return gs_binary is not False + + +def Ghostscript( + tile: list[ImageFile._Tile], + size: tuple[int, int], + fp: IO[bytes], + scale: int = 1, + transparency: bool = False, +) -> Image.core.ImagingCore: + """Render an image using Ghostscript""" + global gs_binary + if not has_ghostscript(): + msg = "Unable to locate Ghostscript on paths" + raise OSError(msg) + assert isinstance(gs_binary, str) + + # Unpack decoder tile + args = tile[0].args + assert isinstance(args, tuple) + length, bbox = args + + # Hack to support hi-res rendering + scale = int(scale) or 1 + width = size[0] * scale + height = size[1] * scale + # resolution is dependent on bbox and size + res_x = 72.0 * width / (bbox[2] - bbox[0]) + res_y = 72.0 * height / (bbox[3] - bbox[1]) + + out_fd, outfile = tempfile.mkstemp() + os.close(out_fd) + + infile_temp = None + if hasattr(fp, "name") and os.path.exists(fp.name): + infile = fp.name + else: + in_fd, infile_temp = tempfile.mkstemp() + os.close(in_fd) + infile = infile_temp + + # Ignore length and offset! + # Ghostscript can read it + # Copy whole file to read in Ghostscript + with open(infile_temp, "wb") as f: + # fetch length of fp + fp.seek(0, io.SEEK_END) + fsize = fp.tell() + # ensure start position + # go back + fp.seek(0) + lengthfile = fsize + while lengthfile > 0: + s = fp.read(min(lengthfile, 100 * 1024)) + if not s: + break + lengthfile -= len(s) + f.write(s) + + if transparency: + # "RGBA" + device = "pngalpha" + else: + # "pnmraw" automatically chooses between + # PBM ("1"), PGM ("L"), and PPM ("RGB"). + device = "pnmraw" + + # Build Ghostscript command + command = [ + gs_binary, + "-q", # quiet mode + f"-g{width:d}x{height:d}", # set output geometry (pixels) + f"-r{res_x:f}x{res_y:f}", # set input DPI (dots per inch) + "-dBATCH", # exit after processing + "-dNOPAUSE", # don't pause between pages + "-dSAFER", # safe mode + f"-sDEVICE={device}", + f"-sOutputFile={outfile}", # output file + # adjust for image origin + "-c", + f"{-bbox[0]} {-bbox[1]} translate", + "-f", + infile, # input file + # showpage (see https://bugs.ghostscript.com/show_bug.cgi?id=698272) + "-c", + "showpage", + ] + + # push data through Ghostscript + try: + startupinfo = None + if sys.platform.startswith("win"): + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + subprocess.check_call(command, startupinfo=startupinfo) + with Image.open(outfile) as out_im: + out_im.load() + return out_im.im.copy() + finally: + try: + os.unlink(outfile) + if infile_temp: + os.unlink(infile_temp) + except OSError: + pass + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(b"%!PS") or ( + len(prefix) >= 4 and i32(prefix) == 0xC6D3D0C5 + ) + + +## +# Image plugin for Encapsulated PostScript. This plugin supports only +# a few variants of this format. + + +class EpsImageFile(ImageFile.ImageFile): + """EPS File Parser for the Python Imaging Library""" + + format = "EPS" + format_description = "Encapsulated Postscript" + + mode_map = {1: "L", 2: "LAB", 3: "RGB", 4: "CMYK"} + + def _open(self) -> None: + assert self.fp is not None + length, offset = self._find_offset(self.fp) + + # go to offset - start of "%!PS" + self.fp.seek(offset) + + self._mode = "RGB" + + # When reading header comments, the first comment is used. + # When reading trailer comments, the last comment is used. + bounding_box: list[int] | None = None + imagedata_size: tuple[int, int] | None = None + + byte_arr = bytearray(255) + bytes_mv = memoryview(byte_arr) + bytes_read = 0 + reading_header_comments = True + reading_trailer_comments = False + trailer_reached = False + + def check_required_header_comments() -> None: + """ + The EPS specification requires that some headers exist. + This should be checked when the header comments formally end, + when image data starts, or when the file ends, whichever comes first. + """ + if "PS-Adobe" not in self.info: + msg = 'EPS header missing "%!PS-Adobe" comment' + raise SyntaxError(msg) + if "BoundingBox" not in self.info: + msg = 'EPS header missing "%%BoundingBox" comment' + raise SyntaxError(msg) + + def read_comment(s: str) -> bool: + nonlocal bounding_box, reading_trailer_comments + try: + m = split.match(s) + except re.error as e: + msg = "not an EPS file" + raise SyntaxError(msg) from e + + if not m: + return False + + k, v = m.group(1, 2) + self.info[k] = v + if k == "BoundingBox": + if v == "(atend)": + reading_trailer_comments = True + elif not bounding_box or (trailer_reached and reading_trailer_comments): + try: + # Note: The DSC spec says that BoundingBox + # fields should be integers, but some drivers + # put floating point values there anyway. + bounding_box = [int(float(i)) for i in v.split()] + except Exception: + pass + return True + + while True: + byte = self.fp.read(1) + if byte == b"": + # if we didn't read a byte we must be at the end of the file + if bytes_read == 0: + if reading_header_comments: + check_required_header_comments() + break + elif byte in b"\r\n": + # if we read a line ending character, ignore it and parse what + # we have already read. if we haven't read any other characters, + # continue reading + if bytes_read == 0: + continue + else: + # ASCII/hexadecimal lines in an EPS file must not exceed + # 255 characters, not including line ending characters + if bytes_read >= 255: + # only enforce this for lines starting with a "%", + # otherwise assume it's binary data + if byte_arr[0] == ord("%"): + msg = "not an EPS file" + raise SyntaxError(msg) + else: + if reading_header_comments: + check_required_header_comments() + reading_header_comments = False + # reset bytes_read so we can keep reading + # data until the end of the line + bytes_read = 0 + byte_arr[bytes_read] = byte[0] + bytes_read += 1 + continue + + if reading_header_comments: + # Load EPS header + + # if this line doesn't start with a "%", + # or does start with "%%EndComments", + # then we've reached the end of the header/comments + if byte_arr[0] != ord("%") or bytes_mv[:13] == b"%%EndComments": + check_required_header_comments() + reading_header_comments = False + continue + + s = str(bytes_mv[:bytes_read], "latin-1") + if not read_comment(s): + m = field.match(s) + if m: + k = m.group(1) + if k.startswith("PS-Adobe"): + self.info["PS-Adobe"] = k[9:] + else: + self.info[k] = "" + elif s[0] == "%": + # handle non-DSC PostScript comments that some + # tools mistakenly put in the Comments section + pass + else: + msg = "bad EPS header" + raise OSError(msg) + elif bytes_mv[:11] == b"%ImageData:": + # Check for an "ImageData" descriptor + # https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577413_pgfId-1035096 + + # If we've already read an "ImageData" descriptor, + # don't read another one. + if imagedata_size: + bytes_read = 0 + continue + + # Values: + # columns + # rows + # bit depth (1 or 8) + # mode (1: L, 2: LAB, 3: RGB, 4: CMYK) + # number of padding channels + # block size (number of bytes per row per channel) + # binary/ascii (1: binary, 2: ascii) + # data start identifier (the image data follows after a single line + # consisting only of this quoted value) + image_data_values = byte_arr[11:bytes_read].split(None, 7) + columns, rows, bit_depth, mode_id = ( + int(value) for value in image_data_values[:4] + ) + + if bit_depth == 1: + self._mode = "1" + elif bit_depth == 8: + try: + self._mode = self.mode_map[mode_id] + except ValueError: + break + else: + break + + # Parse the columns and rows after checking the bit depth and mode + # in case the bit depth and/or mode are invalid. + imagedata_size = columns, rows + elif bytes_mv[:5] == b"%%EOF": + break + elif trailer_reached and reading_trailer_comments: + # Load EPS trailer + s = str(bytes_mv[:bytes_read], "latin-1") + read_comment(s) + elif bytes_mv[:9] == b"%%Trailer": + trailer_reached = True + elif bytes_mv[:14] == b"%%BeginBinary:": + bytecount = int(byte_arr[14:bytes_read]) + self.fp.seek(bytecount, os.SEEK_CUR) + bytes_read = 0 + + # A "BoundingBox" is always required, + # even if an "ImageData" descriptor size exists. + if not bounding_box: + msg = "cannot determine EPS bounding box" + raise OSError(msg) + + # An "ImageData" size takes precedence over the "BoundingBox". + self._size = imagedata_size or ( + bounding_box[2] - bounding_box[0], + bounding_box[3] - bounding_box[1], + ) + + self.tile = [ + ImageFile._Tile("eps", (0, 0) + self.size, offset, (length, bounding_box)) + ] + + def _find_offset(self, fp: IO[bytes]) -> tuple[int, int]: + s = fp.read(4) + + if s == b"%!PS": + # for HEAD without binary preview + fp.seek(0, io.SEEK_END) + length = fp.tell() + offset = 0 + elif i32(s) == 0xC6D3D0C5: + # FIX for: Some EPS file not handled correctly / issue #302 + # EPS can contain binary data + # or start directly with latin coding + # more info see: + # https://web.archive.org/web/20160528181353/http://partners.adobe.com/public/developer/en/ps/5002.EPSF_Spec.pdf + s = fp.read(8) + offset = i32(s) + length = i32(s, 4) + else: + msg = "not an EPS file" + raise SyntaxError(msg) + + return length, offset + + def load( + self, scale: int = 1, transparency: bool = False + ) -> Image.core.PixelAccess | None: + # Load EPS via Ghostscript + if self.tile: + assert self.fp is not None + self.im = Ghostscript(self.tile, self.size, self.fp, scale, transparency) + self._mode = self.im.mode + self._size = self.im.size + self.tile = [] + return Image.Image.load(self) + + def load_seek(self, pos: int) -> None: + # we can't incrementally load, so force ImageFile.parser to + # use our custom load method by defining this method. + pass + + +# -------------------------------------------------------------------- + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes, eps: int = 1) -> None: + """EPS Writer for the Python Imaging Library.""" + + # make sure image data is available + im.load() + + # determine PostScript image mode + if im.mode == "L": + operator = (8, 1, b"image") + elif im.mode == "RGB": + operator = (8, 3, b"false 3 colorimage") + elif im.mode == "CMYK": + operator = (8, 4, b"false 4 colorimage") + else: + msg = "image mode is not supported" + raise ValueError(msg) + + if eps: + # write EPS header + fp.write(b"%!PS-Adobe-3.0 EPSF-3.0\n") + fp.write(b"%%Creator: PIL 0.1 EpsEncode\n") + # fp.write("%%CreationDate: %s"...) + fp.write(b"%%%%BoundingBox: 0 0 %d %d\n" % im.size) + fp.write(b"%%Pages: 1\n") + fp.write(b"%%EndComments\n") + fp.write(b"%%Page: 1 1\n") + fp.write(b"%%ImageData: %d %d " % im.size) + fp.write(b'%d %d 0 1 1 "%s"\n' % operator) + + # image header + fp.write(b"gsave\n") + fp.write(b"10 dict begin\n") + fp.write(b"/buf %d string def\n" % (im.size[0] * operator[1])) + fp.write(b"%d %d scale\n" % im.size) + fp.write(b"%d %d 8\n" % im.size) # <= bits + fp.write(b"[%d 0 0 -%d 0 %d]\n" % (im.size[0], im.size[1], im.size[1])) + fp.write(b"{ currentfile buf readhexstring pop } bind\n") + fp.write(operator[2] + b"\n") + if hasattr(fp, "flush"): + fp.flush() + + ImageFile._save(im, fp, [ImageFile._Tile("eps", (0, 0) + im.size)]) + + fp.write(b"\n%%%%EndBinary\n") + fp.write(b"grestore end\n") + if hasattr(fp, "flush"): + fp.flush() + + +# -------------------------------------------------------------------- + + +Image.register_open(EpsImageFile.format, EpsImageFile, _accept) + +Image.register_save(EpsImageFile.format, _save) + +Image.register_extensions(EpsImageFile.format, [".ps", ".eps"]) + +Image.register_mime(EpsImageFile.format, "application/postscript") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ExifTags.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ExifTags.py new file mode 100644 index 000000000..a9522e761 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ExifTags.py @@ -0,0 +1,384 @@ +# +# The Python Imaging Library. +# $Id$ +# +# EXIF tags +# +# Copyright (c) 2003 by Secret Labs AB +# +# See the README file for information on usage and redistribution. +# + +""" +This module provides constants and clear-text names for various +well-known EXIF tags. +""" + +from __future__ import annotations + +from enum import IntEnum + + +class Base(IntEnum): + # possibly incomplete + InteropIndex = 0x0001 + ProcessingSoftware = 0x000B + NewSubfileType = 0x00FE + SubfileType = 0x00FF + ImageWidth = 0x0100 + ImageLength = 0x0101 + BitsPerSample = 0x0102 + Compression = 0x0103 + PhotometricInterpretation = 0x0106 + Thresholding = 0x0107 + CellWidth = 0x0108 + CellLength = 0x0109 + FillOrder = 0x010A + DocumentName = 0x010D + ImageDescription = 0x010E + Make = 0x010F + Model = 0x0110 + StripOffsets = 0x0111 + Orientation = 0x0112 + SamplesPerPixel = 0x0115 + RowsPerStrip = 0x0116 + StripByteCounts = 0x0117 + MinSampleValue = 0x0118 + MaxSampleValue = 0x0119 + XResolution = 0x011A + YResolution = 0x011B + PlanarConfiguration = 0x011C + PageName = 0x011D + FreeOffsets = 0x0120 + FreeByteCounts = 0x0121 + GrayResponseUnit = 0x0122 + GrayResponseCurve = 0x0123 + T4Options = 0x0124 + T6Options = 0x0125 + ResolutionUnit = 0x0128 + PageNumber = 0x0129 + TransferFunction = 0x012D + Software = 0x0131 + DateTime = 0x0132 + Artist = 0x013B + HostComputer = 0x013C + Predictor = 0x013D + WhitePoint = 0x013E + PrimaryChromaticities = 0x013F + ColorMap = 0x0140 + HalftoneHints = 0x0141 + TileWidth = 0x0142 + TileLength = 0x0143 + TileOffsets = 0x0144 + TileByteCounts = 0x0145 + SubIFDs = 0x014A + InkSet = 0x014C + InkNames = 0x014D + NumberOfInks = 0x014E + DotRange = 0x0150 + TargetPrinter = 0x0151 + ExtraSamples = 0x0152 + SampleFormat = 0x0153 + SMinSampleValue = 0x0154 + SMaxSampleValue = 0x0155 + TransferRange = 0x0156 + ClipPath = 0x0157 + XClipPathUnits = 0x0158 + YClipPathUnits = 0x0159 + Indexed = 0x015A + JPEGTables = 0x015B + OPIProxy = 0x015F + JPEGProc = 0x0200 + JpegIFOffset = 0x0201 + JpegIFByteCount = 0x0202 + JpegRestartInterval = 0x0203 + JpegLosslessPredictors = 0x0205 + JpegPointTransforms = 0x0206 + JpegQTables = 0x0207 + JpegDCTables = 0x0208 + JpegACTables = 0x0209 + YCbCrCoefficients = 0x0211 + YCbCrSubSampling = 0x0212 + YCbCrPositioning = 0x0213 + ReferenceBlackWhite = 0x0214 + XMLPacket = 0x02BC + RelatedImageFileFormat = 0x1000 + RelatedImageWidth = 0x1001 + RelatedImageLength = 0x1002 + Rating = 0x4746 + RatingPercent = 0x4749 + ImageID = 0x800D + CFARepeatPatternDim = 0x828D + BatteryLevel = 0x828F + Copyright = 0x8298 + ExposureTime = 0x829A + FNumber = 0x829D + IPTCNAA = 0x83BB + ImageResources = 0x8649 + ExifOffset = 0x8769 + InterColorProfile = 0x8773 + ExposureProgram = 0x8822 + SpectralSensitivity = 0x8824 + GPSInfo = 0x8825 + ISOSpeedRatings = 0x8827 + OECF = 0x8828 + Interlace = 0x8829 + TimeZoneOffset = 0x882A + SelfTimerMode = 0x882B + SensitivityType = 0x8830 + StandardOutputSensitivity = 0x8831 + RecommendedExposureIndex = 0x8832 + ISOSpeed = 0x8833 + ISOSpeedLatitudeyyy = 0x8834 + ISOSpeedLatitudezzz = 0x8835 + ExifVersion = 0x9000 + DateTimeOriginal = 0x9003 + DateTimeDigitized = 0x9004 + OffsetTime = 0x9010 + OffsetTimeOriginal = 0x9011 + OffsetTimeDigitized = 0x9012 + ComponentsConfiguration = 0x9101 + CompressedBitsPerPixel = 0x9102 + ShutterSpeedValue = 0x9201 + ApertureValue = 0x9202 + BrightnessValue = 0x9203 + ExposureBiasValue = 0x9204 + MaxApertureValue = 0x9205 + SubjectDistance = 0x9206 + MeteringMode = 0x9207 + LightSource = 0x9208 + Flash = 0x9209 + FocalLength = 0x920A + Noise = 0x920D + ImageNumber = 0x9211 + SecurityClassification = 0x9212 + ImageHistory = 0x9213 + TIFFEPStandardID = 0x9216 + MakerNote = 0x927C + UserComment = 0x9286 + SubsecTime = 0x9290 + SubsecTimeOriginal = 0x9291 + SubsecTimeDigitized = 0x9292 + AmbientTemperature = 0x9400 + Humidity = 0x9401 + Pressure = 0x9402 + WaterDepth = 0x9403 + Acceleration = 0x9404 + CameraElevationAngle = 0x9405 + XPTitle = 0x9C9B + XPComment = 0x9C9C + XPAuthor = 0x9C9D + XPKeywords = 0x9C9E + XPSubject = 0x9C9F + FlashPixVersion = 0xA000 + ColorSpace = 0xA001 + ExifImageWidth = 0xA002 + ExifImageHeight = 0xA003 + RelatedSoundFile = 0xA004 + ExifInteroperabilityOffset = 0xA005 + FlashEnergy = 0xA20B + SpatialFrequencyResponse = 0xA20C + FocalPlaneXResolution = 0xA20E + FocalPlaneYResolution = 0xA20F + FocalPlaneResolutionUnit = 0xA210 + SubjectLocation = 0xA214 + ExposureIndex = 0xA215 + SensingMethod = 0xA217 + FileSource = 0xA300 + SceneType = 0xA301 + CFAPattern = 0xA302 + CustomRendered = 0xA401 + ExposureMode = 0xA402 + WhiteBalance = 0xA403 + DigitalZoomRatio = 0xA404 + FocalLengthIn35mmFilm = 0xA405 + SceneCaptureType = 0xA406 + GainControl = 0xA407 + Contrast = 0xA408 + Saturation = 0xA409 + Sharpness = 0xA40A + DeviceSettingDescription = 0xA40B + SubjectDistanceRange = 0xA40C + ImageUniqueID = 0xA420 + CameraOwnerName = 0xA430 + BodySerialNumber = 0xA431 + LensSpecification = 0xA432 + LensMake = 0xA433 + LensModel = 0xA434 + LensSerialNumber = 0xA435 + CompositeImage = 0xA460 + CompositeImageCount = 0xA461 + CompositeImageExposureTimes = 0xA462 + Gamma = 0xA500 + PrintImageMatching = 0xC4A5 + DNGVersion = 0xC612 + DNGBackwardVersion = 0xC613 + UniqueCameraModel = 0xC614 + LocalizedCameraModel = 0xC615 + CFAPlaneColor = 0xC616 + CFALayout = 0xC617 + LinearizationTable = 0xC618 + BlackLevelRepeatDim = 0xC619 + BlackLevel = 0xC61A + BlackLevelDeltaH = 0xC61B + BlackLevelDeltaV = 0xC61C + WhiteLevel = 0xC61D + DefaultScale = 0xC61E + DefaultCropOrigin = 0xC61F + DefaultCropSize = 0xC620 + ColorMatrix1 = 0xC621 + ColorMatrix2 = 0xC622 + CameraCalibration1 = 0xC623 + CameraCalibration2 = 0xC624 + ReductionMatrix1 = 0xC625 + ReductionMatrix2 = 0xC626 + AnalogBalance = 0xC627 + AsShotNeutral = 0xC628 + AsShotWhiteXY = 0xC629 + BaselineExposure = 0xC62A + BaselineNoise = 0xC62B + BaselineSharpness = 0xC62C + BayerGreenSplit = 0xC62D + LinearResponseLimit = 0xC62E + CameraSerialNumber = 0xC62F + LensInfo = 0xC630 + ChromaBlurRadius = 0xC631 + AntiAliasStrength = 0xC632 + ShadowScale = 0xC633 + DNGPrivateData = 0xC634 + MakerNoteSafety = 0xC635 + CalibrationIlluminant1 = 0xC65A + CalibrationIlluminant2 = 0xC65B + BestQualityScale = 0xC65C + RawDataUniqueID = 0xC65D + OriginalRawFileName = 0xC68B + OriginalRawFileData = 0xC68C + ActiveArea = 0xC68D + MaskedAreas = 0xC68E + AsShotICCProfile = 0xC68F + AsShotPreProfileMatrix = 0xC690 + CurrentICCProfile = 0xC691 + CurrentPreProfileMatrix = 0xC692 + ColorimetricReference = 0xC6BF + CameraCalibrationSignature = 0xC6F3 + ProfileCalibrationSignature = 0xC6F4 + AsShotProfileName = 0xC6F6 + NoiseReductionApplied = 0xC6F7 + ProfileName = 0xC6F8 + ProfileHueSatMapDims = 0xC6F9 + ProfileHueSatMapData1 = 0xC6FA + ProfileHueSatMapData2 = 0xC6FB + ProfileToneCurve = 0xC6FC + ProfileEmbedPolicy = 0xC6FD + ProfileCopyright = 0xC6FE + ForwardMatrix1 = 0xC714 + ForwardMatrix2 = 0xC715 + PreviewApplicationName = 0xC716 + PreviewApplicationVersion = 0xC717 + PreviewSettingsName = 0xC718 + PreviewSettingsDigest = 0xC719 + PreviewColorSpace = 0xC71A + PreviewDateTime = 0xC71B + RawImageDigest = 0xC71C + OriginalRawFileDigest = 0xC71D + SubTileBlockSize = 0xC71E + RowInterleaveFactor = 0xC71F + ProfileLookTableDims = 0xC725 + ProfileLookTableData = 0xC726 + OpcodeList1 = 0xC740 + OpcodeList2 = 0xC741 + OpcodeList3 = 0xC74E + NoiseProfile = 0xC761 + FrameRate = 0xC764 + + +"""Maps EXIF tags to tag names.""" +TAGS = { + **{i.value: i.name for i in Base}, + 0x920C: "SpatialFrequencyResponse", + 0x9214: "SubjectLocation", + 0x9215: "ExposureIndex", + 0x828E: "CFAPattern", + 0x920B: "FlashEnergy", + 0x9216: "TIFF/EPStandardID", +} + + +class GPS(IntEnum): + GPSVersionID = 0x00 + GPSLatitudeRef = 0x01 + GPSLatitude = 0x02 + GPSLongitudeRef = 0x03 + GPSLongitude = 0x04 + GPSAltitudeRef = 0x05 + GPSAltitude = 0x06 + GPSTimeStamp = 0x07 + GPSSatellites = 0x08 + GPSStatus = 0x09 + GPSMeasureMode = 0x0A + GPSDOP = 0x0B + GPSSpeedRef = 0x0C + GPSSpeed = 0x0D + GPSTrackRef = 0x0E + GPSTrack = 0x0F + GPSImgDirectionRef = 0x10 + GPSImgDirection = 0x11 + GPSMapDatum = 0x12 + GPSDestLatitudeRef = 0x13 + GPSDestLatitude = 0x14 + GPSDestLongitudeRef = 0x15 + GPSDestLongitude = 0x16 + GPSDestBearingRef = 0x17 + GPSDestBearing = 0x18 + GPSDestDistanceRef = 0x19 + GPSDestDistance = 0x1A + GPSProcessingMethod = 0x1B + GPSAreaInformation = 0x1C + GPSDateStamp = 0x1D + GPSDifferential = 0x1E + GPSHPositioningError = 0x1F + + +"""Maps EXIF GPS tags to tag names.""" +GPSTAGS = {i.value: i.name for i in GPS} + + +class Interop(IntEnum): + InteropIndex = 0x0001 + InteropVersion = 0x0002 + RelatedImageFileFormat = 0x1000 + RelatedImageWidth = 0x1001 + RelatedImageHeight = 0x1002 + + +class IFD(IntEnum): + Exif = 0x8769 + GPSInfo = 0x8825 + MakerNote = 0x927C + Makernote = 0x927C # Deprecated + Interop = 0xA005 + IFD1 = -1 + + +class LightSource(IntEnum): + Unknown = 0x00 + Daylight = 0x01 + Fluorescent = 0x02 + Tungsten = 0x03 + Flash = 0x04 + Fine = 0x09 + Cloudy = 0x0A + Shade = 0x0B + DaylightFluorescent = 0x0C + DayWhiteFluorescent = 0x0D + CoolWhiteFluorescent = 0x0E + WhiteFluorescent = 0x0F + StandardLightA = 0x11 + StandardLightB = 0x12 + StandardLightC = 0x13 + D55 = 0x14 + D65 = 0x15 + D75 = 0x16 + D50 = 0x17 + ISO = 0x18 + Other = 0xFF diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FitsImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FitsImagePlugin.py new file mode 100644 index 000000000..e91840778 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FitsImagePlugin.py @@ -0,0 +1,153 @@ +# +# The Python Imaging Library +# $Id$ +# +# FITS file handling +# +# Copyright (c) 1998-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import gzip +import math + +from . import Image, ImageFile + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(b"SIMPLE") + + +class FitsImageFile(ImageFile.ImageFile): + format = "FITS" + format_description = "FITS" + + def _open(self) -> None: + assert self.fp is not None + + headers: dict[bytes, bytes] = {} + header_in_progress = False + decoder_name = "" + while True: + header = self.fp.read(80) + if not header: + msg = "Truncated FITS file" + raise OSError(msg) + keyword = header[:8].strip() + if keyword in (b"SIMPLE", b"XTENSION"): + header_in_progress = True + elif headers and not header_in_progress: + # This is now a data unit + break + elif keyword == b"END": + # Seek to the end of the header unit + self.fp.seek(math.ceil(self.fp.tell() / 2880) * 2880) + if not decoder_name: + decoder_name, offset, args = self._parse_headers(headers) + + header_in_progress = False + continue + + if decoder_name: + # Keep going to read past the headers + continue + + value = header[8:].split(b"/")[0].strip() + if value.startswith(b"="): + value = value[1:].strip() + if not headers and (not _accept(keyword) or value != b"T"): + msg = "Not a FITS file" + raise SyntaxError(msg) + headers[keyword] = value + + if not decoder_name: + msg = "No image data" + raise ValueError(msg) + + offset += self.fp.tell() - 80 + self.tile = [ImageFile._Tile(decoder_name, (0, 0) + self.size, offset, args)] + + def _get_size( + self, headers: dict[bytes, bytes], prefix: bytes + ) -> tuple[int, int] | None: + naxis = int(headers[prefix + b"NAXIS"]) + if naxis == 0: + return None + + if naxis == 1: + return 1, int(headers[prefix + b"NAXIS1"]) + else: + return int(headers[prefix + b"NAXIS1"]), int(headers[prefix + b"NAXIS2"]) + + def _parse_headers( + self, headers: dict[bytes, bytes] + ) -> tuple[str, int, tuple[str | int, ...]]: + prefix = b"" + decoder_name = "raw" + offset = 0 + if ( + headers.get(b"XTENSION") == b"'BINTABLE'" + and headers.get(b"ZIMAGE") == b"T" + and headers[b"ZCMPTYPE"] == b"'GZIP_1 '" + ): + no_prefix_size = self._get_size(headers, prefix) or (0, 0) + number_of_bits = int(headers[b"BITPIX"]) + offset = no_prefix_size[0] * no_prefix_size[1] * (number_of_bits // 8) + + prefix = b"Z" + decoder_name = "fits_gzip" + + size = self._get_size(headers, prefix) + if not size: + return "", 0, () + + self._size = size + + number_of_bits = int(headers[prefix + b"BITPIX"]) + if number_of_bits == 8: + self._mode = "L" + elif number_of_bits == 16: + self._mode = "I;16" + elif number_of_bits == 32: + self._mode = "I" + elif number_of_bits in (-32, -64): + self._mode = "F" + + args: tuple[str | int, ...] + if decoder_name == "raw": + args = (self.mode, 0, -1) + else: + args = (number_of_bits,) + return decoder_name, offset, args + + +class FitsGzipDecoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + assert self.fd is not None + with gzip.open(self.fd) as fp: + value = fp.read(self.state.xsize * self.state.ysize * 4) + + rows = [] + offset = 0 + number_of_bits = min(self.args[0] // 8, 4) + for y in range(self.state.ysize): + row = bytearray() + for x in range(self.state.xsize): + row += value[offset + (4 - number_of_bits) : offset + 4] + offset += 4 + rows.append(row) + self.set_as_raw(bytes([pixel for row in rows[::-1] for pixel in row])) + return -1, 0 + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(FitsImageFile.format, FitsImageFile, _accept) +Image.register_decoder("fits_gzip", FitsGzipDecoder) + +Image.register_extensions(FitsImageFile.format, [".fit", ".fits"]) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FliImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FliImagePlugin.py new file mode 100644 index 000000000..da1e8e95c --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FliImagePlugin.py @@ -0,0 +1,184 @@ +# +# The Python Imaging Library. +# $Id$ +# +# FLI/FLC file handling. +# +# History: +# 95-09-01 fl Created +# 97-01-03 fl Fixed parser, setup decoder tile +# 98-07-15 fl Renamed offset attribute to avoid name clash +# +# Copyright (c) Secret Labs AB 1997-98. +# Copyright (c) Fredrik Lundh 1995-97. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os + +from . import Image, ImageFile, ImagePalette +from ._binary import i16le as i16 +from ._binary import i32le as i32 +from ._binary import o8 +from ._util import DeferredError + +# +# decoder + + +def _accept(prefix: bytes) -> bool: + return ( + len(prefix) >= 16 + and i16(prefix, 4) in [0xAF11, 0xAF12] + and i16(prefix, 14) in [0, 3] # flags + ) + + +## +# Image plugin for the FLI/FLC animation format. Use the seek +# method to load individual frames. + + +class FliImageFile(ImageFile.ImageFile): + format = "FLI" + format_description = "Autodesk FLI/FLC Animation" + _close_exclusive_fp_after_loading = False + + def _open(self) -> None: + # HEAD + assert self.fp is not None + s = self.fp.read(128) + if not ( + _accept(s) + and s[20:22] == b"\x00" * 2 + and s[42:80] == b"\x00" * 38 + and s[88:] == b"\x00" * 40 + ): + msg = "not an FLI/FLC file" + raise SyntaxError(msg) + + # frames + self.n_frames = i16(s, 6) + self.is_animated = self.n_frames > 1 + + # image characteristics + self._mode = "P" + self._size = i16(s, 8), i16(s, 10) + + # animation speed + duration = i32(s, 16) + magic = i16(s, 4) + if magic == 0xAF11: + duration = (duration * 1000) // 70 + self.info["duration"] = duration + + # look for palette + palette = [(a, a, a) for a in range(256)] + + s = self.fp.read(16) + + self.__offset = 128 + + if i16(s, 4) == 0xF100: + # prefix chunk; ignore it + self.fp.seek(self.__offset + i32(s)) + s = self.fp.read(16) + + if i16(s, 4) == 0xF1FA: + # look for palette chunk + number_of_subchunks = i16(s, 6) + chunk_size: int | None = None + for _ in range(number_of_subchunks): + if chunk_size is not None: + self.fp.seek(chunk_size - 6, os.SEEK_CUR) + s = self.fp.read(6) + chunk_type = i16(s, 4) + if chunk_type in (4, 11): + self._palette(palette, 2 if chunk_type == 11 else 0) + break + chunk_size = i32(s) + if not chunk_size: + break + + self.palette = ImagePalette.raw( + "RGB", b"".join(o8(r) + o8(g) + o8(b) for (r, g, b) in palette) + ) + + # set things up to decode first frame + self.__frame = -1 + self._fp = self.fp + self.__rewind = self.fp.tell() + self.seek(0) + + def _palette(self, palette: list[tuple[int, int, int]], shift: int) -> None: + # load palette + + i = 0 + assert self.fp is not None + for e in range(i16(self.fp.read(2))): + s = self.fp.read(2) + i = i + s[0] + n = s[1] + if n == 0: + n = 256 + s = self.fp.read(n * 3) + for n in range(0, len(s), 3): + r = s[n] << shift + g = s[n + 1] << shift + b = s[n + 2] << shift + palette[i] = (r, g, b) + i += 1 + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + if frame < self.__frame: + self._seek(0) + + for f in range(self.__frame + 1, frame + 1): + self._seek(f) + + def _seek(self, frame: int) -> None: + if isinstance(self._fp, DeferredError): + raise self._fp.ex + if frame == 0: + self.__frame = -1 + self._fp.seek(self.__rewind) + self.__offset = 128 + else: + # ensure that the previous frame was loaded + self.load() + + if frame != self.__frame + 1: + msg = f"cannot seek to frame {frame}" + raise ValueError(msg) + self.__frame = frame + + # move to next frame + self.fp = self._fp + self.fp.seek(self.__offset) + + s = self.fp.read(4) + if not s: + msg = "missing frame size" + raise EOFError(msg) + + framesize = i32(s) + + self.decodermaxblock = framesize + self.tile = [ImageFile._Tile("fli", (0, 0) + self.size, self.__offset)] + + self.__offset += framesize + + def tell(self) -> int: + return self.__frame + + +# +# registry + +Image.register_open(FliImageFile.format, FliImageFile, _accept) + +Image.register_extensions(FliImageFile.format, [".fli", ".flc"]) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FontFile.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FontFile.py new file mode 100644 index 000000000..341431d3f --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FontFile.py @@ -0,0 +1,159 @@ +# +# The Python Imaging Library +# $Id$ +# +# base class for raster font file parsers +# +# history: +# 1997-06-05 fl created +# 1997-08-19 fl restrict image width +# +# Copyright (c) 1997-1998 by Secret Labs AB +# Copyright (c) 1997-1998 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os +from typing import BinaryIO + +from . import Image, ImageFont, _binary + +WIDTH = 800 + + +def puti16( + fp: BinaryIO, values: tuple[int, int, int, int, int, int, int, int, int, int] +) -> None: + """Write network order (big-endian) 16-bit sequence""" + for v in values: + if v < 0: + v += 65536 + fp.write(_binary.o16be(v)) + + +class FontFile: + """Base class for raster font file handlers.""" + + bitmap: Image.Image | None = None + + def __init__(self) -> None: + self.info: dict[bytes, bytes | int] = {} + self.glyph: list[ + tuple[ + tuple[int, int], + tuple[int, int, int, int], + tuple[int, int, int, int], + Image.Image, + ] + | None + ] = [None] * 256 + + def __getitem__(self, ix: int) -> ( + tuple[ + tuple[int, int], + tuple[int, int, int, int], + tuple[int, int, int, int], + Image.Image, + ] + | None + ): + return self.glyph[ix] + + def compile(self) -> None: + """Create metrics and bitmap""" + + if self.bitmap: + return + + # create bitmap large enough to hold all data + h = w = maxwidth = 0 + lines = 1 + for glyph in self.glyph: + if glyph: + d, dst, src, im = glyph + h = max(h, src[3] - src[1]) + w = w + (src[2] - src[0]) + if w > WIDTH: + lines += 1 + w = src[2] - src[0] + maxwidth = max(maxwidth, w) + + xsize = maxwidth + ysize = lines * h + + if xsize == 0 and ysize == 0: + return + + self.ysize = h + + # paste glyphs into bitmap + self.bitmap = Image.new("1", (xsize, ysize)) + self.metrics: list[ + tuple[tuple[int, int], tuple[int, int, int, int], tuple[int, int, int, int]] + | None + ] = [None] * 256 + x = y = 0 + for i in range(256): + glyph = self[i] + if glyph: + d, dst, src, im = glyph + xx = src[2] - src[0] + x0, y0 = x, y + x = x + xx + if x > WIDTH: + x, y = 0, y + h + x0, y0 = x, y + x = xx + s = src[0] + x0, src[1] + y0, src[2] + x0, src[3] + y0 + self.bitmap.paste(im.crop(src), s) + self.metrics[i] = d, dst, s + + def _encode_metrics(self) -> bytes: + values: list[int] = [] + for i in range(256): + m = self.metrics[i] + if m: + values.extend(m[0] + m[1] + m[2]) + else: + values.extend((0,) * 10) + + data = bytearray() + for v in values: + if v < 0: + v += 65536 + data += _binary.o16be(v) + return bytes(data) + + def save(self, filename: str) -> None: + """Save font""" + + self.compile() + + # font data + if not self.bitmap: + msg = "No bitmap created" + raise ValueError(msg) + self.bitmap.save(os.path.splitext(filename)[0] + ".pbm", "PNG") + + # font metrics + with open(os.path.splitext(filename)[0] + ".pil", "wb") as fp: + fp.write(b"PILfont\n") + fp.write(f";;;;;;{self.ysize};\n".encode("ascii")) # HACK!!! + fp.write(b"DATA\n") + fp.write(self._encode_metrics()) + + def to_imagefont(self) -> ImageFont.ImageFont: + """Convert to ImageFont""" + + self.compile() + + # font data + if not self.bitmap: + msg = "No bitmap created" + raise ValueError(msg) + + imagefont = ImageFont.ImageFont() + imagefont._load(self.bitmap, self._encode_metrics()) + return imagefont diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FpxImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FpxImagePlugin.py new file mode 100644 index 000000000..0b06aac96 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FpxImagePlugin.py @@ -0,0 +1,258 @@ +# +# THIS IS WORK IN PROGRESS +# +# The Python Imaging Library. +# $Id$ +# +# FlashPix support for PIL +# +# History: +# 97-01-25 fl Created (reads uncompressed RGB images only) +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import olefile + +from . import Image, ImageFile +from ._binary import i32le as i32 + +# we map from colour field tuples to (mode, rawmode) descriptors +MODES = { + # opacity + (0x00007FFE,): ("A", "L"), + # monochrome + (0x00010000,): ("L", "L"), + (0x00018000, 0x00017FFE): ("RGBA", "LA"), + # photo YCC + (0x00020000, 0x00020001, 0x00020002): ("RGB", "YCC;P"), + (0x00028000, 0x00028001, 0x00028002, 0x00027FFE): ("RGBA", "YCCA;P"), + # standard RGB (NIFRGB) + (0x00030000, 0x00030001, 0x00030002): ("RGB", "RGB"), + (0x00038000, 0x00038001, 0x00038002, 0x00037FFE): ("RGBA", "RGBA"), +} + + +# +# -------------------------------------------------------------------- + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(olefile.MAGIC) + + +## +# Image plugin for the FlashPix images. + + +class FpxImageFile(ImageFile.ImageFile): + format = "FPX" + format_description = "FlashPix" + + def _open(self) -> None: + # + # read the OLE directory and see if this is a likely + # to be a FlashPix file + + assert self.fp is not None + try: + self.ole = olefile.OleFileIO(self.fp) + except OSError as e: + msg = "not an FPX file; invalid OLE file" + raise SyntaxError(msg) from e + + root = self.ole.root + if not root or root.clsid != "56616700-C154-11CE-8553-00AA00A1F95B": + msg = "not an FPX file; bad root CLSID" + raise SyntaxError(msg) + + self._open_index(1) + + def _open_index(self, index: int = 1) -> None: + # + # get the Image Contents Property Set + + prop = self.ole.getproperties( + [f"Data Object Store {index:06d}", "\005Image Contents"] + ) + + # size (highest resolution) + + assert isinstance(prop[0x1000002], int) + assert isinstance(prop[0x1000003], int) + self._size = prop[0x1000002], prop[0x1000003] + + size = max(self.size) + i = 1 + while size > 64: + size = size // 2 + i += 1 + self.maxid = i - 1 + + # mode. instead of using a single field for this, flashpix + # requires you to specify the mode for each channel in each + # resolution subimage, and leaves it to the decoder to make + # sure that they all match. for now, we'll cheat and assume + # that this is always the case. + + id = self.maxid << 16 + + s = prop[0x2000002 | id] + + if not isinstance(s, bytes) or (bands := i32(s, 4)) > 4: + msg = "Invalid number of bands" + raise OSError(msg) + + # note: for now, we ignore the "uncalibrated" flag + colors = tuple(i32(s, 8 + i * 4) & 0x7FFFFFFF for i in range(bands)) + + self._mode, self.rawmode = MODES[colors] + + # load JPEG tables, if any + self.jpeg = {} + for i in range(256): + id = 0x3000001 | (i << 16) + if id in prop: + self.jpeg[i] = prop[id] + + self._open_subimage(1, self.maxid) + + def _open_subimage(self, index: int = 1, subimage: int = 0) -> None: + # + # setup tile descriptors for a given subimage + + stream = [ + f"Data Object Store {index:06d}", + f"Resolution {subimage:04d}", + "Subimage 0000 Header", + ] + + fp = self.ole.openstream(stream) + + # skip prefix + fp.read(28) + + # header stream + s = fp.read(36) + + size = i32(s, 4), i32(s, 8) + # tilecount = i32(s, 12) + xtile, ytile = i32(s, 16), i32(s, 20) + # channels = i32(s, 24) + offset = i32(s, 28) + length = i32(s, 32) + + if size != self.size: + msg = "subimage mismatch" + raise OSError(msg) + + # get tile descriptors + fp.seek(28 + offset) + s = fp.read(i32(s, 12) * length) + + x = y = 0 + xsize, ysize = size + self.tile = [] + + for i in range(0, len(s), length): + x1 = min(xsize, x + xtile) + y1 = min(ysize, y + ytile) + + compression = i32(s, i + 8) + + if compression == 0: + self.tile.append( + ImageFile._Tile( + "raw", + (x, y, x1, y1), + i32(s, i) + 28, + self.rawmode, + ) + ) + + elif compression == 1: + # FIXME: the fill decoder is not implemented + self.tile.append( + ImageFile._Tile( + "fill", + (x, y, x1, y1), + i32(s, i) + 28, + (self.rawmode, s[12:16]), + ) + ) + + elif compression == 2: + internal_color_conversion = s[14] + jpeg_tables = s[15] + rawmode = self.rawmode + + if internal_color_conversion: + # The image is stored as usual (usually YCbCr). + if rawmode == "RGBA": + # For "RGBA", data is stored as YCbCrA based on + # negative RGB. The following trick works around + # this problem : + jpegmode, rawmode = "YCbCrK", "CMYK" + else: + jpegmode = None # let the decoder decide + + else: + # The image is stored as defined by rawmode + jpegmode = rawmode + + self.tile.append( + ImageFile._Tile( + "jpeg", + (x, y, x1, y1), + i32(s, i) + 28, + (rawmode, jpegmode), + ) + ) + + # FIXME: jpeg tables are tile dependent; the prefix + # data must be placed in the tile descriptor itself! + + if jpeg_tables: + self.tile_prefix = self.jpeg[jpeg_tables] + + else: + msg = "unknown/invalid compression" + raise OSError(msg) + + x += xtile + if x >= xsize: + x, y = 0, y + ytile + if y >= ysize: + break # isn't really required + + assert self.fp is not None + self.stream = stream + self._fp = self.fp + self.fp = None + + def load(self) -> Image.core.PixelAccess | None: + if not self.fp: + self.fp = self.ole.openstream(self.stream[:2] + ["Subimage 0000 Data"]) + + return ImageFile.ImageFile.load(self) + + def close(self) -> None: + self.ole.close() + super().close() + + def __exit__(self, *args: object) -> None: + self.ole.close() + super().__exit__() + + +# +# -------------------------------------------------------------------- + + +Image.register_open(FpxImageFile.format, FpxImageFile, _accept) + +Image.register_extension(FpxImageFile.format, ".fpx") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FtexImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FtexImagePlugin.py new file mode 100644 index 000000000..e4d836cbd --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/FtexImagePlugin.py @@ -0,0 +1,115 @@ +""" +A Pillow loader for .ftc and .ftu files (FTEX) +Jerome Leclanche + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: + https://creativecommons.org/publicdomain/zero/1.0/ + +Independence War 2: Edge Of Chaos - Texture File Format - 16 October 2001 + +The textures used for 3D objects in Independence War 2: Edge Of Chaos are in a +packed custom format called FTEX. This file format uses file extensions FTC +and FTU. +* FTC files are compressed textures (using standard texture compression). +* FTU files are not compressed. +Texture File Format +The FTC and FTU texture files both use the same format. This +has the following structure: +{header} +{format_directory} +{data} +Where: +{header} = { + u32:magic, + u32:version, + u32:width, + u32:height, + u32:mipmap_count, + u32:format_count +} + +* The "magic" number is "FTEX". +* "width" and "height" are the dimensions of the texture. +* "mipmap_count" is the number of mipmaps in the texture. +* "format_count" is the number of texture formats (different versions of the +same texture) in this file. + +{format_directory} = format_count * { u32:format, u32:where } + +The format value is 0 for DXT1 compressed textures and 1 for 24-bit RGB +uncompressed textures. +The texture data for a format starts at the position "where" in the file. + +Each set of texture data in the file has the following structure: +{data} = format_count * { u32:mipmap_size, mipmap_size * { u8 } } +* "mipmap_size" is the number of bytes in that mip level. For compressed +textures this is the size of the texture data compressed with DXT1. For 24 bit +uncompressed textures, this is 3 * width * height. Following this are the image +bytes for that mipmap level. + +Note: All data is stored in little-Endian (Intel) byte order. +""" + +from __future__ import annotations + +import struct +from enum import IntEnum +from io import BytesIO + +from . import Image, ImageFile + +MAGIC = b"FTEX" + + +class Format(IntEnum): + DXT1 = 0 + UNCOMPRESSED = 1 + + +class FtexImageFile(ImageFile.ImageFile): + format = "FTEX" + format_description = "Texture File Format (IW2:EOC)" + + def _open(self) -> None: + assert self.fp is not None + if not _accept(self.fp.read(4)): + msg = "not an FTEX file" + raise SyntaxError(msg) + struct.unpack(" None: + pass + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(MAGIC) + + +Image.register_open(FtexImageFile.format, FtexImageFile, _accept) +Image.register_extensions(FtexImageFile.format, [".ftc", ".ftu"]) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GbrImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GbrImagePlugin.py new file mode 100644 index 000000000..ec666c81c --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GbrImagePlugin.py @@ -0,0 +1,103 @@ +# +# The Python Imaging Library +# +# load a GIMP brush file +# +# History: +# 96-03-14 fl Created +# 16-01-08 es Version 2 +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# Copyright (c) Eric Soroos 2016. +# +# See the README file for information on usage and redistribution. +# +# +# See https://github.com/GNOME/gimp/blob/mainline/devel-docs/gbr.txt for +# format documentation. +# +# This code Interprets version 1 and 2 .gbr files. +# Version 1 files are obsolete, and should not be used for new +# brushes. +# Version 2 files are saved by GIMP v2.8 (at least) +# Version 3 files have a format specifier of 18 for 16bit floats in +# the color depth field. This is currently unsupported by Pillow. +from __future__ import annotations + +from . import Image, ImageFile +from ._binary import i32be as i32 + + +def _accept(prefix: bytes) -> bool: + return len(prefix) >= 8 and i32(prefix, 0) >= 20 and i32(prefix, 4) in (1, 2) + + +## +# Image plugin for the GIMP brush format. + + +class GbrImageFile(ImageFile.ImageFile): + format = "GBR" + format_description = "GIMP brush file" + + def _open(self) -> None: + assert self.fp is not None + header_size = i32(self.fp.read(4)) + if header_size < 20: + msg = "not a GIMP brush" + raise SyntaxError(msg) + version = i32(self.fp.read(4)) + if version not in (1, 2): + msg = f"Unsupported GIMP brush version: {version}" + raise SyntaxError(msg) + + width = i32(self.fp.read(4)) + height = i32(self.fp.read(4)) + color_depth = i32(self.fp.read(4)) + if width == 0 or height == 0: + msg = "not a GIMP brush" + raise SyntaxError(msg) + if color_depth not in (1, 4): + msg = f"Unsupported GIMP brush color depth: {color_depth}" + raise SyntaxError(msg) + + if version == 1: + comment_length = header_size - 20 + else: + comment_length = header_size - 28 + magic_number = self.fp.read(4) + if magic_number != b"GIMP": + msg = "not a GIMP brush, bad magic number" + raise SyntaxError(msg) + self.info["spacing"] = i32(self.fp.read(4)) + + self.info["comment"] = self.fp.read(comment_length)[:-1] + + if color_depth == 1: + self._mode = "L" + else: + self._mode = "RGBA" + + self._size = width, height + + # Image might not be small + Image._decompression_bomb_check(self.size) + + # Data is an uncompressed block of w * h * bytes/pixel + self._data_size = width * height * color_depth + + def load(self) -> Image.core.PixelAccess | None: + if self._im is None: + assert self.fp is not None + self.im = Image.core.new(self.mode, self.size) + self.frombytes(self.fp.read(self._data_size)) + return Image.Image.load(self) + + +# +# registry + + +Image.register_open(GbrImageFile.format, GbrImageFile, _accept) +Image.register_extension(GbrImageFile.format, ".gbr") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GdImageFile.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GdImageFile.py new file mode 100644 index 000000000..d73bc1982 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GdImageFile.py @@ -0,0 +1,103 @@ +# +# The Python Imaging Library. +# $Id$ +# +# GD file handling +# +# History: +# 1996-04-12 fl Created +# +# Copyright (c) 1997 by Secret Labs AB. +# Copyright (c) 1996 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + + +""" +.. note:: + This format cannot be automatically recognized, so the + class is not registered for use with :py:func:`PIL.Image.open()`. To open a + gd file, use the :py:func:`PIL.GdImageFile.open()` function instead. + +.. warning:: + THE GD FORMAT IS NOT DESIGNED FOR DATA INTERCHANGE. This + implementation is provided for convenience and demonstrational + purposes only. +""" + +from __future__ import annotations + +from typing import IO + +from . import ImageFile, ImagePalette, UnidentifiedImageError +from ._binary import i16be as i16 +from ._binary import i32be as i32 +from ._typing import StrOrBytesPath + + +class GdImageFile(ImageFile.ImageFile): + """ + Image plugin for the GD uncompressed format. Note that this format + is not supported by the standard :py:func:`PIL.Image.open()` function. To use + this plugin, you have to import the :py:mod:`PIL.GdImageFile` module and + use the :py:func:`PIL.GdImageFile.open()` function. + """ + + format = "GD" + format_description = "GD uncompressed images" + + def _open(self) -> None: + # Header + assert self.fp is not None + + s = self.fp.read(1037) + + if i16(s) not in [65534, 65535]: + msg = "Not a valid GD 2.x .gd file" + raise SyntaxError(msg) + + self._mode = "P" + self._size = i16(s, 2), i16(s, 4) + + true_color = s[6] + true_color_offset = 2 if true_color else 0 + + # transparency index + tindex = i32(s, 7 + true_color_offset) + if tindex < 256: + self.info["transparency"] = tindex + + self.palette = ImagePalette.raw( + "RGBX", s[7 + true_color_offset + 6 : 7 + true_color_offset + 6 + 256 * 4] + ) + + self.tile = [ + ImageFile._Tile( + "raw", + (0, 0) + self.size, + 7 + true_color_offset + 6 + 256 * 4, + "L", + ) + ] + + +def open(fp: StrOrBytesPath | IO[bytes], mode: str = "r") -> GdImageFile: + """ + Load texture from a GD image file. + + :param fp: GD file name, or an opened file handle. + :param mode: Optional mode. In this version, if the mode argument + is given, it must be "r". + :returns: An image instance. + :raises OSError: If the image could not be read. + """ + if mode != "r": + msg = "bad mode" + raise ValueError(msg) + + try: + return GdImageFile(fp) + except SyntaxError as e: + msg = "cannot identify this image file" + raise UnidentifiedImageError(msg) from e diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py new file mode 100644 index 000000000..b8db5d832 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GifImagePlugin.py @@ -0,0 +1,1223 @@ +# +# The Python Imaging Library. +# $Id$ +# +# GIF file handling +# +# History: +# 1995-09-01 fl Created +# 1996-12-14 fl Added interlace support +# 1996-12-30 fl Added animation support +# 1997-01-05 fl Added write support, fixed local colour map bug +# 1997-02-23 fl Make sure to load raster data in getdata() +# 1997-07-05 fl Support external decoder (0.4) +# 1998-07-09 fl Handle all modes when saving (0.5) +# 1998-07-15 fl Renamed offset attribute to avoid name clash +# 2001-04-16 fl Added rewind support (seek to frame 0) (0.6) +# 2001-04-17 fl Added palette optimization (0.7) +# 2002-06-06 fl Added transparency support for save (0.8) +# 2004-02-24 fl Disable interlacing for small images +# +# Copyright (c) 1997-2004 by Secret Labs AB +# Copyright (c) 1995-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import itertools +import math +import os +import subprocess +from enum import IntEnum +from functools import cached_property +from typing import Any, NamedTuple, cast + +from . import ( + Image, + ImageChops, + ImageFile, + ImageMath, + ImageOps, + ImagePalette, + ImageSequence, +) +from ._binary import i16le as i16 +from ._binary import o8 +from ._binary import o16le as o16 +from ._util import DeferredError + +TYPE_CHECKING = False +if TYPE_CHECKING: + from typing import IO, Literal + + from . import _imaging + from ._typing import Buffer + + +class LoadingStrategy(IntEnum): + """.. versionadded:: 9.1.0""" + + RGB_AFTER_FIRST = 0 + RGB_AFTER_DIFFERENT_PALETTE_ONLY = 1 + RGB_ALWAYS = 2 + + +#: .. versionadded:: 9.1.0 +LOADING_STRATEGY = LoadingStrategy.RGB_AFTER_FIRST + +# -------------------------------------------------------------------- +# Identify/read GIF files + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith((b"GIF87a", b"GIF89a")) + + +## +# Image plugin for GIF images. This plugin supports both GIF87 and +# GIF89 images. + + +class GifImageFile(ImageFile.ImageFile): + format = "GIF" + format_description = "Compuserve GIF" + _close_exclusive_fp_after_loading = False + + global_palette = None + + def data(self) -> bytes | None: + assert self.fp is not None + s = self.fp.read(1) + if s and s[0]: + return self.fp.read(s[0]) + return None + + def _is_palette_needed(self, p: bytes) -> bool: + for i in range(0, len(p), 3): + if not (i // 3 == p[i] == p[i + 1] == p[i + 2]): + return True + return False + + def _open(self) -> None: + # Screen + assert self.fp is not None + s = self.fp.read(13) + if not _accept(s): + msg = "not a GIF file" + raise SyntaxError(msg) + + self.info["version"] = s[:6] + self._size = i16(s, 6), i16(s, 8) + flags = s[10] + bits = (flags & 7) + 1 + + if flags & 128: + # get global palette + self.info["background"] = s[11] + # check if palette contains colour indices + p = self.fp.read(3 << bits) + if self._is_palette_needed(p): + palette = ImagePalette.raw("RGB", p) + self.global_palette = self.palette = palette + + self._fp = self.fp # FIXME: hack + self.__rewind = self.fp.tell() + self._n_frames: int | None = None + self._seek(0) # get ready to read first frame + + @property + def n_frames(self) -> int: + if self._n_frames is None: + current = self.tell() + try: + while True: + self._seek(self.tell() + 1, False) + except EOFError: + self._n_frames = self.tell() + 1 + self.seek(current) + return self._n_frames + + @cached_property + def is_animated(self) -> bool: + if self._n_frames is not None: + return self._n_frames != 1 + + current = self.tell() + if current: + return True + + try: + self._seek(1, False) + is_animated = True + except EOFError: + is_animated = False + + self.seek(current) + return is_animated + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + if frame < self.__frame: + self._im = None + self._seek(0) + + last_frame = self.__frame + try: + for f in range(self.__frame + 1, frame + 1): + self._seek(f) + except EOFError as e: + self.seek(last_frame) + msg = "no more images in GIF file" + raise EOFError(msg) from e + + def _seek(self, frame: int, update_image: bool = True) -> None: + if isinstance(self._fp, DeferredError): + raise self._fp.ex + if frame == 0: + # rewind + self.__offset = 0 + self.dispose: _imaging.ImagingCore | None = None + self.__frame = -1 + self._fp.seek(self.__rewind) + self.disposal_method = 0 + if "comment" in self.info: + del self.info["comment"] + else: + # ensure that the previous frame was loaded + if self.tile and update_image: + self.load() + + if frame != self.__frame + 1: + msg = f"cannot seek to frame {frame}" + raise ValueError(msg) + + self.fp = self._fp + if self.__offset: + # backup to last frame + self.fp.seek(self.__offset) + while self.data(): + pass + self.__offset = 0 + + s = self.fp.read(1) + if not s or s == b";": + msg = "no more images in GIF file" + raise EOFError(msg) + + palette: ImagePalette.ImagePalette | Literal[False] | None = None + + info: dict[str, Any] = {} + frame_transparency = None + interlace = None + frame_dispose_extent = None + while True: + if not s: + s = self.fp.read(1) + if not s or s == b";": + break + + elif s == b"!": + # + # extensions + # + s = self.fp.read(1) + block = self.data() + if s[0] == 249 and block is not None: + # + # graphic control extension + # + flags = block[0] + if flags & 1: + frame_transparency = block[3] + info["duration"] = i16(block, 1) * 10 + + # disposal method - find the value of bits 4 - 6 + dispose_bits = 0b00011100 & flags + dispose_bits = dispose_bits >> 2 + if dispose_bits: + # only set the dispose if it is not + # unspecified. I'm not sure if this is + # correct, but it seems to prevent the last + # frame from looking odd for some animations + self.disposal_method = dispose_bits + elif s[0] == 254: + # + # comment extension + # + comment = b"" + + # Read this comment block + while block: + comment += block + block = self.data() + + if "comment" in info: + # If multiple comment blocks in frame, separate with \n + info["comment"] += b"\n" + comment + else: + info["comment"] = comment + s = b"" + continue + elif s[0] == 255 and frame == 0 and block is not None: + # + # application extension + # + info["extension"] = block, self.fp.tell() + if block.startswith(b"NETSCAPE2.0"): + block = self.data() + if block and len(block) >= 3 and block[0] == 1: + self.info["loop"] = i16(block, 1) + while self.data(): + pass + + elif s == b",": + # + # local image + # + s = self.fp.read(9) + + # extent + x0, y0 = i16(s, 0), i16(s, 2) + x1, y1 = x0 + i16(s, 4), y0 + i16(s, 6) + if (x1 > self.size[0] or y1 > self.size[1]) and update_image: + self._size = max(x1, self.size[0]), max(y1, self.size[1]) + Image._decompression_bomb_check(self._size) + frame_dispose_extent = x0, y0, x1, y1 + flags = s[8] + + interlace = (flags & 64) != 0 + + if flags & 128: + bits = (flags & 7) + 1 + p = self.fp.read(3 << bits) + if self._is_palette_needed(p): + palette = ImagePalette.raw("RGB", p) + else: + palette = False + + # image data + bits = self.fp.read(1)[0] + self.__offset = self.fp.tell() + break + s = b"" + + if interlace is None: + msg = "image not found in GIF frame" + raise EOFError(msg) + + self.__frame = frame + if not update_image: + return + + self.tile = [] + + if self.dispose: + self.im.paste(self.dispose, self.dispose_extent) + + self._frame_palette = palette if palette is not None else self.global_palette + self._frame_transparency = frame_transparency + if frame == 0: + if self._frame_palette: + if LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS: + self._mode = "RGBA" if frame_transparency is not None else "RGB" + else: + self._mode = "P" + else: + self._mode = "L" + + if palette: + self.palette = palette + elif self.global_palette: + from copy import copy + + self.palette = copy(self.global_palette) + else: + self.palette = None + else: + if self.mode == "P": + if ( + LOADING_STRATEGY != LoadingStrategy.RGB_AFTER_DIFFERENT_PALETTE_ONLY + or palette + ): + if "transparency" in self.info: + self.im.putpalettealpha(self.info["transparency"], 0) + self.im = self.im.convert("RGBA", Image.Dither.FLOYDSTEINBERG) + self._mode = "RGBA" + del self.info["transparency"] + else: + self._mode = "RGB" + self.im = self.im.convert("RGB", Image.Dither.FLOYDSTEINBERG) + + def _rgb(color: int) -> tuple[int, int, int]: + if self._frame_palette: + if color * 3 + 3 > len(self._frame_palette.palette): + color = 0 + return cast( + tuple[int, int, int], + tuple(self._frame_palette.palette[color * 3 : color * 3 + 3]), + ) + else: + return (color, color, color) + + self.dispose = None + self.dispose_extent: tuple[int, int, int, int] | None = frame_dispose_extent + if self.dispose_extent and self.disposal_method >= 2: + try: + if self.disposal_method == 2: + # replace with background colour + + # only dispose the extent in this frame + x0, y0, x1, y1 = self.dispose_extent + dispose_size = (x1 - x0, y1 - y0) + + Image._decompression_bomb_check(dispose_size) + + # by convention, attempt to use transparency first + dispose_mode = "P" + color = self.info.get("transparency", frame_transparency) + if color is not None: + if self.mode in ("RGB", "RGBA"): + dispose_mode = "RGBA" + color = _rgb(color) + (0,) + else: + color = self.info.get("background", 0) + if self.mode in ("RGB", "RGBA"): + dispose_mode = "RGB" + color = _rgb(color) + self.dispose = Image.core.fill(dispose_mode, dispose_size, color) + else: + # replace with previous contents + if self._im is not None: + # only dispose the extent in this frame + self.dispose = self._crop(self.im, self.dispose_extent) + elif frame_transparency is not None: + x0, y0, x1, y1 = self.dispose_extent + dispose_size = (x1 - x0, y1 - y0) + + Image._decompression_bomb_check(dispose_size) + dispose_mode = "P" + color = frame_transparency + if self.mode in ("RGB", "RGBA"): + dispose_mode = "RGBA" + color = _rgb(frame_transparency) + (0,) + self.dispose = Image.core.fill( + dispose_mode, dispose_size, color + ) + except AttributeError: + pass + + if interlace is not None: + transparency = -1 + if frame_transparency is not None: + if frame == 0: + if LOADING_STRATEGY != LoadingStrategy.RGB_ALWAYS: + self.info["transparency"] = frame_transparency + elif self.mode not in ("RGB", "RGBA"): + transparency = frame_transparency + self.tile = [ + ImageFile._Tile( + "gif", + (x0, y0, x1, y1), + self.__offset, + (bits, interlace, transparency), + ) + ] + + if info.get("comment"): + self.info["comment"] = info["comment"] + for k in ["duration", "extension"]: + if k in info: + self.info[k] = info[k] + elif k in self.info: + del self.info[k] + + def load_prepare(self) -> None: + temp_mode = "P" if self._frame_palette else "L" + self._prev_im = None + if self.__frame == 0: + if self._frame_transparency is not None: + self.im = Image.core.fill( + temp_mode, self.size, self._frame_transparency + ) + elif self.mode in ("RGB", "RGBA"): + self._prev_im = self.im + if self._frame_palette: + self.im = Image.core.fill("P", self.size, self._frame_transparency or 0) + self.im.putpalette("RGB", *self._frame_palette.getdata()) + else: + self._im = None + if not self._prev_im and self._im is not None and self.size != self.im.size: + expanded_im = Image.core.fill(self.im.mode, self.size) + if self._frame_palette: + expanded_im.putpalette("RGB", *self._frame_palette.getdata()) + expanded_im.paste(self.im, (0, 0) + self.im.size) + + self.im = expanded_im + self._mode = temp_mode + self._frame_palette = None + + super().load_prepare() + + def load_end(self) -> None: + if self.__frame == 0: + if self.mode == "P" and LOADING_STRATEGY == LoadingStrategy.RGB_ALWAYS: + if self._frame_transparency is not None: + self.im.putpalettealpha(self._frame_transparency, 0) + self._mode = "RGBA" + else: + self._mode = "RGB" + self.im = self.im.convert(self.mode, Image.Dither.FLOYDSTEINBERG) + return + if not self._prev_im: + return + if self.size != self._prev_im.size: + if self._frame_transparency is not None: + expanded_im = Image.core.fill("RGBA", self.size) + else: + expanded_im = Image.core.fill("P", self.size) + expanded_im.putpalette("RGB", "RGB", self.im.getpalette()) + expanded_im = expanded_im.convert("RGB") + expanded_im.paste(self._prev_im, (0, 0) + self._prev_im.size) + + self._prev_im = expanded_im + assert self._prev_im is not None + if self._frame_transparency is not None: + if self.mode == "L": + frame_im = self.im.convert_transparent("LA", self._frame_transparency) + else: + self.im.putpalettealpha(self._frame_transparency, 0) + frame_im = self.im.convert("RGBA") + else: + frame_im = self.im.convert("RGB") + + assert self.dispose_extent is not None + frame_im = self._crop(frame_im, self.dispose_extent) + + self.im = self._prev_im + self._mode = self.im.mode + if frame_im.mode in ("LA", "RGBA"): + self.im.paste(frame_im, self.dispose_extent, frame_im) + else: + self.im.paste(frame_im, self.dispose_extent) + + def tell(self) -> int: + return self.__frame + + +# -------------------------------------------------------------------- +# Write GIF files + + +RAWMODE = {"1": "L", "L": "L", "P": "P"} + + +def _normalize_mode(im: Image.Image) -> Image.Image: + """ + Takes an image (or frame), returns an image in a mode that is appropriate + for saving in a Gif. + + It may return the original image, or it may return an image converted to + palette or 'L' mode. + + :param im: Image object + :returns: Image object + """ + if im.mode in RAWMODE: + im.load() + return im + if Image.getmodebase(im.mode) == "RGB": + im = im.convert("P", palette=Image.Palette.ADAPTIVE) + assert im.palette is not None + if im.palette.mode == "RGBA": + for rgba in im.palette.colors: + if rgba[3] == 0: + im.info["transparency"] = im.palette.colors[rgba] + break + return im + return im.convert("L") + + +_Palette = bytes | bytearray | list[int] | ImagePalette.ImagePalette + + +def _normalize_palette( + im: Image.Image, palette: _Palette | None, info: dict[str, Any] +) -> Image.Image: + """ + Normalizes the palette for image. + - Sets the palette to the incoming palette, if provided. + - Ensures that there's a palette for L mode images + - Optimizes the palette if necessary/desired. + + :param im: Image object + :param palette: bytes object containing the source palette, or .... + :param info: encoderinfo + :returns: Image object + """ + source_palette = None + if palette: + # a bytes palette + if isinstance(palette, (bytes, bytearray, list)): + source_palette = bytearray(palette[:768]) + if isinstance(palette, ImagePalette.ImagePalette): + source_palette = bytearray(palette.palette) + + if im.mode == "P": + if not source_palette: + im_palette = im.getpalette(None) + assert im_palette is not None + source_palette = bytearray(im_palette) + else: # L-mode + if not source_palette: + source_palette = bytearray(i // 3 for i in range(768)) + im.palette = ImagePalette.ImagePalette("RGB", palette=source_palette) + assert source_palette is not None + + if palette: + used_palette_colors: list[int | None] = [] + assert im.palette is not None + for i in range(0, len(source_palette), 3): + source_color = tuple(source_palette[i : i + 3]) + index = im.palette.colors.get(source_color) + if index in used_palette_colors: + index = None + used_palette_colors.append(index) + for i, index in enumerate(used_palette_colors): + if index is None: + for j in range(len(used_palette_colors)): + if j not in used_palette_colors: + used_palette_colors[i] = j + break + dest_map: list[int] = [] + for index in used_palette_colors: + assert index is not None + dest_map.append(index) + im = im.remap_palette(dest_map) + else: + optimized_palette_colors = _get_optimize(im, info) + if optimized_palette_colors is not None: + im = im.remap_palette(optimized_palette_colors, source_palette) + if "transparency" in info: + try: + info["transparency"] = optimized_palette_colors.index( + info["transparency"] + ) + except ValueError: + del info["transparency"] + return im + + assert im.palette is not None + im.palette.palette = source_palette + return im + + +def _write_single_frame( + im: Image.Image, + fp: IO[bytes], + palette: _Palette | None, +) -> None: + im_out = _normalize_mode(im) + for k, v in im_out.info.items(): + if isinstance(k, str): + im.encoderinfo.setdefault(k, v) + im_out = _normalize_palette(im_out, palette, im.encoderinfo) + + for s in _get_global_header(im_out, im.encoderinfo): + fp.write(s) + + # local image header + flags = 0 + if get_interlace(im): + flags = flags | 64 + _write_local_header(fp, im, (0, 0), flags) + + im_out.encoderconfig = (8, get_interlace(im)) + ImageFile._save( + im_out, fp, [ImageFile._Tile("gif", (0, 0) + im.size, 0, RAWMODE[im_out.mode])] + ) + + fp.write(b"\0") # end of image data + + +def _getbbox( + base_im: Image.Image, im_frame: Image.Image +) -> tuple[Image.Image, tuple[int, int, int, int] | None]: + palette_bytes = [ + bytes(im.palette.palette) if im.palette else b"" for im in (base_im, im_frame) + ] + if palette_bytes[0] != palette_bytes[1]: + im_frame = im_frame.convert("RGBA") + base_im = base_im.convert("RGBA") + delta = ImageChops.subtract_modulo(im_frame, base_im) + return delta, delta.getbbox(alpha_only=False) + + +class _Frame(NamedTuple): + im: Image.Image + bbox: tuple[int, int, int, int] | None + encoderinfo: dict[str, Any] + + +def _write_multiple_frames( + im: Image.Image, fp: IO[bytes], palette: _Palette | None +) -> bool: + duration = im.encoderinfo.get("duration") + disposal = im.encoderinfo.get("disposal", im.info.get("disposal")) + + im_frames: list[_Frame] = [] + previous_im: Image.Image | None = None + frame_count = 0 + background_im = None + for imSequence in itertools.chain([im], im.encoderinfo.get("append_images", [])): + for im_frame in ImageSequence.Iterator(imSequence): + # a copy is required here since seek can still mutate the image + im_frame = _normalize_mode(im_frame.copy()) + if frame_count == 0: + for k, v in im_frame.info.items(): + if k == "transparency": + continue + if isinstance(k, str): + im.encoderinfo.setdefault(k, v) + + encoderinfo = im.encoderinfo.copy() + if "transparency" in im_frame.info: + encoderinfo.setdefault("transparency", im_frame.info["transparency"]) + im_frame = _normalize_palette(im_frame, palette, encoderinfo) + if isinstance(duration, (list, tuple)): + encoderinfo["duration"] = duration[frame_count] + elif duration is None and "duration" in im_frame.info: + encoderinfo["duration"] = im_frame.info["duration"] + if isinstance(disposal, (list, tuple)): + encoderinfo["disposal"] = disposal[frame_count] + frame_count += 1 + + diff_frame = None + if im_frames and previous_im: + # delta frame + delta, bbox = _getbbox(previous_im, im_frame) + if not bbox: + # This frame is identical to the previous frame + if encoderinfo.get("duration"): + im_frames[-1].encoderinfo["duration"] += encoderinfo["duration"] + continue + if im_frames[-1].encoderinfo.get("disposal") == 2: + # To appear correctly in viewers using a convention, + # only consider transparency, and not background color + color = im.encoderinfo.get( + "transparency", im.info.get("transparency") + ) + if color is not None: + if background_im is None: + background = _get_background(im_frame, color) + background_im = Image.new("P", im_frame.size, background) + first_palette = im_frames[0].im.palette + assert first_palette is not None + background_im.putpalette(first_palette, first_palette.mode) + bbox = _getbbox(background_im, im_frame)[1] + else: + bbox = (0, 0) + im_frame.size + elif encoderinfo.get("optimize") and im_frame.mode != "1": + if "transparency" not in encoderinfo: + assert im_frame.palette is not None + try: + encoderinfo["transparency"] = ( + im_frame.palette._new_color_index(im_frame) + ) + except ValueError: + pass + if "transparency" in encoderinfo: + # When the delta is zero, fill the image with transparency + diff_frame = im_frame.copy() + fill = Image.new("P", delta.size, encoderinfo["transparency"]) + if delta.mode == "RGBA": + r, g, b, a = delta.split() + mask = ImageMath.lambda_eval( + lambda args: args["convert"]( + args["max"]( + args["max"]( + args["max"](args["r"], args["g"]), args["b"] + ), + args["a"], + ) + * 255, + "1", + ), + r=r, + g=g, + b=b, + a=a, + ) + else: + if delta.mode == "P": + # Convert to L without considering palette + delta_l = Image.new("L", delta.size) + delta_l.putdata(delta.get_flattened_data()) + delta = delta_l + mask = ImageMath.lambda_eval( + lambda args: args["convert"](args["im"] * 255, "1"), + im=delta, + ) + diff_frame.paste(fill, mask=ImageOps.invert(mask)) + else: + bbox = None + previous_im = im_frame + im_frames.append(_Frame(diff_frame or im_frame, bbox, encoderinfo)) + + if len(im_frames) == 1: + if "duration" in im.encoderinfo: + # Since multiple frames will not be written, use the combined duration + im.encoderinfo["duration"] = im_frames[0].encoderinfo["duration"] + return False + + for frame_data in im_frames: + im_frame = frame_data.im + if not frame_data.bbox: + # global header + for s in _get_global_header(im_frame, frame_data.encoderinfo): + fp.write(s) + offset = (0, 0) + else: + # compress difference + if not palette: + frame_data.encoderinfo["include_color_table"] = True + + if frame_data.bbox != (0, 0) + im_frame.size: + im_frame = im_frame.crop(frame_data.bbox) + offset = frame_data.bbox[:2] + _write_frame_data(fp, im_frame, offset, frame_data.encoderinfo) + return True + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + _save(im, fp, filename, save_all=True) + + +def _save( + im: Image.Image, fp: IO[bytes], filename: str | bytes, save_all: bool = False +) -> None: + # header + if "palette" in im.encoderinfo or "palette" in im.info: + palette = im.encoderinfo.get("palette", im.info.get("palette")) + else: + palette = None + im.encoderinfo.setdefault("optimize", True) + + if not save_all or not _write_multiple_frames(im, fp, palette): + _write_single_frame(im, fp, palette) + + fp.write(b";") # end of file + + if hasattr(fp, "flush"): + fp.flush() + + +def get_interlace(im: Image.Image) -> int: + interlace = im.encoderinfo.get("interlace", 1) + + # workaround for @PIL153 + if min(im.size) < 16: + interlace = 0 + + return interlace + + +def _write_local_header( + fp: IO[bytes], im: Image.Image, offset: tuple[int, int], flags: int +) -> None: + try: + transparency = im.encoderinfo["transparency"] + except KeyError: + transparency = None + + if "duration" in im.encoderinfo: + duration = int(im.encoderinfo["duration"] / 10) + else: + duration = 0 + + disposal = int(im.encoderinfo.get("disposal", 0)) + + if transparency is not None or duration != 0 or disposal: + packed_flag = 1 if transparency is not None else 0 + packed_flag |= disposal << 2 + + fp.write( + b"!" + + o8(249) # extension intro + + o8(4) # length + + o8(packed_flag) # packed fields + + o16(duration) # duration + + o8(transparency or 0) # transparency index + + o8(0) + ) + + include_color_table = im.encoderinfo.get("include_color_table") + if include_color_table: + palette_bytes = _get_palette_bytes(im) + color_table_size = _get_color_table_size(palette_bytes) + if color_table_size: + flags = flags | 128 # local color table flag + flags = flags | color_table_size + + fp.write( + b"," + + o16(offset[0]) # offset + + o16(offset[1]) + + o16(im.size[0]) # size + + o16(im.size[1]) + + o8(flags) # flags + ) + if include_color_table and color_table_size: + fp.write(_get_header_palette(palette_bytes)) + fp.write(o8(8)) # bits + + +def _save_netpbm(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + # Unused by default. + # To use, uncomment the register_save call at the end of the file. + # + # If you need real GIF compression and/or RGB quantization, you + # can use the external NETPBM/PBMPLUS utilities. See comments + # below for information on how to enable this. + tempfile = im._dump() + + try: + with open(filename, "wb") as f: + if im.mode != "RGB": + subprocess.check_call( + ["ppmtogif", tempfile], stdout=f, stderr=subprocess.DEVNULL + ) + else: + # Pipe ppmquant output into ppmtogif + # "ppmquant 256 %s | ppmtogif > %s" % (tempfile, filename) + quant_cmd = ["ppmquant", "256", tempfile] + togif_cmd = ["ppmtogif"] + quant_proc = subprocess.Popen( + quant_cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL + ) + togif_proc = subprocess.Popen( + togif_cmd, + stdin=quant_proc.stdout, + stdout=f, + stderr=subprocess.DEVNULL, + ) + + # Allow ppmquant to receive SIGPIPE if ppmtogif exits + assert quant_proc.stdout is not None + quant_proc.stdout.close() + + retcode = quant_proc.wait() + if retcode: + raise subprocess.CalledProcessError(retcode, quant_cmd) + + retcode = togif_proc.wait() + if retcode: + raise subprocess.CalledProcessError(retcode, togif_cmd) + finally: + try: + os.unlink(tempfile) + except OSError: + pass + + +# Force optimization so that we can test performance against +# cases where it took lots of memory and time previously. +_FORCE_OPTIMIZE = False + + +def _get_optimize(im: Image.Image, info: dict[str, Any]) -> list[int] | None: + """ + Palette optimization is a potentially expensive operation. + + This function determines if the palette should be optimized using + some heuristics, then returns the list of palette entries in use. + + :param im: Image object + :param info: encoderinfo + :returns: list of indexes of palette entries in use, or None + """ + if ( + im.mode in ("P", "L") + and info + and info.get("optimize") + and im.width != 0 + and im.height != 0 + ): + # Potentially expensive operation. + + # The palette saves 3 bytes per color not used, but palette + # lengths are restricted to 3*(2**N) bytes. Max saving would + # be 768 -> 6 bytes if we went all the way down to 2 colors. + # * If we're over 128 colors, we can't save any space. + # * If there aren't any holes, it's not worth collapsing. + # * If we have a 'large' image, the palette is in the noise. + + # create the new palette if not every color is used + optimise = _FORCE_OPTIMIZE or im.mode == "L" + if optimise or im.width * im.height < 512 * 512: + # check which colors are used + used_palette_colors = [] + for i, count in enumerate(im.histogram()): + if count: + used_palette_colors.append(i) + + if optimise or max(used_palette_colors) >= len(used_palette_colors): + return used_palette_colors + + assert im.palette is not None + num_palette_colors = len(im.palette.palette) // Image.getmodebands( + im.palette.mode + ) + current_palette_size = 1 << (num_palette_colors - 1).bit_length() + if ( + # check that the palette would become smaller when saved + len(used_palette_colors) <= current_palette_size // 2 + # check that the palette is not already the smallest possible size + and current_palette_size > 2 + ): + return used_palette_colors + return None + + +def _get_color_table_size(palette_bytes: bytes) -> int: + # calculate the palette size for the header + if not palette_bytes: + return 0 + elif len(palette_bytes) < 9: + return 1 + else: + return math.ceil(math.log(len(palette_bytes) // 3, 2)) - 1 + + +def _get_header_palette(palette_bytes: bytes) -> bytes: + """ + Returns the palette, null padded to the next power of 2 (*3) bytes + suitable for direct inclusion in the GIF header + + :param palette_bytes: Unpadded palette bytes, in RGBRGB form + :returns: Null padded palette + """ + color_table_size = _get_color_table_size(palette_bytes) + + # add the missing amount of bytes + # the palette has to be 2< 0: + palette_bytes += o8(0) * 3 * actual_target_size_diff + return palette_bytes + + +def _get_palette_bytes(im: Image.Image) -> bytes: + """ + Gets the palette for inclusion in the gif header + + :param im: Image object + :returns: Bytes, len<=768 suitable for inclusion in gif header + """ + if not im.palette: + return b"" + + palette = bytes(im.palette.palette) + if im.palette.mode == "RGBA": + palette = b"".join(palette[i * 4 : i * 4 + 3] for i in range(len(palette) // 3)) + return palette + + +def _get_background( + im: Image.Image, + info_background: int | tuple[int, int, int] | tuple[int, int, int, int] | None, +) -> int: + background = 0 + if info_background: + if isinstance(info_background, tuple): + # WebPImagePlugin stores an RGBA value in info["background"] + # So it must be converted to the same format as GifImagePlugin's + # info["background"] - a global color table index + assert im.palette is not None + try: + background = im.palette.getcolor(info_background, im) + except ValueError as e: + if str(e) not in ( + # If all 256 colors are in use, + # then there is no need for the background color + "cannot allocate more than 256 colors", + # Ignore non-opaque WebP background + "cannot add non-opaque RGBA color to RGB palette", + ): + raise + else: + background = info_background + return background + + +def _get_global_header(im: Image.Image, info: dict[str, Any]) -> list[bytes]: + """Return a list of strings representing a GIF header""" + + # Header Block + # https://www.matthewflickinger.com/lab/whatsinagif/bits_and_bytes.asp + + version = b"87a" + if im.info.get("version") == b"89a" or ( + info + and ( + "transparency" in info + or info.get("loop") is not None + or info.get("duration") + or info.get("comment") + ) + ): + version = b"89a" + + background = _get_background(im, info.get("background")) + + palette_bytes = _get_palette_bytes(im) + color_table_size = _get_color_table_size(palette_bytes) + + header = [ + b"GIF" # signature + + version # version + + o16(im.size[0]) # canvas width + + o16(im.size[1]), # canvas height + # Logical Screen Descriptor + # size of global color table + global color table flag + o8(color_table_size + 128), # packed fields + # background + reserved/aspect + o8(background) + o8(0), + # Global Color Table + _get_header_palette(palette_bytes), + ] + if info.get("loop") is not None: + header.append( + b"!" + + o8(255) # extension intro + + o8(11) + + b"NETSCAPE2.0" + + o8(3) + + o8(1) + + o16(info["loop"]) # number of loops + + o8(0) + ) + if info.get("comment"): + comment_block = b"!" + o8(254) # extension intro + + comment = info["comment"] + if isinstance(comment, str): + comment = comment.encode() + for i in range(0, len(comment), 255): + subblock = comment[i : i + 255] + comment_block += o8(len(subblock)) + subblock + + comment_block += o8(0) + header.append(comment_block) + return header + + +def _write_frame_data( + fp: IO[bytes], + im_frame: Image.Image, + offset: tuple[int, int], + params: dict[str, Any], +) -> None: + try: + im_frame.encoderinfo = params + + # local image header + _write_local_header(fp, im_frame, offset, 0) + + ImageFile._save( + im_frame, + fp, + [ImageFile._Tile("gif", (0, 0) + im_frame.size, 0, RAWMODE[im_frame.mode])], + ) + + fp.write(b"\0") # end of image data + finally: + del im_frame.encoderinfo + + +# -------------------------------------------------------------------- +# Legacy GIF utilities + + +def getheader( + im: Image.Image, palette: _Palette | None = None, info: dict[str, Any] | None = None +) -> tuple[list[bytes], list[int] | None]: + """ + Legacy Method to get Gif data from image. + + Warning:: May modify image data. + + :param im: Image object + :param palette: bytes object containing the source palette, or .... + :param info: encoderinfo + :returns: tuple of(list of header items, optimized palette) + + """ + if info is None: + info = {} + + used_palette_colors = _get_optimize(im, info) + + if "background" not in info and "background" in im.info: + info["background"] = im.info["background"] + + im_mod = _normalize_palette(im, palette, info) + im.palette = im_mod.palette + im.im = im_mod.im + header = _get_global_header(im, info) + + return header, used_palette_colors + + +def getdata( + im: Image.Image, offset: tuple[int, int] = (0, 0), **params: Any +) -> list[bytes]: + """ + Legacy Method + + Return a list of strings representing this image. + The first string is a local image header, the rest contains + encoded image data. + + To specify duration, add the time in milliseconds, + e.g. ``getdata(im_frame, duration=1000)`` + + :param im: Image object + :param offset: Tuple of (x, y) pixels. Defaults to (0, 0) + :param \\**params: e.g. duration or other encoder info parameters + :returns: List of bytes containing GIF encoded frame data + + """ + from io import BytesIO + + class Collector(BytesIO): + data = [] + + def write(self, data: Buffer) -> int: + self.data.append(data) + return len(data) + + im.load() # make sure raster data is available + + fp = Collector() + + _write_frame_data(fp, im, offset, params) + + return fp.data + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(GifImageFile.format, GifImageFile, _accept) +Image.register_save(GifImageFile.format, _save) +Image.register_save_all(GifImageFile.format, _save_all) +Image.register_extension(GifImageFile.format, ".gif") +Image.register_mime(GifImageFile.format, "image/gif") + +# +# Uncomment the following line if you wish to use NETPBM/PBMPLUS +# instead of the built-in "uncompressed" GIF encoder + +# Image.register_save(GifImageFile.format, _save_netpbm) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GimpGradientFile.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GimpGradientFile.py new file mode 100644 index 000000000..fb9587218 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GimpGradientFile.py @@ -0,0 +1,154 @@ +# +# Python Imaging Library +# $Id$ +# +# stuff to read (and render) GIMP gradient files +# +# History: +# 97-08-23 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# + +""" +Stuff to translate curve segments to palette values (derived from +the corresponding code in GIMP, written by Federico Mena Quintero. +See the GIMP distribution for more information.) +""" + +from __future__ import annotations + +from math import log, pi, sin, sqrt + +from ._binary import o8 + +TYPE_CHECKING = False +if TYPE_CHECKING: + from collections.abc import Callable + from typing import IO + +EPSILON = 1e-10 +"""""" # Enable auto-doc for data member + + +def linear(middle: float, pos: float) -> float: + if pos <= middle: + if middle < EPSILON: + return 0.0 + else: + return 0.5 * pos / middle + else: + pos = pos - middle + middle = 1.0 - middle + if middle < EPSILON: + return 1.0 + else: + return 0.5 + 0.5 * pos / middle + + +def curved(middle: float, pos: float) -> float: + return pos ** (log(0.5) / log(max(middle, EPSILON))) + + +def sine(middle: float, pos: float) -> float: + return (sin((-pi / 2.0) + pi * linear(middle, pos)) + 1.0) / 2.0 + + +def sphere_increasing(middle: float, pos: float) -> float: + return sqrt(1.0 - (linear(middle, pos) - 1.0) ** 2) + + +def sphere_decreasing(middle: float, pos: float) -> float: + return 1.0 - sqrt(1.0 - linear(middle, pos) ** 2) + + +SEGMENTS = [linear, curved, sine, sphere_increasing, sphere_decreasing] +"""""" # Enable auto-doc for data member + + +class GradientFile: + gradient: ( + list[ + tuple[ + float, + float, + float, + list[float], + list[float], + Callable[[float, float], float], + ] + ] + | None + ) = None + + def getpalette(self, entries: int = 256) -> tuple[bytes, str]: + assert self.gradient is not None + palette = [] + + ix = 0 + x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] + + for i in range(entries): + x = i / (entries - 1) + + while x1 < x: + ix += 1 + x0, x1, xm, rgb0, rgb1, segment = self.gradient[ix] + + w = x1 - x0 + + if w < EPSILON: + scale = segment(0.5, 0.5) + else: + scale = segment((xm - x0) / w, (x - x0) / w) + + # expand to RGBA + r = o8(int(255 * ((rgb1[0] - rgb0[0]) * scale + rgb0[0]) + 0.5)) + g = o8(int(255 * ((rgb1[1] - rgb0[1]) * scale + rgb0[1]) + 0.5)) + b = o8(int(255 * ((rgb1[2] - rgb0[2]) * scale + rgb0[2]) + 0.5)) + a = o8(int(255 * ((rgb1[3] - rgb0[3]) * scale + rgb0[3]) + 0.5)) + + # add to palette + palette.append(r + g + b + a) + + return b"".join(palette), "RGBA" + + +class GimpGradientFile(GradientFile): + """File handler for GIMP's gradient format.""" + + def __init__(self, fp: IO[bytes]) -> None: + if not fp.readline().startswith(b"GIMP Gradient"): + msg = "not a GIMP gradient file" + raise SyntaxError(msg) + + line = fp.readline() + + # GIMP 1.2 gradient files don't contain a name, but GIMP 1.3 files do + if line.startswith(b"Name: "): + line = fp.readline().strip() + + count = int(line) + + self.gradient = [] + + for i in range(count): + s = fp.readline().split() + w = [float(x) for x in s[:11]] + + x0, x1 = w[0], w[2] + xm = w[1] + rgb0 = w[3:7] + rgb1 = w[7:11] + + segment = SEGMENTS[int(s[11])] + cspace = int(s[12]) + + if cspace != 0: + msg = "cannot handle HSV colour space" + raise OSError(msg) + + self.gradient.append((x0, x1, xm, rgb0, rgb1, segment)) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GimpPaletteFile.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GimpPaletteFile.py new file mode 100644 index 000000000..016257d3d --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GimpPaletteFile.py @@ -0,0 +1,75 @@ +# +# Python Imaging Library +# $Id$ +# +# stuff to read GIMP palette files +# +# History: +# 1997-08-23 fl Created +# 2004-09-07 fl Support GIMP 2.0 palette files. +# +# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. +# Copyright (c) Fredrik Lundh 1997-2004. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import re +from io import BytesIO + +TYPE_CHECKING = False +if TYPE_CHECKING: + from typing import IO + + +class GimpPaletteFile: + """File handler for GIMP's palette format.""" + + rawmode = "RGB" + + def _read(self, fp: IO[bytes], limit: bool = True) -> None: + if not fp.readline().startswith(b"GIMP Palette"): + msg = "not a GIMP palette file" + raise SyntaxError(msg) + + palette: list[int] = [] + i = 0 + while True: + if limit and i == 256 + 3: + break + + i += 1 + s = fp.readline() + if not s: + break + + # skip fields and comment lines + if re.match(rb"\w+:|#", s): + continue + if limit and len(s) > 100: + msg = "bad palette file" + raise SyntaxError(msg) + + v = s.split(maxsplit=3) + if len(v) < 3: + msg = "bad palette entry" + raise ValueError(msg) + + palette += (int(v[i]) for i in range(3)) + if limit and len(palette) == 768: + break + + self.palette = bytes(palette) + + def __init__(self, fp: IO[bytes]) -> None: + self._read(fp) + + @classmethod + def frombytes(cls, data: bytes) -> GimpPaletteFile: + self = cls.__new__(cls) + self._read(BytesIO(data), False) + return self + + def getpalette(self) -> tuple[bytes, str]: + return self.palette, self.rawmode diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GribStubImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GribStubImagePlugin.py new file mode 100644 index 000000000..3784ef2f1 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/GribStubImagePlugin.py @@ -0,0 +1,72 @@ +# +# The Python Imaging Library +# $Id$ +# +# GRIB stub adapter +# +# Copyright (c) 1996-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os +from typing import IO + +from . import Image, ImageFile + +_handler = None + + +def register_handler(handler: ImageFile.StubHandler | None) -> None: + """ + Install application-specific GRIB image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + + +def _accept(prefix: bytes) -> bool: + return len(prefix) >= 8 and prefix.startswith(b"GRIB") and prefix[7] == 1 + + +class GribStubImageFile(ImageFile.StubImageFile): + format = "GRIB" + format_description = "GRIB" + + def _open(self) -> None: + assert self.fp is not None + if not _accept(self.fp.read(8)): + msg = "Not a GRIB file" + raise SyntaxError(msg) + + self.fp.seek(-8, os.SEEK_CUR) + + # make something up + self._mode = "F" + self._size = 1, 1 + + def _load(self) -> ImageFile.StubHandler | None: + return _handler + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if _handler is None or not hasattr(_handler, "save"): + msg = "GRIB save handler not installed" + raise OSError(msg) + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(GribStubImageFile.format, GribStubImageFile, _accept) +Image.register_save(GribStubImageFile.format, _save) + +Image.register_extension(GribStubImageFile.format, ".grib") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/Hdf5StubImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/Hdf5StubImagePlugin.py new file mode 100644 index 000000000..1a56660f7 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/Hdf5StubImagePlugin.py @@ -0,0 +1,72 @@ +# +# The Python Imaging Library +# $Id$ +# +# HDF5 stub adapter +# +# Copyright (c) 2000-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os +from typing import IO + +from . import Image, ImageFile + +_handler = None + + +def register_handler(handler: ImageFile.StubHandler | None) -> None: + """ + Install application-specific HDF5 image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +# -------------------------------------------------------------------- +# Image adapter + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(b"\x89HDF\r\n\x1a\n") + + +class HDF5StubImageFile(ImageFile.StubImageFile): + format = "HDF5" + format_description = "HDF5" + + def _open(self) -> None: + assert self.fp is not None + if not _accept(self.fp.read(8)): + msg = "Not an HDF file" + raise SyntaxError(msg) + + self.fp.seek(-8, os.SEEK_CUR) + + # make something up + self._mode = "F" + self._size = 1, 1 + + def _load(self) -> ImageFile.StubHandler | None: + return _handler + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if _handler is None or not hasattr(_handler, "save"): + msg = "HDF5 save handler not installed" + raise OSError(msg) + _handler.save(im, fp, filename) + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(HDF5StubImageFile.format, HDF5StubImageFile, _accept) +Image.register_save(HDF5StubImageFile.format, _save) + +Image.register_extensions(HDF5StubImageFile.format, [".h5", ".hdf"]) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/IcnsImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/IcnsImagePlugin.py new file mode 100644 index 000000000..cb7a74c2e --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/IcnsImagePlugin.py @@ -0,0 +1,401 @@ +# +# The Python Imaging Library. +# $Id$ +# +# macOS icns file decoder, based on icns.py by Bob Ippolito. +# +# history: +# 2004-10-09 fl Turned into a PIL plugin; removed 2.3 dependencies. +# 2020-04-04 Allow saving on all operating systems. +# +# Copyright (c) 2004 by Bob Ippolito. +# Copyright (c) 2004 by Secret Labs. +# Copyright (c) 2004 by Fredrik Lundh. +# Copyright (c) 2014 by Alastair Houghton. +# Copyright (c) 2020 by Pan Jing. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +import os +import struct +import sys +from typing import IO + +from . import Image, ImageFile, PngImagePlugin, features + +enable_jpeg2k = features.check_codec("jpg_2000") +if enable_jpeg2k: + from . import Jpeg2KImagePlugin + +MAGIC = b"icns" +HEADERSIZE = 8 + + +def nextheader(fobj: IO[bytes]) -> tuple[bytes, int]: + return struct.unpack(">4sI", fobj.read(HEADERSIZE)) + + +def read_32t( + fobj: IO[bytes], start_length: tuple[int, int], size: tuple[int, int, int] +) -> dict[str, Image.Image]: + # The 128x128 icon seems to have an extra header for some reason. + start, length = start_length + fobj.seek(start) + sig = fobj.read(4) + if sig != b"\x00\x00\x00\x00": + msg = "Unknown signature, expecting 0x00000000" + raise SyntaxError(msg) + return read_32(fobj, (start + 4, length - 4), size) + + +def read_32( + fobj: IO[bytes], start_length: tuple[int, int], size: tuple[int, int, int] +) -> dict[str, Image.Image]: + """ + Read a 32bit RGB icon resource. Seems to be either uncompressed or + an RLE packbits-like scheme. + """ + start, length = start_length + fobj.seek(start) + pixel_size = (size[0] * size[2], size[1] * size[2]) + sizesq = pixel_size[0] * pixel_size[1] + if length == sizesq * 3: + # uncompressed ("RGBRGBGB") + indata = fobj.read(length) + im = Image.frombuffer("RGB", pixel_size, indata, "raw", "RGB", 0, 1) + else: + # decode image + im = Image.new("RGB", pixel_size, None) + for band_ix in range(3): + data = [] + bytesleft = sizesq + while bytesleft > 0: + byte = fobj.read(1) + if not byte: + break + byte_int = byte[0] + if byte_int & 0x80: + blocksize = byte_int - 125 + byte = fobj.read(1) + data.extend([byte] * blocksize) + else: + blocksize = byte_int + 1 + data.append(fobj.read(blocksize)) + bytesleft -= blocksize + if bytesleft <= 0: + break + if bytesleft != 0: + msg = f"Error reading channel [{repr(bytesleft)} left]" + raise SyntaxError(msg) + band = Image.frombuffer("L", pixel_size, b"".join(data), "raw", "L", 0, 1) + im.im.putband(band.im, band_ix) + return {"RGB": im} + + +def read_mk( + fobj: IO[bytes], start_length: tuple[int, int], size: tuple[int, int, int] +) -> dict[str, Image.Image]: + # Alpha masks seem to be uncompressed + start = start_length[0] + fobj.seek(start) + pixel_size = (size[0] * size[2], size[1] * size[2]) + sizesq = pixel_size[0] * pixel_size[1] + band = Image.frombuffer("L", pixel_size, fobj.read(sizesq), "raw", "L", 0, 1) + return {"A": band} + + +def read_png_or_jpeg2000( + fobj: IO[bytes], start_length: tuple[int, int], size: tuple[int, int, int] +) -> dict[str, Image.Image]: + start, length = start_length + fobj.seek(start) + sig = fobj.read(12) + + im: Image.Image + if sig.startswith(b"\x89PNG\x0d\x0a\x1a\x0a"): + fobj.seek(start) + im = PngImagePlugin.PngImageFile(fobj) + Image._decompression_bomb_check(im.size) + return {"RGBA": im} + elif ( + sig.startswith((b"\xff\x4f\xff\x51", b"\x0d\x0a\x87\x0a")) + or sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a" + ): + if not enable_jpeg2k: + msg = ( + "Unsupported icon subimage format (rebuild PIL " + "with JPEG 2000 support to fix this)" + ) + raise ValueError(msg) + # j2k, jpc or j2c + fobj.seek(start) + jp2kstream = fobj.read(length) + f = io.BytesIO(jp2kstream) + im = Jpeg2KImagePlugin.Jpeg2KImageFile(f) + Image._decompression_bomb_check(im.size) + if im.mode != "RGBA": + im = im.convert("RGBA") + return {"RGBA": im} + else: + msg = "Unsupported icon subimage format" + raise ValueError(msg) + + +class IcnsFile: + SIZES = { + (512, 512, 2): [(b"ic10", read_png_or_jpeg2000)], + (512, 512, 1): [(b"ic09", read_png_or_jpeg2000)], + (256, 256, 2): [(b"ic14", read_png_or_jpeg2000)], + (256, 256, 1): [(b"ic08", read_png_or_jpeg2000)], + (128, 128, 2): [(b"ic13", read_png_or_jpeg2000)], + (128, 128, 1): [ + (b"ic07", read_png_or_jpeg2000), + (b"it32", read_32t), + (b"t8mk", read_mk), + ], + (64, 64, 1): [(b"icp6", read_png_or_jpeg2000)], + (32, 32, 2): [(b"ic12", read_png_or_jpeg2000)], + (48, 48, 1): [(b"ih32", read_32), (b"h8mk", read_mk)], + (32, 32, 1): [ + (b"icp5", read_png_or_jpeg2000), + (b"il32", read_32), + (b"l8mk", read_mk), + ], + (16, 16, 2): [(b"ic11", read_png_or_jpeg2000)], + (16, 16, 1): [ + (b"icp4", read_png_or_jpeg2000), + (b"is32", read_32), + (b"s8mk", read_mk), + ], + } + + def __init__(self, fobj: IO[bytes]) -> None: + """ + fobj is a file-like object as an icns resource + """ + # signature : (start, length) + self.dct = {} + self.fobj = fobj + sig, filesize = nextheader(fobj) + if not _accept(sig): + msg = "not an icns file" + raise SyntaxError(msg) + i = HEADERSIZE + while i < filesize: + sig, blocksize = nextheader(fobj) + if blocksize <= 0: + msg = "invalid block header" + raise SyntaxError(msg) + i += HEADERSIZE + blocksize -= HEADERSIZE + self.dct[sig] = (i, blocksize) + fobj.seek(blocksize, io.SEEK_CUR) + i += blocksize + + def itersizes(self) -> list[tuple[int, int, int]]: + sizes = [] + for size, fmts in self.SIZES.items(): + for fmt, reader in fmts: + if fmt in self.dct: + sizes.append(size) + break + return sizes + + def bestsize(self) -> tuple[int, int, int]: + sizes = self.itersizes() + if not sizes: + msg = "No 32bit icon resources found" + raise SyntaxError(msg) + return max(sizes) + + def dataforsize(self, size: tuple[int, int, int]) -> dict[str, Image.Image]: + """ + Get an icon resource as {channel: array}. Note that + the arrays are bottom-up like windows bitmaps and will likely + need to be flipped or transposed in some way. + """ + dct = {} + for code, reader in self.SIZES[size]: + desc = self.dct.get(code) + if desc is not None: + dct.update(reader(self.fobj, desc, size)) + return dct + + def getimage( + self, size: tuple[int, int] | tuple[int, int, int] | None = None + ) -> Image.Image: + if size is None: + size = self.bestsize() + elif len(size) == 2: + size = (size[0], size[1], 1) + channels = self.dataforsize(size) + + im = channels.get("RGBA") + if im: + return im + + im = channels["RGB"].copy() + try: + im.putalpha(channels["A"]) + except KeyError: + pass + return im + + +## +# Image plugin for Mac OS icons. + + +class IcnsImageFile(ImageFile.ImageFile): + """ + PIL image support for Mac OS .icns files. + Chooses the best resolution, but will possibly load + a different size image if you mutate the size attribute + before calling 'load'. + + The info dictionary has a key 'sizes' that is a list + of sizes that the icns file has. + """ + + format = "ICNS" + format_description = "Mac OS icns resource" + + def _open(self) -> None: + assert self.fp is not None + self.icns = IcnsFile(self.fp) + self._mode = "RGBA" + self.info["sizes"] = self.icns.itersizes() + self.best_size = self.icns.bestsize() + self.size = ( + self.best_size[0] * self.best_size[2], + self.best_size[1] * self.best_size[2], + ) + + @property + def size(self) -> tuple[int, int]: + return self._size + + @size.setter + def size(self, value: tuple[int, int]) -> None: + # Check that a matching size exists, + # or that there is a scale that would create a size that matches + for size in self.info["sizes"]: + simple_size = size[0] * size[2], size[1] * size[2] + scale = simple_size[0] // value[0] + if simple_size[1] / value[1] == scale: + self._size = value + return + msg = "This is not one of the allowed sizes of this image" + raise ValueError(msg) + + def load(self, scale: int | None = None) -> Image.core.PixelAccess | None: + if scale is not None: + width, height = self.size[:2] + self.size = width * scale, height * scale + self.best_size = width, height, scale + + px = Image.Image.load(self) + if self._im is not None and self.im.size == self.size: + # Already loaded + return px + self.load_prepare() + # This is likely NOT the best way to do it, but whatever. + im = self.icns.getimage(self.best_size) + + # If this is a PNG or JPEG 2000, it won't be loaded yet + px = im.load() + + self.im = im.im + self._mode = im.mode + self.size = im.size + + return px + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + """ + Saves the image as a series of PNG files, + that are then combined into a .icns file. + """ + if hasattr(fp, "flush"): + fp.flush() + + sizes = { + b"ic07": 128, + b"ic08": 256, + b"ic09": 512, + b"ic10": 1024, + b"ic11": 32, + b"ic12": 64, + b"ic13": 256, + b"ic14": 512, + } + provided_images = {im.width: im for im in im.encoderinfo.get("append_images", [])} + size_streams = {} + for size in set(sizes.values()): + image = ( + provided_images[size] + if size in provided_images + else im.resize((size, size)) + ) + + temp = io.BytesIO() + image.save(temp, "png") + size_streams[size] = temp.getvalue() + + entries = [] + for type, size in sizes.items(): + stream = size_streams[size] + entries.append((type, HEADERSIZE + len(stream), stream)) + + # Header + fp.write(MAGIC) + file_length = HEADERSIZE # Header + file_length += HEADERSIZE + 8 * len(entries) # TOC + file_length += sum(entry[1] for entry in entries) + fp.write(struct.pack(">i", file_length)) + + # TOC + fp.write(b"TOC ") + fp.write(struct.pack(">i", HEADERSIZE + len(entries) * HEADERSIZE)) + for entry in entries: + fp.write(entry[0]) + fp.write(struct.pack(">i", entry[1])) + + # Data + for entry in entries: + fp.write(entry[0]) + fp.write(struct.pack(">i", entry[1])) + fp.write(entry[2]) + + if hasattr(fp, "flush"): + fp.flush() + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(MAGIC) + + +Image.register_open(IcnsImageFile.format, IcnsImageFile, _accept) +Image.register_extension(IcnsImageFile.format, ".icns") + +Image.register_save(IcnsImageFile.format, _save) +Image.register_mime(IcnsImageFile.format, "image/icns") + +if __name__ == "__main__": + if len(sys.argv) < 2: + print("Syntax: python3 IcnsImagePlugin.py [file]") + sys.exit() + + with open(sys.argv[1], "rb") as fp: + imf = IcnsImageFile(fp) + for size in imf.info["sizes"]: + width, height, scale = imf.size = size + imf.save(f"out-{width}-{height}-{scale}.png") + with Image.open(sys.argv[1]) as im: + im.save("out.png") + if sys.platform == "windows": + os.startfile("out.png") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/IcoImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/IcoImagePlugin.py new file mode 100644 index 000000000..8dd57ff85 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/IcoImagePlugin.py @@ -0,0 +1,396 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Windows Icon support for PIL +# +# History: +# 96-05-27 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# + +# This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis +# . +# https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki +# +# Copyright 2008 Bryan Davis +# +# 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 +# +# https://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. + +# Icon format references: +# * https://en.wikipedia.org/wiki/ICO_(file_format) +# * https://msdn.microsoft.com/en-us/library/ms997538.aspx +from __future__ import annotations + +import warnings +from io import BytesIO +from math import ceil, log +from typing import IO, NamedTuple + +from . import BmpImagePlugin, Image, ImageFile, PngImagePlugin +from ._binary import i16le as i16 +from ._binary import i32le as i32 +from ._binary import o8 +from ._binary import o16le as o16 +from ._binary import o32le as o32 + +# +# -------------------------------------------------------------------- + +_MAGIC = b"\0\0\1\0" + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + fp.write(_MAGIC) # (2+2) + bmp = im.encoderinfo.get("bitmap_format") == "bmp" + sizes = im.encoderinfo.get( + "sizes", + [(16, 16), (24, 24), (32, 32), (48, 48), (64, 64), (128, 128), (256, 256)], + ) + frames = [] + provided_ims = [im] + im.encoderinfo.get("append_images", []) + width, height = im.size + for size in sorted(set(sizes)): + if size[0] > width or size[1] > height or size[0] > 256 or size[1] > 256: + continue + + for provided_im in provided_ims: + if provided_im.size != size: + continue + frames.append(provided_im) + if bmp: + bits = BmpImagePlugin.SAVE[provided_im.mode][1] + bits_used = [bits] + for other_im in provided_ims: + if other_im.size != size: + continue + bits = BmpImagePlugin.SAVE[other_im.mode][1] + if bits not in bits_used: + # Another image has been supplied for this size + # with a different bit depth + frames.append(other_im) + bits_used.append(bits) + break + else: + # TODO: invent a more convenient method for proportional scalings + frame = provided_im.copy() + frame.thumbnail(size, Image.Resampling.LANCZOS, reducing_gap=None) + frames.append(frame) + fp.write(o16(len(frames))) # idCount(2) + offset = fp.tell() + len(frames) * 16 + for frame in frames: + width, height = frame.size + # 0 means 256 + fp.write(o8(width if width < 256 else 0)) # bWidth(1) + fp.write(o8(height if height < 256 else 0)) # bHeight(1) + + bits, colors = BmpImagePlugin.SAVE[frame.mode][1:] if bmp else (32, 0) + fp.write(o8(colors)) # bColorCount(1) + fp.write(b"\0") # bReserved(1) + fp.write(b"\0\0") # wPlanes(2) + fp.write(o16(bits)) # wBitCount(2) + + image_io = BytesIO() + if bmp: + frame.save(image_io, "dib") + + if bits != 32: + and_mask = Image.new("1", size) + ImageFile._save( + and_mask, + image_io, + [ImageFile._Tile("raw", (0, 0) + size, 0, ("1", 0, -1))], + ) + else: + frame.save(image_io, "png") + image_io.seek(0) + image_bytes = image_io.read() + if bmp: + image_bytes = image_bytes[:8] + o32(height * 2) + image_bytes[12:] + bytes_len = len(image_bytes) + fp.write(o32(bytes_len)) # dwBytesInRes(4) + fp.write(o32(offset)) # dwImageOffset(4) + current = fp.tell() + fp.seek(offset) + fp.write(image_bytes) + offset = offset + bytes_len + fp.seek(current) + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(_MAGIC) + + +class IconHeader(NamedTuple): + width: int + height: int + nb_color: int + reserved: int + planes: int + bpp: int + size: int + offset: int + dim: tuple[int, int] + square: int + color_depth: int + + +class IcoFile: + def __init__(self, buf: IO[bytes]) -> None: + """ + Parse image from file-like object containing ico file data + """ + + # check magic + s = buf.read(6) + if not _accept(s): + msg = "not an ICO file" + raise SyntaxError(msg) + + self.buf = buf + self.entry = [] + + # Number of items in file + self.nb_items = i16(s, 4) + + # Get headers for each item + for i in range(self.nb_items): + s = buf.read(16) + + # See Wikipedia + width = s[0] or 256 + height = s[1] or 256 + + # No. of colors in image (0 if >=8bpp) + nb_color = s[2] + bpp = i16(s, 6) + icon_header = IconHeader( + width=width, + height=height, + nb_color=nb_color, + reserved=s[3], + planes=i16(s, 4), + bpp=i16(s, 6), + size=i32(s, 8), + offset=i32(s, 12), + dim=(width, height), + square=width * height, + # See Wikipedia notes about color depth. + # We need this just to differ images with equal sizes + color_depth=bpp or (nb_color != 0 and ceil(log(nb_color, 2))) or 256, + ) + + self.entry.append(icon_header) + + self.entry = sorted(self.entry, key=lambda x: x.color_depth) + # ICO images are usually squares + self.entry = sorted(self.entry, key=lambda x: x.square, reverse=True) + + def sizes(self) -> set[tuple[int, int]]: + """ + Get a set of all available icon sizes and color depths. + """ + return {(h.width, h.height) for h in self.entry} + + def getentryindex(self, size: tuple[int, int], bpp: int | bool = False) -> int: + for i, h in enumerate(self.entry): + if size == h.dim and (bpp is False or bpp == h.color_depth): + return i + return 0 + + def getimage(self, size: tuple[int, int], bpp: int | bool = False) -> Image.Image: + """ + Get an image from the icon + """ + return self.frame(self.getentryindex(size, bpp)) + + def frame(self, idx: int) -> Image.Image: + """ + Get an image from frame idx + """ + + header = self.entry[idx] + + self.buf.seek(header.offset) + data = self.buf.read(8) + self.buf.seek(header.offset) + + im: Image.Image + if data[:8] == PngImagePlugin._MAGIC: + # png frame + im = PngImagePlugin.PngImageFile(self.buf) + Image._decompression_bomb_check(im.size) + else: + # XOR + AND mask bmp frame + im = BmpImagePlugin.DibImageFile(self.buf) + Image._decompression_bomb_check(im.size) + + # change tile dimension to only encompass XOR image + im._size = (im.size[0], int(im.size[1] / 2)) + d, e, o, a = im.tile[0] + im.tile[0] = ImageFile._Tile(d, (0, 0) + im.size, o, a) + + # figure out where AND mask image starts + if header.bpp == 32: + # 32-bit color depth icon image allows semitransparent areas + # PIL's DIB format ignores transparency bits, recover them. + # The DIB is packed in BGRX byte order where X is the alpha + # channel. + + # Back up to start of bmp data + self.buf.seek(o) + # extract every 4th byte (eg. 3,7,11,15,...) + alpha_bytes = self.buf.read(im.size[0] * im.size[1] * 4)[3::4] + + # convert to an 8bpp grayscale image + try: + mask = Image.frombuffer( + "L", # 8bpp + im.size, # (w, h) + alpha_bytes, # source chars + "raw", # raw decoder + ("L", 0, -1), # 8bpp inverted, unpadded, reversed + ) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + mask = None + else: + raise + else: + # get AND image from end of bitmap + w = im.size[0] + if (w % 32) > 0: + # bitmap row data is aligned to word boundaries + w += 32 - (im.size[0] % 32) + + # the total mask data is + # padded row size * height / bits per char + + total_bytes = int((w * im.size[1]) / 8) + and_mask_offset = header.offset + header.size - total_bytes + + self.buf.seek(and_mask_offset) + mask_data = self.buf.read(total_bytes) + + # convert raw data to image + try: + mask = Image.frombuffer( + "1", # 1 bpp + im.size, # (w, h) + mask_data, # source chars + "raw", # raw decoder + ("1;I", int(w / 8), -1), # 1bpp inverted, padded, reversed + ) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + mask = None + else: + raise + + # now we have two images, im is XOR image and mask is AND image + + # apply mask image as alpha channel + if mask: + im = im.convert("RGBA") + im.putalpha(mask) + + return im + + +## +# Image plugin for Windows Icon files. + + +class IcoImageFile(ImageFile.ImageFile): + """ + PIL read-only image support for Microsoft Windows .ico files. + + By default the largest resolution image in the file will be loaded. This + can be changed by altering the 'size' attribute before calling 'load'. + + The info dictionary has a key 'sizes' that is a list of the sizes available + in the icon file. + + Handles classic, XP and Vista icon formats. + + When saving, PNG compression is used. Support for this was only added in + Windows Vista. If you are unable to view the icon in Windows, convert the + image to "RGBA" mode before saving. + + This plugin is a refactored version of Win32IconImagePlugin by Bryan Davis + . + https://code.google.com/archive/p/casadebender/wikis/Win32IconImagePlugin.wiki + """ + + format = "ICO" + format_description = "Windows Icon" + + def _open(self) -> None: + assert self.fp is not None + self.ico = IcoFile(self.fp) + self.info["sizes"] = self.ico.sizes() + self.size = self.ico.entry[0].dim + self.load() + + @property + def size(self) -> tuple[int, int]: + return self._size + + @size.setter + def size(self, value: tuple[int, int]) -> None: + if value not in self.info["sizes"]: + msg = "This is not one of the allowed sizes of this image" + raise ValueError(msg) + self._size = value + + def load(self) -> Image.core.PixelAccess | None: + if self._im is not None and self.im.size == self.size: + # Already loaded + return Image.Image.load(self) + im = self.ico.getimage(self.size) + # if tile is PNG, it won't really be loaded yet + im.load() + self.im = im.im + self._mode = im.mode + if im.palette: + self.palette = im.palette + if im.size != self.size: + warnings.warn("Image was not the expected size") + + index = self.ico.getentryindex(self.size) + sizes = list(self.info["sizes"]) + sizes[index] = im.size + self.info["sizes"] = set(sizes) + + self.size = im.size + return Image.Image.load(self) + + def load_seek(self, pos: int) -> None: + # Flag the ImageFile.Parser so that it + # just does all the decode at the end. + pass + + +# +# -------------------------------------------------------------------- + + +Image.register_open(IcoImageFile.format, IcoImageFile, _accept) +Image.register_save(IcoImageFile.format, _save) +Image.register_extension(IcoImageFile.format, ".ico") + +Image.register_mime(IcoImageFile.format, "image/x-icon") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImImagePlugin.py new file mode 100644 index 000000000..ef54f16e9 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImImagePlugin.py @@ -0,0 +1,390 @@ +# +# The Python Imaging Library. +# $Id$ +# +# IFUNC IM file handling for PIL +# +# history: +# 1995-09-01 fl Created. +# 1997-01-03 fl Save palette images +# 1997-01-08 fl Added sequence support +# 1997-01-23 fl Added P and RGB save support +# 1997-05-31 fl Read floating point images +# 1997-06-22 fl Save floating point images +# 1997-08-27 fl Read and save 1-bit images +# 1998-06-25 fl Added support for RGB+LUT images +# 1998-07-02 fl Added support for YCC images +# 1998-07-15 fl Renamed offset attribute to avoid name clash +# 1998-12-29 fl Added I;16 support +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) +# 2003-09-26 fl Added LA/PA support +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2001 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os +import re +from typing import IO, Any + +from . import Image, ImageFile, ImagePalette +from ._util import DeferredError + +# -------------------------------------------------------------------- +# Standard tags + +COMMENT = "Comment" +DATE = "Date" +EQUIPMENT = "Digitalization equipment" +FRAMES = "File size (no of images)" +LUT = "Lut" +NAME = "Name" +SCALE = "Scale (x,y)" +SIZE = "Image size (x*y)" +MODE = "Image type" + +TAGS = { + COMMENT: 0, + DATE: 0, + EQUIPMENT: 0, + FRAMES: 0, + LUT: 0, + NAME: 0, + SCALE: 0, + SIZE: 0, + MODE: 0, +} + +OPEN = { + # ifunc93/p3cfunc formats + "0 1 image": ("1", "1"), + "L 1 image": ("1", "1"), + "Greyscale image": ("L", "L"), + "Grayscale image": ("L", "L"), + "RGB image": ("RGB", "RGB;L"), + "RLB image": ("RGB", "RLB"), + "RYB image": ("RGB", "RLB"), + "B1 image": ("1", "1"), + "B2 image": ("P", "P;2"), + "B4 image": ("P", "P;4"), + "X 24 image": ("RGB", "RGB"), + "L 32 S image": ("I", "I;32"), + "L 32 F image": ("F", "F;32"), + # old p3cfunc formats + "RGB3 image": ("RGB", "RGB;T"), + "RYB3 image": ("RGB", "RYB;T"), + # extensions + "LA image": ("LA", "LA;L"), + "PA image": ("LA", "PA;L"), + "RGBA image": ("RGBA", "RGBA;L"), + "RGBX image": ("RGB", "RGBX;L"), + "CMYK image": ("CMYK", "CMYK;L"), + "YCC image": ("YCbCr", "YCbCr;L"), +} + +# ifunc95 extensions +for i in ["8", "8S", "16", "16S", "32", "32F"]: + OPEN[f"L {i} image"] = ("F", f"F;{i}") + OPEN[f"L*{i} image"] = ("F", f"F;{i}") +for i in ["16", "16L", "16B"]: + OPEN[f"L {i} image"] = (f"I;{i}", f"I;{i}") + OPEN[f"L*{i} image"] = (f"I;{i}", f"I;{i}") +for i in ["32S"]: + OPEN[f"L {i} image"] = ("I", f"I;{i}") + OPEN[f"L*{i} image"] = ("I", f"I;{i}") +for j in range(2, 33): + OPEN[f"L*{j} image"] = ("F", f"F;{j}") + + +# -------------------------------------------------------------------- +# Read IM directory + +split = re.compile(rb"^([A-Za-z][^:]*):[ \t]*(.*)[ \t]*$") + + +def number(s: Any) -> float: + try: + return int(s) + except ValueError: + return float(s) + + +## +# Image plugin for the IFUNC IM file format. + + +class ImImageFile(ImageFile.ImageFile): + format = "IM" + format_description = "IFUNC Image Memory" + _close_exclusive_fp_after_loading = False + + def _open(self) -> None: + # Quick rejection: if there's not an LF among the first + # 100 bytes, this is (probably) not a text header. + + assert self.fp is not None + if b"\n" not in self.fp.read(100): + msg = "not an IM file" + raise SyntaxError(msg) + self.fp.seek(0) + + n = 0 + + # Default values + self.info[MODE] = "L" + self.info[SIZE] = (512, 512) + self.info[FRAMES] = 1 + + self.rawmode = "L" + + while True: + s = self.fp.read(1) + + # Some versions of IFUNC uses \n\r instead of \r\n... + if s == b"\r": + continue + + if not s or s == b"\0" or s == b"\x1a": + break + + # FIXME: this may read whole file if not a text file + s = s + self.fp.readline() + + if len(s) > 100: + msg = "not an IM file" + raise SyntaxError(msg) + + if s.endswith(b"\r\n"): + s = s[:-2] + elif s.endswith(b"\n"): + s = s[:-1] + + try: + m = split.match(s) + except re.error as e: + msg = "not an IM file" + raise SyntaxError(msg) from e + + if m: + k, v = m.group(1, 2) + + # Don't know if this is the correct encoding, + # but a decent guess (I guess) + k = k.decode("latin-1", "replace") + v = v.decode("latin-1", "replace") + + # Convert value as appropriate + if k in [FRAMES, SCALE, SIZE]: + v = v.replace("*", ",") + v = tuple(map(number, v.split(","))) + if len(v) == 1: + v = v[0] + elif k == MODE and v in OPEN: + v, self.rawmode = OPEN[v] + + # Add to dictionary. Note that COMMENT tags are + # combined into a list of strings. + if k == COMMENT: + if k in self.info: + self.info[k].append(v) + else: + self.info[k] = [v] + else: + self.info[k] = v + + if k in TAGS: + n += 1 + + else: + msg = f"Syntax error in IM header: {s.decode('ascii', 'replace')}" + raise SyntaxError(msg) + + if not n: + msg = "Not an IM file" + raise SyntaxError(msg) + + # Basic attributes + self._size = self.info[SIZE] + self._mode = self.info[MODE] + + # Skip forward to start of image data + while s and not s.startswith(b"\x1a"): + s = self.fp.read(1) + if not s: + msg = "File truncated" + raise SyntaxError(msg) + + if LUT in self.info: + # convert lookup table to palette or lut attribute + palette = self.fp.read(768) + greyscale = 1 # greyscale palette + linear = 1 # linear greyscale palette + for i in range(256): + if palette[i] == palette[i + 256] == palette[i + 512]: + if palette[i] != i: + linear = 0 + else: + greyscale = 0 + if self.mode in ["L", "LA", "P", "PA"]: + if greyscale: + if not linear: + self.lut = list(palette[:256]) + else: + if self.mode in ["L", "P"]: + self._mode = self.rawmode = "P" + elif self.mode in ["LA", "PA"]: + self._mode = "PA" + self.rawmode = "PA;L" + self.palette = ImagePalette.raw("RGB;L", palette) + elif self.mode == "RGB": + if not greyscale or not linear: + self.lut = list(palette) + + self.frame = 0 + + self.__offset = offs = self.fp.tell() + + self._fp = self.fp # FIXME: hack + + if self.rawmode.startswith("F;"): + # ifunc95 formats + try: + # use bit decoder (if necessary) + bits = int(self.rawmode[2:]) + if bits not in [8, 16, 32]: + self.tile = [ + ImageFile._Tile( + "bit", (0, 0) + self.size, offs, (bits, 8, 3, 0, -1) + ) + ] + return + except ValueError: + pass + + if self.rawmode in ["RGB;T", "RYB;T"]: + # Old LabEye/3PC files. Would be very surprised if anyone + # ever stumbled upon such a file ;-) + size = self.size[0] * self.size[1] + self.tile = [ + ImageFile._Tile("raw", (0, 0) + self.size, offs, ("G", 0, -1)), + ImageFile._Tile("raw", (0, 0) + self.size, offs + size, ("R", 0, -1)), + ImageFile._Tile( + "raw", (0, 0) + self.size, offs + 2 * size, ("B", 0, -1) + ), + ] + else: + # LabEye/IFUNC files + self.tile = [ + ImageFile._Tile("raw", (0, 0) + self.size, offs, (self.rawmode, 0, -1)) + ] + + @property + def n_frames(self) -> int: + return self.info[FRAMES] + + @property + def is_animated(self) -> bool: + return self.info[FRAMES] > 1 + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + if isinstance(self._fp, DeferredError): + raise self._fp.ex + + self.frame = frame + + if self.mode == "1": + bits = 1 + else: + bits = 8 * len(self.mode) + + size = ((self.size[0] * bits + 7) // 8) * self.size[1] + offs = self.__offset + frame * size + + self.fp = self._fp + + self.tile = [ + ImageFile._Tile("raw", (0, 0) + self.size, offs, (self.rawmode, 0, -1)) + ] + + def tell(self) -> int: + return self.frame + + +# +# -------------------------------------------------------------------- +# Save IM files + + +SAVE = { + # mode: (im type, raw mode) + "1": ("0 1", "1"), + "L": ("Greyscale", "L"), + "LA": ("LA", "LA;L"), + "P": ("Greyscale", "P"), + "PA": ("LA", "PA;L"), + "I": ("L 32S", "I;32S"), + "I;16": ("L 16", "I;16"), + "I;16L": ("L 16L", "I;16L"), + "I;16B": ("L 16B", "I;16B"), + "F": ("L 32F", "F;32F"), + "RGB": ("RGB", "RGB;L"), + "RGBA": ("RGBA", "RGBA;L"), + "RGBX": ("RGBX", "RGBX;L"), + "CMYK": ("CMYK", "CMYK;L"), + "YCbCr": ("YCC", "YCbCr;L"), +} + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + try: + image_type, rawmode = SAVE[im.mode] + except KeyError as e: + msg = f"Cannot save {im.mode} images as IM" + raise ValueError(msg) from e + + frames = im.encoderinfo.get("frames", 1) + + fp.write(f"Image type: {image_type} image\r\n".encode("ascii")) + if filename: + # Each line must be 100 characters or less, + # or: SyntaxError("not an IM file") + # 8 characters are used for "Name: " and "\r\n" + # Keep just the filename, ditch the potentially overlong path + if isinstance(filename, bytes): + filename = filename.decode("ascii") + name, ext = os.path.splitext(os.path.basename(filename)) + name = "".join([name[: 92 - len(ext)], ext]) + + fp.write(f"Name: {name}\r\n".encode("ascii")) + fp.write(f"Image size (x*y): {im.size[0]}*{im.size[1]}\r\n".encode("ascii")) + fp.write(f"File size (no of images): {frames}\r\n".encode("ascii")) + if im.mode in ["P", "PA"]: + fp.write(b"Lut: 1\r\n") + fp.write(b"\000" * (511 - fp.tell()) + b"\032") + if im.mode in ["P", "PA"]: + im_palette = im.im.getpalette("RGB", "RGB;L") + colors = len(im_palette) // 3 + palette = b"" + for i in range(3): + palette += im_palette[colors * i : colors * (i + 1)] + palette += b"\x00" * (256 - colors) + fp.write(palette) # 768 bytes + ImageFile._save( + im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, -1))] + ) + + +# +# -------------------------------------------------------------------- +# Registry + + +Image.register_open(ImImageFile.format, ImImageFile) +Image.register_save(ImImageFile.format, _save) + +Image.register_extension(ImImageFile.format, ".im") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/Image.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/Image.py new file mode 100644 index 000000000..574980771 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/Image.py @@ -0,0 +1,4381 @@ +# +# The Python Imaging Library. +# $Id$ +# +# the Image class wrapper +# +# partial release history: +# 1995-09-09 fl Created +# 1996-03-11 fl PIL release 0.0 (proof of concept) +# 1996-04-30 fl PIL release 0.1b1 +# 1999-07-28 fl PIL release 1.0 final +# 2000-06-07 fl PIL release 1.1 +# 2000-10-20 fl PIL release 1.1.1 +# 2001-05-07 fl PIL release 1.1.2 +# 2002-03-15 fl PIL release 1.1.3 +# 2003-05-10 fl PIL release 1.1.4 +# 2005-03-28 fl PIL release 1.1.5 +# 2006-12-02 fl PIL release 1.1.6 +# 2009-11-15 fl PIL release 1.1.7 +# +# Copyright (c) 1997-2009 by Secret Labs AB. All rights reserved. +# Copyright (c) 1995-2009 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +from __future__ import annotations + +import abc +import atexit +import builtins +import io +import logging +import math +import os +import re +import struct +import sys +import tempfile +import warnings +from collections.abc import MutableMapping +from enum import IntEnum +from typing import IO, Protocol, cast + +# VERSION was removed in Pillow 6.0.0. +# PILLOW_VERSION was removed in Pillow 9.0.0. +# Use __version__ instead. +from . import ( + ExifTags, + ImageMode, + TiffTags, + UnidentifiedImageError, + __version__, + _plugins, +) +from ._binary import i32le, o32be, o32le +from ._deprecate import deprecate +from ._util import DeferredError, is_path + +ElementTree: ModuleType | None +try: + from defusedxml import ElementTree +except ImportError: + ElementTree = None + +TYPE_CHECKING = False +if TYPE_CHECKING: + from collections.abc import Callable, Iterator, Sequence + from types import ModuleType + from typing import Any, Literal + +logger = logging.getLogger(__name__) + + +class DecompressionBombWarning(RuntimeWarning): + pass + + +class DecompressionBombError(Exception): + pass + + +WARN_POSSIBLE_FORMATS: bool = False + +# Limit to around a quarter gigabyte for a 24-bit (3 bpp) image +MAX_IMAGE_PIXELS: int | None = int(1024 * 1024 * 1024 // 4 // 3) + + +try: + # If the _imaging C module is not present, Pillow will not load. + # Note that other modules should not refer to _imaging directly; + # import Image and use the Image.core variable instead. + # Also note that Image.core is not a publicly documented interface, + # and should be considered private and subject to change. + from . import _imaging as core + + if __version__ != getattr(core, "PILLOW_VERSION", None): + msg = ( + "The _imaging extension was built for another version of Pillow or PIL:\n" + f"Core version: {getattr(core, 'PILLOW_VERSION', None)}\n" + f"Pillow version: {__version__}" + ) + raise ImportError(msg) + +except ImportError as v: + # Explanations for ways that we know we might have an import error + if str(v).startswith("Module use of python"): + # The _imaging C module is present, but not compiled for + # the right version (windows only). Print a warning, if + # possible. + warnings.warn( + "The _imaging extension was built for another version of Python.", + RuntimeWarning, + ) + elif str(v).startswith("The _imaging extension"): + warnings.warn(str(v), RuntimeWarning) + # Fail here anyway. Don't let people run with a mostly broken Pillow. + # see docs/porting.rst + raise + + +# +# Constants + + +# transpose +class Transpose(IntEnum): + FLIP_LEFT_RIGHT = 0 + FLIP_TOP_BOTTOM = 1 + ROTATE_90 = 2 + ROTATE_180 = 3 + ROTATE_270 = 4 + TRANSPOSE = 5 + TRANSVERSE = 6 + + +# transforms (also defined in Imaging.h) +class Transform(IntEnum): + AFFINE = 0 + EXTENT = 1 + PERSPECTIVE = 2 + QUAD = 3 + MESH = 4 + + +# resampling filters (also defined in Imaging.h) +class Resampling(IntEnum): + NEAREST = 0 + BOX = 4 + BILINEAR = 2 + HAMMING = 5 + BICUBIC = 3 + LANCZOS = 1 + + +_filters_support = { + Resampling.BOX: 0.5, + Resampling.BILINEAR: 1.0, + Resampling.HAMMING: 1.0, + Resampling.BICUBIC: 2.0, + Resampling.LANCZOS: 3.0, +} + + +# dithers +class Dither(IntEnum): + NONE = 0 + ORDERED = 1 # Not yet implemented + RASTERIZE = 2 # Not yet implemented + FLOYDSTEINBERG = 3 # default + + +# palettes/quantizers +class Palette(IntEnum): + WEB = 0 + ADAPTIVE = 1 + + +class Quantize(IntEnum): + MEDIANCUT = 0 + MAXCOVERAGE = 1 + FASTOCTREE = 2 + LIBIMAGEQUANT = 3 + + +module = sys.modules[__name__] +for enum in (Transpose, Transform, Resampling, Dither, Palette, Quantize): + for item in enum: + setattr(module, item.name, item.value) + + +if hasattr(core, "DEFAULT_STRATEGY"): + DEFAULT_STRATEGY = core.DEFAULT_STRATEGY + FILTERED = core.FILTERED + HUFFMAN_ONLY = core.HUFFMAN_ONLY + RLE = core.RLE + FIXED = core.FIXED + + +# -------------------------------------------------------------------- +# Registries + +TYPE_CHECKING = False +if TYPE_CHECKING: + import mmap + from xml.etree.ElementTree import Element + + from IPython.lib.pretty import PrettyPrinter + + from . import ImageFile, ImageFilter, ImagePalette, ImageQt, TiffImagePlugin + from ._typing import CapsuleType, NumpyArray, StrOrBytesPath +ID: list[str] = [] +OPEN: dict[ + str, + tuple[ + Callable[[IO[bytes], str | bytes], ImageFile.ImageFile], + Callable[[bytes], bool | str] | None, + ], +] = {} +MIME: dict[str, str] = {} +SAVE: dict[str, Callable[[Image, IO[bytes], str | bytes], None]] = {} +SAVE_ALL: dict[str, Callable[[Image, IO[bytes], str | bytes], None]] = {} +EXTENSION: dict[str, str] = {} +DECODERS: dict[str, type[ImageFile.PyDecoder]] = {} +ENCODERS: dict[str, type[ImageFile.PyEncoder]] = {} + +# -------------------------------------------------------------------- +# Modes + +_ENDIAN = "<" if sys.byteorder == "little" else ">" + + +def _conv_type_shape(im: Image) -> tuple[tuple[int, ...], str]: + m = ImageMode.getmode(im.mode) + shape: tuple[int, ...] = (im.height, im.width) + extra = len(m.bands) + if extra != 1: + shape += (extra,) + return shape, m.typestr + + +MODES = [ + "1", + "CMYK", + "F", + "HSV", + "I", + "I;16", + "I;16B", + "I;16L", + "I;16N", + "L", + "LA", + "La", + "LAB", + "P", + "PA", + "RGB", + "RGBA", + "RGBa", + "RGBX", + "YCbCr", +] + +# raw modes that may be memory mapped. NOTE: if you change this, you +# may have to modify the stride calculation in map.c too! +_MAPMODES = ("L", "P", "RGBX", "RGBA", "CMYK", "I;16", "I;16L", "I;16B") + + +def getmodebase(mode: str) -> str: + """ + Gets the "base" mode for given mode. This function returns "L" for + images that contain grayscale data, and "RGB" for images that + contain color data. + + :param mode: Input mode. + :returns: "L" or "RGB". + :exception KeyError: If the input mode was not a standard mode. + """ + return ImageMode.getmode(mode).basemode + + +def getmodetype(mode: str) -> str: + """ + Gets the storage type mode. Given a mode, this function returns a + single-layer mode suitable for storing individual bands. + + :param mode: Input mode. + :returns: "L", "I", or "F". + :exception KeyError: If the input mode was not a standard mode. + """ + return ImageMode.getmode(mode).basetype + + +def getmodebandnames(mode: str) -> tuple[str, ...]: + """ + Gets a list of individual band names. Given a mode, this function returns + a tuple containing the names of individual bands (use + :py:method:`~PIL.Image.getmodetype` to get the mode used to store each + individual band. + + :param mode: Input mode. + :returns: A tuple containing band names. The length of the tuple + gives the number of bands in an image of the given mode. + :exception KeyError: If the input mode was not a standard mode. + """ + return ImageMode.getmode(mode).bands + + +def getmodebands(mode: str) -> int: + """ + Gets the number of individual bands for this mode. + + :param mode: Input mode. + :returns: The number of bands in this mode. + :exception KeyError: If the input mode was not a standard mode. + """ + return len(ImageMode.getmode(mode).bands) + + +# -------------------------------------------------------------------- +# Helpers + +_initialized = 0 + +# Mapping from file extension to plugin module name for lazy importing +_EXTENSION_PLUGIN: dict[str, str] = { + # Common formats (preinit) + ".bmp": "BmpImagePlugin", + ".dib": "BmpImagePlugin", + ".gif": "GifImagePlugin", + ".jfif": "JpegImagePlugin", + ".jpe": "JpegImagePlugin", + ".jpg": "JpegImagePlugin", + ".jpeg": "JpegImagePlugin", + ".pbm": "PpmImagePlugin", + ".pgm": "PpmImagePlugin", + ".pnm": "PpmImagePlugin", + ".ppm": "PpmImagePlugin", + ".pfm": "PpmImagePlugin", + ".png": "PngImagePlugin", + ".apng": "PngImagePlugin", + # Less common formats (init) + ".avif": "AvifImagePlugin", + ".avifs": "AvifImagePlugin", + ".blp": "BlpImagePlugin", + ".bufr": "BufrStubImagePlugin", + ".cur": "CurImagePlugin", + ".dcx": "DcxImagePlugin", + ".dds": "DdsImagePlugin", + ".ps": "EpsImagePlugin", + ".eps": "EpsImagePlugin", + ".fit": "FitsImagePlugin", + ".fits": "FitsImagePlugin", + ".fli": "FliImagePlugin", + ".flc": "FliImagePlugin", + ".fpx": "FpxImagePlugin", + ".ftc": "FtexImagePlugin", + ".ftu": "FtexImagePlugin", + ".gbr": "GbrImagePlugin", + ".grib": "GribStubImagePlugin", + ".h5": "Hdf5StubImagePlugin", + ".hdf": "Hdf5StubImagePlugin", + ".icns": "IcnsImagePlugin", + ".ico": "IcoImagePlugin", + ".im": "ImImagePlugin", + ".iim": "IptcImagePlugin", + ".jp2": "Jpeg2KImagePlugin", + ".j2k": "Jpeg2KImagePlugin", + ".jpc": "Jpeg2KImagePlugin", + ".jpf": "Jpeg2KImagePlugin", + ".jpx": "Jpeg2KImagePlugin", + ".j2c": "Jpeg2KImagePlugin", + ".mic": "MicImagePlugin", + ".mpg": "MpegImagePlugin", + ".mpeg": "MpegImagePlugin", + ".mpo": "MpoImagePlugin", + ".msp": "MspImagePlugin", + ".palm": "PalmImagePlugin", + ".pcd": "PcdImagePlugin", + ".pcx": "PcxImagePlugin", + ".pdf": "PdfImagePlugin", + ".pxr": "PixarImagePlugin", + ".psd": "PsdImagePlugin", + ".qoi": "QoiImagePlugin", + ".bw": "SgiImagePlugin", + ".rgb": "SgiImagePlugin", + ".rgba": "SgiImagePlugin", + ".sgi": "SgiImagePlugin", + ".ras": "SunImagePlugin", + ".tga": "TgaImagePlugin", + ".icb": "TgaImagePlugin", + ".vda": "TgaImagePlugin", + ".vst": "TgaImagePlugin", + ".tif": "TiffImagePlugin", + ".tiff": "TiffImagePlugin", + ".webp": "WebPImagePlugin", + ".wmf": "WmfImagePlugin", + ".emf": "WmfImagePlugin", + ".xbm": "XbmImagePlugin", + ".xpm": "XpmImagePlugin", +} + + +def _import_plugin_for_extension(ext: str | bytes) -> bool: + """Import only the plugin needed for a specific file extension.""" + if not ext: + return False + + if isinstance(ext, bytes): + ext = ext.decode() + ext = ext.lower() + if ext in EXTENSION: + return True + + plugin = _EXTENSION_PLUGIN.get(ext) + if plugin is None: + return False + + try: + logger.debug("Importing %s", plugin) + __import__(f"{__spec__.parent}.{plugin}", globals(), locals(), []) + return True + except ImportError as e: + logger.debug("Image: failed to import %s: %s", plugin, e) + return False + + +def preinit() -> None: + """ + Explicitly loads BMP, GIF, JPEG, PPM and PNG file format drivers. + + It is called when opening or saving images. + """ + + global _initialized + if _initialized >= 1: + return + + try: + from . import BmpImagePlugin + + assert BmpImagePlugin + except ImportError: + pass + try: + from . import GifImagePlugin + + assert GifImagePlugin + except ImportError: + pass + try: + from . import JpegImagePlugin + + assert JpegImagePlugin + except ImportError: + pass + try: + from . import PpmImagePlugin + + assert PpmImagePlugin + except ImportError: + pass + try: + from . import PngImagePlugin + + assert PngImagePlugin + except ImportError: + pass + + _initialized = 1 + + +def init() -> bool: + """ + Explicitly initializes the Python Imaging Library. This function + loads all available file format drivers. + + It is called when opening or saving images if :py:meth:`~preinit()` is + insufficient, and by :py:meth:`~PIL.features.pilinfo`. + """ + + global _initialized + if _initialized >= 2: + return False + + for plugin in _plugins: + try: + logger.debug("Importing %s", plugin) + __import__(f"{__spec__.parent}.{plugin}", globals(), locals(), []) + except ImportError as e: # noqa: PERF203 + logger.debug("Image: failed to import %s: %s", plugin, e) + + if OPEN or SAVE: + _initialized = 2 + return True + return False + + +# -------------------------------------------------------------------- +# Codec factories (used by tobytes/frombytes and ImageFile.load) + + +def _getdecoder( + mode: str, decoder_name: str, args: Any, extra: tuple[Any, ...] = () +) -> core.ImagingDecoder | ImageFile.PyDecoder: + # tweak arguments + if args is None: + args = () + elif not isinstance(args, tuple): + args = (args,) + + try: + decoder = DECODERS[decoder_name] + except KeyError: + pass + else: + return decoder(mode, *args + extra) + + try: + # get decoder + decoder = getattr(core, f"{decoder_name}_decoder") + except AttributeError as e: + msg = f"decoder {decoder_name} not available" + raise OSError(msg) from e + return decoder(mode, *args + extra) + + +def _getencoder( + mode: str, encoder_name: str, args: Any, extra: tuple[Any, ...] = () +) -> core.ImagingEncoder | ImageFile.PyEncoder: + # tweak arguments + if args is None: + args = () + elif not isinstance(args, tuple): + args = (args,) + + try: + encoder = ENCODERS[encoder_name] + except KeyError: + pass + else: + return encoder(mode, *args + extra) + + try: + # get encoder + encoder = getattr(core, f"{encoder_name}_encoder") + except AttributeError as e: + msg = f"encoder {encoder_name} not available" + raise OSError(msg) from e + return encoder(mode, *args + extra) + + +# -------------------------------------------------------------------- +# Simple expression analyzer + + +class ImagePointTransform: + """ + Used with :py:meth:`~PIL.Image.Image.point` for single band images with more than + 8 bits, this represents an affine transformation, where the value is multiplied by + ``scale`` and ``offset`` is added. + """ + + def __init__(self, scale: float, offset: float) -> None: + self.scale = scale + self.offset = offset + + def __neg__(self) -> ImagePointTransform: + return ImagePointTransform(-self.scale, -self.offset) + + def __add__(self, other: ImagePointTransform | float) -> ImagePointTransform: + if isinstance(other, ImagePointTransform): + return ImagePointTransform( + self.scale + other.scale, self.offset + other.offset + ) + return ImagePointTransform(self.scale, self.offset + other) + + __radd__ = __add__ + + def __sub__(self, other: ImagePointTransform | float) -> ImagePointTransform: + return self + -other + + def __rsub__(self, other: ImagePointTransform | float) -> ImagePointTransform: + return other + -self + + def __mul__(self, other: ImagePointTransform | float) -> ImagePointTransform: + if isinstance(other, ImagePointTransform): + return NotImplemented + return ImagePointTransform(self.scale * other, self.offset * other) + + __rmul__ = __mul__ + + def __truediv__(self, other: ImagePointTransform | float) -> ImagePointTransform: + if isinstance(other, ImagePointTransform): + return NotImplemented + return ImagePointTransform(self.scale / other, self.offset / other) + + +def _getscaleoffset( + expr: Callable[[ImagePointTransform], ImagePointTransform | float], +) -> tuple[float, float]: + a = expr(ImagePointTransform(1, 0)) + return (a.scale, a.offset) if isinstance(a, ImagePointTransform) else (0, a) + + +# -------------------------------------------------------------------- +# Implementation wrapper + + +class SupportsGetData(Protocol): + def getdata( + self, + ) -> tuple[Transform, Sequence[int]]: ... + + +class Image: + """ + This class represents an image object. To create + :py:class:`~PIL.Image.Image` objects, use the appropriate factory + functions. There's hardly ever any reason to call the Image constructor + directly. + + * :py:func:`~PIL.Image.open` + * :py:func:`~PIL.Image.new` + * :py:func:`~PIL.Image.frombytes` + """ + + format: str | None = None + format_description: str | None = None + _close_exclusive_fp_after_loading = True + + def __init__(self) -> None: + # FIXME: take "new" parameters / other image? + self._im: core.ImagingCore | DeferredError | None = None + self._mode = "" + self._size = (0, 0) + self.palette: ImagePalette.ImagePalette | None = None + self.info: dict[str | tuple[int, int], Any] = {} + self.readonly = 0 + self._exif: Exif | None = None + + @property + def im(self) -> core.ImagingCore: + if isinstance(self._im, DeferredError): + raise self._im.ex + assert self._im is not None + return self._im + + @im.setter + def im(self, im: core.ImagingCore) -> None: + self._im = im + + @property + def width(self) -> int: + return self.size[0] + + @property + def height(self) -> int: + return self.size[1] + + @property + def size(self) -> tuple[int, int]: + return self._size + + @property + def mode(self) -> str: + return self._mode + + @property + def readonly(self) -> int: + return (self._im and self._im.readonly) or self._readonly + + @readonly.setter + def readonly(self, readonly: int) -> None: + self._readonly = readonly + + def _new(self, im: core.ImagingCore) -> Image: + new = Image() + new.im = im + new._mode = im.mode + new._size = im.size + if im.mode in ("P", "PA"): + if self.palette: + new.palette = self.palette.copy() + else: + from . import ImagePalette + + new.palette = ImagePalette.ImagePalette() + new.info = self.info.copy() + return new + + # Context manager support + def __enter__(self) -> Image: + return self + + def __exit__(self, *args: object) -> None: + pass + + def close(self) -> None: + """ + This operation will destroy the image core and release its memory. + The image data will be unusable afterward. + + This function is required to close images that have multiple frames or + have not had their file read and closed by the + :py:meth:`~PIL.Image.Image.load` method. See :ref:`file-handling` for + more information. + """ + if getattr(self, "map", None): + if sys.platform == "win32" and hasattr(sys, "pypy_version_info"): + self.map.close() + self.map: mmap.mmap | None = None + + # Instead of simply setting to None, we're setting up a + # deferred error that will better explain that the core image + # object is gone. + self._im = DeferredError(ValueError("Operation on closed image")) + + def _copy(self) -> None: + self.load() + self.im = self.im.copy() + self.readonly = 0 + + def _ensure_mutable(self) -> None: + if self.readonly: + self._copy() + else: + self.load() + + def _dump( + self, file: str | None = None, format: str | None = None, **options: Any + ) -> str: + suffix = "" + if format: + suffix = f".{format}" + + if not file: + f, filename = tempfile.mkstemp(suffix) + os.close(f) + else: + filename = file + if not filename.endswith(suffix): + filename = filename + suffix + + self.load() + + if not format or format == "PPM": + self.im.save_ppm(filename) + else: + self.save(filename, format, **options) + + return filename + + def __eq__(self, other: object) -> bool: + if self.__class__ is not other.__class__: + return False + assert isinstance(other, Image) + return ( + self.mode == other.mode + and self.size == other.size + and self.info == other.info + and self.getpalette() == other.getpalette() + and self.tobytes() == other.tobytes() + ) + + def __repr__(self) -> str: + return ( + f"<{self.__class__.__module__}.{self.__class__.__name__} " + f"image mode={self.mode} size={self.size[0]}x{self.size[1]} " + f"at 0x{id(self):X}>" + ) + + def _repr_pretty_(self, p: PrettyPrinter, cycle: bool) -> None: + """IPython plain text display support""" + + # Same as __repr__ but without unpredictable id(self), + # to keep Jupyter notebook `text/plain` output stable. + p.text( + f"<{self.__class__.__module__}.{self.__class__.__name__} " + f"image mode={self.mode} size={self.size[0]}x{self.size[1]}>" + ) + + def _repr_image(self, image_format: str, **kwargs: Any) -> bytes | None: + """Helper function for iPython display hook. + + :param image_format: Image format. + :returns: image as bytes, saved into the given format. + """ + b = io.BytesIO() + try: + self.save(b, image_format, **kwargs) + except Exception: + return None + return b.getvalue() + + def _repr_png_(self) -> bytes | None: + """iPython display hook support for PNG format. + + :returns: PNG version of the image as bytes + """ + return self._repr_image("PNG", compress_level=1) + + def _repr_jpeg_(self) -> bytes | None: + """iPython display hook support for JPEG format. + + :returns: JPEG version of the image as bytes + """ + return self._repr_image("JPEG") + + @property + def __array_interface__(self) -> dict[str, str | bytes | int | tuple[int, ...]]: + # numpy array interface support + new: dict[str, str | bytes | int | tuple[int, ...]] = {"version": 3} + if self.mode == "1": + # Binary images need to be extended from bits to bytes + # See: https://github.com/python-pillow/Pillow/issues/350 + new["data"] = self.tobytes("raw", "L") + else: + new["data"] = self.tobytes() + new["shape"], new["typestr"] = _conv_type_shape(self) + return new + + def __arrow_c_schema__(self) -> object: + self.load() + return self.im.__arrow_c_schema__() + + def __arrow_c_array__( + self, requested_schema: object | None = None + ) -> tuple[object, object]: + self.load() + return (self.im.__arrow_c_schema__(), self.im.__arrow_c_array__()) + + def __getstate__(self) -> list[Any]: + im_data = self.tobytes() # load image first + return [self.info, self.mode, self.size, self.getpalette(), im_data] + + def __setstate__(self, state: list[Any]) -> None: + Image.__init__(self) + info, mode, size, palette, data = state[:5] + self.info = info + self._mode = mode + self._size = size + self.im = core.new(mode, size) + if mode in ("L", "LA", "P", "PA") and palette: + self.putpalette(palette) + self.frombytes(data) + + def tobytes(self, encoder_name: str = "raw", *args: Any) -> bytes: + """ + Return image as a bytes object. + + .. warning:: + + This method returns raw image data derived from Pillow's internal + storage. For compressed image data (e.g. PNG, JPEG) use + :meth:`~.save`, with a BytesIO parameter for in-memory data. + + :param encoder_name: What encoder to use. + + The default is to use the standard "raw" encoder. + To see how this packs pixel data into the returned + bytes, see :file:`libImaging/Pack.c`. + + A list of C encoders can be seen under codecs + section of the function array in + :file:`_imaging.c`. Python encoders are registered + within the relevant plugins. + :param args: Extra arguments to the encoder. + :returns: A :py:class:`bytes` object. + """ + + encoder_args: Any = args + if len(encoder_args) == 1 and isinstance(encoder_args[0], tuple): + # may pass tuple instead of argument list + encoder_args = encoder_args[0] + + if encoder_name == "raw" and encoder_args == (): + encoder_args = self.mode + + self.load() + + if self.width == 0 or self.height == 0: + return b"" + + # unpack data + e = _getencoder(self.mode, encoder_name, encoder_args) + e.setimage(self.im, (0, 0) + self.size) + + from . import ImageFile + + bufsize = max(ImageFile.MAXBLOCK, self.size[0] * 4) # see RawEncode.c + + output = [] + while True: + bytes_consumed, errcode, data = e.encode(bufsize) + output.append(data) + if errcode: + break + if errcode < 0: + msg = f"encoder error {errcode} in tobytes" + raise RuntimeError(msg) + + return b"".join(output) + + def tobitmap(self, name: str = "image") -> bytes: + """ + Returns the image converted to an X11 bitmap. + + .. note:: This method only works for mode "1" images. + + :param name: The name prefix to use for the bitmap variables. + :returns: A string containing an X11 bitmap. + :raises ValueError: If the mode is not "1" + """ + + self.load() + if self.mode != "1": + msg = "not a bitmap" + raise ValueError(msg) + data = self.tobytes("xbm") + return b"".join( + [ + f"#define {name}_width {self.size[0]}\n".encode("ascii"), + f"#define {name}_height {self.size[1]}\n".encode("ascii"), + f"static char {name}_bits[] = {{\n".encode("ascii"), + data, + b"};", + ] + ) + + def frombytes( + self, + data: bytes | bytearray | SupportsArrayInterface, + decoder_name: str = "raw", + *args: Any, + ) -> None: + """ + Loads this image with pixel data from a bytes object. + + This method is similar to the :py:func:`~PIL.Image.frombytes` function, + but loads data into this image instead of creating a new image object. + """ + + if self.width == 0 or self.height == 0: + return + + decoder_args: Any = args + if len(decoder_args) == 1 and isinstance(decoder_args[0], tuple): + # may pass tuple instead of argument list + decoder_args = decoder_args[0] + + # default format + if decoder_name == "raw" and decoder_args == (): + decoder_args = self.mode + + # unpack data + d = _getdecoder(self.mode, decoder_name, decoder_args) + d.setimage(self.im, (0, 0) + self.size) + s = d.decode(data) + + if s[0] >= 0: + msg = "not enough image data" + raise ValueError(msg) + if s[1] != 0: + msg = "cannot decode image data" + raise ValueError(msg) + + def load(self) -> core.PixelAccess | None: + """ + Allocates storage for the image and loads the pixel data. In + normal cases, you don't need to call this method, since the + Image class automatically loads an opened image when it is + accessed for the first time. + + If the file associated with the image was opened by Pillow, then this + method will close it. The exception to this is if the image has + multiple frames, in which case the file will be left open for seek + operations. See :ref:`file-handling` for more information. + + :returns: An image access object. + :rtype: :py:class:`.PixelAccess` + """ + if self._im is not None and self.palette and self.palette.dirty: + # realize palette + mode, arr = self.palette.getdata() + self.im.putpalette(self.palette.mode, mode, arr) + self.palette.dirty = 0 + self.palette.rawmode = None + if "transparency" in self.info and mode in ("LA", "PA"): + if isinstance(self.info["transparency"], int): + self.im.putpalettealpha(self.info["transparency"], 0) + else: + self.im.putpalettealphas(self.info["transparency"]) + self.palette.mode = "RGBA" + elif self.palette.mode != mode: + # If the palette rawmode is different to the mode, + # then update the Python palette data + self.palette.palette = self.im.getpalette( + self.palette.mode, self.palette.mode + ) + + if self._im is not None: + return self.im.pixel_access(self.readonly) + return None + + def verify(self) -> None: + """ + Verifies the contents of a file. For data read from a file, this + method attempts to determine if the file is broken, without + actually decoding the image data. If this method finds any + problems, it raises suitable exceptions. If you need to load + the image after using this method, you must reopen the image + file. + """ + pass + + def convert( + self, + mode: str | None = None, + matrix: tuple[float, ...] | None = None, + dither: Dither | None = None, + palette: Palette = Palette.WEB, + colors: int = 256, + ) -> Image: + """ + Returns a converted copy of this image. For the "P" mode, this + method translates pixels through the palette. If mode is + omitted, a mode is chosen so that all information in the image + and the palette can be represented without a palette. + + This supports all possible conversions between "L", "RGB" and "CMYK". The + ``matrix`` argument only supports "L" and "RGB". + + When translating a color image to grayscale (mode "L"), + the library uses the ITU-R 601-2 luma transform:: + + L = R * 299/1000 + G * 587/1000 + B * 114/1000 + + The default method of converting a grayscale ("L") or "RGB" + image into a bilevel (mode "1") image uses Floyd-Steinberg + dither to approximate the original image luminosity levels. If + dither is ``None``, all values larger than 127 are set to 255 (white), + all other values to 0 (black). To use other thresholds, use the + :py:meth:`~PIL.Image.Image.point` method. + + When converting from "RGBA" to "P" without a ``matrix`` argument, + this passes the operation to :py:meth:`~PIL.Image.Image.quantize`, + and ``dither`` and ``palette`` are ignored. + + When converting from "PA", if an "RGBA" palette is present, the alpha + channel from the image will be used instead of the values from the palette. + + :param mode: The requested mode. See: :ref:`concept-modes`. + :param matrix: An optional conversion matrix. If given, this + should be 4- or 12-tuple containing floating point values. + :param dither: Dithering method, used when converting from + mode "RGB" to "P" or from "RGB" or "L" to "1". + Available methods are :data:`Dither.NONE` or :data:`Dither.FLOYDSTEINBERG` + (default). Note that this is not used when ``matrix`` is supplied. + :param palette: Palette to use when converting from mode "RGB" + to "P". Available palettes are :data:`Palette.WEB` or + :data:`Palette.ADAPTIVE`. + :param colors: Number of colors to use for the :data:`Palette.ADAPTIVE` + palette. Defaults to 256. + :rtype: :py:class:`~PIL.Image.Image` + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + self.load() + + has_transparency = "transparency" in self.info + if not mode and self.mode == "P": + # determine default mode + if self.palette: + mode = self.palette.mode + else: + mode = "RGB" + if mode == "RGB" and has_transparency: + mode = "RGBA" + if not mode or (mode == self.mode and not matrix): + return self.copy() + + if matrix: + # matrix conversion + if mode not in ("L", "RGB"): + msg = "illegal conversion" + raise ValueError(msg) + im = self.im.convert_matrix(mode, matrix) + new_im = self._new(im) + if has_transparency and self.im.bands == 3: + transparency = new_im.info["transparency"] + + def convert_transparency( + m: tuple[float, ...], v: tuple[int, int, int] + ) -> int: + value = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3] * 0.5 + return max(0, min(255, int(value))) + + if mode == "L": + transparency = convert_transparency(matrix, transparency) + elif len(mode) == 3: + transparency = tuple( + convert_transparency(matrix[i * 4 : i * 4 + 4], transparency) + for i in range(len(transparency)) + ) + new_im.info["transparency"] = transparency + return new_im + + if self.mode == "RGBA": + if mode == "P": + return self.quantize(colors) + elif mode == "PA": + r, g, b, a = self.split() + rgb = merge("RGB", (r, g, b)) + p = rgb.quantize(colors) + return merge("PA", (p, a)) + + trns = None + delete_trns = False + # transparency handling + if has_transparency: + if (self.mode in ("1", "L", "I", "I;16") and mode in ("LA", "RGBA")) or ( + self.mode == "RGB" and mode in ("La", "LA", "RGBa", "RGBA") + ): + # Use transparent conversion to promote from transparent + # color to an alpha channel. + new_im = self._new( + self.im.convert_transparent(mode, self.info["transparency"]) + ) + del new_im.info["transparency"] + return new_im + elif self.mode in ("L", "RGB", "P") and mode in ("L", "RGB", "P"): + t = self.info["transparency"] + if isinstance(t, bytes): + # Dragons. This can't be represented by a single color + warnings.warn( + "Palette images with Transparency expressed in bytes should be " + "converted to RGBA images" + ) + delete_trns = True + else: + # get the new transparency color. + # use existing conversions + trns_im = new(self.mode, (1, 1)) + if self.mode == "P": + assert self.palette is not None + trns_im.putpalette(self.palette, self.palette.mode) + if isinstance(t, tuple): + err = "Couldn't allocate a palette color for transparency" + assert trns_im.palette is not None + try: + t = trns_im.palette.getcolor(t, self) + except ValueError as e: + if str(e) == "cannot allocate more than 256 colors": + # If all 256 colors are in use, + # then there is no need for transparency + t = None + else: + raise ValueError(err) from e + if t is None: + trns = None + else: + trns_im.putpixel((0, 0), t) + + if mode in ("L", "RGB"): + trns_im = trns_im.convert(mode) + else: + # can't just retrieve the palette number, got to do it + # after quantization. + trns_im = trns_im.convert("RGB") + trns = trns_im.getpixel((0, 0)) + + elif self.mode == "P" and mode in ("LA", "PA", "RGBA"): + t = self.info["transparency"] + delete_trns = True + + if isinstance(t, bytes): + self.im.putpalettealphas(t) + elif isinstance(t, int): + self.im.putpalettealpha(t, 0) + else: + msg = "Transparency for P mode should be bytes or int" + raise ValueError(msg) + + if mode == "P" and palette == Palette.ADAPTIVE: + im = self.im.quantize(colors) + new_im = self._new(im) + from . import ImagePalette + + new_im.palette = ImagePalette.ImagePalette( + "RGB", new_im.im.getpalette("RGB") + ) + if delete_trns: + # This could possibly happen if we requantize to fewer colors. + # The transparency would be totally off in that case. + del new_im.info["transparency"] + if trns is not None: + try: + new_im.info["transparency"] = new_im.palette.getcolor( + cast(tuple[int, ...], trns), # trns was converted to RGB + new_im, + ) + except Exception: + # if we can't make a transparent color, don't leave the old + # transparency hanging around to mess us up. + del new_im.info["transparency"] + warnings.warn("Couldn't allocate palette entry for transparency") + return new_im + + if "LAB" in (self.mode, mode): + im = self + if mode == "LAB": + if im.mode not in ("RGB", "RGBA", "RGBX"): + im = im.convert("RGBA") + other_mode = im.mode + else: + other_mode = mode + if other_mode in ("RGB", "RGBA", "RGBX"): + from . import ImageCms + + srgb = ImageCms.createProfile("sRGB") + lab = ImageCms.createProfile("LAB") + profiles = [lab, srgb] if im.mode == "LAB" else [srgb, lab] + transform = ImageCms.buildTransform( + profiles[0], profiles[1], im.mode, mode + ) + return transform.apply(im) + + # colorspace conversion + if dither is None: + dither = Dither.FLOYDSTEINBERG + + try: + im = self.im.convert(mode, dither) + except ValueError: + try: + # normalize source image and try again + modebase = getmodebase(self.mode) + if modebase == self.mode: + raise + im = self.im.convert(modebase) + im = im.convert(mode, dither) + except KeyError as e: + msg = "illegal conversion" + raise ValueError(msg) from e + + new_im = self._new(im) + if mode in ("P", "PA") and palette != Palette.ADAPTIVE: + from . import ImagePalette + + new_im.palette = ImagePalette.ImagePalette("RGB", im.getpalette("RGB")) + if delete_trns: + # crash fail if we leave a bytes transparency in an rgb/l mode. + del new_im.info["transparency"] + if trns is not None: + if new_im.mode == "P" and new_im.palette: + try: + new_im.info["transparency"] = new_im.palette.getcolor( + cast(tuple[int, ...], trns), new_im # trns was converted to RGB + ) + except ValueError as e: + del new_im.info["transparency"] + if str(e) != "cannot allocate more than 256 colors": + # If all 256 colors are in use, + # then there is no need for transparency + warnings.warn( + "Couldn't allocate palette entry for transparency" + ) + else: + new_im.info["transparency"] = trns + return new_im + + def quantize( + self, + colors: int = 256, + method: int | None = None, + kmeans: int = 0, + palette: Image | None = None, + dither: Dither = Dither.FLOYDSTEINBERG, + ) -> Image: + """ + Convert the image to 'P' mode with the specified number + of colors. + + :param colors: The desired number of colors, <= 256 + :param method: :data:`Quantize.MEDIANCUT` (median cut), + :data:`Quantize.MAXCOVERAGE` (maximum coverage), + :data:`Quantize.FASTOCTREE` (fast octree), + :data:`Quantize.LIBIMAGEQUANT` (libimagequant; check support + using :py:func:`PIL.features.check_feature` with + ``feature="libimagequant"``). + + By default, :data:`Quantize.MEDIANCUT` will be used. + + The exception to this is RGBA images. :data:`Quantize.MEDIANCUT` + and :data:`Quantize.MAXCOVERAGE` do not support RGBA images, so + :data:`Quantize.FASTOCTREE` is used by default instead. + :param kmeans: Integer greater than or equal to zero. + :param palette: Quantize to the palette of given + :py:class:`PIL.Image.Image`. + :param dither: Dithering method, used when converting from + mode "RGB" to "P" or from "RGB" or "L" to "1". + Available methods are :data:`Dither.NONE` or :data:`Dither.FLOYDSTEINBERG` + (default). + :returns: A new image + """ + + self.load() + + if method is None: + # defaults: + method = Quantize.MEDIANCUT + if self.mode == "RGBA": + method = Quantize.FASTOCTREE + + if self.mode == "RGBA" and method not in ( + Quantize.FASTOCTREE, + Quantize.LIBIMAGEQUANT, + ): + # Caller specified an invalid mode. + msg = ( + "Fast Octree (method == 2) and libimagequant (method == 3) " + "are the only valid methods for quantizing RGBA images" + ) + raise ValueError(msg) + + if palette: + # use palette from reference image + palette.load() + if palette.mode != "P": + msg = "bad mode for palette image" + raise ValueError(msg) + if self.mode not in {"RGB", "L"}: + msg = "only RGB or L mode images can be quantized to a palette" + raise ValueError(msg) + im = self.im.convert("P", dither, palette.im) + new_im = self._new(im) + assert palette.palette is not None + new_im.palette = palette.palette.copy() + return new_im + + if kmeans < 0: + msg = "kmeans must not be negative" + raise ValueError(msg) + + im = self._new(self.im.quantize(colors, method, kmeans)) + + from . import ImagePalette + + mode = im.im.getpalettemode() + palette_data = im.im.getpalette(mode, mode)[: colors * len(mode)] + im.palette = ImagePalette.ImagePalette(mode, palette_data) + + return im + + def copy(self) -> Image: + """ + Copies this image. Use this method if you wish to paste things + into an image, but still retain the original. + + :rtype: :py:class:`~PIL.Image.Image` + :returns: An :py:class:`~PIL.Image.Image` object. + """ + self.load() + return self._new(self.im.copy()) + + __copy__ = copy + + def crop(self, box: tuple[float, float, float, float] | None = None) -> Image: + """ + Returns a rectangular region from this image. The box is a + 4-tuple defining the left, upper, right, and lower pixel + coordinate. See :ref:`coordinate-system`. + + Note: Prior to Pillow 3.4.0, this was a lazy operation. + + :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. + :rtype: :py:class:`~PIL.Image.Image` + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if box is None: + return self.copy() + + if box[2] < box[0]: + msg = "Coordinate 'right' is less than 'left'" + raise ValueError(msg) + elif box[3] < box[1]: + msg = "Coordinate 'lower' is less than 'upper'" + raise ValueError(msg) + + self.load() + return self._new(self._crop(self.im, box)) + + def _crop( + self, im: core.ImagingCore, box: tuple[float, float, float, float] + ) -> core.ImagingCore: + """ + Returns a rectangular region from the core image object im. + + This is equivalent to calling im.crop((x0, y0, x1, y1)), but + includes additional sanity checks. + + :param im: a core image object + :param box: The crop rectangle, as a (left, upper, right, lower)-tuple. + :returns: A core image object. + """ + + x0, y0, x1, y1 = map(int, map(round, box)) + + absolute_values = (abs(x1 - x0), abs(y1 - y0)) + + _decompression_bomb_check(absolute_values) + + return im.crop((x0, y0, x1, y1)) + + def draft( + self, mode: str | None, size: tuple[int, int] | None + ) -> tuple[str, tuple[int, int, float, float]] | None: + """ + Configures the image file loader so it returns a version of the + image that as closely as possible matches the given mode and + size. For example, you can use this method to convert a color + JPEG to grayscale while loading it. + + If any changes are made, returns a tuple with the chosen ``mode`` and + ``box`` with coordinates of the original image within the altered one. + + Note that this method modifies the :py:class:`~PIL.Image.Image` object + in place. If the image has already been loaded, this method has no + effect. + + Note: This method is not implemented for most images. It is + currently implemented only for JPEG and MPO images. + + :param mode: The requested mode. + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + """ + pass + + def filter(self, filter: ImageFilter.Filter | type[ImageFilter.Filter]) -> Image: + """ + Filters this image using the given filter. For a list of + available filters, see the :py:mod:`~PIL.ImageFilter` module. + + :param filter: Filter kernel. + :returns: An :py:class:`~PIL.Image.Image` object.""" + + from . import ImageFilter + + self.load() + + if callable(filter): + filter = filter() + if not hasattr(filter, "filter"): + msg = "filter argument should be ImageFilter.Filter instance or class" + raise TypeError(msg) + + multiband = isinstance(filter, ImageFilter.MultibandFilter) + if self.im.bands == 1 or multiband: + return self._new(filter.filter(self.im)) + + ims = [ + self._new(filter.filter(self.im.getband(c))) for c in range(self.im.bands) + ] + return merge(self.mode, ims) + + def getbands(self) -> tuple[str, ...]: + """ + Returns a tuple containing the name of each band in this image. + For example, ``getbands`` on an RGB image returns ("R", "G", "B"). + + :returns: A tuple containing band names. + :rtype: tuple + """ + return ImageMode.getmode(self.mode).bands + + def getbbox(self, *, alpha_only: bool = True) -> tuple[int, int, int, int] | None: + """ + Calculates the bounding box of the non-zero regions in the + image. + + :param alpha_only: Optional flag, defaulting to ``True``. + If ``True`` and the image has an alpha channel, trim transparent pixels. + Otherwise, trim pixels when all channels are zero. + Keyword-only argument. + :returns: The bounding box is returned as a 4-tuple defining the + left, upper, right, and lower pixel coordinate. See + :ref:`coordinate-system`. If the image is completely empty, this + method returns None. + + """ + + self.load() + return self.im.getbbox(alpha_only) + + def getcolors( + self, maxcolors: int = 256 + ) -> list[tuple[int, tuple[int, ...]]] | list[tuple[int, float]] | None: + """ + Returns a list of colors used in this image. + + The colors will be in the image's mode. For example, an RGB image will + return a tuple of (red, green, blue) color values, and a P image will + return the index of the color in the palette. + + :param maxcolors: Maximum number of colors. If this number is + exceeded, this method returns None. The default limit is + 256 colors. + :returns: An unsorted list of (count, pixel) values. + """ + + self.load() + if self.mode in ("1", "L", "P"): + h = self.im.histogram() + out: list[tuple[int, float]] = [(h[i], i) for i in range(256) if h[i]] + if len(out) > maxcolors: + return None + return out + return self.im.getcolors(maxcolors) + + def getdata(self, band: int | None = None) -> core.ImagingCore: + """ + Returns the contents of this image as a sequence object + containing pixel values. The sequence object is flattened, so + that values for line one follow directly after the values of + line zero, and so on. + + Note that the sequence object returned by this method is an + internal PIL data type, which only supports certain sequence + operations. To convert it to an ordinary sequence (e.g. for + printing), use ``list(im.getdata())``. + + :param band: What band to return. The default is to return + all bands. To return a single band, pass in the index + value (e.g. 0 to get the "R" band from an "RGB" image). + :returns: A sequence-like object. + """ + deprecate("Image.Image.getdata", 14, "get_flattened_data") + + self.load() + if band is not None: + return self.im.getband(band) + return self.im # could be abused + + def get_flattened_data( + self, band: int | None = None + ) -> tuple[tuple[int, ...], ...] | tuple[float, ...]: + """ + Returns the contents of this image as a tuple containing pixel values. + The sequence object is flattened, so that values for line one follow + directly after the values of line zero, and so on. + + :param band: What band to return. The default is to return + all bands. To return a single band, pass in the index + value (e.g. 0 to get the "R" band from an "RGB" image). + :returns: A tuple containing pixel values. + """ + self.load() + if band is not None: + return tuple(self.im.getband(band)) + return tuple(self.im) + + def getextrema(self) -> tuple[float, float] | tuple[tuple[int, int], ...]: + """ + Gets the minimum and maximum pixel values for each band in + the image. + + :returns: For a single-band image, a 2-tuple containing the + minimum and maximum pixel value. For a multi-band image, + a tuple containing one 2-tuple for each band. + """ + + self.load() + if self.im.bands > 1: + return tuple(self.im.getband(i).getextrema() for i in range(self.im.bands)) + return self.im.getextrema() + + def getxmp(self) -> dict[str, Any]: + """ + Returns a dictionary containing the XMP tags. + Requires defusedxml to be installed. + + :returns: XMP tags in a dictionary. + """ + + def get_name(tag: str) -> str: + return re.sub("^{[^}]+}", "", tag) + + def get_value(element: Element) -> str | dict[str, Any] | None: + value: dict[str, Any] = {get_name(k): v for k, v in element.attrib.items()} + children = list(element) + if children: + for child in children: + name = get_name(child.tag) + child_value = get_value(child) + if name in value: + if not isinstance(value[name], list): + value[name] = [value[name]] + value[name].append(child_value) + else: + value[name] = child_value + elif value: + if element.text: + value["text"] = element.text + else: + return element.text + return value + + if ElementTree is None: + warnings.warn("XMP data cannot be read without defusedxml dependency") + return {} + if "xmp" not in self.info: + return {} + root = ElementTree.fromstring(self.info["xmp"].rstrip(b"\x00 ")) + return {get_name(root.tag): get_value(root)} + + def getexif(self) -> Exif: + """ + Gets EXIF data from the image. + + :returns: an :py:class:`~PIL.Image.Exif` object. + """ + if self._exif is None: + self._exif = Exif() + elif self._exif._loaded: + return self._exif + self._exif._loaded = True + + exif_info = self.info.get("exif") + if exif_info is None: + if "Raw profile type exif" in self.info: + exif_info = bytes.fromhex( + "".join(self.info["Raw profile type exif"].split("\n")[3:]) + ) + elif hasattr(self, "tag_v2"): + from . import TiffImagePlugin + + assert isinstance(self, TiffImagePlugin.TiffImageFile) + self._exif.bigtiff = self.tag_v2._bigtiff + self._exif.endian = self.tag_v2._endian + + assert self.fp is not None + self._exif.load_from_fp(self.fp, self.tag_v2._offset) + if exif_info is not None: + self._exif.load(exif_info) + + # XMP tags + if ExifTags.Base.Orientation not in self._exif: + xmp_tags = self.info.get("XML:com.adobe.xmp") + pattern: str | bytes = r'tiff:Orientation(="|>)([0-9])' + if not xmp_tags and (xmp_tags := self.info.get("xmp")): + pattern = rb'tiff:Orientation(="|>)([0-9])' + if xmp_tags: + match = re.search(pattern, xmp_tags) + if match: + self._exif[ExifTags.Base.Orientation] = int(match[2]) + + return self._exif + + def _reload_exif(self) -> None: + if self._exif is None or not self._exif._loaded: + return + self._exif._loaded = False + self.getexif() + + def get_child_images(self) -> list[ImageFile.ImageFile]: + from . import ImageFile + + deprecate("Image.Image.get_child_images", 13) + return ImageFile.ImageFile.get_child_images(self) # type: ignore[arg-type] + + def getim(self) -> CapsuleType: + """ + Returns a capsule that points to the internal image memory. + + :returns: A capsule object. + """ + + self.load() + return self.im.ptr + + def getpalette(self, rawmode: str | None = "RGB") -> list[int] | None: + """ + Returns the image palette as a list. + + :param rawmode: The mode in which to return the palette. ``None`` will + return the palette in its current mode. + + .. versionadded:: 9.1.0 + + :returns: A list of color values [r, g, b, ...], or None if the + image has no palette. + """ + + self.load() + try: + mode = self.im.getpalettemode() + except ValueError: + return None # no palette + if rawmode is None: + rawmode = mode + return list(self.im.getpalette(mode, rawmode)) + + @property + def has_transparency_data(self) -> bool: + """ + Determine if an image has transparency data, whether in the form of an + alpha channel, a palette with an alpha channel, or a "transparency" key + in the info dictionary. + + Note the image might still appear solid, if all of the values shown + within are opaque. + + :returns: A boolean. + """ + if ( + self.mode in ("LA", "La", "PA", "RGBA", "RGBa") + or "transparency" in self.info + ): + return True + if self.mode == "P": + assert self.palette is not None + return self.palette.mode.endswith("A") + return False + + def apply_transparency(self) -> None: + """ + If a P mode image has a "transparency" key in the info dictionary, + remove the key and instead apply the transparency to the palette. + Otherwise, the image is unchanged. + """ + if self.mode != "P" or "transparency" not in self.info: + return + + from . import ImagePalette + + palette = self.getpalette("RGBA") + assert palette is not None + transparency = self.info["transparency"] + if isinstance(transparency, bytes): + for i, alpha in enumerate(transparency): + palette[i * 4 + 3] = alpha + else: + palette[transparency * 4 + 3] = 0 + self.palette = ImagePalette.ImagePalette("RGBA", bytes(palette)) + self.palette.dirty = 1 + + del self.info["transparency"] + + def getpixel( + self, xy: tuple[int, int] | list[int] + ) -> float | tuple[int, ...] | None: + """ + Returns the pixel value at a given position. + + :param xy: The coordinate, given as (x, y). See + :ref:`coordinate-system`. + :returns: The pixel value. If the image is a multi-layer image, + this method returns a tuple. + """ + + self.load() + return self.im.getpixel(tuple(xy)) + + def getprojection(self) -> tuple[list[int], list[int]]: + """ + Get projection to x and y axes + + :returns: Two sequences, indicating where there are non-zero + pixels along the X-axis and the Y-axis, respectively. + """ + + self.load() + x, y = self.im.getprojection() + return list(x), list(y) + + def histogram( + self, mask: Image | None = None, extrema: tuple[float, float] | None = None + ) -> list[int]: + """ + Returns a histogram for the image. The histogram is returned as a + list of pixel counts, one for each pixel value in the source + image. Counts are grouped into 256 bins for each band, even if + the image has more than 8 bits per band. If the image has more + than one band, the histograms for all bands are concatenated (for + example, the histogram for an "RGB" image contains 768 values). + + A bilevel image (mode "1") is treated as a grayscale ("L") image + by this method. + + If a mask is provided, the method returns a histogram for those + parts of the image where the mask image is non-zero. The mask + image must have the same size as the image, and be either a + bi-level image (mode "1") or a grayscale image ("L"). + + :param mask: An optional mask. + :param extrema: An optional tuple of manually-specified extrema. + :returns: A list containing pixel counts. + """ + self.load() + if mask: + mask.load() + return self.im.histogram((0, 0), mask.im) + if self.mode in ("I", "F"): + return self.im.histogram( + extrema if extrema is not None else self.getextrema() + ) + return self.im.histogram() + + def entropy( + self, mask: Image | None = None, extrema: tuple[float, float] | None = None + ) -> float: + """ + Calculates and returns the entropy for the image. + + A bilevel image (mode "1") is treated as a grayscale ("L") + image by this method. + + If a mask is provided, the method employs the histogram for + those parts of the image where the mask image is non-zero. + The mask image must have the same size as the image, and be + either a bi-level image (mode "1") or a grayscale image ("L"). + + :param mask: An optional mask. + :param extrema: An optional tuple of manually-specified extrema. + :returns: A float value representing the image entropy + """ + self.load() + if mask: + mask.load() + return self.im.entropy((0, 0), mask.im) + if self.mode in ("I", "F"): + return self.im.entropy( + extrema if extrema is not None else self.getextrema() + ) + return self.im.entropy() + + def paste( + self, + im: Image | str | float | tuple[float, ...], + box: Image | tuple[int, int, int, int] | tuple[int, int] | None = None, + mask: Image | None = None, + ) -> None: + """ + Pastes another image into this image. The box argument is either + a 2-tuple giving the upper left corner, a 4-tuple defining the + left, upper, right, and lower pixel coordinate, or None (same as + (0, 0)). See :ref:`coordinate-system`. If a 4-tuple is given, the size + of the pasted image must match the size of the region. + + If the modes don't match, the pasted image is converted to the mode of + this image (see the :py:meth:`~PIL.Image.Image.convert` method for + details). + + Instead of an image, the source can be a integer or tuple + containing pixel values. The method then fills the region + with the given color. When creating RGB images, you can + also use color strings as supported by the ImageColor module. See + :ref:`colors` for more information. + + If a mask is given, this method updates only the regions + indicated by the mask. You can use either "1", "L", "LA", "RGBA" + or "RGBa" images (if present, the alpha band is used as mask). + Where the mask is 255, the given image is copied as is. Where + the mask is 0, the current value is preserved. Intermediate + values will mix the two images together, including their alpha + channels if they have them. + + See :py:meth:`~PIL.Image.Image.alpha_composite` if you want to + combine images with respect to their alpha channels. + + :param im: Source image or pixel value (integer, float or tuple). + :param box: An optional 4-tuple giving the region to paste into. + If a 2-tuple is used instead, it's treated as the upper left + corner. If omitted or None, the source is pasted into the + upper left corner. + + If an image is given as the second argument and there is no + third, the box defaults to (0, 0), and the second argument + is interpreted as a mask image. + :param mask: An optional mask image. + """ + + if isinstance(box, Image): + if mask is not None: + msg = "If using second argument as mask, third argument must be None" + raise ValueError(msg) + # abbreviated paste(im, mask) syntax + mask = box + box = None + + if box is None: + box = (0, 0) + + if len(box) == 2: + # upper left corner given; get size from image or mask + if isinstance(im, Image): + size = im.size + elif isinstance(mask, Image): + size = mask.size + else: + # FIXME: use self.size here? + msg = "cannot determine region size; use 4-item box" + raise ValueError(msg) + box += (box[0] + size[0], box[1] + size[1]) + + source: core.ImagingCore | str | float | tuple[float, ...] + if isinstance(im, str): + from . import ImageColor + + source = ImageColor.getcolor(im, self.mode) + elif isinstance(im, Image): + im.load() + if self.mode != im.mode: + if self.mode != "RGB" or im.mode not in ("LA", "RGBA", "RGBa"): + # should use an adapter for this! + im = im.convert(self.mode) + source = im.im + else: + source = im + + self._ensure_mutable() + + if mask: + mask.load() + self.im.paste(source, box, mask.im) + else: + self.im.paste(source, box) + + def alpha_composite( + self, im: Image, dest: Sequence[int] = (0, 0), source: Sequence[int] = (0, 0) + ) -> None: + """'In-place' analog of Image.alpha_composite. Composites an image + onto this image. + + :param im: image to composite over this one + :param dest: Optional 2 tuple (left, top) specifying the upper + left corner in this (destination) image. + :param source: Optional 2 (left, top) tuple for the upper left + corner in the overlay source image, or 4 tuple (left, top, right, + bottom) for the bounds of the source rectangle + + Performance Note: Not currently implemented in-place in the core layer. + """ + + if not isinstance(source, (list, tuple)): + msg = "Source must be a list or tuple" + raise ValueError(msg) + if not isinstance(dest, (list, tuple)): + msg = "Destination must be a list or tuple" + raise ValueError(msg) + + if len(source) == 4: + overlay_crop_box = tuple(source) + elif len(source) == 2: + overlay_crop_box = tuple(source) + im.size + else: + msg = "Source must be a sequence of length 2 or 4" + raise ValueError(msg) + + if not len(dest) == 2: + msg = "Destination must be a sequence of length 2" + raise ValueError(msg) + if min(source) < 0: + msg = "Source must be non-negative" + raise ValueError(msg) + + # over image, crop if it's not the whole image. + if overlay_crop_box == (0, 0) + im.size: + overlay = im + else: + overlay = im.crop(overlay_crop_box) + + # target for the paste + box = tuple(dest) + (dest[0] + overlay.width, dest[1] + overlay.height) + + # destination image. don't copy if we're using the whole image. + if box == (0, 0) + self.size: + background = self + else: + background = self.crop(box) + + result = alpha_composite(background, overlay) + self.paste(result, box) + + def point( + self, + lut: ( + Sequence[float] + | NumpyArray + | Callable[[int], float] + | Callable[[ImagePointTransform], ImagePointTransform | float] + | ImagePointHandler + ), + mode: str | None = None, + ) -> Image: + """ + Maps this image through a lookup table or function. + + :param lut: A lookup table, containing 256 (or 65536 if + self.mode=="I" and mode == "L") values per band in the + image. A function can be used instead, it should take a + single argument. The function is called once for each + possible pixel value, and the resulting table is applied to + all bands of the image. + + It may also be an :py:class:`~PIL.Image.ImagePointHandler` + object:: + + class Example(Image.ImagePointHandler): + def point(self, im: Image) -> Image: + # Return result + :param mode: Output mode (default is same as input). This can only be used if + the source image has mode "L" or "P", and the output has mode "1" or the + source image mode is "I" and the output mode is "L". + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + self.load() + + if isinstance(lut, ImagePointHandler): + return lut.point(self) + + if callable(lut): + # if it isn't a list, it should be a function + if self.mode in ("I", "I;16", "F"): + # check if the function can be used with point_transform + # UNDONE wiredfool -- I think this prevents us from ever doing + # a gamma function point transform on > 8bit images. + scale, offset = _getscaleoffset(lut) # type: ignore[arg-type] + return self._new(self.im.point_transform(scale, offset)) + # for other modes, convert the function to a table + flatLut = [lut(i) for i in range(256)] * self.im.bands # type: ignore[arg-type] + else: + flatLut = lut + + if self.mode == "F": + # FIXME: _imaging returns a confusing error message for this case + msg = "point operation not supported for this mode" + raise ValueError(msg) + + if mode != "F": + flatLut = [round(i) for i in flatLut] + return self._new(self.im.point(flatLut, mode)) + + def putalpha(self, alpha: Image | int) -> None: + """ + Adds or replaces the alpha layer in this image. If the image + does not have an alpha layer, it's converted to "LA" or "RGBA". + The new layer must be either "L" or "1". + + :param alpha: The new alpha layer. This can either be an "L" or "1" + image having the same size as this image, or an integer. + """ + + self._ensure_mutable() + + if self.mode not in ("LA", "PA", "RGBA"): + # attempt to promote self to a matching alpha mode + try: + mode = getmodebase(self.mode) + "A" + try: + self.im.setmode(mode) + except (AttributeError, ValueError) as e: + # do things the hard way + im = self.im.convert(mode) + if im.mode not in ("LA", "PA", "RGBA"): + msg = "alpha channel could not be added" + raise ValueError(msg) from e # sanity check + self.im = im + self._mode = self.im.mode + except KeyError as e: + msg = "illegal image mode" + raise ValueError(msg) from e + + if self.mode in ("LA", "PA"): + band = 1 + else: + band = 3 + + if isinstance(alpha, Image): + # alpha layer + if alpha.mode not in ("1", "L"): + msg = "illegal image mode" + raise ValueError(msg) + alpha.load() + if alpha.mode == "1": + alpha = alpha.convert("L") + else: + # constant alpha + try: + self.im.fillband(band, alpha) + except (AttributeError, ValueError): + # do things the hard way + alpha = new("L", self.size, alpha) + else: + return + + self.im.putband(alpha.im, band) + + def putdata( + self, + data: Sequence[float] | Sequence[Sequence[int]] | core.ImagingCore | NumpyArray, + scale: float = 1.0, + offset: float = 0.0, + ) -> None: + """ + Copies pixel data from a flattened sequence object into the image. The + values should start at the upper left corner (0, 0), continue to the + end of the line, followed directly by the first value of the second + line, and so on. Data will be read until either the image or the + sequence ends. The scale and offset values are used to adjust the + sequence values: **pixel = value*scale + offset**. + + :param data: A flattened sequence object. See :ref:`colors` for more + information about values. + :param scale: An optional scale value. The default is 1.0. + :param offset: An optional offset value. The default is 0.0. + """ + + self._ensure_mutable() + + self.im.putdata(data, scale, offset) + + def putpalette( + self, + data: ImagePalette.ImagePalette | bytes | Sequence[int], + rawmode: str = "RGB", + ) -> None: + """ + Attaches a palette to this image. The image must be a "P", "PA", "L" + or "LA" image. + + The palette sequence must contain at most 256 colors, made up of one + integer value for each channel in the raw mode. + For example, if the raw mode is "RGB", then it can contain at most 768 + values, made up of red, green and blue values for the corresponding pixel + index in the 256 colors. + If the raw mode is "RGBA", then it can contain at most 1024 values, + containing red, green, blue and alpha values. + + Alternatively, an 8-bit string may be used instead of an integer sequence. + + :param data: A palette sequence (either a list or a string). + :param rawmode: The raw mode of the palette. Either "RGB", "RGBA", "CMYK", or a + mode that can be transformed to one of those modes (e.g. "R", "RGBA;L"). + """ + from . import ImagePalette + + if self.mode not in ("L", "LA", "P", "PA"): + msg = "illegal image mode" + raise ValueError(msg) + if isinstance(data, ImagePalette.ImagePalette): + if data.rawmode is not None: + palette = ImagePalette.raw(data.rawmode, data.palette) + else: + palette = ImagePalette.ImagePalette(palette=data.palette) + palette.dirty = 1 + else: + if not isinstance(data, bytes): + data = bytes(data) + palette = ImagePalette.raw(rawmode, data) + self._mode = "PA" if "A" in self.mode else "P" + self.palette = palette + if rawmode.startswith("CMYK"): + self.palette.mode = "CMYK" + elif "A" in rawmode: + self.palette.mode = "RGBA" + else: + self.palette.mode = "RGB" + self.load() # install new palette + + def putpixel( + self, xy: tuple[int, int], value: float | tuple[int, ...] | list[int] + ) -> None: + """ + Modifies the pixel at the given position. The color is given as + a single numerical value for single-band images, and a tuple for + multi-band images. In addition to this, RGB and RGBA tuples are + accepted for P and PA images. See :ref:`colors` for more information. + + Note that this method is relatively slow. For more extensive changes, + use :py:meth:`~PIL.Image.Image.paste` or the :py:mod:`~PIL.ImageDraw` + module instead. + + See: + + * :py:meth:`~PIL.Image.Image.paste` + * :py:meth:`~PIL.Image.Image.putdata` + * :py:mod:`~PIL.ImageDraw` + + :param xy: The pixel coordinate, given as (x, y). See + :ref:`coordinate-system`. + :param value: The pixel value. + """ + + self._ensure_mutable() + + if ( + self.mode in ("P", "PA") + and isinstance(value, (list, tuple)) + and len(value) in [3, 4] + ): + # RGB or RGBA value for a P or PA image + if self.mode == "PA": + alpha = value[3] if len(value) == 4 else 255 + value = value[:3] + assert self.palette is not None + palette_index = self.palette.getcolor(tuple(value), self) + value = (palette_index, alpha) if self.mode == "PA" else palette_index + return self.im.putpixel(xy, value) + + def remap_palette( + self, dest_map: list[int], source_palette: bytes | bytearray | None = None + ) -> Image: + """ + Rewrites the image to reorder the palette. + + :param dest_map: A list of indexes into the original palette. + e.g. ``[1,0]`` would swap a two item palette, and ``list(range(256))`` + is the identity transform. + :param source_palette: Bytes or None. + :returns: An :py:class:`~PIL.Image.Image` object. + + """ + from . import ImagePalette + + if self.mode not in ("L", "P"): + msg = "illegal image mode" + raise ValueError(msg) + + bands = 3 + palette_mode = "RGB" + if source_palette is None: + if self.mode == "P": + self.load() + palette_mode = self.im.getpalettemode() + if palette_mode == "RGBA": + bands = 4 + source_palette = self.im.getpalette(palette_mode, palette_mode) + else: # L-mode + source_palette = bytearray(i // 3 for i in range(768)) + elif len(source_palette) > 768: + bands = 4 + palette_mode = "RGBA" + + palette_bytes = b"" + new_positions = [0] * 256 + + # pick only the used colors from the palette + for i, oldPosition in enumerate(dest_map): + palette_bytes += source_palette[ + oldPosition * bands : oldPosition * bands + bands + ] + new_positions[oldPosition] = i + + # replace the palette color id of all pixel with the new id + + # Palette images are [0..255], mapped through a 1 or 3 + # byte/color map. We need to remap the whole image + # from palette 1 to palette 2. New_positions is + # an array of indexes into palette 1. Palette 2 is + # palette 1 with any holes removed. + + # We're going to leverage the convert mechanism to use the + # C code to remap the image from palette 1 to palette 2, + # by forcing the source image into 'L' mode and adding a + # mapping 'L' mode palette, then converting back to 'L' + # sans palette thus converting the image bytes, then + # assigning the optimized RGB palette. + + # perf reference, 9500x4000 gif, w/~135 colors + # 14 sec prepatch, 1 sec postpatch with optimization forced. + + mapping_palette = bytearray(new_positions) + + m_im = self.copy() + m_im._mode = "P" + + m_im.palette = ImagePalette.ImagePalette( + palette_mode, palette=mapping_palette * bands + ) + # possibly set palette dirty, then + # m_im.putpalette(mapping_palette, 'L') # converts to 'P' + # or just force it. + # UNDONE -- this is part of the general issue with palettes + m_im.im.putpalette(palette_mode, palette_mode + ";L", m_im.palette.tobytes()) + + m_im = m_im.convert("L") + + m_im.putpalette(palette_bytes, palette_mode) + m_im.palette = ImagePalette.ImagePalette(palette_mode, palette=palette_bytes) + + if "transparency" in self.info: + try: + m_im.info["transparency"] = dest_map.index(self.info["transparency"]) + except ValueError: + if "transparency" in m_im.info: + del m_im.info["transparency"] + + return m_im + + def _get_safe_box( + self, + size: tuple[int, int], + resample: Resampling, + box: tuple[float, float, float, float], + ) -> tuple[int, int, int, int]: + """Expands the box so it includes adjacent pixels + that may be used by resampling with the given resampling filter. + """ + filter_support = _filters_support[resample] - 0.5 + scale_x = (box[2] - box[0]) / size[0] + scale_y = (box[3] - box[1]) / size[1] + support_x = filter_support * scale_x + support_y = filter_support * scale_y + + return ( + max(0, int(box[0] - support_x)), + max(0, int(box[1] - support_y)), + min(self.size[0], math.ceil(box[2] + support_x)), + min(self.size[1], math.ceil(box[3] + support_y)), + ) + + def resize( + self, + size: tuple[int, int] | list[int] | NumpyArray, + resample: int | None = None, + box: tuple[float, float, float, float] | None = None, + reducing_gap: float | None = None, + ) -> Image: + """ + Returns a resized copy of this image. + + :param size: The requested size in pixels, as a tuple or array: + (width, height). + :param resample: An optional resampling filter. This can be + one of :py:data:`Resampling.NEAREST`, :py:data:`Resampling.BOX`, + :py:data:`Resampling.BILINEAR`, :py:data:`Resampling.HAMMING`, + :py:data:`Resampling.BICUBIC` or :py:data:`Resampling.LANCZOS`. + If the image has mode "1" or "P", it is always set to + :py:data:`Resampling.NEAREST`. Otherwise, the default filter is + :py:data:`Resampling.BICUBIC`. See: :ref:`concept-filters`. + :param box: An optional 4-tuple of floats providing + the source image region to be scaled. + The values must be within (0, 0, width, height) rectangle. + If omitted or None, the entire source is used. + :param reducing_gap: Apply optimization by resizing the image + in two steps. First, reducing the image by integer times + using :py:meth:`~PIL.Image.Image.reduce`. + Second, resizing using regular resampling. The last step + changes size no less than by ``reducing_gap`` times. + ``reducing_gap`` may be None (no first step is performed) + or should be greater than 1.0. The bigger ``reducing_gap``, + the closer the result to the fair resampling. + The smaller ``reducing_gap``, the faster resizing. + With ``reducing_gap`` greater or equal to 3.0, the result is + indistinguishable from fair resampling in most cases. + The default value is None (no optimization). + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if resample is None: + resample = Resampling.BICUBIC + elif resample not in ( + Resampling.NEAREST, + Resampling.BILINEAR, + Resampling.BICUBIC, + Resampling.LANCZOS, + Resampling.BOX, + Resampling.HAMMING, + ): + msg = f"Unknown resampling filter ({resample})." + + filters = [ + f"{filter[1]} ({filter[0]})" + for filter in ( + (Resampling.NEAREST, "Image.Resampling.NEAREST"), + (Resampling.LANCZOS, "Image.Resampling.LANCZOS"), + (Resampling.BILINEAR, "Image.Resampling.BILINEAR"), + (Resampling.BICUBIC, "Image.Resampling.BICUBIC"), + (Resampling.BOX, "Image.Resampling.BOX"), + (Resampling.HAMMING, "Image.Resampling.HAMMING"), + ) + ] + msg += f" Use {', '.join(filters[:-1])} or {filters[-1]}" + raise ValueError(msg) + + if reducing_gap is not None and reducing_gap < 1.0: + msg = "reducing_gap must be 1.0 or greater" + raise ValueError(msg) + + if box is None: + box = (0, 0) + self.size + + size = tuple(size) + if self.size == size and box == (0, 0) + self.size: + return self.copy() + + if self.mode in ("1", "P"): + resample = Resampling.NEAREST + + if self.mode in ["LA", "RGBA"] and resample != Resampling.NEAREST: + im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) + im = im.resize(size, resample, box) + return im.convert(self.mode) + + self.load() + + if reducing_gap is not None and resample != Resampling.NEAREST: + factor_x = int((box[2] - box[0]) / size[0] / reducing_gap) or 1 + factor_y = int((box[3] - box[1]) / size[1] / reducing_gap) or 1 + if factor_x > 1 or factor_y > 1: + reduce_box = self._get_safe_box(size, cast(Resampling, resample), box) + factor = (factor_x, factor_y) + self = ( + self.reduce(factor, box=reduce_box) + if callable(self.reduce) + else Image.reduce(self, factor, box=reduce_box) + ) + box = ( + (box[0] - reduce_box[0]) / factor_x, + (box[1] - reduce_box[1]) / factor_y, + (box[2] - reduce_box[0]) / factor_x, + (box[3] - reduce_box[1]) / factor_y, + ) + + if self.size[1] > self.size[0] * 100 and size[1] < self.size[1]: + im = self.im.resize( + (self.size[0], size[1]), resample, (0, box[1], self.size[0], box[3]) + ) + im = im.resize(size, resample, (box[0], 0, box[2], size[1])) + else: + im = self.im.resize(size, resample, box) + return self._new(im) + + def reduce( + self, + factor: int | tuple[int, int], + box: tuple[int, int, int, int] | None = None, + ) -> Image: + """ + Returns a copy of the image reduced ``factor`` times. + If the size of the image is not dividable by ``factor``, + the resulting size will be rounded up. + + :param factor: A greater than 0 integer or tuple of two integers + for width and height separately. + :param box: An optional 4-tuple of ints providing + the source image region to be reduced. + The values must be within ``(0, 0, width, height)`` rectangle. + If omitted or ``None``, the entire source is used. + """ + if not isinstance(factor, (list, tuple)): + factor = (factor, factor) + + if box is None: + box = (0, 0) + self.size + + if factor == (1, 1) and box == (0, 0) + self.size: + return self.copy() + + if self.mode in ["LA", "RGBA"]: + im = self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) + im = im.reduce(factor, box) + return im.convert(self.mode) + + self.load() + + return self._new(self.im.reduce(factor, box)) + + def rotate( + self, + angle: float, + resample: Resampling = Resampling.NEAREST, + expand: int | bool = False, + center: tuple[float, float] | None = None, + translate: tuple[int, int] | None = None, + fillcolor: float | tuple[float, ...] | str | None = None, + ) -> Image: + """ + Returns a rotated copy of this image. This method returns a + copy of this image, rotated the given number of degrees counter + clockwise around its centre. + + :param angle: In degrees counter clockwise. + :param resample: An optional resampling filter. This can be + one of :py:data:`Resampling.NEAREST` (use nearest neighbour), + :py:data:`Resampling.BILINEAR` (linear interpolation in a 2x2 + environment), or :py:data:`Resampling.BICUBIC` (cubic spline + interpolation in a 4x4 environment). If omitted, or if the image has + mode "1" or "P", it is set to :py:data:`Resampling.NEAREST`. + See :ref:`concept-filters`. + :param expand: Optional expansion flag. If true, expands the output + image to make it large enough to hold the entire rotated image. + If false or omitted, make the output image the same size as the + input image. Note that the expand flag assumes rotation around + the center and no translation. + :param center: Optional center of rotation (a 2-tuple). Origin is + the upper left corner. Default is the center of the image. + :param translate: An optional post-rotate translation (a 2-tuple). + :param fillcolor: An optional color for area outside the rotated image. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + angle = angle % 360.0 + + # Fast paths regardless of filter, as long as we're not + # translating or changing the center. + if not (center or translate): + if angle == 0: + return self.copy() + if angle == 180: + return self.transpose(Transpose.ROTATE_180) + if angle in (90, 270) and (expand or self.width == self.height): + return self.transpose( + Transpose.ROTATE_90 if angle == 90 else Transpose.ROTATE_270 + ) + + # Calculate the affine matrix. Note that this is the reverse + # transformation (from destination image to source) because we + # want to interpolate the (discrete) destination pixel from + # the local area around the (floating) source pixel. + + # The matrix we actually want (note that it operates from the right): + # (1, 0, tx) (1, 0, cx) ( cos a, sin a, 0) (1, 0, -cx) + # (0, 1, ty) * (0, 1, cy) * (-sin a, cos a, 0) * (0, 1, -cy) + # (0, 0, 1) (0, 0, 1) ( 0, 0, 1) (0, 0, 1) + + # The reverse matrix is thus: + # (1, 0, cx) ( cos -a, sin -a, 0) (1, 0, -cx) (1, 0, -tx) + # (0, 1, cy) * (-sin -a, cos -a, 0) * (0, 1, -cy) * (0, 1, -ty) + # (0, 0, 1) ( 0, 0, 1) (0, 0, 1) (0, 0, 1) + + # In any case, the final translation may be updated at the end to + # compensate for the expand flag. + + w, h = self.size + + if translate is None: + post_trans = (0, 0) + else: + post_trans = translate + if center is None: + center = (w / 2, h / 2) + + angle = -math.radians(angle) + matrix = [ + round(math.cos(angle), 15), + round(math.sin(angle), 15), + 0.0, + round(-math.sin(angle), 15), + round(math.cos(angle), 15), + 0.0, + ] + + def transform(x: float, y: float, matrix: list[float]) -> tuple[float, float]: + a, b, c, d, e, f = matrix + return a * x + b * y + c, d * x + e * y + f + + matrix[2], matrix[5] = transform( + -center[0] - post_trans[0], -center[1] - post_trans[1], matrix + ) + matrix[2] += center[0] + matrix[5] += center[1] + + if expand: + # calculate output size + xx = [] + yy = [] + for x, y in ((0, 0), (w, 0), (w, h), (0, h)): + transformed_x, transformed_y = transform(x, y, matrix) + xx.append(transformed_x) + yy.append(transformed_y) + nw = math.ceil(max(xx)) - math.floor(min(xx)) + nh = math.ceil(max(yy)) - math.floor(min(yy)) + + # We multiply a translation matrix from the right. Because of its + # special form, this is the same as taking the image of the + # translation vector as new translation vector. + matrix[2], matrix[5] = transform(-(nw - w) / 2.0, -(nh - h) / 2.0, matrix) + w, h = nw, nh + + return self.transform( + (w, h), Transform.AFFINE, matrix, resample, fillcolor=fillcolor + ) + + def save( + self, fp: StrOrBytesPath | IO[bytes], format: str | None = None, **params: Any + ) -> None: + """ + Saves this image under the given filename. If no format is + specified, the format to use is determined from the filename + extension, if possible. + + Keyword options can be used to provide additional instructions + to the writer. If a writer doesn't recognise an option, it is + silently ignored. The available options are described in the + :doc:`image format documentation + <../handbook/image-file-formats>` for each writer. + + You can use a file object instead of a filename. In this case, + you must always specify the format. The file object must + implement the ``seek``, ``tell``, and ``write`` + methods, and be opened in binary mode. + + :param fp: A filename (string), os.PathLike object or file object. + :param format: Optional format override. If omitted, the + format to use is determined from the filename extension. + If a file object was used instead of a filename, this + parameter should always be used. + :param params: Extra parameters to the image writer. These can also be + set on the image itself through ``encoderinfo``. This is useful when + saving multiple images:: + + # Saving XMP data to a single image + from PIL import Image + red = Image.new("RGB", (1, 1), "#f00") + red.save("out.mpo", xmp=b"test") + + # Saving XMP data to the second frame of an image + from PIL import Image + black = Image.new("RGB", (1, 1)) + red = Image.new("RGB", (1, 1), "#f00") + red.encoderinfo = {"xmp": b"test"} + black.save("out.mpo", save_all=True, append_images=[red]) + :returns: None + :exception ValueError: If the output format could not be determined + from the file name. Use the format option to solve this. + :exception OSError: If the file could not be written. The file + may have been created, and may contain partial data. + """ + + filename: str | bytes = "" + open_fp = False + if is_path(fp): + filename = os.fspath(fp) + open_fp = True + elif fp == sys.stdout: + try: + fp = sys.stdout.buffer + except AttributeError: + pass + if not filename and hasattr(fp, "name") and is_path(fp.name): + # only set the name for metadata purposes + filename = os.fspath(fp.name) + + if format: + preinit() + else: + filename_ext = os.path.splitext(filename)[1].lower() + ext = ( + filename_ext.decode() + if isinstance(filename_ext, bytes) + else filename_ext + ) + + # Try importing only the plugin for this extension first + if not _import_plugin_for_extension(ext): + preinit() + + if ext not in EXTENSION: + init() + try: + format = EXTENSION[ext] + except KeyError as e: + msg = f"unknown file extension: {ext}" + raise ValueError(msg) from e + + from . import ImageFile + + # may mutate self! + if isinstance(self, ImageFile.ImageFile) and os.path.abspath( + filename + ) == os.path.abspath(self.filename): + self._ensure_mutable() + else: + self.load() + + save_all = params.pop("save_all", None) + self._default_encoderinfo = params + encoderinfo = getattr(self, "encoderinfo", {}) + self._attach_default_encoderinfo(self) + self.encoderconfig: tuple[Any, ...] = () + + if format.upper() not in SAVE: + init() + if save_all or ( + save_all is None + and params.get("append_images") + and format.upper() in SAVE_ALL + ): + save_handler = SAVE_ALL[format.upper()] + else: + save_handler = SAVE[format.upper()] + + created = False + if open_fp: + created = not os.path.exists(filename) + if params.get("append", False): + # Open also for reading ("+"), because TIFF save_all + # writer needs to go back and edit the written data. + fp = builtins.open(filename, "r+b") + else: + fp = builtins.open(filename, "w+b") + else: + fp = cast(IO[bytes], fp) + + try: + save_handler(self, fp, filename) + except Exception: + if open_fp: + fp.close() + if created: + try: + os.remove(filename) + except PermissionError: + pass + raise + finally: + self.encoderinfo = encoderinfo + if open_fp: + fp.close() + + def _attach_default_encoderinfo(self, im: Image) -> dict[str, Any]: + encoderinfo = getattr(self, "encoderinfo", {}) + self.encoderinfo = {**im._default_encoderinfo, **encoderinfo} + return encoderinfo + + def seek(self, frame: int) -> None: + """ + Seeks to the given frame in this sequence file. If you seek + beyond the end of the sequence, the method raises an + ``EOFError`` exception. When a sequence file is opened, the + library automatically seeks to frame 0. + + See :py:meth:`~PIL.Image.Image.tell`. + + If defined, :attr:`~PIL.Image.Image.n_frames` refers to the + number of available frames. + + :param frame: Frame number, starting at 0. + :exception EOFError: If the call attempts to seek beyond the end + of the sequence. + """ + + # overridden by file handlers + if frame != 0: + msg = "no more images in file" + raise EOFError(msg) + + def show(self, title: str | None = None) -> None: + """ + Displays this image. This method is mainly intended for debugging purposes. + + This method calls :py:func:`PIL.ImageShow.show` internally. You can use + :py:func:`PIL.ImageShow.register` to override its default behaviour. + + The image is first saved to a temporary file. By default, it will be in + PNG format. + + On Unix, the image is then opened using the **xdg-open**, **display**, + **gm**, **eog** or **xv** utility, depending on which one can be found. + + On macOS, the image is opened with the native Preview application. + + On Windows, the image is opened with the standard PNG display utility. + + :param title: Optional title to use for the image window, where possible. + """ + + from . import ImageShow + + ImageShow.show(self, title) + + def split(self) -> tuple[Image, ...]: + """ + Split this image into individual bands. This method returns a + tuple of individual image bands from an image. For example, + splitting an "RGB" image creates three new images each + containing a copy of one of the original bands (red, green, + blue). + + If you need only one band, :py:meth:`~PIL.Image.Image.getchannel` + method can be more convenient and faster. + + :returns: A tuple containing bands. + """ + + self.load() + if self.im.bands == 1: + return (self.copy(),) + return tuple(map(self._new, self.im.split())) + + def getchannel(self, channel: int | str) -> Image: + """ + Returns an image containing a single channel of the source image. + + :param channel: What channel to return. Could be index + (0 for "R" channel of "RGB") or channel name + ("A" for alpha channel of "RGBA"). + :returns: An image in "L" mode. + + .. versionadded:: 4.3.0 + """ + self.load() + + if isinstance(channel, str): + try: + channel = self.getbands().index(channel) + except ValueError as e: + msg = f'The image has no channel "{channel}"' + raise ValueError(msg) from e + + return self._new(self.im.getband(channel)) + + def tell(self) -> int: + """ + Returns the current frame number. See :py:meth:`~PIL.Image.Image.seek`. + + If defined, :attr:`~PIL.Image.Image.n_frames` refers to the + number of available frames. + + :returns: Frame number, starting with 0. + """ + return 0 + + def thumbnail( + self, + size: tuple[float, float], + resample: Resampling = Resampling.BICUBIC, + reducing_gap: float | None = 2.0, + ) -> None: + """ + Make this image into a thumbnail. This method modifies the + image to contain a thumbnail version of itself, no larger than + the given size. This method calculates an appropriate thumbnail + size to preserve the aspect of the image, calls the + :py:meth:`~PIL.Image.Image.draft` method to configure the file reader + (where applicable), and finally resizes the image. + + Note that this function modifies the :py:class:`~PIL.Image.Image` + object in place. If you need to use the full resolution image as well, + apply this method to a :py:meth:`~PIL.Image.Image.copy` of the original + image. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param resample: Optional resampling filter. This can be one + of :py:data:`Resampling.NEAREST`, :py:data:`Resampling.BOX`, + :py:data:`Resampling.BILINEAR`, :py:data:`Resampling.HAMMING`, + :py:data:`Resampling.BICUBIC` or :py:data:`Resampling.LANCZOS`. + If omitted, it defaults to :py:data:`Resampling.BICUBIC`. + (was :py:data:`Resampling.NEAREST` prior to version 2.5.0). + See: :ref:`concept-filters`. + :param reducing_gap: Apply optimization by resizing the image + in two steps. First, reducing the image by integer times + using :py:meth:`~PIL.Image.Image.reduce` or + :py:meth:`~PIL.Image.Image.draft` for JPEG images. + Second, resizing using regular resampling. The last step + changes size no less than by ``reducing_gap`` times. + ``reducing_gap`` may be None (no first step is performed) + or should be greater than 1.0. The bigger ``reducing_gap``, + the closer the result to the fair resampling. + The smaller ``reducing_gap``, the faster resizing. + With ``reducing_gap`` greater or equal to 3.0, the result is + indistinguishable from fair resampling in most cases. + The default value is 2.0 (very close to fair resampling + while still being faster in many cases). + :returns: None + """ + + provided_size = tuple(map(math.floor, size)) + + def preserve_aspect_ratio() -> tuple[int, int] | None: + def round_aspect(number: float, key: Callable[[int], float]) -> int: + return max(min(math.floor(number), math.ceil(number), key=key), 1) + + x, y = provided_size + if x >= self.width and y >= self.height: + return None + + aspect = self.width / self.height + if x / y >= aspect: + x = round_aspect(y * aspect, key=lambda n: abs(aspect - n / y)) + else: + y = round_aspect( + x / aspect, key=lambda n: 0 if n == 0 else abs(aspect - x / n) + ) + return x, y + + preserved_size = preserve_aspect_ratio() + if preserved_size is None: + return + final_size = preserved_size + + box = None + if reducing_gap is not None: + res = self.draft( + None, (int(size[0] * reducing_gap), int(size[1] * reducing_gap)) + ) + if res is not None: + box = res[1] + + if self.size != final_size: + im = self.resize(final_size, resample, box=box, reducing_gap=reducing_gap) + + self.im = im.im + self._size = final_size + self._mode = self.im.mode + + self.readonly = 0 + + # FIXME: the different transform methods need further explanation + # instead of bloating the method docs, add a separate chapter. + def transform( + self, + size: tuple[int, int], + method: Transform | ImageTransformHandler | SupportsGetData, + data: Sequence[Any] | None = None, + resample: int = Resampling.NEAREST, + fill: int = 1, + fillcolor: float | tuple[float, ...] | str | None = None, + ) -> Image: + """ + Transforms this image. This method creates a new image with the + given size, and the same mode as the original, and copies data + to the new image using the given transform. + + :param size: The output size in pixels, as a 2-tuple: + (width, height). + :param method: The transformation method. This is one of + :py:data:`Transform.EXTENT` (cut out a rectangular subregion), + :py:data:`Transform.AFFINE` (affine transform), + :py:data:`Transform.PERSPECTIVE` (perspective transform), + :py:data:`Transform.QUAD` (map a quadrilateral to a rectangle), or + :py:data:`Transform.MESH` (map a number of source quadrilaterals + in one operation). + + It may also be an :py:class:`~PIL.Image.ImageTransformHandler` + object:: + + class Example(Image.ImageTransformHandler): + def transform(self, size, data, resample, fill=1): + # Return result + + Implementations of :py:class:`~PIL.Image.ImageTransformHandler` + for some of the :py:class:`Transform` methods are provided + in :py:mod:`~PIL.ImageTransform`. + + It may also be an object with a ``method.getdata`` method + that returns a tuple supplying new ``method`` and ``data`` values:: + + class Example: + def getdata(self): + method = Image.Transform.EXTENT + data = (0, 0, 100, 100) + return method, data + :param data: Extra data to the transformation method. + :param resample: Optional resampling filter. It can be one of + :py:data:`Resampling.NEAREST` (use nearest neighbour), + :py:data:`Resampling.BILINEAR` (linear interpolation in a 2x2 + environment), or :py:data:`Resampling.BICUBIC` (cubic spline + interpolation in a 4x4 environment). If omitted, or if the image + has mode "1" or "P", it is set to :py:data:`Resampling.NEAREST`. + See: :ref:`concept-filters`. + :param fill: If ``method`` is an + :py:class:`~PIL.Image.ImageTransformHandler` object, this is one of + the arguments passed to it. Otherwise, it is unused. + :param fillcolor: Optional fill color for the area outside the + transform in the output image. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if self.mode in ("LA", "RGBA") and resample != Resampling.NEAREST: + return ( + self.convert({"LA": "La", "RGBA": "RGBa"}[self.mode]) + .transform(size, method, data, resample, fill, fillcolor) + .convert(self.mode) + ) + + if isinstance(method, ImageTransformHandler): + return method.transform(size, self, resample=resample, fill=fill) + + if hasattr(method, "getdata"): + # compatibility w. old-style transform objects + method, data = method.getdata() + + if data is None: + msg = "missing method data" + raise ValueError(msg) + + im = new(self.mode, size, fillcolor) + if self.mode == "P" and self.palette: + im.palette = self.palette.copy() + im.info = self.info.copy() + if method == Transform.MESH: + # list of quads + for box, quad in data: + im.__transformer( + box, self, Transform.QUAD, quad, resample, fillcolor is None + ) + else: + im.__transformer( + (0, 0) + size, self, method, data, resample, fillcolor is None + ) + + return im + + def __transformer( + self, + box: tuple[int, int, int, int], + image: Image, + method: Transform, + data: Sequence[float], + resample: int = Resampling.NEAREST, + fill: bool = True, + ) -> None: + w = box[2] - box[0] + h = box[3] - box[1] + + if method == Transform.AFFINE: + data = data[:6] + + elif method == Transform.EXTENT: + # convert extent to an affine transform + x0, y0, x1, y1 = data + xs = (x1 - x0) / w + ys = (y1 - y0) / h + method = Transform.AFFINE + data = (xs, 0, x0, 0, ys, y0) + + elif method == Transform.PERSPECTIVE: + data = data[:8] + + elif method == Transform.QUAD: + # quadrilateral warp. data specifies the four corners + # given as NW, SW, SE, and NE. + nw = data[:2] + sw = data[2:4] + se = data[4:6] + ne = data[6:8] + x0, y0 = nw + As = 1.0 / w + At = 1.0 / h + data = ( + x0, + (ne[0] - x0) * As, + (sw[0] - x0) * At, + (se[0] - sw[0] - ne[0] + x0) * As * At, + y0, + (ne[1] - y0) * As, + (sw[1] - y0) * At, + (se[1] - sw[1] - ne[1] + y0) * As * At, + ) + + else: + msg = "unknown transformation method" + raise ValueError(msg) + + if resample not in ( + Resampling.NEAREST, + Resampling.BILINEAR, + Resampling.BICUBIC, + ): + if resample in (Resampling.BOX, Resampling.HAMMING, Resampling.LANCZOS): + unusable: dict[int, str] = { + Resampling.BOX: "Image.Resampling.BOX", + Resampling.HAMMING: "Image.Resampling.HAMMING", + Resampling.LANCZOS: "Image.Resampling.LANCZOS", + } + msg = unusable[resample] + f" ({resample}) cannot be used." + else: + msg = f"Unknown resampling filter ({resample})." + + filters = [ + f"{filter[1]} ({filter[0]})" + for filter in ( + (Resampling.NEAREST, "Image.Resampling.NEAREST"), + (Resampling.BILINEAR, "Image.Resampling.BILINEAR"), + (Resampling.BICUBIC, "Image.Resampling.BICUBIC"), + ) + ] + msg += f" Use {', '.join(filters[:-1])} or {filters[-1]}" + raise ValueError(msg) + + image.load() + + self.load() + + if image.mode in ("1", "P"): + resample = Resampling.NEAREST + + self.im.transform(box, image.im, method, data, resample, fill) + + def transpose(self, method: Transpose) -> Image: + """ + Transpose image (flip or rotate in 90 degree steps) + + :param method: One of :py:data:`Transpose.FLIP_LEFT_RIGHT`, + :py:data:`Transpose.FLIP_TOP_BOTTOM`, :py:data:`Transpose.ROTATE_90`, + :py:data:`Transpose.ROTATE_180`, :py:data:`Transpose.ROTATE_270`, + :py:data:`Transpose.TRANSPOSE` or :py:data:`Transpose.TRANSVERSE`. + :returns: Returns a flipped or rotated copy of this image. + """ + + self.load() + return self._new(self.im.transpose(method)) + + def effect_spread(self, distance: int) -> Image: + """ + Randomly spread pixels in an image. + + :param distance: Distance to spread pixels. + """ + self.load() + return self._new(self.im.effect_spread(distance)) + + def toqimage(self) -> ImageQt.ImageQt: + """Returns a QImage copy of this image""" + from . import ImageQt + + if not ImageQt.qt_is_installed: + msg = "Qt bindings are not installed" + raise ImportError(msg) + return ImageQt.toqimage(self) + + def toqpixmap(self) -> ImageQt.QPixmap: + """Returns a QPixmap copy of this image""" + from . import ImageQt + + if not ImageQt.qt_is_installed: + msg = "Qt bindings are not installed" + raise ImportError(msg) + return ImageQt.toqpixmap(self) + + +# -------------------------------------------------------------------- +# Abstract handlers. + + +class ImagePointHandler(abc.ABC): + """ + Used as a mixin by point transforms + (for use with :py:meth:`~PIL.Image.Image.point`) + """ + + @abc.abstractmethod + def point(self, im: Image) -> Image: + pass + + +class ImageTransformHandler(abc.ABC): + """ + Used as a mixin by geometry transforms + (for use with :py:meth:`~PIL.Image.Image.transform`) + """ + + @abc.abstractmethod + def transform( + self, + size: tuple[int, int], + image: Image, + **options: Any, + ) -> Image: + pass + + +# -------------------------------------------------------------------- +# Factories + + +def _check_size(size: Any) -> None: + """ + Common check to enforce type and sanity check on size tuples + + :param size: Should be a 2 tuple of (width, height) + :returns: None, or raises a ValueError + """ + + if not isinstance(size, (list, tuple)): + msg = "Size must be a list or tuple" + raise ValueError(msg) + if len(size) != 2: + msg = "Size must be a sequence of length 2" + raise ValueError(msg) + if size[0] < 0 or size[1] < 0: + msg = "Width and height must be >= 0" + raise ValueError(msg) + + +def new( + mode: str, + size: tuple[int, int] | list[int], + color: float | tuple[float, ...] | str | None = 0, +) -> Image: + """ + Creates a new image with the given mode and size. + + :param mode: The mode to use for the new image. See: + :ref:`concept-modes`. + :param size: A 2-tuple, containing (width, height) in pixels. + :param color: What color to use for the image. Default is black. If given, + this should be a single integer or floating point value for single-band + modes, and a tuple for multi-band modes (one value per band). When + creating RGB or HSV images, you can also use color strings as supported + by the ImageColor module. See :ref:`colors` for more information. If the + color is None, the image is not initialised. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + _check_size(size) + + if color is None: + # don't initialize + return Image()._new(core.new(mode, size)) + + if isinstance(color, str): + # css3-style specifier + + from . import ImageColor + + color = ImageColor.getcolor(color, mode) + + im = Image() + if ( + mode == "P" + and isinstance(color, (list, tuple)) + and all(isinstance(i, int) for i in color) + ): + color_ints: tuple[int, ...] = cast(tuple[int, ...], tuple(color)) + if len(color_ints) == 3 or len(color_ints) == 4: + # RGB or RGBA value for a P image + from . import ImagePalette + + im.palette = ImagePalette.ImagePalette() + color = im.palette.getcolor(color_ints) + return im._new(core.fill(mode, size, color)) + + +def frombytes( + mode: str, + size: tuple[int, int], + data: bytes | bytearray | SupportsArrayInterface, + decoder_name: str = "raw", + *args: Any, +) -> Image: + """ + Creates a copy of an image memory from pixel data in a buffer. + + In its simplest form, this function takes three arguments + (mode, size, and unpacked pixel data). + + You can also use any pixel decoder supported by PIL. For more + information on available decoders, see the section + :ref:`Writing Your Own File Codec `. + + Note that this function decodes pixel data only, not entire images. + If you have an entire image in a string, wrap it in a + :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load + it. + + :param mode: The image mode. See: :ref:`concept-modes`. + :param size: The image size. + :param data: A byte buffer containing raw data for the given mode. + :param decoder_name: What decoder to use. + :param args: Additional parameters for the given decoder. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + _check_size(size) + + im = new(mode, size) + if im.width != 0 and im.height != 0: + decoder_args: Any = args + if len(decoder_args) == 1 and isinstance(decoder_args[0], tuple): + # may pass tuple instead of argument list + decoder_args = decoder_args[0] + + if decoder_name == "raw" and decoder_args == (): + decoder_args = mode + + im.frombytes(data, decoder_name, decoder_args) + return im + + +def frombuffer( + mode: str, + size: tuple[int, int], + data: bytes | SupportsArrayInterface, + decoder_name: str = "raw", + *args: Any, +) -> Image: + """ + Creates an image memory referencing pixel data in a byte buffer. + + This function is similar to :py:func:`~PIL.Image.frombytes`, but uses data + in the byte buffer, where possible. This means that changes to the + original buffer object are reflected in this image). Not all modes can + share memory; supported modes include "L", "RGBX", "RGBA", and "CMYK". + + Note that this function decodes pixel data only, not entire images. + If you have an entire image file in a string, wrap it in a + :py:class:`~io.BytesIO` object, and use :py:func:`~PIL.Image.open` to load it. + + The default parameters used for the "raw" decoder differs from that used for + :py:func:`~PIL.Image.frombytes`. This is a bug, and will probably be fixed in a + future release. The current release issues a warning if you do this; to disable + the warning, you should provide the full set of parameters. See below for details. + + :param mode: The image mode. See: :ref:`concept-modes`. + :param size: The image size. + :param data: A bytes or other buffer object containing raw + data for the given mode. + :param decoder_name: What decoder to use. + :param args: Additional parameters for the given decoder. For the + default encoder ("raw"), it's recommended that you provide the + full set of parameters:: + + frombuffer(mode, size, data, "raw", mode, 0, 1) + + :returns: An :py:class:`~PIL.Image.Image` object. + + .. versionadded:: 1.1.4 + """ + + _check_size(size) + + # may pass tuple instead of argument list + if len(args) == 1 and isinstance(args[0], tuple): + args = args[0] + + if decoder_name == "raw": + if args == (): + args = mode, 0, 1 + if args[0] in _MAPMODES: + im = new(mode, (0, 0)) + im = im._new(core.map_buffer(data, size, decoder_name, 0, args)) + if mode == "P": + from . import ImagePalette + + im.palette = ImagePalette.ImagePalette("RGB", im.im.getpalette("RGB")) + im.readonly = 1 + return im + + return frombytes(mode, size, data, decoder_name, args) + + +class SupportsArrayInterface(Protocol): + """ + An object that has an ``__array_interface__`` dictionary. + """ + + @property + def __array_interface__(self) -> dict[str, Any]: + raise NotImplementedError() + + +class SupportsArrowArrayInterface(Protocol): + """ + An object that has an ``__arrow_c_array__`` method corresponding to the arrow c + data interface. + """ + + def __arrow_c_array__( + self, requested_schema: "PyCapsule" = None # type: ignore[name-defined] # noqa: F821, UP037 + ) -> tuple["PyCapsule", "PyCapsule"]: # type: ignore[name-defined] # noqa: F821, UP037 + raise NotImplementedError() + + +def fromarray(obj: SupportsArrayInterface, mode: str | None = None) -> Image: + """ + Creates an image memory from an object exporting the array interface + (using the buffer protocol):: + + from PIL import Image + import numpy as np + a = np.zeros((5, 5)) + im = Image.fromarray(a) + + If ``obj`` is not contiguous, then the ``tobytes`` method is called + and :py:func:`~PIL.Image.frombuffer` is used. + + In the case of NumPy, be aware that Pillow modes do not always correspond + to NumPy dtypes. Pillow modes only offer 1-bit pixels, 8-bit pixels, + 32-bit signed integer pixels, and 32-bit floating point pixels. + + Pillow images can also be converted to arrays:: + + from PIL import Image + import numpy as np + im = Image.open("hopper.jpg") + a = np.asarray(im) + + When converting Pillow images to arrays however, only pixel values are + transferred. This means that P and PA mode images will lose their palette. + + :param obj: Object with array interface + :param mode: Optional mode to use when reading ``obj``. Since pixel values do not + contain information about palettes or color spaces, this can be used to place + grayscale L mode data within a P mode image, or read RGB data as YCbCr for + example. + + See: :ref:`concept-modes` for general information about modes. + :returns: An image object. + + .. versionadded:: 1.1.6 + """ + arr = obj.__array_interface__ + shape = arr["shape"] + ndim = len(shape) + strides = arr.get("strides", None) + try: + typekey = (1, 1) + shape[2:], arr["typestr"] + except KeyError as e: + if mode is not None: + typekey = None + color_modes: list[str] = [] + else: + msg = "Cannot handle this data type" + raise TypeError(msg) from e + if typekey is not None: + try: + typemode, rawmode, color_modes = _fromarray_typemap[typekey] + except KeyError as e: + typekey_shape, typestr = typekey + msg = f"Cannot handle this data type: {typekey_shape}, {typestr}" + raise TypeError(msg) from e + if mode is not None: + if mode != typemode and mode not in color_modes: + deprecate("'mode' parameter for changing data types", 13) + rawmode = mode + else: + mode = typemode + if mode in ["1", "L", "I", "P", "F"]: + ndmax = 2 + elif mode == "RGB": + ndmax = 3 + else: + ndmax = 4 + if ndim > ndmax: + msg = f"Too many dimensions: {ndim} > {ndmax}." + raise ValueError(msg) + + size = 1 if ndim == 1 else shape[1], shape[0] + if strides is not None: + if hasattr(obj, "tobytes"): + obj = obj.tobytes() + elif hasattr(obj, "tostring"): + obj = obj.tostring() + else: + msg = "'strides' requires either tobytes() or tostring()" + raise ValueError(msg) + + return frombuffer(mode, size, obj, "raw", rawmode, 0, 1) + + +def fromarrow( + obj: SupportsArrowArrayInterface, mode: str, size: tuple[int, int] +) -> Image: + """Creates an image with zero-copy shared memory from an object exporting + the arrow_c_array interface protocol:: + + from PIL import Image + import pyarrow as pa + arr = pa.array([0]*(5*5*4), type=pa.uint8()) + im = Image.fromarrow(arr, 'RGBA', (5, 5)) + + If the data representation of the ``obj`` is not compatible with + Pillow internal storage, a ValueError is raised. + + Pillow images can also be converted to Arrow objects:: + + from PIL import Image + import pyarrow as pa + im = Image.open('hopper.jpg') + arr = pa.array(im) + + As with array support, when converting Pillow images to arrays, + only pixel values are transferred. This means that P and PA mode + images will lose their palette. + + :param obj: Object with an arrow_c_array interface + :param mode: Image mode. + :param size: Image size. This must match the storage of the arrow object. + :returns: An Image object + + Note that according to the Arrow spec, both the producer and the + consumer should consider the exported array to be immutable, as + unsynchronized updates will potentially cause inconsistent data. + + See: :ref:`arrow-support` for more detailed information + + .. versionadded:: 11.2.1 + + """ + if not hasattr(obj, "__arrow_c_array__"): + msg = "arrow_c_array interface not found" + raise ValueError(msg) + + schema_capsule, array_capsule = obj.__arrow_c_array__() + _im = core.new_arrow(mode, size, schema_capsule, array_capsule) + if _im: + return Image()._new(_im) + + msg = "new_arrow returned None without an exception" + raise ValueError(msg) + + +def fromqimage(im: ImageQt.QImage) -> ImageFile.ImageFile: + """Creates an image instance from a QImage image""" + from . import ImageQt + + if not ImageQt.qt_is_installed: + msg = "Qt bindings are not installed" + raise ImportError(msg) + return ImageQt.fromqimage(im) + + +def fromqpixmap(im: ImageQt.QPixmap) -> ImageFile.ImageFile: + """Creates an image instance from a QPixmap image""" + from . import ImageQt + + if not ImageQt.qt_is_installed: + msg = "Qt bindings are not installed" + raise ImportError(msg) + return ImageQt.fromqpixmap(im) + + +_fromarray_typemap = { + # (shape, typestr) => mode, rawmode, color modes + # first two members of shape are set to one + ((1, 1), "|b1"): ("1", "1;8", []), + ((1, 1), "|u1"): ("L", "L", ["P"]), + ((1, 1), "|i1"): ("I", "I;8", []), + ((1, 1), "u2"): ("I", "I;16B", []), + ((1, 1), "i2"): ("I", "I;16BS", []), + ((1, 1), "u4"): ("I", "I;32B", []), + ((1, 1), "i4"): ("I", "I;32BS", []), + ((1, 1), "f4"): ("F", "F;32BF", []), + ((1, 1), "f8"): ("F", "F;64BF", []), + ((1, 1, 2), "|u1"): ("LA", "LA", ["La", "PA"]), + ((1, 1, 3), "|u1"): ("RGB", "RGB", ["YCbCr", "LAB", "HSV"]), + ((1, 1, 4), "|u1"): ("RGBA", "RGBA", ["RGBa", "RGBX", "CMYK"]), + # shortcuts: + ((1, 1), f"{_ENDIAN}i4"): ("I", "I", []), + ((1, 1), f"{_ENDIAN}f4"): ("F", "F", []), +} + + +def _decompression_bomb_check(size: tuple[int, int]) -> None: + if MAX_IMAGE_PIXELS is None: + return + + pixels = max(1, size[0]) * max(1, size[1]) + + if pixels > 2 * MAX_IMAGE_PIXELS: + msg = ( + f"Image size ({pixels} pixels) exceeds limit of {2 * MAX_IMAGE_PIXELS} " + "pixels, could be decompression bomb DOS attack." + ) + raise DecompressionBombError(msg) + + if pixels > MAX_IMAGE_PIXELS: + warnings.warn( + f"Image size ({pixels} pixels) exceeds limit of {MAX_IMAGE_PIXELS} pixels, " + "could be decompression bomb DOS attack.", + DecompressionBombWarning, + ) + + +def open( + fp: StrOrBytesPath | IO[bytes], + mode: Literal["r"] = "r", + formats: list[str] | tuple[str, ...] | None = None, +) -> ImageFile.ImageFile: + """ + Opens and identifies the given image file. + + This is a lazy operation; this function identifies the file, but + the file remains open and the actual image data is not read from + the file until you try to process the data (or call the + :py:meth:`~PIL.Image.Image.load` method). See + :py:func:`~PIL.Image.new`. See :ref:`file-handling`. + + :param fp: A filename (string), os.PathLike object or a file object. + The file object must implement ``file.read``, + ``file.seek``, and ``file.tell`` methods, + and be opened in binary mode. The file object will also seek to zero + before reading. + :param mode: The mode. If given, this argument must be "r". + :param formats: A list or tuple of formats to attempt to load the file in. + This can be used to restrict the set of formats checked. + Pass ``None`` to try all supported formats. You can print the set of + available formats by running ``python3 -m PIL`` or using + the :py:func:`PIL.features.pilinfo` function. + :returns: An :py:class:`~PIL.Image.Image` object. + :exception FileNotFoundError: If the file cannot be found. + :exception PIL.UnidentifiedImageError: If the image cannot be opened and + identified. + :exception ValueError: If the ``mode`` is not "r", or if a ``StringIO`` + instance is used for ``fp``. + :exception TypeError: If ``formats`` is not ``None``, a list or a tuple. + """ + + if mode != "r": + msg = f"bad mode {repr(mode)}" # type: ignore[unreachable] + raise ValueError(msg) + elif isinstance(fp, io.StringIO): + msg = ( # type: ignore[unreachable] + "StringIO cannot be used to open an image. " + "Binary data must be used instead." + ) + raise ValueError(msg) + + if formats is None: + formats = ID + elif not isinstance(formats, (list, tuple)): + msg = "formats must be a list or tuple" # type: ignore[unreachable] + raise TypeError(msg) + + exclusive_fp = False + filename: str | bytes = "" + if is_path(fp): + filename = os.fspath(fp) + fp = builtins.open(filename, "rb") + exclusive_fp = True + else: + fp = cast(IO[bytes], fp) + + try: + fp.seek(0) + except (AttributeError, io.UnsupportedOperation): + fp = io.BytesIO(fp.read()) + exclusive_fp = True + + prefix = fp.read(16) + + # Try to import just the plugin needed for this file extension + # before falling back to preinit() which imports common plugins + ext = os.path.splitext(filename)[1] if filename else "" + if not _import_plugin_for_extension(ext): + preinit() + + warning_messages: list[str] = [] + + def _open_core( + fp: IO[bytes], + filename: str | bytes, + prefix: bytes, + formats: list[str] | tuple[str, ...], + ) -> ImageFile.ImageFile | None: + for i in formats: + i = i.upper() + if i not in OPEN: + init() + try: + factory, accept = OPEN[i] + result = not accept or accept(prefix) + if isinstance(result, str): + warning_messages.append(result) + elif result: + fp.seek(0) + im = factory(fp, filename) + _decompression_bomb_check(im.size) + return im + except (SyntaxError, IndexError, TypeError, struct.error) as e: + if WARN_POSSIBLE_FORMATS: + warning_messages.append(i + " opening failed. " + str(e)) + except BaseException: + if exclusive_fp: + fp.close() + raise + return None + + im = _open_core(fp, filename, prefix, formats) + + if im is None and formats is ID: + # Try preinit (few common plugins) then init (all plugins) + for loader in (preinit, init): + checked_formats = ID.copy() + loader() + if formats != checked_formats: + im = _open_core( + fp, + filename, + prefix, + tuple(f for f in formats if f not in checked_formats), + ) + if im is not None: + break + + if im: + im._exclusive_fp = exclusive_fp + return im + + if exclusive_fp: + fp.close() + for message in warning_messages: + warnings.warn(message) + msg = "cannot identify image file %r" % (filename if filename else fp) + raise UnidentifiedImageError(msg) + + +# +# Image processing. + + +def alpha_composite(im1: Image, im2: Image) -> Image: + """ + Alpha composite im2 over im1. + + :param im1: The first image. Must have mode RGBA or LA. + :param im2: The second image. Must have the same mode and size as the first image. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + im1.load() + im2.load() + return im1._new(core.alpha_composite(im1.im, im2.im)) + + +def blend(im1: Image, im2: Image, alpha: float) -> Image: + """ + Creates a new image by interpolating between two input images, using + a constant alpha:: + + out = image1 * (1.0 - alpha) + image2 * alpha + + :param im1: The first image. + :param im2: The second image. Must have the same mode and size as + the first image. + :param alpha: The interpolation alpha factor. If alpha is 0.0, a + copy of the first image is returned. If alpha is 1.0, a copy of + the second image is returned. There are no restrictions on the + alpha value. If necessary, the result is clipped to fit into + the allowed output range. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + im1.load() + im2.load() + return im1._new(core.blend(im1.im, im2.im, alpha)) + + +def composite(image1: Image, image2: Image, mask: Image) -> Image: + """ + Create composite image by blending images using a transparency mask. + + :param image1: The first image. + :param image2: The second image. Must have the same mode and + size as the first image. + :param mask: A mask image. This image can have mode + "1", "L", or "RGBA", and must have the same size as the + other two images. + """ + + image = image2.copy() + image.paste(image1, None, mask) + return image + + +def eval(image: Image, *args: Callable[[int], float]) -> Image: + """ + Applies the function (which should take one argument) to each pixel + in the given image. If the image has more than one band, the same + function is applied to each band. Note that the function is + evaluated once for each possible pixel value, so you cannot use + random components or other generators. + + :param image: The input image. + :param function: A function object, taking one integer argument. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + return image.point(args[0]) + + +def merge(mode: str, bands: Sequence[Image]) -> Image: + """ + Merge a set of single band images into a new multiband image. + + :param mode: The mode to use for the output image. See: + :ref:`concept-modes`. + :param bands: A sequence containing one single-band image for + each band in the output image. All bands must have the + same size. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + + if getmodebands(mode) != len(bands) or "*" in mode: + msg = "wrong number of bands" + raise ValueError(msg) + for band in bands[1:]: + if band.mode != getmodetype(mode): + msg = "mode mismatch" + raise ValueError(msg) + if band.size != bands[0].size: + msg = "size mismatch" + raise ValueError(msg) + for band in bands: + band.load() + return bands[0]._new(core.merge(mode, *[b.im for b in bands])) + + +# -------------------------------------------------------------------- +# Plugin registry + + +def register_open( + id: str, + factory: ( + Callable[[IO[bytes], str | bytes], ImageFile.ImageFile] + | type[ImageFile.ImageFile] + ), + accept: Callable[[bytes], bool | str] | None = None, +) -> None: + """ + Register an image file plugin. This function should not be used + in application code. + + :param id: An image format identifier. + :param factory: An image file factory method. + :param accept: An optional function that can be used to quickly + reject images having another format. + """ + id = id.upper() + if id not in ID: + ID.append(id) + OPEN[id] = factory, accept + + +def register_mime(id: str, mimetype: str) -> None: + """ + Registers an image MIME type by populating ``Image.MIME``. This function + should not be used in application code. + + ``Image.MIME`` provides a mapping from image format identifiers to mime + formats, but :py:meth:`~PIL.ImageFile.ImageFile.get_format_mimetype` can + provide a different result for specific images. + + :param id: An image format identifier. + :param mimetype: The image MIME type for this format. + """ + MIME[id.upper()] = mimetype + + +def register_save( + id: str, driver: Callable[[Image, IO[bytes], str | bytes], None] +) -> None: + """ + Registers an image save function. This function should not be + used in application code. + + :param id: An image format identifier. + :param driver: A function to save images in this format. + """ + SAVE[id.upper()] = driver + + +def register_save_all( + id: str, driver: Callable[[Image, IO[bytes], str | bytes], None] +) -> None: + """ + Registers an image function to save all the frames + of a multiframe format. This function should not be + used in application code. + + :param id: An image format identifier. + :param driver: A function to save images in this format. + """ + SAVE_ALL[id.upper()] = driver + + +def register_extension(id: str, extension: str) -> None: + """ + Registers an image extension. This function should not be + used in application code. + + :param id: An image format identifier. + :param extension: An extension used for this format. + """ + EXTENSION[extension.lower()] = id.upper() + + +def register_extensions(id: str, extensions: list[str]) -> None: + """ + Registers image extensions. This function should not be + used in application code. + + :param id: An image format identifier. + :param extensions: A list of extensions used for this format. + """ + for extension in extensions: + register_extension(id, extension) + + +def registered_extensions() -> dict[str, str]: + """ + Returns a dictionary containing all file extensions belonging + to registered plugins + """ + init() + return EXTENSION + + +def register_decoder(name: str, decoder: type[ImageFile.PyDecoder]) -> None: + """ + Registers an image decoder. This function should not be + used in application code. + + :param name: The name of the decoder + :param decoder: An ImageFile.PyDecoder object + + .. versionadded:: 4.1.0 + """ + DECODERS[name] = decoder + + +def register_encoder(name: str, encoder: type[ImageFile.PyEncoder]) -> None: + """ + Registers an image encoder. This function should not be + used in application code. + + :param name: The name of the encoder + :param encoder: An ImageFile.PyEncoder object + + .. versionadded:: 4.1.0 + """ + ENCODERS[name] = encoder + + +# -------------------------------------------------------------------- +# Simple display support. + + +def _show(image: Image, **options: Any) -> None: + from . import ImageShow + + deprecate("Image._show", 13, "ImageShow.show") + ImageShow.show(image, **options) + + +# -------------------------------------------------------------------- +# Effects + + +def effect_mandelbrot( + size: tuple[int, int], extent: tuple[float, float, float, float], quality: int +) -> Image: + """ + Generate a Mandelbrot set covering the given extent. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param extent: The extent to cover, as a 4-tuple: + (x0, y0, x1, y1). + :param quality: Quality. + """ + return Image()._new(core.effect_mandelbrot(size, extent, quality)) + + +def effect_noise(size: tuple[int, int], sigma: float) -> Image: + """ + Generate Gaussian noise centered around 128. + + :param size: The requested size in pixels, as a 2-tuple: + (width, height). + :param sigma: Standard deviation of noise. + """ + return Image()._new(core.effect_noise(size, sigma)) + + +def linear_gradient(mode: str) -> Image: + """ + Generate 256x256 linear gradient from black to white, top to bottom. + + :param mode: Input mode. + """ + return Image()._new(core.linear_gradient(mode)) + + +def radial_gradient(mode: str) -> Image: + """ + Generate 256x256 radial gradient from black to white, centre to edge. + + :param mode: Input mode. + """ + return Image()._new(core.radial_gradient(mode)) + + +# -------------------------------------------------------------------- +# Resources + + +def _apply_env_variables(env: dict[str, str] | None = None) -> None: + env_dict = env if env is not None else os.environ + + for var_name, setter in [ + ("PILLOW_ALIGNMENT", core.set_alignment), + ("PILLOW_BLOCK_SIZE", core.set_block_size), + ("PILLOW_BLOCKS_MAX", core.set_blocks_max), + ]: + if var_name not in env_dict: + continue + + var = env_dict[var_name].lower() + + units = 1 + for postfix, mul in [("k", 1024), ("m", 1024 * 1024)]: + if var.endswith(postfix): + units = mul + var = var[: -len(postfix)] + + try: + var_int = int(var) * units + except ValueError: + warnings.warn(f"{var_name} is not int") + continue + + try: + setter(var_int) + except ValueError as e: + warnings.warn(f"{var_name}: {e}") + + +_apply_env_variables() +atexit.register(core.clear_cache) + + +if TYPE_CHECKING: + _ExifBase = MutableMapping[int, Any] +else: + _ExifBase = MutableMapping + + +class Exif(_ExifBase): + """ + This class provides read and write access to EXIF image data:: + + from PIL import Image + im = Image.open("exif.png") + exif = im.getexif() # Returns an instance of this class + + Information can be read and written, iterated over or deleted:: + + print(exif[274]) # 1 + exif[274] = 2 + for k, v in exif.items(): + print("Tag", k, "Value", v) # Tag 274 Value 2 + del exif[274] + + To access information beyond IFD0, :py:meth:`~PIL.Image.Exif.get_ifd` + returns a dictionary:: + + from PIL import ExifTags + im = Image.open("exif_gps.jpg") + exif = im.getexif() + gps_ifd = exif.get_ifd(ExifTags.IFD.GPSInfo) + print(gps_ifd) + + Other IFDs include ``ExifTags.IFD.Exif``, ``ExifTags.IFD.MakerNote``, + ``ExifTags.IFD.Interop`` and ``ExifTags.IFD.IFD1``. + + :py:mod:`~PIL.ExifTags` also has enum classes to provide names for data:: + + print(exif[ExifTags.Base.Software]) # PIL + print(gps_ifd[ExifTags.GPS.GPSDateStamp]) # 1999:99:99 99:99:99 + """ + + endian: str | None = None + bigtiff = False + _loaded = False + + def __init__(self) -> None: + self._data: dict[int, Any] = {} + self._hidden_data: dict[int, Any] = {} + self._ifds: dict[int, dict[int, Any]] = {} + self._info: TiffImagePlugin.ImageFileDirectory_v2 | None = None + self._loaded_exif: bytes | None = None + + def _fixup(self, value: Any) -> Any: + try: + if len(value) == 1 and isinstance(value, tuple): + return value[0] + except Exception: + pass + return value + + def _fixup_dict(self, src_dict: dict[int, Any]) -> dict[int, Any]: + # Helper function + # returns a dict with any single item tuples/lists as individual values + return {k: self._fixup(v) for k, v in src_dict.items()} + + def _get_ifd_dict( + self, offset: int, group: int | None = None + ) -> dict[int, Any] | None: + try: + # an offset pointer to the location of the nested embedded IFD. + # It should be a long, but may be corrupted. + self.fp.seek(offset) + except (KeyError, TypeError): + return None + else: + from . import TiffImagePlugin + + info = TiffImagePlugin.ImageFileDirectory_v2(self.head, group=group) + info.load(self.fp) + return self._fixup_dict(dict(info)) + + def _get_head(self) -> bytes: + version = b"\x2b" if self.bigtiff else b"\x2a" + if self.endian == "<": + head = b"II" + version + b"\x00" + o32le(8) + else: + head = b"MM\x00" + version + o32be(8) + if self.bigtiff: + head += o32le(8) if self.endian == "<" else o32be(8) + head += b"\x00\x00\x00\x00" + return head + + def load(self, data: bytes) -> None: + # Extract EXIF information. This is highly experimental, + # and is likely to be replaced with something better in a future + # version. + + # The EXIF record consists of a TIFF file embedded in a JPEG + # application marker (!). + if data == self._loaded_exif: + return + self._loaded_exif = data + self._data.clear() + self._hidden_data.clear() + self._ifds.clear() + while data and data.startswith(b"Exif\x00\x00"): + data = data[6:] + if not data: + self._info = None + return + + self.fp: IO[bytes] = io.BytesIO(data) + self.head = self.fp.read(8) + # process dictionary + from . import TiffImagePlugin + + self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) + self.endian = self._info._endian + self.fp.seek(self._info.next) + self._info.load(self.fp) + + def load_from_fp(self, fp: IO[bytes], offset: int | None = None) -> None: + self._loaded_exif = None + self._data.clear() + self._hidden_data.clear() + self._ifds.clear() + + # process dictionary + from . import TiffImagePlugin + + self.fp = fp + if offset is not None: + self.head = self._get_head() + else: + self.head = self.fp.read(8) + self._info = TiffImagePlugin.ImageFileDirectory_v2(self.head) + if self.endian is None: + self.endian = self._info._endian + if offset is None: + offset = self._info.next + self.fp.tell() + self.fp.seek(offset) + self._info.load(self.fp) + + def _get_merged_dict(self) -> dict[int, Any]: + merged_dict = dict(self) + + # get EXIF extension + if ExifTags.IFD.Exif in self: + ifd = self._get_ifd_dict(self[ExifTags.IFD.Exif], ExifTags.IFD.Exif) + if ifd: + merged_dict.update(ifd) + + # GPS + if ExifTags.IFD.GPSInfo in self: + merged_dict[ExifTags.IFD.GPSInfo] = self._get_ifd_dict( + self[ExifTags.IFD.GPSInfo], ExifTags.IFD.GPSInfo + ) + + return merged_dict + + def tobytes(self, offset: int = 8) -> bytes: + from . import TiffImagePlugin + + head = self._get_head() + ifd = TiffImagePlugin.ImageFileDirectory_v2(ifh=head) + for tag, ifd_dict in self._ifds.items(): + if tag not in self: + ifd[tag] = ifd_dict + for tag, value in self.items(): + if tag in [ + ExifTags.IFD.Exif, + ExifTags.IFD.GPSInfo, + ] and not isinstance(value, dict): + value = self.get_ifd(tag) + if ( + tag == ExifTags.IFD.Exif + and ExifTags.IFD.Interop in value + and not isinstance(value[ExifTags.IFD.Interop], dict) + ): + value = value.copy() + value[ExifTags.IFD.Interop] = self.get_ifd(ExifTags.IFD.Interop) + ifd[tag] = value + return b"Exif\x00\x00" + head + ifd.tobytes(offset) + + def get_ifd(self, tag: int) -> dict[int, Any]: + if tag not in self._ifds: + if tag == ExifTags.IFD.IFD1: + if self._info is not None and self._info.next != 0: + ifd = self._get_ifd_dict(self._info.next) + if ifd is not None: + self._ifds[tag] = ifd + elif tag in [ExifTags.IFD.Exif, ExifTags.IFD.GPSInfo]: + offset = self._hidden_data.get(tag, self.get(tag)) + if offset is not None: + ifd = self._get_ifd_dict(offset, tag) + if ifd is not None: + self._ifds[tag] = ifd + elif tag in [ExifTags.IFD.Interop, ExifTags.IFD.MakerNote]: + if ExifTags.IFD.Exif not in self._ifds: + self.get_ifd(ExifTags.IFD.Exif) + tag_data = self._ifds[ExifTags.IFD.Exif][tag] + if tag == ExifTags.IFD.MakerNote: + from .TiffImagePlugin import ImageFileDirectory_v2 + + try: + if tag_data.startswith(b"FUJIFILM"): + ifd_offset = i32le(tag_data, 8) + ifd_data = tag_data[ifd_offset:] + + makernote = {} + for i in range(struct.unpack(" 4: + (offset,) = struct.unpack("H", tag_data[:2])[0]): + ifd_tag, typ, count, data = struct.unpack( + ">HHL4s", tag_data[i * 12 + 2 : (i + 1) * 12 + 2] + ) + if ifd_tag == 0x1101: + # CameraInfo + (offset,) = struct.unpack(">L", data) + self.fp.seek(offset) + + camerainfo: dict[str, int | bytes] = { + "ModelID": self.fp.read(4) + } + + self.fp.read(4) + # Seconds since 2000 + camerainfo["TimeStamp"] = i32le(self.fp.read(12)) + + self.fp.read(4) + camerainfo["InternalSerialNumber"] = self.fp.read(4) + + self.fp.read(12) + parallax = self.fp.read(4) + handler = ImageFileDirectory_v2._load_dispatch[ + TiffTags.FLOAT + ][1] + camerainfo["Parallax"] = handler( + ImageFileDirectory_v2(), parallax, False + )[0] + + self.fp.read(4) + camerainfo["Category"] = self.fp.read(2) + + makernote = {0x1101: camerainfo} + self._ifds[tag] = makernote + except struct.error: + pass + else: + # Interop + ifd = self._get_ifd_dict(tag_data, tag) + if ifd is not None: + self._ifds[tag] = ifd + ifd = self._ifds.setdefault(tag, {}) + if tag == ExifTags.IFD.Exif and self._hidden_data: + ifd = { + k: v + for (k, v) in ifd.items() + if k not in (ExifTags.IFD.Interop, ExifTags.IFD.MakerNote) + } + return ifd + + def hide_offsets(self) -> None: + for tag in (ExifTags.IFD.Exif, ExifTags.IFD.GPSInfo): + if tag in self: + self._hidden_data[tag] = self[tag] + del self[tag] + + def __str__(self) -> str: + if self._info is not None: + # Load all keys into self._data + for tag in self._info: + self[tag] + + return str(self._data) + + def __len__(self) -> int: + keys = set(self._data) + if self._info is not None: + keys.update(self._info) + return len(keys) + + def __getitem__(self, tag: int) -> Any: + if self._info is not None and tag not in self._data and tag in self._info: + self._data[tag] = self._fixup(self._info[tag]) + del self._info[tag] + return self._data[tag] + + def __contains__(self, tag: object) -> bool: + return tag in self._data or (self._info is not None and tag in self._info) + + def __setitem__(self, tag: int, value: Any) -> None: + if self._info is not None and tag in self._info: + del self._info[tag] + self._data[tag] = value + + def __delitem__(self, tag: int) -> None: + if self._info is not None and tag in self._info: + del self._info[tag] + else: + del self._data[tag] + if tag in self._ifds: + del self._ifds[tag] + + def __iter__(self) -> Iterator[int]: + keys = set(self._data) + if self._info is not None: + keys.update(self._info) + return iter(keys) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageChops.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageChops.py new file mode 100644 index 000000000..29a5c995f --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageChops.py @@ -0,0 +1,311 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard channel operations +# +# History: +# 1996-03-24 fl Created +# 1996-08-13 fl Added logical operations (for "1" images) +# 2000-10-12 fl Added offset method (from Image.py) +# +# Copyright (c) 1997-2000 by Secret Labs AB +# Copyright (c) 1996-2000 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from __future__ import annotations + +from . import Image + + +def constant(image: Image.Image, value: int) -> Image.Image: + """Fill a channel with a given gray level. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return Image.new("L", image.size, value) + + +def duplicate(image: Image.Image) -> Image.Image: + """Copy a channel. Alias for :py:meth:`PIL.Image.Image.copy`. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return image.copy() + + +def invert(image: Image.Image) -> Image.Image: + """ + Invert an image (channel). :: + + out = MAX - image + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image.load() + return image._new(image.im.chop_invert()) + + +def lighter(image1: Image.Image, image2: Image.Image) -> Image.Image: + """ + Compares the two images, pixel by pixel, and returns a new image containing + the lighter values. :: + + out = max(image1, image2) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_lighter(image2.im)) + + +def darker(image1: Image.Image, image2: Image.Image) -> Image.Image: + """ + Compares the two images, pixel by pixel, and returns a new image containing + the darker values. :: + + out = min(image1, image2) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_darker(image2.im)) + + +def difference(image1: Image.Image, image2: Image.Image) -> Image.Image: + """ + Returns the absolute value of the pixel-by-pixel difference between the two + images. :: + + out = abs(image1 - image2) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_difference(image2.im)) + + +def multiply(image1: Image.Image, image2: Image.Image) -> Image.Image: + """ + Superimposes two images on top of each other. + + If you multiply an image with a solid black image, the result is black. If + you multiply with a solid white image, the image is unaffected. :: + + out = image1 * image2 / MAX + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_multiply(image2.im)) + + +def screen(image1: Image.Image, image2: Image.Image) -> Image.Image: + """ + Superimposes two inverted images on top of each other. :: + + out = MAX - ((MAX - image1) * (MAX - image2) / MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_screen(image2.im)) + + +def soft_light(image1: Image.Image, image2: Image.Image) -> Image.Image: + """ + Superimposes two images on top of each other using the Soft Light algorithm + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_soft_light(image2.im)) + + +def hard_light(image1: Image.Image, image2: Image.Image) -> Image.Image: + """ + Superimposes two images on top of each other using the Hard Light algorithm + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_hard_light(image2.im)) + + +def overlay(image1: Image.Image, image2: Image.Image) -> Image.Image: + """ + Superimposes two images on top of each other using the Overlay algorithm + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_overlay(image2.im)) + + +def add( + image1: Image.Image, image2: Image.Image, scale: float = 1.0, offset: float = 0 +) -> Image.Image: + """ + Adds two images, dividing the result by scale and adding the + offset. If omitted, scale defaults to 1.0, and offset to 0.0. :: + + out = ((image1 + image2) / scale + offset) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_add(image2.im, scale, offset)) + + +def subtract( + image1: Image.Image, image2: Image.Image, scale: float = 1.0, offset: float = 0 +) -> Image.Image: + """ + Subtracts two images, dividing the result by scale and adding the offset. + If omitted, scale defaults to 1.0, and offset to 0.0. :: + + out = ((image1 - image2) / scale + offset) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_subtract(image2.im, scale, offset)) + + +def add_modulo(image1: Image.Image, image2: Image.Image) -> Image.Image: + """Add two images, without clipping the result. :: + + out = ((image1 + image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_add_modulo(image2.im)) + + +def subtract_modulo(image1: Image.Image, image2: Image.Image) -> Image.Image: + """Subtract two images, without clipping the result. :: + + out = ((image1 - image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_subtract_modulo(image2.im)) + + +def logical_and(image1: Image.Image, image2: Image.Image) -> Image.Image: + """Logical AND between two images. + + Both of the images must have mode "1". If you would like to perform a + logical AND on an image with a mode other than "1", try + :py:meth:`~PIL.ImageChops.multiply` instead, using a black-and-white mask + as the second image. :: + + out = ((image1 and image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_and(image2.im)) + + +def logical_or(image1: Image.Image, image2: Image.Image) -> Image.Image: + """Logical OR between two images. + + Both of the images must have mode "1". :: + + out = ((image1 or image2) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_or(image2.im)) + + +def logical_xor(image1: Image.Image, image2: Image.Image) -> Image.Image: + """Logical XOR between two images. + + Both of the images must have mode "1". :: + + out = ((bool(image1) != bool(image2)) % MAX) + + :rtype: :py:class:`~PIL.Image.Image` + """ + + image1.load() + image2.load() + return image1._new(image1.im.chop_xor(image2.im)) + + +def blend(image1: Image.Image, image2: Image.Image, alpha: float) -> Image.Image: + """Blend images using constant transparency weight. Alias for + :py:func:`PIL.Image.blend`. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return Image.blend(image1, image2, alpha) + + +def composite( + image1: Image.Image, image2: Image.Image, mask: Image.Image +) -> Image.Image: + """Create composite using transparency mask. Alias for + :py:func:`PIL.Image.composite`. + + :rtype: :py:class:`~PIL.Image.Image` + """ + + return Image.composite(image1, image2, mask) + + +def offset(image: Image.Image, xoffset: int, yoffset: int | None = None) -> Image.Image: + """Returns a copy of the image where data has been offset by the given + distances. Data wraps around the edges. If ``yoffset`` is omitted, it + is assumed to be equal to ``xoffset``. + + :param image: Input image. + :param xoffset: The horizontal distance. + :param yoffset: The vertical distance. If omitted, both + distances are set to the same value. + :rtype: :py:class:`~PIL.Image.Image` + """ + + if yoffset is None: + yoffset = xoffset + image.load() + return image._new(image.im.offset(xoffset, yoffset)) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageCms.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageCms.py new file mode 100644 index 000000000..513e28acf --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageCms.py @@ -0,0 +1,1076 @@ +# The Python Imaging Library. +# $Id$ + +# Optional color management support, based on Kevin Cazabon's PyCMS +# library. + +# Originally released under LGPL. Graciously donated to PIL in +# March 2009, for distribution under the standard PIL license + +# History: + +# 2009-03-08 fl Added to PIL. + +# Copyright (C) 2002-2003 Kevin Cazabon +# Copyright (c) 2009 by Fredrik Lundh +# Copyright (c) 2013 by Eric Soroos + +# See the README file for information on usage and redistribution. See +# below for the original description. +from __future__ import annotations + +import operator +import sys +from enum import IntEnum, IntFlag +from functools import reduce +from typing import Any, Literal, SupportsFloat, SupportsInt, Union + +from . import Image +from ._deprecate import deprecate +from ._typing import SupportsRead + +try: + from . import _imagingcms as core + + _CmsProfileCompatible = Union[ + str, SupportsRead[bytes], core.CmsProfile, "ImageCmsProfile" + ] +except ImportError as ex: + # Allow error import for doc purposes, but error out when accessing + # anything in core. + from ._util import DeferredError + + core = DeferredError.new(ex) + +_DESCRIPTION = """ +pyCMS + + a Python / PIL interface to the littleCMS ICC Color Management System + Copyright (C) 2002-2003 Kevin Cazabon + kevin@cazabon.com + https://www.cazabon.com + + pyCMS home page: https://www.cazabon.com/pyCMS + littleCMS home page: https://www.littlecms.com + (littleCMS is Copyright (C) 1998-2001 Marti Maria) + + Originally released under LGPL. Graciously donated to PIL in + March 2009, for distribution under the standard PIL license + + The pyCMS.py module provides a "clean" interface between Python/PIL and + pyCMSdll, taking care of some of the more complex handling of the direct + pyCMSdll functions, as well as error-checking and making sure that all + relevant data is kept together. + + While it is possible to call pyCMSdll functions directly, it's not highly + recommended. + + Version History: + + 1.0.0 pil Oct 2013 Port to LCMS 2. + + 0.1.0 pil mod March 10, 2009 + + Renamed display profile to proof profile. The proof + profile is the profile of the device that is being + simulated, not the profile of the device which is + actually used to display/print the final simulation + (that'd be the output profile) - also see LCMSAPI.txt + input colorspace -> using 'renderingIntent' -> proof + colorspace -> using 'proofRenderingIntent' -> output + colorspace + + Added LCMS FLAGS support. + Added FLAGS["SOFTPROOFING"] as default flag for + buildProofTransform (otherwise the proof profile/intent + would be ignored). + + 0.1.0 pil March 2009 - added to PIL, as PIL.ImageCms + + 0.0.2 alpha Jan 6, 2002 + + Added try/except statements around type() checks of + potential CObjects... Python won't let you use type() + on them, and raises a TypeError (stupid, if you ask + me!) + + Added buildProofTransformFromOpenProfiles() function. + Additional fixes in DLL, see DLL code for details. + + 0.0.1 alpha first public release, Dec. 26, 2002 + + Known to-do list with current version (of Python interface, not pyCMSdll): + + none + +""" + +_VERSION = "1.0.0 pil" + + +# --------------------------------------------------------------------. + + +# +# intent/direction values + + +class Intent(IntEnum): + PERCEPTUAL = 0 + RELATIVE_COLORIMETRIC = 1 + SATURATION = 2 + ABSOLUTE_COLORIMETRIC = 3 + + +class Direction(IntEnum): + INPUT = 0 + OUTPUT = 1 + PROOF = 2 + + +# +# flags + + +class Flags(IntFlag): + """Flags and documentation are taken from ``lcms2.h``.""" + + NONE = 0 + NOCACHE = 0x0040 + """Inhibit 1-pixel cache""" + NOOPTIMIZE = 0x0100 + """Inhibit optimizations""" + NULLTRANSFORM = 0x0200 + """Don't transform anyway""" + GAMUTCHECK = 0x1000 + """Out of Gamut alarm""" + SOFTPROOFING = 0x4000 + """Do softproofing""" + BLACKPOINTCOMPENSATION = 0x2000 + NOWHITEONWHITEFIXUP = 0x0004 + """Don't fix scum dot""" + HIGHRESPRECALC = 0x0400 + """Use more memory to give better accuracy""" + LOWRESPRECALC = 0x0800 + """Use less memory to minimize resources""" + # this should be 8BITS_DEVICELINK, but that is not a valid name in Python: + USE_8BITS_DEVICELINK = 0x0008 + """Create 8 bits devicelinks""" + GUESSDEVICECLASS = 0x0020 + """Guess device class (for ``transform2devicelink``)""" + KEEP_SEQUENCE = 0x0080 + """Keep profile sequence for devicelink creation""" + FORCE_CLUT = 0x0002 + """Force CLUT optimization""" + CLUT_POST_LINEARIZATION = 0x0001 + """create postlinearization tables if possible""" + CLUT_PRE_LINEARIZATION = 0x0010 + """create prelinearization tables if possible""" + NONEGATIVES = 0x8000 + """Prevent negative numbers in floating point transforms""" + COPY_ALPHA = 0x04000000 + """Alpha channels are copied on ``cmsDoTransform()``""" + NODEFAULTRESOURCEDEF = 0x01000000 + + _GRIDPOINTS_1 = 1 << 16 + _GRIDPOINTS_2 = 2 << 16 + _GRIDPOINTS_4 = 4 << 16 + _GRIDPOINTS_8 = 8 << 16 + _GRIDPOINTS_16 = 16 << 16 + _GRIDPOINTS_32 = 32 << 16 + _GRIDPOINTS_64 = 64 << 16 + _GRIDPOINTS_128 = 128 << 16 + + @staticmethod + def GRIDPOINTS(n: int) -> Flags: + """ + Fine-tune control over number of gridpoints + + :param n: :py:class:`int` in range ``0 <= n <= 255`` + """ + return Flags.NONE | ((n & 0xFF) << 16) + + +_MAX_FLAG = reduce(operator.or_, Flags) + + +_FLAGS = { + "MATRIXINPUT": 1, + "MATRIXOUTPUT": 2, + "MATRIXONLY": (1 | 2), + "NOWHITEONWHITEFIXUP": 4, # Don't hot fix scum dot + # Don't create prelinearization tables on precalculated transforms + # (internal use): + "NOPRELINEARIZATION": 16, + "GUESSDEVICECLASS": 32, # Guess device class (for transform2devicelink) + "NOTCACHE": 64, # Inhibit 1-pixel cache + "NOTPRECALC": 256, + "NULLTRANSFORM": 512, # Don't transform anyway + "HIGHRESPRECALC": 1024, # Use more memory to give better accuracy + "LOWRESPRECALC": 2048, # Use less memory to minimize resources + "WHITEBLACKCOMPENSATION": 8192, + "BLACKPOINTCOMPENSATION": 8192, + "GAMUTCHECK": 4096, # Out of Gamut alarm + "SOFTPROOFING": 16384, # Do softproofing + "PRESERVEBLACK": 32768, # Black preservation + "NODEFAULTRESOURCEDEF": 16777216, # CRD special + "GRIDPOINTS": lambda n: (n & 0xFF) << 16, # Gridpoints +} + + +# --------------------------------------------------------------------. +# Experimental PIL-level API +# --------------------------------------------------------------------. + +## +# Profile. + + +class ImageCmsProfile: + def __init__(self, profile: str | SupportsRead[bytes] | core.CmsProfile) -> None: + """ + :param profile: Either a string representing a filename, + a file like object containing a profile or a + low-level profile object + + """ + self.filename: str | None = None + + if isinstance(profile, str): + if sys.platform == "win32": + profile_bytes_path = profile.encode() + try: + profile_bytes_path.decode("ascii") + except UnicodeDecodeError: + with open(profile, "rb") as f: + self.profile = core.profile_frombytes(f.read()) + return + self.filename = profile + self.profile = core.profile_open(profile) + elif hasattr(profile, "read"): + self.profile = core.profile_frombytes(profile.read()) + elif isinstance(profile, core.CmsProfile): + self.profile = profile + else: + msg = "Invalid type for Profile" # type: ignore[unreachable] + raise TypeError(msg) + + def __getattr__(self, name: str) -> Any: + if name in ("product_name", "product_info"): + deprecate(f"ImageCms.ImageCmsProfile.{name}", 13) + return None + msg = f"'{self.__class__.__name__}' object has no attribute '{name}'" + raise AttributeError(msg) + + def tobytes(self) -> bytes: + """ + Returns the profile in a format suitable for embedding in + saved images. + + :returns: a bytes object containing the ICC profile. + """ + + return core.profile_tobytes(self.profile) + + +class ImageCmsTransform(Image.ImagePointHandler): + """ + Transform. This can be used with the procedural API, or with the standard + :py:func:`~PIL.Image.Image.point` method. + + Will return the output profile in the ``output.info['icc_profile']``. + """ + + def __init__( + self, + input: ImageCmsProfile, + output: ImageCmsProfile, + input_mode: str, + output_mode: str, + intent: Intent = Intent.PERCEPTUAL, + proof: ImageCmsProfile | None = None, + proof_intent: Intent = Intent.ABSOLUTE_COLORIMETRIC, + flags: Flags = Flags.NONE, + ): + if proof is None: + self.transform = core.buildTransform( + input.profile, output.profile, input_mode, output_mode, intent, flags + ) + else: + self.transform = core.buildProofTransform( + input.profile, + output.profile, + proof.profile, + input_mode, + output_mode, + intent, + proof_intent, + flags, + ) + # Note: inputMode and outputMode are for pyCMS compatibility only + self.input_mode = self.inputMode = input_mode + self.output_mode = self.outputMode = output_mode + + self.output_profile = output + + def point(self, im: Image.Image) -> Image.Image: + return self.apply(im) + + def apply(self, im: Image.Image, imOut: Image.Image | None = None) -> Image.Image: + if imOut is None: + imOut = Image.new(self.output_mode, im.size, None) + self.transform.apply(im.getim(), imOut.getim()) + imOut.info["icc_profile"] = self.output_profile.tobytes() + return imOut + + def apply_in_place(self, im: Image.Image) -> Image.Image: + if im.mode != self.output_mode: + msg = "mode mismatch" + raise ValueError(msg) # wrong output mode + self.transform.apply(im.getim(), im.getim()) + im.info["icc_profile"] = self.output_profile.tobytes() + return im + + +def get_display_profile(handle: SupportsInt | None = None) -> ImageCmsProfile | None: + """ + (experimental) Fetches the profile for the current display device. + + :returns: ``None`` if the profile is not known. + """ + + if sys.platform != "win32": + return None + + from . import ImageWin # type: ignore[unused-ignore, unreachable] + + if isinstance(handle, ImageWin.HDC): + profile = core.get_display_profile_win32(int(handle), 1) + else: + profile = core.get_display_profile_win32(int(handle or 0)) + if profile is None: + return None + return ImageCmsProfile(profile) + + +# --------------------------------------------------------------------. +# pyCMS compatible layer +# --------------------------------------------------------------------. + + +class PyCMSError(Exception): + """(pyCMS) Exception class. + This is used for all errors in the pyCMS API.""" + + pass + + +def profileToProfile( + im: Image.Image, + inputProfile: _CmsProfileCompatible, + outputProfile: _CmsProfileCompatible, + renderingIntent: Intent = Intent.PERCEPTUAL, + outputMode: str | None = None, + inPlace: bool = False, + flags: Flags = Flags.NONE, +) -> Image.Image | None: + """ + (pyCMS) Applies an ICC transformation to a given image, mapping from + ``inputProfile`` to ``outputProfile``. + + If the input or output profiles specified are not valid filenames, a + :exc:`PyCMSError` will be raised. If ``inPlace`` is ``True`` and + ``outputMode != im.mode``, a :exc:`PyCMSError` will be raised. + If an error occurs during application of the profiles, + a :exc:`PyCMSError` will be raised. + If ``outputMode`` is not a mode supported by the ``outputProfile`` (or by pyCMS), + a :exc:`PyCMSError` will be raised. + + This function applies an ICC transformation to im from ``inputProfile``'s + color space to ``outputProfile``'s color space using the specified rendering + intent to decide how to handle out-of-gamut colors. + + ``outputMode`` can be used to specify that a color mode conversion is to + be done using these profiles, but the specified profiles must be able + to handle that mode. I.e., if converting im from RGB to CMYK using + profiles, the input profile must handle RGB data, and the output + profile must handle CMYK data. + + :param im: An open :py:class:`~PIL.Image.Image` object (i.e. Image.new(...) + or Image.open(...), etc.) + :param inputProfile: String, as a valid filename path to the ICC input + profile you wish to use for this image, or a profile object + :param outputProfile: String, as a valid filename path to the ICC output + profile you wish to use for this image, or a profile object + :param renderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for the transform + + ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) + ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 + ImageCms.Intent.SATURATION = 2 + ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param outputMode: A valid PIL mode for the output image (i.e. "RGB", + "CMYK", etc.). Note: if rendering the image "inPlace", outputMode + MUST be the same mode as the input, or omitted completely. If + omitted, the outputMode will be the same as the mode of the input + image (im.mode) + :param inPlace: Boolean. If ``True``, the original image is modified in-place, + and ``None`` is returned. If ``False`` (default), a new + :py:class:`~PIL.Image.Image` object is returned with the transform applied. + :param flags: Integer (0-...) specifying additional flags + :returns: Either None or a new :py:class:`~PIL.Image.Image` object, depending on + the value of ``inPlace`` + :exception PyCMSError: + """ + + if outputMode is None: + outputMode = im.mode + + if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): + msg = "renderingIntent must be an integer between 0 and 3" + raise PyCMSError(msg) + + if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): + msg = f"flags must be an integer between 0 and {_MAX_FLAG}" + raise PyCMSError(msg) + + try: + if not isinstance(inputProfile, ImageCmsProfile): + inputProfile = ImageCmsProfile(inputProfile) + if not isinstance(outputProfile, ImageCmsProfile): + outputProfile = ImageCmsProfile(outputProfile) + transform = ImageCmsTransform( + inputProfile, + outputProfile, + im.mode, + outputMode, + renderingIntent, + flags=flags, + ) + if inPlace: + transform.apply_in_place(im) + imOut = None + else: + imOut = transform.apply(im) + except (OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + return imOut + + +def getOpenProfile( + profileFilename: str | SupportsRead[bytes] | core.CmsProfile, +) -> ImageCmsProfile: + """ + (pyCMS) Opens an ICC profile file. + + The PyCMSProfile object can be passed back into pyCMS for use in creating + transforms and such (as in ImageCms.buildTransformFromOpenProfiles()). + + If ``profileFilename`` is not a valid filename for an ICC profile, + a :exc:`PyCMSError` will be raised. + + :param profileFilename: String, as a valid filename path to the ICC profile + you wish to open, or a file-like object. + :returns: A CmsProfile class object. + :exception PyCMSError: + """ + + try: + return ImageCmsProfile(profileFilename) + except (OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def buildTransform( + inputProfile: _CmsProfileCompatible, + outputProfile: _CmsProfileCompatible, + inMode: str, + outMode: str, + renderingIntent: Intent = Intent.PERCEPTUAL, + flags: Flags = Flags.NONE, +) -> ImageCmsTransform: + """ + (pyCMS) Builds an ICC transform mapping from the ``inputProfile`` to the + ``outputProfile``. Use applyTransform to apply the transform to a given + image. + + If the input or output profiles specified are not valid filenames, a + :exc:`PyCMSError` will be raised. If an error occurs during creation + of the transform, a :exc:`PyCMSError` will be raised. + + If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` + (or by pyCMS), a :exc:`PyCMSError` will be raised. + + This function builds and returns an ICC transform from the ``inputProfile`` + to the ``outputProfile`` using the ``renderingIntent`` to determine what to do + with out-of-gamut colors. It will ONLY work for converting images that + are in ``inMode`` to images that are in ``outMode`` color format (PIL mode, + i.e. "RGB", "RGBA", "CMYK", etc.). + + Building the transform is a fair part of the overhead in + ImageCms.profileToProfile(), so if you're planning on converting multiple + images using the same input/output settings, this can save you time. + Once you have a transform object, it can be used with + ImageCms.applyProfile() to convert images without the need to re-compute + the lookup table for the transform. + + The reason pyCMS returns a class object rather than a handle directly + to the transform is that it needs to keep track of the PIL input/output + modes that the transform is meant for. These attributes are stored in + the ``inMode`` and ``outMode`` attributes of the object (which can be + manually overridden if you really want to, but I don't know of any + time that would be of use, or would even work). + + :param inputProfile: String, as a valid filename path to the ICC input + profile you wish to use for this transform, or a profile object + :param outputProfile: String, as a valid filename path to the ICC output + profile you wish to use for this transform, or a profile object + :param inMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param outMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param renderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for the transform + + ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) + ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 + ImageCms.Intent.SATURATION = 2 + ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param flags: Integer (0-...) specifying additional flags + :returns: A CmsTransform class object. + :exception PyCMSError: + """ + + if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): + msg = "renderingIntent must be an integer between 0 and 3" + raise PyCMSError(msg) + + if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): + msg = f"flags must be an integer between 0 and {_MAX_FLAG}" + raise PyCMSError(msg) + + try: + if not isinstance(inputProfile, ImageCmsProfile): + inputProfile = ImageCmsProfile(inputProfile) + if not isinstance(outputProfile, ImageCmsProfile): + outputProfile = ImageCmsProfile(outputProfile) + return ImageCmsTransform( + inputProfile, outputProfile, inMode, outMode, renderingIntent, flags=flags + ) + except (OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def buildProofTransform( + inputProfile: _CmsProfileCompatible, + outputProfile: _CmsProfileCompatible, + proofProfile: _CmsProfileCompatible, + inMode: str, + outMode: str, + renderingIntent: Intent = Intent.PERCEPTUAL, + proofRenderingIntent: Intent = Intent.ABSOLUTE_COLORIMETRIC, + flags: Flags = Flags.SOFTPROOFING, +) -> ImageCmsTransform: + """ + (pyCMS) Builds an ICC transform mapping from the ``inputProfile`` to the + ``outputProfile``, but tries to simulate the result that would be + obtained on the ``proofProfile`` device. + + If the input, output, or proof profiles specified are not valid + filenames, a :exc:`PyCMSError` will be raised. + + If an error occurs during creation of the transform, + a :exc:`PyCMSError` will be raised. + + If ``inMode`` or ``outMode`` are not a mode supported by the ``outputProfile`` + (or by pyCMS), a :exc:`PyCMSError` will be raised. + + This function builds and returns an ICC transform from the ``inputProfile`` + to the ``outputProfile``, but tries to simulate the result that would be + obtained on the ``proofProfile`` device using ``renderingIntent`` and + ``proofRenderingIntent`` to determine what to do with out-of-gamut + colors. This is known as "soft-proofing". It will ONLY work for + converting images that are in ``inMode`` to images that are in outMode + color format (PIL mode, i.e. "RGB", "RGBA", "CMYK", etc.). + + Usage of the resulting transform object is exactly the same as with + ImageCms.buildTransform(). + + Proof profiling is generally used when using an output device to get a + good idea of what the final printed/displayed image would look like on + the ``proofProfile`` device when it's quicker and easier to use the + output device for judging color. Generally, this means that the + output device is a monitor, or a dye-sub printer (etc.), and the simulated + device is something more expensive, complicated, or time consuming + (making it difficult to make a real print for color judgement purposes). + + Soft-proofing basically functions by adjusting the colors on the + output device to match the colors of the device being simulated. However, + when the simulated device has a much wider gamut than the output + device, you may obtain marginal results. + + :param inputProfile: String, as a valid filename path to the ICC input + profile you wish to use for this transform, or a profile object + :param outputProfile: String, as a valid filename path to the ICC output + (monitor, usually) profile you wish to use for this transform, or a + profile object + :param proofProfile: String, as a valid filename path to the ICC proof + profile you wish to use for this transform, or a profile object + :param inMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param outMode: String, as a valid PIL mode that the appropriate profile + also supports (i.e. "RGB", "RGBA", "CMYK", etc.) + :param renderingIntent: Integer (0-3) specifying the rendering intent you + wish to use for the input->proof (simulated) transform + + ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) + ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 + ImageCms.Intent.SATURATION = 2 + ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param proofRenderingIntent: Integer (0-3) specifying the rendering intent + you wish to use for proof->output transform + + ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) + ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 + ImageCms.Intent.SATURATION = 2 + ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param flags: Integer (0-...) specifying additional flags + :returns: A CmsTransform class object. + :exception PyCMSError: + """ + + if not isinstance(renderingIntent, int) or not (0 <= renderingIntent <= 3): + msg = "renderingIntent must be an integer between 0 and 3" + raise PyCMSError(msg) + + if not isinstance(flags, int) or not (0 <= flags <= _MAX_FLAG): + msg = f"flags must be an integer between 0 and {_MAX_FLAG}" + raise PyCMSError(msg) + + try: + if not isinstance(inputProfile, ImageCmsProfile): + inputProfile = ImageCmsProfile(inputProfile) + if not isinstance(outputProfile, ImageCmsProfile): + outputProfile = ImageCmsProfile(outputProfile) + if not isinstance(proofProfile, ImageCmsProfile): + proofProfile = ImageCmsProfile(proofProfile) + return ImageCmsTransform( + inputProfile, + outputProfile, + inMode, + outMode, + renderingIntent, + proofProfile, + proofRenderingIntent, + flags, + ) + except (OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +buildTransformFromOpenProfiles = buildTransform +buildProofTransformFromOpenProfiles = buildProofTransform + + +def applyTransform( + im: Image.Image, transform: ImageCmsTransform, inPlace: bool = False +) -> Image.Image | None: + """ + (pyCMS) Applies a transform to a given image. + + If ``im.mode != transform.input_mode``, a :exc:`PyCMSError` is raised. + + If ``inPlace`` is ``True`` and ``transform.input_mode != transform.output_mode``, a + :exc:`PyCMSError` is raised. + + If ``im.mode``, ``transform.input_mode`` or ``transform.output_mode`` is not + supported by pyCMSdll or the profiles you used for the transform, a + :exc:`PyCMSError` is raised. + + If an error occurs while the transform is being applied, + a :exc:`PyCMSError` is raised. + + This function applies a pre-calculated transform (from + ImageCms.buildTransform() or ImageCms.buildTransformFromOpenProfiles()) + to an image. The transform can be used for multiple images, saving + considerable calculation time if doing the same conversion multiple times. + + If you want to modify im in-place instead of receiving a new image as + the return value, set ``inPlace`` to ``True``. This can only be done if + ``transform.input_mode`` and ``transform.output_mode`` are the same, because we + can't change the mode in-place (the buffer sizes for some modes are + different). The default behavior is to return a new :py:class:`~PIL.Image.Image` + object of the same dimensions in mode ``transform.output_mode``. + + :param im: An :py:class:`~PIL.Image.Image` object, and ``im.mode`` must be the same + as the ``input_mode`` supported by the transform. + :param transform: A valid CmsTransform class object + :param inPlace: Bool. If ``True``, ``im`` is modified in place and ``None`` is + returned, if ``False``, a new :py:class:`~PIL.Image.Image` object with the + transform applied is returned (and ``im`` is not changed). The default is + ``False``. + :returns: Either ``None``, or a new :py:class:`~PIL.Image.Image` object, + depending on the value of ``inPlace``. The profile will be returned in + the image's ``info['icc_profile']``. + :exception PyCMSError: + """ + + try: + if inPlace: + transform.apply_in_place(im) + imOut = None + else: + imOut = transform.apply(im) + except (TypeError, ValueError) as v: + raise PyCMSError(v) from v + + return imOut + + +def createProfile( + colorSpace: Literal["LAB", "XYZ", "sRGB"], colorTemp: SupportsFloat = 0 +) -> core.CmsProfile: + """ + (pyCMS) Creates a profile. + + If colorSpace not in ``["LAB", "XYZ", "sRGB"]``, + a :exc:`PyCMSError` is raised. + + If using LAB and ``colorTemp`` is not a positive integer, + a :exc:`PyCMSError` is raised. + + If an error occurs while creating the profile, + a :exc:`PyCMSError` is raised. + + Use this function to create common profiles on-the-fly instead of + having to supply a profile on disk and knowing the path to it. It + returns a normal CmsProfile object that can be passed to + ImageCms.buildTransformFromOpenProfiles() to create a transform to apply + to images. + + :param colorSpace: String, the color space of the profile you wish to + create. + Currently only "LAB", "XYZ", and "sRGB" are supported. + :param colorTemp: Positive number for the white point for the profile, in + degrees Kelvin (i.e. 5000, 6500, 9600, etc.). The default is for D50 + illuminant if omitted (5000k). colorTemp is ONLY applied to LAB + profiles, and is ignored for XYZ and sRGB. + :returns: A CmsProfile class object + :exception PyCMSError: + """ + + if colorSpace not in ["LAB", "XYZ", "sRGB"]: + msg = ( + f"Color space not supported for on-the-fly profile creation ({colorSpace})" + ) + raise PyCMSError(msg) + + if colorSpace == "LAB": + try: + colorTemp = float(colorTemp) + except (TypeError, ValueError) as e: + msg = f'Color temperature must be numeric, "{colorTemp}" not valid' + raise PyCMSError(msg) from e + + try: + return core.createProfile(colorSpace, colorTemp) + except (TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileName(profile: _CmsProfileCompatible) -> str: + """ + + (pyCMS) Gets the internal product name for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, + a :exc:`PyCMSError` is raised If an error occurs while trying + to obtain the name tag, a :exc:`PyCMSError` is raised. + + Use this function to obtain the INTERNAL name of the profile (stored + in an ICC tag in the profile itself), usually the one used when the + profile was originally created. Sometimes this tag also contains + additional information supplied by the creator. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal name of the profile as stored + in an ICC tag. + :exception PyCMSError: + """ + + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + # do it in python, not c. + # // name was "%s - %s" (model, manufacturer) || Description , + # // but if the Model and Manufacturer were the same or the model + # // was long, Just the model, in 1.x + model = profile.profile.model + manufacturer = profile.profile.manufacturer + + if not (model or manufacturer): + return (profile.profile.profile_description or "") + "\n" + if not manufacturer or (model and len(model) > 30): + return f"{model}\n" + return f"{model} - {manufacturer}\n" + + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileInfo(profile: _CmsProfileCompatible) -> str: + """ + (pyCMS) Gets the internal product information for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, + a :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the info tag, + a :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + info tag. This often contains details about the profile, and how it + was created, as supplied by the creator. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + + try: + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + # add an extra newline to preserve pyCMS compatibility + # Python, not C. the white point bits weren't working well, + # so skipping. + # info was description \r\n\r\n copyright \r\n\r\n K007 tag \r\n\r\n whitepoint + description = profile.profile.profile_description + cpright = profile.profile.copyright + elements = [element for element in (description, cpright) if element] + return "\r\n\r\n".join(elements) + "\r\n\r\n" + + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileCopyright(profile: _CmsProfileCompatible) -> str: + """ + (pyCMS) Gets the copyright for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the copyright tag, + a :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + copyright tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return (profile.profile.copyright or "") + "\n" + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileManufacturer(profile: _CmsProfileCompatible) -> str: + """ + (pyCMS) Gets the manufacturer for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the manufacturer tag, a + :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + manufacturer tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return (profile.profile.manufacturer or "") + "\n" + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileModel(profile: _CmsProfileCompatible) -> str: + """ + (pyCMS) Gets the model for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the model tag, + a :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + model tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in + an ICC tag. + :exception PyCMSError: + """ + + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return (profile.profile.model or "") + "\n" + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getProfileDescription(profile: _CmsProfileCompatible) -> str: + """ + (pyCMS) Gets the description for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the description tag, + a :exc:`PyCMSError` is raised. + + Use this function to obtain the information stored in the profile's + description tag. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: A string containing the internal profile information stored in an + ICC tag. + :exception PyCMSError: + """ + + try: + # add an extra newline to preserve pyCMS compatibility + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return (profile.profile.profile_description or "") + "\n" + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def getDefaultIntent(profile: _CmsProfileCompatible) -> int: + """ + (pyCMS) Gets the default intent name for the given profile. + + If ``profile`` isn't a valid CmsProfile object or filename to a profile, a + :exc:`PyCMSError` is raised. + + If an error occurs while trying to obtain the default intent, a + :exc:`PyCMSError` is raised. + + Use this function to determine the default (and usually best optimized) + rendering intent for this profile. Most profiles support multiple + rendering intents, but are intended mostly for one type of conversion. + If you wish to use a different intent than returned, use + ImageCms.isIntentSupported() to verify it will work first. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :returns: Integer 0-3 specifying the default rendering intent for this + profile. + + ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) + ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 + ImageCms.Intent.SATURATION = 2 + ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :exception PyCMSError: + """ + + try: + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + return profile.profile.rendering_intent + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v + + +def isIntentSupported( + profile: _CmsProfileCompatible, intent: Intent, direction: Direction +) -> Literal[-1, 1]: + """ + (pyCMS) Checks if a given intent is supported. + + Use this function to verify that you can use your desired + ``intent`` with ``profile``, and that ``profile`` can be used for the + input/output/proof profile as you desire. + + Some profiles are created specifically for one "direction", can cannot + be used for others. Some profiles can only be used for certain + rendering intents, so it's best to either verify this before trying + to create a transform with them (using this function), or catch the + potential :exc:`PyCMSError` that will occur if they don't + support the modes you select. + + :param profile: EITHER a valid CmsProfile object, OR a string of the + filename of an ICC profile. + :param intent: Integer (0-3) specifying the rendering intent you wish to + use with this profile + + ImageCms.Intent.PERCEPTUAL = 0 (DEFAULT) + ImageCms.Intent.RELATIVE_COLORIMETRIC = 1 + ImageCms.Intent.SATURATION = 2 + ImageCms.Intent.ABSOLUTE_COLORIMETRIC = 3 + + see the pyCMS documentation for details on rendering intents and what + they do. + :param direction: Integer specifying if the profile is to be used for + input, output, or proof + + INPUT = 0 (or use ImageCms.Direction.INPUT) + OUTPUT = 1 (or use ImageCms.Direction.OUTPUT) + PROOF = 2 (or use ImageCms.Direction.PROOF) + + :returns: 1 if the intent/direction are supported, -1 if they are not. + :exception PyCMSError: + """ + + try: + if not isinstance(profile, ImageCmsProfile): + profile = ImageCmsProfile(profile) + # FIXME: I get different results for the same data w. different + # compilers. Bug in LittleCMS or in the binding? + if profile.profile.is_intent_supported(intent, direction): + return 1 + else: + return -1 + except (AttributeError, OSError, TypeError, ValueError) as v: + raise PyCMSError(v) from v diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageColor.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageColor.py new file mode 100644 index 000000000..9a15a8eb7 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageColor.py @@ -0,0 +1,320 @@ +# +# The Python Imaging Library +# $Id$ +# +# map CSS3-style colour description strings to RGB +# +# History: +# 2002-10-24 fl Added support for CSS-style color strings +# 2002-12-15 fl Added RGBA support +# 2004-03-27 fl Fixed remaining int() problems for Python 1.5.2 +# 2004-07-19 fl Fixed gray/grey spelling issues +# 2009-03-05 fl Fixed rounding error in grayscale calculation +# +# Copyright (c) 2002-2004 by Secret Labs AB +# Copyright (c) 2002-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import re +from functools import lru_cache + +from . import Image + + +@lru_cache +def getrgb(color: str) -> tuple[int, int, int] | tuple[int, int, int, int]: + """ + Convert a color string to an RGB or RGBA tuple. If the string cannot be + parsed, this function raises a :py:exc:`ValueError` exception. + + .. versionadded:: 1.1.4 + + :param color: A color string + :return: ``(red, green, blue[, alpha])`` + """ + if len(color) > 100: + msg = "color specifier is too long" + raise ValueError(msg) + color = color.lower() + + rgb = colormap.get(color, None) + if rgb: + if isinstance(rgb, tuple): + return rgb + rgb_tuple = getrgb(rgb) + assert len(rgb_tuple) == 3 + colormap[color] = rgb_tuple + return rgb_tuple + + # check for known string formats + if re.match("#[a-f0-9]{3}$", color): + return int(color[1] * 2, 16), int(color[2] * 2, 16), int(color[3] * 2, 16) + + if re.match("#[a-f0-9]{4}$", color): + return ( + int(color[1] * 2, 16), + int(color[2] * 2, 16), + int(color[3] * 2, 16), + int(color[4] * 2, 16), + ) + + if re.match("#[a-f0-9]{6}$", color): + return int(color[1:3], 16), int(color[3:5], 16), int(color[5:7], 16) + + if re.match("#[a-f0-9]{8}$", color): + return ( + int(color[1:3], 16), + int(color[3:5], 16), + int(color[5:7], 16), + int(color[7:9], 16), + ) + + m = re.match(r"rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) + if m: + return int(m.group(1)), int(m.group(2)), int(m.group(3)) + + m = re.match(r"rgb\(\s*(\d+)%\s*,\s*(\d+)%\s*,\s*(\d+)%\s*\)$", color) + if m: + return ( + int((int(m.group(1)) * 255) / 100.0 + 0.5), + int((int(m.group(2)) * 255) / 100.0 + 0.5), + int((int(m.group(3)) * 255) / 100.0 + 0.5), + ) + + m = re.match( + r"hsl\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color + ) + if m: + from colorsys import hls_to_rgb + + rgb_floats = hls_to_rgb( + float(m.group(1)) / 360.0, + float(m.group(3)) / 100.0, + float(m.group(2)) / 100.0, + ) + return ( + int(rgb_floats[0] * 255 + 0.5), + int(rgb_floats[1] * 255 + 0.5), + int(rgb_floats[2] * 255 + 0.5), + ) + + m = re.match( + r"hs[bv]\(\s*(\d+\.?\d*)\s*,\s*(\d+\.?\d*)%\s*,\s*(\d+\.?\d*)%\s*\)$", color + ) + if m: + from colorsys import hsv_to_rgb + + rgb_floats = hsv_to_rgb( + float(m.group(1)) / 360.0, + float(m.group(2)) / 100.0, + float(m.group(3)) / 100.0, + ) + return ( + int(rgb_floats[0] * 255 + 0.5), + int(rgb_floats[1] * 255 + 0.5), + int(rgb_floats[2] * 255 + 0.5), + ) + + m = re.match(r"rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)$", color) + if m: + return int(m.group(1)), int(m.group(2)), int(m.group(3)), int(m.group(4)) + msg = f"unknown color specifier: {repr(color)}" + raise ValueError(msg) + + +@lru_cache +def getcolor(color: str, mode: str) -> int | tuple[int, ...]: + """ + Same as :py:func:`~PIL.ImageColor.getrgb` for most modes. However, if + ``mode`` is HSV, converts the RGB value to a HSV value, or if ``mode`` is + not color or a palette image, converts the RGB value to a grayscale value. + If the string cannot be parsed, this function raises a :py:exc:`ValueError` + exception. + + .. versionadded:: 1.1.4 + + :param color: A color string + :param mode: Convert result to this mode + :return: ``graylevel, (graylevel, alpha) or (red, green, blue[, alpha])`` + """ + # same as getrgb, but converts the result to the given mode + rgb, alpha = getrgb(color), 255 + if len(rgb) == 4: + alpha = rgb[3] + rgb = rgb[:3] + + if mode == "HSV": + from colorsys import rgb_to_hsv + + r, g, b = rgb + h, s, v = rgb_to_hsv(r / 255, g / 255, b / 255) + return int(h * 255), int(s * 255), int(v * 255) + elif Image.getmodebase(mode) == "L": + r, g, b = rgb + # ITU-R Recommendation 601-2 for nonlinear RGB + # scaled to 24 bits to match the convert's implementation. + graylevel = (r * 19595 + g * 38470 + b * 7471 + 0x8000) >> 16 + if mode[-1] == "A": + return graylevel, alpha + return graylevel + elif mode[-1] == "A": + return rgb + (alpha,) + return rgb + + +colormap: dict[str, str | tuple[int, int, int]] = { + # X11 colour table from https://drafts.csswg.org/css-color-4/, with + # gray/grey spelling issues fixed. This is a superset of HTML 4.0 + # colour names used in CSS 1. + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgrey": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkslategrey": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dimgrey": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "grey": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgreen": "#90ee90", + "lightgray": "#d3d3d3", + "lightgrey": "#d3d3d3", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightslategrey": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370db", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#db7093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "rebeccapurple": "#663399", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "slategrey": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32", +} diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageDraw.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageDraw.py new file mode 100644 index 000000000..9b0864d1a --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageDraw.py @@ -0,0 +1,1035 @@ +# +# The Python Imaging Library +# $Id$ +# +# drawing interface operations +# +# History: +# 1996-04-13 fl Created (experimental) +# 1996-08-07 fl Filled polygons, ellipses. +# 1996-08-13 fl Added text support +# 1998-06-28 fl Handle I and F images +# 1998-12-29 fl Added arc; use arc primitive to draw ellipses +# 1999-01-10 fl Added shape stuff (experimental) +# 1999-02-06 fl Added bitmap support +# 1999-02-11 fl Changed all primitives to take options +# 1999-02-20 fl Fixed backwards compatibility +# 2000-10-12 fl Copy on write, when necessary +# 2001-02-18 fl Use default ink for bitmap/text also in fill mode +# 2002-10-24 fl Added support for CSS-style color strings +# 2002-12-10 fl Added experimental support for RGBA-on-RGB drawing +# 2002-12-11 fl Refactored low-level drawing API (work in progress) +# 2004-08-26 fl Made Draw() a factory function, added getdraw() support +# 2004-09-04 fl Added width support to line primitive +# 2004-09-10 fl Added font mode handling +# 2006-06-19 fl Added font bearing support (getmask2) +# +# Copyright (c) 1997-2006 by Secret Labs AB +# Copyright (c) 1996-2006 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import math +import struct +from collections.abc import Sequence +from typing import cast + +from . import Image, ImageColor, ImageText + +TYPE_CHECKING = False +if TYPE_CHECKING: + from collections.abc import Callable + from types import ModuleType + from typing import Any, AnyStr + + from . import ImageDraw2, ImageFont + from ._typing import Coords, _Ink + +# experimental access to the outline API +Outline: Callable[[], Image.core._Outline] = Image.core.outline + +""" +A simple 2D drawing interface for PIL images. +

+Application code should use the Draw factory, instead of +directly. +""" + + +class ImageDraw: + font: ( + ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont | None + ) = None + + def __init__(self, im: Image.Image, mode: str | None = None) -> None: + """ + Create a drawing instance. + + :param im: The image to draw in. + :param mode: Optional mode to use for color values. For RGB + images, this argument can be RGB or RGBA (to blend the + drawing into the image). For all other modes, this argument + must be the same as the image mode. If omitted, the mode + defaults to the mode of the image. + """ + im._ensure_mutable() + blend = 0 + if mode is None: + mode = im.mode + if mode != im.mode: + if mode == "RGBA" and im.mode == "RGB": + blend = 1 + else: + msg = "mode mismatch" + raise ValueError(msg) + if mode == "P": + self.palette = im.palette + else: + self.palette = None + self._image = im + self.im = im.im + self.draw = Image.core.draw(self.im, blend) + self.mode = mode + if mode in ("I", "F"): + self.ink = self.draw.draw_ink(1) + else: + self.ink = self.draw.draw_ink(-1) + if mode in ("1", "P", "I", "F"): + # FIXME: fix Fill2 to properly support matte for I+F images + self.fontmode = "1" + else: + self.fontmode = "L" # aliasing is okay for other modes + self.fill = False + + def getfont( + self, + ) -> ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont: + """ + Get the current default font. + + To set the default font for this ImageDraw instance:: + + from PIL import ImageDraw, ImageFont + draw.font = ImageFont.truetype("Tests/fonts/FreeMono.ttf") + + To set the default font for all future ImageDraw instances:: + + from PIL import ImageDraw, ImageFont + ImageDraw.ImageDraw.font = ImageFont.truetype("Tests/fonts/FreeMono.ttf") + + If the current default font is ``None``, + it is initialized with ``ImageFont.load_default()``. + + :returns: An image font.""" + if not self.font: + # FIXME: should add a font repository + from . import ImageFont + + self.font = ImageFont.load_default() + return self.font + + def _getfont( + self, font_size: float | None + ) -> ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont: + if font_size is not None: + from . import ImageFont + + return ImageFont.load_default(font_size) + else: + return self.getfont() + + def _getink( + self, ink: _Ink | None, fill: _Ink | None = None + ) -> tuple[int | None, int | None]: + result_ink = None + result_fill = None + if ink is None and fill is None: + if self.fill: + result_fill = self.ink + else: + result_ink = self.ink + else: + if ink is not None: + if isinstance(ink, str): + ink = ImageColor.getcolor(ink, self.mode) + if self.palette and isinstance(ink, tuple): + ink = self.palette.getcolor(ink, self._image) + result_ink = self.draw.draw_ink(ink) + if fill is not None: + if isinstance(fill, str): + fill = ImageColor.getcolor(fill, self.mode) + if self.palette and isinstance(fill, tuple): + fill = self.palette.getcolor(fill, self._image) + result_fill = self.draw.draw_ink(fill) + return result_ink, result_fill + + def arc( + self, + xy: Coords, + start: float, + end: float, + fill: _Ink | None = None, + width: int = 1, + ) -> None: + """Draw an arc.""" + ink, fill = self._getink(fill) + if ink is not None: + self.draw.draw_arc(xy, start, end, ink, width) + + def bitmap( + self, xy: Sequence[int], bitmap: Image.Image, fill: _Ink | None = None + ) -> None: + """Draw a bitmap.""" + bitmap.load() + ink, fill = self._getink(fill) + if ink is None: + ink = fill + if ink is not None: + self.draw.draw_bitmap(xy, bitmap.im, ink) + + def chord( + self, + xy: Coords, + start: float, + end: float, + fill: _Ink | None = None, + outline: _Ink | None = None, + width: int = 1, + ) -> None: + """Draw a chord.""" + ink, fill_ink = self._getink(outline, fill) + if fill_ink is not None: + self.draw.draw_chord(xy, start, end, fill_ink, 1) + if ink is not None and ink != fill_ink and width != 0: + self.draw.draw_chord(xy, start, end, ink, 0, width) + + def ellipse( + self, + xy: Coords, + fill: _Ink | None = None, + outline: _Ink | None = None, + width: int = 1, + ) -> None: + """Draw an ellipse.""" + ink, fill_ink = self._getink(outline, fill) + if fill_ink is not None: + self.draw.draw_ellipse(xy, fill_ink, 1) + if ink is not None and ink != fill_ink and width != 0: + self.draw.draw_ellipse(xy, ink, 0, width) + + def circle( + self, + xy: Sequence[float], + radius: float, + fill: _Ink | None = None, + outline: _Ink | None = None, + width: int = 1, + ) -> None: + """Draw a circle given center coordinates and a radius.""" + ellipse_xy = (xy[0] - radius, xy[1] - radius, xy[0] + radius, xy[1] + radius) + self.ellipse(ellipse_xy, fill, outline, width) + + def line( + self, + xy: Coords, + fill: _Ink | None = None, + width: int = 0, + joint: str | None = None, + ) -> None: + """Draw a line, or a connected sequence of line segments.""" + ink = self._getink(fill)[0] + if ink is not None: + self.draw.draw_lines(xy, ink, width) + if joint == "curve" and width > 4: + points: Sequence[Sequence[float]] + if isinstance(xy[0], (list, tuple)): + points = cast(Sequence[Sequence[float]], xy) + else: + points = [ + cast(Sequence[float], tuple(xy[i : i + 2])) + for i in range(0, len(xy), 2) + ] + for i in range(1, len(points) - 1): + point = points[i] + angles = [ + math.degrees(math.atan2(end[0] - start[0], start[1] - end[1])) + % 360 + for start, end in ( + (points[i - 1], point), + (point, points[i + 1]), + ) + ] + if angles[0] == angles[1]: + # This is a straight line, so no joint is required + continue + + def coord_at_angle( + coord: Sequence[float], angle: float + ) -> tuple[float, ...]: + x, y = coord + angle -= 90 + distance = width / 2 - 1 + return tuple( + p + (math.floor(p_d) if p_d > 0 else math.ceil(p_d)) + for p, p_d in ( + (x, distance * math.cos(math.radians(angle))), + (y, distance * math.sin(math.radians(angle))), + ) + ) + + flipped = ( + angles[1] > angles[0] and angles[1] - 180 > angles[0] + ) or (angles[1] < angles[0] and angles[1] + 180 > angles[0]) + coords = [ + (point[0] - width / 2 + 1, point[1] - width / 2 + 1), + (point[0] + width / 2 - 1, point[1] + width / 2 - 1), + ] + if flipped: + start, end = (angles[1] + 90, angles[0] + 90) + else: + start, end = (angles[0] - 90, angles[1] - 90) + self.pieslice(coords, start - 90, end - 90, fill) + + if width > 8: + # Cover potential gaps between the line and the joint + if flipped: + gap_coords = [ + coord_at_angle(point, angles[0] + 90), + point, + coord_at_angle(point, angles[1] + 90), + ] + else: + gap_coords = [ + coord_at_angle(point, angles[0] - 90), + point, + coord_at_angle(point, angles[1] - 90), + ] + self.line(gap_coords, fill, width=3) + + def shape( + self, + shape: Image.core._Outline, + fill: _Ink | None = None, + outline: _Ink | None = None, + ) -> None: + """(Experimental) Draw a shape.""" + shape.close() + ink, fill_ink = self._getink(outline, fill) + if fill_ink is not None: + self.draw.draw_outline(shape, fill_ink, 1) + if ink is not None and ink != fill_ink: + self.draw.draw_outline(shape, ink, 0) + + def pieslice( + self, + xy: Coords, + start: float, + end: float, + fill: _Ink | None = None, + outline: _Ink | None = None, + width: int = 1, + ) -> None: + """Draw a pieslice.""" + ink, fill_ink = self._getink(outline, fill) + if fill_ink is not None: + self.draw.draw_pieslice(xy, start, end, fill_ink, 1) + if ink is not None and ink != fill_ink and width != 0: + self.draw.draw_pieslice(xy, start, end, ink, 0, width) + + def point(self, xy: Coords, fill: _Ink | None = None) -> None: + """Draw one or more individual pixels.""" + ink, fill = self._getink(fill) + if ink is not None: + self.draw.draw_points(xy, ink) + + def polygon( + self, + xy: Coords, + fill: _Ink | None = None, + outline: _Ink | None = None, + width: int = 1, + ) -> None: + """Draw a polygon.""" + ink, fill_ink = self._getink(outline, fill) + if fill_ink is not None: + self.draw.draw_polygon(xy, fill_ink, 1) + if ink is not None and ink != fill_ink and width != 0: + if width == 1: + self.draw.draw_polygon(xy, ink, 0, width) + elif self.im is not None: + # To avoid expanding the polygon outwards, + # use the fill as a mask + mask = Image.new("1", self.im.size) + mask_ink = self._getink(1)[0] + draw = Draw(mask) + draw.draw.draw_polygon(xy, mask_ink, 1) + + self.draw.draw_polygon(xy, ink, 0, width * 2 - 1, mask.im) + + def regular_polygon( + self, + bounding_circle: Sequence[Sequence[float] | float], + n_sides: int, + rotation: float = 0, + fill: _Ink | None = None, + outline: _Ink | None = None, + width: int = 1, + ) -> None: + """Draw a regular polygon.""" + xy = _compute_regular_polygon_vertices(bounding_circle, n_sides, rotation) + self.polygon(xy, fill, outline, width) + + def rectangle( + self, + xy: Coords, + fill: _Ink | None = None, + outline: _Ink | None = None, + width: int = 1, + ) -> None: + """Draw a rectangle.""" + ink, fill_ink = self._getink(outline, fill) + if fill_ink is not None: + self.draw.draw_rectangle(xy, fill_ink, 1) + if ink is not None and ink != fill_ink and width != 0: + self.draw.draw_rectangle(xy, ink, 0, width) + + def rounded_rectangle( + self, + xy: Coords, + radius: float = 0, + fill: _Ink | None = None, + outline: _Ink | None = None, + width: int = 1, + *, + corners: tuple[bool, bool, bool, bool] | None = None, + ) -> None: + """Draw a rounded rectangle.""" + if isinstance(xy[0], (list, tuple)): + (x0, y0), (x1, y1) = cast(Sequence[Sequence[float]], xy) + else: + x0, y0, x1, y1 = cast(Sequence[float], xy) + if x1 < x0: + msg = "x1 must be greater than or equal to x0" + raise ValueError(msg) + if y1 < y0: + msg = "y1 must be greater than or equal to y0" + raise ValueError(msg) + if corners is None: + corners = (True, True, True, True) + + d = radius * 2 + + x0 = round(x0) + y0 = round(y0) + x1 = round(x1) + y1 = round(y1) + full_x, full_y = False, False + if all(corners): + full_x = d >= x1 - x0 - 1 + if full_x: + # The two left and two right corners are joined + d = x1 - x0 + full_y = d >= y1 - y0 - 1 + if full_y: + # The two top and two bottom corners are joined + d = y1 - y0 + if full_x and full_y: + # If all corners are joined, that is a circle + return self.ellipse(xy, fill, outline, width) + + if d == 0 or not any(corners): + # If the corners have no curve, + # or there are no corners, + # that is a rectangle + return self.rectangle(xy, fill, outline, width) + + r = int(d // 2) + ink, fill_ink = self._getink(outline, fill) + + def draw_corners(pieslice: bool) -> None: + parts: tuple[tuple[tuple[float, float, float, float], int, int], ...] + if full_x: + # Draw top and bottom halves + parts = ( + ((x0, y0, x0 + d, y0 + d), 180, 360), + ((x0, y1 - d, x0 + d, y1), 0, 180), + ) + elif full_y: + # Draw left and right halves + parts = ( + ((x0, y0, x0 + d, y0 + d), 90, 270), + ((x1 - d, y0, x1, y0 + d), 270, 90), + ) + else: + # Draw four separate corners + parts = tuple( + part + for i, part in enumerate( + ( + ((x0, y0, x0 + d, y0 + d), 180, 270), + ((x1 - d, y0, x1, y0 + d), 270, 360), + ((x1 - d, y1 - d, x1, y1), 0, 90), + ((x0, y1 - d, x0 + d, y1), 90, 180), + ) + ) + if corners[i] + ) + for part in parts: + if pieslice: + self.draw.draw_pieslice(*(part + (fill_ink, 1))) + else: + self.draw.draw_arc(*(part + (ink, width))) + + if fill_ink is not None: + draw_corners(True) + + if full_x: + self.draw.draw_rectangle((x0, y0 + r + 1, x1, y1 - r - 1), fill_ink, 1) + elif x1 - r - 1 >= x0 + r + 1: + self.draw.draw_rectangle((x0 + r + 1, y0, x1 - r - 1, y1), fill_ink, 1) + if not full_x and not full_y: + left = [x0, y0, x0 + r, y1] + if corners[0]: + left[1] += r + 1 + if corners[3]: + left[3] -= r + 1 + self.draw.draw_rectangle(left, fill_ink, 1) + + right = [x1 - r, y0, x1, y1] + if corners[1]: + right[1] += r + 1 + if corners[2]: + right[3] -= r + 1 + self.draw.draw_rectangle(right, fill_ink, 1) + if ink is not None and ink != fill_ink and width != 0: + draw_corners(False) + + if not full_x: + top = [x0, y0, x1, y0 + width - 1] + if corners[0]: + top[0] += r + 1 + if corners[1]: + top[2] -= r + 1 + self.draw.draw_rectangle(top, ink, 1) + + bottom = [x0, y1 - width + 1, x1, y1] + if corners[3]: + bottom[0] += r + 1 + if corners[2]: + bottom[2] -= r + 1 + self.draw.draw_rectangle(bottom, ink, 1) + if not full_y: + left = [x0, y0, x0 + width - 1, y1] + if corners[0]: + left[1] += r + 1 + if corners[3]: + left[3] -= r + 1 + self.draw.draw_rectangle(left, ink, 1) + + right = [x1 - width + 1, y0, x1, y1] + if corners[1]: + right[1] += r + 1 + if corners[2]: + right[3] -= r + 1 + self.draw.draw_rectangle(right, ink, 1) + + def text( + self, + xy: tuple[float, float], + text: AnyStr | ImageText.Text[AnyStr], + fill: _Ink | None = None, + font: ( + ImageFont.ImageFont + | ImageFont.FreeTypeFont + | ImageFont.TransposedFont + | None + ) = None, + anchor: str | None = None, + spacing: float = 4, + align: str = "left", + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + stroke_width: float = 0, + stroke_fill: _Ink | None = None, + embedded_color: bool = False, + *args: Any, + **kwargs: Any, + ) -> None: + """Draw text.""" + if isinstance(text, ImageText.Text): + image_text = text + else: + if font is None: + font = self._getfont(kwargs.get("font_size")) + image_text = ImageText.Text( + text, font, self.mode, spacing, direction, features, language + ) + if embedded_color: + image_text.embed_color() + if stroke_width: + image_text.stroke(stroke_width, stroke_fill) + + def getink(fill: _Ink | None) -> int: + ink, fill_ink = self._getink(fill) + if ink is None: + assert fill_ink is not None + return fill_ink + return ink + + ink = getink(fill) + if ink is None: + return + + stroke_ink = None + if image_text.stroke_width: + stroke_ink = ( + getink(image_text.stroke_fill) + if image_text.stroke_fill is not None + else ink + ) + + for line in image_text._split(xy, anchor, align): + + def draw_text(ink: int, stroke_width: float = 0) -> None: + mode = self.fontmode + if stroke_width == 0 and embedded_color: + mode = "RGBA" + x = int(line.x) + y = int(line.y) + start = (math.modf(line.x)[0], math.modf(line.y)[0]) + try: + mask, offset = image_text.font.getmask2( # type: ignore[union-attr,misc] + line.text, + mode, + direction=direction, + features=features, + language=language, + stroke_width=stroke_width, + stroke_filled=True, + anchor=line.anchor, + ink=ink, + start=start, + *args, + **kwargs, + ) + x += offset[0] + y += offset[1] + except AttributeError: + try: + mask = image_text.font.getmask( # type: ignore[misc] + line.text, + mode, + direction, + features, + language, + stroke_width, + line.anchor, + ink, + start=start, + *args, + **kwargs, + ) + except TypeError: + mask = image_text.font.getmask(line.text) + if mode == "RGBA": + # image_text.font.getmask2(mode="RGBA") + # returns color in RGB bands and mask in A + # extract mask and set text alpha + color, mask = mask, mask.getband(3) + ink_alpha = struct.pack("i", ink)[3] + color.fillband(3, ink_alpha) + if self.im is not None: + self.im.paste( + color, (x, y, x + mask.size[0], y + mask.size[1]), mask + ) + else: + self.draw.draw_bitmap((x, y), mask, ink) + + if stroke_ink is not None: + # Draw stroked text + draw_text(stroke_ink, image_text.stroke_width) + + # Draw normal text + if ink != stroke_ink: + draw_text(ink) + else: + # Only draw normal text + draw_text(ink) + + def multiline_text( + self, + xy: tuple[float, float], + text: AnyStr, + fill: _Ink | None = None, + font: ( + ImageFont.ImageFont + | ImageFont.FreeTypeFont + | ImageFont.TransposedFont + | None + ) = None, + anchor: str | None = None, + spacing: float = 4, + align: str = "left", + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + stroke_width: float = 0, + stroke_fill: _Ink | None = None, + embedded_color: bool = False, + *, + font_size: float | None = None, + ) -> None: + return self.text( + xy, + text, + fill, + font, + anchor, + spacing, + align, + direction, + features, + language, + stroke_width, + stroke_fill, + embedded_color, + font_size=font_size, + ) + + def textlength( + self, + text: AnyStr, + font: ( + ImageFont.ImageFont + | ImageFont.FreeTypeFont + | ImageFont.TransposedFont + | None + ) = None, + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + embedded_color: bool = False, + *, + font_size: float | None = None, + ) -> float: + """Get the length of a given string, in pixels with 1/64 precision.""" + if font is None: + font = self._getfont(font_size) + image_text = ImageText.Text( + text, + font, + self.mode, + direction=direction, + features=features, + language=language, + ) + if embedded_color: + image_text.embed_color() + return image_text.get_length() + + def textbbox( + self, + xy: tuple[float, float], + text: AnyStr, + font: ( + ImageFont.ImageFont + | ImageFont.FreeTypeFont + | ImageFont.TransposedFont + | None + ) = None, + anchor: str | None = None, + spacing: float = 4, + align: str = "left", + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + stroke_width: float = 0, + embedded_color: bool = False, + *, + font_size: float | None = None, + ) -> tuple[float, float, float, float]: + """Get the bounding box of a given string, in pixels.""" + if font is None: + font = self._getfont(font_size) + image_text = ImageText.Text( + text, font, self.mode, spacing, direction, features, language + ) + if embedded_color: + image_text.embed_color() + if stroke_width: + image_text.stroke(stroke_width) + return image_text.get_bbox(xy, anchor, align) + + def multiline_textbbox( + self, + xy: tuple[float, float], + text: AnyStr, + font: ( + ImageFont.ImageFont + | ImageFont.FreeTypeFont + | ImageFont.TransposedFont + | None + ) = None, + anchor: str | None = None, + spacing: float = 4, + align: str = "left", + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + stroke_width: float = 0, + embedded_color: bool = False, + *, + font_size: float | None = None, + ) -> tuple[float, float, float, float]: + return self.textbbox( + xy, + text, + font, + anchor, + spacing, + align, + direction, + features, + language, + stroke_width, + embedded_color, + font_size=font_size, + ) + + +def Draw(im: Image.Image, mode: str | None = None) -> ImageDraw: + """ + A simple 2D drawing interface for PIL images. + + :param im: The image to draw in. + :param mode: Optional mode to use for color values. For RGB + images, this argument can be RGB or RGBA (to blend the + drawing into the image). For all other modes, this argument + must be the same as the image mode. If omitted, the mode + defaults to the mode of the image. + """ + try: + return getattr(im, "getdraw")(mode) + except AttributeError: + return ImageDraw(im, mode) + + +def getdraw(im: Image.Image | None = None) -> tuple[ImageDraw2.Draw | None, ModuleType]: + """ + :param im: The image to draw in. + :returns: A (drawing context, drawing resource factory) tuple. + """ + from . import ImageDraw2 + + draw = ImageDraw2.Draw(im) if im is not None else None + return draw, ImageDraw2 + + +def floodfill( + image: Image.Image, + xy: tuple[int, int], + value: float | tuple[int, ...], + border: float | tuple[int, ...] | None = None, + thresh: float = 0, +) -> None: + """ + .. warning:: This method is experimental. + + Fills a bounded region with a given color. + + :param image: Target image. + :param xy: Seed position (a 2-item coordinate tuple). See + :ref:`coordinate-system`. + :param value: Fill color. + :param border: Optional border value. If given, the region consists of + pixels with a color different from the border color. If not given, + the region consists of pixels having the same color as the seed + pixel. + :param thresh: Optional threshold value which specifies a maximum + tolerable difference of a pixel value from the 'background' in + order for it to be replaced. Useful for filling regions of + non-homogeneous, but similar, colors. + """ + # based on an implementation by Eric S. Raymond + # amended by yo1995 @20180806 + pixel = image.load() + assert pixel is not None + x, y = xy + try: + background = pixel[x, y] + if _color_diff(value, background) <= thresh: + return # seed point already has fill color + pixel[x, y] = value + except (ValueError, IndexError): + return # seed point outside image + edge = {(x, y)} + # use a set to keep record of current and previous edge pixels + # to reduce memory consumption + full_edge = set() + while edge: + new_edge = set() + for x, y in edge: # 4 adjacent method + for s, t in ((x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)): + # If already processed, or if a coordinate is negative, skip + if (s, t) in full_edge or s < 0 or t < 0: + continue + try: + p = pixel[s, t] + except (ValueError, IndexError): + pass + else: + full_edge.add((s, t)) + if border is None: + fill = _color_diff(p, background) <= thresh + else: + fill = p not in (value, border) + if fill: + pixel[s, t] = value + new_edge.add((s, t)) + full_edge = edge # discard pixels processed + edge = new_edge + + +def _compute_regular_polygon_vertices( + bounding_circle: Sequence[Sequence[float] | float], n_sides: int, rotation: float +) -> list[tuple[float, float]]: + """ + Generate a list of vertices for a 2D regular polygon. + + :param bounding_circle: The bounding circle is a sequence defined + by a point and radius. The polygon is inscribed in this circle. + (e.g. ``bounding_circle=(x, y, r)`` or ``((x, y), r)``) + :param n_sides: Number of sides + (e.g. ``n_sides=3`` for a triangle, ``6`` for a hexagon) + :param rotation: Apply an arbitrary rotation to the polygon + (e.g. ``rotation=90``, applies a 90 degree rotation) + :return: List of regular polygon vertices + (e.g. ``[(25, 50), (50, 50), (50, 25), (25, 25)]``) + + How are the vertices computed? + 1. Compute the following variables + - theta: Angle between the apothem & the nearest polygon vertex + - side_length: Length of each polygon edge + - centroid: Center of bounding circle (1st, 2nd elements of bounding_circle) + - polygon_radius: Polygon radius (last element of bounding_circle) + - angles: Location of each polygon vertex in polar grid + (e.g. A square with 0 degree rotation => [225.0, 315.0, 45.0, 135.0]) + + 2. For each angle in angles, get the polygon vertex at that angle + The vertex is computed using the equation below. + X= xcos(φ) + ysin(φ) + Y= −xsin(φ) + ycos(φ) + + Note: + φ = angle in degrees + x = 0 + y = polygon_radius + + The formula above assumes rotation around the origin. + In our case, we are rotating around the centroid. + To account for this, we use the formula below + X = xcos(φ) + ysin(φ) + centroid_x + Y = −xsin(φ) + ycos(φ) + centroid_y + """ + # 1. Error Handling + # 1.1 Check `n_sides` has an appropriate value + if not isinstance(n_sides, int): + msg = "n_sides should be an int" # type: ignore[unreachable] + raise TypeError(msg) + if n_sides < 3: + msg = "n_sides should be an int > 2" + raise ValueError(msg) + + # 1.2 Check `bounding_circle` has an appropriate value + if not isinstance(bounding_circle, (list, tuple)): + msg = "bounding_circle should be a sequence" + raise TypeError(msg) + + if len(bounding_circle) == 3: + if not all(isinstance(i, (int, float)) for i in bounding_circle): + msg = "bounding_circle should only contain numeric data" + raise ValueError(msg) + + *centroid, polygon_radius = cast(list[float], list(bounding_circle)) + elif len(bounding_circle) == 2 and isinstance(bounding_circle[0], (list, tuple)): + if not all( + isinstance(i, (int, float)) for i in bounding_circle[0] + ) or not isinstance(bounding_circle[1], (int, float)): + msg = "bounding_circle should only contain numeric data" + raise ValueError(msg) + + if len(bounding_circle[0]) != 2: + msg = "bounding_circle centre should contain 2D coordinates (e.g. (x, y))" + raise ValueError(msg) + + centroid = cast(list[float], list(bounding_circle[0])) + polygon_radius = cast(float, bounding_circle[1]) + else: + msg = ( + "bounding_circle should contain 2D coordinates " + "and a radius (e.g. (x, y, r) or ((x, y), r) )" + ) + raise ValueError(msg) + + if polygon_radius <= 0: + msg = "bounding_circle radius should be > 0" + raise ValueError(msg) + + # 1.3 Check `rotation` has an appropriate value + if not isinstance(rotation, (int, float)): + msg = "rotation should be an int or float" # type: ignore[unreachable] + raise ValueError(msg) + + # 2. Define Helper Functions + def _apply_rotation(point: list[float], degrees: float) -> tuple[float, float]: + return ( + round( + point[0] * math.cos(math.radians(360 - degrees)) + - point[1] * math.sin(math.radians(360 - degrees)) + + centroid[0], + 2, + ), + round( + point[1] * math.cos(math.radians(360 - degrees)) + + point[0] * math.sin(math.radians(360 - degrees)) + + centroid[1], + 2, + ), + ) + + def _compute_polygon_vertex(angle: float) -> tuple[float, float]: + start_point = [polygon_radius, 0] + return _apply_rotation(start_point, angle) + + def _get_angles(n_sides: int, rotation: float) -> list[float]: + angles = [] + degrees = 360 / n_sides + # Start with the bottom left polygon vertex + current_angle = (270 - 0.5 * degrees) + rotation + for _ in range(n_sides): + angles.append(current_angle) + current_angle += degrees + if current_angle > 360: + current_angle -= 360 + return angles + + # 3. Variable Declarations + angles = _get_angles(n_sides, rotation) + + # 4. Compute Vertices + return [_compute_polygon_vertex(angle) for angle in angles] + + +def _color_diff( + color1: float | tuple[int, ...], color2: float | tuple[int, ...] +) -> float: + """ + Uses 1-norm distance to calculate difference between two values. + """ + first = color1 if isinstance(color1, tuple) else (color1,) + second = color2 if isinstance(color2, tuple) else (color2,) + + return sum(abs(first[i] - second[i]) for i in range(len(second))) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageDraw2.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageDraw2.py new file mode 100644 index 000000000..2c9e39b2c --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageDraw2.py @@ -0,0 +1,244 @@ +# +# The Python Imaging Library +# $Id$ +# +# WCK-style drawing interface operations +# +# History: +# 2003-12-07 fl created +# 2005-05-15 fl updated; added to PIL as ImageDraw2 +# 2005-05-15 fl added text support +# 2005-05-20 fl added arc/chord/pieslice support +# +# Copyright (c) 2003-2005 by Secret Labs AB +# Copyright (c) 2003-2005 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + + +""" +(Experimental) WCK-style drawing interface operations + +.. seealso:: :py:mod:`PIL.ImageDraw` +""" + +from __future__ import annotations + +from typing import Any, AnyStr, BinaryIO + +from . import Image, ImageColor, ImageDraw, ImageFont, ImagePath +from ._typing import Coords, StrOrBytesPath + + +class Pen: + """Stores an outline color and width.""" + + def __init__(self, color: str, width: int = 1, opacity: int = 255) -> None: + self.color = ImageColor.getrgb(color) + self.width = width + + +class Brush: + """Stores a fill color""" + + def __init__(self, color: str, opacity: int = 255) -> None: + self.color = ImageColor.getrgb(color) + + +class Font: + """Stores a TrueType font and color""" + + def __init__( + self, color: str, file: StrOrBytesPath | BinaryIO, size: float = 12 + ) -> None: + # FIXME: add support for bitmap fonts + self.color = ImageColor.getrgb(color) + self.font = ImageFont.truetype(file, size) + + +class Draw: + """ + (Experimental) WCK-style drawing interface + """ + + def __init__( + self, + image: Image.Image | str, + size: tuple[int, int] | list[int] | None = None, + color: float | tuple[float, ...] | str | None = None, + ) -> None: + if isinstance(image, str): + if size is None: + msg = "If image argument is mode string, size must be a list or tuple" + raise ValueError(msg) + image = Image.new(image, size, color) + self.draw = ImageDraw.Draw(image) + self.image = image + self.transform: tuple[float, float, float, float, float, float] | None = None + + def flush(self) -> Image.Image: + return self.image + + def render( + self, + op: str, + xy: Coords, + pen: Pen | Brush | None, + brush: Brush | Pen | None = None, + **kwargs: Any, + ) -> None: + # handle color arguments + outline = fill = None + width = 1 + if isinstance(pen, Pen): + outline = pen.color + width = pen.width + elif isinstance(brush, Pen): + outline = brush.color + width = brush.width + if isinstance(brush, Brush): + fill = brush.color + elif isinstance(pen, Brush): + fill = pen.color + # handle transformation + if self.transform: + path = ImagePath.Path(xy) + path.transform(self.transform) + xy = path + # render the item + if op in ("arc", "line"): + kwargs.setdefault("fill", outline) + else: + kwargs.setdefault("fill", fill) + kwargs.setdefault("outline", outline) + if op == "line": + kwargs.setdefault("width", width) + getattr(self.draw, op)(xy, **kwargs) + + def settransform(self, offset: tuple[float, float]) -> None: + """Sets a transformation offset.""" + xoffset, yoffset = offset + self.transform = (1, 0, xoffset, 0, 1, yoffset) + + def arc( + self, + xy: Coords, + pen: Pen | Brush | None, + start: float, + end: float, + *options: Any, + ) -> None: + """ + Draws an arc (a portion of a circle outline) between the start and end + angles, inside the given bounding box. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.arc` + """ + self.render("arc", xy, pen, *options, start=start, end=end) + + def chord( + self, + xy: Coords, + pen: Pen | Brush | None, + start: float, + end: float, + *options: Any, + ) -> None: + """ + Same as :py:meth:`~PIL.ImageDraw2.Draw.arc`, but connects the end points + with a straight line. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.chord` + """ + self.render("chord", xy, pen, *options, start=start, end=end) + + def ellipse(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None: + """ + Draws an ellipse inside the given bounding box. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.ellipse` + """ + self.render("ellipse", xy, pen, *options) + + def line(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None: + """ + Draws a line between the coordinates in the ``xy`` list. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.line` + """ + self.render("line", xy, pen, *options) + + def pieslice( + self, + xy: Coords, + pen: Pen | Brush | None, + start: float, + end: float, + *options: Any, + ) -> None: + """ + Same as arc, but also draws straight lines between the end points and the + center of the bounding box. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.pieslice` + """ + self.render("pieslice", xy, pen, *options, start=start, end=end) + + def polygon(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None: + """ + Draws a polygon. + + The polygon outline consists of straight lines between the given + coordinates, plus a straight line between the last and the first + coordinate. + + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.polygon` + """ + self.render("polygon", xy, pen, *options) + + def rectangle(self, xy: Coords, pen: Pen | Brush | None, *options: Any) -> None: + """ + Draws a rectangle. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.rectangle` + """ + self.render("rectangle", xy, pen, *options) + + def text(self, xy: tuple[float, float], text: AnyStr, font: Font) -> None: + """ + Draws the string at the given position. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.text` + """ + if self.transform: + path = ImagePath.Path(xy) + path.transform(self.transform) + xy = path + self.draw.text(xy, text, font=font.font, fill=font.color) + + def textbbox( + self, xy: tuple[float, float], text: AnyStr, font: Font + ) -> tuple[float, float, float, float]: + """ + Returns bounding box (in pixels) of given text. + + :return: ``(left, top, right, bottom)`` bounding box + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textbbox` + """ + if self.transform: + path = ImagePath.Path(xy) + path.transform(self.transform) + xy = path + return self.draw.textbbox(xy, text, font=font.font) + + def textlength(self, text: AnyStr, font: Font) -> float: + """ + Returns length (in pixels) of given text. + This is the amount by which following text should be offset. + + .. seealso:: :py:meth:`PIL.ImageDraw.ImageDraw.textlength` + """ + return self.draw.textlength(text, font=font.font) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageEnhance.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageEnhance.py new file mode 100644 index 000000000..0e7e6dd8a --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageEnhance.py @@ -0,0 +1,113 @@ +# +# The Python Imaging Library. +# $Id$ +# +# image enhancement classes +# +# For a background, see "Image Processing By Interpolation and +# Extrapolation", Paul Haeberli and Douglas Voorhies. Available +# at http://www.graficaobscura.com/interp/index.html +# +# History: +# 1996-03-23 fl Created +# 2009-06-16 fl Fixed mean calculation +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image, ImageFilter, ImageStat + + +class _Enhance: + image: Image.Image + degenerate: Image.Image + + def enhance(self, factor: float) -> Image.Image: + """ + Returns an enhanced image. + + :param factor: A floating point value controlling the enhancement. + Factor 1.0 always returns a copy of the original image, + lower factors mean less color (brightness, contrast, + etc), and higher values more. There are no restrictions + on this value. + :rtype: :py:class:`~PIL.Image.Image` + """ + return Image.blend(self.degenerate, self.image, factor) + + +class Color(_Enhance): + """Adjust image color balance. + + This class can be used to adjust the colour balance of an image, in + a manner similar to the controls on a colour TV set. An enhancement + factor of 0.0 gives a black and white image. A factor of 1.0 gives + the original image. + """ + + def __init__(self, image: Image.Image) -> None: + self.image = image + self.intermediate_mode = "L" + if "A" in image.getbands(): + self.intermediate_mode = "LA" + + if self.intermediate_mode != image.mode: + image = image.convert(self.intermediate_mode).convert(image.mode) + self.degenerate = image + + +class Contrast(_Enhance): + """Adjust image contrast. + + This class can be used to control the contrast of an image, similar + to the contrast control on a TV set. An enhancement factor of 0.0 + gives a solid gray image. A factor of 1.0 gives the original image. + """ + + def __init__(self, image: Image.Image) -> None: + self.image = image + if image.mode != "L": + image = image.convert("L") + mean = int(ImageStat.Stat(image).mean[0] + 0.5) + self.degenerate = Image.new("L", image.size, mean) + if self.degenerate.mode != self.image.mode: + self.degenerate = self.degenerate.convert(self.image.mode) + + if "A" in self.image.getbands(): + self.degenerate.putalpha(self.image.getchannel("A")) + + +class Brightness(_Enhance): + """Adjust image brightness. + + This class can be used to control the brightness of an image. An + enhancement factor of 0.0 gives a black image. A factor of 1.0 gives the + original image. + """ + + def __init__(self, image: Image.Image) -> None: + self.image = image + self.degenerate = Image.new(image.mode, image.size, 0) + + if "A" in image.getbands(): + self.degenerate.putalpha(image.getchannel("A")) + + +class Sharpness(_Enhance): + """Adjust image sharpness. + + This class can be used to adjust the sharpness of an image. An + enhancement factor of 0.0 gives a blurred image, a factor of 1.0 gives the + original image, and a factor of 2.0 gives a sharpened image. + """ + + def __init__(self, image: Image.Image) -> None: + self.image = image + self.degenerate = image.filter(ImageFilter.SMOOTH) + + if "A" in image.getbands(): + self.degenerate.putalpha(image.getchannel("A")) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageFile.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageFile.py new file mode 100644 index 000000000..c70d93f3c --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageFile.py @@ -0,0 +1,935 @@ +# +# The Python Imaging Library. +# $Id$ +# +# base class for image file handlers +# +# history: +# 1995-09-09 fl Created +# 1996-03-11 fl Fixed load mechanism. +# 1996-04-15 fl Added pcx/xbm decoders. +# 1996-04-30 fl Added encoders. +# 1996-12-14 fl Added load helpers +# 1997-01-11 fl Use encode_to_file where possible +# 1997-08-27 fl Flush output in _save +# 1998-03-05 fl Use memory mapping for some modes +# 1999-02-04 fl Use memory mapping also for "I;16" and "I;16B" +# 1999-05-31 fl Added image parser +# 2000-10-12 fl Set readonly flag on memory-mapped images +# 2002-03-20 fl Use better messages for common decoder errors +# 2003-04-21 fl Fall back on mmap/map_buffer if map is not available +# 2003-10-30 fl Added StubImageFile class +# 2004-02-25 fl Made incremental parser more robust +# +# Copyright (c) 1997-2004 by Secret Labs AB +# Copyright (c) 1995-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import abc +import io +import itertools +import logging +import os +import struct +from typing import IO, Any, NamedTuple, cast + +from . import ExifTags, Image +from ._util import DeferredError, is_path + +TYPE_CHECKING = False +if TYPE_CHECKING: + from ._typing import StrOrBytesPath + +logger = logging.getLogger(__name__) + +MAXBLOCK = 65536 +""" +By default, Pillow processes image data in blocks. This helps to prevent excessive use +of resources. Codecs may disable this behaviour with ``_pulls_fd`` or ``_pushes_fd``. + +When reading an image, this is the number of bytes to read at once. + +When writing an image, this is the number of bytes to write at once. +If the image width times 4 is greater, then that will be used instead. +Plugins may also set a greater number. + +User code may set this to another number. +""" + +SAFEBLOCK = 1024 * 1024 + +LOAD_TRUNCATED_IMAGES = False +"""Whether or not to load truncated image files. User code may change this.""" + +ERRORS = { + -1: "image buffer overrun error", + -2: "decoding error", + -3: "unknown error", + -8: "bad configuration", + -9: "out of memory error", +} +""" +Dict of known error codes returned from :meth:`.PyDecoder.decode`, +:meth:`.PyEncoder.encode` :meth:`.PyEncoder.encode_to_pyfd` and +:meth:`.PyEncoder.encode_to_file`. +""" + + +# +# -------------------------------------------------------------------- +# Helpers + + +def _get_oserror(error: int, *, encoder: bool) -> OSError: + try: + msg = Image.core.getcodecstatus(error) + except AttributeError: + msg = ERRORS.get(error) + if not msg: + msg = f"{'encoder' if encoder else 'decoder'} error {error}" + msg += f" when {'writing' if encoder else 'reading'} image file" + return OSError(msg) + + +def _tilesort(t: _Tile) -> int: + # sort on offset + return t[2] + + +class _Tile(NamedTuple): + codec_name: str + extents: tuple[int, int, int, int] | None + offset: int = 0 + args: tuple[Any, ...] | str | None = None + + +# +# -------------------------------------------------------------------- +# ImageFile base class + + +class ImageFile(Image.Image): + """Base class for image file format handlers.""" + + def __init__( + self, fp: StrOrBytesPath | IO[bytes], filename: str | bytes | None = None + ) -> None: + super().__init__() + + self._min_frame = 0 + + self.custom_mimetype: str | None = None + + self.tile: list[_Tile] = [] + """ A list of tile descriptors """ + + self.readonly = 1 # until we know better + + self.decoderconfig: tuple[Any, ...] = () + self.decodermaxblock = MAXBLOCK + + self.fp: IO[bytes] | None + self._fp: IO[bytes] | DeferredError + if is_path(fp): + # filename + self.fp = open(fp, "rb") + self.filename = os.fspath(fp) + self._exclusive_fp = True + else: + # stream + self.fp = cast(IO[bytes], fp) + self.filename = filename if filename is not None else "" + # can be overridden + self._exclusive_fp = False + + try: + try: + self._open() + + if isinstance(self, StubImageFile): + if loader := self._load(): + loader.open(self) + except ( + IndexError, # end of data + TypeError, # end of data (ord) + KeyError, # unsupported mode + EOFError, # got header but not the first frame + struct.error, + ) as v: + raise SyntaxError(v) from v + + if not self.mode or self.size[0] <= 0 or self.size[1] <= 0: + msg = "not identified by this driver" + raise SyntaxError(msg) + except BaseException: + # close the file only if we have opened it this constructor + if self._exclusive_fp: + self.fp.close() + raise + + def _open(self) -> None: + pass + + # Context manager support + def __enter__(self) -> ImageFile: + return self + + def _close_fp(self) -> None: + if getattr(self, "_fp", False) and not isinstance(self._fp, DeferredError): + if self._fp != self.fp: + self._fp.close() + self._fp = DeferredError(ValueError("Operation on closed image")) + if self.fp: + self.fp.close() + + def __exit__(self, *args: object) -> None: + if getattr(self, "_exclusive_fp", False): + self._close_fp() + self.fp = None + + def close(self) -> None: + """ + Closes the file pointer, if possible. + + This operation will destroy the image core and release its memory. + The image data will be unusable afterward. + + This function is required to close images that have multiple frames or + have not had their file read and closed by the + :py:meth:`~PIL.Image.Image.load` method. See :ref:`file-handling` for + more information. + """ + try: + self._close_fp() + self.fp = None + except Exception as msg: + logger.debug("Error closing: %s", msg) + + super().close() + + def get_child_images(self) -> list[ImageFile]: + child_images = [] + exif = self.getexif() + ifds = [] + if ExifTags.Base.SubIFDs in exif: + subifd_offsets = exif[ExifTags.Base.SubIFDs] + if subifd_offsets: + if not isinstance(subifd_offsets, tuple): + subifd_offsets = (subifd_offsets,) + ifds = [ + (exif._get_ifd_dict(subifd_offset), subifd_offset) + for subifd_offset in subifd_offsets + ] + ifd1 = exif.get_ifd(ExifTags.IFD.IFD1) + if ifd1 and ifd1.get(ExifTags.Base.JpegIFOffset): + assert exif._info is not None + ifds.append((ifd1, exif._info.next)) + + offset = None + for ifd, ifd_offset in ifds: + assert self.fp is not None + current_offset = self.fp.tell() + if offset is None: + offset = current_offset + + fp = self.fp + if ifd is not None: + thumbnail_offset = ifd.get(ExifTags.Base.JpegIFOffset) + if thumbnail_offset is not None: + thumbnail_offset += getattr(self, "_exif_offset", 0) + self.fp.seek(thumbnail_offset) + + length = ifd.get(ExifTags.Base.JpegIFByteCount) + assert isinstance(length, int) + data = self.fp.read(length) + fp = io.BytesIO(data) + + with Image.open(fp) as im: + from . import TiffImagePlugin + + if thumbnail_offset is None and isinstance( + im, TiffImagePlugin.TiffImageFile + ): + im._frame_pos = [ifd_offset] + im._seek(0) + im.load() + child_images.append(im) + + if offset is not None: + assert self.fp is not None + self.fp.seek(offset) + return child_images + + def get_format_mimetype(self) -> str | None: + if self.custom_mimetype: + return self.custom_mimetype + if self.format is not None: + return Image.MIME.get(self.format.upper()) + return None + + def __getstate__(self) -> list[Any]: + return super().__getstate__() + [self.filename] + + def __setstate__(self, state: list[Any]) -> None: + self.tile = [] + if len(state) > 5: + self.filename = state[5] + super().__setstate__(state) + + def verify(self) -> None: + """Check file integrity""" + + # raise exception if something's wrong. must be called + # directly after open, and closes file when finished. + if self._exclusive_fp and self.fp: + self.fp.close() + self.fp = None + + def load(self) -> Image.core.PixelAccess | None: + """Load image data based on tile list""" + + if not self.tile and self._im is None: + msg = "cannot load this image" + raise OSError(msg) + + pixel = Image.Image.load(self) + if not self.tile: + return pixel + + self.map: mmap.mmap | None = None + use_mmap = self.filename and len(self.tile) == 1 + + assert self.fp is not None + readonly = 0 + + # look for read/seek overrides + if hasattr(self, "load_read"): + read = self.load_read + # don't use mmap if there are custom read/seek functions + use_mmap = False + else: + read = self.fp.read + + if hasattr(self, "load_seek"): + seek = self.load_seek + use_mmap = False + else: + seek = self.fp.seek + + if use_mmap: + # try memory mapping + decoder_name, extents, offset, args = self.tile[0] + if isinstance(args, str): + args = (args, 0, 1) + if ( + decoder_name == "raw" + and isinstance(args, tuple) + and len(args) >= 3 + and args[0] == self.mode + and args[0] in Image._MAPMODES + ): + if offset < 0: + msg = "Tile offset cannot be negative" + raise ValueError(msg) + try: + # use mmap, if possible + import mmap + + with open(self.filename) as fp: + self.map = mmap.mmap(fp.fileno(), 0, access=mmap.ACCESS_READ) + if offset + self.size[1] * args[1] > self.map.size(): + msg = "buffer is not large enough" + raise OSError(msg) + self.im = Image.core.map_buffer( + self.map, self.size, decoder_name, offset, args + ) + readonly = 1 + # After trashing self.im, + # we might need to reload the palette data. + if self.palette: + self.palette.dirty = 1 + except (AttributeError, OSError, ImportError): + self.map = None + + self.load_prepare() + err_code = -3 # initialize to unknown error + if not self.map: + # sort tiles in file order + self.tile.sort(key=_tilesort) + + # FIXME: This is a hack to handle TIFF's JpegTables tag. + prefix = getattr(self, "tile_prefix", b"") + + # Remove consecutive duplicates that only differ by their offset + self.tile = [ + list(tiles)[-1] + for _, tiles in itertools.groupby( + self.tile, lambda tile: (tile[0], tile[1], tile[3]) + ) + ] + for i, (decoder_name, extents, offset, args) in enumerate(self.tile): + seek(offset) + decoder = Image._getdecoder( + self.mode, decoder_name, args, self.decoderconfig + ) + try: + decoder.setimage(self.im, extents) + if decoder.pulls_fd: + decoder.setfd(self.fp) + err_code = decoder.decode(b"")[1] + else: + b = prefix + while True: + read_bytes = self.decodermaxblock + if i + 1 < len(self.tile): + next_offset = self.tile[i + 1].offset + if next_offset > offset: + read_bytes = next_offset - offset + try: + s = read(read_bytes) + except (IndexError, struct.error) as e: + # truncated png/gif + if LOAD_TRUNCATED_IMAGES: + break + else: + msg = "image file is truncated" + raise OSError(msg) from e + + if not s: # truncated jpeg + if LOAD_TRUNCATED_IMAGES: + break + else: + msg = ( + "image file is truncated " + f"({len(b)} bytes not processed)" + ) + raise OSError(msg) + + b = b + s + n, err_code = decoder.decode(b) + if n < 0: + break + b = b[n:] + finally: + # Need to cleanup here to prevent leaks + decoder.cleanup() + + self.tile = [] + self.readonly = readonly + + self.load_end() + + if self._exclusive_fp and self._close_exclusive_fp_after_loading: + self.fp.close() + self.fp = None + + if not self.map and not LOAD_TRUNCATED_IMAGES and err_code < 0: + # still raised if decoder fails to return anything + raise _get_oserror(err_code, encoder=False) + + return Image.Image.load(self) + + def load_prepare(self) -> None: + # create image memory if necessary + if self._im is None: + self.im = Image.core.new(self.mode, self.size) + # create palette (optional) + if self.mode == "P": + Image.Image.load(self) + + def load_end(self) -> None: + # may be overridden + pass + + # may be defined for contained formats + # def load_seek(self, pos: int) -> None: + # pass + + # may be defined for blocked formats (e.g. PNG) + # def load_read(self, read_bytes: int) -> bytes: + # pass + + def _seek_check(self, frame: int) -> bool: + if ( + frame < self._min_frame + # Only check upper limit on frames if additional seek operations + # are not required to do so + or ( + not (hasattr(self, "_n_frames") and self._n_frames is None) + and frame >= getattr(self, "n_frames") + self._min_frame + ) + ): + msg = "attempt to seek outside sequence" + raise EOFError(msg) + + return self.tell() != frame + + +class StubHandler(abc.ABC): + def open(self, im: StubImageFile) -> None: + pass + + @abc.abstractmethod + def load(self, im: StubImageFile) -> Image.Image: + pass + + +class StubImageFile(ImageFile, metaclass=abc.ABCMeta): + """ + Base class for stub image loaders. + + A stub loader is an image loader that can identify files of a + certain format, but relies on external code to load the file. + """ + + @abc.abstractmethod + def _open(self) -> None: + pass + + def load(self) -> Image.core.PixelAccess | None: + loader = self._load() + if loader is None: + msg = f"cannot find loader for this {self.format} file" + raise OSError(msg) + image = loader.load(self) + assert image is not None + # become the other object (!) + self.__class__ = image.__class__ # type: ignore[assignment] + self.__dict__ = image.__dict__ + return image.load() + + @abc.abstractmethod + def _load(self) -> StubHandler | None: + """(Hook) Find actual image loader.""" + pass + + +class Parser: + """ + Incremental image parser. This class implements the standard + feed/close consumer interface. + """ + + incremental = None + image: Image.Image | None = None + data: bytes | None = None + decoder: Image.core.ImagingDecoder | PyDecoder | None = None + offset = 0 + finished = 0 + + def reset(self) -> None: + """ + (Consumer) Reset the parser. Note that you can only call this + method immediately after you've created a parser; parser + instances cannot be reused. + """ + assert self.data is None, "cannot reuse parsers" + + def feed(self, data: bytes) -> None: + """ + (Consumer) Feed data to the parser. + + :param data: A string buffer. + :exception OSError: If the parser failed to parse the image file. + """ + # collect data + + if self.finished: + return + + if self.data is None: + self.data = data + else: + self.data = self.data + data + + # parse what we have + if self.decoder: + if self.offset > 0: + # skip header + skip = min(len(self.data), self.offset) + self.data = self.data[skip:] + self.offset = self.offset - skip + if self.offset > 0 or not self.data: + return + + n, e = self.decoder.decode(self.data) + + if n < 0: + # end of stream + self.data = None + self.finished = 1 + if e < 0: + # decoding error + self.image = None + raise _get_oserror(e, encoder=False) + else: + # end of image + return + self.data = self.data[n:] + + elif self.image: + # if we end up here with no decoder, this file cannot + # be incrementally parsed. wait until we've gotten all + # available data + pass + + else: + # attempt to open this file + try: + with io.BytesIO(self.data) as fp: + im = Image.open(fp) + except OSError: + pass # not enough data + else: + flag = hasattr(im, "load_seek") or hasattr(im, "load_read") + if not flag and len(im.tile) == 1: + # initialize decoder + im.load_prepare() + d, e, o, a = im.tile[0] + im.tile = [] + self.decoder = Image._getdecoder(im.mode, d, a, im.decoderconfig) + self.decoder.setimage(im.im, e) + + # calculate decoder offset + self.offset = o + if self.offset <= len(self.data): + self.data = self.data[self.offset :] + self.offset = 0 + + self.image = im + + def __enter__(self) -> Parser: + return self + + def __exit__(self, *args: object) -> None: + self.close() + + def close(self) -> Image.Image: + """ + (Consumer) Close the stream. + + :returns: An image object. + :exception OSError: If the parser failed to parse the image file either + because it cannot be identified or cannot be + decoded. + """ + # finish decoding + if self.decoder: + # get rid of what's left in the buffers + self.feed(b"") + self.data = self.decoder = None + if not self.finished: + msg = "image was incomplete" + raise OSError(msg) + if not self.image: + msg = "cannot parse this image" + raise OSError(msg) + if self.data: + # incremental parsing not possible; reopen the file + # not that we have all data + with io.BytesIO(self.data) as fp: + try: + self.image = Image.open(fp) + finally: + self.image.load() + return self.image + + +# -------------------------------------------------------------------- + + +def _save(im: Image.Image, fp: IO[bytes], tile: list[_Tile], bufsize: int = 0) -> None: + """Helper to save image based on tile list + + :param im: Image object. + :param fp: File object. + :param tile: Tile list. + :param bufsize: Optional buffer size + """ + + im.load() + if not hasattr(im, "encoderconfig"): + im.encoderconfig = () + tile.sort(key=_tilesort) + # FIXME: make MAXBLOCK a configuration parameter + # It would be great if we could have the encoder specify what it needs + # But, it would need at least the image size in most cases. RawEncode is + # a tricky case. + bufsize = max(MAXBLOCK, bufsize, im.size[0] * 4) # see RawEncode.c + try: + fh = fp.fileno() + fp.flush() + _encode_tile(im, fp, tile, bufsize, fh) + except (AttributeError, io.UnsupportedOperation) as exc: + _encode_tile(im, fp, tile, bufsize, None, exc) + if hasattr(fp, "flush"): + fp.flush() + + +def _encode_tile( + im: Image.Image, + fp: IO[bytes], + tile: list[_Tile], + bufsize: int, + fh: int | None, + exc: BaseException | None = None, +) -> None: + for encoder_name, extents, offset, args in tile: + if offset > 0: + fp.seek(offset) + encoder = Image._getencoder(im.mode, encoder_name, args, im.encoderconfig) + try: + encoder.setimage(im.im, extents) + if encoder.pushes_fd: + encoder.setfd(fp) + errcode = encoder.encode_to_pyfd()[1] + else: + if exc: + # compress to Python file-compatible object + while True: + errcode, data = encoder.encode(bufsize)[1:] + fp.write(data) + if errcode: + break + else: + # slight speedup: compress to real file object + assert fh is not None + errcode = encoder.encode_to_file(fh, bufsize) + if errcode < 0: + raise _get_oserror(errcode, encoder=True) from exc + finally: + encoder.cleanup() + + +def _safe_read(fp: IO[bytes], size: int) -> bytes: + """ + Reads large blocks in a safe way. Unlike fp.read(n), this function + doesn't trust the user. If the requested size is larger than + SAFEBLOCK, the file is read block by block. + + :param fp: File handle. Must implement a read method. + :param size: Number of bytes to read. + :returns: A string containing size bytes of data. + + Raises an OSError if the file is truncated and the read cannot be completed + + """ + if size <= 0: + return b"" + if size <= SAFEBLOCK: + data = fp.read(size) + if len(data) < size: + msg = "Truncated File Read" + raise OSError(msg) + return data + blocks: list[bytes] = [] + remaining_size = size + while remaining_size > 0: + block = fp.read(min(remaining_size, SAFEBLOCK)) + if not block: + break + blocks.append(block) + remaining_size -= len(block) + if sum(len(block) for block in blocks) < size: + msg = "Truncated File Read" + raise OSError(msg) + return b"".join(blocks) + + +class PyCodecState: + def __init__(self) -> None: + self.xsize = 0 + self.ysize = 0 + self.xoff = 0 + self.yoff = 0 + + def extents(self) -> tuple[int, int, int, int]: + return self.xoff, self.yoff, self.xoff + self.xsize, self.yoff + self.ysize + + +class PyCodec: + fd: IO[bytes] | None + + def __init__(self, mode: str, *args: Any) -> None: + self.im: Image.core.ImagingCore | None = None + self.state = PyCodecState() + self.fd = None + self.mode = mode + self.init(args) + + def init(self, args: tuple[Any, ...]) -> None: + """ + Override to perform codec specific initialization + + :param args: Tuple of arg items from the tile entry + :returns: None + """ + self.args = args + + def cleanup(self) -> None: + """ + Override to perform codec specific cleanup + + :returns: None + """ + pass + + def setfd(self, fd: IO[bytes]) -> None: + """ + Called from ImageFile to set the Python file-like object + + :param fd: A Python file-like object + :returns: None + """ + self.fd = fd + + def setimage( + self, + im: Image.core.ImagingCore, + extents: tuple[int, int, int, int] | None = None, + ) -> None: + """ + Called from ImageFile to set the core output image for the codec + + :param im: A core image object + :param extents: a 4 tuple of (x0, y0, x1, y1) defining the rectangle + for this tile + :returns: None + """ + + # following c code + self.im = im + + if extents: + x0, y0, x1, y1 = extents + + if x0 < 0 or y0 < 0 or x1 > self.im.size[0] or y1 > self.im.size[1]: + msg = "Tile cannot extend outside image" + raise ValueError(msg) + + self.state.xoff = x0 + self.state.yoff = y0 + self.state.xsize = x1 - x0 + self.state.ysize = y1 - y0 + else: + self.state.xsize, self.state.ysize = self.im.size + + if self.state.xsize <= 0 or self.state.ysize <= 0: + msg = "Size must be positive" + raise ValueError(msg) + + +class PyDecoder(PyCodec): + """ + Python implementation of a format decoder. Override this class and + add the decoding logic in the :meth:`decode` method. + + See :ref:`Writing Your Own File Codec in Python` + """ + + _pulls_fd = False + + @property + def pulls_fd(self) -> bool: + return self._pulls_fd + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + """ + Override to perform the decoding process. + + :param buffer: A bytes object with the data to be decoded. + :returns: A tuple of ``(bytes consumed, errcode)``. + If finished with decoding return -1 for the bytes consumed. + Err codes are from :data:`.ImageFile.ERRORS`. + """ + msg = "unavailable in base decoder" + raise NotImplementedError(msg) + + def set_as_raw( + self, data: bytes, rawmode: str | None = None, extra: tuple[Any, ...] = () + ) -> None: + """ + Convenience method to set the internal image from a stream of raw data + + :param data: Bytes to be set + :param rawmode: The rawmode to be used for the decoder. + If not specified, it will default to the mode of the image + :param extra: Extra arguments for the decoder. + :returns: None + """ + + if not rawmode: + rawmode = self.mode + d = Image._getdecoder(self.mode, "raw", rawmode, extra) + assert self.im is not None + d.setimage(self.im, self.state.extents()) + s = d.decode(data) + + if s[0] >= 0: + msg = "not enough image data" + raise ValueError(msg) + if s[1] != 0: + msg = "cannot decode image data" + raise ValueError(msg) + + +class PyEncoder(PyCodec): + """ + Python implementation of a format encoder. Override this class and + add the decoding logic in the :meth:`encode` method. + + See :ref:`Writing Your Own File Codec in Python` + """ + + _pushes_fd = False + + @property + def pushes_fd(self) -> bool: + return self._pushes_fd + + def encode(self, bufsize: int) -> tuple[int, int, bytes]: + """ + Override to perform the encoding process. + + :param bufsize: Buffer size. + :returns: A tuple of ``(bytes encoded, errcode, bytes)``. + If finished with encoding return 1 for the error code. + Err codes are from :data:`.ImageFile.ERRORS`. + """ + msg = "unavailable in base encoder" + raise NotImplementedError(msg) + + def encode_to_pyfd(self) -> tuple[int, int]: + """ + If ``pushes_fd`` is ``True``, then this method will be used, + and ``encode()`` will only be called once. + + :returns: A tuple of ``(bytes consumed, errcode)``. + Err codes are from :data:`.ImageFile.ERRORS`. + """ + if not self.pushes_fd: + return 0, -8 # bad configuration + bytes_consumed, errcode, data = self.encode(0) + if data: + assert self.fd is not None + self.fd.write(data) + return bytes_consumed, errcode + + def encode_to_file(self, fh: int, bufsize: int) -> int: + """ + :param fh: File handle. + :param bufsize: Buffer size. + + :returns: If finished successfully, return 0. + Otherwise, return an error code. Err codes are from + :data:`.ImageFile.ERRORS`. + """ + errcode = 0 + while errcode == 0: + status, errcode, buf = self.encode(bufsize) + if status > 0: + os.write(fh, buf[status:]) + return errcode diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageFilter.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageFilter.py new file mode 100644 index 000000000..9326eeeda --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageFilter.py @@ -0,0 +1,607 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard filters +# +# History: +# 1995-11-27 fl Created +# 2002-06-08 fl Added rank and mode filters +# 2003-09-15 fl Fixed rank calculation in rank filter; added expand call +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2002 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import abc +import functools +from collections.abc import Sequence +from typing import cast + +TYPE_CHECKING = False +if TYPE_CHECKING: + from collections.abc import Callable + from types import ModuleType + from typing import Any + + from . import _imaging + from ._typing import NumpyArray + + +class Filter(abc.ABC): + @abc.abstractmethod + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + pass + + +class MultibandFilter(Filter): + pass + + +class BuiltinFilter(MultibandFilter): + filterargs: tuple[Any, ...] + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + if image.mode == "P": + msg = "cannot filter palette images" + raise ValueError(msg) + return image.filter(*self.filterargs) + + +class Kernel(BuiltinFilter): + """ + Create a convolution kernel. This only supports 3x3 and 5x5 integer and floating + point kernels. + + Kernels can only be applied to "L" and "RGB" images. + + :param size: Kernel size, given as (width, height). This must be (3,3) or (5,5). + :param kernel: A sequence containing kernel weights. The kernel will be flipped + vertically before being applied to the image. + :param scale: Scale factor. If given, the result for each pixel is divided by this + value. The default is the sum of the kernel weights. + :param offset: Offset. If given, this value is added to the result, after it has + been divided by the scale factor. + """ + + name = "Kernel" + + def __init__( + self, + size: tuple[int, int], + kernel: Sequence[float], + scale: float | None = None, + offset: float = 0, + ) -> None: + if scale is None: + # default scale is sum of kernel + scale = functools.reduce(lambda a, b: a + b, kernel) + if size[0] * size[1] != len(kernel): + msg = "not enough coefficients in kernel" + raise ValueError(msg) + self.filterargs = size, scale, offset, kernel + + +class RankFilter(Filter): + """ + Create a rank filter. The rank filter sorts all pixels in + a window of the given size, and returns the ``rank``'th value. + + :param size: The kernel size, in pixels. + :param rank: What pixel value to pick. Use 0 for a min filter, + ``size * size / 2`` for a median filter, ``size * size - 1`` + for a max filter, etc. + """ + + name = "Rank" + + def __init__(self, size: int, rank: int) -> None: + self.size = size + self.rank = rank + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + if image.mode == "P": + msg = "cannot filter palette images" + raise ValueError(msg) + image = image.expand(self.size // 2, self.size // 2) + return image.rankfilter(self.size, self.rank) + + +class MedianFilter(RankFilter): + """ + Create a median filter. Picks the median pixel value in a window with the + given size. + + :param size: The kernel size, in pixels. + """ + + name = "Median" + + def __init__(self, size: int = 3) -> None: + self.size = size + self.rank = size * size // 2 + + +class MinFilter(RankFilter): + """ + Create a min filter. Picks the lowest pixel value in a window with the + given size. + + :param size: The kernel size, in pixels. + """ + + name = "Min" + + def __init__(self, size: int = 3) -> None: + self.size = size + self.rank = 0 + + +class MaxFilter(RankFilter): + """ + Create a max filter. Picks the largest pixel value in a window with the + given size. + + :param size: The kernel size, in pixels. + """ + + name = "Max" + + def __init__(self, size: int = 3) -> None: + self.size = size + self.rank = size * size - 1 + + +class ModeFilter(Filter): + """ + Create a mode filter. Picks the most frequent pixel value in a box with the + given size. Pixel values that occur only once or twice are ignored; if no + pixel value occurs more than twice, the original pixel value is preserved. + + :param size: The kernel size, in pixels. + """ + + name = "Mode" + + def __init__(self, size: int = 3) -> None: + self.size = size + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + return image.modefilter(self.size) + + +class GaussianBlur(MultibandFilter): + """Blurs the image with a sequence of extended box filters, which + approximates a Gaussian kernel. For details on accuracy see + + + :param radius: Standard deviation of the Gaussian kernel. Either a sequence of two + numbers for x and y, or a single number for both. + """ + + name = "GaussianBlur" + + def __init__(self, radius: float | Sequence[float] = 2) -> None: + self.radius = radius + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + xy = self.radius + if isinstance(xy, (int, float)): + xy = (xy, xy) + if xy == (0, 0): + return image.copy() + return image.gaussian_blur(xy) + + +class BoxBlur(MultibandFilter): + """Blurs the image by setting each pixel to the average value of the pixels + in a square box extending radius pixels in each direction. + Supports float radius of arbitrary size. Uses an optimized implementation + which runs in linear time relative to the size of the image + for any radius value. + + :param radius: Size of the box in a direction. Either a sequence of two numbers for + x and y, or a single number for both. + + Radius 0 does not blur, returns an identical image. + Radius 1 takes 1 pixel in each direction, i.e. 9 pixels in total. + """ + + name = "BoxBlur" + + def __init__(self, radius: float | Sequence[float]) -> None: + xy = radius if isinstance(radius, (tuple, list)) else (radius, radius) + if xy[0] < 0 or xy[1] < 0: + msg = "radius must be >= 0" + raise ValueError(msg) + self.radius = radius + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + xy = self.radius + if isinstance(xy, (int, float)): + xy = (xy, xy) + if xy == (0, 0): + return image.copy() + return image.box_blur(xy) + + +class UnsharpMask(MultibandFilter): + """Unsharp mask filter. + + See Wikipedia's entry on `digital unsharp masking`_ for an explanation of + the parameters. + + :param radius: Blur Radius + :param percent: Unsharp strength, in percent + :param threshold: Threshold controls the minimum brightness change that + will be sharpened + + .. _digital unsharp masking: https://en.wikipedia.org/wiki/Unsharp_masking#Digital_unsharp_masking + + """ + + name = "UnsharpMask" + + def __init__( + self, radius: float = 2, percent: int = 150, threshold: int = 3 + ) -> None: + self.radius = radius + self.percent = percent + self.threshold = threshold + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + return image.unsharp_mask(self.radius, self.percent, self.threshold) + + +class BLUR(BuiltinFilter): + name = "Blur" + # fmt: off + filterargs = (5, 5), 16, 0, ( + 1, 1, 1, 1, 1, + 1, 0, 0, 0, 1, + 1, 0, 0, 0, 1, + 1, 0, 0, 0, 1, + 1, 1, 1, 1, 1, + ) + # fmt: on + + +class CONTOUR(BuiltinFilter): + name = "Contour" + # fmt: off + filterargs = (3, 3), 1, 255, ( + -1, -1, -1, + -1, 8, -1, + -1, -1, -1, + ) + # fmt: on + + +class DETAIL(BuiltinFilter): + name = "Detail" + # fmt: off + filterargs = (3, 3), 6, 0, ( + 0, -1, 0, + -1, 10, -1, + 0, -1, 0, + ) + # fmt: on + + +class EDGE_ENHANCE(BuiltinFilter): + name = "Edge-enhance" + # fmt: off + filterargs = (3, 3), 2, 0, ( + -1, -1, -1, + -1, 10, -1, + -1, -1, -1, + ) + # fmt: on + + +class EDGE_ENHANCE_MORE(BuiltinFilter): + name = "Edge-enhance More" + # fmt: off + filterargs = (3, 3), 1, 0, ( + -1, -1, -1, + -1, 9, -1, + -1, -1, -1, + ) + # fmt: on + + +class EMBOSS(BuiltinFilter): + name = "Emboss" + # fmt: off + filterargs = (3, 3), 1, 128, ( + -1, 0, 0, + 0, 1, 0, + 0, 0, 0, + ) + # fmt: on + + +class FIND_EDGES(BuiltinFilter): + name = "Find Edges" + # fmt: off + filterargs = (3, 3), 1, 0, ( + -1, -1, -1, + -1, 8, -1, + -1, -1, -1, + ) + # fmt: on + + +class SHARPEN(BuiltinFilter): + name = "Sharpen" + # fmt: off + filterargs = (3, 3), 16, 0, ( + -2, -2, -2, + -2, 32, -2, + -2, -2, -2, + ) + # fmt: on + + +class SMOOTH(BuiltinFilter): + name = "Smooth" + # fmt: off + filterargs = (3, 3), 13, 0, ( + 1, 1, 1, + 1, 5, 1, + 1, 1, 1, + ) + # fmt: on + + +class SMOOTH_MORE(BuiltinFilter): + name = "Smooth More" + # fmt: off + filterargs = (5, 5), 100, 0, ( + 1, 1, 1, 1, 1, + 1, 5, 5, 5, 1, + 1, 5, 44, 5, 1, + 1, 5, 5, 5, 1, + 1, 1, 1, 1, 1, + ) + # fmt: on + + +class Color3DLUT(MultibandFilter): + """Three-dimensional color lookup table. + + Transforms 3-channel pixels using the values of the channels as coordinates + in the 3D lookup table and interpolating the nearest elements. + + This method allows you to apply almost any color transformation + in constant time by using pre-calculated decimated tables. + + .. versionadded:: 5.2.0 + + :param size: Size of the table. One int or tuple of (int, int, int). + Minimal size in any dimension is 2, maximum is 65. + :param table: Flat lookup table. A list of ``channels * size**3`` + float elements or a list of ``size**3`` channels-sized + tuples with floats. Channels are changed first, + then first dimension, then second, then third. + Value 0.0 corresponds lowest value of output, 1.0 highest. + :param channels: Number of channels in the table. Could be 3 or 4. + Default is 3. + :param target_mode: A mode for the result image. Should have not less + than ``channels`` channels. Default is ``None``, + which means that mode wouldn't be changed. + """ + + name = "Color 3D LUT" + + def __init__( + self, + size: int | tuple[int, int, int], + table: Sequence[float] | Sequence[Sequence[int]] | NumpyArray, + channels: int = 3, + target_mode: str | None = None, + **kwargs: bool, + ) -> None: + if channels not in (3, 4): + msg = "Only 3 or 4 output channels are supported" + raise ValueError(msg) + self.size = size = self._check_size(size) + self.channels = channels + self.mode = target_mode + + # Hidden flag `_copy_table=False` could be used to avoid extra copying + # of the table if the table is specially made for the constructor. + copy_table = kwargs.get("_copy_table", True) + items = size[0] * size[1] * size[2] + wrong_size = False + + numpy: ModuleType | None = None + if hasattr(table, "shape"): + try: + import numpy + except ImportError: + pass + + if numpy and isinstance(table, numpy.ndarray): + numpy_table: NumpyArray = table + if copy_table: + numpy_table = numpy_table.copy() + + if numpy_table.shape in [ + (items * channels,), + (items, channels), + (size[2], size[1], size[0], channels), + ]: + table = numpy_table.reshape(items * channels) + else: + wrong_size = True + + else: + if copy_table: + table = list(table) + + # Convert to a flat list + if table and isinstance(table[0], (list, tuple)): + raw_table = cast(Sequence[Sequence[int]], table) + flat_table: list[int] = [] + for pixel in raw_table: + if len(pixel) != channels: + msg = ( + "The elements of the table should " + f"have a length of {channels}." + ) + raise ValueError(msg) + flat_table.extend(pixel) + table = flat_table + + if wrong_size or len(table) != items * channels: + msg = ( + "The table should have either channels * size**3 float items " + "or size**3 items of channels-sized tuples with floats. " + f"Table should be: {channels}x{size[0]}x{size[1]}x{size[2]}. " + f"Actual length: {len(table)}" + ) + raise ValueError(msg) + self.table = table + + @staticmethod + def _check_size(size: Any) -> tuple[int, int, int]: + try: + _, _, _ = size + except ValueError as e: + msg = "Size should be either an integer or a tuple of three integers." + raise ValueError(msg) from e + except TypeError: + size = (size, size, size) + size = tuple(int(x) for x in size) + for size_1d in size: + if not 2 <= size_1d <= 65: + msg = "Size should be in [2, 65] range." + raise ValueError(msg) + return size + + @classmethod + def generate( + cls, + size: int | tuple[int, int, int], + callback: Callable[[float, float, float], tuple[float, ...]], + channels: int = 3, + target_mode: str | None = None, + ) -> Color3DLUT: + """Generates new LUT using provided callback. + + :param size: Size of the table. Passed to the constructor. + :param callback: Function with three parameters which correspond + three color channels. Will be called ``size**3`` + times with values from 0.0 to 1.0 and should return + a tuple with ``channels`` elements. + :param channels: The number of channels which should return callback. + :param target_mode: Passed to the constructor of the resulting + lookup table. + """ + size_1d, size_2d, size_3d = cls._check_size(size) + if channels not in (3, 4): + msg = "Only 3 or 4 output channels are supported" + raise ValueError(msg) + + table: list[float] = [0] * (size_1d * size_2d * size_3d * channels) + idx_out = 0 + for b in range(size_3d): + for g in range(size_2d): + for r in range(size_1d): + table[idx_out : idx_out + channels] = callback( + r / (size_1d - 1), g / (size_2d - 1), b / (size_3d - 1) + ) + idx_out += channels + + return cls( + (size_1d, size_2d, size_3d), + table, + channels=channels, + target_mode=target_mode, + _copy_table=False, + ) + + def transform( + self, + callback: Callable[..., tuple[float, ...]], + with_normals: bool = False, + channels: int | None = None, + target_mode: str | None = None, + ) -> Color3DLUT: + """Transforms the table values using provided callback and returns + a new LUT with altered values. + + :param callback: A function which takes old lookup table values + and returns a new set of values. The number + of arguments which function should take is + ``self.channels`` or ``3 + self.channels`` + if ``with_normals`` flag is set. + Should return a tuple of ``self.channels`` or + ``channels`` elements if it is set. + :param with_normals: If true, ``callback`` will be called with + coordinates in the color cube as the first + three arguments. Otherwise, ``callback`` + will be called only with actual color values. + :param channels: The number of channels in the resulting lookup table. + :param target_mode: Passed to the constructor of the resulting + lookup table. + """ + if channels not in (None, 3, 4): + msg = "Only 3 or 4 output channels are supported" + raise ValueError(msg) + ch_in = self.channels + ch_out = channels or ch_in + size_1d, size_2d, size_3d = self.size + + table: list[float] = [0] * (size_1d * size_2d * size_3d * ch_out) + idx_in = 0 + idx_out = 0 + for b in range(size_3d): + for g in range(size_2d): + for r in range(size_1d): + values = self.table[idx_in : idx_in + ch_in] + if with_normals: + values = callback( + r / (size_1d - 1), + g / (size_2d - 1), + b / (size_3d - 1), + *values, + ) + else: + values = callback(*values) + table[idx_out : idx_out + ch_out] = values + idx_in += ch_in + idx_out += ch_out + + return type(self)( + self.size, + table, + channels=ch_out, + target_mode=target_mode or self.mode, + _copy_table=False, + ) + + def __repr__(self) -> str: + r = [ + f"{self.__class__.__name__} from {self.table.__class__.__name__}", + "size={:d}x{:d}x{:d}".format(*self.size), + f"channels={self.channels:d}", + ] + if self.mode: + r.append(f"target_mode={self.mode}") + return "<{}>".format(" ".join(r)) + + def filter(self, image: _imaging.ImagingCore) -> _imaging.ImagingCore: + from . import Image + + return image.color_lut_3d( + self.mode or image.mode, + Image.Resampling.BILINEAR, + self.channels, + self.size, + self.table, + ) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageFont.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageFont.py new file mode 100644 index 000000000..06ea0359c --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageFont.py @@ -0,0 +1,1309 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PIL raster font management +# +# History: +# 1996-08-07 fl created (experimental) +# 1997-08-25 fl minor adjustments to handle fonts from pilfont 0.3 +# 1999-02-06 fl rewrote most font management stuff in C +# 1999-03-17 fl take pth files into account in load_path (from Richard Jones) +# 2001-02-17 fl added freetype support +# 2001-05-09 fl added TransposedFont wrapper class +# 2002-03-04 fl make sure we have a "L" or "1" font +# 2002-12-04 fl skip non-directory entries in the system path +# 2003-04-29 fl add embedded default font +# 2003-09-27 fl added support for truetype charmap encodings +# +# Todo: +# Adapt to PILFONT2 format (16-bit fonts, compressed, single file) +# +# Copyright (c) 1997-2003 by Secret Labs AB +# Copyright (c) 1996-2003 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# + +from __future__ import annotations + +import base64 +import os +import sys +import warnings +from enum import IntEnum +from io import BytesIO +from types import ModuleType +from typing import IO, Any, BinaryIO, TypedDict, cast + +from . import Image +from ._typing import StrOrBytesPath +from ._util import DeferredError, is_path + +TYPE_CHECKING = False +if TYPE_CHECKING: + from . import ImageFile + from ._imaging import ImagingFont + from ._imagingft import Font + + +class Axis(TypedDict): + minimum: int | None + default: int | None + maximum: int | None + name: bytes | None + + +class Layout(IntEnum): + BASIC = 0 + RAQM = 1 + + +MAX_STRING_LENGTH = 1_000_000 + + +core: ModuleType | DeferredError +try: + from . import _imagingft as core +except ImportError as ex: + core = DeferredError.new(ex) + + +def _string_length_check(text: str | bytes | bytearray) -> None: + if MAX_STRING_LENGTH is not None and len(text) > MAX_STRING_LENGTH: + msg = "too many characters in string" + raise ValueError(msg) + + +# FIXME: add support for pilfont2 format (see FontFile.py) + +# -------------------------------------------------------------------- +# Font metrics format: +# "PILfont" LF +# fontdescriptor LF +# (optional) key=value... LF +# "DATA" LF +# binary data: 256*10*2 bytes (dx, dy, dstbox, srcbox) +# +# To place a character, cut out srcbox and paste at dstbox, +# relative to the character position. Then move the character +# position according to dx, dy. +# -------------------------------------------------------------------- + + +class ImageFont: + """PIL font wrapper""" + + font: ImagingFont + + def _load_pilfont(self, filename: str) -> None: + with open(filename, "rb") as fp: + image: ImageFile.ImageFile | None = None + root = os.path.splitext(filename)[0] + + for ext in (".png", ".gif", ".pbm"): + if image: + image.close() + try: + fullname = root + ext + image = Image.open(fullname) + except Exception: + pass + else: + if image.mode in ("1", "L"): + break + else: + if image: + image.close() + + msg = f"cannot find glyph data file {root}.{{gif|pbm|png}}" + raise OSError(msg) + + self.file = fullname + + self._load_pilfont_data(fp, image) + image.close() + + def _load_pilfont_data(self, file: IO[bytes], image: Image.Image) -> None: + # check image + if image.mode not in ("1", "L"): + image.close() + + msg = "invalid font image mode" + raise TypeError(msg) + + # read PILfont header + if file.read(8) != b"PILfont\n": + image.close() + + msg = "Not a PILfont file" + raise SyntaxError(msg) + file.readline() + self.info = [] # FIXME: should be a dictionary + while True: + s = file.readline() + if not s or s == b"DATA\n": + break + self.info.append(s) + + # read PILfont metrics + data = file.read(256 * 20) + + self._load(image, data) + + def _load(self, image: Image.Image, data: bytes) -> None: + image.load() + + self.font = Image.core.font(image.im, data) + + def getmask( + self, text: str | bytes, mode: str = "", *args: Any, **kwargs: Any + ) -> Image.core.ImagingCore: + """ + Create a bitmap for the text. + + If the font uses antialiasing, the bitmap should have mode ``L`` and use a + maximum value of 255. Otherwise, it should have mode ``1``. + + :param text: Text to render. + :param mode: Used by some graphics drivers to indicate what mode the + driver prefers; if empty, the renderer may return either + mode. Note that the mode is always a string, to simplify + C-level implementations. + + .. versionadded:: 1.1.5 + + :return: An internal PIL storage memory instance as defined by the + :py:mod:`PIL.Image.core` interface module. + """ + _string_length_check(text) + Image._decompression_bomb_check(self.font.getsize(text)) + return self.font.getmask(text, mode) + + def getbbox( + self, text: str | bytes | bytearray, *args: Any, **kwargs: Any + ) -> tuple[int, int, int, int]: + """ + Returns bounding box (in pixels) of given text. + + .. versionadded:: 9.2.0 + + :param text: Text to render. + + :return: ``(left, top, right, bottom)`` bounding box + """ + _string_length_check(text) + width, height = self.font.getsize(text) + return 0, 0, width, height + + def getlength( + self, text: str | bytes | bytearray, *args: Any, **kwargs: Any + ) -> int: + """ + Returns length (in pixels) of given text. + This is the amount by which following text should be offset. + + .. versionadded:: 9.2.0 + """ + _string_length_check(text) + width, height = self.font.getsize(text) + return width + + +## +# Wrapper for FreeType fonts. Application code should use the +# truetype factory function to create font objects. + + +class FreeTypeFont: + """FreeType font wrapper (requires _imagingft service)""" + + font: Font + font_bytes: bytes + + def __init__( + self, + font: StrOrBytesPath | BinaryIO, + size: float = 10, + index: int = 0, + encoding: str = "", + layout_engine: Layout | None = None, + ) -> None: + # FIXME: use service provider instead + + if isinstance(core, DeferredError): + raise core.ex + + if size <= 0: + msg = f"font size must be greater than 0, not {size}" + raise ValueError(msg) + + self.path = font + self.size = size + self.index = index + self.encoding = encoding + + if layout_engine not in (Layout.BASIC, Layout.RAQM): + layout_engine = Layout.BASIC + if core.HAVE_RAQM: + layout_engine = Layout.RAQM + elif layout_engine == Layout.RAQM and not core.HAVE_RAQM: + warnings.warn( + "Raqm layout was requested, but Raqm is not available. " + "Falling back to basic layout." + ) + layout_engine = Layout.BASIC + + self.layout_engine = layout_engine + + def load_from_bytes(f: IO[bytes]) -> None: + self.font_bytes = f.read() + self.font = core.getfont( + "", size, index, encoding, self.font_bytes, layout_engine + ) + + if is_path(font): + font = os.fspath(font) + if sys.platform == "win32": + font_bytes_path = font if isinstance(font, bytes) else font.encode() + try: + font_bytes_path.decode("ascii") + except UnicodeDecodeError: + # FreeType cannot load fonts with non-ASCII characters on Windows + # So load it into memory first + with open(font, "rb") as f: + load_from_bytes(f) + return + self.font = core.getfont( + font, size, index, encoding, layout_engine=layout_engine + ) + else: + load_from_bytes(cast(IO[bytes], font)) + + def __getstate__(self) -> list[Any]: + return [self.path, self.size, self.index, self.encoding, self.layout_engine] + + def __setstate__(self, state: list[Any]) -> None: + path, size, index, encoding, layout_engine = state + FreeTypeFont.__init__(self, path, size, index, encoding, layout_engine) + + def getname(self) -> tuple[str | None, str | None]: + """ + :return: A tuple of the font family (e.g. Helvetica) and the font style + (e.g. Bold) + """ + return self.font.family, self.font.style + + def getmetrics(self) -> tuple[int, int]: + """ + :return: A tuple of the font ascent (the distance from the baseline to + the highest outline point) and descent (the distance from the + baseline to the lowest outline point, a negative value) + """ + return self.font.ascent, self.font.descent + + def getlength( + self, + text: str | bytes, + mode: str = "", + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + ) -> float: + """ + Returns length (in pixels with 1/64 precision) of given text when rendered + in font with provided direction, features, and language. + + This is the amount by which following text should be offset. + Text bounding box may extend past the length in some fonts, + e.g. when using italics or accents. + + The result is returned as a float; it is a whole number if using basic layout. + + Note that the sum of two lengths may not equal the length of a concatenated + string due to kerning. If you need to adjust for kerning, include the following + character and subtract its length. + + For example, instead of :: + + hello = font.getlength("Hello") + world = font.getlength("World") + hello_world = hello + world # not adjusted for kerning + assert hello_world == font.getlength("HelloWorld") # may fail + + use :: + + hello = font.getlength("HelloW") - font.getlength("W") # adjusted for kerning + world = font.getlength("World") + hello_world = hello + world # adjusted for kerning + assert hello_world == font.getlength("HelloWorld") # True + + or disable kerning with (requires libraqm) :: + + hello = draw.textlength("Hello", font, features=["-kern"]) + world = draw.textlength("World", font, features=["-kern"]) + hello_world = hello + world # kerning is disabled, no need to adjust + assert hello_world == draw.textlength("HelloWorld", font, features=["-kern"]) + + .. versionadded:: 8.0.0 + + :param text: Text to measure. + :param mode: Used by some graphics drivers to indicate what mode the + driver prefers; if empty, the renderer may return either + mode. Note that the mode is always a string, to simplify + C-level implementations. + + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist + Requires libraqm. + + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP 47 language code + `_ + Requires libraqm. + + :return: Either width for horizontal text, or height for vertical text. + """ + _string_length_check(text) + return self.font.getlength(text, mode, direction, features, language) / 64 + + def getbbox( + self, + text: str | bytes, + mode: str = "", + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + stroke_width: float = 0, + anchor: str | None = None, + ) -> tuple[float, float, float, float]: + """ + Returns bounding box (in pixels) of given text relative to given anchor + when rendered in font with provided direction, features, and language. + + Use :py:meth:`getlength()` to get the offset of following text with + 1/64 pixel precision. The bounding box includes extra margins for + some fonts, e.g. italics or accents. + + .. versionadded:: 8.0.0 + + :param text: Text to render. + :param mode: Used by some graphics drivers to indicate what mode the + driver prefers; if empty, the renderer may return either + mode. Note that the mode is always a string, to simplify + C-level implementations. + + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist + Requires libraqm. + + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP 47 language code + `_ + Requires libraqm. + + :param stroke_width: The width of the text stroke. + + :param anchor: The text anchor alignment. Determines the relative location of + the anchor to the text. The default alignment is top left, + specifically ``la`` for horizontal text and ``lt`` for + vertical text. See :ref:`text-anchors` for details. + + :return: ``(left, top, right, bottom)`` bounding box + """ + _string_length_check(text) + size, offset = self.font.getsize( + text, mode, direction, features, language, anchor + ) + left, top = offset[0] - stroke_width, offset[1] - stroke_width + width, height = size[0] + 2 * stroke_width, size[1] + 2 * stroke_width + return left, top, left + width, top + height + + def getmask( + self, + text: str | bytes, + mode: str = "", + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + stroke_width: float = 0, + anchor: str | None = None, + ink: int = 0, + start: tuple[float, float] | None = None, + ) -> Image.core.ImagingCore: + """ + Create a bitmap for the text. + + If the font uses antialiasing, the bitmap should have mode ``L`` and use a + maximum value of 255. If the font has embedded color data, the bitmap + should have mode ``RGBA``. Otherwise, it should have mode ``1``. + + :param text: Text to render. + :param mode: Used by some graphics drivers to indicate what mode the + driver prefers; if empty, the renderer may return either + mode. Note that the mode is always a string, to simplify + C-level implementations. + + .. versionadded:: 1.1.5 + + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. + + .. versionadded:: 4.2.0 + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist + Requires libraqm. + + .. versionadded:: 4.2.0 + + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP 47 language code + `_ + Requires libraqm. + + .. versionadded:: 6.0.0 + + :param stroke_width: The width of the text stroke. + + .. versionadded:: 6.2.0 + + :param anchor: The text anchor alignment. Determines the relative location of + the anchor to the text. The default alignment is top left, + specifically ``la`` for horizontal text and ``lt`` for + vertical text. See :ref:`text-anchors` for details. + + .. versionadded:: 8.0.0 + + :param ink: Foreground ink for rendering in RGBA mode. + + .. versionadded:: 8.0.0 + + :param start: Tuple of horizontal and vertical offset, as text may render + differently when starting at fractional coordinates. + + .. versionadded:: 9.4.0 + + :return: An internal PIL storage memory instance as defined by the + :py:mod:`PIL.Image.core` interface module. + """ + return self.getmask2( + text, + mode, + direction=direction, + features=features, + language=language, + stroke_width=stroke_width, + anchor=anchor, + ink=ink, + start=start, + )[0] + + def getmask2( + self, + text: str | bytes, + mode: str = "", + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + stroke_width: float = 0, + anchor: str | None = None, + ink: int = 0, + start: tuple[float, float] | None = None, + *args: Any, + **kwargs: Any, + ) -> tuple[Image.core.ImagingCore, tuple[int, int]]: + """ + Create a bitmap for the text. + + If the font uses antialiasing, the bitmap should have mode ``L`` and use a + maximum value of 255. If the font has embedded color data, the bitmap + should have mode ``RGBA``. Otherwise, it should have mode ``1``. + + :param text: Text to render. + :param mode: Used by some graphics drivers to indicate what mode the + driver prefers; if empty, the renderer may return either + mode. Note that the mode is always a string, to simplify + C-level implementations. + + .. versionadded:: 1.1.5 + + :param direction: Direction of the text. It can be 'rtl' (right to + left), 'ltr' (left to right) or 'ttb' (top to bottom). + Requires libraqm. + + .. versionadded:: 4.2.0 + + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional + font features that are not enabled by default, + for example 'dlig' or 'ss01', but can be also + used to turn off default font features for + example '-liga' to disable ligatures or '-kern' + to disable kerning. To get all supported + features, see + https://learn.microsoft.com/en-us/typography/opentype/spec/featurelist + Requires libraqm. + + .. versionadded:: 4.2.0 + + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP 47 language code + `_ + Requires libraqm. + + .. versionadded:: 6.0.0 + + :param stroke_width: The width of the text stroke. + + .. versionadded:: 6.2.0 + + :param anchor: The text anchor alignment. Determines the relative location of + the anchor to the text. The default alignment is top left, + specifically ``la`` for horizontal text and ``lt`` for + vertical text. See :ref:`text-anchors` for details. + + .. versionadded:: 8.0.0 + + :param ink: Foreground ink for rendering in RGBA mode. + + .. versionadded:: 8.0.0 + + :param start: Tuple of horizontal and vertical offset, as text may render + differently when starting at fractional coordinates. + + .. versionadded:: 9.4.0 + + :return: A tuple of an internal PIL storage memory instance as defined by the + :py:mod:`PIL.Image.core` interface module, and the text offset, the + gap between the starting coordinate and the first marking + """ + _string_length_check(text) + if start is None: + start = (0, 0) + + def fill(width: int, height: int) -> Image.core.ImagingCore: + size = (width, height) + Image._decompression_bomb_check(size) + return Image.core.fill("RGBA" if mode == "RGBA" else "L", size) + + return self.font.render( + text, + fill, + mode, + direction, + features, + language, + stroke_width, + kwargs.get("stroke_filled", False), + anchor, + ink, + start, + ) + + def font_variant( + self, + font: StrOrBytesPath | BinaryIO | None = None, + size: float | None = None, + index: int | None = None, + encoding: str | None = None, + layout_engine: Layout | None = None, + ) -> FreeTypeFont: + """ + Create a copy of this FreeTypeFont object, + using any specified arguments to override the settings. + + Parameters are identical to the parameters used to initialize this + object. + + :return: A FreeTypeFont object. + """ + if font is None: + try: + font = BytesIO(self.font_bytes) + except AttributeError: + font = self.path + return FreeTypeFont( + font=font, + size=self.size if size is None else size, + index=self.index if index is None else index, + encoding=self.encoding if encoding is None else encoding, + layout_engine=layout_engine or self.layout_engine, + ) + + def get_variation_names(self) -> list[bytes]: + """ + :returns: A list of the named styles in a variation font. + :exception OSError: If the font is not a variation font. + """ + names = [] + for name in self.font.getvarnames(): + name = name.replace(b"\x00", b"") + if name not in names: + names.append(name) + return names + + def set_variation_by_name(self, name: str | bytes) -> None: + """ + :param name: The name of the style. + :exception OSError: If the font is not a variation font. + """ + names = self.get_variation_names() + if not isinstance(name, bytes): + name = name.encode() + index = names.index(name) + 1 + + if index == getattr(self, "_last_variation_index", None): + # When the same name is set twice in a row, + # there is an 'unknown freetype error' + # https://savannah.nongnu.org/bugs/?56186 + return + self._last_variation_index = index + + self.font.setvarname(index) + + def get_variation_axes(self) -> list[Axis]: + """ + :returns: A list of the axes in a variation font. + :exception OSError: If the font is not a variation font. + """ + axes = self.font.getvaraxes() + for axis in axes: + if axis["name"]: + axis["name"] = axis["name"].replace(b"\x00", b"") + return axes + + def set_variation_by_axes(self, axes: list[float]) -> None: + """ + :param axes: A list of values for each axis. + :exception OSError: If the font is not a variation font. + """ + self.font.setvaraxes(axes) + + +class TransposedFont: + """Wrapper for writing rotated or mirrored text""" + + def __init__( + self, font: ImageFont | FreeTypeFont, orientation: Image.Transpose | None = None + ): + """ + Wrapper that creates a transposed font from any existing font + object. + + :param font: A font object. + :param orientation: An optional orientation. If given, this should + be one of Image.Transpose.FLIP_LEFT_RIGHT, Image.Transpose.FLIP_TOP_BOTTOM, + Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_180, or + Image.Transpose.ROTATE_270. + """ + self.font = font + self.orientation = orientation # any 'transpose' argument, or None + + def getmask( + self, text: str | bytes, mode: str = "", *args: Any, **kwargs: Any + ) -> Image.core.ImagingCore: + im = self.font.getmask(text, mode, *args, **kwargs) + if self.orientation is not None: + return im.transpose(self.orientation) + return im + + def getbbox( + self, text: str | bytes, *args: Any, **kwargs: Any + ) -> tuple[int, int, float, float]: + # TransposedFont doesn't support getmask2, move top-left point to (0, 0) + # this has no effect on ImageFont and simulates anchor="lt" for FreeTypeFont + left, top, right, bottom = self.font.getbbox(text, *args, **kwargs) + width = right - left + height = bottom - top + if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): + return 0, 0, height, width + return 0, 0, width, height + + def getlength(self, text: str | bytes, *args: Any, **kwargs: Any) -> float: + if self.orientation in (Image.Transpose.ROTATE_90, Image.Transpose.ROTATE_270): + msg = "text length is undefined for text rotated by 90 or 270 degrees" + raise ValueError(msg) + return self.font.getlength(text, *args, **kwargs) + + +def load(filename: str) -> ImageFont: + """ + Load a font file. This function loads a font object from the given + bitmap font file, and returns the corresponding font object. For loading TrueType + or OpenType fonts instead, see :py:func:`~PIL.ImageFont.truetype`. + + :param filename: Name of font file. + :return: A font object. + :exception OSError: If the file could not be read. + """ + f = ImageFont() + f._load_pilfont(filename) + return f + + +def truetype( + font: StrOrBytesPath | BinaryIO, + size: float = 10, + index: int = 0, + encoding: str = "", + layout_engine: Layout | None = None, +) -> FreeTypeFont: + """ + Load a TrueType or OpenType font from a file or file-like object, + and create a font object. This function loads a font object from the given + file or file-like object, and creates a font object for a font of the given + size. For loading bitmap fonts instead, see :py:func:`~PIL.ImageFont.load` + and :py:func:`~PIL.ImageFont.load_path`. + + Pillow uses FreeType to open font files. On Windows, be aware that FreeType + will keep the file open as long as the FreeTypeFont object exists. Windows + limits the number of files that can be open in C at once to 512, so if many + fonts are opened simultaneously and that limit is approached, an + ``OSError`` may be thrown, reporting that FreeType "cannot open resource". + A workaround would be to copy the file(s) into memory, and open that instead. + + This function requires the _imagingft service. + + :param font: A filename or file-like object containing a TrueType font. + If the file is not found in this filename, the loader may also + search in other directories, such as: + + * The :file:`fonts/` directory on Windows, + * :file:`/Library/Fonts/`, :file:`/System/Library/Fonts/` + and :file:`~/Library/Fonts/` on macOS. + * :file:`~/.local/share/fonts`, :file:`/usr/local/share/fonts`, + and :file:`/usr/share/fonts` on Linux; or those specified by + the ``XDG_DATA_HOME`` and ``XDG_DATA_DIRS`` environment variables + for user-installed and system-wide fonts, respectively. + + :param size: The requested size, in pixels. + :param index: Which font face to load (default is first available face). + :param encoding: Which font encoding to use (default is Unicode). Possible + encodings include (see the FreeType documentation for more + information): + + * "unic" (Unicode) + * "symb" (Microsoft Symbol) + * "ADOB" (Adobe Standard) + * "ADBE" (Adobe Expert) + * "ADBC" (Adobe Custom) + * "armn" (Apple Roman) + * "sjis" (Shift JIS) + * "gb " (PRC) + * "big5" + * "wans" (Extended Wansung) + * "joha" (Johab) + * "lat1" (Latin-1) + + This specifies the character set to use. It does not alter the + encoding of any text provided in subsequent operations. + :param layout_engine: Which layout engine to use, if available: + :attr:`.ImageFont.Layout.BASIC` or :attr:`.ImageFont.Layout.RAQM`. + If it is available, Raqm layout will be used by default. + Otherwise, basic layout will be used. + + Raqm layout is recommended for all non-English text. If Raqm layout + is not required, basic layout will have better performance. + + You can check support for Raqm layout using + :py:func:`PIL.features.check_feature` with ``feature="raqm"``. + + .. versionadded:: 4.2.0 + :return: A font object. + :exception OSError: If the file could not be read. + :exception ValueError: If the font size is not greater than zero. + """ + + def freetype(font: StrOrBytesPath | BinaryIO) -> FreeTypeFont: + return FreeTypeFont(font, size, index, encoding, layout_engine) + + try: + return freetype(font) + except OSError: + if not is_path(font): + raise + ttf_filename = os.path.basename(font) + + dirs = [] + if sys.platform == "win32": + # check the windows font repository + # NOTE: must use uppercase WINDIR, to work around bugs in + # 1.5.2's os.environ.get() + windir = os.environ.get("WINDIR") + if windir: + dirs.append(os.path.join(windir, "fonts")) + elif sys.platform in ("linux", "linux2"): + data_home = os.environ.get("XDG_DATA_HOME") + if not data_home: + # The freedesktop spec defines the following default directory for + # when XDG_DATA_HOME is unset or empty. This user-level directory + # takes precedence over system-level directories. + data_home = os.path.expanduser("~/.local/share") + xdg_dirs = [data_home] + + data_dirs = os.environ.get("XDG_DATA_DIRS") + if not data_dirs: + # Similarly, defaults are defined for the system-level directories + data_dirs = "/usr/local/share:/usr/share" + xdg_dirs += data_dirs.split(":") + + dirs += [os.path.join(xdg_dir, "fonts") for xdg_dir in xdg_dirs] + elif sys.platform == "darwin": + dirs += [ + "/Library/Fonts", + "/System/Library/Fonts", + os.path.expanduser("~/Library/Fonts"), + ] + + ext = os.path.splitext(ttf_filename)[1] + first_font_with_a_different_extension = None + for directory in dirs: + for walkroot, walkdir, walkfilenames in os.walk(directory): + for walkfilename in walkfilenames: + if ext and walkfilename == ttf_filename: + return freetype(os.path.join(walkroot, walkfilename)) + elif not ext and os.path.splitext(walkfilename)[0] == ttf_filename: + fontpath = os.path.join(walkroot, walkfilename) + if os.path.splitext(fontpath)[1] == ".ttf": + return freetype(fontpath) + if not ext and first_font_with_a_different_extension is None: + first_font_with_a_different_extension = fontpath + if first_font_with_a_different_extension: + return freetype(first_font_with_a_different_extension) + raise + + +def load_path(filename: str | bytes) -> ImageFont: + """ + Load font file. Same as :py:func:`~PIL.ImageFont.load`, but searches for a + bitmap font along the Python path. + + :param filename: Name of font file. + :return: A font object. + :exception OSError: If the file could not be read. + """ + if not isinstance(filename, str): + filename = filename.decode("utf-8") + for directory in sys.path: + try: + return load(os.path.join(directory, filename)) + except OSError: # noqa: PERF203 + pass + msg = f'cannot find font file "{filename}" in sys.path' + if os.path.exists(filename): + msg += f', did you mean ImageFont.load("{filename}") instead?' + + raise OSError(msg) + + +def load_default_imagefont() -> ImageFont: + f = ImageFont() + f._load_pilfont_data( + # courB08 + BytesIO(base64.b64decode(b""" +UElMZm9udAo7Ozs7OzsxMDsKREFUQQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAA//8AAQAAAAAAAAABAAEA +BgAAAAH/+gADAAAAAQAAAAMABgAGAAAAAf/6AAT//QADAAAABgADAAYAAAAA//kABQABAAYAAAAL +AAgABgAAAAD/+AAFAAEACwAAABAACQAGAAAAAP/5AAUAAAAQAAAAFQAHAAYAAP////oABQAAABUA +AAAbAAYABgAAAAH/+QAE//wAGwAAAB4AAwAGAAAAAf/5AAQAAQAeAAAAIQAIAAYAAAAB//kABAAB +ACEAAAAkAAgABgAAAAD/+QAE//0AJAAAACgABAAGAAAAAP/6AAX//wAoAAAALQAFAAYAAAAB//8A +BAACAC0AAAAwAAMABgAAAAD//AAF//0AMAAAADUAAQAGAAAAAf//AAMAAAA1AAAANwABAAYAAAAB +//kABQABADcAAAA7AAgABgAAAAD/+QAFAAAAOwAAAEAABwAGAAAAAP/5AAYAAABAAAAARgAHAAYA +AAAA//kABQAAAEYAAABLAAcABgAAAAD/+QAFAAAASwAAAFAABwAGAAAAAP/5AAYAAABQAAAAVgAH +AAYAAAAA//kABQAAAFYAAABbAAcABgAAAAD/+QAFAAAAWwAAAGAABwAGAAAAAP/5AAUAAABgAAAA +ZQAHAAYAAAAA//kABQAAAGUAAABqAAcABgAAAAD/+QAFAAAAagAAAG8ABwAGAAAAAf/8AAMAAABv +AAAAcQAEAAYAAAAA//wAAwACAHEAAAB0AAYABgAAAAD/+gAE//8AdAAAAHgABQAGAAAAAP/7AAT/ +/gB4AAAAfAADAAYAAAAB//oABf//AHwAAACAAAUABgAAAAD/+gAFAAAAgAAAAIUABgAGAAAAAP/5 +AAYAAQCFAAAAiwAIAAYAAP////oABgAAAIsAAACSAAYABgAA////+gAFAAAAkgAAAJgABgAGAAAA +AP/6AAUAAACYAAAAnQAGAAYAAP////oABQAAAJ0AAACjAAYABgAA////+gAFAAAAowAAAKkABgAG +AAD////6AAUAAACpAAAArwAGAAYAAAAA//oABQAAAK8AAAC0AAYABgAA////+gAGAAAAtAAAALsA +BgAGAAAAAP/6AAQAAAC7AAAAvwAGAAYAAP////oABQAAAL8AAADFAAYABgAA////+gAGAAAAxQAA +AMwABgAGAAD////6AAUAAADMAAAA0gAGAAYAAP////oABQAAANIAAADYAAYABgAA////+gAGAAAA +2AAAAN8ABgAGAAAAAP/6AAUAAADfAAAA5AAGAAYAAP////oABQAAAOQAAADqAAYABgAAAAD/+gAF +AAEA6gAAAO8ABwAGAAD////6AAYAAADvAAAA9gAGAAYAAAAA//oABQAAAPYAAAD7AAYABgAA//// ++gAFAAAA+wAAAQEABgAGAAD////6AAYAAAEBAAABCAAGAAYAAP////oABgAAAQgAAAEPAAYABgAA +////+gAGAAABDwAAARYABgAGAAAAAP/6AAYAAAEWAAABHAAGAAYAAP////oABgAAARwAAAEjAAYA +BgAAAAD/+gAFAAABIwAAASgABgAGAAAAAf/5AAQAAQEoAAABKwAIAAYAAAAA//kABAABASsAAAEv +AAgABgAAAAH/+QAEAAEBLwAAATIACAAGAAAAAP/5AAX//AEyAAABNwADAAYAAAAAAAEABgACATcA +AAE9AAEABgAAAAH/+QAE//wBPQAAAUAAAwAGAAAAAP/7AAYAAAFAAAABRgAFAAYAAP////kABQAA +AUYAAAFMAAcABgAAAAD/+wAFAAABTAAAAVEABQAGAAAAAP/5AAYAAAFRAAABVwAHAAYAAAAA//sA +BQAAAVcAAAFcAAUABgAAAAD/+QAFAAABXAAAAWEABwAGAAAAAP/7AAYAAgFhAAABZwAHAAYAAP// +//kABQAAAWcAAAFtAAcABgAAAAD/+QAGAAABbQAAAXMABwAGAAAAAP/5AAQAAgFzAAABdwAJAAYA +AP////kABgAAAXcAAAF+AAcABgAAAAD/+QAGAAABfgAAAYQABwAGAAD////7AAUAAAGEAAABigAF +AAYAAP////sABQAAAYoAAAGQAAUABgAAAAD/+wAFAAABkAAAAZUABQAGAAD////7AAUAAgGVAAAB +mwAHAAYAAAAA//sABgACAZsAAAGhAAcABgAAAAD/+wAGAAABoQAAAacABQAGAAAAAP/7AAYAAAGn +AAABrQAFAAYAAAAA//kABgAAAa0AAAGzAAcABgAA////+wAGAAABswAAAboABQAGAAD////7AAUA +AAG6AAABwAAFAAYAAP////sABgAAAcAAAAHHAAUABgAAAAD/+wAGAAABxwAAAc0ABQAGAAD////7 +AAYAAgHNAAAB1AAHAAYAAAAA//sABQAAAdQAAAHZAAUABgAAAAH/+QAFAAEB2QAAAd0ACAAGAAAA +Av/6AAMAAQHdAAAB3gAHAAYAAAAA//kABAABAd4AAAHiAAgABgAAAAD/+wAF//0B4gAAAecAAgAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAAAB +//sAAwACAecAAAHpAAcABgAAAAD/+QAFAAEB6QAAAe4ACAAGAAAAAP/5AAYAAAHuAAAB9AAHAAYA +AAAA//oABf//AfQAAAH5AAUABgAAAAD/+QAGAAAB+QAAAf8ABwAGAAAAAv/5AAMAAgH/AAACAAAJ +AAYAAAAA//kABQABAgAAAAIFAAgABgAAAAH/+gAE//sCBQAAAggAAQAGAAAAAP/5AAYAAAIIAAAC +DgAHAAYAAAAB//kABf/+Ag4AAAISAAUABgAA////+wAGAAACEgAAAhkABQAGAAAAAP/7AAX//gIZ +AAACHgADAAYAAAAA//wABf/9Ah4AAAIjAAEABgAAAAD/+QAHAAACIwAAAioABwAGAAAAAP/6AAT/ ++wIqAAACLgABAAYAAAAA//kABP/8Ai4AAAIyAAMABgAAAAD/+gAFAAACMgAAAjcABgAGAAAAAf/5 +AAT//QI3AAACOgAEAAYAAAAB//kABP/9AjoAAAI9AAQABgAAAAL/+QAE//sCPQAAAj8AAgAGAAD/ +///7AAYAAgI/AAACRgAHAAYAAAAA//kABgABAkYAAAJMAAgABgAAAAH//AAD//0CTAAAAk4AAQAG +AAAAAf//AAQAAgJOAAACUQADAAYAAAAB//kABP/9AlEAAAJUAAQABgAAAAH/+QAF//4CVAAAAlgA +BQAGAAD////7AAYAAAJYAAACXwAFAAYAAP////kABgAAAl8AAAJmAAcABgAA////+QAGAAACZgAA +Am0ABwAGAAD////5AAYAAAJtAAACdAAHAAYAAAAA//sABQACAnQAAAJ5AAcABgAA////9wAGAAAC +eQAAAoAACQAGAAD////3AAYAAAKAAAAChwAJAAYAAP////cABgAAAocAAAKOAAkABgAA////9wAG +AAACjgAAApUACQAGAAD////4AAYAAAKVAAACnAAIAAYAAP////cABgAAApwAAAKjAAkABgAA//// ++gAGAAACowAAAqoABgAGAAAAAP/6AAUAAgKqAAACrwAIAAYAAP////cABQAAAq8AAAK1AAkABgAA +////9wAFAAACtQAAArsACQAGAAD////3AAUAAAK7AAACwQAJAAYAAP////gABQAAAsEAAALHAAgA +BgAAAAD/9wAEAAACxwAAAssACQAGAAAAAP/3AAQAAALLAAACzwAJAAYAAAAA//cABAAAAs8AAALT +AAkABgAAAAD/+AAEAAAC0wAAAtcACAAGAAD////6AAUAAALXAAAC3QAGAAYAAP////cABgAAAt0A +AALkAAkABgAAAAD/9wAFAAAC5AAAAukACQAGAAAAAP/3AAUAAALpAAAC7gAJAAYAAAAA//cABQAA +Au4AAALzAAkABgAAAAD/9wAFAAAC8wAAAvgACQAGAAAAAP/4AAUAAAL4AAAC/QAIAAYAAAAA//oA +Bf//Av0AAAMCAAUABgAA////+gAGAAADAgAAAwkABgAGAAD////3AAYAAAMJAAADEAAJAAYAAP// +//cABgAAAxAAAAMXAAkABgAA////9wAGAAADFwAAAx4ACQAGAAD////4AAYAAAAAAAoABwASAAYA +AP////cABgAAAAcACgAOABMABgAA////+gAFAAAADgAKABQAEAAGAAD////6AAYAAAAUAAoAGwAQ +AAYAAAAA//gABgAAABsACgAhABIABgAAAAD/+AAGAAAAIQAKACcAEgAGAAAAAP/4AAYAAAAnAAoA +LQASAAYAAAAA//gABgAAAC0ACgAzABIABgAAAAD/+QAGAAAAMwAKADkAEQAGAAAAAP/3AAYAAAA5 +AAoAPwATAAYAAP////sABQAAAD8ACgBFAA8ABgAAAAD/+wAFAAIARQAKAEoAEQAGAAAAAP/4AAUA +AABKAAoATwASAAYAAAAA//gABQAAAE8ACgBUABIABgAAAAD/+AAFAAAAVAAKAFkAEgAGAAAAAP/5 +AAUAAABZAAoAXgARAAYAAAAA//gABgAAAF4ACgBkABIABgAAAAD/+AAGAAAAZAAKAGoAEgAGAAAA +AP/4AAYAAABqAAoAcAASAAYAAAAA//kABgAAAHAACgB2ABEABgAAAAD/+AAFAAAAdgAKAHsAEgAG +AAD////4AAYAAAB7AAoAggASAAYAAAAA//gABQAAAIIACgCHABIABgAAAAD/+AAFAAAAhwAKAIwA +EgAGAAAAAP/4AAUAAACMAAoAkQASAAYAAAAA//gABQAAAJEACgCWABIABgAAAAD/+QAFAAAAlgAK +AJsAEQAGAAAAAP/6AAX//wCbAAoAoAAPAAYAAAAA//oABQABAKAACgClABEABgAA////+AAGAAAA +pQAKAKwAEgAGAAD////4AAYAAACsAAoAswASAAYAAP////gABgAAALMACgC6ABIABgAA////+QAG +AAAAugAKAMEAEQAGAAD////4AAYAAgDBAAoAyAAUAAYAAP////kABQACAMgACgDOABMABgAA//// ++QAGAAIAzgAKANUAEw== +""")), + Image.open(BytesIO(base64.b64decode(b""" +iVBORw0KGgoAAAANSUhEUgAAAx4AAAAUAQAAAAArMtZoAAAEwElEQVR4nABlAJr/AHVE4czCI/4u +Mc4b7vuds/xzjz5/3/7u/n9vMe7vnfH/9++vPn/xyf5zhxzjt8GHw8+2d83u8x27199/nxuQ6Od9 +M43/5z2I+9n9ZtmDBwMQECDRQw/eQIQohJXxpBCNVE6QCCAAAAD//wBlAJr/AgALyj1t/wINwq0g +LeNZUworuN1cjTPIzrTX6ofHWeo3v336qPzfEwRmBnHTtf95/fglZK5N0PDgfRTslpGBvz7LFc4F +IUXBWQGjQ5MGCx34EDFPwXiY4YbYxavpnhHFrk14CDAAAAD//wBlAJr/AgKqRooH2gAgPeggvUAA +Bu2WfgPoAwzRAABAAAAAAACQgLz/3Uv4Gv+gX7BJgDeeGP6AAAD1NMDzKHD7ANWr3loYbxsAD791 +NAADfcoIDyP44K/jv4Y63/Z+t98Ovt+ub4T48LAAAAD//wBlAJr/AuplMlADJAAAAGuAphWpqhMx +in0A/fRvAYBABPgBwBUgABBQ/sYAyv9g0bCHgOLoGAAAAAAAREAAwI7nr0ArYpow7aX8//9LaP/9 +SjdavWA8ePHeBIKB//81/83ndznOaXx379wAAAD//wBlAJr/AqDxW+D3AABAAbUh/QMnbQag/gAY +AYDAAACgtgD/gOqAAAB5IA/8AAAk+n9w0AAA8AAAmFRJuPo27ciC0cD5oeW4E7KA/wD3ECMAn2tt +y8PgwH8AfAxFzC0JzeAMtratAsC/ffwAAAD//wBlAJr/BGKAyCAA4AAAAvgeYTAwHd1kmQF5chkG +ABoMIHcL5xVpTfQbUqzlAAAErwAQBgAAEOClA5D9il08AEh/tUzdCBsXkbgACED+woQg8Si9VeqY +lODCn7lmF6NhnAEYgAAA/NMIAAAAAAD//2JgjLZgVGBg5Pv/Tvpc8hwGBjYGJADjHDrAwPzAjv/H +/Wf3PzCwtzcwHmBgYGcwbZz8wHaCAQMDOwMDQ8MCBgYOC3W7mp+f0w+wHOYxO3OG+e376hsMZjk3 +AAAAAP//YmCMY2A4wMAIN5e5gQETPD6AZisDAwMDgzSDAAPjByiHcQMDAwMDg1nOze1lByRu5/47 +c4859311AYNZzg0AAAAA//9iYGDBYihOIIMuwIjGL39/fwffA8b//xv/P2BPtzzHwCBjUQAAAAD/ +/yLFBrIBAAAA//9i1HhcwdhizX7u8NZNzyLbvT97bfrMf/QHI8evOwcSqGUJAAAA//9iYBB81iSw +pEE170Qrg5MIYydHqwdDQRMrAwcVrQAAAAD//2J4x7j9AAMDn8Q/BgYLBoaiAwwMjPdvMDBYM1Tv +oJodAAAAAP//Yqo/83+dxePWlxl3npsel9lvLfPcqlE9725C+acfVLMEAAAA//9i+s9gwCoaaGMR +evta/58PTEWzr21hufPjA8N+qlnBwAAAAAD//2JiWLci5v1+HmFXDqcnULE/MxgYGBj+f6CaJQAA +AAD//2Ji2FrkY3iYpYC5qDeGgeEMAwPDvwQBBoYvcTwOVLMEAAAA//9isDBgkP///0EOg9z35v// +Gc/eeW7BwPj5+QGZhANUswMAAAD//2JgqGBgYGBgqEMXlvhMPUsAAAAA//8iYDd1AAAAAP//AwDR +w7IkEbzhVQAAAABJRU5ErkJggg== +"""))), + ) + return f + + +def load_default(size: float | None = None) -> FreeTypeFont | ImageFont: + """If FreeType support is available, load a version of Aileron Regular, + https://dotcolon.net/fonts/aileron, with a more limited character set. + + Otherwise, load a "better than nothing" font. + + .. versionadded:: 1.1.4 + + :param size: The font size of Aileron Regular. + + .. versionadded:: 10.1.0 + + :return: A font object. + """ + if isinstance(core, ModuleType) or size is not None: + return truetype( + BytesIO(base64.b64decode(b""" +AAEAAAAPAIAAAwBwRkZUTYwDlUAAADFoAAAAHEdERUYAqADnAAAo8AAAACRHUE9ThhmITwAAKfgAA +AduR1NVQnHxefoAACkUAAAA4k9TLzJovoHLAAABeAAAAGBjbWFw5lFQMQAAA6gAAAGqZ2FzcP//AA +MAACjoAAAACGdseWYmRXoPAAAGQAAAHfhoZWFkE18ayQAAAPwAAAA2aGhlYQboArEAAAE0AAAAJGh +tdHjjERZ8AAAB2AAAAdBsb2NhuOexrgAABVQAAADqbWF4cAC7AEYAAAFYAAAAIG5hbWUr+h5lAAAk +OAAAA6Jwb3N0D3oPTQAAJ9wAAAEKAAEAAAABGhxJDqIhXw889QALA+gAAAAA0Bqf2QAAAADhCh2h/ +2r/LgOxAyAAAAAIAAIAAAAAAAAAAQAAA8r/GgAAA7j/av9qA7EAAQAAAAAAAAAAAAAAAAAAAHQAAQ +AAAHQAQwAFAAAAAAACAAAAAQABAAAAQAAAAAAAAAADAfoBkAAFAAgCigJYAAAASwKKAlgAAAFeADI +BPgAAAAAFAAAAAAAAAAAAAAcAAAAAAAAAAAAAAABVS1dOAEAAIPsCAwL/GgDIA8oA5iAAAJMAAAAA +AhICsgAAACAAAwH0AAAAAAAAAU0AAADYAAAA8gA5AVMAVgJEAEYCRAA1AuQAKQKOAEAAsAArATsAZ +AE7AB4CMABVAkQAUADc/+EBEgAgANwAJQEv//sCRAApAkQAggJEADwCRAAtAkQAIQJEADkCRAArAk +QAMgJEACwCRAAxANwAJQDc/+ECRABnAkQAUAJEAEQB8wAjA1QANgJ/AB0CcwBkArsALwLFAGQCSwB +kAjcAZALGAC8C2gBkAQgAZAIgADcCYQBkAj8AZANiAGQCzgBkAuEALwJWAGQC3QAvAmsAZAJJADQC +ZAAiAqoAXgJuACADuAAaAnEAGQJFABMCTwAuATMAYgEv//sBJwAiAkQAUAH0ADIBLAApAhMAJAJjA +EoCEQAeAmcAHgIlAB4BIgAVAmcAHgJRAEoA7gA+AOn/8wIKAEoA9wBGA1cASgJRAEoCSgAeAmMASg +JnAB4BSgBKAcsAGAE5ABQCUABCAgIAAQMRAAEB4v/6AgEAAQHOABQBLwBAAPoAYAEvACECRABNA0Y +AJAItAHgBKgAcAkQAUAEsAHQAygAgAi0AOQD3ADYA9wAWAaEANgGhABYCbAAlAYMAeAGDADkA6/9q +AhsAFAIKABUB/QAVAAAAAwAAAAMAAAAcAAEAAAAAAKQAAwABAAAAHAAEAIgAAAAeABAAAwAOAH4Aq +QCrALEAtAC3ALsgGSAdICYgOiBEISL7Av//AAAAIACpAKsAsAC0ALcAuyAYIBwgJiA5IEQhIvsB// +//4/+5/7j/tP+y/7D/reBR4E/gR+A14CzfTwVxAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAEGAAABAAAAAAAAAAECAAAAAgAAAAAAAAAAAAAAAAAAAAEAAAMEBQYHCAkKCwwNDg8QERIT +FBUWFxgZGhscHR4fICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMT +U5PUFFSU1RVVldYWVpbXF1eX2BhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGQAAA +AAAAAAYnFmAAAAAABlAAAAAAAAAAAAAAAAAAAAAAAAAAAAY2htAAAAAAAAAABrbGlqAAAAAHAAbm9 +ycwBnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmACYAJgAmAD4AUgCCAMoBCgFO +AVwBcgGIAaYBvAHKAdYB6AH2AgwCIAJKAogCpgLWAw4DIgNkA5wDugPUA+gD/AQQBEYEogS8BPoFJ +gVSBWoFgAWwBcoF1gX6BhQGJAZMBmgGiga0BuIHGgdUB2YHkAeiB8AH3AfyCAoIHAgqCDoITghcCG +oIogjSCPoJKglYCXwJwgnqCgIKKApACl4Klgq8CtwLDAs8C1YLjAuyC9oL7gwMDCYMSAxgDKAMrAz +qDQoNTA1mDYQNoA2uDcAN2g3oDfYODA4iDkoOXA5sDnoOnA7EDvwAAAAFAAAAAAH0ArwAAwAGAAkA +DAAPAAAxESERAxMhExcRASELARETAfT6qv6syKr+jgFUqsiqArz9RAGLAP/+1P8B/v3VAP8BLP4CA +P8AAgA5//IAuQKyAAMACwAANyMDMwIyFhQGIiY0oE4MZk84JCQ4JLQB/v3AJDgkJDgAAgBWAeUBPA +LfAAMABwAAEyMnMxcjJzOmRgpagkYKWgHl+vr6AAAAAAIARgAAAf4CsgAbAB8AAAEHMxUjByM3Iwc +jNyM1MzcjNTM3MwczNzMHMxUrAQczAZgdZXEvOi9bLzovWmYdZXEvOi9bLzovWp9bHlsBn4w429vb +2ziMONvb29s4jAAAAAMANf+mAg4DDAAfACYALAAAJRQGBxUjNS4BJzMeARcRLgE0Njc1MxUeARcjJ +icVHgEBFBYXNQ4BExU+ATU0Ag5xWDpgcgRcBz41Xl9oVTpVYwpcC1ttXP6cLTQuM5szOrVRZwlOTQ +ZqVzZECAEAGlukZAlOTQdrUG8O7iNlAQgxNhDlCDj+8/YGOjReAAAAAAUAKf/yArsCvAAHAAsAFQA +dACcAABIyFhQGIiY0EyMBMwQiBhUUFjI2NTQSMhYUBiImNDYiBhUUFjI2NTR5iFBQiFCVVwHAV/5c +OiMjOiPmiFBQiFCxOiMjOiMCvFaSVlaS/ZoCsjIzMC80NC8w/uNWklZWkhozMC80NC8wAAAAAgBA/ +/ICbgLAACIALgAAARUjEQYjIiY1NDY3LgE1NDYzMhcVJiMiBhUUFhcWOwE1MxUFFBYzMjc1IyIHDg +ECbmBcYYOOVkg7R4hsQjY4Q0RNRD4SLDxW/pJUXzksPCkUUk0BgUb+zBVUZ0BkDw5RO1huCkULQzp +COAMBcHDHRz0J/AIHRQAAAAEAKwHlAIUC3wADAAATIycze0YKWgHl+gAAAAABAGT/sAEXAwwACQAA +EzMGEBcjLgE0Nt06dXU6OUBAAwzG/jDGVePs4wAAAAEAHv+wANEDDAAJAAATMx4BFAYHIzYQHjo5Q +EA5OnUDDFXj7ONVxgHQAAAAAQBVAFIB2wHbAA4AAAE3FwcXBycHJzcnNxcnMwEtmxOfcTJjYzJxnx +ObCj4BKD07KYolmZkliik7PbMAAQBQAFUB9AIlAAsAAAEjFSM1IzUzNTMVMwH0tTq1tTq1AR/Kyjj +OzgAAAAAB/+H/iACMAGQABAAANwcjNzOMWlFOXVrS3AAAAQAgAP8A8gE3AAMAABMjNTPy0tIA/zgA +AQAl//IApQByAAcAADYyFhQGIiY0STgkJDgkciQ4JCQ4AAAAAf/7/+IBNALQAAMAABcjEzM5Pvs+H +gLuAAAAAAIAKf/yAhsCwAADAAcAABIgECA2IBAgKQHy/g5gATL+zgLA/TJEAkYAAAAAAQCCAAABlg +KyAAgAAAERIxEHNTc2MwGWVr6SIygCsv1OAldxW1sWAAEAPAAAAg4CwAAZAAA3IRUhNRM+ATU0JiM +iDwEjNz4BMzIWFRQGB7kBUv4x+kI2QTt+EAFWAQp8aGVtSl5GRjEA/0RVLzlLmAoKa3FsUkNxXQAA +AAEALf/yAhYCwAAqAAABHgEVFAYjIi8BMxceATMyNjU0KwE1MzI2NTQmIyIGDwEjNz4BMzIWFRQGA +YxBSZJo2RUBVgEHV0JBUaQREUBUQzc5TQcBVgEKfGhfcEMBbxJbQl1x0AoKRkZHPn9GSD80QUVCCg +pfbGBPOlgAAAACACEAAAIkArIACgAPAAAlIxUjNSE1ATMRMyMRBg8BAiRXVv6qAVZWV60dHLCurq4 +rAdn+QgFLMibzAAABADn/8gIZArIAHQAAATIWFRQGIyIvATMXFjMyNjU0JiMiByMTIRUhBzc2ATNv +d5Fl1RQBVgIad0VSTkVhL1IwAYj+vh8rMAHHgGdtgcUKCoFXTU5bYgGRRvAuHQAAAAACACv/8gITA +sAAFwAjAAABMhYVFAYjIhE0NjMyFh8BIycmIyIDNzYTMjY1NCYjIgYVFBYBLmp7imr0l3RZdAgBXA +IYZ5wKJzU6QVNJSz5SUAHSgWltiQFGxcNlVQoKdv7sPiz+ZF1LTmJbU0lhAAAAAQAyAAACGgKyAAY +AAAEVASMBITUCGv6oXAFL/oECsij9dgJsRgAAAAMALP/xAhgCwAAWACAALAAAAR4BFRQGIyImNTQ2 +Ny4BNTQ2MhYVFAYmIgYVFBYyNjU0AzI2NTQmIyIGFRQWAZQ5S5BmbIpPOjA7ecp5P2F8Q0J8RIVJS +0pLTEtOAW0TXTxpZ2ZqPF0SE1A3VWVlVTdQ/UU0N0RENzT9/ko+Ok1NOj1LAAIAMf/yAhkCwAAXAC +MAAAEyERQGIyImLwEzFxYzMhMHBiMiJjU0NhMyNjU0JiMiBhUUFgEl9Jd0WXQIAVwCGGecCic1SWp +7imo+UlBAQVNJAsD+usXDZVUKCnYBFD4sgWltif5kW1NJYV1LTmIAAAACACX/8gClAiAABwAPAAAS +MhYUBiImNBIyFhQGIiY0STgkJDgkJDgkJDgkAiAkOCQkOP52JDgkJDgAAAAC/+H/iAClAiAABwAMA +AASMhYUBiImNBMHIzczSTgkJDgkaFpSTl4CICQ4JCQ4/mba5gAAAQBnAB4B+AH0AAYAAAENARUlNS +UB+P6qAVb+bwGRAbCmpkbJRMkAAAIAUAC7AfQBuwADAAcAAAEhNSERITUhAfT+XAGk/lwBpAGDOP8 +AOAABAEQAHgHVAfQABgAAARUFNS0BNQHV/m8BVv6qAStEyUSmpkYAAAAAAgAj//IB1ALAABgAIAAA +ATIWFRQHDgEHIz4BNz4BNTQmIyIGByM+ARIyFhQGIiY0AQRibmktIAJWBSEqNig+NTlHBFoDezQ4J +CQ4JALAZ1BjaS03JS1DMD5LLDQ/SUVgcv2yJDgkJDgAAAAAAgA2/5gDFgKYADYAQgAAAQMGFRQzMj +Y1NCYjIg4CFRQWMzI2NxcGIyImNTQ+AjMyFhUUBiMiJwcGIyImNTQ2MzIfATcHNzYmIyIGFRQzMjY +Cej8EJjJJlnBAfGQ+oHtAhjUYg5OPx0h2k06Os3xRWQsVLjY5VHtdPBwJETcJDyUoOkZEJz8B0f74 +EQ8kZl6EkTFZjVOLlyknMVm1pmCiaTq4lX6CSCknTVRmmR8wPdYnQzxuSWVGAAIAHQAAAncCsgAHA +AoAACUjByMTMxMjATMDAcj+UVz4dO5d/sjPZPT0ArL9TgE6ATQAAAADAGQAAAJMArIAEAAbACcAAA +EeARUUBgcGKwERMzIXFhUUJRUzMjc2NTQnJiMTPgE1NCcmKwEVMzIBvkdHZkwiNt7LOSGq/oeFHBt +hahIlSTM+cB8Yj5UWAW8QT0VYYgwFArIEF5Fv1eMED2NfDAL93AU+N24PBP0AAAAAAQAv//ICjwLA +ABsAAAEyFh8BIycmIyIGFRQWMzI/ATMHDgEjIiY1NDYBdX+PCwFWAiKiaHx5ZaIiAlYBCpWBk6a0A +sCAagoKpqN/gaOmCgplhcicn8sAAAIAZAAAAp8CsgAMABkAAAEeARUUBgcGKwERMzITPgE1NCYnJi +sBETMyAY59lJp8IzXN0jUVWmdjWRs5d3I4Aq4QqJWUug8EArL9mQ+PeHGHDgX92gAAAAABAGQAAAI +vArIACwAAJRUhESEVIRUhFSEVAi/+NQHB/pUBTf6zRkYCskbwRvAAAAABAGQAAAIlArIACQAAExUh +FSERIxEhFboBQ/69VgHBAmzwRv7KArJGAAAAAAEAL//yAo8CwAAfAAABMxEjNQcGIyImNTQ2MzIWH +wEjJyYjIgYVFBYzMjY1IwGP90wfPnWTprSSf48LAVYCIqJofHllVG+hAU3+s3hARsicn8uAagoKpq +N/gaN1XAAAAAEAZAAAAowCsgALAAABESMRIREjETMRIRECjFb+hFZWAXwCsv1OAS7+0gKy/sQBPAA +AAAABAGQAAAC6ArIAAwAAMyMRM7pWVgKyAAABADf/8gHoArIAEwAAAREUBw4BIyImLwEzFxYzMjc2 +NREB6AIFcGpgbQIBVgIHfXQKAQKy/lYxIltob2EpKYyEFD0BpwAAAAABAGQAAAJ0ArIACwAACQEjA +wcVIxEzEQEzATsBJ3ntQlZWAVVlAWH+nwEnR+ACsv6RAW8AAQBkAAACLwKyAAUAACUVIREzEQIv/j +VWRkYCsv2UAAABAGQAAAMUArIAFAAAAREjETQ3BgcDIwMmJxYVESMRMxsBAxRWAiMxemx8NxsCVo7 +MywKy/U4BY7ZLco7+nAFmoFxLtP6dArL9lwJpAAAAAAEAZAAAAoACsgANAAAhIwEWFREjETMBJjUR +MwKAhP67A1aEAUUDVAJeeov+pwKy/aJ5jAFZAAAAAgAv//ICuwLAAAkAEwAAEiAWFRQGICY1NBIyN +jU0JiIGFRTbATSsrP7MrNrYenrYegLAxaKhxsahov47nIeIm5uIhwACAGQAAAJHArIADgAYAAABHg +EVFAYHBisBESMRMzITNjQnJisBETMyAZRUX2VOHzuAVtY7GlxcGDWIiDUCrgtnVlVpCgT+5gKy/rU +V1BUF/vgAAAACAC//zAK9AsAAEgAcAAAlFhcHJiMiBwYjIiY1NDYgFhUUJRQWMjY1NCYiBgI9PUMx +UDcfKh8omqysATSs/dR62Hp62HpICTg7NgkHxqGixcWitbWHnJyHiJubAAIAZAAAAlgCsgAXACMAA +CUWFyMmJyYnJisBESMRMzIXHgEVFAYHFiUzMjc+ATU0JyYrAQIqDCJfGQwNWhAhglbiOx9QXEY1Tv +6bhDATMj1lGSyMtYgtOXR0BwH+1wKyBApbU0BSESRAAgVAOGoQBAABADT/8gIoAsAAJQAAATIWFyM +uASMiBhUUFhceARUUBiMiJiczHgEzMjY1NCYnLgE1NDYBOmd2ClwGS0E6SUNRdW+HZnKKC1wPWkQ9 +Uk1cZGuEAsBwXUJHNjQ3OhIbZVZZbm5kREo+NT5DFRdYUFdrAAAAAAEAIgAAAmQCsgAHAAABIxEjE +SM1IQJk9lb2AkICbP2UAmxGAAEAXv/yAmQCsgAXAAABERQHDgEiJicmNREzERQXHgEyNjc2NRECZA +IIgfCBCAJWAgZYmlgGAgKy/k0qFFxzc1wUKgGz/lUrEkRQUEQSKwGrAAAAAAEAIAAAAnoCsgAGAAA +hIwMzGwEzAYJ07l3N1FwCsv2PAnEAAAEAGgAAA7ECsgAMAAABAyMLASMDMxsBMxsBA7HAcZyicrZi +kaB0nJkCsv1OAlP9rQKy/ZsCW/2kAmYAAAEAGQAAAm8CsgALAAAhCwEjEwMzGwEzAxMCCsrEY/bkY +re+Y/D6AST+3AFcAVb+5gEa/q3+oQAAAQATAAACUQKyAAgAAAERIxEDMxsBMwFdVvRjwLphARD+8A +EQAaL+sQFPAAABAC4AAAI5ArIACQAAJRUhNQEhNSEVAQI5/fUBof57Aen+YUZGQgIqRkX92QAAAAA +BAGL/sAEFAwwABwAAARUjETMVIxEBBWlpowMMOP0UOANcAAAB//v/4gE0AtAAAwAABSMDMwE0Pvs+ +HgLuAAAAAQAi/7AAxQMMAAcAABcjNTMRIzUzxaNpaaNQOALsOAABAFAA1wH0AmgABgAAJQsBIxMzE +wGwjY1GsESw1wFZ/qcBkf5vAAAAAQAy/6oBwv/iAAMAAAUhNSEBwv5wAZBWOAAAAAEAKQJEALYCsg +ADAAATIycztjhVUAJEbgAAAAACACT/8gHQAiAAHQAlAAAhJwcGIyImNTQ2OwE1NCcmIyIHIz4BMzI +XFh0BFBcnMjY9ASYVFAF6CR0wVUtgkJoiAgdgaQlaBm1Zrg4DCuQ9R+5MOSFQR1tbDiwUUXBUXowf +J8c9SjRORzYSgVwAAAAAAgBK//ICRQLfABEAHgAAATIWFRQGIyImLwEVIxEzETc2EzI2NTQmIyIGH +QEUFgFUcYCVbiNJEyNWVigySElcU01JXmECIJd4i5QTEDRJAt/+3jkq/hRuZV55ZWsdX14AAQAe// +IB9wIgABgAAAEyFhcjJiMiBhUUFjMyNjczDgEjIiY1NDYBF152DFocbEJXU0A1Rw1aE3pbaoKQAiB +oWH5qZm1tPDlaXYuLgZcAAAACAB7/8gIZAt8AEQAeAAABESM1BwYjIiY1NDYzMhYfAREDMjY9ATQm +IyIGFRQWAhlWKDJacYCVbiNJEyOnSV5hQUlcUwLf/SFVOSqXeIuUExA0ARb9VWVrHV9ebmVeeQACA +B7/8gH9AiAAFQAbAAABFAchHgEzMjY3Mw4BIyImNTQ2MzIWJyIGByEmAf0C/oAGUkA1SwlaD4FXbI +WObmt45UBVBwEqDQEYFhNjWD84W16Oh3+akU9aU60AAAEAFQAAARoC8gAWAAATBh0BMxUjESMRIzU +zNTQ3PgEzMhcVJqcDbW1WOTkDB0k8Hx5oAngVITRC/jQBzEIsJRs5PwVHEwAAAAIAHv8uAhkCIAAi +AC8AAAERFAcOASMiLwEzFx4BMzI2NzY9AQcGIyImNTQ2MzIWHwE1AzI2PQE0JiMiBhUUFgIZAQSEd +NwRAVcBBU5DTlUDASgyWnGAlW4jSRMjp0leYUFJXFMCEv5wSh1zeq8KCTI8VU0ZIQk5Kpd4i5QTED +RJ/iJlax1fXm5lXnkAAQBKAAACCgLkABcAAAEWFREjETQnLgEHDgEdASMRMxE3NjMyFgIIAlYCBDs +6RVRWViE5UVViAYUbQP7WASQxGzI7AQJyf+kC5P7TPSxUAAACAD4AAACsAsAABwALAAASMhYUBiIm +NBMjETNeLiAgLiBiVlYCwCAuICAu/WACEgAC//P/LgCnAsAABwAVAAASMhYUBiImNBcRFAcGIyInN +RY3NjURWS4gIC4gYgMLcRwNSgYCAsAgLiAgLo79wCUbZAJGBzMOHgJEAAAAAQBKAAACCALfAAsAAC +EnBxUjETMREzMHEwGTwTJWVvdu9/rgN6kC3/4oAQv6/ugAAQBG//wA3gLfAA8AABMRFBceATcVBiM +iJicmNRGcAQIcIxkkKi4CAQLf/bkhERoSBD4EJC8SNAJKAAAAAQBKAAADEAIgACQAAAEWFREjETQn +JiMiFREjETQnJiMiFREjETMVNzYzMhYXNzYzMhYDCwVWBAxedFYEDF50VlYiJko7ThAvJkpEVAGfI +jn+vAEcQyRZ1v76ARxDJFnW/voCEk08HzYtRB9HAAAAAAEASgAAAgoCIAAWAAABFhURIxE0JyYjIg +YdASMRMxU3NjMyFgIIAlYCCXBEVVZWITlRVWIBhRtA/tYBJDEbbHR/6QISWz0sVAAAAAACAB7/8gI +sAiAABwARAAASIBYUBiAmNBIyNjU0JiIGFRSlAQCHh/8Ah7ieWlqeWgIgn/Cfn/D+s3ZfYHV1YF8A +AgBK/zwCRQIgABEAHgAAATIWFRQGIyImLwERIxEzFTc2EzI2NTQmIyIGHQEUFgFUcYCVbiNJEyNWV +igySElcU01JXmECIJd4i5QTEDT+8wLWVTkq/hRuZV55ZWsdX14AAgAe/zwCGQIgABEAHgAAAREjEQ +cGIyImNTQ2MzIWHwE1AzI2PQE0JiMiBhUUFgIZVigyWnGAlW4jSRMjp0leYUFJXFMCEv0qARk5Kpd +4i5QTEDRJ/iJlax1fXm5lXnkAAQBKAAABPgIeAA0AAAEyFxUmBhURIxEzFTc2ARoWDkdXVlYwIwIe +B0EFVlf+0gISU0cYAAEAGP/yAa0CIAAjAAATMhYXIyYjIgYVFBYXHgEVFAYjIiYnMxYzMjY1NCYnL +gE1NDbkV2MJWhNdKy04PF1XbVhWbgxaE2ktOjlEUllkAiBaS2MrJCUoEBlPQkhOVFZoKCUmLhIWSE +BIUwAAAAEAFP/4ARQCiQAXAAATERQXHgE3FQYjIiYnJjURIzUzNTMVMxWxAQMmMx8qMjMEAUdHVmM +BzP7PGw4mFgY/BSwxDjQBNUJ7e0IAAAABAEL/8gICAhIAFwAAAREjNQcGIyImJyY1ETMRFBceATMy +Nj0BAgJWITlRT2EKBVYEBkA1RFECEv3uWj4qTToiOQE+/tIlJC43c4DpAAAAAAEAAQAAAfwCEgAGA +AABAyMDMxsBAfzJaclfop8CEv3uAhL+LQHTAAABAAEAAAMLAhIADAAAAQMjCwEjAzMbATMbAQMLqW +Z2dmapY3t0a3Z7AhL97gG+/kICEv5AAcD+QwG9AAAB//oAAAHWAhIACwAAARMjJwcjEwMzFzczARq +8ZIuKY763ZoWFYwEO/vLV1QEMAQbNzQAAAQAB/y4B+wISABEAAAEDDgEjIic1FjMyNj8BAzMbAQH7 +2iFZQB8NDRIpNhQH02GenQIS/cFVUAJGASozEwIt/i4B0gABABQAAAGxAg4ACQAAJRUhNQEhNSEVA +QGx/mMBNP7iAYL+zkREQgGIREX+ewAAAAABAED/sAEOAwwALAAAASMiBhUUFxYVFAYHHgEVFAcGFR +QWOwEVIyImNTQ3NjU0JzU2NTQnJjU0NjsBAQ4MKiMLDS4pKS4NCyMqDAtERAwLUlILDERECwLUGBk +WTlsgKzUFBTcrIFtOFhkYOC87GFVMIkUIOAhFIkxVGDsvAAAAAAEAYP84AJoDIAADAAAXIxEzmjo6 +yAPoAAEAIf+wAO8DDAAsAAATFQYVFBcWFRQGKwE1MzI2NTQnJjU0NjcuATU0NzY1NCYrATUzMhYVF +AcGFRTvUgsMREQLDCojCw0uKSkuDQsjKgwLREQMCwF6OAhFIkxVGDsvOBgZFk5bICs1BQU3KyBbTh +YZGDgvOxhVTCJFAAABAE0A3wH2AWQAEwAAATMUIyImJyYjIhUjNDMyFhcWMzIBvjhuGywtQR0xOG4 +bLC1BHTEBZIURGCNMhREYIwAAAwAk/94DIgLoAAcAEQApAAAAIBYQBiAmECQgBhUUFiA2NTQlMhYX +IyYjIgYUFjMyNjczDgEjIiY1NDYBAQFE3d3+vN0CB/7wubkBELn+xVBnD1wSWDo+QTcqOQZcEmZWX +HN2Aujg/rbg4AFKpr+Mjb6+jYxbWEldV5ZZNShLVn5na34AAgB4AFIB9AGeAAUACwAAAQcXIyc3Mw +cXIyc3AUqJiUmJifOJiUmJiQGepqampqampqYAAAIAHAHSAQ4CwAAHAA8AABIyFhQGIiY0NiIGFBY +yNjRgakREakSTNCEhNCECwEJqQkJqCiM4IyM4AAAAAAIAUAAAAfQCCwALAA8AAAEzFSMVIzUjNTM1 +MxMhNSEBP7W1OrW1OrX+XAGkAVs4tLQ4sP31OAAAAQB0AkQBAQKyAAMAABMjNzOsOD1QAkRuAAAAA +AEAIADsAKoBdgAHAAASMhYUBiImNEg6KCg6KAF2KDooKDoAAAIAOQBSAbUBngAFAAsAACUHIzcnMw +UHIzcnMwELiUmJiUkBM4lJiYlJ+KampqampqYAAAABADYB5QDhAt8ABAAAEzczByM2Xk1OXQHv8Po +AAQAWAeUAwQLfAAQAABMHIzczwV5NTl0C1fD6AAIANgHlAYsC3wAEAAkAABM3MwcjPwEzByM2Xk1O +XapeTU5dAe/w+grw+gAAAgAWAeUBawLfAAQACQAAEwcjNzMXByM3M8FeTU5dql5NTl0C1fD6CvD6A +AADACX/8gI1AHIABwAPABcAADYyFhQGIiY0NjIWFAYiJjQ2MhYUBiImNEk4JCQ4JOw4JCQ4JOw4JC +Q4JHIkOCQkOCQkOCQkOCQkOCQkOAAAAAEAeABSAUoBngAFAAABBxcjJzcBSomJSYmJAZ6mpqamAAA +AAAEAOQBSAQsBngAFAAAlByM3JzMBC4lJiYlJ+KampgAAAf9qAAABgQKyAAMAACsBATM/VwHAVwKy +AAAAAAIAFAHIAdwClAAHABQAABMVIxUjNSM1BRUjNwcjJxcjNTMXN9pKMkoByDICKzQqATJLKysCl +CmjoykBy46KiY3Lm5sAAQAVAAABvALyABgAAAERIxEjESMRIzUzNTQ3NjMyFxUmBgcGHQEBvFbCVj +k5AxHHHx5iVgcDAg798gHM/jQBzEIOJRuWBUcIJDAVIRYAAAABABX//AHkAvIAJQAAJR4BNxUGIyI +mJyY1ESYjIgcGHQEzFSMRIxEjNTM1NDc2MzIXERQBowIcIxkkKi4CAR4nXgwDbW1WLy8DEbNdOmYa +EQQ/BCQvEjQCFQZWFSEWQv40AcxCDiUblhP9uSEAAAAAAAAWAQ4AAQAAAAAAAAATACgAAQAAAAAAA +QAHAEwAAQAAAAAAAgAHAGQAAQAAAAAAAwAaAKIAAQAAAAAABAAHAM0AAQAAAAAABQA8AU8AAQAAAA +AABgAPAawAAQAAAAAACAALAdQAAQAAAAAACQALAfgAAQAAAAAACwAXAjQAAQAAAAAADAAXAnwAAwA +BBAkAAAAmAAAAAwABBAkAAQAOADwAAwABBAkAAgAOAFQAAwABBAkAAwA0AGwAAwABBAkABAAOAL0A +AwABBAkABQB4ANUAAwABBAkABgAeAYwAAwABBAkACAAWAbwAAwABBAkACQAWAeAAAwABBAkACwAuA +gQAAwABBAkADAAuAkwATgBvACAAUgBpAGcAaAB0AHMAIABSAGUAcwBlAHIAdgBlAGQALgAATm8gUm +lnaHRzIFJlc2VydmVkLgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAUgBlAGcAdQBsAGEAcgAAUmV +ndWxhcgAAMQAuADEAMAAyADsAVQBLAFcATgA7AEEAaQBsAGUAcgBvAG4ALQBSAGUAZwB1AGwAYQBy +AAAxLjEwMjtVS1dOO0FpbGVyb24tUmVndWxhcgAAQQBpAGwAZQByAG8AbgAAQWlsZXJvbgAAVgBlA +HIAcwBpAG8AbgAgADEALgAxADAAMgA7AFAAUwAgADAAMAAxAC4AMQAwADIAOwBoAG8AdABjAG8Abg +B2ACAAMQAuADAALgA3ADAAOwBtAGEAawBlAG8AdABmAC4AbABpAGIAMgAuADUALgA1ADgAMwAyADk +AAFZlcnNpb24gMS4xMDI7UFMgMDAxLjEwMjtob3Rjb252IDEuMC43MDttYWtlb3RmLmxpYjIuNS41 +ODMyOQAAQQBpAGwAZQByAG8AbgAtAFIAZQBnAHUAbABhAHIAAEFpbGVyb24tUmVndWxhcgAAUwBvA +HIAYQAgAFMAYQBnAGEAbgBvAABTb3JhIFNhZ2FubwAAUwBvAHIAYQAgAFMAYQBnAGEAbgBvAABTb3 +JhIFNhZ2FubwAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBsAG8AbgAuAG4AZQB0AAB +odHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGQAbwB0AGMAbwBs +AG8AbgAuAG4AZQB0AABodHRwOi8vd3d3LmRvdGNvbG9uLm5ldAAAAAACAAAAAAAA/4MAMgAAAAAAA +AAAAAAAAAAAAAAAAAAAAHQAAAABAAIAAwAEAAUABgAHAAgACQAKAAsADAANAA4ADwAQABEAEgATAB +QAFQAWABcAGAAZABoAGwAcAB0AHgAfACAAIQAiACMAJAAlACYAJwAoACkAKgArACwALQAuAC8AMAA +xADIAMwA0ADUANgA3ADgAOQA6ADsAPAA9AD4APwBAAEEAQgBDAEQARQBGAEcASABJAEoASwBMAE0A +TgBPAFAAUQBSAFMAVABVAFYAVwBYAFkAWgBbAFwAXQBeAF8AYABhAIsAqQCDAJMAjQDDAKoAtgC3A +LQAtQCrAL4AvwC8AIwAwADBAAAAAAAB//8AAgABAAAADAAAABwAAAACAAIAAwBxAAEAcgBzAAIABA +AAAAIAAAABAAAACgBMAGYAAkRGTFQADmxhdG4AGgAEAAAAAP//AAEAAAAWAANDQVQgAB5NT0wgABZ +ST00gABYAAP//AAEAAAAA//8AAgAAAAEAAmxpZ2EADmxvY2wAFAAAAAEAAQAAAAEAAAACAAYAEAAG +AAAAAgASADQABAAAAAEATAADAAAAAgAQABYAAQAcAAAAAQABAE8AAQABAGcAAQABAE8AAwAAAAIAE +AAWAAEAHAAAAAEAAQAvAAEAAQBnAAEAAQAvAAEAGgABAAgAAgAGAAwAcwACAE8AcgACAEwAAQABAE +kAAAABAAAACgBGAGAAAkRGTFQADmxhdG4AHAAEAAAAAP//AAIAAAABABYAA0NBVCAAFk1PTCAAFlJ +PTSAAFgAA//8AAgAAAAEAAmNwc3AADmtlcm4AFAAAAAEAAAAAAAEAAQACAAYADgABAAAAAQASAAIA +AAACAB4ANgABAAoABQAFAAoAAgABACQAPQAAAAEAEgAEAAAAAQAMAAEAOP/nAAEAAQAkAAIGigAEA +AAFJAXKABoAGQAA//gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAD/sv+4/+z/7v/MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAD/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9T/6AAAAAD/8QAA +ABD/vQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7gAAAAAAAAAAAAAAAAAA//MAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABIAAAAAAAAAAP/5AAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/gAAD/4AAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//L/9AAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAA/+gAAAAAAAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/zAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/mAAAAAAAAAAAAAAAAAAD +/4gAA//AAAAAA//YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/+AAAAAAAAP/OAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/zv/qAAAAAP/0AAAACAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/ZAAD/egAA/1kAAAAA/5D/rgAAAAAAAAAAAA +AAAAAAAAAAAAAAAAD/9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAD/8AAA/7b/8P+wAAD/8P/E/98AAAAA/8P/+P/0//oAAAAAAAAAAAAA//gA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+AAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/w//C/9MAAP/SAAD/9wAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAD/yAAA/+kAAAAA//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9wAAAAD//QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAP/2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAP/cAAAAAAAAAAAAAAAA/7YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAP/8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6AAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAkAFAAEAAAAAQACwAAABcA +BgAAAAAAAAAIAA4AAAAAAAsAEgAAAAAAAAATABkAAwANAAAAAQAJAAAAAAAAAAAAAAAAAAAAGAAAA +AAABwAAAAAAAAAAAAAAFQAFAAAAAAAYABgAAAAUAAAACgAAAAwAAgAPABEAFgAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAEAEQBdAAYAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAcAAAAAAAAABwAAAAAACAAAAAAAAAAAAAcAAAAHAAAAEwAJ +ABUADgAPAAAACwAQAAAAAAAAAAAAAAAAAAUAGAACAAIAAgAAAAIAGAAXAAAAGAAAABYAFgACABYAA +gAWAAAAEQADAAoAFAAMAA0ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASAAAAEgAGAAEAHgAkAC +YAJwApACoALQAuAC8AMgAzADcAOAA5ADoAPAA9AEUASABOAE8AUgBTAFUAVwBZAFoAWwBcAF0AcwA +AAAAAAQAAAADa3tfFAAAAANAan9kAAAAA4QodoQ== +""")), + 10 if size is None else size, + layout_engine=Layout.BASIC, + ) + return load_default_imagefont() diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageGrab.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageGrab.py new file mode 100644 index 000000000..66ee6dd33 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageGrab.py @@ -0,0 +1,231 @@ +# +# The Python Imaging Library +# $Id$ +# +# screen grabber +# +# History: +# 2001-04-26 fl created +# 2001-09-17 fl use builtin driver, if present +# 2002-11-19 fl added grabclipboard support +# +# Copyright (c) 2001-2002 by Secret Labs AB +# Copyright (c) 2001-2002 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +import os +import shutil +import subprocess +import sys +import tempfile + +from . import Image + +TYPE_CHECKING = False +if TYPE_CHECKING: + from . import ImageWin + + +def grab( + bbox: tuple[int, int, int, int] | None = None, + include_layered_windows: bool = False, + all_screens: bool = False, + xdisplay: str | None = None, + window: int | ImageWin.HWND | None = None, +) -> Image.Image: + im: Image.Image + if xdisplay is None: + if sys.platform == "darwin": + fh, filepath = tempfile.mkstemp(".png") + os.close(fh) + args = ["screencapture"] + if window is not None: + args += ["-l", str(window)] + elif bbox: + left, top, right, bottom = bbox + args += ["-R", f"{left},{top},{right-left},{bottom-top}"] + args += ["-x", filepath] + retcode = subprocess.call(args) + if retcode: + raise subprocess.CalledProcessError(retcode, args) + im = Image.open(filepath) + im.load() + os.unlink(filepath) + if bbox: + if window is not None: + # Determine if the window was in Retina mode or not + # by capturing it without the shadow, + # and checking how different the width is + fh, filepath = tempfile.mkstemp(".png") + os.close(fh) + args = ["screencapture", "-l", str(window), "-o", "-x", filepath] + retcode = subprocess.call(args) + if retcode: + raise subprocess.CalledProcessError(retcode, args) + with Image.open(filepath) as im_no_shadow: + retina = im.width - im_no_shadow.width > 100 + os.unlink(filepath) + + # Since screencapture's -R does not work with -l, + # crop the image manually + if retina: + left, top, right, bottom = bbox + im_cropped = im.resize( + (right - left, bottom - top), + box=tuple(coord * 2 for coord in bbox), + ) + else: + im_cropped = im.crop(bbox) + im.close() + return im_cropped + else: + im_resized = im.resize((right - left, bottom - top)) + im.close() + return im_resized + return im + elif sys.platform == "win32": + if window is not None: + all_screens = -1 + offset, size, data = Image.core.grabscreen_win32( + include_layered_windows, + all_screens, + int(window) if window is not None else 0, + ) + im = Image.frombytes( + "RGB", + size, + data, + # RGB, 32-bit line padding, origin lower left corner + "raw", + "BGR", + (size[0] * 3 + 3) & -4, + -1, + ) + if bbox: + x0, y0 = offset + left, top, right, bottom = bbox + im = im.crop((left - x0, top - y0, right - x0, bottom - y0)) + return im + # Cast to Optional[str] needed for Windows and macOS. + display_name: str | None = xdisplay + try: + if not Image.core.HAVE_XCB: + msg = "Pillow was built without XCB support" + raise OSError(msg) + size, data = Image.core.grabscreen_x11(display_name) + except OSError: + if display_name is None and sys.platform not in ("darwin", "win32"): + if shutil.which("gnome-screenshot"): + args = ["gnome-screenshot", "-f"] + elif shutil.which("grim"): + args = ["grim"] + elif shutil.which("spectacle"): + args = ["spectacle", "-n", "-b", "-f", "-o"] + else: + raise + fh, filepath = tempfile.mkstemp(".png") + os.close(fh) + args.append(filepath) + retcode = subprocess.call(args) + if retcode: + raise subprocess.CalledProcessError(retcode, args) + im = Image.open(filepath) + im.load() + os.unlink(filepath) + if bbox: + im_cropped = im.crop(bbox) + im.close() + return im_cropped + return im + else: + raise + else: + im = Image.frombytes("RGB", size, data, "raw", "BGRX", size[0] * 4, 1) + if bbox: + im = im.crop(bbox) + return im + + +def grabclipboard() -> Image.Image | list[str] | None: + if sys.platform == "darwin": + p = subprocess.run( + ["osascript", "-e", "get the clipboard as «class PNGf»"], + capture_output=True, + ) + if p.returncode != 0: + return None + + import binascii + + data = io.BytesIO(binascii.unhexlify(p.stdout[11:-3])) + return Image.open(data) + elif sys.platform == "win32": + fmt, data = Image.core.grabclipboard_win32() + if fmt == "file": # CF_HDROP + import struct + + o = struct.unpack_from("I", data)[0] + if data[16] == 0: + files = data[o:].decode("mbcs").split("\0") + else: + files = data[o:].decode("utf-16le").split("\0") + return files[: files.index("")] + if isinstance(data, bytes): + data = io.BytesIO(data) + if fmt == "png": + from . import PngImagePlugin + + return PngImagePlugin.PngImageFile(data) + elif fmt == "DIB": + from . import BmpImagePlugin + + return BmpImagePlugin.DibImageFile(data) + return None + else: + if os.getenv("WAYLAND_DISPLAY"): + session_type = "wayland" + elif os.getenv("DISPLAY"): + session_type = "x11" + else: # Session type check failed + session_type = None + + if shutil.which("wl-paste") and session_type in ("wayland", None): + args = ["wl-paste", "-t", "image"] + elif shutil.which("xclip") and session_type in ("x11", None): + args = ["xclip", "-selection", "clipboard", "-t", "image/png", "-o"] + else: + msg = "wl-paste or xclip is required for ImageGrab.grabclipboard() on Linux" + raise NotImplementedError(msg) + + p = subprocess.run(args, capture_output=True) + if p.returncode != 0: + err = p.stderr + for silent_error in [ + # wl-paste, when the clipboard is empty + b"Nothing is copied", + # Ubuntu/Debian wl-paste, when the clipboard is empty + b"No selection", + # Ubuntu/Debian wl-paste, when an image isn't available + b"No suitable type of content copied", + # wl-paste or Ubuntu/Debian xclip, when an image isn't available + b" not available", + # xclip, when an image isn't available + b"cannot convert ", + # xclip, when the clipboard isn't initialized + b"xclip: Error: There is no owner for the ", + ]: + if silent_error in err: + return None + msg = f"{args[0]} error" + if err: + msg += f": {err.strip().decode()}" + raise ChildProcessError(msg) + + data = io.BytesIO(p.stdout) + im = Image.open(data) + im.load() + return im diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageMath.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageMath.py new file mode 100644 index 000000000..dfdc50c05 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageMath.py @@ -0,0 +1,314 @@ +# +# The Python Imaging Library +# $Id$ +# +# a simple math add-on for the Python Imaging Library +# +# History: +# 1999-02-15 fl Original PIL Plus release +# 2005-05-05 fl Simplified and cleaned up for PIL 1.1.6 +# 2005-09-12 fl Fixed int() and float() for Python 2.4.1 +# +# Copyright (c) 1999-2005 by Secret Labs AB +# Copyright (c) 2005 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import builtins + +from . import Image, _imagingmath + +TYPE_CHECKING = False +if TYPE_CHECKING: + from collections.abc import Callable + from types import CodeType + from typing import Any + + +class _Operand: + """Wraps an image operand, providing standard operators""" + + def __init__(self, im: Image.Image): + self.im = im + + def __fixup(self, im1: _Operand | float) -> Image.Image: + # convert image to suitable mode + if isinstance(im1, _Operand): + # argument was an image. + if im1.im.mode in ("1", "L"): + return im1.im.convert("I") + elif im1.im.mode in ("I", "F"): + return im1.im + else: + msg = f"unsupported mode: {im1.im.mode}" + raise ValueError(msg) + else: + # argument was a constant + if isinstance(im1, (int, float)) and self.im.mode in ("1", "L", "I"): + return Image.new("I", self.im.size, im1) + else: + return Image.new("F", self.im.size, im1) + + def apply( + self, + op: str, + im1: _Operand | float, + im2: _Operand | float | None = None, + mode: str | None = None, + ) -> _Operand: + im_1 = self.__fixup(im1) + if im2 is None: + # unary operation + out = Image.new(mode or im_1.mode, im_1.size, None) + try: + op = getattr(_imagingmath, f"{op}_{im_1.mode}") + except AttributeError as e: + msg = f"bad operand type for '{op}'" + raise TypeError(msg) from e + _imagingmath.unop(op, out.getim(), im_1.getim()) + else: + # binary operation + im_2 = self.__fixup(im2) + if im_1.mode != im_2.mode: + # convert both arguments to floating point + if im_1.mode != "F": + im_1 = im_1.convert("F") + if im_2.mode != "F": + im_2 = im_2.convert("F") + if im_1.size != im_2.size: + # crop both arguments to a common size + size = ( + min(im_1.size[0], im_2.size[0]), + min(im_1.size[1], im_2.size[1]), + ) + if im_1.size != size: + im_1 = im_1.crop((0, 0) + size) + if im_2.size != size: + im_2 = im_2.crop((0, 0) + size) + out = Image.new(mode or im_1.mode, im_1.size, None) + try: + op = getattr(_imagingmath, f"{op}_{im_1.mode}") + except AttributeError as e: + msg = f"bad operand type for '{op}'" + raise TypeError(msg) from e + _imagingmath.binop(op, out.getim(), im_1.getim(), im_2.getim()) + return _Operand(out) + + # unary operators + def __bool__(self) -> bool: + # an image is "true" if it contains at least one non-zero pixel + return self.im.getbbox() is not None + + def __abs__(self) -> _Operand: + return self.apply("abs", self) + + def __pos__(self) -> _Operand: + return self + + def __neg__(self) -> _Operand: + return self.apply("neg", self) + + # binary operators + def __add__(self, other: _Operand | float) -> _Operand: + return self.apply("add", self, other) + + def __radd__(self, other: _Operand | float) -> _Operand: + return self.apply("add", other, self) + + def __sub__(self, other: _Operand | float) -> _Operand: + return self.apply("sub", self, other) + + def __rsub__(self, other: _Operand | float) -> _Operand: + return self.apply("sub", other, self) + + def __mul__(self, other: _Operand | float) -> _Operand: + return self.apply("mul", self, other) + + def __rmul__(self, other: _Operand | float) -> _Operand: + return self.apply("mul", other, self) + + def __truediv__(self, other: _Operand | float) -> _Operand: + return self.apply("div", self, other) + + def __rtruediv__(self, other: _Operand | float) -> _Operand: + return self.apply("div", other, self) + + def __mod__(self, other: _Operand | float) -> _Operand: + return self.apply("mod", self, other) + + def __rmod__(self, other: _Operand | float) -> _Operand: + return self.apply("mod", other, self) + + def __pow__(self, other: _Operand | float) -> _Operand: + return self.apply("pow", self, other) + + def __rpow__(self, other: _Operand | float) -> _Operand: + return self.apply("pow", other, self) + + # bitwise + def __invert__(self) -> _Operand: + return self.apply("invert", self) + + def __and__(self, other: _Operand | float) -> _Operand: + return self.apply("and", self, other) + + def __rand__(self, other: _Operand | float) -> _Operand: + return self.apply("and", other, self) + + def __or__(self, other: _Operand | float) -> _Operand: + return self.apply("or", self, other) + + def __ror__(self, other: _Operand | float) -> _Operand: + return self.apply("or", other, self) + + def __xor__(self, other: _Operand | float) -> _Operand: + return self.apply("xor", self, other) + + def __rxor__(self, other: _Operand | float) -> _Operand: + return self.apply("xor", other, self) + + def __lshift__(self, other: _Operand | float) -> _Operand: + return self.apply("lshift", self, other) + + def __rshift__(self, other: _Operand | float) -> _Operand: + return self.apply("rshift", self, other) + + # logical + def __eq__(self, other: _Operand | float) -> _Operand: # type: ignore[override] + return self.apply("eq", self, other) + + def __ne__(self, other: _Operand | float) -> _Operand: # type: ignore[override] + return self.apply("ne", self, other) + + def __lt__(self, other: _Operand | float) -> _Operand: + return self.apply("lt", self, other) + + def __le__(self, other: _Operand | float) -> _Operand: + return self.apply("le", self, other) + + def __gt__(self, other: _Operand | float) -> _Operand: + return self.apply("gt", self, other) + + def __ge__(self, other: _Operand | float) -> _Operand: + return self.apply("ge", self, other) + + +# conversions +def imagemath_int(self: _Operand) -> _Operand: + return _Operand(self.im.convert("I")) + + +def imagemath_float(self: _Operand) -> _Operand: + return _Operand(self.im.convert("F")) + + +# logical +def imagemath_equal(self: _Operand, other: _Operand | float | None) -> _Operand: + return self.apply("eq", self, other, mode="I") + + +def imagemath_notequal(self: _Operand, other: _Operand | float | None) -> _Operand: + return self.apply("ne", self, other, mode="I") + + +def imagemath_min(self: _Operand, other: _Operand | float | None) -> _Operand: + return self.apply("min", self, other) + + +def imagemath_max(self: _Operand, other: _Operand | float | None) -> _Operand: + return self.apply("max", self, other) + + +def imagemath_convert(self: _Operand, mode: str) -> _Operand: + return _Operand(self.im.convert(mode)) + + +ops = { + "int": imagemath_int, + "float": imagemath_float, + "equal": imagemath_equal, + "notequal": imagemath_notequal, + "min": imagemath_min, + "max": imagemath_max, + "convert": imagemath_convert, +} + + +def lambda_eval(expression: Callable[[dict[str, Any]], Any], **kw: Any) -> Any: + """ + Returns the result of an image function. + + :py:mod:`~PIL.ImageMath` only supports single-layer images. To process multi-band + images, use the :py:meth:`~PIL.Image.Image.split` method or + :py:func:`~PIL.Image.merge` function. + + :param expression: A function that receives a dictionary. + :param **kw: Values to add to the function's dictionary. + :return: The expression result. This is usually an image object, but can + also be an integer, a floating point value, or a pixel tuple, + depending on the expression. + """ + + args: dict[str, Any] = ops.copy() + args.update(kw) + for k, v in args.items(): + if isinstance(v, Image.Image): + args[k] = _Operand(v) + + out = expression(args) + try: + return out.im + except AttributeError: + return out + + +def unsafe_eval(expression: str, **kw: Any) -> Any: + """ + Evaluates an image expression. This uses Python's ``eval()`` function to process + the expression string, and carries the security risks of doing so. It is not + recommended to process expressions without considering this. + :py:meth:`~lambda_eval` is a more secure alternative. + + :py:mod:`~PIL.ImageMath` only supports single-layer images. To process multi-band + images, use the :py:meth:`~PIL.Image.Image.split` method or + :py:func:`~PIL.Image.merge` function. + + :param expression: A string containing a Python-style expression. + :param **kw: Values to add to the evaluation context. + :return: The evaluated expression. This is usually an image object, but can + also be an integer, a floating point value, or a pixel tuple, + depending on the expression. + """ + + # build execution namespace + args: dict[str, Any] = ops.copy() + for k in kw: + if "__" in k or hasattr(builtins, k): + msg = f"'{k}' not allowed" + raise ValueError(msg) + + args.update(kw) + for k, v in args.items(): + if isinstance(v, Image.Image): + args[k] = _Operand(v) + + compiled_code = compile(expression, "", "eval") + + def scan(code: CodeType) -> None: + for const in code.co_consts: + if type(const) is type(compiled_code): + scan(const) + + for name in code.co_names: + if name not in args and name != "abs": + msg = f"'{name}' not allowed" + raise ValueError(msg) + + scan(compiled_code) + out = builtins.eval(expression, {"__builtins": {"abs": abs}}, args) + try: + return out.im + except AttributeError: + return out diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageMode.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageMode.py new file mode 100644 index 000000000..b7c6c8636 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageMode.py @@ -0,0 +1,85 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard mode descriptors +# +# History: +# 2006-03-20 fl Added +# +# Copyright (c) 2006 by Secret Labs AB. +# Copyright (c) 2006 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import sys +from functools import lru_cache +from typing import NamedTuple + + +class ModeDescriptor(NamedTuple): + """Wrapper for mode strings.""" + + mode: str + bands: tuple[str, ...] + basemode: str + basetype: str + typestr: str + + def __str__(self) -> str: + return self.mode + + +@lru_cache +def getmode(mode: str) -> ModeDescriptor: + """Gets a mode descriptor for the given mode.""" + endian = "<" if sys.byteorder == "little" else ">" + + modes = { + # core modes + # Bits need to be extended to bytes + "1": ("L", "L", ("1",), "|b1"), + "L": ("L", "L", ("L",), "|u1"), + "I": ("L", "I", ("I",), f"{endian}i4"), + "F": ("L", "F", ("F",), f"{endian}f4"), + "P": ("P", "L", ("P",), "|u1"), + "RGB": ("RGB", "L", ("R", "G", "B"), "|u1"), + "RGBX": ("RGB", "L", ("R", "G", "B", "X"), "|u1"), + "RGBA": ("RGB", "L", ("R", "G", "B", "A"), "|u1"), + "CMYK": ("RGB", "L", ("C", "M", "Y", "K"), "|u1"), + "YCbCr": ("RGB", "L", ("Y", "Cb", "Cr"), "|u1"), + # UNDONE - unsigned |u1i1i1 + "LAB": ("RGB", "L", ("L", "A", "B"), "|u1"), + "HSV": ("RGB", "L", ("H", "S", "V"), "|u1"), + # extra experimental modes + "RGBa": ("RGB", "L", ("R", "G", "B", "a"), "|u1"), + "LA": ("L", "L", ("L", "A"), "|u1"), + "La": ("L", "L", ("L", "a"), "|u1"), + "PA": ("RGB", "L", ("P", "A"), "|u1"), + } + if mode in modes: + base_mode, base_type, bands, type_str = modes[mode] + return ModeDescriptor(mode, bands, base_mode, base_type, type_str) + + mapping_modes = { + # I;16 == I;16L, and I;32 == I;32L + "I;16": "u2", + "I;16BS": ">i2", + "I;16N": f"{endian}u2", + "I;16NS": f"{endian}i2", + "I;32": "u4", + "I;32L": "i4", + "I;32LS": " +from __future__ import annotations + +import re + +from . import Image, _imagingmorph + +LUT_SIZE = 1 << 9 + +# fmt: off +ROTATION_MATRIX = [ + 6, 3, 0, + 7, 4, 1, + 8, 5, 2, +] +MIRROR_MATRIX = [ + 2, 1, 0, + 5, 4, 3, + 8, 7, 6, +] +# fmt: on + + +class LutBuilder: + """A class for building a MorphLut from a descriptive language + + The input patterns is a list of a strings sequences like these:: + + 4:(... + .1. + 111)->1 + + (whitespaces including linebreaks are ignored). The option 4 + describes a series of symmetry operations (in this case a + 4-rotation), the pattern is described by: + + - . or X - Ignore + - 1 - Pixel is on + - 0 - Pixel is off + + The result of the operation is described after "->" string. + + The default is to return the current pixel value, which is + returned if no other match is found. + + Operations: + + - 4 - 4 way rotation + - N - Negate + - 1 - Dummy op for no other operation (an op must always be given) + - M - Mirroring + + Example:: + + lb = LutBuilder(patterns = ["4:(... .1. 111)->1"]) + lut = lb.build_lut() + + """ + + def __init__( + self, patterns: list[str] | None = None, op_name: str | None = None + ) -> None: + """ + :param patterns: A list of input patterns, or None. + :param op_name: The name of a known pattern. One of "corner", "dilation4", + "dilation8", "erosion4", "erosion8" or "edge". + :exception Exception: If the op_name is not recognized. + """ + self.lut: bytearray | None = None + if op_name is not None: + known_patterns = { + "corner": ["1:(... ... ...)->0", "4:(00. 01. ...)->1"], + "dilation4": ["4:(... .0. .1.)->1"], + "dilation8": ["4:(... .0. .1.)->1", "4:(... .0. ..1)->1"], + "erosion4": ["4:(... .1. .0.)->0"], + "erosion8": ["4:(... .1. .0.)->0", "4:(... .1. ..0)->0"], + "edge": [ + "1:(... ... ...)->0", + "4:(.0. .1. ...)->1", + "4:(01. .1. ...)->1", + ], + } + if op_name not in known_patterns: + msg = f"Unknown pattern {op_name}!" + raise Exception(msg) + + self.patterns = known_patterns[op_name] + elif patterns is not None: + self.patterns = patterns + else: + self.patterns = [] + + def add_patterns(self, patterns: list[str]) -> None: + """ + Append to list of patterns. + + :param patterns: Additional patterns. + """ + self.patterns += patterns + + def build_default_lut(self) -> bytearray: + """ + Set the current LUT, and return it. + + This is the default LUT that patterns will be applied against when building. + """ + symbols = [0, 1] + m = 1 << 4 # pos of current pixel + self.lut = bytearray(symbols[(i & m) > 0] for i in range(LUT_SIZE)) + return self.lut + + def get_lut(self) -> bytearray | None: + """ + Returns the current LUT + """ + return self.lut + + def _string_permute(self, pattern: str, permutation: list[int]) -> str: + """Takes a pattern and a permutation and returns the + string permuted according to the permutation list. + """ + assert len(permutation) == 9 + return "".join(pattern[p] for p in permutation) + + def _pattern_permute( + self, basic_pattern: str, options: str, basic_result: int + ) -> list[tuple[str, int]]: + """Takes a basic pattern and its result and clones + the pattern according to the modifications described in the $options + parameter. It returns a list of all cloned patterns.""" + patterns = [(basic_pattern, basic_result)] + + # rotations + if "4" in options: + res = patterns[-1][1] + for i in range(4): + patterns.append( + (self._string_permute(patterns[-1][0], ROTATION_MATRIX), res) + ) + # mirror + if "M" in options: + n = len(patterns) + for pattern, res in patterns[:n]: + patterns.append((self._string_permute(pattern, MIRROR_MATRIX), res)) + + # negate + if "N" in options: + n = len(patterns) + for pattern, res in patterns[:n]: + # Swap 0 and 1 + pattern = pattern.replace("0", "Z").replace("1", "0").replace("Z", "1") + res = 1 - int(res) + patterns.append((pattern, res)) + + return patterns + + def build_lut(self) -> bytearray: + """Compile all patterns into a morphology LUT, and return it. + + This is the data to be passed into MorphOp.""" + self.build_default_lut() + assert self.lut is not None + patterns = [] + + # Parse and create symmetries of the patterns strings + for p in self.patterns: + m = re.search(r"(\w):?\s*\((.+?)\)\s*->\s*(\d)", p.replace("\n", "")) + if not m: + msg = 'Syntax error in pattern "' + p + '"' + raise Exception(msg) + options = m.group(1) + pattern = m.group(2) + result = int(m.group(3)) + + # Get rid of spaces + pattern = pattern.replace(" ", "").replace("\n", "") + + patterns += self._pattern_permute(pattern, options, result) + + # Compile the patterns into regular expressions for speed + compiled_patterns = [] + for pattern in patterns: + p = pattern[0].replace(".", "X").replace("X", "[01]") + compiled_patterns.append((re.compile(p), pattern[1])) + + # Step through table and find patterns that match. + # Note that all the patterns are searched. The last one found takes priority + for i in range(LUT_SIZE): + # Build the bit pattern + bitpattern = bin(i)[2:] + bitpattern = ("0" * (9 - len(bitpattern)) + bitpattern)[::-1] + + for pattern, r in compiled_patterns: + if pattern.match(bitpattern): + self.lut[i] = [0, 1][r] + + return self.lut + + +class MorphOp: + """A class for binary morphological operators""" + + def __init__( + self, + lut: bytearray | None = None, + op_name: str | None = None, + patterns: list[str] | None = None, + ) -> None: + """Create a binary morphological operator. + + If the LUT is not provided, then it is built using LutBuilder from the op_name + or the patterns. + + :param lut: The LUT data. + :param patterns: A list of input patterns, or None. + :param op_name: The name of a known pattern. One of "corner", "dilation4", + "dilation8", "erosion4", "erosion8", "edge". + :exception Exception: If the op_name is not recognized. + """ + if patterns is None and op_name is None: + self.lut = lut + else: + self.lut = LutBuilder(patterns, op_name).build_lut() + + def apply(self, image: Image.Image) -> tuple[int, Image.Image]: + """Run a single morphological operation on an image. + + Returns a tuple of the number of changed pixels and the + morphed image. + + :param image: A 1-mode or L-mode image. + :exception Exception: If the current operator is None. + :exception ValueError: If the image is not 1 or L mode.""" + if self.lut is None: + msg = "No operator loaded" + raise Exception(msg) + + if image.mode not in ("1", "L"): + msg = "Image mode must be 1 or L" + raise ValueError(msg) + outimage = Image.new(image.mode, image.size) + count = _imagingmorph.apply(bytes(self.lut), image.getim(), outimage.getim()) + return count, outimage + + def match(self, image: Image.Image) -> list[tuple[int, int]]: + """Get a list of coordinates matching the morphological operation on + an image. + + Returns a list of tuples of (x,y) coordinates of all matching pixels. See + :ref:`coordinate-system`. + + :param image: A 1-mode or L-mode image. + :exception Exception: If the current operator is None. + :exception ValueError: If the image is not 1 or L mode.""" + if self.lut is None: + msg = "No operator loaded" + raise Exception(msg) + + if image.mode not in ("1", "L"): + msg = "Image mode must be 1 or L" + raise ValueError(msg) + return _imagingmorph.match(bytes(self.lut), image.getim()) + + def get_on_pixels(self, image: Image.Image) -> list[tuple[int, int]]: + """Get a list of all turned on pixels in a 1 or L mode image. + + Returns a list of tuples of (x,y) coordinates of all non-empty pixels. See + :ref:`coordinate-system`. + + :param image: A 1-mode or L-mode image. + :exception ValueError: If the image is not 1 or L mode.""" + + if image.mode not in ("1", "L"): + msg = "Image mode must be 1 or L" + raise ValueError(msg) + return _imagingmorph.get_on_pixels(image.getim()) + + def load_lut(self, filename: str) -> None: + """ + Load an operator from an mrl file + + :param filename: The file to read from. + :exception Exception: If the length of the file data is not 512. + """ + with open(filename, "rb") as f: + self.lut = bytearray(f.read()) + + if len(self.lut) != LUT_SIZE: + self.lut = None + msg = "Wrong size operator file!" + raise Exception(msg) + + def save_lut(self, filename: str) -> None: + """ + Save an operator to an mrl file. + + :param filename: The destination file. + :exception Exception: If the current operator is None. + """ + if self.lut is None: + msg = "No operator loaded" + raise Exception(msg) + with open(filename, "wb") as f: + f.write(self.lut) + + def set_lut(self, lut: bytearray | None) -> None: + """ + Set the LUT from an external source + + :param lut: A new LUT. + """ + self.lut = lut diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageOps.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageOps.py new file mode 100644 index 000000000..42b10bd7b --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageOps.py @@ -0,0 +1,746 @@ +# +# The Python Imaging Library. +# $Id$ +# +# standard image operations +# +# History: +# 2001-10-20 fl Created +# 2001-10-23 fl Added autocontrast operator +# 2001-12-18 fl Added Kevin's fit operator +# 2004-03-14 fl Fixed potential division by zero in equalize +# 2005-05-05 fl Fixed equalize for low number of values +# +# Copyright (c) 2001-2004 by Secret Labs AB +# Copyright (c) 2001-2004 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import functools +import operator +import re +from collections.abc import Sequence +from typing import Literal, Protocol, cast, overload + +from . import ExifTags, Image, ImagePalette + +# +# helpers + + +def _border(border: int | tuple[int, ...]) -> tuple[int, int, int, int]: + if isinstance(border, tuple): + if len(border) == 2: + left, top = right, bottom = border + elif len(border) == 4: + left, top, right, bottom = border + else: + left = top = right = bottom = border + return left, top, right, bottom + + +def _color(color: str | int | tuple[int, ...], mode: str) -> int | tuple[int, ...]: + if isinstance(color, str): + from . import ImageColor + + color = ImageColor.getcolor(color, mode) + return color + + +def _lut(image: Image.Image, lut: list[int]) -> Image.Image: + if image.mode == "P": + # FIXME: apply to lookup table, not image data + msg = "mode P support coming soon" + raise NotImplementedError(msg) + elif image.mode in ("L", "RGB"): + if image.mode == "RGB" and len(lut) == 256: + lut = lut + lut + lut + return image.point(lut) + else: + msg = f"not supported for mode {image.mode}" + raise OSError(msg) + + +# +# actions + + +def autocontrast( + image: Image.Image, + cutoff: float | tuple[float, float] = 0, + ignore: int | Sequence[int] | None = None, + mask: Image.Image | None = None, + preserve_tone: bool = False, +) -> Image.Image: + """ + Maximize (normalize) image contrast. This function calculates a + histogram of the input image (or mask region), removes ``cutoff`` percent of the + lightest and darkest pixels from the histogram, and remaps the image + so that the darkest pixel becomes black (0), and the lightest + becomes white (255). + + :param image: The image to process. + :param cutoff: The percent to cut off from the histogram on the low and + high ends. Either a tuple of (low, high), or a single + number for both. + :param ignore: The background pixel value (use None for no background). + :param mask: Histogram used in contrast operation is computed using pixels + within the mask. If no mask is given the entire image is used + for histogram computation. + :param preserve_tone: Preserve image tone in Photoshop-like style autocontrast. + + .. versionadded:: 8.2.0 + + :return: An image. + """ + if preserve_tone: + histogram = image.convert("L").histogram(mask) + else: + histogram = image.histogram(mask) + + lut = [] + for layer in range(0, len(histogram), 256): + h = histogram[layer : layer + 256] + if ignore is not None: + # get rid of outliers + if isinstance(ignore, int): + h[ignore] = 0 + else: + for ix in ignore: + h[ix] = 0 + if cutoff: + # cut off pixels from both ends of the histogram + if not isinstance(cutoff, tuple): + cutoff = (cutoff, cutoff) + # get number of pixels + n = 0 + for ix in range(256): + n = n + h[ix] + # remove cutoff% pixels from the low end + cut = int(n * cutoff[0] // 100) + for lo in range(256): + if cut > h[lo]: + cut = cut - h[lo] + h[lo] = 0 + else: + h[lo] -= cut + cut = 0 + if cut <= 0: + break + # remove cutoff% samples from the high end + cut = int(n * cutoff[1] // 100) + for hi in range(255, -1, -1): + if cut > h[hi]: + cut = cut - h[hi] + h[hi] = 0 + else: + h[hi] -= cut + cut = 0 + if cut <= 0: + break + # find lowest/highest samples after preprocessing + for lo in range(256): + if h[lo]: + break + for hi in range(255, -1, -1): + if h[hi]: + break + if hi <= lo: + # don't bother + lut.extend(list(range(256))) + else: + scale = 255.0 / (hi - lo) + offset = -lo * scale + for ix in range(256): + ix = int(ix * scale + offset) + if ix < 0: + ix = 0 + elif ix > 255: + ix = 255 + lut.append(ix) + return _lut(image, lut) + + +def colorize( + image: Image.Image, + black: str | tuple[int, ...], + white: str | tuple[int, ...], + mid: str | int | tuple[int, ...] | None = None, + blackpoint: int = 0, + whitepoint: int = 255, + midpoint: int = 127, +) -> Image.Image: + """ + Colorize grayscale image. + This function calculates a color wedge which maps all black pixels in + the source image to the first color and all white pixels to the + second color. If ``mid`` is specified, it uses three-color mapping. + The ``black`` and ``white`` arguments should be RGB tuples or color names; + optionally you can use three-color mapping by also specifying ``mid``. + Mapping positions for any of the colors can be specified + (e.g. ``blackpoint``), where these parameters are the integer + value corresponding to where the corresponding color should be mapped. + These parameters must have logical order, such that + ``blackpoint <= midpoint <= whitepoint`` (if ``mid`` is specified). + + :param image: The image to colorize. + :param black: The color to use for black input pixels. + :param white: The color to use for white input pixels. + :param mid: The color to use for midtone input pixels. + :param blackpoint: an int value [0, 255] for the black mapping. + :param whitepoint: an int value [0, 255] for the white mapping. + :param midpoint: an int value [0, 255] for the midtone mapping. + :return: An image. + """ + + # Initial asserts + assert image.mode == "L" + if mid is None: + assert 0 <= blackpoint <= whitepoint <= 255 + else: + assert 0 <= blackpoint <= midpoint <= whitepoint <= 255 + + # Define colors from arguments + rgb_black = cast(Sequence[int], _color(black, "RGB")) + rgb_white = cast(Sequence[int], _color(white, "RGB")) + rgb_mid = cast(Sequence[int], _color(mid, "RGB")) if mid is not None else None + + # Empty lists for the mapping + red = [] + green = [] + blue = [] + + # Create the low-end values + for i in range(blackpoint): + red.append(rgb_black[0]) + green.append(rgb_black[1]) + blue.append(rgb_black[2]) + + # Create the mapping (2-color) + if rgb_mid is None: + range_map = range(whitepoint - blackpoint) + + for i in range_map: + red.append( + rgb_black[0] + i * (rgb_white[0] - rgb_black[0]) // len(range_map) + ) + green.append( + rgb_black[1] + i * (rgb_white[1] - rgb_black[1]) // len(range_map) + ) + blue.append( + rgb_black[2] + i * (rgb_white[2] - rgb_black[2]) // len(range_map) + ) + + # Create the mapping (3-color) + else: + range_map1 = range(midpoint - blackpoint) + range_map2 = range(whitepoint - midpoint) + + for i in range_map1: + red.append( + rgb_black[0] + i * (rgb_mid[0] - rgb_black[0]) // len(range_map1) + ) + green.append( + rgb_black[1] + i * (rgb_mid[1] - rgb_black[1]) // len(range_map1) + ) + blue.append( + rgb_black[2] + i * (rgb_mid[2] - rgb_black[2]) // len(range_map1) + ) + for i in range_map2: + red.append(rgb_mid[0] + i * (rgb_white[0] - rgb_mid[0]) // len(range_map2)) + green.append( + rgb_mid[1] + i * (rgb_white[1] - rgb_mid[1]) // len(range_map2) + ) + blue.append(rgb_mid[2] + i * (rgb_white[2] - rgb_mid[2]) // len(range_map2)) + + # Create the high-end values + for i in range(256 - whitepoint): + red.append(rgb_white[0]) + green.append(rgb_white[1]) + blue.append(rgb_white[2]) + + # Return converted image + image = image.convert("RGB") + return _lut(image, red + green + blue) + + +def contain( + image: Image.Image, size: tuple[int, int], method: int = Image.Resampling.BICUBIC +) -> Image.Image: + """ + Returns a resized version of the image, set to the maximum width and height + within the requested size, while maintaining the original aspect ratio. + + :param image: The image to resize. + :param size: The requested output size in pixels, given as a + (width, height) tuple. + :param method: Resampling method to use. Default is + :py:attr:`~PIL.Image.Resampling.BICUBIC`. + See :ref:`concept-filters`. + :return: An image. + """ + + im_ratio = image.width / image.height + dest_ratio = size[0] / size[1] + + if im_ratio != dest_ratio: + if im_ratio > dest_ratio: + new_height = round(image.height / image.width * size[0]) + if new_height != size[1]: + size = (size[0], new_height) + else: + new_width = round(image.width / image.height * size[1]) + if new_width != size[0]: + size = (new_width, size[1]) + return image.resize(size, resample=method) + + +def cover( + image: Image.Image, size: tuple[int, int], method: int = Image.Resampling.BICUBIC +) -> Image.Image: + """ + Returns a resized version of the image, so that the requested size is + covered, while maintaining the original aspect ratio. + + :param image: The image to resize. + :param size: The requested output size in pixels, given as a + (width, height) tuple. + :param method: Resampling method to use. Default is + :py:attr:`~PIL.Image.Resampling.BICUBIC`. + See :ref:`concept-filters`. + :return: An image. + """ + + im_ratio = image.width / image.height + dest_ratio = size[0] / size[1] + + if im_ratio != dest_ratio: + if im_ratio < dest_ratio: + new_height = round(image.height / image.width * size[0]) + if new_height != size[1]: + size = (size[0], new_height) + else: + new_width = round(image.width / image.height * size[1]) + if new_width != size[0]: + size = (new_width, size[1]) + return image.resize(size, resample=method) + + +def pad( + image: Image.Image, + size: tuple[int, int], + method: int = Image.Resampling.BICUBIC, + color: str | int | tuple[int, ...] | None = None, + centering: tuple[float, float] = (0.5, 0.5), +) -> Image.Image: + """ + Returns a resized and padded version of the image, expanded to fill the + requested aspect ratio and size. + + :param image: The image to resize and crop. + :param size: The requested output size in pixels, given as a + (width, height) tuple. + :param method: Resampling method to use. Default is + :py:attr:`~PIL.Image.Resampling.BICUBIC`. + See :ref:`concept-filters`. + :param color: The background color of the padded image. + :param centering: Control the position of the original image within the + padded version. + + (0.5, 0.5) will keep the image centered + (0, 0) will keep the image aligned to the top left + (1, 1) will keep the image aligned to the bottom + right + :return: An image. + """ + + resized = contain(image, size, method) + if resized.size == size: + out = resized + else: + out = Image.new(image.mode, size, color) + if resized.palette: + palette = resized.getpalette() + if palette is not None: + out.putpalette(palette) + if resized.width != size[0]: + x = round((size[0] - resized.width) * max(0, min(centering[0], 1))) + out.paste(resized, (x, 0)) + else: + y = round((size[1] - resized.height) * max(0, min(centering[1], 1))) + out.paste(resized, (0, y)) + return out + + +def crop(image: Image.Image, border: int = 0) -> Image.Image: + """ + Remove border from image. The same amount of pixels are removed + from all four sides. This function works on all image modes. + + .. seealso:: :py:meth:`~PIL.Image.Image.crop` + + :param image: The image to crop. + :param border: The number of pixels to remove. + :return: An image. + """ + left, top, right, bottom = _border(border) + return image.crop((left, top, image.size[0] - right, image.size[1] - bottom)) + + +def scale( + image: Image.Image, factor: float, resample: int = Image.Resampling.BICUBIC +) -> Image.Image: + """ + Returns a rescaled image by a specific factor given in parameter. + A factor greater than 1 expands the image, between 0 and 1 contracts the + image. + + :param image: The image to rescale. + :param factor: The expansion factor, as a float. + :param resample: Resampling method to use. Default is + :py:attr:`~PIL.Image.Resampling.BICUBIC`. + See :ref:`concept-filters`. + :returns: An :py:class:`~PIL.Image.Image` object. + """ + if factor == 1: + return image.copy() + elif factor <= 0: + msg = "the factor must be greater than 0" + raise ValueError(msg) + else: + size = (round(factor * image.width), round(factor * image.height)) + return image.resize(size, resample) + + +class SupportsGetMesh(Protocol): + """ + An object that supports the ``getmesh`` method, taking an image as an + argument, and returning a list of tuples. Each tuple contains two tuples, + the source box as a tuple of 4 integers, and a tuple of 8 integers for the + final quadrilateral, in order of top left, bottom left, bottom right, top + right. + """ + + def getmesh( + self, image: Image.Image + ) -> list[ + tuple[tuple[int, int, int, int], tuple[int, int, int, int, int, int, int, int]] + ]: ... + + +def deform( + image: Image.Image, + deformer: SupportsGetMesh, + resample: int = Image.Resampling.BILINEAR, +) -> Image.Image: + """ + Deform the image. + + :param image: The image to deform. + :param deformer: A deformer object. Any object that implements a + ``getmesh`` method can be used. + :param resample: An optional resampling filter. Same values possible as + in the PIL.Image.transform function. + :return: An image. + """ + return image.transform( + image.size, Image.Transform.MESH, deformer.getmesh(image), resample + ) + + +def equalize(image: Image.Image, mask: Image.Image | None = None) -> Image.Image: + """ + Equalize the image histogram. This function applies a non-linear + mapping to the input image, in order to create a uniform + distribution of grayscale values in the output image. + + :param image: The image to equalize. + :param mask: An optional mask. If given, only the pixels selected by + the mask are included in the analysis. + :return: An image. + """ + if image.mode == "P": + image = image.convert("RGB") + h = image.histogram(mask) + lut = [] + for b in range(0, len(h), 256): + histo = [_f for _f in h[b : b + 256] if _f] + if len(histo) <= 1: + lut.extend(list(range(256))) + else: + step = (functools.reduce(operator.add, histo) - histo[-1]) // 255 + if not step: + lut.extend(list(range(256))) + else: + n = step // 2 + for i in range(256): + lut.append(n // step) + n = n + h[i + b] + return _lut(image, lut) + + +def expand( + image: Image.Image, + border: int | tuple[int, ...] = 0, + fill: str | int | tuple[int, ...] = 0, +) -> Image.Image: + """ + Add border to the image + + :param image: The image to expand. + :param border: Border width, in pixels. + :param fill: Pixel fill value (a color value). Default is 0 (black). + :return: An image. + """ + left, top, right, bottom = _border(border) + width = left + image.size[0] + right + height = top + image.size[1] + bottom + color = _color(fill, image.mode) + if image.palette: + mode = image.palette.mode + palette = ImagePalette.ImagePalette(mode, image.getpalette(mode)) + if isinstance(color, tuple) and (len(color) == 3 or len(color) == 4): + color = palette.getcolor(color) + else: + palette = None + out = Image.new(image.mode, (width, height), color) + if palette: + out.putpalette(palette.palette, mode) + out.paste(image, (left, top)) + return out + + +def fit( + image: Image.Image, + size: tuple[int, int], + method: int = Image.Resampling.BICUBIC, + bleed: float = 0.0, + centering: tuple[float, float] = (0.5, 0.5), +) -> Image.Image: + """ + Returns a resized and cropped version of the image, cropped to the + requested aspect ratio and size. + + This function was contributed by Kevin Cazabon. + + :param image: The image to resize and crop. + :param size: The requested output size in pixels, given as a + (width, height) tuple. + :param method: Resampling method to use. Default is + :py:attr:`~PIL.Image.Resampling.BICUBIC`. + See :ref:`concept-filters`. + :param bleed: Remove a border around the outside of the image from all + four edges. The value is a decimal percentage (use 0.01 for + one percent). The default value is 0 (no border). + Cannot be greater than or equal to 0.5. + :param centering: Control the cropping position. Use (0.5, 0.5) for + center cropping (e.g. if cropping the width, take 50% off + of the left side, and therefore 50% off the right side). + (0.0, 0.0) will crop from the top left corner (i.e. if + cropping the width, take all of the crop off of the right + side, and if cropping the height, take all of it off the + bottom). (1.0, 0.0) will crop from the bottom left + corner, etc. (i.e. if cropping the width, take all of the + crop off the left side, and if cropping the height take + none from the top, and therefore all off the bottom). + :return: An image. + """ + + # by Kevin Cazabon, Feb 17/2000 + # kevin@cazabon.com + # https://www.cazabon.com + + centering_x, centering_y = centering + + if not 0.0 <= centering_x <= 1.0: + centering_x = 0.5 + if not 0.0 <= centering_y <= 1.0: + centering_y = 0.5 + + if not 0.0 <= bleed < 0.5: + bleed = 0.0 + + # calculate the area to use for resizing and cropping, subtracting + # the 'bleed' around the edges + + # number of pixels to trim off on Top and Bottom, Left and Right + bleed_pixels = (bleed * image.size[0], bleed * image.size[1]) + + live_size = ( + image.size[0] - bleed_pixels[0] * 2, + image.size[1] - bleed_pixels[1] * 2, + ) + + # calculate the aspect ratio of the live_size + live_size_ratio = live_size[0] / live_size[1] + + # calculate the aspect ratio of the output image + output_ratio = size[0] / size[1] + + # figure out if the sides or top/bottom will be cropped off + if live_size_ratio == output_ratio: + # live_size is already the needed ratio + crop_width = live_size[0] + crop_height = live_size[1] + elif live_size_ratio >= output_ratio: + # live_size is wider than what's needed, crop the sides + crop_width = output_ratio * live_size[1] + crop_height = live_size[1] + else: + # live_size is taller than what's needed, crop the top and bottom + crop_width = live_size[0] + crop_height = live_size[0] / output_ratio + + # make the crop + crop_left = bleed_pixels[0] + (live_size[0] - crop_width) * centering_x + crop_top = bleed_pixels[1] + (live_size[1] - crop_height) * centering_y + + crop = (crop_left, crop_top, crop_left + crop_width, crop_top + crop_height) + + # resize the image and return it + return image.resize(size, method, box=crop) + + +def flip(image: Image.Image) -> Image.Image: + """ + Flip the image vertically (top to bottom). + + :param image: The image to flip. + :return: An image. + """ + return image.transpose(Image.Transpose.FLIP_TOP_BOTTOM) + + +def grayscale(image: Image.Image) -> Image.Image: + """ + Convert the image to grayscale. + + :param image: The image to convert. + :return: An image. + """ + return image.convert("L") + + +def invert(image: Image.Image) -> Image.Image: + """ + Invert (negate) the image. + + :param image: The image to invert. + :return: An image. + """ + lut = list(range(255, -1, -1)) + return image.point(lut) if image.mode == "1" else _lut(image, lut) + + +def mirror(image: Image.Image) -> Image.Image: + """ + Flip image horizontally (left to right). + + :param image: The image to mirror. + :return: An image. + """ + return image.transpose(Image.Transpose.FLIP_LEFT_RIGHT) + + +def posterize(image: Image.Image, bits: int) -> Image.Image: + """ + Reduce the number of bits for each color channel. + + :param image: The image to posterize. + :param bits: The number of bits to keep for each channel (1-8). + :return: An image. + """ + mask = ~(2 ** (8 - bits) - 1) + lut = [i & mask for i in range(256)] + return _lut(image, lut) + + +def solarize(image: Image.Image, threshold: int = 128) -> Image.Image: + """ + Invert all pixel values above a threshold. + + :param image: The image to solarize. + :param threshold: All pixels above this grayscale level are inverted. + :return: An image. + """ + lut = [] + for i in range(256): + if i < threshold: + lut.append(i) + else: + lut.append(255 - i) + return _lut(image, lut) + + +@overload +def exif_transpose(image: Image.Image, *, in_place: Literal[True]) -> None: ... + + +@overload +def exif_transpose( + image: Image.Image, *, in_place: Literal[False] = False +) -> Image.Image: ... + + +def exif_transpose(image: Image.Image, *, in_place: bool = False) -> Image.Image | None: + """ + If an image has an EXIF Orientation tag, other than 1, transpose the image + accordingly, and remove the orientation data. + + :param image: The image to transpose. + :param in_place: Boolean. Keyword-only argument. + If ``True``, the original image is modified in-place, and ``None`` is returned. + If ``False`` (default), a new :py:class:`~PIL.Image.Image` object is returned + with the transposition applied. If there is no transposition, a copy of the + image will be returned. + """ + image.load() + image_exif = image.getexif() + orientation = image_exif.get(ExifTags.Base.Orientation, 1) + method = { + 2: Image.Transpose.FLIP_LEFT_RIGHT, + 3: Image.Transpose.ROTATE_180, + 4: Image.Transpose.FLIP_TOP_BOTTOM, + 5: Image.Transpose.TRANSPOSE, + 6: Image.Transpose.ROTATE_270, + 7: Image.Transpose.TRANSVERSE, + 8: Image.Transpose.ROTATE_90, + }.get(orientation) + if method is not None: + if in_place: + image.im = image.im.transpose(method) + image._size = image.im.size + else: + transposed_image = image.transpose(method) + exif_image = image if in_place else transposed_image + + exif = exif_image.getexif() + if ExifTags.Base.Orientation in exif: + del exif[ExifTags.Base.Orientation] + if "exif" in exif_image.info: + exif_image.info["exif"] = exif.tobytes() + elif "Raw profile type exif" in exif_image.info: + exif_image.info["Raw profile type exif"] = exif.tobytes().hex() + for key in ("XML:com.adobe.xmp", "xmp"): + if key in exif_image.info: + for pattern in ( + r'tiff:Orientation="([0-9])"', + r"([0-9])", + ): + value = exif_image.info[key] + if isinstance(value, str): + value = re.sub(pattern, "", value) + elif isinstance(value, tuple): + value = tuple( + re.sub(pattern.encode(), b"", v) for v in value + ) + else: + value = re.sub(pattern.encode(), b"", value) + exif_image.info[key] = value + if not in_place: + return transposed_image + elif not in_place: + return image.copy() + return None diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImagePalette.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImagePalette.py new file mode 100644 index 000000000..2abbd46ea --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImagePalette.py @@ -0,0 +1,290 @@ +# +# The Python Imaging Library. +# $Id$ +# +# image palette object +# +# History: +# 1996-03-11 fl Rewritten. +# 1997-01-03 fl Up and running. +# 1997-08-23 fl Added load hack +# 2001-04-16 fl Fixed randint shadow bug in random() +# +# Copyright (c) 1997-2001 by Secret Labs AB +# Copyright (c) 1996-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import array +from collections.abc import Sequence +from typing import IO + +from . import GimpGradientFile, GimpPaletteFile, ImageColor, PaletteFile + +TYPE_CHECKING = False +if TYPE_CHECKING: + from . import Image + + +class ImagePalette: + """ + Color palette for palette mapped images + + :param mode: The mode to use for the palette. See: + :ref:`concept-modes`. Defaults to "RGB" + :param palette: An optional palette. If given, it must be a bytearray, + an array or a list of ints between 0-255. The list must consist of + all channels for one color followed by the next color (e.g. RGBRGBRGB). + Defaults to an empty palette. + """ + + def __init__( + self, + mode: str = "RGB", + palette: Sequence[int] | bytes | bytearray | None = None, + ) -> None: + self.mode = mode + self.rawmode: str | None = None # if set, palette contains raw data + self.palette = palette or bytearray() + self.dirty: int | None = None + + @property + def palette(self) -> Sequence[int] | bytes | bytearray: + return self._palette + + @palette.setter + def palette(self, palette: Sequence[int] | bytes | bytearray) -> None: + self._colors: dict[tuple[int, ...], int] | None = None + self._palette = palette + + @property + def colors(self) -> dict[tuple[int, ...], int]: + if self._colors is None: + mode_len = len(self.mode) + self._colors = {} + for i in range(0, len(self.palette), mode_len): + color = tuple(self.palette[i : i + mode_len]) + if color in self._colors: + continue + self._colors[color] = i // mode_len + return self._colors + + @colors.setter + def colors(self, colors: dict[tuple[int, ...], int]) -> None: + self._colors = colors + + def copy(self) -> ImagePalette: + new = ImagePalette() + + new.mode = self.mode + new.rawmode = self.rawmode + if self.palette is not None: + new.palette = self.palette[:] + new.dirty = self.dirty + + return new + + def getdata(self) -> tuple[str, Sequence[int] | bytes | bytearray]: + """ + Get palette contents in format suitable for the low-level + ``im.putpalette`` primitive. + + .. warning:: This method is experimental. + """ + if self.rawmode: + return self.rawmode, self.palette + return self.mode, self.tobytes() + + def tobytes(self) -> bytes: + """Convert palette to bytes. + + .. warning:: This method is experimental. + """ + if self.rawmode: + msg = "palette contains raw palette data" + raise ValueError(msg) + if isinstance(self.palette, bytes): + return self.palette + arr = array.array("B", self.palette) + return arr.tobytes() + + # Declare tostring as an alias for tobytes + tostring = tobytes + + def _new_color_index( + self, image: Image.Image | None = None, e: Exception | None = None + ) -> int: + if not isinstance(self.palette, bytearray): + self._palette = bytearray(self.palette) + index = len(self.palette) // len(self.mode) + special_colors: tuple[int | tuple[int, ...] | None, ...] = () + if image: + special_colors = ( + image.info.get("background"), + image.info.get("transparency"), + ) + while index in special_colors: + index += 1 + if index >= 256: + if image: + # Search for an unused index + for i, count in reversed(list(enumerate(image.histogram()))): + if count == 0 and i not in special_colors: + index = i + break + if index >= 256: + msg = "cannot allocate more than 256 colors" + raise ValueError(msg) from e + return index + + def getcolor( + self, + color: tuple[int, ...], + image: Image.Image | None = None, + ) -> int: + """Given an rgb tuple, allocate palette entry. + + .. warning:: This method is experimental. + """ + if self.rawmode: + msg = "palette contains raw palette data" + raise ValueError(msg) + if isinstance(color, tuple): + if self.mode == "RGB": + if len(color) == 4: + if color[3] != 255: + msg = "cannot add non-opaque RGBA color to RGB palette" + raise ValueError(msg) + color = color[:3] + elif self.mode == "RGBA": + if len(color) == 3: + color += (255,) + try: + return self.colors[color] + except KeyError as e: + # allocate new color slot + index = self._new_color_index(image, e) + assert isinstance(self._palette, bytearray) + self.colors[color] = index + mode_len = len(self.mode) + if index * mode_len < len(self.palette): + self._palette = ( + self._palette[: index * mode_len] + + bytes(color) + + self._palette[index * mode_len + mode_len :] + ) + else: + self._palette += bytes(color) + self.dirty = 1 + return index + else: + msg = f"unknown color specifier: {repr(color)}" # type: ignore[unreachable] + raise ValueError(msg) + + def save(self, fp: str | IO[str]) -> None: + """Save palette to text file. + + .. warning:: This method is experimental. + """ + if self.rawmode: + msg = "palette contains raw palette data" + raise ValueError(msg) + open_fp = False + if isinstance(fp, str): + fp = open(fp, "w") + open_fp = True + try: + fp.write("# Palette\n") + fp.write(f"# Mode: {self.mode}\n") + palette_len = len(self.palette) + for i in range(256): + fp.write(f"{i}") + for j in range(i * len(self.mode), (i + 1) * len(self.mode)): + fp.write(f" {self.palette[j] if j < palette_len else 0}") + fp.write("\n") + finally: + if open_fp: + fp.close() + + +# -------------------------------------------------------------------- +# Internal + + +def raw(rawmode: str, data: Sequence[int] | bytes | bytearray) -> ImagePalette: + palette = ImagePalette() + palette.rawmode = rawmode + palette.palette = data + palette.dirty = 1 + return palette + + +# -------------------------------------------------------------------- +# Factories + + +def make_linear_lut(black: int, white: float) -> list[int]: + if black == 0: + return [int(white * i // 255) for i in range(256)] + + msg = "unavailable when black is non-zero" + raise NotImplementedError(msg) # FIXME + + +def make_gamma_lut(exp: float) -> list[int]: + return [int(((i / 255.0) ** exp) * 255.0 + 0.5) for i in range(256)] + + +def negative(mode: str = "RGB") -> ImagePalette: + palette = list(range(256 * len(mode))) + palette.reverse() + return ImagePalette(mode, [i // len(mode) for i in palette]) + + +def random(mode: str = "RGB") -> ImagePalette: + from random import randint + + palette = [randint(0, 255) for _ in range(256 * len(mode))] + return ImagePalette(mode, palette) + + +def sepia(white: str = "#fff0c0") -> ImagePalette: + bands = [make_linear_lut(0, band) for band in ImageColor.getrgb(white)] + return ImagePalette("RGB", [bands[i % 3][i // 3] for i in range(256 * 3)]) + + +def wedge(mode: str = "RGB") -> ImagePalette: + palette = list(range(256 * len(mode))) + return ImagePalette(mode, [i // len(mode) for i in palette]) + + +def load(filename: str) -> tuple[bytes, str]: + # FIXME: supports GIMP gradients only + + with open(filename, "rb") as fp: + paletteHandlers: list[ + type[ + GimpPaletteFile.GimpPaletteFile + | GimpGradientFile.GimpGradientFile + | PaletteFile.PaletteFile + ] + ] = [ + GimpPaletteFile.GimpPaletteFile, + GimpGradientFile.GimpGradientFile, + PaletteFile.PaletteFile, + ] + for paletteHandler in paletteHandlers: + try: + fp.seek(0) + lut = paletteHandler(fp).getpalette() + if lut: + break + except (SyntaxError, ValueError): + pass + else: + msg = "cannot load palette" + raise OSError(msg) + + return lut # data, rawmode diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImagePath.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImagePath.py new file mode 100644 index 000000000..77e8a609a --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImagePath.py @@ -0,0 +1,20 @@ +# +# The Python Imaging Library +# $Id$ +# +# path interface +# +# History: +# 1996-11-04 fl Created +# 2002-04-14 fl Added documentation stub class +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image + +Path = Image.core.path diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageQt.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageQt.py new file mode 100644 index 000000000..af4d0742d --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageQt.py @@ -0,0 +1,219 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a simple Qt image interface. +# +# history: +# 2006-06-03 fl: created +# 2006-06-04 fl: inherit from QImage instead of wrapping it +# 2006-06-05 fl: removed toimage helper; move string support to ImageQt +# 2013-11-13 fl: add support for Qt5 (aurelien.ballier@cyclonit.com) +# +# Copyright (c) 2006 by Secret Labs AB +# Copyright (c) 2006 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import sys +from io import BytesIO + +from . import Image +from ._util import is_path + +TYPE_CHECKING = False +if TYPE_CHECKING: + from collections.abc import Callable + from typing import Any + + from . import ImageFile + + QBuffer: type + +qt_version: str | None +qt_versions = [ + ["6", "PyQt6"], + ["side6", "PySide6"], +] + +# If a version has already been imported, attempt it first +qt_versions.sort(key=lambda version: version[1] in sys.modules, reverse=True) +for version, qt_module in qt_versions: + try: + qRgba: Callable[[int, int, int, int], int] + if qt_module == "PyQt6": + from PyQt6.QtCore import QBuffer, QByteArray, QIODevice + from PyQt6.QtGui import QImage, QPixmap, qRgba + elif qt_module == "PySide6": + from PySide6.QtCore import ( # type: ignore[assignment] + QBuffer, + QByteArray, + QIODevice, + ) + from PySide6.QtGui import QImage, QPixmap, qRgba # type: ignore[assignment] + except (ImportError, RuntimeError): + continue + qt_is_installed = True + qt_version = version + break +else: + qt_is_installed = False + qt_version = None + + +def rgb(r: int, g: int, b: int, a: int = 255) -> int: + """(Internal) Turns an RGB color into a Qt compatible color integer.""" + # use qRgb to pack the colors, and then turn the resulting long + # into a negative integer with the same bitpattern. + return qRgba(r, g, b, a) & 0xFFFFFFFF + + +def fromqimage(im: QImage | QPixmap) -> ImageFile.ImageFile: + """ + :param im: QImage or PIL ImageQt object + """ + buffer = QBuffer() + qt_openmode: object + if qt_version == "6": + try: + qt_openmode = getattr(QIODevice, "OpenModeFlag") + except AttributeError: + qt_openmode = getattr(QIODevice, "OpenMode") + else: + qt_openmode = QIODevice + buffer.open(getattr(qt_openmode, "ReadWrite")) + # preserve alpha channel with png + # otherwise ppm is more friendly with Image.open + if im.hasAlphaChannel(): + im.save(buffer, "png") + else: + im.save(buffer, "ppm") + + b = BytesIO() + b.write(buffer.data()) + buffer.close() + b.seek(0) + + return Image.open(b) + + +def fromqpixmap(im: QPixmap) -> ImageFile.ImageFile: + return fromqimage(im) + + +def align8to32(bytes: bytes, width: int, mode: str) -> bytes: + """ + converts each scanline of data from 8 bit to 32 bit aligned + """ + + bits_per_pixel = {"1": 1, "L": 8, "P": 8, "I;16": 16}[mode] + + # calculate bytes per line and the extra padding if needed + bits_per_line = bits_per_pixel * width + full_bytes_per_line, remaining_bits_per_line = divmod(bits_per_line, 8) + bytes_per_line = full_bytes_per_line + (1 if remaining_bits_per_line else 0) + + extra_padding = -bytes_per_line % 4 + + # already 32 bit aligned by luck + if not extra_padding: + return bytes + + new_data = [ + bytes[i * bytes_per_line : (i + 1) * bytes_per_line] + b"\x00" * extra_padding + for i in range(len(bytes) // bytes_per_line) + ] + + return b"".join(new_data) + + +def _toqclass_helper(im: Image.Image | str | QByteArray) -> dict[str, Any]: + data = None + colortable = None + exclusive_fp = False + + # handle filename, if given instead of image name + if hasattr(im, "toUtf8"): + # FIXME - is this really the best way to do this? + im = str(im.toUtf8(), "utf-8") + if is_path(im): + im = Image.open(im) + exclusive_fp = True + assert isinstance(im, Image.Image) + + qt_format = getattr(QImage, "Format") if qt_version == "6" else QImage + if im.mode == "1": + format = getattr(qt_format, "Format_Mono") + elif im.mode == "L": + format = getattr(qt_format, "Format_Indexed8") + colortable = [rgb(i, i, i) for i in range(256)] + elif im.mode == "P": + format = getattr(qt_format, "Format_Indexed8") + palette = im.getpalette() + assert palette is not None + colortable = [rgb(*palette[i : i + 3]) for i in range(0, len(palette), 3)] + elif im.mode == "RGB": + # Populate the 4th channel with 255 + im = im.convert("RGBA") + + data = im.tobytes("raw", "BGRA") + format = getattr(qt_format, "Format_RGB32") + elif im.mode == "RGBA": + data = im.tobytes("raw", "BGRA") + format = getattr(qt_format, "Format_ARGB32") + elif im.mode == "I;16": + im = im.point(lambda i: i * 256) + + format = getattr(qt_format, "Format_Grayscale16") + else: + if exclusive_fp: + im.close() + msg = f"unsupported image mode {repr(im.mode)}" + raise ValueError(msg) + + size = im.size + __data = data or align8to32(im.tobytes(), size[0], im.mode) + if exclusive_fp: + im.close() + return {"data": __data, "size": size, "format": format, "colortable": colortable} + + +if qt_is_installed: + + class ImageQt(QImage): + def __init__(self, im: Image.Image | str | QByteArray) -> None: + """ + An PIL image wrapper for Qt. This is a subclass of PyQt's QImage + class. + + :param im: A PIL Image object, or a file name (given either as + Python string or a PyQt string object). + """ + im_data = _toqclass_helper(im) + # must keep a reference, or Qt will crash! + # All QImage constructors that take data operate on an existing + # buffer, so this buffer has to hang on for the life of the image. + # Fixes https://github.com/python-pillow/Pillow/issues/1370 + self.__data = im_data["data"] + super().__init__( + self.__data, + im_data["size"][0], + im_data["size"][1], + im_data["format"], + ) + if im_data["colortable"]: + self.setColorTable(im_data["colortable"]) + + +def toqimage(im: Image.Image | str | QByteArray) -> ImageQt: + return ImageQt(im) + + +def toqpixmap(im: Image.Image | str | QByteArray) -> QPixmap: + qimage = toqimage(im) + pixmap = getattr(QPixmap, "fromImage")(qimage) + if qt_version == "6": + pixmap.detach() + return pixmap diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageSequence.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageSequence.py new file mode 100644 index 000000000..361be4897 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageSequence.py @@ -0,0 +1,88 @@ +# +# The Python Imaging Library. +# $Id$ +# +# sequence support classes +# +# history: +# 1997-02-20 fl Created +# +# Copyright (c) 1997 by Secret Labs AB. +# Copyright (c) 1997 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +## +from __future__ import annotations + +from . import Image + +TYPE_CHECKING = False +if TYPE_CHECKING: + from collections.abc import Callable + + +class Iterator: + """ + This class implements an iterator object that can be used to loop + over an image sequence. + + You can use the ``[]`` operator to access elements by index. This operator + will raise an :py:exc:`IndexError` if you try to access a nonexistent + frame. + + :param im: An image object. + """ + + def __init__(self, im: Image.Image) -> None: + if not hasattr(im, "seek"): + msg = "im must have seek method" + raise AttributeError(msg) + self.im = im + self.position = getattr(self.im, "_min_frame", 0) + + def __getitem__(self, ix: int) -> Image.Image: + try: + self.im.seek(ix) + return self.im + except EOFError as e: + msg = "end of sequence" + raise IndexError(msg) from e + + def __iter__(self) -> Iterator: + return self + + def __next__(self) -> Image.Image: + try: + self.im.seek(self.position) + self.position += 1 + return self.im + except EOFError as e: + msg = "end of sequence" + raise StopIteration(msg) from e + + +def all_frames( + im: Image.Image | list[Image.Image], + func: Callable[[Image.Image], Image.Image] | None = None, +) -> list[Image.Image]: + """ + Applies a given function to all frames in an image or a list of images. + The frames are returned as a list of separate images. + + :param im: An image, or a list of images. + :param func: The function to apply to all of the image frames. + :returns: A list of images. + """ + if not isinstance(im, list): + im = [im] + + ims = [] + for imSequence in im: + current = imSequence.tell() + + ims += [im_frame.copy() for im_frame in Iterator(imSequence)] + + imSequence.seek(current) + return [func(im) for im in ims] if func else ims diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageShow.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageShow.py new file mode 100644 index 000000000..7705608e3 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageShow.py @@ -0,0 +1,362 @@ +# +# The Python Imaging Library. +# $Id$ +# +# im.show() drivers +# +# History: +# 2008-04-06 fl Created +# +# Copyright (c) Secret Labs AB 2008. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import abc +import os +import shutil +import subprocess +import sys +from shlex import quote +from typing import Any + +from . import Image + +_viewers = [] + + +def register(viewer: type[Viewer] | Viewer, order: int = 1) -> None: + """ + The :py:func:`register` function is used to register additional viewers:: + + from PIL import ImageShow + ImageShow.register(MyViewer()) # MyViewer will be used as a last resort + ImageShow.register(MySecondViewer(), 0) # MySecondViewer will be prioritised + ImageShow.register(ImageShow.XVViewer(), 0) # XVViewer will be prioritised + + :param viewer: The viewer to be registered. + :param order: + Zero or a negative integer to prepend this viewer to the list, + a positive integer to append it. + """ + if isinstance(viewer, type) and issubclass(viewer, Viewer): + viewer = viewer() + if order > 0: + _viewers.append(viewer) + else: + _viewers.insert(0, viewer) + + +def show(image: Image.Image, title: str | None = None, **options: Any) -> bool: + r""" + Display a given image. + + :param image: An image object. + :param title: Optional title. Not all viewers can display the title. + :param \**options: Additional viewer options. + :returns: ``True`` if a suitable viewer was found, ``False`` otherwise. + """ + for viewer in _viewers: + if viewer.show(image, title=title, **options): + return True + return False + + +class Viewer: + """Base class for viewers.""" + + # main api + + def show(self, image: Image.Image, **options: Any) -> int: + """ + The main function for displaying an image. + Converts the given image to the target format and displays it. + """ + + if not ( + image.mode in ("1", "RGBA") + or (self.format == "PNG" and image.mode in ("I;16", "LA")) + ): + base = Image.getmodebase(image.mode) + if image.mode != base: + image = image.convert(base) + + return self.show_image(image, **options) + + # hook methods + + format: str | None = None + """The format to convert the image into.""" + options: dict[str, Any] = {} + """Additional options used to convert the image.""" + + def get_format(self, image: Image.Image) -> str | None: + """Return format name, or ``None`` to save as PGM/PPM.""" + return self.format + + def get_command(self, file: str, **options: Any) -> str: + """ + Returns the command used to display the file. + Not implemented in the base class. + """ + msg = "unavailable in base viewer" + raise NotImplementedError(msg) + + def save_image(self, image: Image.Image) -> str: + """Save to temporary file and return filename.""" + return image._dump(format=self.get_format(image), **self.options) + + def show_image(self, image: Image.Image, **options: Any) -> int: + """Display the given image.""" + return self.show_file(self.save_image(image), **options) + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + os.system(self.get_command(path, **options)) # nosec + return 1 + + +# -------------------------------------------------------------------- + + +class WindowsViewer(Viewer): + """The default viewer on Windows is the default system application for PNG files.""" + + format = "PNG" + options = {"compress_level": 1, "save_all": True} + + def get_command(self, file: str, **options: Any) -> str: + return ( + f'start "Pillow" /WAIT "{file}" ' + "&& ping -n 4 127.0.0.1 >NUL " + f'&& del /f "{file}"' + ) + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + subprocess.Popen( + self.get_command(path, **options), + shell=True, + creationflags=getattr(subprocess, "CREATE_NO_WINDOW"), + ) # nosec + return 1 + + +if sys.platform == "win32": + register(WindowsViewer) + + +class MacViewer(Viewer): + """The default viewer on macOS using ``Preview.app``.""" + + format = "PNG" + options = {"compress_level": 1, "save_all": True} + + def get_command(self, file: str, **options: Any) -> str: + # on darwin open returns immediately resulting in the temp + # file removal while app is opening + command = "open -a Preview.app" + command = f"({command} {quote(file)}; sleep 20; rm -f {quote(file)})&" + return command + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + subprocess.call(["open", "-a", "Preview.app", path]) + + pyinstaller = getattr(sys, "frozen", False) and hasattr(sys, "_MEIPASS") + executable = (not pyinstaller and sys.executable) or shutil.which("python3") + if executable: + subprocess.Popen( + [ + executable, + "-c", + "import os, sys, time; time.sleep(20); os.remove(sys.argv[1])", + path, + ] + ) + return 1 + + +if sys.platform == "darwin": + register(MacViewer) + + +class UnixViewer(abc.ABC, Viewer): + format = "PNG" + options = {"compress_level": 1, "save_all": True} + + @abc.abstractmethod + def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: + pass + + def get_command(self, file: str, **options: Any) -> str: + command = self.get_command_ex(file, **options)[0] + return f"{command} {quote(file)}" + + +class XDGViewer(UnixViewer): + """ + The freedesktop.org ``xdg-open`` command. + """ + + def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: + command = executable = "xdg-open" + return command, executable + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + subprocess.Popen(["xdg-open", path]) + return 1 + + +class DisplayViewer(UnixViewer): + """ + The ImageMagick ``display`` command. + This viewer supports the ``title`` parameter. + """ + + def get_command_ex( + self, file: str, title: str | None = None, **options: Any + ) -> tuple[str, str]: + command = executable = "display" + if title: + command += f" -title {quote(title)}" + return command, executable + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + args = ["display"] + title = options.get("title") + if title: + args += ["-title", title] + args.append(path) + + subprocess.Popen(args) + return 1 + + +class GmDisplayViewer(UnixViewer): + """The GraphicsMagick ``gm display`` command.""" + + def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: + executable = "gm" + command = "gm display" + return command, executable + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + subprocess.Popen(["gm", "display", path]) + return 1 + + +class EogViewer(UnixViewer): + """The GNOME Image Viewer ``eog`` command.""" + + def get_command_ex(self, file: str, **options: Any) -> tuple[str, str]: + executable = "eog" + command = "eog -n" + return command, executable + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + subprocess.Popen(["eog", "-n", path]) + return 1 + + +class XVViewer(UnixViewer): + """ + The X Viewer ``xv`` command. + This viewer supports the ``title`` parameter. + """ + + def get_command_ex( + self, file: str, title: str | None = None, **options: Any + ) -> tuple[str, str]: + # note: xv is pretty outdated. most modern systems have + # imagemagick's display command instead. + command = executable = "xv" + if title: + command += f" -name {quote(title)}" + return command, executable + + def show_file(self, path: str, **options: Any) -> int: + """ + Display given file. + """ + if not os.path.exists(path): + raise FileNotFoundError + args = ["xv"] + title = options.get("title") + if title: + args += ["-name", title] + args.append(path) + + subprocess.Popen(args) + return 1 + + +if sys.platform not in ("win32", "darwin"): # unixoids + if shutil.which("xdg-open"): + register(XDGViewer) + if shutil.which("display"): + register(DisplayViewer) + if shutil.which("gm"): + register(GmDisplayViewer) + if shutil.which("eog"): + register(EogViewer) + if shutil.which("xv"): + register(XVViewer) + + +class IPythonViewer(Viewer): + """The viewer for IPython frontends.""" + + def show_image(self, image: Image.Image, **options: Any) -> int: + ipython_display(image) + return 1 + + +try: + from IPython.display import display as ipython_display +except ImportError: + pass +else: + register(IPythonViewer) + + +if __name__ == "__main__": + if len(sys.argv) < 2: + print("Syntax: python3 ImageShow.py imagefile [title]") + sys.exit() + + with Image.open(sys.argv[1]) as im: + print(show(im, *sys.argv[2:])) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageStat.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageStat.py new file mode 100644 index 000000000..3a1044ba4 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageStat.py @@ -0,0 +1,167 @@ +# +# The Python Imaging Library. +# $Id$ +# +# global image statistics +# +# History: +# 1996-04-05 fl Created +# 1997-05-21 fl Added mask; added rms, var, stddev attributes +# 1997-08-05 fl Added median +# 1998-07-05 hk Fixed integer overflow error +# +# Notes: +# This class shows how to implement delayed evaluation of attributes. +# To get a certain value, simply access the corresponding attribute. +# The __getattr__ dispatcher takes care of the rest. +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996-97. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import math +from functools import cached_property + +from . import Image + + +class Stat: + def __init__( + self, image_or_list: Image.Image | list[int], mask: Image.Image | None = None + ) -> None: + """ + Calculate statistics for the given image. If a mask is included, + only the regions covered by that mask are included in the + statistics. You can also pass in a previously calculated histogram. + + :param image: A PIL image, or a precalculated histogram. + + .. note:: + + For a PIL image, calculations rely on the + :py:meth:`~PIL.Image.Image.histogram` method. The pixel counts are + grouped into 256 bins, even if the image has more than 8 bits per + channel. So ``I`` and ``F`` mode images have a maximum ``mean``, + ``median`` and ``rms`` of 255, and cannot have an ``extrema`` maximum + of more than 255. + + :param mask: An optional mask. + """ + if isinstance(image_or_list, Image.Image): + self.h = image_or_list.histogram(mask) + elif isinstance(image_or_list, list): + self.h = image_or_list + else: + msg = "first argument must be image or list" # type: ignore[unreachable] + raise TypeError(msg) + self.bands = list(range(len(self.h) // 256)) + + @cached_property + def extrema(self) -> list[tuple[int, int]]: + """ + Min/max values for each band in the image. + + .. note:: + This relies on the :py:meth:`~PIL.Image.Image.histogram` method, and + simply returns the low and high bins used. This is correct for + images with 8 bits per channel, but fails for other modes such as + ``I`` or ``F``. Instead, use :py:meth:`~PIL.Image.Image.getextrema` to + return per-band extrema for the image. This is more correct and + efficient because, for non-8-bit modes, the histogram method uses + :py:meth:`~PIL.Image.Image.getextrema` to determine the bins used. + """ + + def minmax(histogram: list[int]) -> tuple[int, int]: + res_min, res_max = 255, 0 + for i in range(256): + if histogram[i]: + res_min = i + break + for i in range(255, -1, -1): + if histogram[i]: + res_max = i + break + return res_min, res_max + + return [minmax(self.h[i:]) for i in range(0, len(self.h), 256)] + + @cached_property + def count(self) -> list[int]: + """Total number of pixels for each band in the image.""" + return [sum(self.h[i : i + 256]) for i in range(0, len(self.h), 256)] + + @cached_property + def sum(self) -> list[float]: + """Sum of all pixels for each band in the image.""" + + v = [] + for i in range(0, len(self.h), 256): + layer_sum = 0.0 + for j in range(256): + layer_sum += j * self.h[i + j] + v.append(layer_sum) + return v + + @cached_property + def sum2(self) -> list[float]: + """Squared sum of all pixels for each band in the image.""" + + v = [] + for i in range(0, len(self.h), 256): + sum2 = 0.0 + for j in range(256): + sum2 += (j**2) * float(self.h[i + j]) + v.append(sum2) + return v + + @cached_property + def mean(self) -> list[float]: + """Average (arithmetic mean) pixel level for each band in the image.""" + return [self.sum[i] / self.count[i] if self.count[i] else 0 for i in self.bands] + + @cached_property + def median(self) -> list[int]: + """Median pixel level for each band in the image.""" + + v = [] + for i in self.bands: + s = 0 + half = self.count[i] // 2 + b = i * 256 + for j in range(256): + s = s + self.h[b + j] + if s > half: + break + v.append(j) + return v + + @cached_property + def rms(self) -> list[float]: + """RMS (root-mean-square) for each band in the image.""" + return [ + math.sqrt(self.sum2[i] / self.count[i]) if self.count[i] else 0 + for i in self.bands + ] + + @cached_property + def var(self) -> list[float]: + """Variance for each band in the image.""" + return [ + ( + (self.sum2[i] - (self.sum[i] ** 2.0) / self.count[i]) / self.count[i] + if self.count[i] + else 0 + ) + for i in self.bands + ] + + @cached_property + def stddev(self) -> list[float]: + """Standard deviation for each band in the image.""" + return [math.sqrt(self.var[i]) for i in self.bands] + + +Global = Stat # compatibility diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageText.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageText.py new file mode 100644 index 000000000..008d20d38 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageText.py @@ -0,0 +1,508 @@ +from __future__ import annotations + +import math +import re +from typing import AnyStr, Generic, NamedTuple + +from . import ImageFont +from ._typing import _Ink + +Font = ImageFont.ImageFont | ImageFont.FreeTypeFont | ImageFont.TransposedFont + + +class _Line(NamedTuple): + x: float + y: float + anchor: str + text: str | bytes + + +class _Wrap(Generic[AnyStr]): + lines: list[AnyStr] = [] + position = 0 + offset = 0 + + def __init__( + self, + text: Text[AnyStr], + width: int, + height: int | None = None, + font: Font | None = None, + ) -> None: + self.text: Text[AnyStr] = text + self.width = width + self.height = height + self.font = font + + input_text = self.text.text + emptystring = "" if isinstance(input_text, str) else b"" + line = emptystring + + for word in re.findall( + r"\s*\S+" if isinstance(input_text, str) else rb"\s*\S+", input_text + ): + newlines = re.findall( + r"[^\S\n]*\n" if isinstance(input_text, str) else rb"[^\S\n]*\n", word + ) + if newlines: + if not self.add_line(line): + break + for i, line in enumerate(newlines): + if i != 0 and not self.add_line(emptystring): + break + self.position += len(line) + word = word[len(line) :] + line = emptystring + + new_line = line + word + if self.text._get_bbox(new_line, self.font)[2] <= width: + # This word fits on the line + line = new_line + continue + + # This word does not fit on the line + if line and not self.add_line(line): + break + + original_length = len(word) + word = word.lstrip() + self.offset = original_length - len(word) + + if self.text._get_bbox(word, self.font)[2] > width: + if font is None: + msg = "Word does not fit within line" + raise ValueError(msg) + break + line = word + else: + if line: + self.add_line(line) + self.remaining_text: AnyStr = input_text[self.position :] + + def add_line(self, line: AnyStr) -> bool: + lines = self.lines + [line] + if self.height is not None: + last_line_y = self.text._split(lines=lines)[-1].y + last_line_height = self.text._get_bbox(line, self.font)[3] + if last_line_y + last_line_height > self.height: + return False + + self.lines = lines + self.position += len(line) + self.offset + self.offset = 0 + return True + + +class Text(Generic[AnyStr]): + def __init__( + self, + text: AnyStr, + font: Font | None = None, + mode: str = "RGB", + spacing: float = 4, + direction: str | None = None, + features: list[str] | None = None, + language: str | None = None, + ) -> None: + """ + :param text: String to be drawn. + :param font: Either an :py:class:`~PIL.ImageFont.ImageFont` instance, + :py:class:`~PIL.ImageFont.FreeTypeFont` instance, + :py:class:`~PIL.ImageFont.TransposedFont` instance or ``None``. If + ``None``, the default font from :py:meth:`.ImageFont.load_default` + will be used. + :param mode: The image mode this will be used with. + :param spacing: The number of pixels between lines. + :param direction: Direction of the text. It can be ``"rtl"`` (right to left), + ``"ltr"`` (left to right) or ``"ttb"`` (top to bottom). + Requires libraqm. + :param features: A list of OpenType font features to be used during text + layout. This is usually used to turn on optional font features + that are not enabled by default, for example ``"dlig"`` or + ``"ss01"``, but can be also used to turn off default font + features, for example ``"-liga"`` to disable ligatures or + ``"-kern"`` to disable kerning. To get all supported + features, see `OpenType docs`_. + Requires libraqm. + :param language: Language of the text. Different languages may use + different glyph shapes or ligatures. This parameter tells + the font which language the text is in, and to apply the + correct substitutions as appropriate, if available. + It should be a `BCP 47 language code`_. + Requires libraqm. + """ + self.text: AnyStr = text + self.font = font or ImageFont.load_default() + + self.mode = mode + self.spacing = spacing + self.direction = direction + self.features = features + self.language = language + + self.embedded_color = False + + self.stroke_width: float = 0 + self.stroke_fill: _Ink | None = None + + def embed_color(self) -> None: + """ + Use embedded color glyphs (COLR, CBDT, SBIX). + """ + if self.mode not in ("RGB", "RGBA"): + msg = "Embedded color supported only in RGB and RGBA modes" + raise ValueError(msg) + self.embedded_color = True + + def stroke(self, width: float = 0, fill: _Ink | None = None) -> None: + """ + :param width: The width of the text stroke. + :param fill: Color to use for the text stroke when drawing. If not given, will + default to the ``fill`` parameter from + :py:meth:`.ImageDraw.ImageDraw.text`. + """ + self.stroke_width = width + self.stroke_fill = fill + + def _get_fontmode(self) -> str: + if self.mode in ("1", "P", "I", "F"): + return "1" + elif self.embedded_color: + return "RGBA" + else: + return "L" + + def wrap( + self, + width: int, + height: int | None = None, + scaling: str | tuple[str, int] | None = None, + ) -> Text[AnyStr] | None: + """ + Wrap text to fit within a given width. + + :param width: The width to fit within. + :param height: An optional height limit. Any text that does not fit within this + will be returned as a new :py:class:`.Text` object. + :param scaling: An optional directive to scale the text, either "grow" as much + as possible within the given dimensions, or "shrink" until it + fits. It can also be a tuple of (direction, limit), with an + integer limit to stop scaling at. + + :returns: An :py:class:`.Text` object, or None. + """ + if isinstance(self.font, ImageFont.TransposedFont): + msg = "TransposedFont not supported" + raise ValueError(msg) + if self.direction not in (None, "ltr"): + msg = "Only ltr direction supported" + raise ValueError(msg) + + if scaling is None: + wrap = _Wrap(self, width, height) + else: + if not isinstance(self.font, ImageFont.FreeTypeFont): + msg = "'scaling' only supports FreeTypeFont" + raise ValueError(msg) + if height is None: + msg = "'scaling' requires 'height'" + raise ValueError(msg) + + if isinstance(scaling, str): + limit = 1 + else: + scaling, limit = scaling + + font = self.font + wrap = _Wrap(self, width, height, font) + if scaling == "shrink": + if not wrap.remaining_text: + return None + + size = math.ceil(font.size) + while wrap.remaining_text: + if size == max(limit, 1): + msg = "Text could not be scaled" + raise ValueError(msg) + size -= 1 + font = self.font.font_variant(size=size) + wrap = _Wrap(self, width, height, font) + self.font = font + else: + if wrap.remaining_text: + msg = "Text could not be scaled" + raise ValueError(msg) + + size = math.floor(font.size) + while not wrap.remaining_text: + if size == limit: + msg = "Text could not be scaled" + raise ValueError(msg) + size += 1 + font = self.font.font_variant(size=size) + last_wrap = wrap + wrap = _Wrap(self, width, height, font) + size -= 1 + if size != self.font.size: + self.font = self.font.font_variant(size=size) + wrap = last_wrap + + if wrap.remaining_text: + text = Text( + text=wrap.remaining_text, + font=self.font, + mode=self.mode, + spacing=self.spacing, + direction=self.direction, + features=self.features, + language=self.language, + ) + text.embedded_color = self.embedded_color + text.stroke_width = self.stroke_width + text.stroke_fill = self.stroke_fill + else: + text = None + + newline = "\n" if isinstance(self.text, str) else b"\n" + self.text = newline.join(wrap.lines) + return text + + def get_length(self) -> float: + """ + Returns length (in pixels with 1/64 precision) of text. + + This is the amount by which following text should be offset. + Text bounding box may extend past the length in some fonts, + e.g. when using italics or accents. + + The result is returned as a float; it is a whole number if using basic layout. + + Note that the sum of two lengths may not equal the length of a concatenated + string due to kerning. If you need to adjust for kerning, include the following + character and subtract its length. + + For example, instead of:: + + hello = ImageText.Text("Hello", font).get_length() + world = ImageText.Text("World", font).get_length() + helloworld = ImageText.Text("HelloWorld", font).get_length() + assert hello + world == helloworld + + use:: + + hello = ( + ImageText.Text("HelloW", font).get_length() - + ImageText.Text("W", font).get_length() + ) # adjusted for kerning + world = ImageText.Text("World", font).get_length() + helloworld = ImageText.Text("HelloWorld", font).get_length() + assert hello + world == helloworld + + or disable kerning with (requires libraqm):: + + hello = ImageText.Text("Hello", font, features=["-kern"]).get_length() + world = ImageText.Text("World", font, features=["-kern"]).get_length() + helloworld = ImageText.Text( + "HelloWorld", font, features=["-kern"] + ).get_length() + assert hello + world == helloworld + + :return: Either width for horizontal text, or height for vertical text. + """ + if isinstance(self.text, str): + multiline = "\n" in self.text + else: + multiline = b"\n" in self.text + if multiline: + msg = "can't measure length of multiline text" + raise ValueError(msg) + return self.font.getlength( + self.text, + self._get_fontmode(), + self.direction, + self.features, + self.language, + ) + + def _split( + self, + xy: tuple[float, float] = (0, 0), + anchor: str | None = None, + align: str = "left", + lines: list[str] | list[bytes] | None = None, + ) -> list[_Line]: + if anchor is None: + anchor = "lt" if self.direction == "ttb" else "la" + elif len(anchor) != 2: + msg = "anchor must be a 2 character string" + raise ValueError(msg) + + if lines is None: + lines = ( + self.text.split("\n") + if isinstance(self.text, str) + else self.text.split(b"\n") + ) + if len(lines) == 1: + return [_Line(xy[0], xy[1], anchor, lines[0])] + + if anchor[1] in "tb" and self.direction != "ttb": + msg = "anchor not supported for multiline text" + raise ValueError(msg) + + fontmode = self._get_fontmode() + line_spacing = ( + self.font.getbbox( + "A", + fontmode, + None, + self.features, + self.language, + self.stroke_width, + )[3] + + self.stroke_width + + self.spacing + ) + + top = xy[1] + parts = [] + if self.direction == "ttb": + left = xy[0] + for line in lines: + parts.append(_Line(left, top, anchor, line)) + left += line_spacing + else: + widths = [] + max_width: float = 0 + for line in lines: + line_width = self.font.getlength( + line, fontmode, self.direction, self.features, self.language + ) + widths.append(line_width) + max_width = max(max_width, line_width) + + if anchor[1] == "m": + top -= (len(lines) - 1) * line_spacing / 2.0 + elif anchor[1] == "d": + top -= (len(lines) - 1) * line_spacing + + idx = -1 + for line in lines: + left = xy[0] + idx += 1 + width_difference = max_width - widths[idx] + + # align by align parameter + if align in ("left", "justify"): + pass + elif align == "center": + left += width_difference / 2.0 + elif align == "right": + left += width_difference + else: + msg = 'align must be "left", "center", "right" or "justify"' + raise ValueError(msg) + + if ( + align == "justify" + and width_difference != 0 + and idx != len(lines) - 1 + ): + words = ( + line.split(" ") if isinstance(line, str) else line.split(b" ") + ) + if len(words) > 1: + # align left by anchor + if anchor[0] == "m": + left -= max_width / 2.0 + elif anchor[0] == "r": + left -= max_width + + word_widths = [ + self.font.getlength( + word, + fontmode, + self.direction, + self.features, + self.language, + ) + for word in words + ] + word_anchor = "l" + anchor[1] + width_difference = max_width - sum(word_widths) + i = 0 + for word in words: + parts.append(_Line(left, top, word_anchor, word)) + left += word_widths[i] + width_difference / (len(words) - 1) + i += 1 + top += line_spacing + continue + + # align left by anchor + if anchor[0] == "m": + left -= width_difference / 2.0 + elif anchor[0] == "r": + left -= width_difference + parts.append(_Line(left, top, anchor, line)) + top += line_spacing + + return parts + + def _get_bbox( + self, text: str | bytes, font: Font | None = None, anchor: str | None = None + ) -> tuple[float, float, float, float]: + return (font or self.font).getbbox( + text, + self._get_fontmode(), + self.direction, + self.features, + self.language, + self.stroke_width, + anchor, + ) + + def get_bbox( + self, + xy: tuple[float, float] = (0, 0), + anchor: str | None = None, + align: str = "left", + ) -> tuple[float, float, float, float]: + """ + Returns bounding box (in pixels) of text. + + Use :py:meth:`get_length` to get the offset of following text with 1/64 pixel + precision. The bounding box includes extra margins for some fonts, e.g. italics + or accents. + + :param xy: The anchor coordinates of the text. + :param anchor: The text anchor alignment. Determines the relative location of + the anchor to the text. The default alignment is top left, + specifically ``la`` for horizontal text and ``lt`` for + vertical text. See :ref:`text-anchors` for details. + :param align: For multiline text, ``"left"``, ``"center"``, ``"right"`` or + ``"justify"`` determines the relative alignment of lines. Use the + ``anchor`` parameter to specify the alignment to ``xy``. + + :return: ``(left, top, right, bottom)`` bounding box + """ + bbox: tuple[float, float, float, float] | None = None + for x, y, anchor, text in self._split(xy, anchor, align): + bbox_line = self._get_bbox(text, anchor=anchor) + bbox_line = ( + bbox_line[0] + x, + bbox_line[1] + y, + bbox_line[2] + x, + bbox_line[3] + y, + ) + if bbox is None: + bbox = bbox_line + else: + bbox = ( + min(bbox[0], bbox_line[0]), + min(bbox[1], bbox_line[1]), + max(bbox[2], bbox_line[2]), + max(bbox[3], bbox_line[3]), + ) + + assert bbox is not None + return bbox diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageTk.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageTk.py new file mode 100644 index 000000000..3a4cb81e9 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageTk.py @@ -0,0 +1,266 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a Tk display interface +# +# History: +# 96-04-08 fl Created +# 96-09-06 fl Added getimage method +# 96-11-01 fl Rewritten, removed image attribute and crop method +# 97-05-09 fl Use PyImagingPaste method instead of image type +# 97-05-12 fl Minor tweaks to match the IFUNC95 interface +# 97-05-17 fl Support the "pilbitmap" booster patch +# 97-06-05 fl Added file= and data= argument to image constructors +# 98-03-09 fl Added width and height methods to Image classes +# 98-07-02 fl Use default mode for "P" images without palette attribute +# 98-07-02 fl Explicitly destroy Tkinter image objects +# 99-07-24 fl Support multiple Tk interpreters (from Greg Couch) +# 99-07-26 fl Automatically hook into Tkinter (if possible) +# 99-08-15 fl Hook uses _imagingtk instead of _imaging +# +# Copyright (c) 1997-1999 by Secret Labs AB +# Copyright (c) 1996-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import tkinter +from io import BytesIO +from typing import Any + +from . import Image, ImageFile + +TYPE_CHECKING = False +if TYPE_CHECKING: + from ._typing import CapsuleType + +# -------------------------------------------------------------------- +# Check for Tkinter interface hooks + + +def _get_image_from_kw(kw: dict[str, Any]) -> ImageFile.ImageFile | None: + source = None + if "file" in kw: + source = kw.pop("file") + elif "data" in kw: + source = BytesIO(kw.pop("data")) + if not source: + return None + return Image.open(source) + + +def _pyimagingtkcall( + command: str, photo: PhotoImage | tkinter.PhotoImage, ptr: CapsuleType +) -> None: + tk = photo.tk + try: + tk.call(command, photo, repr(ptr)) + except tkinter.TclError: + # activate Tkinter hook + # may raise an error if it cannot attach to Tkinter + from . import _imagingtk + + _imagingtk.tkinit(tk.interpaddr()) + tk.call(command, photo, repr(ptr)) + + +# -------------------------------------------------------------------- +# PhotoImage + + +class PhotoImage: + """ + A Tkinter-compatible photo image. This can be used + everywhere Tkinter expects an image object. If the image is an RGBA + image, pixels having alpha 0 are treated as transparent. + + The constructor takes either a PIL image, or a mode and a size. + Alternatively, you can use the ``file`` or ``data`` options to initialize + the photo image object. + + :param image: Either a PIL image, or a mode string. If a mode string is + used, a size must also be given. + :param size: If the first argument is a mode string, this defines the size + of the image. + :keyword file: A filename to load the image from (using + ``Image.open(file)``). + :keyword data: An 8-bit string containing image data (as loaded from an + image file). + """ + + def __init__( + self, + image: Image.Image | str | None = None, + size: tuple[int, int] | None = None, + **kw: Any, + ) -> None: + # Tk compatibility: file or data + if image is None: + image = _get_image_from_kw(kw) + + if image is None: + msg = "Image is required" + raise ValueError(msg) + elif isinstance(image, str): + mode = image + image = None + + if size is None: + msg = "If first argument is mode, size is required" + raise ValueError(msg) + else: + # got an image instead of a mode + mode = image.mode + if mode == "P": + # palette mapped data + image.apply_transparency() + image.load() + mode = image.palette.mode if image.palette else "RGB" + size = image.size + kw["width"], kw["height"] = size + + if mode not in ["1", "L", "RGB", "RGBA"]: + mode = Image.getmodebase(mode) + + self.__mode = mode + self.__size = size + self.__photo = tkinter.PhotoImage(**kw) + self.tk = self.__photo.tk + if image: + self.paste(image) + + def __del__(self) -> None: + try: + name = self.__photo.name + except AttributeError: + return + self.__photo.name = None + try: + self.__photo.tk.call("image", "delete", name) + except Exception: + pass # ignore internal errors + + def __str__(self) -> str: + """ + Get the Tkinter photo image identifier. This method is automatically + called by Tkinter whenever a PhotoImage object is passed to a Tkinter + method. + + :return: A Tkinter photo image identifier (a string). + """ + return str(self.__photo) + + def width(self) -> int: + """ + Get the width of the image. + + :return: The width, in pixels. + """ + return self.__size[0] + + def height(self) -> int: + """ + Get the height of the image. + + :return: The height, in pixels. + """ + return self.__size[1] + + def paste(self, im: Image.Image) -> None: + """ + Paste a PIL image into the photo image. Note that this can + be very slow if the photo image is displayed. + + :param im: A PIL image. The size must match the target region. If the + mode does not match, the image is converted to the mode of + the bitmap image. + """ + # convert to blittable + ptr = im.getim() + image = im.im + if not image.isblock() or im.mode != self.__mode: + block = Image.core.new_block(self.__mode, im.size) + image.convert2(block, image) # convert directly between buffers + ptr = block.ptr + + _pyimagingtkcall("PyImagingPhoto", self.__photo, ptr) + + +# -------------------------------------------------------------------- +# BitmapImage + + +class BitmapImage: + """ + A Tkinter-compatible bitmap image. This can be used everywhere Tkinter + expects an image object. + + The given image must have mode "1". Pixels having value 0 are treated as + transparent. Options, if any, are passed on to Tkinter. The most commonly + used option is ``foreground``, which is used to specify the color for the + non-transparent parts. See the Tkinter documentation for information on + how to specify colours. + + :param image: A PIL image. + """ + + def __init__(self, image: Image.Image | None = None, **kw: Any) -> None: + # Tk compatibility: file or data + if image is None: + image = _get_image_from_kw(kw) + + if image is None: + msg = "Image is required" + raise ValueError(msg) + self.__mode = image.mode + self.__size = image.size + + self.__photo = tkinter.BitmapImage(data=image.tobitmap(), **kw) + + def __del__(self) -> None: + try: + name = self.__photo.name + except AttributeError: + return + self.__photo.name = None + try: + self.__photo.tk.call("image", "delete", name) + except Exception: + pass # ignore internal errors + + def width(self) -> int: + """ + Get the width of the image. + + :return: The width, in pixels. + """ + return self.__size[0] + + def height(self) -> int: + """ + Get the height of the image. + + :return: The height, in pixels. + """ + return self.__size[1] + + def __str__(self) -> str: + """ + Get the Tkinter bitmap image identifier. This method is automatically + called by Tkinter whenever a BitmapImage object is passed to a Tkinter + method. + + :return: A Tkinter bitmap image identifier (a string). + """ + return str(self.__photo) + + +def getimage(photo: PhotoImage) -> Image.Image: + """Copies the contents of a PhotoImage to a PIL image memory.""" + im = Image.new("RGBA", (photo.width(), photo.height())) + + _pyimagingtkcall("PyImagingPhotoGet", photo, im.getim()) + + return im diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageTransform.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageTransform.py new file mode 100644 index 000000000..fb144ff38 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageTransform.py @@ -0,0 +1,136 @@ +# +# The Python Imaging Library. +# $Id$ +# +# transform wrappers +# +# History: +# 2002-04-08 fl Created +# +# Copyright (c) 2002 by Secret Labs AB +# Copyright (c) 2002 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from collections.abc import Sequence +from typing import Any + +from . import Image + + +class Transform(Image.ImageTransformHandler): + """Base class for other transforms defined in :py:mod:`~PIL.ImageTransform`.""" + + method: Image.Transform + + def __init__(self, data: Sequence[Any]) -> None: + self.data = data + + def getdata(self) -> tuple[Image.Transform, Sequence[int]]: + return self.method, self.data + + def transform( + self, + size: tuple[int, int], + image: Image.Image, + **options: Any, + ) -> Image.Image: + """Perform the transform. Called from :py:meth:`.Image.transform`.""" + # can be overridden + method, data = self.getdata() + return image.transform(size, method, data, **options) + + +class AffineTransform(Transform): + """ + Define an affine image transform. + + This function takes a 6-tuple (a, b, c, d, e, f) which contain the first + two rows from the inverse of an affine transform matrix. For each pixel + (x, y) in the output image, the new value is taken from a position (a x + + b y + c, d x + e y + f) in the input image, rounded to nearest pixel. + + This function can be used to scale, translate, rotate, and shear the + original image. + + See :py:meth:`.Image.transform` + + :param matrix: A 6-tuple (a, b, c, d, e, f) containing the first two rows + from the inverse of an affine transform matrix. + """ + + method = Image.Transform.AFFINE + + +class PerspectiveTransform(Transform): + """ + Define a perspective image transform. + + This function takes an 8-tuple (a, b, c, d, e, f, g, h). For each pixel + (x, y) in the output image, the new value is taken from a position + ((a x + b y + c) / (g x + h y + 1), (d x + e y + f) / (g x + h y + 1)) in + the input image, rounded to nearest pixel. + + This function can be used to scale, translate, rotate, and shear the + original image. + + See :py:meth:`.Image.transform` + + :param matrix: An 8-tuple (a, b, c, d, e, f, g, h). + """ + + method = Image.Transform.PERSPECTIVE + + +class ExtentTransform(Transform): + """ + Define a transform to extract a subregion from an image. + + Maps a rectangle (defined by two corners) from the image to a rectangle of + the given size. The resulting image will contain data sampled from between + the corners, such that (x0, y0) in the input image will end up at (0,0) in + the output image, and (x1, y1) at size. + + This method can be used to crop, stretch, shrink, or mirror an arbitrary + rectangle in the current image. It is slightly slower than crop, but about + as fast as a corresponding resize operation. + + See :py:meth:`.Image.transform` + + :param bbox: A 4-tuple (x0, y0, x1, y1) which specifies two points in the + input image's coordinate system. See :ref:`coordinate-system`. + """ + + method = Image.Transform.EXTENT + + +class QuadTransform(Transform): + """ + Define a quad image transform. + + Maps a quadrilateral (a region defined by four corners) from the image to a + rectangle of the given size. + + See :py:meth:`.Image.transform` + + :param xy: An 8-tuple (x0, y0, x1, y1, x2, y2, x3, y3) which contain the + upper left, lower left, lower right, and upper right corner of the + source quadrilateral. + """ + + method = Image.Transform.QUAD + + +class MeshTransform(Transform): + """ + Define a mesh image transform. A mesh transform consists of one or more + individual quad transforms. + + See :py:meth:`.Image.transform` + + :param data: A list of (bbox, quad) tuples. + """ + + method = Image.Transform.MESH diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageWin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageWin.py new file mode 100644 index 000000000..98c28f29f --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImageWin.py @@ -0,0 +1,247 @@ +# +# The Python Imaging Library. +# $Id$ +# +# a Windows DIB display interface +# +# History: +# 1996-05-20 fl Created +# 1996-09-20 fl Fixed subregion exposure +# 1997-09-21 fl Added draw primitive (for tzPrint) +# 2003-05-21 fl Added experimental Window/ImageWindow classes +# 2003-09-05 fl Added fromstring/tostring methods +# +# Copyright (c) Secret Labs AB 1997-2003. +# Copyright (c) Fredrik Lundh 1996-2003. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image + + +class HDC: + """ + Wraps an HDC integer. The resulting object can be passed to the + :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` + methods. + """ + + def __init__(self, dc: int) -> None: + self.dc = dc + + def __int__(self) -> int: + return self.dc + + +class HWND: + """ + Wraps an HWND integer. The resulting object can be passed to the + :py:meth:`~PIL.ImageWin.Dib.draw` and :py:meth:`~PIL.ImageWin.Dib.expose` + methods, instead of a DC. + """ + + def __init__(self, wnd: int) -> None: + self.wnd = wnd + + def __int__(self) -> int: + return self.wnd + + +class Dib: + """ + A Windows bitmap with the given mode and size. The mode can be one of "1", + "L", "P", or "RGB". + + If the display requires a palette, this constructor creates a suitable + palette and associates it with the image. For an "L" image, 128 graylevels + are allocated. For an "RGB" image, a 6x6x6 colour cube is used, together + with 20 graylevels. + + To make sure that palettes work properly under Windows, you must call the + ``palette`` method upon certain events from Windows. + + :param image: Either a PIL image, or a mode string. If a mode string is + used, a size must also be given. The mode can be one of "1", + "L", "P", or "RGB". + :param size: If the first argument is a mode string, this + defines the size of the image. + """ + + def __init__( + self, image: Image.Image | str, size: tuple[int, int] | None = None + ) -> None: + if isinstance(image, str): + mode = image + image = "" + if size is None: + msg = "If first argument is mode, size is required" + raise ValueError(msg) + else: + mode = image.mode + size = image.size + if mode not in ["1", "L", "P", "RGB"]: + mode = Image.getmodebase(mode) + self.image = Image.core.display(mode, size) + self.mode = mode + self.size = size + if image: + assert not isinstance(image, str) + self.paste(image) + + def expose(self, handle: int | HDC | HWND) -> None: + """ + Copy the bitmap contents to a device context. + + :param handle: Device context (HDC), cast to a Python integer, or an + HDC or HWND instance. In PythonWin, you can use + ``CDC.GetHandleAttrib()`` to get a suitable handle. + """ + handle_int = int(handle) + if isinstance(handle, HWND): + dc = self.image.getdc(handle_int) + try: + self.image.expose(dc) + finally: + self.image.releasedc(handle_int, dc) + else: + self.image.expose(handle_int) + + def draw( + self, + handle: int | HDC | HWND, + dst: tuple[int, int, int, int], + src: tuple[int, int, int, int] | None = None, + ) -> None: + """ + Same as expose, but allows you to specify where to draw the image, and + what part of it to draw. + + The destination and source areas are given as 4-tuple rectangles. If + the source is omitted, the entire image is copied. If the source and + the destination have different sizes, the image is resized as + necessary. + """ + if src is None: + src = (0, 0) + self.size + handle_int = int(handle) + if isinstance(handle, HWND): + dc = self.image.getdc(handle_int) + try: + self.image.draw(dc, dst, src) + finally: + self.image.releasedc(handle_int, dc) + else: + self.image.draw(handle_int, dst, src) + + def query_palette(self, handle: int | HDC | HWND) -> int: + """ + Installs the palette associated with the image in the given device + context. + + This method should be called upon **QUERYNEWPALETTE** and + **PALETTECHANGED** events from Windows. If this method returns a + non-zero value, one or more display palette entries were changed, and + the image should be redrawn. + + :param handle: Device context (HDC), cast to a Python integer, or an + HDC or HWND instance. + :return: The number of entries that were changed (if one or more entries, + this indicates that the image should be redrawn). + """ + handle_int = int(handle) + if isinstance(handle, HWND): + handle = self.image.getdc(handle_int) + try: + result = self.image.query_palette(handle) + finally: + self.image.releasedc(handle, handle) + else: + result = self.image.query_palette(handle_int) + return result + + def paste( + self, im: Image.Image, box: tuple[int, int, int, int] | None = None + ) -> None: + """ + Paste a PIL image into the bitmap image. + + :param im: A PIL image. The size must match the target region. + If the mode does not match, the image is converted to the + mode of the bitmap image. + :param box: A 4-tuple defining the left, upper, right, and + lower pixel coordinate. See :ref:`coordinate-system`. If + None is given instead of a tuple, all of the image is + assumed. + """ + im.load() + if self.mode != im.mode: + im = im.convert(self.mode) + if box: + self.image.paste(im.im, box) + else: + self.image.paste(im.im) + + def frombytes(self, buffer: bytes) -> None: + """ + Load display memory contents from byte data. + + :param buffer: A buffer containing display data (usually + data returned from :py:func:`~PIL.ImageWin.Dib.tobytes`) + """ + self.image.frombytes(buffer) + + def tobytes(self) -> bytes: + """ + Copy display memory contents to bytes object. + + :return: A bytes object containing display data. + """ + return self.image.tobytes() + + +class Window: + """Create a Window with the given title size.""" + + def __init__( + self, title: str = "PIL", width: int | None = None, height: int | None = None + ) -> None: + self.hwnd = Image.core.createwindow( + title, self.__dispatcher, width or 0, height or 0 + ) + + def __dispatcher(self, action: str, *args: int) -> None: + getattr(self, f"ui_handle_{action}")(*args) + + def ui_handle_clear(self, dc: int, x0: int, y0: int, x1: int, y1: int) -> None: + pass + + def ui_handle_damage(self, x0: int, y0: int, x1: int, y1: int) -> None: + pass + + def ui_handle_destroy(self) -> None: + pass + + def ui_handle_repair(self, dc: int, x0: int, y0: int, x1: int, y1: int) -> None: + pass + + def ui_handle_resize(self, width: int, height: int) -> None: + pass + + def mainloop(self) -> None: + Image.core.eventloop() + + +class ImageWindow(Window): + """Create an image window which displays the given image.""" + + def __init__(self, image: Image.Image | Dib, title: str = "PIL") -> None: + if not isinstance(image, Dib): + image = Dib(image) + self.image = image + width, height = image.size + super().__init__(title, width=width, height=height) + + def ui_handle_repair(self, dc: int, x0: int, y0: int, x1: int, y1: int) -> None: + self.image.draw(dc, (x0, y0, x1, y1)) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImtImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImtImagePlugin.py new file mode 100644 index 000000000..c4eccee34 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/ImtImagePlugin.py @@ -0,0 +1,103 @@ +# +# The Python Imaging Library. +# $Id$ +# +# IM Tools support for PIL +# +# history: +# 1996-05-27 fl Created (read 8-bit images only) +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.2) +# +# Copyright (c) Secret Labs AB 1997-2001. +# Copyright (c) Fredrik Lundh 1996-2001. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import re + +from . import Image, ImageFile + +# +# -------------------------------------------------------------------- + +field = re.compile(rb"([a-z]*) ([^ \r\n]*)") + + +## +# Image plugin for IM Tools images. + + +class ImtImageFile(ImageFile.ImageFile): + format = "IMT" + format_description = "IM Tools" + + def _open(self) -> None: + # Quick rejection: if there's not a LF among the first + # 100 bytes, this is (probably) not a text header. + + assert self.fp is not None + + buffer = self.fp.read(100) + if b"\n" not in buffer: + msg = "not an IM file" + raise SyntaxError(msg) + + xsize = ysize = 0 + + while True: + if buffer: + s = buffer[:1] + buffer = buffer[1:] + else: + s = self.fp.read(1) + if not s: + break + + if s == b"\x0c": + # image data begins + self.tile = [ + ImageFile._Tile( + "raw", + (0, 0) + self.size, + self.fp.tell() - len(buffer), + self.mode, + ) + ] + + break + + else: + # read key/value pair + if b"\n" not in buffer: + buffer += self.fp.read(100) + lines = buffer.split(b"\n") + s += lines.pop(0) + buffer = b"\n".join(lines) + if len(s) == 1 or len(s) > 100: + break + if s[0] == ord(b"*"): + continue # comment + + m = field.match(s) + if not m: + break + k, v = m.group(1, 2) + if k == b"width": + xsize = int(v) + self._size = xsize, ysize + elif k == b"height": + ysize = int(v) + self._size = xsize, ysize + elif k == b"pixel" and v == b"n8": + self._mode = "L" + + +# +# -------------------------------------------------------------------- + +Image.register_open(ImtImageFile.format, ImtImageFile) + +# +# no extension registered (".im" is simply too common) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/IptcImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/IptcImagePlugin.py new file mode 100644 index 000000000..9c8be8b4e --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/IptcImagePlugin.py @@ -0,0 +1,226 @@ +# +# The Python Imaging Library. +# $Id$ +# +# IPTC/NAA file handling +# +# history: +# 1995-10-01 fl Created +# 1998-03-09 fl Cleaned up and added to PIL +# 2002-06-18 fl Added getiptcinfo helper +# +# Copyright (c) Secret Labs AB 1997-2002. +# Copyright (c) Fredrik Lundh 1995. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from io import BytesIO +from typing import cast + +from . import Image, ImageFile +from ._binary import i16be as i16 +from ._binary import i32be as i32 + +COMPRESSION = {1: "raw", 5: "jpeg"} + + +# +# Helpers + + +def _i(c: bytes) -> int: + return i32((b"\0\0\0\0" + c)[-4:]) + + +## +# Image plugin for IPTC/NAA datastreams. To read IPTC/NAA fields +# from TIFF and JPEG files, use the getiptcinfo function. + + +class IptcImageFile(ImageFile.ImageFile): + format = "IPTC" + format_description = "IPTC/NAA" + + def getint(self, key: tuple[int, int]) -> int: + return _i(self.info[key]) + + def field(self) -> tuple[tuple[int, int] | None, int]: + # + # get a IPTC field header + assert self.fp is not None + s = self.fp.read(5) + if not s.strip(b"\x00"): + return None, 0 + + tag = s[1], s[2] + + # syntax + if s[0] != 0x1C or tag[0] not in [1, 2, 3, 4, 5, 6, 7, 8, 9, 240]: + msg = "invalid IPTC/NAA file" + raise SyntaxError(msg) + + # field size + size = s[3] + if size > 132: + msg = "illegal field length in IPTC/NAA file" + raise OSError(msg) + elif size == 128: + size = 0 + elif size > 128: + size = _i(self.fp.read(size - 128)) + else: + size = i16(s, 3) + + return tag, size + + def _open(self) -> None: + # load descriptive fields + assert self.fp is not None + while True: + offset = self.fp.tell() + tag, size = self.field() + if not tag or tag == (8, 10): + break + if size: + tagdata = self.fp.read(size) + else: + tagdata = None + if tag in self.info: + if isinstance(self.info[tag], list): + self.info[tag].append(tagdata) + else: + self.info[tag] = [self.info[tag], tagdata] + else: + self.info[tag] = tagdata + + # mode + layers = self.info[(3, 60)][0] + component = self.info[(3, 60)][1] + if layers == 1 and not component: + self._mode = "L" + band = None + else: + if layers == 3 and component: + self._mode = "RGB" + elif layers == 4 and component: + self._mode = "CMYK" + if (3, 65) in self.info: + band = self.info[(3, 65)][0] - 1 + else: + band = 0 + + # size + self._size = self.getint((3, 20)), self.getint((3, 30)) + + # compression + try: + compression = COMPRESSION[self.getint((3, 120))] + except KeyError as e: + msg = "Unknown IPTC image compression" + raise OSError(msg) from e + + # tile + if tag == (8, 10): + self.tile = [ + ImageFile._Tile("iptc", (0, 0) + self.size, offset, (compression, band)) + ] + + def load(self) -> Image.core.PixelAccess | None: + if self.tile: + args = self.tile[0].args + assert isinstance(args, tuple) + compression, band = args + + assert self.fp is not None + self.fp.seek(self.tile[0].offset) + + # Copy image data to temporary file + o = BytesIO() + if compression == "raw": + # To simplify access to the extracted file, + # prepend a PPM header + o.write(b"P5\n%d %d\n255\n" % self.size) + while True: + type, size = self.field() + if type != (8, 10): + break + while size > 0: + s = self.fp.read(min(size, 8192)) + if not s: + break + o.write(s) + size -= len(s) + + with Image.open(o) as _im: + if band is not None: + bands = [Image.new("L", _im.size)] * Image.getmodebands(self.mode) + bands[band] = _im + im = Image.merge(self.mode, bands) + else: + im = _im + im.load() + self.im = im.im + self.tile = [] + return ImageFile.ImageFile.load(self) + + +Image.register_open(IptcImageFile.format, IptcImageFile) + +Image.register_extension(IptcImageFile.format, ".iim") + + +def getiptcinfo( + im: ImageFile.ImageFile, +) -> dict[tuple[int, int], bytes | list[bytes]] | None: + """ + Get IPTC information from TIFF, JPEG, or IPTC file. + + :param im: An image containing IPTC data. + :returns: A dictionary containing IPTC information, or None if + no IPTC information block was found. + """ + from . import JpegImagePlugin, TiffImagePlugin + + data = None + + if isinstance(im, IptcImageFile): + # return info dictionary right away + return {k: v for k, v in im.info.items() if isinstance(k, tuple)} + + elif isinstance(im, JpegImagePlugin.JpegImageFile): + # extract the IPTC/NAA resource + photoshop = im.info.get("photoshop") + if photoshop: + data = photoshop.get(0x0404) + + elif isinstance(im, TiffImagePlugin.TiffImageFile): + # get raw data from the IPTC/NAA tag (PhotoShop tags the data + # as 4-byte integers, so we cannot use the get method...) + try: + data = im.tag_v2._tagdata[TiffImagePlugin.IPTC_NAA_CHUNK] + except KeyError: + pass + + if data is None: + return None # no properties + + # create an IptcImagePlugin object without initializing it + class FakeImage: + pass + + fake_im = FakeImage() + fake_im.__class__ = IptcImageFile # type: ignore[assignment] + iptc_im = cast(IptcImageFile, fake_im) + + # parse the IPTC information chunk + iptc_im.info = {} + iptc_im.fp = BytesIO(data) + + try: + iptc_im._open() + except (IndexError, KeyError): + pass # expected failure + + return {k: v for k, v in iptc_im.info.items() if isinstance(k, tuple)} diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py new file mode 100644 index 000000000..cb3773530 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/Jpeg2KImagePlugin.py @@ -0,0 +1,460 @@ +# +# The Python Imaging Library +# $Id$ +# +# JPEG2000 file handling +# +# History: +# 2014-03-12 ajh Created +# 2021-06-30 rogermb Extract dpi information from the 'resc' header box +# +# Copyright (c) 2014 Coriolis Systems Limited +# Copyright (c) 2014 Alastair Houghton +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +import os +import struct +from typing import cast + +from . import Image, ImageFile, ImagePalette, _binary + +TYPE_CHECKING = False +if TYPE_CHECKING: + from collections.abc import Callable + from typing import IO + + +class BoxReader: + """ + A small helper class to read fields stored in JPEG2000 header boxes + and to easily step into and read sub-boxes. + """ + + def __init__(self, fp: IO[bytes], length: int = -1) -> None: + self.fp = fp + self.has_length = length >= 0 + self.length = length + self.remaining_in_box = -1 + + def _can_read(self, num_bytes: int) -> bool: + if self.has_length and self.fp.tell() + num_bytes > self.length: + # Outside box: ensure we don't read past the known file length + return False + if self.remaining_in_box >= 0: + # Inside box contents: ensure read does not go past box boundaries + return num_bytes <= self.remaining_in_box + else: + return True # No length known, just read + + def _read_bytes(self, num_bytes: int) -> bytes: + if not self._can_read(num_bytes): + msg = "Not enough data in header" + raise SyntaxError(msg) + + data = self.fp.read(num_bytes) + if len(data) < num_bytes: + msg = f"Expected to read {num_bytes} bytes but only got {len(data)}." + raise OSError(msg) + + if self.remaining_in_box > 0: + self.remaining_in_box -= num_bytes + return data + + def read_fields(self, field_format: str) -> tuple[int | bytes, ...]: + size = struct.calcsize(field_format) + data = self._read_bytes(size) + return struct.unpack(field_format, data) + + def read_boxes(self) -> BoxReader: + size = self.remaining_in_box + data = self._read_bytes(size) + return BoxReader(io.BytesIO(data), size) + + def has_next_box(self) -> bool: + if self.has_length: + return self.fp.tell() + self.remaining_in_box < self.length + else: + return True + + def next_box_type(self) -> bytes: + # Skip the rest of the box if it has not been read + if self.remaining_in_box > 0: + self.fp.seek(self.remaining_in_box, os.SEEK_CUR) + self.remaining_in_box = -1 + + # Read the length and type of the next box + lbox, tbox = cast(tuple[int, bytes], self.read_fields(">I4s")) + if lbox == 1: + lbox = cast(int, self.read_fields(">Q")[0]) + hlen = 16 + else: + hlen = 8 + + if lbox < hlen or not self._can_read(lbox - hlen): + msg = "Invalid header length" + raise SyntaxError(msg) + + self.remaining_in_box = lbox - hlen + return tbox + + +def _parse_codestream(fp: IO[bytes]) -> tuple[tuple[int, int], str]: + """Parse the JPEG 2000 codestream to extract the size and component + count from the SIZ marker segment, returning a PIL (size, mode) tuple.""" + + hdr = fp.read(2) + lsiz = _binary.i16be(hdr) + siz = hdr + fp.read(lsiz - 2) + lsiz, rsiz, xsiz, ysiz, xosiz, yosiz, _, _, _, _, csiz = struct.unpack_from( + ">HHIIIIIIIIH", siz + ) + + size = (xsiz - xosiz, ysiz - yosiz) + if csiz == 1: + ssiz = struct.unpack_from(">B", siz, 38) + if (ssiz[0] & 0x7F) + 1 > 8: + mode = "I;16" + else: + mode = "L" + elif csiz == 2: + mode = "LA" + elif csiz == 3: + mode = "RGB" + elif csiz == 4: + mode = "RGBA" + else: + msg = "unable to determine J2K image mode" + raise SyntaxError(msg) + + return size, mode + + +def _res_to_dpi(num: int, denom: int, exp: int) -> float | None: + """Convert JPEG2000's (numerator, denominator, exponent-base-10) resolution, + calculated as (num / denom) * 10^exp and stored in dots per meter, + to floating-point dots per inch.""" + if denom == 0: + return None + return (254 * num * (10**exp)) / (10000 * denom) + + +def _parse_jp2_header( + fp: IO[bytes], +) -> tuple[ + tuple[int, int], + str, + str | None, + tuple[float, float] | None, + ImagePalette.ImagePalette | None, +]: + """Parse the JP2 header box to extract size, component count, + color space information, and optionally DPI information, + returning a (size, mode, mimetype, dpi) tuple.""" + + # Find the JP2 header box + reader = BoxReader(fp) + header = None + mimetype = None + while reader.has_next_box(): + tbox = reader.next_box_type() + + if tbox == b"jp2h": + header = reader.read_boxes() + break + elif tbox == b"ftyp": + if reader.read_fields(">4s")[0] == b"jpx ": + mimetype = "image/jpx" + assert header is not None + + size = None + mode = None + bpc = None + nc = None + dpi = None # 2-tuple of DPI info, or None + palette = None + colr = None + + while header.has_next_box(): + tbox = header.next_box_type() + + if tbox == b"ihdr": + height, width, nc, bpc = header.read_fields(">IIHB") + assert isinstance(height, int) + assert isinstance(width, int) + assert isinstance(bpc, int) + size = (width, height) + if nc == 1 and (bpc & 0x7F) > 8: + mode = "I;16" + elif nc == 1: + mode = "L" + elif nc == 2: + mode = "LA" + elif nc == 3: + mode = "RGB" + elif nc == 4: + mode = "RGBA" + elif tbox == b"colr": + meth, _, _, enumcs = header.read_fields(">BBBI") + if meth == 1: + if enumcs in (0, 15): + colr = "1" + elif enumcs == 12: + colr = "CMYK" + if nc == 4: + mode = "CMYK" + elif enumcs == 17: + colr = "L" + elif tbox == b"pclr" and mode in ("L", "LA") and colr not in ("1", "L"): + ne, npc = header.read_fields(">HB") + assert isinstance(ne, int) + assert isinstance(npc, int) + max_bitdepth = 0 + for bitdepth in header.read_fields(">" + ("B" * npc)): + assert isinstance(bitdepth, int) + if bitdepth > max_bitdepth: + max_bitdepth = bitdepth + if max_bitdepth <= 8: + if npc == 4: + palette_mode = "CMYK" if colr == "CMYK" else "RGBA" + else: + palette_mode = "RGB" + palette = ImagePalette.ImagePalette(palette_mode) + for i in range(ne): + color: list[int] = [] + for value in header.read_fields(">" + ("B" * npc)): + assert isinstance(value, int) + color.append(value) + palette.getcolor(tuple(color)) + mode = "P" if mode == "L" else "PA" + elif tbox == b"res ": + res = header.read_boxes() + while res.has_next_box(): + tres = res.next_box_type() + if tres == b"resc": + vrcn, vrcd, hrcn, hrcd, vrce, hrce = res.read_fields(">HHHHBB") + assert isinstance(vrcn, int) + assert isinstance(vrcd, int) + assert isinstance(hrcn, int) + assert isinstance(hrcd, int) + assert isinstance(vrce, int) + assert isinstance(hrce, int) + hres = _res_to_dpi(hrcn, hrcd, hrce) + vres = _res_to_dpi(vrcn, vrcd, vrce) + if hres is not None and vres is not None: + dpi = (hres, vres) + break + + if size is None or mode is None: + msg = "Malformed JP2 header" + raise SyntaxError(msg) + + return size, mode, mimetype, dpi, palette + + +## +# Image plugin for JPEG2000 images. + + +class Jpeg2KImageFile(ImageFile.ImageFile): + format = "JPEG2000" + format_description = "JPEG 2000 (ISO 15444)" + + def _open(self) -> None: + assert self.fp is not None + sig = self.fp.read(4) + if sig == b"\xff\x4f\xff\x51": + self.codec = "j2k" + self._size, self._mode = _parse_codestream(self.fp) + self._parse_comment() + else: + sig = sig + self.fp.read(8) + + if sig == b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a": + self.codec = "jp2" + header = _parse_jp2_header(self.fp) + self._size, self._mode, self.custom_mimetype, dpi, self.palette = header + if dpi is not None: + self.info["dpi"] = dpi + if self.fp.read(12).endswith(b"jp2c\xff\x4f\xff\x51"): + hdr = self.fp.read(2) + length = _binary.i16be(hdr) + self.fp.seek(length - 2, os.SEEK_CUR) + self._parse_comment() + else: + msg = "not a JPEG 2000 file" + raise SyntaxError(msg) + + self._reduce = 0 + self.layers = 0 + + fd = -1 + length = -1 + + try: + fd = self.fp.fileno() + length = os.fstat(fd).st_size + except Exception: + fd = -1 + try: + pos = self.fp.tell() + self.fp.seek(0, io.SEEK_END) + length = self.fp.tell() + self.fp.seek(pos) + except Exception: + length = -1 + + self.tile = [ + ImageFile._Tile( + "jpeg2k", + (0, 0) + self.size, + 0, + (self.codec, self._reduce, self.layers, fd, length), + ) + ] + + def _parse_comment(self) -> None: + assert self.fp is not None + while True: + marker = self.fp.read(2) + if not marker: + break + typ = marker[1] + if typ in (0x90, 0xD9): + # Start of tile or end of codestream + break + hdr = self.fp.read(2) + length = _binary.i16be(hdr) + if typ == 0x64: + # Comment + self.info["comment"] = self.fp.read(length - 2)[2:] + break + else: + self.fp.seek(length - 2, os.SEEK_CUR) + + @property # type: ignore[override] + def reduce( + self, + ) -> ( + Callable[[int | tuple[int, int], tuple[int, int, int, int] | None], Image.Image] + | int + ): + # https://github.com/python-pillow/Pillow/issues/4343 found that the + # new Image 'reduce' method was shadowed by this plugin's 'reduce' + # property. This attempts to allow for both scenarios + return self._reduce or super().reduce + + @reduce.setter + def reduce(self, value: int) -> None: + self._reduce = value + + def load(self) -> Image.core.PixelAccess | None: + if self.tile and self._reduce: + power = 1 << self._reduce + adjust = power >> 1 + self._size = ( + int((self.size[0] + adjust) / power), + int((self.size[1] + adjust) / power), + ) + + # Update the reduce and layers settings + t = self.tile[0] + assert isinstance(t[3], tuple) + t3 = (t[3][0], self._reduce, self.layers, t[3][3], t[3][4]) + self.tile = [ImageFile._Tile(t[0], (0, 0) + self.size, t[2], t3)] + + return ImageFile.ImageFile.load(self) + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith( + (b"\xff\x4f\xff\x51", b"\x00\x00\x00\x0cjP \x0d\x0a\x87\x0a") + ) + + +# ------------------------------------------------------------ +# Save support + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + # Get the keyword arguments + info = im.encoderinfo + + if isinstance(filename, str): + filename = filename.encode() + if filename.endswith(b".j2k") or info.get("no_jp2", False): + kind = "j2k" + else: + kind = "jp2" + + offset = info.get("offset", None) + tile_offset = info.get("tile_offset", None) + tile_size = info.get("tile_size", None) + quality_mode = info.get("quality_mode", "rates") + quality_layers = info.get("quality_layers", None) + if quality_layers is not None and not ( + isinstance(quality_layers, (list, tuple)) + and all( + isinstance(quality_layer, (int, float)) for quality_layer in quality_layers + ) + ): + msg = "quality_layers must be a sequence of numbers" + raise ValueError(msg) + + num_resolutions = info.get("num_resolutions", 0) + cblk_size = info.get("codeblock_size", None) + precinct_size = info.get("precinct_size", None) + irreversible = info.get("irreversible", False) + progression = info.get("progression", "LRCP") + cinema_mode = info.get("cinema_mode", "no") + mct = info.get("mct", 0) + signed = info.get("signed", False) + comment = info.get("comment") + if isinstance(comment, str): + comment = comment.encode() + plt = info.get("plt", False) + + fd = -1 + if hasattr(fp, "fileno"): + try: + fd = fp.fileno() + except Exception: + fd = -1 + + im.encoderconfig = ( + offset, + tile_offset, + tile_size, + quality_mode, + quality_layers, + num_resolutions, + cblk_size, + precinct_size, + irreversible, + progression, + cinema_mode, + mct, + signed, + fd, + comment, + plt, + ) + + ImageFile._save(im, fp, [ImageFile._Tile("jpeg2k", (0, 0) + im.size, 0, kind)]) + + +# ------------------------------------------------------------ +# Registry stuff + + +Image.register_open(Jpeg2KImageFile.format, Jpeg2KImageFile, _accept) +Image.register_save(Jpeg2KImageFile.format, _save) + +Image.register_extensions( + Jpeg2KImageFile.format, [".jp2", ".j2k", ".jpc", ".jpf", ".jpx", ".j2c"] +) + +Image.register_mime(Jpeg2KImageFile.format, "image/jp2") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py new file mode 100644 index 000000000..46320eb3b --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/JpegImagePlugin.py @@ -0,0 +1,889 @@ +# +# The Python Imaging Library. +# $Id$ +# +# JPEG (JFIF) file handling +# +# See "Digital Compression and Coding of Continuous-Tone Still Images, +# Part 1, Requirements and Guidelines" (CCITT T.81 / ISO 10918-1) +# +# History: +# 1995-09-09 fl Created +# 1995-09-13 fl Added full parser +# 1996-03-25 fl Added hack to use the IJG command line utilities +# 1996-05-05 fl Workaround Photoshop 2.5 CMYK polarity bug +# 1996-05-28 fl Added draft support, JFIF version (0.1) +# 1996-12-30 fl Added encoder options, added progression property (0.2) +# 1997-08-27 fl Save mode 1 images as BW (0.3) +# 1998-07-12 fl Added YCbCr to draft and save methods (0.4) +# 1998-10-19 fl Don't hang on files using 16-bit DQT's (0.4.1) +# 2001-04-16 fl Extract DPI settings from JFIF files (0.4.2) +# 2002-07-01 fl Skip pad bytes before markers; identify Exif files (0.4.3) +# 2003-04-25 fl Added experimental EXIF decoder (0.5) +# 2003-06-06 fl Added experimental EXIF GPSinfo decoder +# 2003-09-13 fl Extract COM markers +# 2009-09-06 fl Added icc_profile support (from Florian Hoech) +# 2009-03-06 fl Changed CMYK handling; always use Adobe polarity (0.6) +# 2009-03-08 fl Added subsampling support (from Justin Huff). +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-1996 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import array +import io +import math +import os +import struct +import subprocess +import sys +import tempfile +import warnings + +from . import Image, ImageFile +from ._binary import i16be as i16 +from ._binary import i32be as i32 +from ._binary import o8 +from ._binary import o16be as o16 +from .JpegPresets import presets + +TYPE_CHECKING = False +if TYPE_CHECKING: + from typing import IO, Any + + from .MpoImagePlugin import MpoImageFile + +# +# Parser + + +def Skip(self: JpegImageFile, marker: int) -> None: + assert self.fp is not None + n = i16(self.fp.read(2)) - 2 + ImageFile._safe_read(self.fp, n) + + +def APP(self: JpegImageFile, marker: int) -> None: + # + # Application marker. Store these in the APP dictionary. + # Also look for well-known application markers. + + assert self.fp is not None + n = i16(self.fp.read(2)) - 2 + s = ImageFile._safe_read(self.fp, n) + + app = f"APP{marker & 15}" + + self.app[app] = s # compatibility + self.applist.append((app, s)) + + if marker == 0xFFE0 and s.startswith(b"JFIF"): + # extract JFIF information + self.info["jfif"] = version = i16(s, 5) # version + self.info["jfif_version"] = divmod(version, 256) + # extract JFIF properties + try: + jfif_unit = s[7] + jfif_density = i16(s, 8), i16(s, 10) + except Exception: + pass + else: + if jfif_unit == 1: + self.info["dpi"] = jfif_density + elif jfif_unit == 2: # cm + # 1 dpcm = 2.54 dpi + self.info["dpi"] = tuple(d * 2.54 for d in jfif_density) + self.info["jfif_unit"] = jfif_unit + self.info["jfif_density"] = jfif_density + elif marker == 0xFFE1 and s.startswith(b"Exif\0\0"): + # extract EXIF information + if "exif" in self.info: + self.info["exif"] += s[6:] + else: + self.info["exif"] = s + self._exif_offset = self.fp.tell() - n + 6 + elif marker == 0xFFE1 and s.startswith(b"http://ns.adobe.com/xap/1.0/\x00"): + self.info["xmp"] = s.split(b"\x00", 1)[1] + elif marker == 0xFFE2 and s.startswith(b"FPXR\0"): + # extract FlashPix information (incomplete) + self.info["flashpix"] = s # FIXME: value will change + elif marker == 0xFFE2 and s.startswith(b"ICC_PROFILE\0"): + # Since an ICC profile can be larger than the maximum size of + # a JPEG marker (64K), we need provisions to split it into + # multiple markers. The format defined by the ICC specifies + # one or more APP2 markers containing the following data: + # Identifying string ASCII "ICC_PROFILE\0" (12 bytes) + # Marker sequence number 1, 2, etc (1 byte) + # Number of markers Total of APP2's used (1 byte) + # Profile data (remainder of APP2 data) + # Decoders should use the marker sequence numbers to + # reassemble the profile, rather than assuming that the APP2 + # markers appear in the correct sequence. + self.icclist.append(s) + elif marker == 0xFFED and s.startswith(b"Photoshop 3.0\x00"): + # parse the image resource block + offset = 14 + photoshop = self.info.setdefault("photoshop", {}) + try: + while s[offset : offset + 4] == b"8BIM": + offset += 4 + # resource code + code = i16(s, offset) + offset += 2 + # resource name (usually empty) + name_len = s[offset] + # name = s[offset+1:offset+1+name_len] + offset += 1 + name_len + offset += offset & 1 # align + # resource data block + size = i32(s, offset) + offset += 4 + data = s[offset : offset + size] + if code == 0x03ED: # ResolutionInfo + photoshop[code] = { + "XResolution": i32(data, 0) / 65536, + "DisplayedUnitsX": i16(data, 4), + "YResolution": i32(data, 8) / 65536, + "DisplayedUnitsY": i16(data, 12), + } + else: + photoshop[code] = data + offset += size + offset += offset & 1 # align + except struct.error: + pass # insufficient data + + elif marker == 0xFFEE and s.startswith(b"Adobe"): + self.info["adobe"] = i16(s, 5) + # extract Adobe custom properties + try: + adobe_transform = s[11] + except IndexError: + pass + else: + self.info["adobe_transform"] = adobe_transform + elif marker == 0xFFE2 and s.startswith(b"MPF\0"): + # extract MPO information + self.info["mp"] = s[4:] + # offset is current location minus buffer size + # plus constant header size + self.info["mpoffset"] = self.fp.tell() - n + 4 + + +def COM(self: JpegImageFile, marker: int) -> None: + # + # Comment marker. Store these in the APP dictionary. + assert self.fp is not None + n = i16(self.fp.read(2)) - 2 + s = ImageFile._safe_read(self.fp, n) + + self.info["comment"] = s + self.app["COM"] = s # compatibility + self.applist.append(("COM", s)) + + +def SOF(self: JpegImageFile, marker: int) -> None: + # + # Start of frame marker. Defines the size and mode of the + # image. JPEG is colour blind, so we use some simple + # heuristics to map the number of layers to an appropriate + # mode. Note that this could be made a bit brighter, by + # looking for JFIF and Adobe APP markers. + + assert self.fp is not None + n = i16(self.fp.read(2)) - 2 + s = ImageFile._safe_read(self.fp, n) + self._size = i16(s, 3), i16(s, 1) + if self._im is not None and self.size != self.im.size: + self._im = None + + self.bits = s[0] + if self.bits != 8: + msg = f"cannot handle {self.bits}-bit layers" + raise SyntaxError(msg) + + self.layers = s[5] + if self.layers == 1: + self._mode = "L" + elif self.layers == 3: + self._mode = "RGB" + elif self.layers == 4: + self._mode = "CMYK" + else: + msg = f"cannot handle {self.layers}-layer images" + raise SyntaxError(msg) + + if marker in [0xFFC2, 0xFFC6, 0xFFCA, 0xFFCE]: + self.info["progressive"] = self.info["progression"] = 1 + + if self.icclist: + # fixup icc profile + self.icclist.sort() # sort by sequence number + if self.icclist[0][13] == len(self.icclist): + profile = [p[14:] for p in self.icclist] + icc_profile = b"".join(profile) + else: + icc_profile = None # wrong number of fragments + self.info["icc_profile"] = icc_profile + self.icclist = [] + + for i in range(6, len(s), 3): + t = s[i : i + 3] + # 4-tuples: id, vsamp, hsamp, qtable + self.layer.append((t[0], t[1] // 16, t[1] & 15, t[2])) + + +def DQT(self: JpegImageFile, marker: int) -> None: + # + # Define quantization table. Note that there might be more + # than one table in each marker. + + # FIXME: The quantization tables can be used to estimate the + # compression quality. + + assert self.fp is not None + n = i16(self.fp.read(2)) - 2 + s = ImageFile._safe_read(self.fp, n) + while len(s): + v = s[0] + precision = 1 if (v // 16 == 0) else 2 # in bytes + qt_length = 1 + precision * 64 + if len(s) < qt_length: + msg = "bad quantization table marker" + raise SyntaxError(msg) + data = array.array("B" if precision == 1 else "H", s[1:qt_length]) + if sys.byteorder == "little" and precision > 1: + data.byteswap() # the values are always big-endian + self.quantization[v & 15] = [data[i] for i in zigzag_index] + s = s[qt_length:] + + +# +# JPEG marker table + +MARKER = { + 0xFFC0: ("SOF0", "Baseline DCT", SOF), + 0xFFC1: ("SOF1", "Extended Sequential DCT", SOF), + 0xFFC2: ("SOF2", "Progressive DCT", SOF), + 0xFFC3: ("SOF3", "Spatial lossless", SOF), + 0xFFC4: ("DHT", "Define Huffman table", Skip), + 0xFFC5: ("SOF5", "Differential sequential DCT", SOF), + 0xFFC6: ("SOF6", "Differential progressive DCT", SOF), + 0xFFC7: ("SOF7", "Differential spatial", SOF), + 0xFFC8: ("JPG", "Extension", None), + 0xFFC9: ("SOF9", "Extended sequential DCT (AC)", SOF), + 0xFFCA: ("SOF10", "Progressive DCT (AC)", SOF), + 0xFFCB: ("SOF11", "Spatial lossless DCT (AC)", SOF), + 0xFFCC: ("DAC", "Define arithmetic coding conditioning", Skip), + 0xFFCD: ("SOF13", "Differential sequential DCT (AC)", SOF), + 0xFFCE: ("SOF14", "Differential progressive DCT (AC)", SOF), + 0xFFCF: ("SOF15", "Differential spatial (AC)", SOF), + 0xFFD0: ("RST0", "Restart 0", None), + 0xFFD1: ("RST1", "Restart 1", None), + 0xFFD2: ("RST2", "Restart 2", None), + 0xFFD3: ("RST3", "Restart 3", None), + 0xFFD4: ("RST4", "Restart 4", None), + 0xFFD5: ("RST5", "Restart 5", None), + 0xFFD6: ("RST6", "Restart 6", None), + 0xFFD7: ("RST7", "Restart 7", None), + 0xFFD8: ("SOI", "Start of image", None), + 0xFFD9: ("EOI", "End of image", None), + 0xFFDA: ("SOS", "Start of scan", Skip), + 0xFFDB: ("DQT", "Define quantization table", DQT), + 0xFFDC: ("DNL", "Define number of lines", Skip), + 0xFFDD: ("DRI", "Define restart interval", Skip), + 0xFFDE: ("DHP", "Define hierarchical progression", SOF), + 0xFFDF: ("EXP", "Expand reference component", Skip), + 0xFFE0: ("APP0", "Application segment 0", APP), + 0xFFE1: ("APP1", "Application segment 1", APP), + 0xFFE2: ("APP2", "Application segment 2", APP), + 0xFFE3: ("APP3", "Application segment 3", APP), + 0xFFE4: ("APP4", "Application segment 4", APP), + 0xFFE5: ("APP5", "Application segment 5", APP), + 0xFFE6: ("APP6", "Application segment 6", APP), + 0xFFE7: ("APP7", "Application segment 7", APP), + 0xFFE8: ("APP8", "Application segment 8", APP), + 0xFFE9: ("APP9", "Application segment 9", APP), + 0xFFEA: ("APP10", "Application segment 10", APP), + 0xFFEB: ("APP11", "Application segment 11", APP), + 0xFFEC: ("APP12", "Application segment 12", APP), + 0xFFED: ("APP13", "Application segment 13", APP), + 0xFFEE: ("APP14", "Application segment 14", APP), + 0xFFEF: ("APP15", "Application segment 15", APP), + 0xFFF0: ("JPG0", "Extension 0", None), + 0xFFF1: ("JPG1", "Extension 1", None), + 0xFFF2: ("JPG2", "Extension 2", None), + 0xFFF3: ("JPG3", "Extension 3", None), + 0xFFF4: ("JPG4", "Extension 4", None), + 0xFFF5: ("JPG5", "Extension 5", None), + 0xFFF6: ("JPG6", "Extension 6", None), + 0xFFF7: ("JPG7", "Extension 7", None), + 0xFFF8: ("JPG8", "Extension 8", None), + 0xFFF9: ("JPG9", "Extension 9", None), + 0xFFFA: ("JPG10", "Extension 10", None), + 0xFFFB: ("JPG11", "Extension 11", None), + 0xFFFC: ("JPG12", "Extension 12", None), + 0xFFFD: ("JPG13", "Extension 13", None), + 0xFFFE: ("COM", "Comment", COM), +} + + +def _accept(prefix: bytes) -> bool: + # Magic number was taken from https://en.wikipedia.org/wiki/JPEG + return prefix.startswith(b"\xff\xd8\xff") + + +## +# Image plugin for JPEG and JFIF images. + + +class JpegImageFile(ImageFile.ImageFile): + format = "JPEG" + format_description = "JPEG (ISO 10918)" + + def _open(self) -> None: + assert self.fp is not None + s = self.fp.read(3) + + if not _accept(s): + msg = "not a JPEG file" + raise SyntaxError(msg) + s = b"\xff" + + # Create attributes + self.bits = self.layers = 0 + self._exif_offset = 0 + + # JPEG specifics (internal) + self.layer: list[tuple[int, int, int, int]] = [] + self._huffman_dc: dict[Any, Any] = {} + self._huffman_ac: dict[Any, Any] = {} + self.quantization: dict[int, list[int]] = {} + self.app: dict[str, bytes] = {} # compatibility + self.applist: list[tuple[str, bytes]] = [] + self.icclist: list[bytes] = [] + + while True: + i = s[0] + if i == 0xFF: + s = s + self.fp.read(1) + i = i16(s) + else: + # Skip non-0xFF junk + s = self.fp.read(1) + continue + + if i in MARKER: + name, description, handler = MARKER[i] + if handler is not None: + handler(self, i) + if i == 0xFFDA: # start of scan + rawmode = self.mode + if self.mode == "CMYK": + rawmode = "CMYK;I" # assume adobe conventions + self.tile = [ + ImageFile._Tile("jpeg", (0, 0) + self.size, 0, (rawmode, "")) + ] + # self.__offset = self.fp.tell() + break + s = self.fp.read(1) + elif i in {0, 0xFFFF}: + # padded marker or junk; move on + s = b"\xff" + elif i == 0xFF00: # Skip extraneous data (escaped 0xFF) + s = self.fp.read(1) + else: + msg = "no marker found" + raise SyntaxError(msg) + + self._read_dpi_from_exif() + + def __getstate__(self) -> list[Any]: + return super().__getstate__() + [self.layers, self.layer] + + def __setstate__(self, state: list[Any]) -> None: + self.layers, self.layer = state[6:] + super().__setstate__(state) + + def load_read(self, read_bytes: int) -> bytes: + """ + internal: read more image data + For premature EOF and LOAD_TRUNCATED_IMAGES adds EOI marker + so libjpeg can finish decoding + """ + assert self.fp is not None + s = self.fp.read(read_bytes) + + if not s and ImageFile.LOAD_TRUNCATED_IMAGES and not hasattr(self, "_ended"): + # Premature EOF. + # Pretend file is finished adding EOI marker + self._ended = True + return b"\xff\xd9" + + return s + + def draft( + self, mode: str | None, size: tuple[int, int] | None + ) -> tuple[str, tuple[int, int, float, float]] | None: + if len(self.tile) != 1: + return None + + # Protect from second call + if self.decoderconfig: + return None + + d, e, o, a = self.tile[0] + scale = 1 + original_size = self.size + + assert isinstance(a, tuple) + if a[0] == "RGB" and mode in ["L", "YCbCr"]: + self._mode = mode + a = mode, "" + + if size: + scale = min(self.size[0] // size[0], self.size[1] // size[1]) + for s in [8, 4, 2, 1]: + if scale >= s: + break + assert e is not None + e = ( + e[0], + e[1], + (e[2] - e[0] + s - 1) // s + e[0], + (e[3] - e[1] + s - 1) // s + e[1], + ) + self._size = ((self.size[0] + s - 1) // s, (self.size[1] + s - 1) // s) + scale = s + + self.tile = [ImageFile._Tile(d, e, o, a)] + self.decoderconfig = (scale, 0) + + box = (0, 0, original_size[0] / scale, original_size[1] / scale) + return self.mode, box + + def load_djpeg(self) -> None: + # ALTERNATIVE: handle JPEGs via the IJG command line utilities + + f, path = tempfile.mkstemp() + os.close(f) + if os.path.exists(self.filename): + subprocess.check_call(["djpeg", "-outfile", path, self.filename]) + else: + try: + os.unlink(path) + except OSError: + pass + + msg = "Invalid Filename" + raise ValueError(msg) + + try: + with Image.open(path) as _im: + _im.load() + self.im = _im.im + finally: + try: + os.unlink(path) + except OSError: + pass + + self._mode = self.im.mode + self._size = self.im.size + + self.tile = [] + + def _getexif(self) -> dict[int, Any] | None: + return _getexif(self) + + def _read_dpi_from_exif(self) -> None: + # If DPI isn't in JPEG header, fetch from EXIF + if "dpi" in self.info or "exif" not in self.info: + return + try: + exif = self.getexif() + resolution_unit = exif[0x0128] + x_resolution = exif[0x011A] + try: + dpi = float(x_resolution[0]) / x_resolution[1] + except TypeError: + dpi = x_resolution + if math.isnan(dpi): + msg = "DPI is not a number" + raise ValueError(msg) + if resolution_unit == 3: # cm + # 1 dpcm = 2.54 dpi + dpi *= 2.54 + self.info["dpi"] = dpi, dpi + except ( + struct.error, # truncated EXIF + KeyError, # dpi not included + SyntaxError, # invalid/unreadable EXIF + TypeError, # dpi is an invalid float + ValueError, # dpi is an invalid float + ZeroDivisionError, # invalid dpi rational value + ): + self.info["dpi"] = 72, 72 + + def _getmp(self) -> dict[int, Any] | None: + return _getmp(self) + + +def _getexif(self: JpegImageFile) -> dict[int, Any] | None: + if "exif" not in self.info: + return None + return self.getexif()._get_merged_dict() + + +def _getmp(self: JpegImageFile) -> dict[int, Any] | None: + # Extract MP information. This method was inspired by the "highly + # experimental" _getexif version that's been in use for years now, + # itself based on the ImageFileDirectory class in the TIFF plugin. + + # The MP record essentially consists of a TIFF file embedded in a JPEG + # application marker. + try: + data = self.info["mp"] + except KeyError: + return None + file_contents = io.BytesIO(data) + head = file_contents.read(8) + endianness = ">" if head.startswith(b"\x4d\x4d\x00\x2a") else "<" + # process dictionary + from . import TiffImagePlugin + + try: + info = TiffImagePlugin.ImageFileDirectory_v2(head) + file_contents.seek(info.next) + info.load(file_contents) + mp = dict(info) + except Exception as e: + msg = "malformed MP Index (unreadable directory)" + raise SyntaxError(msg) from e + # it's an error not to have a number of images + try: + quant = mp[0xB001] + except KeyError as e: + msg = "malformed MP Index (no number of images)" + raise SyntaxError(msg) from e + # get MP entries + mpentries = [] + try: + rawmpentries = mp[0xB002] + for entrynum in range(quant): + unpackedentry = struct.unpack_from( + f"{endianness}LLLHH", rawmpentries, entrynum * 16 + ) + labels = ("Attribute", "Size", "DataOffset", "EntryNo1", "EntryNo2") + mpentry = dict(zip(labels, unpackedentry)) + mpentryattr = { + "DependentParentImageFlag": bool(mpentry["Attribute"] & (1 << 31)), + "DependentChildImageFlag": bool(mpentry["Attribute"] & (1 << 30)), + "RepresentativeImageFlag": bool(mpentry["Attribute"] & (1 << 29)), + "Reserved": (mpentry["Attribute"] & (3 << 27)) >> 27, + "ImageDataFormat": (mpentry["Attribute"] & (7 << 24)) >> 24, + "MPType": mpentry["Attribute"] & 0x00FFFFFF, + } + if mpentryattr["ImageDataFormat"] == 0: + mpentryattr["ImageDataFormat"] = "JPEG" + else: + msg = "unsupported picture format in MPO" + raise SyntaxError(msg) + mptypemap = { + 0x000000: "Undefined", + 0x010001: "Large Thumbnail (VGA Equivalent)", + 0x010002: "Large Thumbnail (Full HD Equivalent)", + 0x020001: "Multi-Frame Image (Panorama)", + 0x020002: "Multi-Frame Image: (Disparity)", + 0x020003: "Multi-Frame Image: (Multi-Angle)", + 0x030000: "Baseline MP Primary Image", + } + mpentryattr["MPType"] = mptypemap.get(mpentryattr["MPType"], "Unknown") + mpentry["Attribute"] = mpentryattr + mpentries.append(mpentry) + mp[0xB002] = mpentries + except KeyError as e: + msg = "malformed MP Index (bad MP Entry)" + raise SyntaxError(msg) from e + # Next we should try and parse the individual image unique ID list; + # we don't because I've never seen this actually used in a real MPO + # file and so can't test it. + return mp + + +# -------------------------------------------------------------------- +# stuff to save JPEG files + +RAWMODE = { + "1": "L", + "L": "L", + "RGB": "RGB", + "RGBX": "RGB", + "CMYK": "CMYK;I", # assume adobe conventions + "YCbCr": "YCbCr", +} + +# fmt: off +zigzag_index = ( + 0, 1, 5, 6, 14, 15, 27, 28, + 2, 4, 7, 13, 16, 26, 29, 42, + 3, 8, 12, 17, 25, 30, 41, 43, + 9, 11, 18, 24, 31, 40, 44, 53, + 10, 19, 23, 32, 39, 45, 52, 54, + 20, 22, 33, 38, 46, 51, 55, 60, + 21, 34, 37, 47, 50, 56, 59, 61, + 35, 36, 48, 49, 57, 58, 62, 63, +) + +samplings = { + (1, 1, 1, 1, 1, 1): 0, + (2, 1, 1, 1, 1, 1): 1, + (2, 2, 1, 1, 1, 1): 2, +} +# fmt: on + + +def get_sampling(im: Image.Image) -> int: + # There's no subsampling when images have only 1 layer + # (grayscale images) or when they are CMYK (4 layers), + # so set subsampling to the default value. + # + # NOTE: currently Pillow can't encode JPEG to YCCK format. + # If YCCK support is added in the future, subsampling code will have + # to be updated (here and in JpegEncode.c) to deal with 4 layers. + if not isinstance(im, JpegImageFile) or im.layers in (1, 4): + return -1 + sampling = im.layer[0][1:3] + im.layer[1][1:3] + im.layer[2][1:3] + return samplings.get(sampling, -1) + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + try: + rawmode = RAWMODE[im.mode] + except KeyError as e: + msg = f"cannot write mode {im.mode} as JPEG" + raise OSError(msg) from e + + info = im.encoderinfo + + dpi = [round(x) for x in info.get("dpi", (0, 0))] + + quality = info.get("quality", -1) + subsampling = info.get("subsampling", -1) + qtables = info.get("qtables") + + if quality == "keep": + quality = -1 + subsampling = "keep" + qtables = "keep" + elif quality in presets: + preset = presets[quality] + quality = -1 + subsampling = preset.get("subsampling", -1) + qtables = preset.get("quantization") + elif not isinstance(quality, int): + msg = "Invalid quality setting" + raise ValueError(msg) + else: + if subsampling in presets: + subsampling = presets[subsampling].get("subsampling", -1) + if isinstance(qtables, str) and qtables in presets: + qtables = presets[qtables].get("quantization") + + if subsampling == "4:4:4": + subsampling = 0 + elif subsampling == "4:2:2": + subsampling = 1 + elif subsampling == "4:2:0": + subsampling = 2 + elif subsampling == "4:1:1": + # For compatibility. Before Pillow 4.3, 4:1:1 actually meant 4:2:0. + # Set 4:2:0 if someone is still using that value. + subsampling = 2 + elif subsampling == "keep": + if im.format != "JPEG": + msg = "Cannot use 'keep' when original image is not a JPEG" + raise ValueError(msg) + subsampling = get_sampling(im) + + def validate_qtables( + qtables: ( + str | tuple[list[int], ...] | list[list[int]] | dict[int, list[int]] | None + ), + ) -> list[list[int]] | None: + if qtables is None: + return qtables + if isinstance(qtables, str): + try: + lines = [ + int(num) + for line in qtables.splitlines() + for num in line.split("#", 1)[0].split() + ] + except ValueError as e: + msg = "Invalid quantization table" + raise ValueError(msg) from e + else: + qtables = [lines[s : s + 64] for s in range(0, len(lines), 64)] + if isinstance(qtables, (tuple, list, dict)): + if isinstance(qtables, dict): + qtables = [ + qtables[key] for key in range(len(qtables)) if key in qtables + ] + elif isinstance(qtables, tuple): + qtables = list(qtables) + if not (0 < len(qtables) < 5): + msg = "None or too many quantization tables" + raise ValueError(msg) + try: + for idx, table in enumerate(qtables): + if len(table) != 64: + msg = "Invalid quantization table" + raise TypeError(msg) + qtables[idx] = list(array.array("H", table)) + except TypeError as e: + msg = "Invalid quantization table" + raise ValueError(msg) from e + return qtables + + if qtables == "keep": + if im.format != "JPEG": + msg = "Cannot use 'keep' when original image is not a JPEG" + raise ValueError(msg) + qtables = getattr(im, "quantization", None) + qtables = validate_qtables(qtables) + + extra = info.get("extra", b"") + + MAX_BYTES_IN_MARKER = 65533 + if xmp := info.get("xmp"): + overhead_len = 29 # b"http://ns.adobe.com/xap/1.0/\x00" + max_data_bytes_in_marker = MAX_BYTES_IN_MARKER - overhead_len + if len(xmp) > max_data_bytes_in_marker: + msg = "XMP data is too long" + raise ValueError(msg) + size = o16(2 + overhead_len + len(xmp)) + extra += b"\xff\xe1" + size + b"http://ns.adobe.com/xap/1.0/\x00" + xmp + + if icc_profile := info.get("icc_profile"): + overhead_len = 14 # b"ICC_PROFILE\0" + o8(i) + o8(len(markers)) + max_data_bytes_in_marker = MAX_BYTES_IN_MARKER - overhead_len + markers = [] + while icc_profile: + markers.append(icc_profile[:max_data_bytes_in_marker]) + icc_profile = icc_profile[max_data_bytes_in_marker:] + i = 1 + for marker in markers: + size = o16(2 + overhead_len + len(marker)) + extra += ( + b"\xff\xe2" + + size + + b"ICC_PROFILE\0" + + o8(i) + + o8(len(markers)) + + marker + ) + i += 1 + + comment = info.get("comment", im.info.get("comment")) + + # "progressive" is the official name, but older documentation + # says "progression" + # FIXME: issue a warning if the wrong form is used (post-1.1.7) + progressive = info.get("progressive", False) or info.get("progression", False) + + optimize = info.get("optimize", False) + + exif = info.get("exif", b"") + if isinstance(exif, Image.Exif): + exif = exif.tobytes() + if len(exif) > MAX_BYTES_IN_MARKER: + msg = "EXIF data is too long" + raise ValueError(msg) + + # get keyword arguments + im.encoderconfig = ( + quality, + progressive, + info.get("smooth", 0), + optimize, + info.get("keep_rgb", False), + info.get("streamtype", 0), + dpi, + subsampling, + info.get("restart_marker_blocks", 0), + info.get("restart_marker_rows", 0), + qtables, + comment, + extra, + exif, + ) + + # if we optimize, libjpeg needs a buffer big enough to hold the whole image + # in a shot. Guessing on the size, at im.size bytes. (raw pixel size is + # channels*size, this is a value that's been used in a django patch. + # https://github.com/matthewwithanm/django-imagekit/issues/50 + if optimize or progressive: + # CMYK can be bigger + if im.mode == "CMYK": + bufsize = 4 * im.size[0] * im.size[1] + # keep sets quality to -1, but the actual value may be high. + elif quality >= 95 or quality == -1: + bufsize = 2 * im.size[0] * im.size[1] + else: + bufsize = im.size[0] * im.size[1] + if exif: + bufsize += len(exif) + 5 + if extra: + bufsize += len(extra) + 1 + else: + # The EXIF info needs to be written as one block, + APP1, + one spare byte. + # Ensure that our buffer is big enough. Same with the icc_profile block. + bufsize = max(len(exif) + 5, len(extra) + 1) + + ImageFile._save( + im, fp, [ImageFile._Tile("jpeg", (0, 0) + im.size, 0, rawmode)], bufsize + ) + + +## +# Factory for making JPEG and MPO instances +def jpeg_factory( + fp: IO[bytes], filename: str | bytes | None = None +) -> JpegImageFile | MpoImageFile: + im = JpegImageFile(fp, filename) + try: + mpheader = im._getmp() + if mpheader is not None and mpheader[45057] > 1: + for segment, content in im.applist: + if segment == "APP1" and b' hdrgm:Version="' in content: + # Ultra HDR images are not yet supported + return im + # It's actually an MPO + from .MpoImagePlugin import MpoImageFile + + # Don't reload everything, just convert it. + im = MpoImageFile.adopt(im, mpheader) + except (TypeError, IndexError): + # It is really a JPEG + pass + except SyntaxError: + warnings.warn( + "Image appears to be a malformed MPO file, it will be " + "interpreted as a base JPEG file" + ) + return im + + +# --------------------------------------------------------------------- +# Registry stuff + +Image.register_open(JpegImageFile.format, jpeg_factory, _accept) +Image.register_save(JpegImageFile.format, _save) + +Image.register_extensions(JpegImageFile.format, [".jfif", ".jpe", ".jpg", ".jpeg"]) + +Image.register_mime(JpegImageFile.format, "image/jpeg") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/JpegPresets.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/JpegPresets.py new file mode 100644 index 000000000..d0e64a35e --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/JpegPresets.py @@ -0,0 +1,242 @@ +""" +JPEG quality settings equivalent to the Photoshop settings. +Can be used when saving JPEG files. + +The following presets are available by default: +``web_low``, ``web_medium``, ``web_high``, ``web_very_high``, ``web_maximum``, +``low``, ``medium``, ``high``, ``maximum``. +More presets can be added to the :py:data:`presets` dict if needed. + +To apply the preset, specify:: + + quality="preset_name" + +To apply only the quantization table:: + + qtables="preset_name" + +To apply only the subsampling setting:: + + subsampling="preset_name" + +Example:: + + im.save("image_name.jpg", quality="web_high") + +Subsampling +----------- + +Subsampling is the practice of encoding images by implementing less resolution +for chroma information than for luma information. +(ref.: https://en.wikipedia.org/wiki/Chroma_subsampling) + +Possible subsampling values are 0, 1 and 2 that correspond to 4:4:4, 4:2:2 and +4:2:0. + +You can get the subsampling of a JPEG with the +:func:`.JpegImagePlugin.get_sampling` function. + +In JPEG compressed data a JPEG marker is used instead of an EXIF tag. +(ref.: https://exiv2.org/tags.html) + + +Quantization tables +------------------- + +They are values use by the DCT (Discrete cosine transform) to remove +*unnecessary* information from the image (the lossy part of the compression). +(ref.: https://en.wikipedia.org/wiki/Quantization_matrix#Quantization_matrices, +https://en.wikipedia.org/wiki/JPEG#Quantization) + +You can get the quantization tables of a JPEG with:: + + im.quantization + +This will return a dict with a number of lists. You can pass this dict +directly as the qtables argument when saving a JPEG. + +The quantization table format in presets is a list with sublists. These formats +are interchangeable. + +Libjpeg ref.: +https://web.archive.org/web/20120328125543/http://www.jpegcameras.com/libjpeg/libjpeg-3.html + +""" + +from __future__ import annotations + +# fmt: off +presets = { + 'web_low': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [20, 16, 25, 39, 50, 46, 62, 68, + 16, 18, 23, 38, 38, 53, 65, 68, + 25, 23, 31, 38, 53, 65, 68, 68, + 39, 38, 38, 53, 65, 68, 68, 68, + 50, 38, 53, 65, 68, 68, 68, 68, + 46, 53, 65, 68, 68, 68, 68, 68, + 62, 65, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68], + [21, 25, 32, 38, 54, 68, 68, 68, + 25, 28, 24, 38, 54, 68, 68, 68, + 32, 24, 32, 43, 66, 68, 68, 68, + 38, 38, 43, 53, 68, 68, 68, 68, + 54, 54, 66, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 68, 68, 68] + ]}, + 'web_medium': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [16, 11, 11, 16, 23, 27, 31, 30, + 11, 12, 12, 15, 20, 23, 23, 30, + 11, 12, 13, 16, 23, 26, 35, 47, + 16, 15, 16, 23, 26, 37, 47, 64, + 23, 20, 23, 26, 39, 51, 64, 64, + 27, 23, 26, 37, 51, 64, 64, 64, + 31, 23, 35, 47, 64, 64, 64, 64, + 30, 30, 47, 64, 64, 64, 64, 64], + [17, 15, 17, 21, 20, 26, 38, 48, + 15, 19, 18, 17, 20, 26, 35, 43, + 17, 18, 20, 22, 26, 30, 46, 53, + 21, 17, 22, 28, 30, 39, 53, 64, + 20, 20, 26, 30, 39, 48, 64, 64, + 26, 26, 30, 39, 48, 63, 64, 64, + 38, 35, 46, 53, 64, 64, 64, 64, + 48, 43, 53, 64, 64, 64, 64, 64] + ]}, + 'web_high': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [6, 4, 4, 6, 9, 11, 12, 16, + 4, 5, 5, 6, 8, 10, 12, 12, + 4, 5, 5, 6, 10, 12, 14, 19, + 6, 6, 6, 11, 12, 15, 19, 28, + 9, 8, 10, 12, 16, 20, 27, 31, + 11, 10, 12, 15, 20, 27, 31, 31, + 12, 12, 14, 19, 27, 31, 31, 31, + 16, 12, 19, 28, 31, 31, 31, 31], + [7, 7, 13, 24, 26, 31, 31, 31, + 7, 12, 16, 21, 31, 31, 31, 31, + 13, 16, 17, 31, 31, 31, 31, 31, + 24, 21, 31, 31, 31, 31, 31, 31, + 26, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 31] + ]}, + 'web_very_high': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 4, 5, 7, 9, + 2, 2, 2, 4, 5, 7, 9, 12, + 3, 3, 4, 5, 8, 10, 12, 12, + 4, 4, 5, 7, 10, 12, 12, 12, + 5, 5, 7, 9, 12, 12, 12, 12, + 6, 6, 9, 12, 12, 12, 12, 12], + [3, 3, 5, 9, 13, 15, 15, 15, + 3, 4, 6, 11, 14, 12, 12, 12, + 5, 6, 9, 14, 12, 12, 12, 12, + 9, 11, 14, 12, 12, 12, 12, 12, + 13, 14, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'web_maximum': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 2, 2, + 1, 1, 1, 1, 1, 2, 2, 3, + 1, 1, 1, 1, 2, 2, 3, 3, + 1, 1, 1, 2, 2, 3, 3, 3, + 1, 1, 2, 2, 3, 3, 3, 3], + [1, 1, 1, 2, 2, 3, 3, 3, + 1, 1, 1, 2, 3, 3, 3, 3, + 1, 1, 1, 3, 3, 3, 3, 3, + 2, 2, 3, 3, 3, 3, 3, 3, + 2, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3] + ]}, + 'low': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [18, 14, 14, 21, 30, 35, 34, 17, + 14, 16, 16, 19, 26, 23, 12, 12, + 14, 16, 17, 21, 23, 12, 12, 12, + 21, 19, 21, 23, 12, 12, 12, 12, + 30, 26, 23, 12, 12, 12, 12, 12, + 35, 23, 12, 12, 12, 12, 12, 12, + 34, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12], + [20, 19, 22, 27, 20, 20, 17, 17, + 19, 25, 23, 14, 14, 12, 12, 12, + 22, 23, 14, 14, 12, 12, 12, 12, + 27, 14, 14, 12, 12, 12, 12, 12, + 20, 14, 12, 12, 12, 12, 12, 12, + 20, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'medium': {'subsampling': 2, # "4:2:0" + 'quantization': [ + [12, 8, 8, 12, 17, 21, 24, 17, + 8, 9, 9, 11, 15, 19, 12, 12, + 8, 9, 10, 12, 19, 12, 12, 12, + 12, 11, 12, 21, 12, 12, 12, 12, + 17, 15, 19, 12, 12, 12, 12, 12, + 21, 19, 12, 12, 12, 12, 12, 12, + 24, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12], + [13, 11, 13, 16, 20, 20, 17, 17, + 11, 14, 14, 14, 14, 12, 12, 12, + 13, 14, 14, 14, 12, 12, 12, 12, + 16, 14, 14, 12, 12, 12, 12, 12, + 20, 14, 12, 12, 12, 12, 12, 12, + 20, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'high': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [6, 4, 4, 6, 9, 11, 12, 16, + 4, 5, 5, 6, 8, 10, 12, 12, + 4, 5, 5, 6, 10, 12, 12, 12, + 6, 6, 6, 11, 12, 12, 12, 12, + 9, 8, 10, 12, 12, 12, 12, 12, + 11, 10, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, + 16, 12, 12, 12, 12, 12, 12, 12], + [7, 7, 13, 24, 20, 20, 17, 17, + 7, 12, 16, 14, 14, 12, 12, 12, + 13, 16, 14, 14, 12, 12, 12, 12, + 24, 14, 14, 12, 12, 12, 12, 12, + 20, 14, 12, 12, 12, 12, 12, 12, + 20, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12, + 17, 12, 12, 12, 12, 12, 12, 12] + ]}, + 'maximum': {'subsampling': 0, # "4:4:4" + 'quantization': [ + [2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 3, 4, 5, 6, + 2, 2, 2, 2, 4, 5, 7, 9, + 2, 2, 2, 4, 5, 7, 9, 12, + 3, 3, 4, 5, 8, 10, 12, 12, + 4, 4, 5, 7, 10, 12, 12, 12, + 5, 5, 7, 9, 12, 12, 12, 12, + 6, 6, 9, 12, 12, 12, 12, 12], + [3, 3, 5, 9, 13, 15, 15, 15, + 3, 4, 6, 10, 14, 12, 12, 12, + 5, 6, 9, 14, 12, 12, 12, 12, + 9, 10, 14, 12, 12, 12, 12, 12, + 13, 14, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12, + 15, 12, 12, 12, 12, 12, 12, 12] + ]}, +} +# fmt: on diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/McIdasImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/McIdasImagePlugin.py new file mode 100644 index 000000000..9a47933b6 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/McIdasImagePlugin.py @@ -0,0 +1,78 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Basic McIdas support for PIL +# +# History: +# 1997-05-05 fl Created (8-bit images only) +# 2009-03-08 fl Added 16/32-bit support. +# +# Thanks to Richard Jones and Craig Swank for specs and samples. +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import struct + +from . import Image, ImageFile + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(b"\x00\x00\x00\x00\x00\x00\x00\x04") + + +## +# Image plugin for McIdas area images. + + +class McIdasImageFile(ImageFile.ImageFile): + format = "MCIDAS" + format_description = "McIdas area file" + + def _open(self) -> None: + # parse area file directory + assert self.fp is not None + + s = self.fp.read(256) + if not _accept(s) or len(s) != 256: + msg = "not an McIdas area file" + raise SyntaxError(msg) + + self.area_descriptor_raw = s + self.area_descriptor = w = [0, *struct.unpack("!64i", s)] + + # get mode + if w[11] == 1: + mode = rawmode = "L" + elif w[11] == 2: + mode = rawmode = "I;16B" + elif w[11] == 4: + # FIXME: add memory map support + mode = "I" + rawmode = "I;32B" + else: + msg = "unsupported McIdas format" + raise SyntaxError(msg) + + self._mode = mode + self._size = w[10], w[9] + + offset = w[34] + w[15] + stride = w[15] + w[10] * w[11] * w[14] + + self.tile = [ + ImageFile._Tile("raw", (0, 0) + self.size, offset, (rawmode, stride, 1)) + ] + + +# -------------------------------------------------------------------- +# registry + +Image.register_open(McIdasImageFile.format, McIdasImageFile, _accept) + +# no default extension diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/MicImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/MicImagePlugin.py new file mode 100644 index 000000000..99a07bae0 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/MicImagePlugin.py @@ -0,0 +1,103 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Microsoft Image Composer support for PIL +# +# Notes: +# uses TiffImagePlugin.py to read the actual image streams +# +# History: +# 97-01-20 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import olefile + +from . import Image, TiffImagePlugin + +# +# -------------------------------------------------------------------- + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(olefile.MAGIC) + + +## +# Image plugin for Microsoft's Image Composer file format. + + +class MicImageFile(TiffImagePlugin.TiffImageFile): + format = "MIC" + format_description = "Microsoft Image Composer" + _close_exclusive_fp_after_loading = False + + def _open(self) -> None: + # read the OLE directory and see if this is a likely + # to be a Microsoft Image Composer file + + try: + self.ole = olefile.OleFileIO(self.fp) + except OSError as e: + msg = "not an MIC file; invalid OLE file" + raise SyntaxError(msg) from e + + # find ACI subfiles with Image members (maybe not the + # best way to identify MIC files, but what the... ;-) + + self.images = [ + path + for path in self.ole.listdir() + if path[1:] and path[0].endswith(".ACI") and path[1] == "Image" + ] + + # if we didn't find any images, this is probably not + # an MIC file. + if not self.images: + msg = "not an MIC file; no image entries" + raise SyntaxError(msg) + + self.frame = -1 + self._n_frames = len(self.images) + self.is_animated = self._n_frames > 1 + + assert self.fp is not None + self.__fp = self.fp + self.seek(0) + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + filename = self.images[frame] + self.fp = self.ole.openstream(filename) + + TiffImagePlugin.TiffImageFile._open(self) + + self.frame = frame + + def tell(self) -> int: + return self.frame + + def close(self) -> None: + self.__fp.close() + self.ole.close() + super().close() + + def __exit__(self, *args: object) -> None: + self.__fp.close() + self.ole.close() + super().__exit__() + + +# +# -------------------------------------------------------------------- + +Image.register_open(MicImageFile.format, MicImageFile, _accept) + +Image.register_extension(MicImageFile.format, ".mic") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/MpegImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/MpegImagePlugin.py new file mode 100644 index 000000000..47ebe9d62 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/MpegImagePlugin.py @@ -0,0 +1,84 @@ +# +# The Python Imaging Library. +# $Id$ +# +# MPEG file handling +# +# History: +# 95-09-09 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1995. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image, ImageFile +from ._binary import i8 +from ._typing import SupportsRead + +# +# Bitstream parser + + +class BitStream: + def __init__(self, fp: SupportsRead[bytes]) -> None: + self.fp = fp + self.bits = 0 + self.bitbuffer = 0 + + def next(self) -> int: + return i8(self.fp.read(1)) + + def peek(self, bits: int) -> int: + while self.bits < bits: + self.bitbuffer = (self.bitbuffer << 8) + self.next() + self.bits += 8 + return self.bitbuffer >> (self.bits - bits) & (1 << bits) - 1 + + def skip(self, bits: int) -> None: + while self.bits < bits: + self.bitbuffer = (self.bitbuffer << 8) + i8(self.fp.read(1)) + self.bits += 8 + self.bits = self.bits - bits + + def read(self, bits: int) -> int: + v = self.peek(bits) + self.bits = self.bits - bits + return v + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(b"\x00\x00\x01\xb3") + + +## +# Image plugin for MPEG streams. This plugin can identify a stream, +# but it cannot read it. + + +class MpegImageFile(ImageFile.ImageFile): + format = "MPEG" + format_description = "MPEG" + + def _open(self) -> None: + assert self.fp is not None + + s = BitStream(self.fp) + if s.read(32) != 0x1B3: + msg = "not an MPEG file" + raise SyntaxError(msg) + + self._mode = "RGB" + self._size = s.read(12), s.read(12) + + +# -------------------------------------------------------------------- +# Registry stuff + +Image.register_open(MpegImageFile.format, MpegImageFile, _accept) + +Image.register_extensions(MpegImageFile.format, [".mpg", ".mpeg"]) + +Image.register_mime(MpegImageFile.format, "video/mpeg") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/MpoImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/MpoImagePlugin.py new file mode 100644 index 000000000..bee0a56f9 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/MpoImagePlugin.py @@ -0,0 +1,203 @@ +# +# The Python Imaging Library. +# $Id$ +# +# MPO file handling +# +# See "Multi-Picture Format" (CIPA DC-007-Translation 2009, Standard of the +# Camera & Imaging Products Association) +# +# The multi-picture object combines multiple JPEG images (with a modified EXIF +# data format) into a single file. While it can theoretically be used much like +# a GIF animation, it is commonly used to represent 3D photographs and is (as +# of this writing) the most commonly used format by 3D cameras. +# +# History: +# 2014-03-13 Feneric Created +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os +import struct +from typing import IO, Any, cast + +from . import ( + Image, + ImageFile, + ImageSequence, + JpegImagePlugin, + TiffImagePlugin, +) +from ._binary import o32le +from ._util import DeferredError + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + JpegImagePlugin._save(im, fp, filename) + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + append_images = im.encoderinfo.get("append_images", []) + if not append_images and not getattr(im, "is_animated", False): + _save(im, fp, filename) + return + + mpf_offset = 28 + offsets: list[int] = [] + im_sequences = [im, *append_images] + total = sum(getattr(seq, "n_frames", 1) for seq in im_sequences) + for im_sequence in im_sequences: + for im_frame in ImageSequence.Iterator(im_sequence): + if not offsets: + # APP2 marker + ifd_length = 66 + 16 * total + im_frame.encoderinfo["extra"] = ( + b"\xff\xe2" + + struct.pack(">H", 6 + ifd_length) + + b"MPF\0" + + b" " * ifd_length + ) + if exif := im_frame.encoderinfo.get("exif"): + if isinstance(exif, Image.Exif): + exif = exif.tobytes() + im_frame.encoderinfo["exif"] = exif + mpf_offset += 4 + len(exif) + + JpegImagePlugin._save(im_frame, fp, filename) + offsets.append(fp.tell()) + else: + encoderinfo = im_frame._attach_default_encoderinfo(im) + im_frame.save(fp, "JPEG") + im_frame.encoderinfo = encoderinfo + offsets.append(fp.tell() - offsets[-1]) + + ifd = TiffImagePlugin.ImageFileDirectory_v2() + ifd[0xB000] = b"0100" + ifd[0xB001] = len(offsets) + + mpentries = b"" + data_offset = 0 + for i, size in enumerate(offsets): + if i == 0: + mptype = 0x030000 # Baseline MP Primary Image + else: + mptype = 0x000000 # Undefined + mpentries += struct.pack(" None: + assert self.fp is not None + self.fp.seek(0) # prep the fp in order to pass the JPEG test + JpegImagePlugin.JpegImageFile._open(self) + self._after_jpeg_open() + + def _after_jpeg_open(self, mpheader: dict[int, Any] | None = None) -> None: + self.mpinfo = mpheader if mpheader is not None else self._getmp() + if self.mpinfo is None: + msg = "Image appears to be a malformed MPO file" + raise ValueError(msg) + self.n_frames = self.mpinfo[0xB001] + self.__mpoffsets = [ + mpent["DataOffset"] + self.info["mpoffset"] for mpent in self.mpinfo[0xB002] + ] + self.__mpoffsets[0] = 0 + # Note that the following assertion will only be invalid if something + # gets broken within JpegImagePlugin. + assert self.n_frames == len(self.__mpoffsets) + del self.info["mpoffset"] # no longer needed + self.is_animated = self.n_frames > 1 + assert self.fp is not None + self._fp = self.fp # FIXME: hack + self._fp.seek(self.__mpoffsets[0]) # get ready to read first frame + self.__frame = 0 + self.offset = 0 + # for now we can only handle reading and individual frame extraction + self.readonly = 1 + + def load_seek(self, pos: int) -> None: + if isinstance(self._fp, DeferredError): + raise self._fp.ex + self._fp.seek(pos) + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + if isinstance(self._fp, DeferredError): + raise self._fp.ex + self.fp = self._fp + self.offset = self.__mpoffsets[frame] + + original_exif = self.info.get("exif") + if "exif" in self.info: + del self.info["exif"] + + self.fp.seek(self.offset + 2) # skip SOI marker + if not self.fp.read(2): + msg = "No data found for frame" + raise ValueError(msg) + self.fp.seek(self.offset) + JpegImagePlugin.JpegImageFile._open(self) + if self.info.get("exif") != original_exif: + self._reload_exif() + + self.tile = [ + ImageFile._Tile("jpeg", (0, 0) + self.size, self.offset, self.tile[0][-1]) + ] + self.__frame = frame + + def tell(self) -> int: + return self.__frame + + @staticmethod + def adopt( + jpeg_instance: JpegImagePlugin.JpegImageFile, + mpheader: dict[int, Any] | None = None, + ) -> MpoImageFile: + """ + Transform the instance of JpegImageFile into + an instance of MpoImageFile. + After the call, the JpegImageFile is extended + to be an MpoImageFile. + + This is essentially useful when opening a JPEG + file that reveals itself as an MPO, to avoid + double call to _open. + """ + jpeg_instance.__class__ = MpoImageFile + mpo_instance = cast(MpoImageFile, jpeg_instance) + mpo_instance._after_jpeg_open(mpheader) + return mpo_instance + + +# --------------------------------------------------------------------- +# Registry stuff + +# Note that since MPO shares a factory with JPEG, we do not need to do a +# separate registration for it here. +# Image.register_open(MpoImageFile.format, +# JpegImagePlugin.jpeg_factory, _accept) +Image.register_save(MpoImageFile.format, _save) +Image.register_save_all(MpoImageFile.format, _save_all) + +Image.register_extension(MpoImageFile.format, ".mpo") + +Image.register_mime(MpoImageFile.format, "image/mpo") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/MspImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/MspImagePlugin.py new file mode 100644 index 000000000..fa0f52fe8 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/MspImagePlugin.py @@ -0,0 +1,200 @@ +# +# The Python Imaging Library. +# +# MSP file handling +# +# This is the format used by the Paint program in Windows 1 and 2. +# +# History: +# 95-09-05 fl Created +# 97-01-03 fl Read/write MSP images +# 17-02-21 es Fixed RLE interpretation +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1995-97. +# Copyright (c) Eric Soroos 2017. +# +# See the README file for information on usage and redistribution. +# +# More info on this format: https://archive.org/details/gg243631 +# Page 313: +# Figure 205. Windows Paint Version 1: "DanM" Format +# Figure 206. Windows Paint Version 2: "LinS" Format. Used in Windows V2.03 +# +# See also: https://www.fileformat.info/format/mspaint/egff.htm +from __future__ import annotations + +import io +import struct +from typing import IO + +from . import Image, ImageFile +from ._binary import i16le as i16 +from ._binary import o16le as o16 + +# +# read MSP files + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith((b"DanM", b"LinS")) + + +## +# Image plugin for Windows MSP images. This plugin supports both +# uncompressed (Windows 1.0). + + +class MspImageFile(ImageFile.ImageFile): + format = "MSP" + format_description = "Windows Paint" + + def _open(self) -> None: + # Header + assert self.fp is not None + + s = self.fp.read(32) + if not _accept(s): + msg = "not an MSP file" + raise SyntaxError(msg) + + # Header checksum + checksum = 0 + for i in range(0, 32, 2): + checksum = checksum ^ i16(s, i) + if checksum != 0: + msg = "bad MSP checksum" + raise SyntaxError(msg) + + self._mode = "1" + self._size = i16(s, 4), i16(s, 6) + + if s.startswith(b"DanM"): + self.tile = [ImageFile._Tile("raw", (0, 0) + self.size, 32, "1")] + else: + self.tile = [ImageFile._Tile("MSP", (0, 0) + self.size, 32)] + + +class MspDecoder(ImageFile.PyDecoder): + # The algo for the MSP decoder is from + # https://www.fileformat.info/format/mspaint/egff.htm + # cc-by-attribution -- That page references is taken from the + # Encyclopedia of Graphics File Formats and is licensed by + # O'Reilly under the Creative Common/Attribution license + # + # For RLE encoded files, the 32byte header is followed by a scan + # line map, encoded as one 16bit word of encoded byte length per + # line. + # + # NOTE: the encoded length of the line can be 0. This was not + # handled in the previous version of this encoder, and there's no + # mention of how to handle it in the documentation. From the few + # examples I've seen, I've assumed that it is a fill of the + # background color, in this case, white. + # + # + # Pseudocode of the decoder: + # Read a BYTE value as the RunType + # If the RunType value is zero + # Read next byte as the RunCount + # Read the next byte as the RunValue + # Write the RunValue byte RunCount times + # If the RunType value is non-zero + # Use this value as the RunCount + # Read and write the next RunCount bytes literally + # + # e.g.: + # 0x00 03 ff 05 00 01 02 03 04 + # would yield the bytes: + # 0xff ff ff 00 01 02 03 04 + # + # which are then interpreted as a bit packed mode '1' image + + _pulls_fd = True + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + assert self.fd is not None + + img = io.BytesIO() + blank_line = bytearray((0xFF,) * ((self.state.xsize + 7) // 8)) + try: + self.fd.seek(32) + rowmap = struct.unpack_from( + f"<{self.state.ysize}H", self.fd.read(self.state.ysize * 2) + ) + except struct.error as e: + msg = "Truncated MSP file in row map" + raise OSError(msg) from e + + for x, rowlen in enumerate(rowmap): + try: + if rowlen == 0: + img.write(blank_line) + continue + row = self.fd.read(rowlen) + if len(row) != rowlen: + msg = f"Truncated MSP file, expected {rowlen} bytes on row {x}" + raise OSError(msg) + idx = 0 + while idx < rowlen: + runtype = row[idx] + idx += 1 + if runtype == 0: + runcount, runval = struct.unpack_from("Bc", row, idx) + img.write(runval * runcount) + idx += 2 + else: + runcount = runtype + img.write(row[idx : idx + runcount]) + idx += runcount + + except struct.error as e: + msg = f"Corrupted MSP file in row {x}" + raise OSError(msg) from e + + self.set_as_raw(img.getvalue(), "1") + + return -1, 0 + + +Image.register_decoder("MSP", MspDecoder) + + +# +# write MSP files (uncompressed only) + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode != "1": + msg = f"cannot write mode {im.mode} as MSP" + raise OSError(msg) + + # create MSP header + header = [0] * 16 + + header[0], header[1] = i16(b"Da"), i16(b"nM") # version 1 + header[2], header[3] = im.size + header[4], header[5] = 1, 1 + header[6], header[7] = 1, 1 + header[8], header[9] = im.size + + checksum = 0 + for h in header: + checksum = checksum ^ h + header[12] = checksum # FIXME: is this the right field? + + # header + for h in header: + fp.write(o16(h)) + + # image body + ImageFile._save(im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 32, "1")]) + + +# +# registry + +Image.register_open(MspImageFile.format, MspImageFile, _accept) +Image.register_save(MspImageFile.format, _save) + +Image.register_extension(MspImageFile.format, ".msp") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PSDraw.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PSDraw.py new file mode 100644 index 000000000..e6b74a918 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PSDraw.py @@ -0,0 +1,238 @@ +# +# The Python Imaging Library +# $Id$ +# +# Simple PostScript graphics interface +# +# History: +# 1996-04-20 fl Created +# 1999-01-10 fl Added gsave/grestore to image method +# 2005-05-04 fl Fixed floating point issue in image (from Eric Etheridge) +# +# Copyright (c) 1997-2005 by Secret Labs AB. All rights reserved. +# Copyright (c) 1996 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import sys +from typing import IO + +from . import EpsImagePlugin + +TYPE_CHECKING = False + + +## +# Simple PostScript graphics interface. + + +class PSDraw: + """ + Sets up printing to the given file. If ``fp`` is omitted, + ``sys.stdout.buffer`` is assumed. + """ + + def __init__(self, fp: IO[bytes] | None = None) -> None: + if not fp: + fp = sys.stdout.buffer + self.fp = fp + + def begin_document(self, id: str | None = None) -> None: + """Set up printing of a document. (Write PostScript DSC header.)""" + # FIXME: incomplete + self.fp.write( + b"%!PS-Adobe-3.0\n" + b"save\n" + b"/showpage { } def\n" + b"%%EndComments\n" + b"%%BeginDocument\n" + ) + # self.fp.write(ERROR_PS) # debugging! + self.fp.write(EDROFF_PS) + self.fp.write(VDI_PS) + self.fp.write(b"%%EndProlog\n") + self.isofont: dict[bytes, int] = {} + + def end_document(self) -> None: + """Ends printing. (Write PostScript DSC footer.)""" + self.fp.write(b"%%EndDocument\nrestore showpage\n%%End\n") + if hasattr(self.fp, "flush"): + self.fp.flush() + + def setfont(self, font: str, size: int) -> None: + """ + Selects which font to use. + + :param font: A PostScript font name + :param size: Size in points. + """ + font_bytes = bytes(font, "UTF-8") + if font_bytes not in self.isofont: + # reencode font + self.fp.write( + b"/PSDraw-%s ISOLatin1Encoding /%s E\n" % (font_bytes, font_bytes) + ) + self.isofont[font_bytes] = 1 + # rough + self.fp.write(b"/F0 %d /PSDraw-%s F\n" % (size, font_bytes)) + + def line(self, xy0: tuple[int, int], xy1: tuple[int, int]) -> None: + """ + Draws a line between the two points. Coordinates are given in + PostScript point coordinates (72 points per inch, (0, 0) is the lower + left corner of the page). + """ + self.fp.write(b"%d %d %d %d Vl\n" % (*xy0, *xy1)) + + def rectangle(self, box: tuple[int, int, int, int]) -> None: + """ + Draws a rectangle. + + :param box: A tuple of four integers, specifying left, bottom, width and + height. + """ + self.fp.write(b"%d %d M 0 %d %d Vr\n" % box) + + def text(self, xy: tuple[int, int], text: str) -> None: + """ + Draws text at the given position. You must use + :py:meth:`~PIL.PSDraw.PSDraw.setfont` before calling this method. + """ + # The font is loaded as ISOLatin1Encoding, so use latin-1 here. + text_bytes = bytes(text, "latin-1") + text_bytes = b"\\(".join(text_bytes.split(b"(")) + text_bytes = b"\\)".join(text_bytes.split(b")")) + self.fp.write(b"%d %d M (%s) S\n" % (xy + (text_bytes,))) + + if TYPE_CHECKING: + from . import Image + + def image( + self, box: tuple[int, int, int, int], im: Image.Image, dpi: int | None = None + ) -> None: + """Draw a PIL image, centered in the given box.""" + # default resolution depends on mode + if not dpi: + if im.mode == "1": + dpi = 200 # fax + else: + dpi = 100 # grayscale + # image size (on paper) + x = im.size[0] * 72 / dpi + y = im.size[1] * 72 / dpi + # max allowed size + xmax = float(box[2] - box[0]) + ymax = float(box[3] - box[1]) + if x > xmax: + y = y * xmax / x + x = xmax + if y > ymax: + x = x * ymax / y + y = ymax + dx = (xmax - x) / 2 + box[0] + dy = (ymax - y) / 2 + box[1] + self.fp.write(b"gsave\n%f %f translate\n" % (dx, dy)) + if (x, y) != im.size: + # EpsImagePlugin._save prints the image at (0,0,xsize,ysize) + sx = x / im.size[0] + sy = y / im.size[1] + self.fp.write(b"%f %f scale\n" % (sx, sy)) + EpsImagePlugin._save(im, self.fp, "", 0) + self.fp.write(b"\ngrestore\n") + + +# -------------------------------------------------------------------- +# PostScript driver + +# +# EDROFF.PS -- PostScript driver for Edroff 2 +# +# History: +# 94-01-25 fl: created (edroff 2.04) +# +# Copyright (c) Fredrik Lundh 1994. +# + + +EDROFF_PS = b"""\ +/S { show } bind def +/P { moveto show } bind def +/M { moveto } bind def +/X { 0 rmoveto } bind def +/Y { 0 exch rmoveto } bind def +/E { findfont + dup maxlength dict begin + { + 1 index /FID ne { def } { pop pop } ifelse + } forall + /Encoding exch def + dup /FontName exch def + currentdict end definefont pop +} bind def +/F { findfont exch scalefont dup setfont + [ exch /setfont cvx ] cvx bind def +} bind def +""" + +# +# VDI.PS -- PostScript driver for VDI meta commands +# +# History: +# 94-01-25 fl: created (edroff 2.04) +# +# Copyright (c) Fredrik Lundh 1994. +# + +VDI_PS = b"""\ +/Vm { moveto } bind def +/Va { newpath arcn stroke } bind def +/Vl { moveto lineto stroke } bind def +/Vc { newpath 0 360 arc closepath } bind def +/Vr { exch dup 0 rlineto + exch dup 0 exch rlineto + exch neg 0 rlineto + 0 exch neg rlineto + setgray fill } bind def +/Tm matrix def +/Ve { Tm currentmatrix pop + translate scale newpath 0 0 .5 0 360 arc closepath + Tm setmatrix +} bind def +/Vf { currentgray exch setgray fill setgray } bind def +""" + +# +# ERROR.PS -- Error handler +# +# History: +# 89-11-21 fl: created (pslist 1.10) +# + +ERROR_PS = b"""\ +/landscape false def +/errorBUF 200 string def +/errorNL { currentpoint 10 sub exch pop 72 exch moveto } def +errordict begin /handleerror { + initmatrix /Courier findfont 10 scalefont setfont + newpath 72 720 moveto $error begin /newerror false def + (PostScript Error) show errorNL errorNL + (Error: ) show + /errorname load errorBUF cvs show errorNL errorNL + (Command: ) show + /command load dup type /stringtype ne { errorBUF cvs } if show + errorNL errorNL + (VMstatus: ) show + vmstatus errorBUF cvs show ( bytes available, ) show + errorBUF cvs show ( bytes used at level ) show + errorBUF cvs show errorNL errorNL + (Operand stargck: ) show errorNL /ostargck load { + dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL + } forall errorNL + (Execution stargck: ) show errorNL /estargck load { + dup type /stringtype ne { errorBUF cvs } if 72 0 rmoveto show errorNL + } forall + end showpage +} def end +""" diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PaletteFile.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PaletteFile.py new file mode 100644 index 000000000..2a26e5d4e --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PaletteFile.py @@ -0,0 +1,54 @@ +# +# Python Imaging Library +# $Id$ +# +# stuff to read simple, teragon-style palette files +# +# History: +# 97-08-23 fl Created +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from typing import IO + +from ._binary import o8 + + +class PaletteFile: + """File handler for Teragon-style palette files.""" + + rawmode = "RGB" + + def __init__(self, fp: IO[bytes]) -> None: + palette = [o8(i) * 3 for i in range(256)] + + while True: + s = fp.readline() + + if not s: + break + if s.startswith(b"#"): + continue + if len(s) > 100: + msg = "bad palette file" + raise SyntaxError(msg) + + v = [int(x) for x in s.split()] + try: + [i, r, g, b] = v + except ValueError: + [i, r] = v + g = b = r + + if 0 <= i <= 255: + palette[i] = o8(r) + o8(g) + o8(b) + + self.palette = b"".join(palette) + + def getpalette(self) -> tuple[bytes, str]: + return self.palette, self.rawmode diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PalmImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PalmImagePlugin.py new file mode 100644 index 000000000..232adf3d3 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PalmImagePlugin.py @@ -0,0 +1,217 @@ +# +# The Python Imaging Library. +# $Id$ +# + +## +# Image plugin for Palm pixmap images (output only). +## +from __future__ import annotations + +from typing import IO + +from . import Image, ImageFile +from ._binary import o8 +from ._binary import o16be as o16b + +# fmt: off +_Palm8BitColormapValues = ( + (255, 255, 255), (255, 204, 255), (255, 153, 255), (255, 102, 255), + (255, 51, 255), (255, 0, 255), (255, 255, 204), (255, 204, 204), + (255, 153, 204), (255, 102, 204), (255, 51, 204), (255, 0, 204), + (255, 255, 153), (255, 204, 153), (255, 153, 153), (255, 102, 153), + (255, 51, 153), (255, 0, 153), (204, 255, 255), (204, 204, 255), + (204, 153, 255), (204, 102, 255), (204, 51, 255), (204, 0, 255), + (204, 255, 204), (204, 204, 204), (204, 153, 204), (204, 102, 204), + (204, 51, 204), (204, 0, 204), (204, 255, 153), (204, 204, 153), + (204, 153, 153), (204, 102, 153), (204, 51, 153), (204, 0, 153), + (153, 255, 255), (153, 204, 255), (153, 153, 255), (153, 102, 255), + (153, 51, 255), (153, 0, 255), (153, 255, 204), (153, 204, 204), + (153, 153, 204), (153, 102, 204), (153, 51, 204), (153, 0, 204), + (153, 255, 153), (153, 204, 153), (153, 153, 153), (153, 102, 153), + (153, 51, 153), (153, 0, 153), (102, 255, 255), (102, 204, 255), + (102, 153, 255), (102, 102, 255), (102, 51, 255), (102, 0, 255), + (102, 255, 204), (102, 204, 204), (102, 153, 204), (102, 102, 204), + (102, 51, 204), (102, 0, 204), (102, 255, 153), (102, 204, 153), + (102, 153, 153), (102, 102, 153), (102, 51, 153), (102, 0, 153), + (51, 255, 255), (51, 204, 255), (51, 153, 255), (51, 102, 255), + (51, 51, 255), (51, 0, 255), (51, 255, 204), (51, 204, 204), + (51, 153, 204), (51, 102, 204), (51, 51, 204), (51, 0, 204), + (51, 255, 153), (51, 204, 153), (51, 153, 153), (51, 102, 153), + (51, 51, 153), (51, 0, 153), (0, 255, 255), (0, 204, 255), + (0, 153, 255), (0, 102, 255), (0, 51, 255), (0, 0, 255), + (0, 255, 204), (0, 204, 204), (0, 153, 204), (0, 102, 204), + (0, 51, 204), (0, 0, 204), (0, 255, 153), (0, 204, 153), + (0, 153, 153), (0, 102, 153), (0, 51, 153), (0, 0, 153), + (255, 255, 102), (255, 204, 102), (255, 153, 102), (255, 102, 102), + (255, 51, 102), (255, 0, 102), (255, 255, 51), (255, 204, 51), + (255, 153, 51), (255, 102, 51), (255, 51, 51), (255, 0, 51), + (255, 255, 0), (255, 204, 0), (255, 153, 0), (255, 102, 0), + (255, 51, 0), (255, 0, 0), (204, 255, 102), (204, 204, 102), + (204, 153, 102), (204, 102, 102), (204, 51, 102), (204, 0, 102), + (204, 255, 51), (204, 204, 51), (204, 153, 51), (204, 102, 51), + (204, 51, 51), (204, 0, 51), (204, 255, 0), (204, 204, 0), + (204, 153, 0), (204, 102, 0), (204, 51, 0), (204, 0, 0), + (153, 255, 102), (153, 204, 102), (153, 153, 102), (153, 102, 102), + (153, 51, 102), (153, 0, 102), (153, 255, 51), (153, 204, 51), + (153, 153, 51), (153, 102, 51), (153, 51, 51), (153, 0, 51), + (153, 255, 0), (153, 204, 0), (153, 153, 0), (153, 102, 0), + (153, 51, 0), (153, 0, 0), (102, 255, 102), (102, 204, 102), + (102, 153, 102), (102, 102, 102), (102, 51, 102), (102, 0, 102), + (102, 255, 51), (102, 204, 51), (102, 153, 51), (102, 102, 51), + (102, 51, 51), (102, 0, 51), (102, 255, 0), (102, 204, 0), + (102, 153, 0), (102, 102, 0), (102, 51, 0), (102, 0, 0), + (51, 255, 102), (51, 204, 102), (51, 153, 102), (51, 102, 102), + (51, 51, 102), (51, 0, 102), (51, 255, 51), (51, 204, 51), + (51, 153, 51), (51, 102, 51), (51, 51, 51), (51, 0, 51), + (51, 255, 0), (51, 204, 0), (51, 153, 0), (51, 102, 0), + (51, 51, 0), (51, 0, 0), (0, 255, 102), (0, 204, 102), + (0, 153, 102), (0, 102, 102), (0, 51, 102), (0, 0, 102), + (0, 255, 51), (0, 204, 51), (0, 153, 51), (0, 102, 51), + (0, 51, 51), (0, 0, 51), (0, 255, 0), (0, 204, 0), + (0, 153, 0), (0, 102, 0), (0, 51, 0), (17, 17, 17), + (34, 34, 34), (68, 68, 68), (85, 85, 85), (119, 119, 119), + (136, 136, 136), (170, 170, 170), (187, 187, 187), (221, 221, 221), + (238, 238, 238), (192, 192, 192), (128, 0, 0), (128, 0, 128), + (0, 128, 0), (0, 128, 128), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0), + (0, 0, 0), (0, 0, 0), (0, 0, 0), (0, 0, 0)) +# fmt: on + + +# so build a prototype image to be used for palette resampling +def build_prototype_image() -> Image.Image: + image = Image.new("L", (1, len(_Palm8BitColormapValues))) + image.putdata(list(range(len(_Palm8BitColormapValues)))) + palettedata: tuple[int, ...] = () + for colormapValue in _Palm8BitColormapValues: + palettedata += colormapValue + palettedata += (0, 0, 0) * (256 - len(_Palm8BitColormapValues)) + image.putpalette(palettedata) + return image + + +Palm8BitColormapImage = build_prototype_image() + +# OK, we now have in Palm8BitColormapImage, +# a "P"-mode image with the right palette +# +# -------------------------------------------------------------------- + +_FLAGS = {"custom-colormap": 0x4000, "is-compressed": 0x8000, "has-transparent": 0x2000} + +_COMPRESSION_TYPES = {"none": 0xFF, "rle": 0x01, "scanline": 0x00} + + +# +# -------------------------------------------------------------------- + +## +# (Internal) Image save plugin for the Palm format. + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode == "P": + rawmode = "P" + bpp = 8 + version = 1 + + elif im.mode == "L": + if im.encoderinfo.get("bpp") in (1, 2, 4): + # this is 8-bit grayscale, so we shift it to get the high-order bits, + # and invert it because + # Palm does grayscale from white (0) to black (1) + bpp = im.encoderinfo["bpp"] + maxval = (1 << bpp) - 1 + shift = 8 - bpp + im = im.point(lambda x: maxval - (x >> shift)) + elif im.info.get("bpp") in (1, 2, 4): + # here we assume that even though the inherent mode is 8-bit grayscale, + # only the lower bpp bits are significant. + # We invert them to match the Palm. + bpp = im.info["bpp"] + maxval = (1 << bpp) - 1 + im = im.point(lambda x: maxval - (x & maxval)) + else: + msg = f"cannot write mode {im.mode} as Palm" + raise OSError(msg) + + # we ignore the palette here + im._mode = "P" + rawmode = f"P;{bpp}" + version = 1 + + elif im.mode == "1": + # monochrome -- write it inverted, as is the Palm standard + rawmode = "1;I" + bpp = 1 + version = 0 + + else: + msg = f"cannot write mode {im.mode} as Palm" + raise OSError(msg) + + # + # make sure image data is available + im.load() + + # write header + + cols = im.size[0] + rows = im.size[1] + + rowbytes = int((cols + (16 // bpp - 1)) / (16 // bpp)) * 2 + transparent_index = 0 + compression_type = _COMPRESSION_TYPES["none"] + + flags = 0 + if im.mode == "P": + flags |= _FLAGS["custom-colormap"] + colormap = im.im.getpalette() + colors = len(colormap) // 3 + colormapsize = 4 * colors + 2 + else: + colormapsize = 0 + + if "offset" in im.info: + offset = (rowbytes * rows + 16 + 3 + colormapsize) // 4 + else: + offset = 0 + + fp.write(o16b(cols) + o16b(rows) + o16b(rowbytes) + o16b(flags)) + fp.write(o8(bpp)) + fp.write(o8(version)) + fp.write(o16b(offset)) + fp.write(o8(transparent_index)) + fp.write(o8(compression_type)) + fp.write(o16b(0)) # reserved by Palm + + # now write colormap if necessary + + if colormapsize: + fp.write(o16b(colors)) + for i in range(colors): + fp.write(o8(i)) + fp.write(colormap[3 * i : 3 * i + 3]) + + # now convert data to raw form + ImageFile._save( + im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, rowbytes, 1))] + ) + + if hasattr(fp, "flush"): + fp.flush() + + +# +# -------------------------------------------------------------------- + +Image.register_save("PALM", _save) + +Image.register_extension("PALM", ".palm") + +Image.register_mime("PALM", "image/palm") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PcdImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PcdImagePlugin.py new file mode 100644 index 000000000..296f3775b --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PcdImagePlugin.py @@ -0,0 +1,68 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PCD file handling +# +# History: +# 96-05-10 fl Created +# 96-05-27 fl Added draft mode (128x192, 256x384) +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image, ImageFile + +## +# Image plugin for PhotoCD images. This plugin only reads the 768x512 +# image from the file; higher resolutions are encoded in a proprietary +# encoding. + + +class PcdImageFile(ImageFile.ImageFile): + format = "PCD" + format_description = "Kodak PhotoCD" + + def _open(self) -> None: + # rough + assert self.fp is not None + + self.fp.seek(2048) + s = self.fp.read(1539) + + if not s.startswith(b"PCD_"): + msg = "not a PCD file" + raise SyntaxError(msg) + + orientation = s[1538] & 3 + self.tile_post_rotate = None + if orientation == 1: + self.tile_post_rotate = 90 + elif orientation == 3: + self.tile_post_rotate = 270 + + self._mode = "RGB" + self._size = (512, 768) if orientation in (1, 3) else (768, 512) + self.tile = [ImageFile._Tile("pcd", (0, 0, 768, 512), 96 * 2048)] + + def load_prepare(self) -> None: + if self._im is None and self.tile_post_rotate: + self.im = Image.core.new(self.mode, (768, 512)) + ImageFile.ImageFile.load_prepare(self) + + def load_end(self) -> None: + if self.tile_post_rotate: + # Handle rotated PCDs + self.im = self.rotate(self.tile_post_rotate, expand=True).im + + +# +# registry + +Image.register_open(PcdImageFile.format, PcdImageFile) + +Image.register_extension(PcdImageFile.format, ".pcd") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PcfFontFile.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PcfFontFile.py new file mode 100644 index 000000000..b923293b0 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PcfFontFile.py @@ -0,0 +1,258 @@ +# +# THIS IS WORK IN PROGRESS +# +# The Python Imaging Library +# $Id$ +# +# portable compiled font file parser +# +# history: +# 1997-08-19 fl created +# 2003-09-13 fl fixed loading of unicode fonts +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1997-2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io + +from . import FontFile, Image +from ._binary import i8 +from ._binary import i16be as b16 +from ._binary import i16le as l16 +from ._binary import i32be as b32 +from ._binary import i32le as l32 + +TYPE_CHECKING = False +if TYPE_CHECKING: + from collections.abc import Callable + from typing import BinaryIO + +# -------------------------------------------------------------------- +# declarations + +PCF_MAGIC = 0x70636601 # "\x01fcp" + +PCF_PROPERTIES = 1 << 0 +PCF_ACCELERATORS = 1 << 1 +PCF_METRICS = 1 << 2 +PCF_BITMAPS = 1 << 3 +PCF_INK_METRICS = 1 << 4 +PCF_BDF_ENCODINGS = 1 << 5 +PCF_SWIDTHS = 1 << 6 +PCF_GLYPH_NAMES = 1 << 7 +PCF_BDF_ACCELERATORS = 1 << 8 + +BYTES_PER_ROW: list[Callable[[int], int]] = [ + lambda bits: ((bits + 7) >> 3), + lambda bits: ((bits + 15) >> 3) & ~1, + lambda bits: ((bits + 31) >> 3) & ~3, + lambda bits: ((bits + 63) >> 3) & ~7, +] + + +def sz(s: bytes, o: int) -> bytes: + return s[o : s.index(b"\0", o)] + + +class PcfFontFile(FontFile.FontFile): + """Font file plugin for the X11 PCF format.""" + + name = "name" + + def __init__(self, fp: BinaryIO, charset_encoding: str = "iso8859-1"): + self.charset_encoding = charset_encoding + + magic = l32(fp.read(4)) + if magic != PCF_MAGIC: + msg = "not a PCF file" + raise SyntaxError(msg) + + super().__init__() + + count = l32(fp.read(4)) + self.toc = {} + for i in range(count): + type = l32(fp.read(4)) + self.toc[type] = l32(fp.read(4)), l32(fp.read(4)), l32(fp.read(4)) + + self.fp = fp + + self.info = self._load_properties() + + metrics = self._load_metrics() + bitmaps = self._load_bitmaps(metrics) + encoding = self._load_encoding() + + # + # create glyph structure + + for ch, ix in enumerate(encoding): + if ix is not None: + ( + xsize, + ysize, + left, + right, + width, + ascent, + descent, + attributes, + ) = metrics[ix] + self.glyph[ch] = ( + (width, 0), + (left, descent - ysize, xsize + left, descent), + (0, 0, xsize, ysize), + bitmaps[ix], + ) + + def _getformat( + self, tag: int + ) -> tuple[BinaryIO, int, Callable[[bytes], int], Callable[[bytes], int]]: + format, size, offset = self.toc[tag] + + fp = self.fp + fp.seek(offset) + + format = l32(fp.read(4)) + + if format & 4: + i16, i32 = b16, b32 + else: + i16, i32 = l16, l32 + + return fp, format, i16, i32 + + def _load_properties(self) -> dict[bytes, bytes | int]: + # + # font properties + + properties = {} + + fp, format, i16, i32 = self._getformat(PCF_PROPERTIES) + + nprops = i32(fp.read(4)) + + # read property description + p = [(i32(fp.read(4)), i8(fp.read(1)), i32(fp.read(4))) for _ in range(nprops)] + + if nprops & 3: + fp.seek(4 - (nprops & 3), io.SEEK_CUR) # pad + + data = fp.read(i32(fp.read(4))) + + for k, s, v in p: + property_value: bytes | int = sz(data, v) if s else v + properties[sz(data, k)] = property_value + + return properties + + def _load_metrics(self) -> list[tuple[int, int, int, int, int, int, int, int]]: + # + # font metrics + + metrics: list[tuple[int, int, int, int, int, int, int, int]] = [] + + fp, format, i16, i32 = self._getformat(PCF_METRICS) + + append = metrics.append + + if (format & 0xFF00) == 0x100: + # "compressed" metrics + for i in range(i16(fp.read(2))): + left = i8(fp.read(1)) - 128 + right = i8(fp.read(1)) - 128 + width = i8(fp.read(1)) - 128 + ascent = i8(fp.read(1)) - 128 + descent = i8(fp.read(1)) - 128 + xsize = right - left + ysize = ascent + descent + append((xsize, ysize, left, right, width, ascent, descent, 0)) + + else: + # "jumbo" metrics + for i in range(i32(fp.read(4))): + left = i16(fp.read(2)) + right = i16(fp.read(2)) + width = i16(fp.read(2)) + ascent = i16(fp.read(2)) + descent = i16(fp.read(2)) + attributes = i16(fp.read(2)) + xsize = right - left + ysize = ascent + descent + append((xsize, ysize, left, right, width, ascent, descent, attributes)) + + return metrics + + def _load_bitmaps( + self, metrics: list[tuple[int, int, int, int, int, int, int, int]] + ) -> list[Image.Image]: + # + # bitmap data + + fp, format, i16, i32 = self._getformat(PCF_BITMAPS) + + nbitmaps = i32(fp.read(4)) + + if nbitmaps != len(metrics): + msg = "Wrong number of bitmaps" + raise OSError(msg) + + offsets = [i32(fp.read(4)) for _ in range(nbitmaps)] + + bitmap_sizes = [i32(fp.read(4)) for _ in range(4)] + + # byteorder = format & 4 # non-zero => MSB + bitorder = format & 8 # non-zero => MSB + padindex = format & 3 + + bitmapsize = bitmap_sizes[padindex] + offsets.append(bitmapsize) + + data = fp.read(bitmapsize) + + pad = BYTES_PER_ROW[padindex] + mode = "1;R" + if bitorder: + mode = "1" + + bitmaps = [] + for i in range(nbitmaps): + xsize, ysize = metrics[i][:2] + b, e = offsets[i : i + 2] + bitmaps.append( + Image.frombytes("1", (xsize, ysize), data[b:e], "raw", mode, pad(xsize)) + ) + + return bitmaps + + def _load_encoding(self) -> list[int | None]: + fp, format, i16, i32 = self._getformat(PCF_BDF_ENCODINGS) + + first_col, last_col = i16(fp.read(2)), i16(fp.read(2)) + first_row, last_row = i16(fp.read(2)), i16(fp.read(2)) + + i16(fp.read(2)) # default + + nencoding = (last_col - first_col + 1) * (last_row - first_row + 1) + + # map character code to bitmap index + encoding: list[int | None] = [None] * min(256, nencoding) + + encoding_offsets = [i16(fp.read(2)) for _ in range(nencoding)] + + for i in range(first_col, len(encoding)): + try: + encoding_offset = encoding_offsets[ + ord(bytearray([i]).decode(self.charset_encoding)) + ] + if encoding_offset != 0xFFFF: + encoding[i] = encoding_offset + except UnicodeDecodeError: # noqa: PERF203 + # character is not supported in selected encoding + pass + + return encoding diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PcxImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PcxImagePlugin.py new file mode 100644 index 000000000..3e34e3c63 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PcxImagePlugin.py @@ -0,0 +1,232 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PCX file handling +# +# This format was originally used by ZSoft's popular PaintBrush +# program for the IBM PC. It is also supported by many MS-DOS and +# Windows applications, including the Windows PaintBrush program in +# Windows 3. +# +# history: +# 1995-09-01 fl Created +# 1996-05-20 fl Fixed RGB support +# 1997-01-03 fl Fixed 2-bit and 4-bit support +# 1999-02-03 fl Fixed 8-bit support (broken in 1.0b1) +# 1999-02-07 fl Added write support +# 2002-06-09 fl Made 2-bit and 4-bit support a bit more robust +# 2002-07-30 fl Seek from to current position, not beginning of file +# 2003-06-03 fl Extract DPI settings (info["dpi"]) +# +# Copyright (c) 1997-2003 by Secret Labs AB. +# Copyright (c) 1995-2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +import logging +from typing import IO + +from . import Image, ImageFile, ImagePalette +from ._binary import i16le as i16 +from ._binary import o8 +from ._binary import o16le as o16 + +logger = logging.getLogger(__name__) + + +def _accept(prefix: bytes) -> bool: + return len(prefix) >= 2 and prefix[0] == 10 and prefix[1] in [0, 2, 3, 5] + + +## +# Image plugin for Paintbrush images. + + +class PcxImageFile(ImageFile.ImageFile): + format = "PCX" + format_description = "Paintbrush" + + def _open(self) -> None: + # header + assert self.fp is not None + + s = self.fp.read(68) + if not _accept(s): + msg = "not a PCX file" + raise SyntaxError(msg) + + # image + bbox = i16(s, 4), i16(s, 6), i16(s, 8) + 1, i16(s, 10) + 1 + if bbox[2] <= bbox[0] or bbox[3] <= bbox[1]: + msg = "bad PCX image size" + raise SyntaxError(msg) + logger.debug("BBox: %s %s %s %s", *bbox) + + offset = self.fp.tell() + 60 + + # format + version = s[1] + bits = s[3] + planes = s[65] + provided_stride = i16(s, 66) + logger.debug( + "PCX version %s, bits %s, planes %s, stride %s", + version, + bits, + planes, + provided_stride, + ) + + self.info["dpi"] = i16(s, 12), i16(s, 14) + + if bits == 1 and planes == 1: + mode = rawmode = "1" + + elif bits == 1 and planes in (2, 4): + mode = "P" + rawmode = f"P;{planes}L" + self.palette = ImagePalette.raw("RGB", s[16:64]) + + elif version == 5 and bits == 8 and planes == 1: + mode = rawmode = "L" + # FIXME: hey, this doesn't work with the incremental loader !!! + self.fp.seek(-769, io.SEEK_END) + s = self.fp.read(769) + if len(s) == 769 and s[0] == 12: + # check if the palette is linear grayscale + for i in range(256): + if s[i * 3 + 1 : i * 3 + 4] != o8(i) * 3: + mode = rawmode = "P" + break + if mode == "P": + self.palette = ImagePalette.raw("RGB", s[1:]) + + elif version == 5 and bits == 8 and planes == 3: + mode = "RGB" + rawmode = "RGB;L" + + else: + msg = "unknown PCX mode" + raise OSError(msg) + + self._mode = mode + self._size = bbox[2] - bbox[0], bbox[3] - bbox[1] + + # Don't trust the passed in stride. + # Calculate the approximate position for ourselves. + # CVE-2020-35653 + stride = (self._size[0] * bits + 7) // 8 + + # While the specification states that this must be even, + # not all images follow this + if provided_stride != stride: + stride += stride % 2 + + bbox = (0, 0) + self.size + logger.debug("size: %sx%s", *self.size) + + self.tile = [ImageFile._Tile("pcx", bbox, offset, (rawmode, planes * stride))] + + +# -------------------------------------------------------------------- +# save PCX files + + +SAVE = { + # mode: (version, bits, planes, raw mode) + "1": (2, 1, 1, "1"), + "L": (5, 8, 1, "L"), + "P": (5, 8, 1, "P"), + "RGB": (5, 8, 3, "RGB;L"), +} + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.width == 0 or im.height == 0: + msg = "Cannot write empty image as PCX" + raise ValueError(msg) + + try: + version, bits, planes, rawmode = SAVE[im.mode] + except KeyError as e: + msg = f"Cannot save {im.mode} images as PCX" + raise ValueError(msg) from e + + # bytes per plane + stride = (im.size[0] * bits + 7) // 8 + # stride should be even + stride += stride % 2 + # Stride needs to be kept in sync with the PcxEncode.c version. + # Ideally it should be passed in in the state, but the bytes value + # gets overwritten. + + logger.debug( + "PcxImagePlugin._save: xwidth: %d, bits: %d, stride: %d", + im.size[0], + bits, + stride, + ) + + # under windows, we could determine the current screen size with + # "Image.core.display_mode()[1]", but I think that's overkill... + + screen = im.size + + dpi = 100, 100 + + # PCX header + fp.write( + o8(10) + + o8(version) + + o8(1) + + o8(bits) + + o16(0) + + o16(0) + + o16(im.size[0] - 1) + + o16(im.size[1] - 1) + + o16(dpi[0]) + + o16(dpi[1]) + + b"\0" * 24 + + b"\xff" * 24 + + b"\0" + + o8(planes) + + o16(stride) + + o16(1) + + o16(screen[0]) + + o16(screen[1]) + + b"\0" * 54 + ) + + assert fp.tell() == 128 + + ImageFile._save( + im, fp, [ImageFile._Tile("pcx", (0, 0) + im.size, 0, (rawmode, bits * planes))] + ) + + if im.mode == "P": + # colour palette + fp.write(o8(12)) + palette = im.im.getpalette("RGB", "RGB") + palette += b"\x00" * (768 - len(palette)) + fp.write(palette) # 768 bytes + elif im.mode == "L": + # grayscale palette + fp.write(o8(12)) + for i in range(256): + fp.write(o8(i) * 3) + + +# -------------------------------------------------------------------- +# registry + + +Image.register_open(PcxImageFile.format, PcxImageFile, _accept) +Image.register_save(PcxImageFile.format, _save) + +Image.register_extension(PcxImageFile.format, ".pcx") + +Image.register_mime(PcxImageFile.format, "image/x-pcx") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PdfImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PdfImagePlugin.py new file mode 100644 index 000000000..5594c7e0f --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PdfImagePlugin.py @@ -0,0 +1,311 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PDF (Acrobat) file handling +# +# History: +# 1996-07-16 fl Created +# 1997-01-18 fl Fixed header +# 2004-02-21 fl Fixes for 1/L/CMYK images, etc. +# 2004-02-24 fl Fixes for 1 and P images. +# +# Copyright (c) 1997-2004 by Secret Labs AB. All rights reserved. +# Copyright (c) 1996-1997 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +## +# Image plugin for PDF images (output only). +## +from __future__ import annotations + +import io +import math +import os +import time +from typing import IO, Any + +from . import Image, ImageFile, ImageSequence, PdfParser, features + +# +# -------------------------------------------------------------------- + +# object ids: +# 1. catalogue +# 2. pages +# 3. image +# 4. page +# 5. page contents + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + _save(im, fp, filename, save_all=True) + + +## +# (Internal) Image save plugin for the PDF format. + + +def _write_image( + im: Image.Image, + filename: str | bytes, + existing_pdf: PdfParser.PdfParser, + image_refs: list[PdfParser.IndirectReference], +) -> tuple[PdfParser.IndirectReference, str]: + # FIXME: Should replace ASCIIHexDecode with RunLengthDecode + # (packbits) or LZWDecode (tiff/lzw compression). Note that + # PDF 1.2 also supports Flatedecode (zip compression). + + params = None + decode = None + + # + # Get image characteristics + + width, height = im.size + + dict_obj: dict[str, Any] = {"BitsPerComponent": 8} + if im.mode == "1": + if features.check("libtiff"): + decode_filter = "CCITTFaxDecode" + dict_obj["BitsPerComponent"] = 1 + params = PdfParser.PdfArray( + [ + PdfParser.PdfDict( + { + "K": -1, + "BlackIs1": True, + "Columns": width, + "Rows": height, + } + ) + ] + ) + else: + decode_filter = "DCTDecode" + dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceGray") + procset = "ImageB" # grayscale + elif im.mode == "L": + decode_filter = "DCTDecode" + # params = f"<< /Predictor 15 /Columns {width-2} >>" + dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceGray") + procset = "ImageB" # grayscale + elif im.mode == "LA": + decode_filter = "JPXDecode" + # params = f"<< /Predictor 15 /Columns {width-2} >>" + procset = "ImageB" # grayscale + dict_obj["SMaskInData"] = 1 + elif im.mode == "P": + decode_filter = "ASCIIHexDecode" + palette = im.getpalette() + assert palette is not None + dict_obj["ColorSpace"] = [ + PdfParser.PdfName("Indexed"), + PdfParser.PdfName("DeviceRGB"), + len(palette) // 3 - 1, + PdfParser.PdfBinary(palette), + ] + procset = "ImageI" # indexed color + + if "transparency" in im.info: + smask = im.convert("LA").getchannel("A") + smask.encoderinfo = {} + + image_ref = _write_image(smask, filename, existing_pdf, image_refs)[0] + dict_obj["SMask"] = image_ref + elif im.mode == "RGB": + decode_filter = "DCTDecode" + dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceRGB") + procset = "ImageC" # color images + elif im.mode == "RGBA": + decode_filter = "JPXDecode" + procset = "ImageC" # color images + dict_obj["SMaskInData"] = 1 + elif im.mode == "CMYK": + decode_filter = "DCTDecode" + dict_obj["ColorSpace"] = PdfParser.PdfName("DeviceCMYK") + procset = "ImageC" # color images + decode = [1, 0, 1, 0, 1, 0, 1, 0] + else: + msg = f"cannot save mode {im.mode}" + raise ValueError(msg) + + # + # image + + op = io.BytesIO() + + if decode_filter == "ASCIIHexDecode": + ImageFile._save(im, op, [ImageFile._Tile("hex", (0, 0) + im.size, 0, im.mode)]) + elif decode_filter == "CCITTFaxDecode": + im.save( + op, + "TIFF", + compression="group4", + # use a single strip + strip_size=math.ceil(width / 8) * height, + ) + elif decode_filter == "DCTDecode": + Image.SAVE["JPEG"](im, op, filename) + elif decode_filter == "JPXDecode": + del dict_obj["BitsPerComponent"] + Image.SAVE["JPEG2000"](im, op, filename) + else: + msg = f"unsupported PDF filter ({decode_filter})" + raise ValueError(msg) + + stream = op.getvalue() + filter: PdfParser.PdfArray | PdfParser.PdfName + if decode_filter == "CCITTFaxDecode": + stream = stream[8:] + filter = PdfParser.PdfArray([PdfParser.PdfName(decode_filter)]) + else: + filter = PdfParser.PdfName(decode_filter) + + image_ref = image_refs.pop(0) + existing_pdf.write_obj( + image_ref, + stream=stream, + Type=PdfParser.PdfName("XObject"), + Subtype=PdfParser.PdfName("Image"), + Width=width, # * 72.0 / x_resolution, + Height=height, # * 72.0 / y_resolution, + Filter=filter, + Decode=decode, + DecodeParms=params, + **dict_obj, + ) + + return image_ref, procset + + +def _save( + im: Image.Image, fp: IO[bytes], filename: str | bytes, save_all: bool = False +) -> None: + is_appending = im.encoderinfo.get("append", False) + filename_str = filename.decode() if isinstance(filename, bytes) else filename + if is_appending: + existing_pdf = PdfParser.PdfParser(f=fp, filename=filename_str, mode="r+b") + else: + existing_pdf = PdfParser.PdfParser(f=fp, filename=filename_str, mode="w+b") + + dpi = im.encoderinfo.get("dpi") + if dpi: + x_resolution = dpi[0] + y_resolution = dpi[1] + else: + x_resolution = y_resolution = im.encoderinfo.get("resolution", 72.0) + + info = { + "title": ( + None if is_appending else os.path.splitext(os.path.basename(filename))[0] + ), + "author": None, + "subject": None, + "keywords": None, + "creator": None, + "producer": None, + "creationDate": None if is_appending else time.gmtime(), + "modDate": None if is_appending else time.gmtime(), + } + for k, default in info.items(): + v = im.encoderinfo.get(k) if k in im.encoderinfo else default + if v: + existing_pdf.info[k[0].upper() + k[1:]] = v + + # + # make sure image data is available + im.load() + + existing_pdf.start_writing() + existing_pdf.write_header() + existing_pdf.write_comment("created by Pillow PDF driver") + + # + # pages + ims = [im] + if save_all: + append_images = im.encoderinfo.get("append_images", []) + for append_im in append_images: + append_im.encoderinfo = im.encoderinfo.copy() + ims.append(append_im) + number_of_pages = 0 + image_refs = [] + page_refs = [] + contents_refs = [] + for im in ims: + im_number_of_pages = 1 + if save_all: + im_number_of_pages = getattr(im, "n_frames", 1) + number_of_pages += im_number_of_pages + for i in range(im_number_of_pages): + image_refs.append(existing_pdf.next_object_id(0)) + if im.mode == "P" and "transparency" in im.info: + image_refs.append(existing_pdf.next_object_id(0)) + + page_refs.append(existing_pdf.next_object_id(0)) + contents_refs.append(existing_pdf.next_object_id(0)) + existing_pdf.pages.append(page_refs[-1]) + + # + # catalog and list of pages + existing_pdf.write_catalog() + + page_number = 0 + for im_sequence in ims: + im_pages: ImageSequence.Iterator | list[Image.Image] = ( + ImageSequence.Iterator(im_sequence) if save_all else [im_sequence] + ) + for im in im_pages: + image_ref, procset = _write_image(im, filename, existing_pdf, image_refs) + + # + # page + + existing_pdf.write_page( + page_refs[page_number], + Resources=PdfParser.PdfDict( + ProcSet=[PdfParser.PdfName("PDF"), PdfParser.PdfName(procset)], + XObject=PdfParser.PdfDict(image=image_ref), + ), + MediaBox=[ + 0, + 0, + im.width * 72.0 / x_resolution, + im.height * 72.0 / y_resolution, + ], + Contents=contents_refs[page_number], + ) + + # + # page contents + + page_contents = b"q %f 0 0 %f 0 0 cm /image Do Q\n" % ( + im.width * 72.0 / x_resolution, + im.height * 72.0 / y_resolution, + ) + + existing_pdf.write_obj(contents_refs[page_number], stream=page_contents) + + page_number += 1 + + # + # trailer + existing_pdf.write_xref_and_trailer() + if hasattr(fp, "flush"): + fp.flush() + existing_pdf.close() + + +# +# -------------------------------------------------------------------- + + +Image.register_save("PDF", _save) +Image.register_save_all("PDF", _save_all) + +Image.register_extension("PDF", ".pdf") + +Image.register_mime("PDF", "application/pdf") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PdfParser.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PdfParser.py new file mode 100644 index 000000000..f7f3a4643 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PdfParser.py @@ -0,0 +1,1081 @@ +from __future__ import annotations + +import calendar +import codecs +import collections +import mmap +import os +import re +import time +import zlib +from typing import Any, NamedTuple + +TYPE_CHECKING = False +if TYPE_CHECKING: + from typing import IO + + _DictBase = collections.UserDict[str | bytes, Any] +else: + _DictBase = collections.UserDict + + +# see 7.9.2.2 Text String Type on page 86 and D.3 PDFDocEncoding Character Set +# on page 656 +def encode_text(s: str) -> bytes: + return codecs.BOM_UTF16_BE + s.encode("utf_16_be") + + +PDFDocEncoding = { + 0x16: "\u0017", + 0x18: "\u02d8", + 0x19: "\u02c7", + 0x1A: "\u02c6", + 0x1B: "\u02d9", + 0x1C: "\u02dd", + 0x1D: "\u02db", + 0x1E: "\u02da", + 0x1F: "\u02dc", + 0x80: "\u2022", + 0x81: "\u2020", + 0x82: "\u2021", + 0x83: "\u2026", + 0x84: "\u2014", + 0x85: "\u2013", + 0x86: "\u0192", + 0x87: "\u2044", + 0x88: "\u2039", + 0x89: "\u203a", + 0x8A: "\u2212", + 0x8B: "\u2030", + 0x8C: "\u201e", + 0x8D: "\u201c", + 0x8E: "\u201d", + 0x8F: "\u2018", + 0x90: "\u2019", + 0x91: "\u201a", + 0x92: "\u2122", + 0x93: "\ufb01", + 0x94: "\ufb02", + 0x95: "\u0141", + 0x96: "\u0152", + 0x97: "\u0160", + 0x98: "\u0178", + 0x99: "\u017d", + 0x9A: "\u0131", + 0x9B: "\u0142", + 0x9C: "\u0153", + 0x9D: "\u0161", + 0x9E: "\u017e", + 0xA0: "\u20ac", +} + + +def decode_text(b: bytes) -> str: + if b[: len(codecs.BOM_UTF16_BE)] == codecs.BOM_UTF16_BE: + return b[len(codecs.BOM_UTF16_BE) :].decode("utf_16_be") + else: + return "".join(PDFDocEncoding.get(byte, chr(byte)) for byte in b) + + +class PdfFormatError(RuntimeError): + """An error that probably indicates a syntactic or semantic error in the + PDF file structure""" + + pass + + +def check_format_condition(condition: bool, error_message: str) -> None: + if not condition: + raise PdfFormatError(error_message) + + +class IndirectReferenceTuple(NamedTuple): + object_id: int + generation: int + + +class IndirectReference(IndirectReferenceTuple): + def __str__(self) -> str: + return f"{self.object_id} {self.generation} R" + + def __bytes__(self) -> bytes: + return self.__str__().encode("us-ascii") + + def __eq__(self, other: object) -> bool: + if self.__class__ is not other.__class__: + return False + assert isinstance(other, IndirectReference) + return other.object_id == self.object_id and other.generation == self.generation + + def __ne__(self, other: object) -> bool: + return not (self == other) + + def __hash__(self) -> int: + return hash((self.object_id, self.generation)) + + +class IndirectObjectDef(IndirectReference): + def __str__(self) -> str: + return f"{self.object_id} {self.generation} obj" + + +class XrefTable: + def __init__(self) -> None: + self.existing_entries: dict[int, tuple[int, int]] = ( + {} + ) # object ID => (offset, generation) + self.new_entries: dict[int, tuple[int, int]] = ( + {} + ) # object ID => (offset, generation) + self.deleted_entries = {0: 65536} # object ID => generation + self.reading_finished = False + + def __setitem__(self, key: int, value: tuple[int, int]) -> None: + if self.reading_finished: + self.new_entries[key] = value + else: + self.existing_entries[key] = value + if key in self.deleted_entries: + del self.deleted_entries[key] + + def __getitem__(self, key: int) -> tuple[int, int]: + try: + return self.new_entries[key] + except KeyError: + return self.existing_entries[key] + + def __delitem__(self, key: int) -> None: + if key in self.new_entries: + generation = self.new_entries[key][1] + 1 + del self.new_entries[key] + self.deleted_entries[key] = generation + elif key in self.existing_entries: + generation = self.existing_entries[key][1] + 1 + self.deleted_entries[key] = generation + elif key in self.deleted_entries: + generation = self.deleted_entries[key] + else: + msg = f"object ID {key} cannot be deleted because it doesn't exist" + raise IndexError(msg) + + def __contains__(self, key: int) -> bool: + return key in self.existing_entries or key in self.new_entries + + def __len__(self) -> int: + return len( + set(self.existing_entries.keys()) + | set(self.new_entries.keys()) + | set(self.deleted_entries.keys()) + ) + + def keys(self) -> set[int]: + return ( + set(self.existing_entries.keys()) - set(self.deleted_entries.keys()) + ) | set(self.new_entries.keys()) + + def write(self, f: IO[bytes]) -> int: + keys = sorted(set(self.new_entries.keys()) | set(self.deleted_entries.keys())) + deleted_keys = sorted(set(self.deleted_entries.keys())) + startxref = f.tell() + f.write(b"xref\n") + while keys: + # find a contiguous sequence of object IDs + prev: int | None = None + for index, key in enumerate(keys): + if prev is None or prev + 1 == key: + prev = key + else: + contiguous_keys = keys[:index] + keys = keys[index:] + break + else: + contiguous_keys = keys + keys = [] + f.write(b"%d %d\n" % (contiguous_keys[0], len(contiguous_keys))) + for object_id in contiguous_keys: + if object_id in self.new_entries: + f.write(b"%010d %05d n \n" % self.new_entries[object_id]) + else: + this_deleted_object_id = deleted_keys.pop(0) + check_format_condition( + object_id == this_deleted_object_id, + f"expected the next deleted object ID to be {object_id}, " + f"instead found {this_deleted_object_id}", + ) + try: + next_in_linked_list = deleted_keys[0] + except IndexError: + next_in_linked_list = 0 + f.write( + b"%010d %05d f \n" + % (next_in_linked_list, self.deleted_entries[object_id]) + ) + return startxref + + +class PdfName: + name: bytes + + def __init__(self, name: PdfName | bytes | str) -> None: + if isinstance(name, PdfName): + self.name = name.name + elif isinstance(name, bytes): + self.name = name + else: + self.name = name.encode("us-ascii") + + def name_as_str(self) -> str: + return self.name.decode("us-ascii") + + def __eq__(self, other: object) -> bool: + return ( + isinstance(other, PdfName) and other.name == self.name + ) or other == self.name + + def __hash__(self) -> int: + return hash(self.name) + + def __repr__(self) -> str: + return f"{self.__class__.__name__}({repr(self.name)})" + + @classmethod + def from_pdf_stream(cls, data: bytes) -> PdfName: + return cls(PdfParser.interpret_name(data)) + + allowed_chars = set(range(33, 127)) - {ord(c) for c in "#%/()<>[]{}"} + + def __bytes__(self) -> bytes: + result = bytearray(b"/") + for b in self.name: + if b in self.allowed_chars: + result.append(b) + else: + result.extend(b"#%02X" % b) + return bytes(result) + + +class PdfArray(list[Any]): + def __bytes__(self) -> bytes: + return b"[ " + b" ".join(pdf_repr(x) for x in self) + b" ]" + + +class PdfDict(_DictBase): + def __setattr__(self, key: str, value: Any) -> None: + if key == "data": + collections.UserDict.__setattr__(self, key, value) + else: + self[key.encode("us-ascii")] = value + + def __getattr__(self, key: str) -> str | time.struct_time: + try: + value = self[key.encode("us-ascii")] + except KeyError as e: + raise AttributeError(key) from e + if isinstance(value, bytes): + value = decode_text(value) + if key.endswith("Date"): + if value.startswith("D:"): + value = value[2:] + + relationship = "Z" + if len(value) > 17: + relationship = value[14] + offset = int(value[15:17]) * 60 + if len(value) > 20: + offset += int(value[18:20]) + + format = "%Y%m%d%H%M%S"[: len(value) - 2] + value = time.strptime(value[: len(format) + 2], format) + if relationship in ["+", "-"]: + offset *= 60 + if relationship == "+": + offset *= -1 + value = time.gmtime(calendar.timegm(value) + offset) + return value + + def __bytes__(self) -> bytes: + out = bytearray(b"<<") + for key, value in self.items(): + if value is None: + continue + value = pdf_repr(value) + out.extend(b"\n") + out.extend(bytes(PdfName(key))) + out.extend(b" ") + out.extend(value) + out.extend(b"\n>>") + return bytes(out) + + +class PdfBinary: + def __init__(self, data: list[int] | bytes) -> None: + self.data = data + + def __bytes__(self) -> bytes: + return b"<%s>" % b"".join(b"%02X" % b for b in self.data) + + +class PdfStream: + def __init__(self, dictionary: PdfDict, buf: bytes) -> None: + self.dictionary = dictionary + self.buf = buf + + def decode(self) -> bytes: + try: + filter = self.dictionary[b"Filter"] + except KeyError: + return self.buf + if filter == b"FlateDecode": + try: + expected_length = self.dictionary[b"DL"] + except KeyError: + expected_length = self.dictionary[b"Length"] + return zlib.decompress(self.buf, bufsize=int(expected_length)) + else: + msg = f"stream filter {repr(filter)} unknown/unsupported" + raise NotImplementedError(msg) + + +def pdf_repr(x: Any) -> bytes: + if x is True: + return b"true" + elif x is False: + return b"false" + elif x is None: + return b"null" + elif isinstance(x, (PdfName, PdfDict, PdfArray, PdfBinary)): + return bytes(x) + elif isinstance(x, (int, float)): + return str(x).encode("us-ascii") + elif isinstance(x, time.struct_time): + return b"(D:" + time.strftime("%Y%m%d%H%M%SZ", x).encode("us-ascii") + b")" + elif isinstance(x, dict): + return bytes(PdfDict(x)) + elif isinstance(x, list): + return bytes(PdfArray(x)) + elif isinstance(x, str): + return pdf_repr(encode_text(x)) + elif isinstance(x, bytes): + # XXX escape more chars? handle binary garbage + x = x.replace(b"\\", b"\\\\") + x = x.replace(b"(", b"\\(") + x = x.replace(b")", b"\\)") + return b"(" + x + b")" + else: + return bytes(x) + + +class PdfParser: + """Based on + https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/PDF32000_2008.pdf + Supports PDF up to 1.4 + """ + + def __init__( + self, + filename: str | None = None, + f: IO[bytes] | None = None, + buf: bytes | bytearray | None = None, + start_offset: int = 0, + mode: str = "rb", + ) -> None: + if buf and f: + msg = "specify buf or f or filename, but not both buf and f" + raise RuntimeError(msg) + self.filename = filename + self.buf: bytes | bytearray | mmap.mmap | None = buf + self.f = f + self.start_offset = start_offset + self.should_close_buf = False + self.should_close_file = False + if filename is not None and f is None: + self.f = f = open(filename, mode) + self.should_close_file = True + if f is not None: + self.buf = self.get_buf_from_file(f) + self.should_close_buf = True + if not filename and hasattr(f, "name"): + self.filename = f.name + self.cached_objects: dict[IndirectReference, Any] = {} + self.root_ref: IndirectReference | None + self.info_ref: IndirectReference | None + self.pages_ref: IndirectReference | None + self.last_xref_section_offset: int | None + if self.buf: + self.read_pdf_info() + else: + self.file_size_total = self.file_size_this = 0 + self.root = PdfDict() + self.root_ref = None + self.info = PdfDict() + self.info_ref = None + self.page_tree_root = PdfDict() + self.pages: list[IndirectReference] = [] + self.orig_pages: list[IndirectReference] = [] + self.pages_ref = None + self.last_xref_section_offset = None + self.trailer_dict: dict[bytes, Any] = {} + self.xref_table = XrefTable() + self.xref_table.reading_finished = True + if f: + self.seek_end() + + def __enter__(self) -> PdfParser: + return self + + def __exit__(self, *args: object) -> None: + self.close() + + def start_writing(self) -> None: + self.close_buf() + self.seek_end() + + def close_buf(self) -> None: + if isinstance(self.buf, mmap.mmap): + self.buf.close() + self.buf = None + + def close(self) -> None: + if self.should_close_buf: + self.close_buf() + if self.f is not None and self.should_close_file: + self.f.close() + self.f = None + + def seek_end(self) -> None: + assert self.f is not None + self.f.seek(0, os.SEEK_END) + + def write_header(self) -> None: + assert self.f is not None + self.f.write(b"%PDF-1.4\n") + + def write_comment(self, s: str) -> None: + assert self.f is not None + self.f.write(f"% {s}\n".encode()) + + def write_catalog(self) -> IndirectReference: + assert self.f is not None + self.del_root() + self.root_ref = self.next_object_id(self.f.tell()) + self.pages_ref = self.next_object_id(0) + self.rewrite_pages() + self.write_obj(self.root_ref, Type=PdfName(b"Catalog"), Pages=self.pages_ref) + self.write_obj( + self.pages_ref, + Type=PdfName(b"Pages"), + Count=len(self.pages), + Kids=self.pages, + ) + return self.root_ref + + def rewrite_pages(self) -> None: + pages_tree_nodes_to_delete = [] + for i, page_ref in enumerate(self.orig_pages): + page_info = self.cached_objects[page_ref] + del self.xref_table[page_ref.object_id] + pages_tree_nodes_to_delete.append(page_info[PdfName(b"Parent")]) + if page_ref not in self.pages: + # the page has been deleted + continue + # make dict keys into strings for passing to write_page + stringified_page_info = {} + for key, value in page_info.items(): + # key should be a PdfName + stringified_page_info[key.name_as_str()] = value + stringified_page_info["Parent"] = self.pages_ref + new_page_ref = self.write_page(None, **stringified_page_info) + for j, cur_page_ref in enumerate(self.pages): + if cur_page_ref == page_ref: + # replace the page reference with the new one + self.pages[j] = new_page_ref + # delete redundant Pages tree nodes from xref table + for pages_tree_node_ref in pages_tree_nodes_to_delete: + while pages_tree_node_ref: + pages_tree_node = self.cached_objects[pages_tree_node_ref] + if pages_tree_node_ref.object_id in self.xref_table: + del self.xref_table[pages_tree_node_ref.object_id] + pages_tree_node_ref = pages_tree_node.get(b"Parent", None) + self.orig_pages = [] + + def write_xref_and_trailer( + self, new_root_ref: IndirectReference | None = None + ) -> None: + assert self.f is not None + if new_root_ref: + self.del_root() + self.root_ref = new_root_ref + if self.info: + self.info_ref = self.write_obj(None, self.info) + start_xref = self.xref_table.write(self.f) + num_entries = len(self.xref_table) + trailer_dict: dict[str | bytes, Any] = { + b"Root": self.root_ref, + b"Size": num_entries, + } + if self.last_xref_section_offset is not None: + trailer_dict[b"Prev"] = self.last_xref_section_offset + if self.info: + trailer_dict[b"Info"] = self.info_ref + self.last_xref_section_offset = start_xref + self.f.write( + b"trailer\n" + + bytes(PdfDict(trailer_dict)) + + b"\nstartxref\n%d\n%%%%EOF" % start_xref + ) + + def write_page( + self, ref: int | IndirectReference | None, *objs: Any, **dict_obj: Any + ) -> IndirectReference: + obj_ref = self.pages[ref] if isinstance(ref, int) else ref + if "Type" not in dict_obj: + dict_obj["Type"] = PdfName(b"Page") + if "Parent" not in dict_obj: + dict_obj["Parent"] = self.pages_ref + return self.write_obj(obj_ref, *objs, **dict_obj) + + def write_obj( + self, ref: IndirectReference | None, *objs: Any, **dict_obj: Any + ) -> IndirectReference: + assert self.f is not None + f = self.f + if ref is None: + ref = self.next_object_id(f.tell()) + else: + self.xref_table[ref.object_id] = (f.tell(), ref.generation) + f.write(bytes(IndirectObjectDef(*ref))) + stream = dict_obj.pop("stream", None) + if stream is not None: + dict_obj["Length"] = len(stream) + if dict_obj: + f.write(pdf_repr(dict_obj)) + for obj in objs: + f.write(pdf_repr(obj)) + if stream is not None: + f.write(b"stream\n") + f.write(stream) + f.write(b"\nendstream\n") + f.write(b"endobj\n") + return ref + + def del_root(self) -> None: + if self.root_ref is None: + return + del self.xref_table[self.root_ref.object_id] + del self.xref_table[self.root[b"Pages"].object_id] + + @staticmethod + def get_buf_from_file(f: IO[bytes]) -> bytes | mmap.mmap: + if hasattr(f, "getbuffer"): + return f.getbuffer() + elif hasattr(f, "getvalue"): + return f.getvalue() + else: + try: + return mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ) + except ValueError: # cannot mmap an empty file + return b"" + + def read_pdf_info(self) -> None: + assert self.buf is not None + self.file_size_total = len(self.buf) + self.file_size_this = self.file_size_total - self.start_offset + self.read_trailer() + check_format_condition( + self.trailer_dict.get(b"Root") is not None, "Root is missing" + ) + self.root_ref = self.trailer_dict[b"Root"] + assert self.root_ref is not None + self.info_ref = self.trailer_dict.get(b"Info", None) + self.root = PdfDict(self.read_indirect(self.root_ref)) + if self.info_ref is None: + self.info = PdfDict() + else: + self.info = PdfDict(self.read_indirect(self.info_ref)) + check_format_condition(b"Type" in self.root, "/Type missing in Root") + check_format_condition( + self.root[b"Type"] == b"Catalog", "/Type in Root is not /Catalog" + ) + check_format_condition( + self.root.get(b"Pages") is not None, "/Pages missing in Root" + ) + check_format_condition( + isinstance(self.root[b"Pages"], IndirectReference), + "/Pages in Root is not an indirect reference", + ) + self.pages_ref = self.root[b"Pages"] + assert self.pages_ref is not None + self.page_tree_root = self.read_indirect(self.pages_ref) + self.pages = self.linearize_page_tree(self.page_tree_root) + # save the original list of page references + # in case the user modifies, adds or deletes some pages + # and we need to rewrite the pages and their list + self.orig_pages = self.pages[:] + + def next_object_id(self, offset: int | None = None) -> IndirectReference: + try: + # TODO: support reuse of deleted objects + reference = IndirectReference(max(self.xref_table.keys()) + 1, 0) + except ValueError: + reference = IndirectReference(1, 0) + if offset is not None: + self.xref_table[reference.object_id] = (offset, 0) + return reference + + delimiter = rb"[][()<>{}/%]" + delimiter_or_ws = rb"[][()<>{}/%\000\011\012\014\015\040]" + whitespace = rb"[\000\011\012\014\015\040]" + whitespace_or_hex = rb"[\000\011\012\014\015\0400-9a-fA-F]" + whitespace_optional = whitespace + b"*" + whitespace_mandatory = whitespace + b"+" + # No "\012" aka "\n" or "\015" aka "\r": + whitespace_optional_no_nl = rb"[\000\011\014\040]*" + newline_only = rb"[\r\n]+" + newline = whitespace_optional_no_nl + newline_only + whitespace_optional_no_nl + re_trailer_end = re.compile( + whitespace_mandatory + + rb"trailer" + + whitespace_optional + + rb"<<(.*>>)" + + newline + + rb"startxref" + + newline + + rb"([0-9]+)" + + newline + + rb"%%EOF" + + whitespace_optional + + rb"$", + re.DOTALL, + ) + re_trailer_prev = re.compile( + whitespace_optional + + rb"trailer" + + whitespace_optional + + rb"<<(.*?>>)" + + newline + + rb"startxref" + + newline + + rb"([0-9]+)" + + newline + + rb"%%EOF" + + whitespace_optional, + re.DOTALL, + ) + + def read_trailer(self) -> None: + assert self.buf is not None + search_start_offset = len(self.buf) - 16384 + if search_start_offset < self.start_offset: + search_start_offset = self.start_offset + m = self.re_trailer_end.search(self.buf, search_start_offset) + check_format_condition(m is not None, "trailer end not found") + # make sure we found the LAST trailer + last_match = m + while m: + last_match = m + m = self.re_trailer_end.search(self.buf, m.start() + 16) + if not m: + m = last_match + assert m is not None + trailer_data = m.group(1) + self.last_xref_section_offset = int(m.group(2)) + self.trailer_dict = self.interpret_trailer(trailer_data) + self.xref_table = XrefTable() + self.read_xref_table(xref_section_offset=self.last_xref_section_offset) + if b"Prev" in self.trailer_dict: + self.read_prev_trailer(self.trailer_dict[b"Prev"]) + + def read_prev_trailer( + self, xref_section_offset: int, processed_offsets: list[int] = [] + ) -> None: + assert self.buf is not None + trailer_offset = self.read_xref_table(xref_section_offset=xref_section_offset) + m = self.re_trailer_prev.search( + self.buf[trailer_offset : trailer_offset + 16384] + ) + check_format_condition(m is not None, "previous trailer not found") + assert m is not None + trailer_data = m.group(1) + check_format_condition( + int(m.group(2)) == xref_section_offset, + "xref section offset in previous trailer doesn't match what was expected", + ) + trailer_dict = self.interpret_trailer(trailer_data) + if b"Prev" in trailer_dict: + processed_offsets.append(xref_section_offset) + check_format_condition( + trailer_dict[b"Prev"] not in processed_offsets, "trailer loop found" + ) + self.read_prev_trailer(trailer_dict[b"Prev"], processed_offsets) + + re_whitespace_optional = re.compile(whitespace_optional) + re_name = re.compile( + whitespace_optional + + rb"/([!-$&'*-.0-;=?-Z\\^-z|~]+)(?=" + + delimiter_or_ws + + rb")" + ) + re_dict_start = re.compile(whitespace_optional + rb"<<") + re_dict_end = re.compile(whitespace_optional + rb">>" + whitespace_optional) + + @classmethod + def interpret_trailer(cls, trailer_data: bytes) -> dict[bytes, Any]: + trailer = {} + offset = 0 + while True: + m = cls.re_name.match(trailer_data, offset) + if not m: + m = cls.re_dict_end.match(trailer_data, offset) + check_format_condition( + m is not None and m.end() == len(trailer_data), + "name not found in trailer, remaining data: " + + repr(trailer_data[offset:]), + ) + break + key = cls.interpret_name(m.group(1)) + assert isinstance(key, bytes) + value, value_offset = cls.get_value(trailer_data, m.end()) + trailer[key] = value + if value_offset is None: + break + offset = value_offset + check_format_condition( + b"Size" in trailer and isinstance(trailer[b"Size"], int), + "/Size not in trailer or not an integer", + ) + check_format_condition( + b"Root" in trailer and isinstance(trailer[b"Root"], IndirectReference), + "/Root not in trailer or not an indirect reference", + ) + return trailer + + re_hashes_in_name = re.compile(rb"([^#]*)(#([0-9a-fA-F]{2}))?") + + @classmethod + def interpret_name(cls, raw: bytes, as_text: bool = False) -> str | bytes: + name = b"" + for m in cls.re_hashes_in_name.finditer(raw): + if m.group(3): + name += m.group(1) + bytearray.fromhex(m.group(3).decode("us-ascii")) + else: + name += m.group(1) + if as_text: + return name.decode("utf-8") + else: + return bytes(name) + + re_null = re.compile(whitespace_optional + rb"null(?=" + delimiter_or_ws + rb")") + re_true = re.compile(whitespace_optional + rb"true(?=" + delimiter_or_ws + rb")") + re_false = re.compile(whitespace_optional + rb"false(?=" + delimiter_or_ws + rb")") + re_int = re.compile( + whitespace_optional + rb"([-+]?[0-9]+)(?=" + delimiter_or_ws + rb")" + ) + re_real = re.compile( + whitespace_optional + + rb"([-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9]+))(?=" + + delimiter_or_ws + + rb")" + ) + re_array_start = re.compile(whitespace_optional + rb"\[") + re_array_end = re.compile(whitespace_optional + rb"]") + re_string_hex = re.compile( + whitespace_optional + rb"<(" + whitespace_or_hex + rb"*)>" + ) + re_string_lit = re.compile(whitespace_optional + rb"\(") + re_indirect_reference = re.compile( + whitespace_optional + + rb"([-+]?[0-9]+)" + + whitespace_mandatory + + rb"([-+]?[0-9]+)" + + whitespace_mandatory + + rb"R(?=" + + delimiter_or_ws + + rb")" + ) + re_indirect_def_start = re.compile( + whitespace_optional + + rb"([-+]?[0-9]+)" + + whitespace_mandatory + + rb"([-+]?[0-9]+)" + + whitespace_mandatory + + rb"obj(?=" + + delimiter_or_ws + + rb")" + ) + re_indirect_def_end = re.compile( + whitespace_optional + rb"endobj(?=" + delimiter_or_ws + rb")" + ) + re_comment = re.compile( + rb"(" + whitespace_optional + rb"%[^\r\n]*" + newline + rb")*" + ) + re_stream_start = re.compile(whitespace_optional + rb"stream\r?\n") + re_stream_end = re.compile( + whitespace_optional + rb"endstream(?=" + delimiter_or_ws + rb")" + ) + + @classmethod + def get_value( + cls, + data: bytes | bytearray | mmap.mmap, + offset: int, + expect_indirect: IndirectReference | None = None, + max_nesting: int = -1, + ) -> tuple[Any, int | None]: + if max_nesting == 0: + return None, None + m = cls.re_comment.match(data, offset) + if m: + offset = m.end() + m = cls.re_indirect_def_start.match(data, offset) + if m: + check_format_condition( + int(m.group(1)) > 0, + "indirect object definition: object ID must be greater than 0", + ) + check_format_condition( + int(m.group(2)) >= 0, + "indirect object definition: generation must be non-negative", + ) + check_format_condition( + expect_indirect is None + or expect_indirect + == IndirectReference(int(m.group(1)), int(m.group(2))), + "indirect object definition different than expected", + ) + object, object_offset = cls.get_value( + data, m.end(), max_nesting=max_nesting - 1 + ) + if object_offset is None: + return object, None + m = cls.re_indirect_def_end.match(data, object_offset) + check_format_condition( + m is not None, "indirect object definition end not found" + ) + assert m is not None + return object, m.end() + check_format_condition( + not expect_indirect, "indirect object definition not found" + ) + m = cls.re_indirect_reference.match(data, offset) + if m: + check_format_condition( + int(m.group(1)) > 0, + "indirect object reference: object ID must be greater than 0", + ) + check_format_condition( + int(m.group(2)) >= 0, + "indirect object reference: generation must be non-negative", + ) + return IndirectReference(int(m.group(1)), int(m.group(2))), m.end() + m = cls.re_dict_start.match(data, offset) + if m: + offset = m.end() + result: dict[Any, Any] = {} + m = cls.re_dict_end.match(data, offset) + current_offset: int | None = offset + while not m: + assert current_offset is not None + key, current_offset = cls.get_value( + data, current_offset, max_nesting=max_nesting - 1 + ) + if current_offset is None: + return result, None + value, current_offset = cls.get_value( + data, current_offset, max_nesting=max_nesting - 1 + ) + result[key] = value + if current_offset is None: + return result, None + m = cls.re_dict_end.match(data, current_offset) + current_offset = m.end() + m = cls.re_stream_start.match(data, current_offset) + if m: + stream_len = result.get(b"Length") + if stream_len is None or not isinstance(stream_len, int): + msg = f"bad or missing Length in stream dict ({stream_len})" + raise PdfFormatError(msg) + stream_data = data[m.end() : m.end() + stream_len] + m = cls.re_stream_end.match(data, m.end() + stream_len) + check_format_condition(m is not None, "stream end not found") + assert m is not None + current_offset = m.end() + return PdfStream(PdfDict(result), stream_data), current_offset + return PdfDict(result), current_offset + m = cls.re_array_start.match(data, offset) + if m: + offset = m.end() + results = [] + m = cls.re_array_end.match(data, offset) + current_offset = offset + while not m: + assert current_offset is not None + value, current_offset = cls.get_value( + data, current_offset, max_nesting=max_nesting - 1 + ) + results.append(value) + if current_offset is None: + return results, None + m = cls.re_array_end.match(data, current_offset) + return results, m.end() + m = cls.re_null.match(data, offset) + if m: + return None, m.end() + m = cls.re_true.match(data, offset) + if m: + return True, m.end() + m = cls.re_false.match(data, offset) + if m: + return False, m.end() + m = cls.re_name.match(data, offset) + if m: + return PdfName(cls.interpret_name(m.group(1))), m.end() + m = cls.re_int.match(data, offset) + if m: + return int(m.group(1)), m.end() + m = cls.re_real.match(data, offset) + if m: + # XXX Decimal instead of float??? + return float(m.group(1)), m.end() + m = cls.re_string_hex.match(data, offset) + if m: + # filter out whitespace + hex_string = bytearray( + b for b in m.group(1) if b in b"0123456789abcdefABCDEF" + ) + if len(hex_string) % 2 == 1: + # append a 0 if the length is not even - yes, at the end + hex_string.append(ord(b"0")) + return bytearray.fromhex(hex_string.decode("us-ascii")), m.end() + m = cls.re_string_lit.match(data, offset) + if m: + return cls.get_literal_string(data, m.end()) + # return None, offset # fallback (only for debugging) + msg = f"unrecognized object: {repr(data[offset : offset + 32])}" + raise PdfFormatError(msg) + + re_lit_str_token = re.compile( + rb"(\\[nrtbf()\\])|(\\[0-9]{1,3})|(\\(\r\n|\r|\n))|(\r\n|\r|\n)|(\()|(\))" + ) + escaped_chars = { + b"n": b"\n", + b"r": b"\r", + b"t": b"\t", + b"b": b"\b", + b"f": b"\f", + b"(": b"(", + b")": b")", + b"\\": b"\\", + ord(b"n"): b"\n", + ord(b"r"): b"\r", + ord(b"t"): b"\t", + ord(b"b"): b"\b", + ord(b"f"): b"\f", + ord(b"("): b"(", + ord(b")"): b")", + ord(b"\\"): b"\\", + } + + @classmethod + def get_literal_string( + cls, data: bytes | bytearray | mmap.mmap, offset: int + ) -> tuple[bytes, int]: + nesting_depth = 0 + result = bytearray() + for m in cls.re_lit_str_token.finditer(data, offset): + result.extend(data[offset : m.start()]) + if m.group(1): + result.extend(cls.escaped_chars[m.group(1)[1]]) + elif m.group(2): + result.append(int(m.group(2)[1:], 8)) + elif m.group(3): + pass + elif m.group(5): + result.extend(b"\n") + elif m.group(6): + result.extend(b"(") + nesting_depth += 1 + elif m.group(7): + if nesting_depth == 0: + return bytes(result), m.end() + result.extend(b")") + nesting_depth -= 1 + offset = m.end() + msg = "unfinished literal string" + raise PdfFormatError(msg) + + re_xref_section_start = re.compile(whitespace_optional + rb"xref" + newline) + re_xref_subsection_start = re.compile( + whitespace_optional + + rb"([0-9]+)" + + whitespace_mandatory + + rb"([0-9]+)" + + whitespace_optional + + newline_only + ) + re_xref_entry = re.compile(rb"([0-9]{10}) ([0-9]{5}) ([fn])( \r| \n|\r\n)") + + def read_xref_table(self, xref_section_offset: int) -> int: + assert self.buf is not None + subsection_found = False + m = self.re_xref_section_start.match( + self.buf, xref_section_offset + self.start_offset + ) + check_format_condition(m is not None, "xref section start not found") + assert m is not None + offset = m.end() + while True: + m = self.re_xref_subsection_start.match(self.buf, offset) + if not m: + check_format_condition( + subsection_found, "xref subsection start not found" + ) + break + subsection_found = True + offset = m.end() + first_object = int(m.group(1)) + num_objects = int(m.group(2)) + for i in range(first_object, first_object + num_objects): + m = self.re_xref_entry.match(self.buf, offset) + check_format_condition(m is not None, "xref entry not found") + assert m is not None + offset = m.end() + is_free = m.group(3) == b"f" + if not is_free: + generation = int(m.group(2)) + new_entry = (int(m.group(1)), generation) + if i not in self.xref_table: + self.xref_table[i] = new_entry + return offset + + def read_indirect(self, ref: IndirectReference, max_nesting: int = -1) -> Any: + offset, generation = self.xref_table[ref[0]] + check_format_condition( + generation == ref[1], + f"expected to find generation {ref[1]} for object ID {ref[0]} in xref " + f"table, instead found generation {generation} at offset {offset}", + ) + assert self.buf is not None + value = self.get_value( + self.buf, + offset + self.start_offset, + expect_indirect=IndirectReference(*ref), + max_nesting=max_nesting, + )[0] + self.cached_objects[ref] = value + return value + + def linearize_page_tree( + self, node: PdfDict | None = None + ) -> list[IndirectReference]: + page_node = node if node is not None else self.page_tree_root + check_format_condition( + page_node[b"Type"] == b"Pages", "/Type of page tree node is not /Pages" + ) + pages = [] + for kid in page_node[b"Kids"]: + kid_object = self.read_indirect(kid) + if kid_object[b"Type"] == b"Page": + pages.append(kid) + else: + pages.extend(self.linearize_page_tree(node=kid_object)) + return pages diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PixarImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PixarImagePlugin.py new file mode 100644 index 000000000..d2b6d0a97 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PixarImagePlugin.py @@ -0,0 +1,72 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PIXAR raster support for PIL +# +# history: +# 97-01-29 fl Created +# +# notes: +# This is incomplete; it is based on a few samples created with +# Photoshop 2.5 and 3.0, and a summary description provided by +# Greg Coats . Hopefully, "L" and +# "RGBA" support will be added in future versions. +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1997. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image, ImageFile +from ._binary import i16le as i16 + +# +# helpers + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(b"\200\350\000\000") + + +## +# Image plugin for PIXAR raster images. + + +class PixarImageFile(ImageFile.ImageFile): + format = "PIXAR" + format_description = "PIXAR raster image" + + def _open(self) -> None: + # assuming a 4-byte magic label + assert self.fp is not None + + s = self.fp.read(4) + if not _accept(s): + msg = "not a PIXAR file" + raise SyntaxError(msg) + + # read rest of header + s = s + self.fp.read(508) + + self._size = i16(s, 418), i16(s, 416) + + # get channel/depth descriptions + mode = i16(s, 424), i16(s, 426) + + if mode == (14, 2): + self._mode = "RGB" + # FIXME: to be continued... + + # create tile descriptor (assuming "dumped") + self.tile = [ImageFile._Tile("raw", (0, 0) + self.size, 1024, self.mode)] + + +# +# -------------------------------------------------------------------- + +Image.register_open(PixarImageFile.format, PixarImageFile, _accept) + +Image.register_extension(PixarImageFile.format, ".pxr") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py new file mode 100644 index 000000000..76a15bd0d --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PngImagePlugin.py @@ -0,0 +1,1563 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PNG support code +# +# See "PNG (Portable Network Graphics) Specification, version 1.0; +# W3C Recommendation", 1996-10-01, Thomas Boutell (ed.). +# +# history: +# 1996-05-06 fl Created (couldn't resist it) +# 1996-12-14 fl Upgraded, added read and verify support (0.2) +# 1996-12-15 fl Separate PNG stream parser +# 1996-12-29 fl Added write support, added getchunks +# 1996-12-30 fl Eliminated circular references in decoder (0.3) +# 1998-07-12 fl Read/write 16-bit images as mode I (0.4) +# 2001-02-08 fl Added transparency support (from Zircon) (0.5) +# 2001-04-16 fl Don't close data source in "open" method (0.6) +# 2004-02-24 fl Don't even pretend to support interlaced files (0.7) +# 2004-08-31 fl Do basic sanity check on chunk identifiers (0.8) +# 2004-09-20 fl Added PngInfo chunk container +# 2004-12-18 fl Added DPI read support (based on code by Niki Spahiev) +# 2008-08-13 fl Added tRNS support for RGB images +# 2009-03-06 fl Support for preserving ICC profiles (by Florian Hoech) +# 2009-03-08 fl Added zTXT support (from Lowell Alleman) +# 2009-03-29 fl Read interlaced PNG files (from Conrado Porto Lopes Gouvua) +# +# Copyright (c) 1997-2009 by Secret Labs AB +# Copyright (c) 1996 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import itertools +import logging +import re +import struct +import warnings +import zlib +from enum import IntEnum +from fractions import Fraction +from typing import IO, NamedTuple, cast + +from . import Image, ImageChops, ImageFile, ImagePalette, ImageSequence +from ._binary import i16be as i16 +from ._binary import i32be as i32 +from ._binary import o8 +from ._binary import o16be as o16 +from ._binary import o32be as o32 +from ._deprecate import deprecate +from ._util import DeferredError + +TYPE_CHECKING = False +if TYPE_CHECKING: + from collections.abc import Callable + from typing import Any, NoReturn + + from . import _imaging + +logger = logging.getLogger(__name__) + +is_cid = re.compile(rb"\w\w\w\w").match + + +_MAGIC = b"\211PNG\r\n\032\n" + + +_MODES = { + # supported bits/color combinations, and corresponding modes/rawmodes + # Grayscale + (1, 0): ("1", "1"), + (2, 0): ("L", "L;2"), + (4, 0): ("L", "L;4"), + (8, 0): ("L", "L"), + (16, 0): ("I;16", "I;16B"), + # Truecolour + (8, 2): ("RGB", "RGB"), + (16, 2): ("RGB", "RGB;16B"), + # Indexed-colour + (1, 3): ("P", "P;1"), + (2, 3): ("P", "P;2"), + (4, 3): ("P", "P;4"), + (8, 3): ("P", "P"), + # Grayscale with alpha + (8, 4): ("LA", "LA"), + (16, 4): ("RGBA", "LA;16B"), # LA;16B->LA not yet available + # Truecolour with alpha + (8, 6): ("RGBA", "RGBA"), + (16, 6): ("RGBA", "RGBA;16B"), +} + + +_simple_palette = re.compile(b"^\xff*\x00\xff*$") + +MAX_TEXT_CHUNK = ImageFile.SAFEBLOCK +""" +Maximum decompressed size for a iTXt or zTXt chunk. +Eliminates decompression bombs where compressed chunks can expand 1000x. +See :ref:`Text in PNG File Format`. +""" +MAX_TEXT_MEMORY = 64 * MAX_TEXT_CHUNK +""" +Set the maximum total text chunk size. +See :ref:`Text in PNG File Format`. +""" + + +# APNG frame disposal modes +class Disposal(IntEnum): + OP_NONE = 0 + """ + No disposal is done on this frame before rendering the next frame. + See :ref:`Saving APNG sequences`. + """ + OP_BACKGROUND = 1 + """ + This frame’s modified region is cleared to fully transparent black before rendering + the next frame. + See :ref:`Saving APNG sequences`. + """ + OP_PREVIOUS = 2 + """ + This frame’s modified region is reverted to the previous frame’s contents before + rendering the next frame. + See :ref:`Saving APNG sequences`. + """ + + +# APNG frame blend modes +class Blend(IntEnum): + OP_SOURCE = 0 + """ + All color components of this frame, including alpha, overwrite the previous output + image contents. + See :ref:`Saving APNG sequences`. + """ + OP_OVER = 1 + """ + This frame should be alpha composited with the previous output image contents. + See :ref:`Saving APNG sequences`. + """ + + +def _safe_zlib_decompress(s: bytes) -> bytes: + dobj = zlib.decompressobj() + plaintext = dobj.decompress(s, MAX_TEXT_CHUNK) + if dobj.unconsumed_tail: + msg = "Decompressed data too large for PngImagePlugin.MAX_TEXT_CHUNK" + raise ValueError(msg) + return plaintext + + +def _crc32(data: bytes, seed: int = 0) -> int: + return zlib.crc32(data, seed) & 0xFFFFFFFF + + +# -------------------------------------------------------------------- +# Support classes. Suitable for PNG and related formats like MNG etc. + + +class ChunkStream: + def __init__(self, fp: IO[bytes]) -> None: + self.fp: IO[bytes] | None = fp + self.queue: list[tuple[bytes, int, int]] | None = [] + + def read(self) -> tuple[bytes, int, int]: + """Fetch a new chunk. Returns header information.""" + cid = None + + assert self.fp is not None + if self.queue: + cid, pos, length = self.queue.pop() + self.fp.seek(pos) + else: + s = self.fp.read(8) + cid = s[4:] + pos = self.fp.tell() + length = i32(s) + + if not is_cid(cid): + if not ImageFile.LOAD_TRUNCATED_IMAGES: + msg = f"broken PNG file (chunk {repr(cid)})" + raise SyntaxError(msg) + + return cid, pos, length + + def __enter__(self) -> ChunkStream: + return self + + def __exit__(self, *args: object) -> None: + self.close() + + def close(self) -> None: + self.queue = self.fp = None + + def push(self, cid: bytes, pos: int, length: int) -> None: + assert self.queue is not None + self.queue.append((cid, pos, length)) + + def call(self, cid: bytes, pos: int, length: int) -> bytes: + """Call the appropriate chunk handler""" + + logger.debug("STREAM %r %s %s", cid, pos, length) + return getattr(self, f"chunk_{cid.decode('ascii')}")(pos, length) + + def crc(self, cid: bytes, data: bytes) -> None: + """Read and verify checksum""" + + # Skip CRC checks for ancillary chunks if allowed to load truncated + # images + # 5th byte of first char is 1 [specs, section 5.4] + if ImageFile.LOAD_TRUNCATED_IMAGES and (cid[0] >> 5 & 1): + self.crc_skip(cid, data) + return + + assert self.fp is not None + try: + crc1 = _crc32(data, _crc32(cid)) + crc2 = i32(self.fp.read(4)) + if crc1 != crc2: + msg = f"broken PNG file (bad header checksum in {repr(cid)})" + raise SyntaxError(msg) + except struct.error as e: + msg = f"broken PNG file (incomplete checksum in {repr(cid)})" + raise SyntaxError(msg) from e + + def crc_skip(self, cid: bytes, data: bytes) -> None: + """Read checksum""" + + assert self.fp is not None + self.fp.read(4) + + def verify(self, endchunk: bytes = b"IEND") -> list[bytes]: + # Simple approach; just calculate checksum for all remaining + # blocks. Must be called directly after open. + + cids = [] + + assert self.fp is not None + while True: + try: + cid, pos, length = self.read() + except struct.error as e: + msg = "truncated PNG file" + raise OSError(msg) from e + + if cid == endchunk: + break + self.crc(cid, ImageFile._safe_read(self.fp, length)) + cids.append(cid) + + return cids + + +class iTXt(str): + """ + Subclass of string to allow iTXt chunks to look like strings while + keeping their extra information + + """ + + lang: str | bytes | None + tkey: str | bytes | None + + @staticmethod + def __new__( + cls, text: str, lang: str | None = None, tkey: str | None = None + ) -> iTXt: + """ + :param cls: the class to use when creating the instance + :param text: value for this key + :param lang: language code + :param tkey: UTF-8 version of the key name + """ + + self = str.__new__(cls, text) + self.lang = lang + self.tkey = tkey + return self + + +class PngInfo: + """ + PNG chunk container (for use with save(pnginfo=)) + + """ + + def __init__(self) -> None: + self.chunks: list[tuple[bytes, bytes, bool]] = [] + + def add(self, cid: bytes, data: bytes, after_idat: bool = False) -> None: + """Appends an arbitrary chunk. Use with caution. + + :param cid: a byte string, 4 bytes long. + :param data: a byte string of the encoded data + :param after_idat: for use with private chunks. Whether the chunk + should be written after IDAT + + """ + + self.chunks.append((cid, data, after_idat)) + + def add_itxt( + self, + key: str | bytes, + value: str | bytes, + lang: str | bytes = "", + tkey: str | bytes = "", + zip: bool = False, + ) -> None: + """Appends an iTXt chunk. + + :param key: latin-1 encodable text key name + :param value: value for this key + :param lang: language code + :param tkey: UTF-8 version of the key name + :param zip: compression flag + + """ + + if not isinstance(key, bytes): + key = key.encode("latin-1", "strict") + if not isinstance(value, bytes): + value = value.encode("utf-8", "strict") + if not isinstance(lang, bytes): + lang = lang.encode("utf-8", "strict") + if not isinstance(tkey, bytes): + tkey = tkey.encode("utf-8", "strict") + + if zip: + self.add( + b"iTXt", + key + b"\0\x01\0" + lang + b"\0" + tkey + b"\0" + zlib.compress(value), + ) + else: + self.add(b"iTXt", key + b"\0\0\0" + lang + b"\0" + tkey + b"\0" + value) + + def add_text( + self, key: str | bytes, value: str | bytes | iTXt, zip: bool = False + ) -> None: + """Appends a text chunk. + + :param key: latin-1 encodable text key name + :param value: value for this key, text or an + :py:class:`PIL.PngImagePlugin.iTXt` instance + :param zip: compression flag + + """ + if isinstance(value, iTXt): + return self.add_itxt( + key, + value, + value.lang if value.lang is not None else b"", + value.tkey if value.tkey is not None else b"", + zip=zip, + ) + + # The tEXt chunk stores latin-1 text + if not isinstance(value, bytes): + try: + value = value.encode("latin-1", "strict") + except UnicodeError: + return self.add_itxt(key, value, zip=zip) + + if not isinstance(key, bytes): + key = key.encode("latin-1", "strict") + + if zip: + self.add(b"zTXt", key + b"\0\0" + zlib.compress(value)) + else: + self.add(b"tEXt", key + b"\0" + value) + + +# -------------------------------------------------------------------- +# PNG image stream (IHDR/IEND) + + +class _RewindState(NamedTuple): + info: dict[str | tuple[int, int], Any] + tile: list[ImageFile._Tile] + seq_num: int | None + + +class PngStream(ChunkStream): + def __init__(self, fp: IO[bytes]) -> None: + super().__init__(fp) + + # local copies of Image attributes + self.im_info: dict[str | tuple[int, int], Any] = {} + self.im_text: dict[str, str | iTXt] = {} + self.im_size = (0, 0) + self.im_mode = "" + self.im_tile: list[ImageFile._Tile] = [] + self.im_palette: tuple[str, bytes] | None = None + self.im_custom_mimetype: str | None = None + self.im_n_frames: int | None = None + self._seq_num: int | None = None + self.rewind_state = _RewindState({}, [], None) + + self.text_memory = 0 + + def check_text_memory(self, chunklen: int) -> None: + self.text_memory += chunklen + if self.text_memory > MAX_TEXT_MEMORY: + msg = ( + "Too much memory used in text chunks: " + f"{self.text_memory}>MAX_TEXT_MEMORY" + ) + raise ValueError(msg) + + def save_rewind(self) -> None: + self.rewind_state = _RewindState( + self.im_info.copy(), + self.im_tile, + self._seq_num, + ) + + def rewind(self) -> None: + self.im_info = self.rewind_state.info.copy() + self.im_tile = self.rewind_state.tile + self._seq_num = self.rewind_state.seq_num + + def chunk_iCCP(self, pos: int, length: int) -> bytes: + # ICC profile + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + # according to PNG spec, the iCCP chunk contains: + # Profile name 1-79 bytes (character string) + # Null separator 1 byte (null character) + # Compression method 1 byte (0) + # Compressed profile n bytes (zlib with deflate compression) + i = s.find(b"\0") + logger.debug("iCCP profile name %r", s[:i]) + comp_method = s[i + 1] + logger.debug("Compression method %s", comp_method) + if comp_method != 0: + msg = f"Unknown compression method {comp_method} in iCCP chunk" + raise SyntaxError(msg) + try: + icc_profile = _safe_zlib_decompress(s[i + 2 :]) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + icc_profile = None + else: + raise + except zlib.error: + icc_profile = None # FIXME + self.im_info["icc_profile"] = icc_profile + return s + + def chunk_IHDR(self, pos: int, length: int) -> bytes: + # image header + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + if length < 13: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + msg = "Truncated IHDR chunk" + raise ValueError(msg) + self.im_size = i32(s, 0), i32(s, 4) + try: + self.im_mode, self.im_rawmode = _MODES[(s[8], s[9])] + except Exception: + pass + if s[12]: + self.im_info["interlace"] = 1 + if s[11]: + msg = "unknown filter category" + raise SyntaxError(msg) + return s + + def chunk_IDAT(self, pos: int, length: int) -> NoReturn: + # image data + if "bbox" in self.im_info: + tile = [ImageFile._Tile("zip", self.im_info["bbox"], pos, self.im_rawmode)] + else: + if self.im_n_frames is not None: + self.im_info["default_image"] = True + tile = [ImageFile._Tile("zip", (0, 0) + self.im_size, pos, self.im_rawmode)] + self.im_tile = tile + self.im_idat = length + msg = "image data found" + raise EOFError(msg) + + def chunk_IEND(self, pos: int, length: int) -> NoReturn: + msg = "end of PNG image" + raise EOFError(msg) + + def chunk_PLTE(self, pos: int, length: int) -> bytes: + # palette + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + if self.im_mode == "P": + self.im_palette = "RGB", s + return s + + def chunk_tRNS(self, pos: int, length: int) -> bytes: + # transparency + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + if self.im_mode == "P": + if _simple_palette.match(s): + # tRNS contains only one full-transparent entry, + # other entries are full opaque + i = s.find(b"\0") + if i >= 0: + self.im_info["transparency"] = i + else: + # otherwise, we have a byte string with one alpha value + # for each palette entry + self.im_info["transparency"] = s + elif self.im_mode == "1": + self.im_info["transparency"] = 255 if i16(s) else 0 + elif self.im_mode in ("L", "I;16"): + self.im_info["transparency"] = i16(s) + elif self.im_mode == "RGB": + self.im_info["transparency"] = i16(s), i16(s, 2), i16(s, 4) + return s + + def chunk_gAMA(self, pos: int, length: int) -> bytes: + # gamma setting + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + self.im_info["gamma"] = i32(s) / 100000.0 + return s + + def chunk_cHRM(self, pos: int, length: int) -> bytes: + # chromaticity, 8 unsigned ints, actual value is scaled by 100,000 + # WP x,y, Red x,y, Green x,y Blue x,y + + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + raw_vals = struct.unpack(f">{len(s) // 4}I", s) + self.im_info["chromaticity"] = tuple(elt / 100000.0 for elt in raw_vals) + return s + + def chunk_sRGB(self, pos: int, length: int) -> bytes: + # srgb rendering intent, 1 byte + # 0 perceptual + # 1 relative colorimetric + # 2 saturation + # 3 absolute colorimetric + + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + if length < 1: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + msg = "Truncated sRGB chunk" + raise ValueError(msg) + self.im_info["srgb"] = s[0] + return s + + def chunk_pHYs(self, pos: int, length: int) -> bytes: + # pixels per unit + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + if length < 9: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + msg = "Truncated pHYs chunk" + raise ValueError(msg) + px, py = i32(s, 0), i32(s, 4) + unit = s[8] + if unit == 1: # meter + dpi = px * 0.0254, py * 0.0254 + self.im_info["dpi"] = dpi + elif unit == 0: + self.im_info["aspect"] = px, py + return s + + def chunk_tEXt(self, pos: int, length: int) -> bytes: + # text + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + try: + k, v = s.split(b"\0", 1) + except ValueError: + # fallback for broken tEXt tags + k = s + v = b"" + if k: + k_str = k.decode("latin-1", "strict") + v_str = v.decode("latin-1", "replace") + + self.im_info[k_str] = v if k == b"exif" else v_str + self.im_text[k_str] = v_str + self.check_text_memory(len(v_str)) + + return s + + def chunk_zTXt(self, pos: int, length: int) -> bytes: + # compressed text + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + try: + k, v = s.split(b"\0", 1) + except ValueError: + k = s + v = b"" + if v: + comp_method = v[0] + else: + comp_method = 0 + if comp_method != 0: + msg = f"Unknown compression method {comp_method} in zTXt chunk" + raise SyntaxError(msg) + try: + v = _safe_zlib_decompress(v[1:]) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + v = b"" + else: + raise + except zlib.error: + v = b"" + + if k: + k_str = k.decode("latin-1", "strict") + v_str = v.decode("latin-1", "replace") + + self.im_info[k_str] = self.im_text[k_str] = v_str + self.check_text_memory(len(v_str)) + + return s + + def chunk_iTXt(self, pos: int, length: int) -> bytes: + # international text + assert self.fp is not None + r = s = ImageFile._safe_read(self.fp, length) + try: + k, r = r.split(b"\0", 1) + except ValueError: + return s + if len(r) < 2: + return s + cf, cm, r = r[0], r[1], r[2:] + try: + lang, tk, v = r.split(b"\0", 2) + except ValueError: + return s + if cf != 0: + if cm == 0: + try: + v = _safe_zlib_decompress(v) + except ValueError: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + else: + raise + except zlib.error: + return s + else: + return s + if k == b"XML:com.adobe.xmp": + self.im_info["xmp"] = v + try: + k_str = k.decode("latin-1", "strict") + lang_str = lang.decode("utf-8", "strict") + tk_str = tk.decode("utf-8", "strict") + v_str = v.decode("utf-8", "strict") + except UnicodeError: + return s + + self.im_info[k_str] = self.im_text[k_str] = iTXt(v_str, lang_str, tk_str) + self.check_text_memory(len(v_str)) + + return s + + def chunk_eXIf(self, pos: int, length: int) -> bytes: + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + self.im_info["exif"] = b"Exif\x00\x00" + s + return s + + # APNG chunks + def chunk_acTL(self, pos: int, length: int) -> bytes: + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + if length < 8: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + msg = "APNG contains truncated acTL chunk" + raise ValueError(msg) + if self.im_n_frames is not None: + self.im_n_frames = None + warnings.warn("Invalid APNG, will use default PNG image if possible") + return s + n_frames = i32(s) + if n_frames == 0 or n_frames > 0x80000000: + warnings.warn("Invalid APNG, will use default PNG image if possible") + return s + self.im_n_frames = n_frames + self.im_info["loop"] = i32(s, 4) + self.im_custom_mimetype = "image/apng" + return s + + def chunk_fcTL(self, pos: int, length: int) -> bytes: + assert self.fp is not None + s = ImageFile._safe_read(self.fp, length) + if length < 26: + if ImageFile.LOAD_TRUNCATED_IMAGES: + return s + msg = "APNG contains truncated fcTL chunk" + raise ValueError(msg) + seq = i32(s) + if (self._seq_num is None and seq != 0) or ( + self._seq_num is not None and self._seq_num != seq - 1 + ): + msg = "APNG contains frame sequence errors" + raise SyntaxError(msg) + self._seq_num = seq + width, height = i32(s, 4), i32(s, 8) + px, py = i32(s, 12), i32(s, 16) + im_w, im_h = self.im_size + if px + width > im_w or py + height > im_h: + msg = "APNG contains invalid frames" + raise SyntaxError(msg) + self.im_info["bbox"] = (px, py, px + width, py + height) + delay_num, delay_den = i16(s, 20), i16(s, 22) + if delay_den == 0: + delay_den = 100 + self.im_info["duration"] = float(delay_num) / float(delay_den) * 1000 + self.im_info["disposal"] = s[24] + self.im_info["blend"] = s[25] + return s + + def chunk_fdAT(self, pos: int, length: int) -> bytes: + assert self.fp is not None + if length < 4: + if ImageFile.LOAD_TRUNCATED_IMAGES: + s = ImageFile._safe_read(self.fp, length) + return s + msg = "APNG contains truncated fDAT chunk" + raise ValueError(msg) + s = ImageFile._safe_read(self.fp, 4) + seq = i32(s) + if self._seq_num != seq - 1: + msg = "APNG contains frame sequence errors" + raise SyntaxError(msg) + self._seq_num = seq + return self.chunk_IDAT(pos + 4, length - 4) + + +# -------------------------------------------------------------------- +# PNG reader + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(_MAGIC) + + +## +# Image plugin for PNG images. + + +class PngImageFile(ImageFile.ImageFile): + format = "PNG" + format_description = "Portable network graphics" + + def _open(self) -> None: + assert self.fp is not None + if not _accept(self.fp.read(8)): + msg = "not a PNG file" + raise SyntaxError(msg) + self._fp = self.fp + self.__frame = 0 + + # + # Parse headers up to the first IDAT or fDAT chunk + + self.private_chunks: list[tuple[bytes, bytes] | tuple[bytes, bytes, bool]] = [] + self.png: PngStream | None = PngStream(self.fp) + + while True: + # + # get next chunk + + cid, pos, length = self.png.read() + + try: + s = self.png.call(cid, pos, length) + except EOFError: + break + except AttributeError: + logger.debug("%r %s %s (unknown)", cid, pos, length) + s = ImageFile._safe_read(self.fp, length) + if cid[1:2].islower(): + self.private_chunks.append((cid, s)) + + self.png.crc(cid, s) + + # + # Copy relevant attributes from the PngStream. An alternative + # would be to let the PngStream class modify these attributes + # directly, but that introduces circular references which are + # difficult to break if things go wrong in the decoder... + # (believe me, I've tried ;-) + + self._mode = self.png.im_mode + self._size = self.png.im_size + self.info = self.png.im_info + self._text: dict[str, str | iTXt] | None = None + self.tile = self.png.im_tile + self.custom_mimetype = self.png.im_custom_mimetype + self.n_frames = self.png.im_n_frames or 1 + self.default_image = self.info.get("default_image", False) + + if self.png.im_palette: + rawmode, data = self.png.im_palette + self.palette = ImagePalette.raw(rawmode, data) + + if cid == b"fdAT": + self.__prepare_idat = length - 4 + else: + self.__prepare_idat = length # used by load_prepare() + + if self.png.im_n_frames is not None: + self._close_exclusive_fp_after_loading = False + self.png.save_rewind() + self.__rewind_idat = self.__prepare_idat + self.__rewind = self._fp.tell() + if self.default_image: + # IDAT chunk contains default image and not first animation frame + self.n_frames += 1 + self._seek(0) + self.is_animated = self.n_frames > 1 + + @property + def text(self) -> dict[str, str | iTXt]: + # experimental + if self._text is None: + # iTxt, tEXt and zTXt chunks may appear at the end of the file + # So load the file to ensure that they are read + if self.is_animated: + frame = self.__frame + # for APNG, seek to the final frame before loading + self.seek(self.n_frames - 1) + self.load() + if self.is_animated: + self.seek(frame) + assert self._text is not None + return self._text + + def verify(self) -> None: + """Verify PNG file""" + + if self.fp is None: + msg = "verify must be called directly after open" + raise RuntimeError(msg) + + # back up to beginning of IDAT block + self.fp.seek(self.tile[0][2] - 8) + + assert self.png is not None + self.png.verify() + self.png.close() + + super().verify() + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + if frame < self.__frame: + self._seek(0, True) + + last_frame = self.__frame + try: + for f in range(self.__frame + 1, frame + 1): + self._seek(f) + except EOFError as e: + self.seek(last_frame) + msg = "no more images in APNG file" + raise EOFError(msg) from e + + def _seek(self, frame: int, rewind: bool = False) -> None: + assert self.png is not None + if isinstance(self._fp, DeferredError): + raise self._fp.ex + + self.dispose: _imaging.ImagingCore | None + dispose_extent = None + if frame == 0: + if rewind: + self._fp.seek(self.__rewind) + self.png.rewind() + self.__prepare_idat = self.__rewind_idat + self._im = None + self.info = self.png.im_info + self.tile = self.png.im_tile + self.fp = self._fp + self._prev_im = None + self.dispose = None + self.default_image = self.info.get("default_image", False) + self.dispose_op = self.info.get("disposal") + self.blend_op = self.info.get("blend") + dispose_extent = self.info.get("bbox") + self.__frame = 0 + else: + if frame != self.__frame + 1: + msg = f"cannot seek to frame {frame}" + raise ValueError(msg) + + # ensure previous frame was loaded + self.load() + + if self.dispose: + self.im.paste(self.dispose, self.dispose_extent) + self._prev_im = self.im.copy() + + self.fp = self._fp + + # advance to the next frame + if self.__prepare_idat: + ImageFile._safe_read(self.fp, self.__prepare_idat) + self.__prepare_idat = 0 + frame_start = False + while True: + self.fp.read(4) # CRC + + try: + cid, pos, length = self.png.read() + except (struct.error, SyntaxError): + break + + if cid == b"IEND": + msg = "No more images in APNG file" + raise EOFError(msg) + if cid == b"fcTL": + if frame_start: + # there must be at least one fdAT chunk between fcTL chunks + msg = "APNG missing frame data" + raise SyntaxError(msg) + frame_start = True + + try: + self.png.call(cid, pos, length) + except UnicodeDecodeError: + break + except EOFError: + if cid == b"fdAT": + length -= 4 + if frame_start: + self.__prepare_idat = length + break + ImageFile._safe_read(self.fp, length) + except AttributeError: + logger.debug("%r %s %s (unknown)", cid, pos, length) + ImageFile._safe_read(self.fp, length) + + self.__frame = frame + self.tile = self.png.im_tile + self.dispose_op = self.info.get("disposal") + self.blend_op = self.info.get("blend") + dispose_extent = self.info.get("bbox") + + if not self.tile: + msg = "image not found in APNG frame" + raise EOFError(msg) + if dispose_extent: + self.dispose_extent: tuple[float, float, float, float] = dispose_extent + + # setup frame disposal (actual disposal done when needed in the next _seek()) + if self._prev_im is None and self.dispose_op == Disposal.OP_PREVIOUS: + self.dispose_op = Disposal.OP_BACKGROUND + + self.dispose = None + if self.dispose_op == Disposal.OP_PREVIOUS: + if self._prev_im: + self.dispose = self._prev_im.copy() + self.dispose = self._crop(self.dispose, self.dispose_extent) + elif self.dispose_op == Disposal.OP_BACKGROUND: + self.dispose = Image.core.fill(self.mode, self.size) + self.dispose = self._crop(self.dispose, self.dispose_extent) + + def tell(self) -> int: + return self.__frame + + def load_prepare(self) -> None: + """internal: prepare to read PNG file""" + + if self.info.get("interlace"): + self.decoderconfig = self.decoderconfig + (1,) + + self.__idat = self.__prepare_idat # used by load_read() + ImageFile.ImageFile.load_prepare(self) + + def load_read(self, read_bytes: int) -> bytes: + """internal: read more image data""" + + assert self.png is not None + assert self.fp is not None + while self.__idat == 0: + # end of chunk, skip forward to next one + + self.fp.read(4) # CRC + + cid, pos, length = self.png.read() + + if cid not in [b"IDAT", b"DDAT", b"fdAT"]: + self.png.push(cid, pos, length) + return b"" + + if cid == b"fdAT": + try: + self.png.call(cid, pos, length) + except EOFError: + pass + self.__idat = length - 4 # sequence_num has already been read + else: + self.__idat = length # empty chunks are allowed + + # read more data from this chunk + if read_bytes <= 0: + read_bytes = self.__idat + else: + read_bytes = min(read_bytes, self.__idat) + + self.__idat = self.__idat - read_bytes + + return self.fp.read(read_bytes) + + def load_end(self) -> None: + """internal: finished reading image data""" + assert self.png is not None + assert self.fp is not None + if self.__idat != 0: + self.fp.read(self.__idat) + while True: + self.fp.read(4) # CRC + + try: + cid, pos, length = self.png.read() + except (struct.error, SyntaxError): + break + + if cid == b"IEND": + break + elif cid == b"fcTL" and self.is_animated: + # start of the next frame, stop reading + self.__prepare_idat = 0 + self.png.push(cid, pos, length) + break + + try: + self.png.call(cid, pos, length) + except UnicodeDecodeError: + break + except EOFError: + if cid == b"fdAT": + length -= 4 + try: + ImageFile._safe_read(self.fp, length) + except OSError as e: + if ImageFile.LOAD_TRUNCATED_IMAGES: + break + else: + raise e + except AttributeError: + logger.debug("%r %s %s (unknown)", cid, pos, length) + s = ImageFile._safe_read(self.fp, length) + if cid[1:2].islower(): + self.private_chunks.append((cid, s, True)) + self._text = self.png.im_text + if not self.is_animated: + self.png.close() + self.png = None + else: + if self._prev_im and self.blend_op == Blend.OP_OVER: + updated = self._crop(self.im, self.dispose_extent) + if self.im.mode == "RGB" and "transparency" in self.info: + mask = updated.convert_transparent( + "RGBA", self.info["transparency"] + ) + else: + if self.im.mode == "P" and "transparency" in self.info: + t = self.info["transparency"] + if isinstance(t, bytes): + updated.putpalettealphas(t) + elif isinstance(t, int): + updated.putpalettealpha(t) + mask = updated.convert("RGBA") + self._prev_im.paste(updated, self.dispose_extent, mask) + self.im = self._prev_im + + def _getexif(self) -> dict[int, Any] | None: + if "exif" not in self.info: + self.load() + if "exif" not in self.info and "Raw profile type exif" not in self.info: + return None + return self.getexif()._get_merged_dict() + + def getexif(self) -> Image.Exif: + if "exif" not in self.info: + self.load() + + return super().getexif() + + +# -------------------------------------------------------------------- +# PNG writer + +_OUTMODES = { + # supported PIL modes, and corresponding rawmode, bit depth and color type + "1": ("1", b"\x01", b"\x00"), + "L;1": ("L;1", b"\x01", b"\x00"), + "L;2": ("L;2", b"\x02", b"\x00"), + "L;4": ("L;4", b"\x04", b"\x00"), + "L": ("L", b"\x08", b"\x00"), + "LA": ("LA", b"\x08", b"\x04"), + "I": ("I;16B", b"\x10", b"\x00"), + "I;16": ("I;16B", b"\x10", b"\x00"), + "I;16B": ("I;16B", b"\x10", b"\x00"), + "P;1": ("P;1", b"\x01", b"\x03"), + "P;2": ("P;2", b"\x02", b"\x03"), + "P;4": ("P;4", b"\x04", b"\x03"), + "P": ("P", b"\x08", b"\x03"), + "RGB": ("RGB", b"\x08", b"\x02"), + "RGBA": ("RGBA", b"\x08", b"\x06"), +} + + +def putchunk(fp: IO[bytes], cid: bytes, *data: bytes) -> None: + """Write a PNG chunk (including CRC field)""" + + byte_data = b"".join(data) + + fp.write(o32(len(byte_data)) + cid) + fp.write(byte_data) + crc = _crc32(byte_data, _crc32(cid)) + fp.write(o32(crc)) + + +class _idat: + # wrap output from the encoder in IDAT chunks + + def __init__(self, fp: IO[bytes], chunk: Callable[..., None]) -> None: + self.fp = fp + self.chunk = chunk + + def write(self, data: bytes) -> None: + self.chunk(self.fp, b"IDAT", data) + + +class _fdat: + # wrap encoder output in fdAT chunks + + def __init__(self, fp: IO[bytes], chunk: Callable[..., None], seq_num: int) -> None: + self.fp = fp + self.chunk = chunk + self.seq_num = seq_num + + def write(self, data: bytes) -> None: + self.chunk(self.fp, b"fdAT", o32(self.seq_num), data) + self.seq_num += 1 + + +def _apply_encoderinfo(im: Image.Image, encoderinfo: dict[str, Any]) -> None: + im.encoderconfig = ( + encoderinfo.get("optimize", False), + encoderinfo.get("compress_level", -1), + encoderinfo.get("compress_type", -1), + encoderinfo.get("dictionary", b""), + ) + + +class _Frame(NamedTuple): + im: Image.Image + bbox: tuple[int, int, int, int] | None + encoderinfo: dict[str, Any] + + +def _write_multiple_frames( + im: Image.Image, + fp: IO[bytes], + chunk: Callable[..., None], + mode: str, + rawmode: str, + default_image: Image.Image | None, + append_images: list[Image.Image], +) -> Image.Image | None: + duration = im.encoderinfo.get("duration") + loop = im.encoderinfo.get("loop", im.info.get("loop", 0)) + disposal = im.encoderinfo.get("disposal", im.info.get("disposal", Disposal.OP_NONE)) + blend = im.encoderinfo.get("blend", im.info.get("blend", Blend.OP_SOURCE)) + + if default_image: + chain = itertools.chain(append_images) + else: + chain = itertools.chain([im], append_images) + + im_frames: list[_Frame] = [] + frame_count = 0 + for im_seq in chain: + for im_frame in ImageSequence.Iterator(im_seq): + if im_frame.mode == mode: + im_frame = im_frame.copy() + else: + im_frame = im_frame.convert(mode) + encoderinfo = im.encoderinfo.copy() + if isinstance(duration, (list, tuple)): + encoderinfo["duration"] = duration[frame_count] + elif duration is None and "duration" in im_frame.info: + encoderinfo["duration"] = im_frame.info["duration"] + if isinstance(disposal, (list, tuple)): + encoderinfo["disposal"] = disposal[frame_count] + if isinstance(blend, (list, tuple)): + encoderinfo["blend"] = blend[frame_count] + frame_count += 1 + + if im_frames: + previous = im_frames[-1] + prev_disposal = previous.encoderinfo.get("disposal") + prev_blend = previous.encoderinfo.get("blend") + if prev_disposal == Disposal.OP_PREVIOUS and len(im_frames) < 2: + prev_disposal = Disposal.OP_BACKGROUND + + if prev_disposal == Disposal.OP_BACKGROUND: + base_im = previous.im.copy() + dispose = Image.core.fill("RGBA", im.size, (0, 0, 0, 0)) + bbox = previous.bbox + if bbox: + dispose = dispose.crop(bbox) + else: + bbox = (0, 0) + im.size + base_im.paste(dispose, bbox) + elif prev_disposal == Disposal.OP_PREVIOUS: + base_im = im_frames[-2].im + else: + base_im = previous.im + delta = ImageChops.subtract_modulo( + im_frame.convert("RGBA"), base_im.convert("RGBA") + ) + bbox = delta.getbbox(alpha_only=False) + if ( + not bbox + and prev_disposal == encoderinfo.get("disposal") + and prev_blend == encoderinfo.get("blend") + and "duration" in encoderinfo + ): + previous.encoderinfo["duration"] += encoderinfo["duration"] + continue + else: + bbox = None + im_frames.append(_Frame(im_frame, bbox, encoderinfo)) + + if len(im_frames) == 1 and not default_image: + return im_frames[0].im + + # animation control + chunk( + fp, + b"acTL", + o32(len(im_frames)), # 0: num_frames + o32(loop), # 4: num_plays + ) + + # default image IDAT (if it exists) + if default_image: + default_im = im if im.mode == mode else im.convert(mode) + _apply_encoderinfo(default_im, im.encoderinfo) + ImageFile._save( + default_im, + cast(IO[bytes], _idat(fp, chunk)), + [ImageFile._Tile("zip", (0, 0) + im.size, 0, rawmode)], + ) + + seq_num = 0 + for frame, frame_data in enumerate(im_frames): + im_frame = frame_data.im + if not frame_data.bbox: + bbox = (0, 0) + im_frame.size + else: + bbox = frame_data.bbox + im_frame = im_frame.crop(bbox) + size = im_frame.size + encoderinfo = frame_data.encoderinfo + frame_duration = encoderinfo.get("duration", 0) + delay = Fraction(frame_duration / 1000).limit_denominator(65535) + if delay.numerator > 65535: + msg = "cannot write duration" + raise ValueError(msg) + frame_disposal = encoderinfo.get("disposal", disposal) + frame_blend = encoderinfo.get("blend", blend) + # frame control + chunk( + fp, + b"fcTL", + o32(seq_num), # sequence_number + o32(size[0]), # width + o32(size[1]), # height + o32(bbox[0]), # x_offset + o32(bbox[1]), # y_offset + o16(delay.numerator), # delay_numerator + o16(delay.denominator), # delay_denominator + o8(frame_disposal), # dispose_op + o8(frame_blend), # blend_op + ) + seq_num += 1 + # frame data + _apply_encoderinfo(im_frame, im.encoderinfo) + if frame == 0 and not default_image: + # first frame must be in IDAT chunks for backwards compatibility + ImageFile._save( + im_frame, + cast(IO[bytes], _idat(fp, chunk)), + [ImageFile._Tile("zip", (0, 0) + im_frame.size, 0, rawmode)], + ) + else: + fdat_chunks = _fdat(fp, chunk, seq_num) + ImageFile._save( + im_frame, + cast(IO[bytes], fdat_chunks), + [ImageFile._Tile("zip", (0, 0) + im_frame.size, 0, rawmode)], + ) + seq_num = fdat_chunks.seq_num + return None + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + _save(im, fp, filename, save_all=True) + + +def _save( + im: Image.Image, + fp: IO[bytes], + filename: str | bytes, + chunk: Callable[..., None] = putchunk, + save_all: bool = False, +) -> None: + # save an image to disk (called by the save method) + + if save_all: + default_image = im.encoderinfo.get( + "default_image", im.info.get("default_image") + ) + modes = set() + sizes = set() + append_images = im.encoderinfo.get("append_images", []) + for im_seq in itertools.chain([im], append_images): + for im_frame in ImageSequence.Iterator(im_seq): + modes.add(im_frame.mode) + sizes.add(im_frame.size) + for mode in ("RGBA", "RGB", "P"): + if mode in modes: + break + else: + mode = modes.pop() + size = tuple(max(frame_size[i] for frame_size in sizes) for i in range(2)) + else: + size = im.size + mode = im.mode + + outmode = mode + palette = [] + if im.palette: + palette = im.getpalette() or [] + if mode == "P": + # + # attempt to minimize storage requirements for palette images + if "bits" in im.encoderinfo: + # number of bits specified by user + colors = min(1 << im.encoderinfo["bits"], 256) + else: + # check palette contents + if im.palette: + colors = max(min(len(palette) // 3, 256), 1) + else: + colors = 256 + + if colors <= 16: + if colors <= 2: + bits = 1 + elif colors <= 4: + bits = 2 + else: + bits = 4 + outmode += f";{bits}" + + # get the corresponding PNG mode + try: + rawmode, bit_depth, color_type = _OUTMODES[outmode] + except KeyError as e: + msg = f"cannot write mode {mode} as PNG" + raise OSError(msg) from e + if outmode == "I": + deprecate("Saving I mode images as PNG", 13, stacklevel=4) + + # + # write minimal PNG file + + fp.write(_MAGIC) + + chunk( + fp, + b"IHDR", + o32(size[0]), # 0: size + o32(size[1]), + bit_depth, + color_type, + b"\0", # 10: compression + b"\0", # 11: filter category + b"\0", # 12: interlace flag + ) + + chunks = [b"cHRM", b"cICP", b"gAMA", b"sBIT", b"sRGB", b"tIME"] + + if icc := im.encoderinfo.get("icc_profile", im.info.get("icc_profile")): + # ICC profile + # according to PNG spec, the iCCP chunk contains: + # Profile name 1-79 bytes (character string) + # Null separator 1 byte (null character) + # Compression method 1 byte (0) + # Compressed profile n bytes (zlib with deflate compression) + name = b"ICC Profile" + data = name + b"\0\0" + zlib.compress(icc) + chunk(fp, b"iCCP", data) + + # You must either have sRGB or iCCP. + # Disallow sRGB chunks when an iCCP-chunk has been emitted. + chunks.remove(b"sRGB") + + if info := im.encoderinfo.get("pnginfo"): + chunks_multiple_allowed = [b"sPLT", b"iTXt", b"tEXt", b"zTXt"] + for info_chunk in info.chunks: + cid, data = info_chunk[:2] + if cid in chunks: + chunks.remove(cid) + chunk(fp, cid, data) + elif cid in chunks_multiple_allowed: + chunk(fp, cid, data) + elif cid[1:2].islower(): + # Private chunk + after_idat = len(info_chunk) == 3 and info_chunk[2] + if not after_idat: + chunk(fp, cid, data) + + if im.mode == "P": + palette_byte_number = colors * 3 + palette_bytes = bytes(palette[:palette_byte_number]) + while len(palette_bytes) < palette_byte_number: + palette_bytes += b"\0" + chunk(fp, b"PLTE", palette_bytes) + + transparency = im.encoderinfo.get("transparency", im.info.get("transparency", None)) + + if transparency or transparency == 0: + if im.mode == "P": + # limit to actual palette size + alpha_bytes = colors + if isinstance(transparency, bytes): + chunk(fp, b"tRNS", transparency[:alpha_bytes]) + else: + transparency = max(0, min(255, transparency)) + alpha = b"\xff" * transparency + b"\0" + chunk(fp, b"tRNS", alpha[:alpha_bytes]) + elif im.mode in ("1", "L", "I", "I;16"): + transparency = max(0, min(65535, transparency)) + chunk(fp, b"tRNS", o16(transparency)) + elif im.mode == "RGB": + red, green, blue = transparency + chunk(fp, b"tRNS", o16(red) + o16(green) + o16(blue)) + else: + if "transparency" in im.encoderinfo: + # don't bother with transparency if it's an RGBA + # and it's in the info dict. It's probably just stale. + msg = "cannot use transparency for this mode" + raise OSError(msg) + else: + if im.mode == "P" and im.im.getpalettemode() == "RGBA": + alpha = im.im.getpalette("RGBA", "A") + alpha_bytes = colors + chunk(fp, b"tRNS", alpha[:alpha_bytes]) + + if dpi := im.encoderinfo.get("dpi"): + chunk( + fp, + b"pHYs", + o32(int(dpi[0] / 0.0254 + 0.5)), + o32(int(dpi[1] / 0.0254 + 0.5)), + b"\x01", + ) + + if info: + chunks = [b"bKGD", b"hIST"] + for info_chunk in info.chunks: + cid, data = info_chunk[:2] + if cid in chunks: + chunks.remove(cid) + chunk(fp, cid, data) + + if exif := im.encoderinfo.get("exif"): + if isinstance(exif, Image.Exif): + exif = exif.tobytes(8) + if exif.startswith(b"Exif\x00\x00"): + exif = exif[6:] + chunk(fp, b"eXIf", exif) + + single_im: Image.Image | None = im + if save_all: + single_im = _write_multiple_frames( + im, fp, chunk, mode, rawmode, default_image, append_images + ) + if single_im: + _apply_encoderinfo(single_im, im.encoderinfo) + ImageFile._save( + single_im, + cast(IO[bytes], _idat(fp, chunk)), + [ImageFile._Tile("zip", (0, 0) + single_im.size, 0, rawmode)], + ) + + if info: + for info_chunk in info.chunks: + cid, data = info_chunk[:2] + if cid[1:2].islower(): + # Private chunk + after_idat = len(info_chunk) == 3 and info_chunk[2] + if after_idat: + chunk(fp, cid, data) + + chunk(fp, b"IEND", b"") + + if hasattr(fp, "flush"): + fp.flush() + + +# -------------------------------------------------------------------- +# PNG chunk converter + + +def getchunks(im: Image.Image, **params: Any) -> list[tuple[bytes, bytes, bytes]]: + """Return a list of PNG chunks representing this image.""" + from io import BytesIO + + chunks = [] + + def append(fp: IO[bytes], cid: bytes, *data: bytes) -> None: + byte_data = b"".join(data) + crc = o32(_crc32(byte_data, _crc32(cid))) + chunks.append((cid, byte_data, crc)) + + fp = BytesIO() + + try: + im.encoderinfo = params + _save(im, fp, "", append) + finally: + del im.encoderinfo + + return chunks + + +# -------------------------------------------------------------------- +# Registry + +Image.register_open(PngImageFile.format, PngImageFile, _accept) +Image.register_save(PngImageFile.format, _save) +Image.register_save_all(PngImageFile.format, _save_all) + +Image.register_extensions(PngImageFile.format, [".png", ".apng"]) + +Image.register_mime(PngImageFile.format, "image/png") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PpmImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PpmImagePlugin.py new file mode 100644 index 000000000..307bc97ff --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PpmImagePlugin.py @@ -0,0 +1,375 @@ +# +# The Python Imaging Library. +# $Id$ +# +# PPM support for PIL +# +# History: +# 96-03-24 fl Created +# 98-03-06 fl Write RGBA images (as RGB, that is) +# +# Copyright (c) Secret Labs AB 1997-98. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import math +from typing import IO + +from . import Image, ImageFile +from ._binary import i16be as i16 +from ._binary import o8 +from ._binary import o32le as o32 + +# +# -------------------------------------------------------------------- + +b_whitespace = b"\x20\x09\x0a\x0b\x0c\x0d" + +MODES = { + # standard + b"P1": "1", + b"P2": "L", + b"P3": "RGB", + b"P4": "1", + b"P5": "L", + b"P6": "RGB", + # extensions + b"P0CMYK": "CMYK", + b"Pf": "F", + # PIL extensions (for test purposes only) + b"PyP": "P", + b"PyRGBA": "RGBA", + b"PyCMYK": "CMYK", +} + + +def _accept(prefix: bytes) -> bool: + return len(prefix) >= 2 and prefix.startswith(b"P") and prefix[1] in b"0123456fy" + + +## +# Image plugin for PBM, PGM, and PPM images. + + +class PpmImageFile(ImageFile.ImageFile): + format = "PPM" + format_description = "Pbmplus image" + + def _read_magic(self) -> bytes: + assert self.fp is not None + + magic = b"" + # read until whitespace or longest available magic number + for _ in range(6): + c = self.fp.read(1) + if not c or c in b_whitespace: + break + magic += c + return magic + + def _read_token(self) -> bytes: + assert self.fp is not None + + token = b"" + while len(token) <= 10: # read until next whitespace or limit of 10 characters + c = self.fp.read(1) + if not c: + break + elif c in b_whitespace: # token ended + if not token: + # skip whitespace at start + continue + break + elif c == b"#": + # ignores rest of the line; stops at CR, LF or EOF + while self.fp.read(1) not in b"\r\n": + pass + continue + token += c + if not token: + # Token was not even 1 byte + msg = "Reached EOF while reading header" + raise ValueError(msg) + elif len(token) > 10: + msg_too_long = b"Token too long in file header: %s" % token + raise ValueError(msg_too_long) + return token + + def _open(self) -> None: + assert self.fp is not None + + magic_number = self._read_magic() + try: + mode = MODES[magic_number] + except KeyError: + msg = "not a PPM file" + raise SyntaxError(msg) + self._mode = mode + + if magic_number in (b"P1", b"P4"): + self.custom_mimetype = "image/x-portable-bitmap" + elif magic_number in (b"P2", b"P5"): + self.custom_mimetype = "image/x-portable-graymap" + elif magic_number in (b"P3", b"P6"): + self.custom_mimetype = "image/x-portable-pixmap" + + self._size = int(self._read_token()), int(self._read_token()) + + decoder_name = "raw" + if magic_number in (b"P1", b"P2", b"P3"): + decoder_name = "ppm_plain" + + args: str | tuple[str | int, ...] + if mode == "1": + args = "1;I" + elif mode == "F": + scale = float(self._read_token()) + if scale == 0.0 or not math.isfinite(scale): + msg = "scale must be finite and non-zero" + raise ValueError(msg) + self.info["scale"] = abs(scale) + + rawmode = "F;32F" if scale < 0 else "F;32BF" + args = (rawmode, 0, -1) + else: + maxval = int(self._read_token()) + if not 0 < maxval < 65536: + msg = "maxval must be greater than 0 and less than 65536" + raise ValueError(msg) + if maxval > 255 and mode == "L": + self._mode = "I" + + rawmode = mode + if decoder_name != "ppm_plain": + # If maxval matches a bit depth, use the raw decoder directly + if maxval == 65535 and mode == "L": + rawmode = "I;16B" + elif maxval != 255: + decoder_name = "ppm" + + args = rawmode if decoder_name == "raw" else (rawmode, maxval) + self.tile = [ + ImageFile._Tile(decoder_name, (0, 0) + self.size, self.fp.tell(), args) + ] + + +# +# -------------------------------------------------------------------- + + +class PpmPlainDecoder(ImageFile.PyDecoder): + _pulls_fd = True + _comment_spans: bool + + def _read_block(self) -> bytes: + assert self.fd is not None + + return self.fd.read(ImageFile.SAFEBLOCK) + + def _find_comment_end(self, block: bytes, start: int = 0) -> int: + a = block.find(b"\n", start) + b = block.find(b"\r", start) + return min(a, b) if a * b > 0 else max(a, b) # lowest nonnegative index (or -1) + + def _ignore_comments(self, block: bytes) -> bytes: + if self._comment_spans: + # Finish current comment + while block: + comment_end = self._find_comment_end(block) + if comment_end != -1: + # Comment ends in this block + # Delete tail of comment + block = block[comment_end + 1 :] + break + else: + # Comment spans whole block + # So read the next block, looking for the end + block = self._read_block() + + # Search for any further comments + self._comment_spans = False + while True: + comment_start = block.find(b"#") + if comment_start == -1: + # No comment found + break + comment_end = self._find_comment_end(block, comment_start) + if comment_end != -1: + # Comment ends in this block + # Delete comment + block = block[:comment_start] + block[comment_end + 1 :] + else: + # Comment continues to next block(s) + block = block[:comment_start] + self._comment_spans = True + break + return block + + def _decode_bitonal(self) -> bytearray: + """ + This is a separate method because in the plain PBM format, all data tokens are + exactly one byte, so the inter-token whitespace is optional. + """ + data = bytearray() + total_bytes = self.state.xsize * self.state.ysize + + while len(data) != total_bytes: + block = self._read_block() # read next block + if not block: + # eof + break + + block = self._ignore_comments(block) + + tokens = b"".join(block.split()) + for token in tokens: + if token not in (48, 49): + msg = b"Invalid token for this mode: %s" % bytes([token]) + raise ValueError(msg) + data = (data + tokens)[:total_bytes] + invert = bytes.maketrans(b"01", b"\xff\x00") + return data.translate(invert) + + def _decode_blocks(self, maxval: int) -> bytearray: + data = bytearray() + max_len = 10 + out_byte_count = 4 if self.mode == "I" else 1 + out_max = 65535 if self.mode == "I" else 255 + bands = Image.getmodebands(self.mode) + total_bytes = self.state.xsize * self.state.ysize * bands * out_byte_count + + half_token = b"" + while len(data) != total_bytes: + block = self._read_block() # read next block + if not block: + if half_token: + block = bytearray(b" ") # flush half_token + else: + # eof + break + + block = self._ignore_comments(block) + + if half_token: + block = half_token + block # stitch half_token to new block + half_token = b"" + + tokens = block.split() + + if block and not block[-1:].isspace(): # block might split token + half_token = tokens.pop() # save half token for later + if len(half_token) > max_len: # prevent buildup of half_token + msg = ( + b"Token too long found in data: %s" % half_token[: max_len + 1] + ) + raise ValueError(msg) + + for token in tokens: + if len(token) > max_len: + msg = b"Token too long found in data: %s" % token[: max_len + 1] + raise ValueError(msg) + value = int(token) + if value < 0: + msg_str = f"Channel value is negative: {value}" + raise ValueError(msg_str) + if value > maxval: + msg_str = f"Channel value too large for this mode: {value}" + raise ValueError(msg_str) + value = round(value / maxval * out_max) + data += o32(value) if self.mode == "I" else o8(value) + if len(data) == total_bytes: # finished! + break + return data + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + self._comment_spans = False + if self.mode == "1": + data = self._decode_bitonal() + rawmode = "1;8" + else: + maxval = self.args[-1] + data = self._decode_blocks(maxval) + rawmode = "I;32" if self.mode == "I" else self.mode + self.set_as_raw(bytes(data), rawmode) + return -1, 0 + + +class PpmDecoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + assert self.fd is not None + + data = bytearray() + maxval = self.args[-1] + in_byte_count = 1 if maxval < 256 else 2 + out_byte_count = 4 if self.mode == "I" else 1 + out_max = 65535 if self.mode == "I" else 255 + bands = Image.getmodebands(self.mode) + dest_length = self.state.xsize * self.state.ysize * bands * out_byte_count + while len(data) < dest_length: + pixels = self.fd.read(in_byte_count * bands) + if len(pixels) < in_byte_count * bands: + # eof + break + for b in range(bands): + value = ( + pixels[b] if in_byte_count == 1 else i16(pixels, b * in_byte_count) + ) + value = min(out_max, round(value / maxval * out_max)) + data += o32(value) if self.mode == "I" else o8(value) + rawmode = "I;32" if self.mode == "I" else self.mode + self.set_as_raw(bytes(data), rawmode) + return -1, 0 + + +# +# -------------------------------------------------------------------- + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode == "1": + rawmode, head = "1;I", b"P4" + elif im.mode == "L": + rawmode, head = "L", b"P5" + elif im.mode in ("I", "I;16"): + rawmode, head = "I;16B", b"P5" + elif im.mode in ("RGB", "RGBA"): + rawmode, head = "RGB", b"P6" + elif im.mode == "F": + rawmode, head = "F;32F", b"Pf" + else: + msg = f"cannot write mode {im.mode} as PPM" + raise OSError(msg) + fp.write(head + b"\n%d %d\n" % im.size) + if head == b"P6": + fp.write(b"255\n") + elif head == b"P5": + if rawmode == "L": + fp.write(b"255\n") + else: + fp.write(b"65535\n") + elif head == b"Pf": + fp.write(b"-1.0\n") + row_order = -1 if im.mode == "F" else 1 + ImageFile._save( + im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, row_order))] + ) + + +# +# -------------------------------------------------------------------- + + +Image.register_open(PpmImageFile.format, PpmImageFile, _accept) +Image.register_save(PpmImageFile.format, _save) + +Image.register_decoder("ppm", PpmDecoder) +Image.register_decoder("ppm_plain", PpmPlainDecoder) + +Image.register_extensions(PpmImageFile.format, [".pbm", ".pgm", ".ppm", ".pnm", ".pfm"]) + +Image.register_mime(PpmImageFile.format, "image/x-portable-anymap") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PsdImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PsdImagePlugin.py new file mode 100644 index 000000000..dd3d5ab95 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/PsdImagePlugin.py @@ -0,0 +1,337 @@ +# +# The Python Imaging Library +# $Id$ +# +# Adobe PSD 2.5/3.0 file handling +# +# History: +# 1995-09-01 fl Created +# 1997-01-03 fl Read most PSD images +# 1997-01-18 fl Fixed P and CMYK support +# 2001-10-21 fl Added seek/tell support (for layers) +# +# Copyright (c) 1997-2001 by Secret Labs AB. +# Copyright (c) 1995-2001 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +from functools import cached_property +from typing import IO + +from . import Image, ImageFile, ImagePalette +from ._binary import i8 +from ._binary import i16be as i16 +from ._binary import i32be as i32 +from ._binary import si16be as si16 +from ._binary import si32be as si32 +from ._util import DeferredError + +MODES = { + # (photoshop mode, bits) -> (pil mode, required channels) + (0, 1): ("1", 1), + (0, 8): ("L", 1), + (1, 8): ("L", 1), + (2, 8): ("P", 1), + (3, 8): ("RGB", 3), + (4, 8): ("CMYK", 4), + (7, 8): ("L", 1), # FIXME: multilayer + (8, 8): ("L", 1), # duotone + (9, 8): ("LAB", 3), +} + + +# --------------------------------------------------------------------. +# read PSD images + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(b"8BPS") + + +## +# Image plugin for Photoshop images. + + +class PsdImageFile(ImageFile.ImageFile): + format = "PSD" + format_description = "Adobe Photoshop" + _close_exclusive_fp_after_loading = False + + def _open(self) -> None: + assert self.fp is not None + read = self.fp.read + + # + # header + + s = read(26) + if not _accept(s) or i16(s, 4) != 1: + msg = "not a PSD file" + raise SyntaxError(msg) + + psd_bits = i16(s, 22) + psd_channels = i16(s, 12) + psd_mode = i16(s, 24) + + mode, channels = MODES[(psd_mode, psd_bits)] + + if channels > psd_channels: + msg = "not enough channels" + raise OSError(msg) + if mode == "RGB" and psd_channels == 4: + mode = "RGBA" + channels = 4 + + self._mode = mode + self._size = i32(s, 18), i32(s, 14) + + # + # color mode data + + size = i32(read(4)) + if size: + data = read(size) + if mode == "P" and size == 768: + self.palette = ImagePalette.raw("RGB;L", data) + + # + # image resources + + self.resources = [] + + size = i32(read(4)) + if size: + # load resources + end = self.fp.tell() + size + while self.fp.tell() < end: + read(4) # signature + id = i16(read(2)) + name = read(i8(read(1))) + if not (len(name) & 1): + read(1) # padding + data = read(i32(read(4))) + if len(data) & 1: + read(1) # padding + self.resources.append((id, name, data)) + if id == 1039: # ICC profile + self.info["icc_profile"] = data + + # + # layer and mask information + + self._layers_position = None + + size = i32(read(4)) + if size: + end = self.fp.tell() + size + size = i32(read(4)) + if size: + self._layers_position = self.fp.tell() + self._layers_size = size + self.fp.seek(end) + self._n_frames: int | None = None + + # + # image descriptor + + self.tile = _maketile(self.fp, mode, (0, 0) + self.size, channels) + + # keep the file open + self._fp = self.fp + self.frame = 1 + self._min_frame = 1 + + @cached_property + def layers( + self, + ) -> list[tuple[str, str, tuple[int, int, int, int], list[ImageFile._Tile]]]: + layers = [] + if self._layers_position is not None: + if isinstance(self._fp, DeferredError): + raise self._fp.ex + self._fp.seek(self._layers_position) + _layer_data = io.BytesIO(ImageFile._safe_read(self._fp, self._layers_size)) + layers = _layerinfo(_layer_data, self._layers_size) + self._n_frames = len(layers) + return layers + + @property + def n_frames(self) -> int: + if self._n_frames is None: + self._n_frames = len(self.layers) + return self._n_frames + + @property + def is_animated(self) -> bool: + return len(self.layers) > 1 + + def seek(self, layer: int) -> None: + if not self._seek_check(layer): + return + if isinstance(self._fp, DeferredError): + raise self._fp.ex + + # seek to given layer (1..max) + if layer > len(self.layers): + msg = "no more images in PSD file" + raise EOFError(msg) + _, mode, _, tile = self.layers[layer - 1] + self._mode = mode + self.tile = tile + self.frame = layer + self.fp = self._fp + + def tell(self) -> int: + # return layer number (0=image, 1..max=layers) + return self.frame + + +def _layerinfo( + fp: IO[bytes], ct_bytes: int +) -> list[tuple[str, str, tuple[int, int, int, int], list[ImageFile._Tile]]]: + # read layerinfo block + layers = [] + + def read(size: int) -> bytes: + return ImageFile._safe_read(fp, size) + + ct = si16(read(2)) + + # sanity check + if ct_bytes < (abs(ct) * 20): + msg = "Layer block too short for number of layers requested" + raise SyntaxError(msg) + + for _ in range(abs(ct)): + # bounding box + y0 = si32(read(4)) + x0 = si32(read(4)) + y1 = si32(read(4)) + x1 = si32(read(4)) + + # image info + bands = [] + ct_types = i16(read(2)) + if ct_types > 4: + fp.seek(ct_types * 6 + 12, io.SEEK_CUR) + size = i32(read(4)) + fp.seek(size, io.SEEK_CUR) + continue + + for _ in range(ct_types): + type = i16(read(2)) + + if type == 65535: + b = "A" + else: + b = "RGBA"[type] + + bands.append(b) + read(4) # size + + # figure out the image mode + bands.sort() + if bands == ["R"]: + mode = "L" + elif bands == ["B", "G", "R"]: + mode = "RGB" + elif bands == ["A", "B", "G", "R"]: + mode = "RGBA" + else: + mode = "" # unknown + + # skip over blend flags and extra information + read(12) # filler + name = "" + size = i32(read(4)) # length of the extra data field + if size: + data_end = fp.tell() + size + + length = i32(read(4)) + if length: + fp.seek(length - 16, io.SEEK_CUR) + + length = i32(read(4)) + if length: + fp.seek(length, io.SEEK_CUR) + + length = i8(read(1)) + if length: + # Don't know the proper encoding, + # Latin-1 should be a good guess + name = read(length).decode("latin-1", "replace") + + fp.seek(data_end) + layers.append((name, mode, (x0, y0, x1, y1))) + + # get tiles + layerinfo = [] + for i, (name, mode, bbox) in enumerate(layers): + tile = [] + for m in mode: + t = _maketile(fp, m, bbox, 1) + if t: + tile.extend(t) + layerinfo.append((name, mode, bbox, tile)) + + return layerinfo + + +def _maketile( + file: IO[bytes], mode: str, bbox: tuple[int, int, int, int], channels: int +) -> list[ImageFile._Tile]: + tiles = [] + read = file.read + + compression = i16(read(2)) + + xsize = bbox[2] - bbox[0] + ysize = bbox[3] - bbox[1] + + offset = file.tell() + + if compression == 0: + # + # raw compression + for channel in range(channels): + layer = mode[channel] + if mode == "CMYK": + layer += ";I" + tiles.append(ImageFile._Tile("raw", bbox, offset, layer)) + offset = offset + xsize * ysize + + elif compression == 1: + # + # packbits compression + i = 0 + bytecount = read(channels * ysize * 2) + offset = file.tell() + for channel in range(channels): + layer = mode[channel] + if mode == "CMYK": + layer += ";I" + tiles.append(ImageFile._Tile("packbits", bbox, offset, layer)) + for y in range(ysize): + offset = offset + i16(bytecount, i) + i += 2 + + file.seek(offset) + + if offset & 1: + read(1) # padding + + return tiles + + +# -------------------------------------------------------------------- +# registry + + +Image.register_open(PsdImageFile.format, PsdImageFile, _accept) + +Image.register_extension(PsdImageFile.format, ".psd") + +Image.register_mime(PsdImageFile.format, "image/vnd.adobe.photoshop") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/QoiImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/QoiImagePlugin.py new file mode 100644 index 000000000..d0709b119 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/QoiImagePlugin.py @@ -0,0 +1,235 @@ +# +# The Python Imaging Library. +# +# QOI support for PIL +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os +from typing import IO + +from . import Image, ImageFile +from ._binary import i32be as i32 +from ._binary import o8 +from ._binary import o32be as o32 + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(b"qoif") + + +class QoiImageFile(ImageFile.ImageFile): + format = "QOI" + format_description = "Quite OK Image" + + def _open(self) -> None: + assert self.fp is not None + if not _accept(self.fp.read(4)): + msg = "not a QOI file" + raise SyntaxError(msg) + + self._size = i32(self.fp.read(4)), i32(self.fp.read(4)) + + channels = self.fp.read(1)[0] + self._mode = "RGB" if channels == 3 else "RGBA" + + self.fp.seek(1, os.SEEK_CUR) # colorspace + self.tile = [ImageFile._Tile("qoi", (0, 0) + self._size, self.fp.tell())] + + +class QoiDecoder(ImageFile.PyDecoder): + _pulls_fd = True + _previous_pixel: bytes | bytearray | None = None + _previously_seen_pixels: dict[int, bytes | bytearray] = {} + + def _add_to_previous_pixels(self, value: bytes | bytearray) -> None: + self._previous_pixel = value + + r, g, b, a = value + hash_value = (r * 3 + g * 5 + b * 7 + a * 11) % 64 + self._previously_seen_pixels[hash_value] = value + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + assert self.fd is not None + + self._previously_seen_pixels = {} + self._previous_pixel = bytearray((0, 0, 0, 255)) + + data = bytearray() + bands = Image.getmodebands(self.mode) + dest_length = self.state.xsize * self.state.ysize * bands + while len(data) < dest_length: + byte = self.fd.read(1)[0] + value: bytes | bytearray + if byte == 0b11111110 and self._previous_pixel: # QOI_OP_RGB + value = bytearray(self.fd.read(3)) + self._previous_pixel[3:] + elif byte == 0b11111111: # QOI_OP_RGBA + value = self.fd.read(4) + else: + op = byte >> 6 + if op == 0: # QOI_OP_INDEX + op_index = byte & 0b00111111 + value = self._previously_seen_pixels.get( + op_index, bytearray((0, 0, 0, 0)) + ) + elif op == 1 and self._previous_pixel: # QOI_OP_DIFF + value = bytearray( + ( + (self._previous_pixel[0] + ((byte & 0b00110000) >> 4) - 2) + % 256, + (self._previous_pixel[1] + ((byte & 0b00001100) >> 2) - 2) + % 256, + (self._previous_pixel[2] + (byte & 0b00000011) - 2) % 256, + self._previous_pixel[3], + ) + ) + elif op == 2 and self._previous_pixel: # QOI_OP_LUMA + second_byte = self.fd.read(1)[0] + diff_green = (byte & 0b00111111) - 32 + diff_red = ((second_byte & 0b11110000) >> 4) - 8 + diff_blue = (second_byte & 0b00001111) - 8 + + value = bytearray( + tuple( + (self._previous_pixel[i] + diff_green + diff) % 256 + for i, diff in enumerate((diff_red, 0, diff_blue)) + ) + ) + value += self._previous_pixel[3:] + elif op == 3 and self._previous_pixel: # QOI_OP_RUN + run_length = (byte & 0b00111111) + 1 + value = self._previous_pixel + if bands == 3: + value = value[:3] + data += value * run_length + continue + self._add_to_previous_pixels(value) + + if bands == 3: + value = value[:3] + data += value + self.set_as_raw(data) + return -1, 0 + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode == "RGB": + channels = 3 + elif im.mode == "RGBA": + channels = 4 + else: + msg = "Unsupported QOI image mode" + raise ValueError(msg) + + colorspace = 0 if im.encoderinfo.get("colorspace") == "sRGB" else 1 + + fp.write(b"qoif") + fp.write(o32(im.size[0])) + fp.write(o32(im.size[1])) + fp.write(o8(channels)) + fp.write(o8(colorspace)) + + ImageFile._save(im, fp, [ImageFile._Tile("qoi", (0, 0) + im.size)]) + + +class QoiEncoder(ImageFile.PyEncoder): + _pushes_fd = True + _previous_pixel: tuple[int, int, int, int] | None = None + _previously_seen_pixels: dict[int, tuple[int, int, int, int]] = {} + _run = 0 + + def _write_run(self) -> bytes: + data = o8(0b11000000 | (self._run - 1)) # QOI_OP_RUN + self._run = 0 + return data + + def _delta(self, left: int, right: int) -> int: + result = (left - right) & 255 + if result >= 128: + result -= 256 + return result + + def encode(self, bufsize: int) -> tuple[int, int, bytes]: + assert self.im is not None + + self._previously_seen_pixels = {0: (0, 0, 0, 0)} + self._previous_pixel = (0, 0, 0, 255) + + data = bytearray() + w, h = self.im.size + bands = Image.getmodebands(self.mode) + + for y in range(h): + for x in range(w): + pixel = self.im.getpixel((x, y)) + if bands == 3: + pixel = (*pixel, 255) + + if pixel == self._previous_pixel: + self._run += 1 + if self._run == 62: + data += self._write_run() + else: + if self._run: + data += self._write_run() + + r, g, b, a = pixel + hash_value = (r * 3 + g * 5 + b * 7 + a * 11) % 64 + if self._previously_seen_pixels.get(hash_value) == pixel: + data += o8(hash_value) # QOI_OP_INDEX + elif self._previous_pixel: + self._previously_seen_pixels[hash_value] = pixel + + prev_r, prev_g, prev_b, prev_a = self._previous_pixel + if prev_a == a: + delta_r = self._delta(r, prev_r) + delta_g = self._delta(g, prev_g) + delta_b = self._delta(b, prev_b) + + if ( + -2 <= delta_r < 2 + and -2 <= delta_g < 2 + and -2 <= delta_b < 2 + ): + data += o8( + 0b01000000 + | (delta_r + 2) << 4 + | (delta_g + 2) << 2 + | (delta_b + 2) + ) # QOI_OP_DIFF + else: + delta_gr = self._delta(delta_r, delta_g) + delta_gb = self._delta(delta_b, delta_g) + if ( + -8 <= delta_gr < 8 + and -32 <= delta_g < 32 + and -8 <= delta_gb < 8 + ): + data += o8( + 0b10000000 | (delta_g + 32) + ) # QOI_OP_LUMA + data += o8((delta_gr + 8) << 4 | (delta_gb + 8)) + else: + data += o8(0b11111110) # QOI_OP_RGB + data += bytes(pixel[:3]) + else: + data += o8(0b11111111) # QOI_OP_RGBA + data += bytes(pixel) + + self._previous_pixel = pixel + + if self._run: + data += self._write_run() + data += bytes((0, 0, 0, 0, 0, 0, 0, 1)) # padding + + return len(data), 0, data + + +Image.register_open(QoiImageFile.format, QoiImageFile, _accept) +Image.register_decoder("qoi", QoiDecoder) +Image.register_extension(QoiImageFile.format, ".qoi") + +Image.register_save(QoiImageFile.format, _save) +Image.register_encoder("qoi", QoiEncoder) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/SgiImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/SgiImagePlugin.py new file mode 100644 index 000000000..853022150 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/SgiImagePlugin.py @@ -0,0 +1,231 @@ +# +# The Python Imaging Library. +# $Id$ +# +# SGI image file handling +# +# See "The SGI Image File Format (Draft version 0.97)", Paul Haeberli. +# +# +# +# History: +# 2017-22-07 mb Add RLE decompression +# 2016-16-10 mb Add save method without compression +# 1995-09-10 fl Created +# +# Copyright (c) 2016 by Mickael Bonfill. +# Copyright (c) 2008 by Karsten Hiddemann. +# Copyright (c) 1997 by Secret Labs AB. +# Copyright (c) 1995 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os +import struct +from typing import IO + +from . import Image, ImageFile +from ._binary import i16be as i16 +from ._binary import o8 + + +def _accept(prefix: bytes) -> bool: + return len(prefix) >= 2 and i16(prefix) == 474 + + +MODES = { + (1, 1, 1): "L", + (1, 2, 1): "L", + (2, 1, 1): "L;16B", + (2, 2, 1): "L;16B", + (1, 3, 3): "RGB", + (2, 3, 3): "RGB;16B", + (1, 3, 4): "RGBA", + (2, 3, 4): "RGBA;16B", +} + + +## +# Image plugin for SGI images. +class SgiImageFile(ImageFile.ImageFile): + format = "SGI" + format_description = "SGI Image File Format" + + def _open(self) -> None: + # HEAD + assert self.fp is not None + + headlen = 512 + s = self.fp.read(headlen) + + if not _accept(s): + msg = "Not an SGI image file" + raise ValueError(msg) + + # compression : verbatim or RLE + compression = s[2] + + # bpc : 1 or 2 bytes (8bits or 16bits) + bpc = s[3] + + # dimension : 1, 2 or 3 (depending on xsize, ysize and zsize) + dimension = i16(s, 4) + + # xsize : width + xsize = i16(s, 6) + + # ysize : height + ysize = i16(s, 8) + + # zsize : channels count + zsize = i16(s, 10) + + # determine mode from bits/zsize + try: + rawmode = MODES[(bpc, dimension, zsize)] + except KeyError: + msg = "Unsupported SGI image mode" + raise ValueError(msg) + + self._size = xsize, ysize + self._mode = rawmode.split(";")[0] + if self.mode == "RGB": + self.custom_mimetype = "image/rgb" + + # orientation -1 : scanlines begins at the bottom-left corner + orientation = -1 + + # decoder info + if compression == 0: + pagesize = xsize * ysize * bpc + if bpc == 2: + self.tile = [ + ImageFile._Tile( + "SGI16", + (0, 0) + self.size, + headlen, + (self.mode, 0, orientation), + ) + ] + else: + self.tile = [] + offset = headlen + for layer in self.mode: + self.tile.append( + ImageFile._Tile( + "raw", (0, 0) + self.size, offset, (layer, 0, orientation) + ) + ) + offset += pagesize + elif compression == 1: + self.tile = [ + ImageFile._Tile( + "sgi_rle", (0, 0) + self.size, headlen, (rawmode, orientation, bpc) + ) + ] + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode not in {"RGB", "RGBA", "L"}: + msg = "Unsupported SGI image mode" + raise ValueError(msg) + + # Get the keyword arguments + info = im.encoderinfo + + # Byte-per-pixel precision, 1 = 8bits per pixel + bpc = info.get("bpc", 1) + + if bpc not in (1, 2): + msg = "Unsupported number of bytes per pixel" + raise ValueError(msg) + + # Flip the image, since the origin of SGI file is the bottom-left corner + orientation = -1 + # Define the file as SGI File Format + magic_number = 474 + # Run-Length Encoding Compression - Unsupported at this time + rle = 0 + + # X Dimension = width / Y Dimension = height + x, y = im.size + # Z Dimension: Number of channels + z = len(im.mode) + # Number of dimensions (x,y,z) + if im.mode == "L": + dimension = 1 if y == 1 else 2 + else: + dimension = 3 + + # Minimum Byte value + pinmin = 0 + # Maximum Byte value (255 = 8bits per pixel) + pinmax = 255 + # Image name (79 characters max, truncated below in write) + img_name = os.path.splitext(os.path.basename(filename))[0] + if isinstance(img_name, str): + img_name = img_name.encode("ascii", "ignore") + # Standard representation of pixel in the file + colormap = 0 + fp.write(struct.pack(">h", magic_number)) + fp.write(o8(rle)) + fp.write(o8(bpc)) + fp.write(struct.pack(">H", dimension)) + fp.write(struct.pack(">H", x)) + fp.write(struct.pack(">H", y)) + fp.write(struct.pack(">H", z)) + fp.write(struct.pack(">l", pinmin)) + fp.write(struct.pack(">l", pinmax)) + fp.write(struct.pack("4s", b"")) # dummy + fp.write(struct.pack("79s", img_name)) # truncates to 79 chars + fp.write(struct.pack("s", b"")) # force null byte after img_name + fp.write(struct.pack(">l", colormap)) + fp.write(struct.pack("404s", b"")) # dummy + + rawmode = "L" + if bpc == 2: + rawmode = "L;16B" + + for channel in im.split(): + fp.write(channel.tobytes("raw", rawmode, 0, orientation)) + + if hasattr(fp, "flush"): + fp.flush() + + +class SGI16Decoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + assert self.fd is not None + assert self.im is not None + + rawmode, stride, orientation = self.args + pagesize = self.state.xsize * self.state.ysize + zsize = len(self.mode) + self.fd.seek(512) + + for band in range(zsize): + channel = Image.new("L", (self.state.xsize, self.state.ysize)) + channel.frombytes( + self.fd.read(2 * pagesize), "raw", "L;16B", stride, orientation + ) + self.im.putband(channel.im, band) + + return -1, 0 + + +# +# registry + + +Image.register_decoder("SGI16", SGI16Decoder) +Image.register_open(SgiImageFile.format, SgiImageFile, _accept) +Image.register_save(SgiImageFile.format, _save) +Image.register_mime(SgiImageFile.format, "image/sgi") + +Image.register_extensions(SgiImageFile.format, [".bw", ".rgb", ".rgba", ".sgi"]) + +# End of file diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/SpiderImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/SpiderImagePlugin.py new file mode 100644 index 000000000..11d90699d --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/SpiderImagePlugin.py @@ -0,0 +1,332 @@ +# +# The Python Imaging Library. +# +# SPIDER image file handling +# +# History: +# 2004-08-02 Created BB +# 2006-03-02 added save method +# 2006-03-13 added support for stack images +# +# Copyright (c) 2004 by Health Research Inc. (HRI) RENSSELAER, NY 12144. +# Copyright (c) 2004 by William Baxter. +# Copyright (c) 2004 by Secret Labs AB. +# Copyright (c) 2004 by Fredrik Lundh. +# + +## +# Image plugin for the Spider image format. This format is used +# by the SPIDER software, in processing image data from electron +# microscopy and tomography. +## + +# +# SpiderImagePlugin.py +# +# The Spider image format is used by SPIDER software, in processing +# image data from electron microscopy and tomography. +# +# Spider home page: +# https://spider.wadsworth.org/spider_doc/spider/docs/spider.html +# +# Details about the Spider image format: +# https://spider.wadsworth.org/spider_doc/spider/docs/image_doc.html +# +from __future__ import annotations + +import os +import struct +import sys +from typing import IO, Any, cast + +from . import Image, ImageFile +from ._util import DeferredError + +TYPE_CHECKING = False + + +def isInt(f: Any) -> int: + try: + i = int(f) + if f - i == 0: + return 1 + else: + return 0 + except (ValueError, OverflowError): + return 0 + + +iforms = [1, 3, -11, -12, -21, -22] + + +# There is no magic number to identify Spider files, so just check a +# series of header locations to see if they have reasonable values. +# Returns no. of bytes in the header, if it is a valid Spider header, +# otherwise returns 0 + + +def isSpiderHeader(t: tuple[float, ...]) -> int: + h = (99,) + t # add 1 value so can use spider header index start=1 + # header values 1,2,5,12,13,22,23 should be integers + for i in [1, 2, 5, 12, 13, 22, 23]: + if not isInt(h[i]): + return 0 + # check iform + iform = int(h[5]) + if iform not in iforms: + return 0 + # check other header values + labrec = int(h[13]) # no. records in file header + labbyt = int(h[22]) # total no. of bytes in header + lenbyt = int(h[23]) # record length in bytes + if labbyt != (labrec * lenbyt): + return 0 + # looks like a valid header + return labbyt + + +def isSpiderImage(filename: str) -> int: + with open(filename, "rb") as fp: + f = fp.read(92) # read 23 * 4 bytes + t = struct.unpack(">23f", f) # try big-endian first + hdrlen = isSpiderHeader(t) + if hdrlen == 0: + t = struct.unpack("<23f", f) # little-endian + hdrlen = isSpiderHeader(t) + return hdrlen + + +class SpiderImageFile(ImageFile.ImageFile): + format = "SPIDER" + format_description = "Spider 2D image" + _close_exclusive_fp_after_loading = False + + def _open(self) -> None: + # check header + n = 27 * 4 # read 27 float values + assert self.fp is not None + f = self.fp.read(n) + + try: + self.bigendian = 1 + t = struct.unpack(">27f", f) # try big-endian first + hdrlen = isSpiderHeader(t) + if hdrlen == 0: + self.bigendian = 0 + t = struct.unpack("<27f", f) # little-endian + hdrlen = isSpiderHeader(t) + if hdrlen == 0: + msg = "not a valid Spider file" + raise SyntaxError(msg) + except struct.error as e: + msg = "not a valid Spider file" + raise SyntaxError(msg) from e + + h = (99,) + t # add 1 value : spider header index starts at 1 + iform = int(h[5]) + if iform != 1: + msg = "not a Spider 2D image" + raise SyntaxError(msg) + + self._size = int(h[12]), int(h[2]) # size in pixels (width, height) + self.istack = int(h[24]) + self.imgnumber = int(h[27]) + + if self.istack == 0 and self.imgnumber == 0: + # stk=0, img=0: a regular 2D image + offset = hdrlen + self._nimages = 1 + elif self.istack > 0 and self.imgnumber == 0: + # stk>0, img=0: Opening the stack for the first time + self.imgbytes = int(h[12]) * int(h[2]) * 4 + self.hdrlen = hdrlen + self._nimages = int(h[26]) + # Point to the first image in the stack + offset = hdrlen * 2 + self.imgnumber = 1 + elif self.istack == 0 and self.imgnumber > 0: + # stk=0, img>0: an image within the stack + offset = hdrlen + self.stkoffset + self.istack = 2 # So Image knows it's still a stack + else: + msg = "inconsistent stack header values" + raise SyntaxError(msg) + + if self.bigendian: + self.rawmode = "F;32BF" + else: + self.rawmode = "F;32F" + self._mode = "F" + + self.tile = [ImageFile._Tile("raw", (0, 0) + self.size, offset, self.rawmode)] + self._fp = self.fp # FIXME: hack + + @property + def n_frames(self) -> int: + return self._nimages + + @property + def is_animated(self) -> bool: + return self._nimages > 1 + + # 1st image index is zero (although SPIDER imgnumber starts at 1) + def tell(self) -> int: + if self.imgnumber < 1: + return 0 + else: + return self.imgnumber - 1 + + def seek(self, frame: int) -> None: + if self.istack == 0: + msg = "attempt to seek in a non-stack file" + raise EOFError(msg) + if not self._seek_check(frame): + return + if isinstance(self._fp, DeferredError): + raise self._fp.ex + self.stkoffset = self.hdrlen + frame * (self.hdrlen + self.imgbytes) + self.fp = self._fp + self.fp.seek(self.stkoffset) + self._open() + + # returns a byte image after rescaling to 0..255 + def convert2byte(self, depth: int = 255) -> Image.Image: + extrema = self.getextrema() + assert isinstance(extrema[0], float) + minimum, maximum = cast(tuple[float, float], extrema) + m: float = 1 + if maximum != minimum: + m = depth / (maximum - minimum) + b = -m * minimum + return self.point(lambda i: i * m + b).convert("L") + + if TYPE_CHECKING: + from . import ImageTk + + # returns a ImageTk.PhotoImage object, after rescaling to 0..255 + def tkPhotoImage(self) -> ImageTk.PhotoImage: + from . import ImageTk + + return ImageTk.PhotoImage(self.convert2byte(), palette=256) + + +# -------------------------------------------------------------------- +# Image series + + +# given a list of filenames, return a list of images +def loadImageSeries(filelist: list[str] | None = None) -> list[Image.Image] | None: + """create a list of :py:class:`~PIL.Image.Image` objects for use in a montage""" + if filelist is None or len(filelist) < 1: + return None + + byte_imgs = [] + for img in filelist: + if not os.path.exists(img): + print(f"unable to find {img}") + continue + try: + with Image.open(img) as im: + assert isinstance(im, SpiderImageFile) + byte_im = im.convert2byte() + except Exception: + if not isSpiderImage(img): + print(f"{img} is not a Spider image file") + continue + byte_im.info["filename"] = img + byte_imgs.append(byte_im) + return byte_imgs + + +# -------------------------------------------------------------------- +# For saving images in Spider format + + +def makeSpiderHeader(im: Image.Image) -> list[bytes]: + nsam, nrow = im.size + lenbyt = max(1, nsam) * 4 # There are labrec records in the header + labrec = int(1024 / lenbyt) + if 1024 % lenbyt != 0: + labrec += 1 + labbyt = labrec * lenbyt + nvalues = int(labbyt / 4) + if nvalues < 23: + return [] + + hdr = [0.0] * nvalues + + # NB these are Fortran indices + hdr[1] = 1.0 # nslice (=1 for an image) + hdr[2] = float(nrow) # number of rows per slice + hdr[3] = float(nrow) # number of records in the image + hdr[5] = 1.0 # iform for 2D image + hdr[12] = float(nsam) # number of pixels per line + hdr[13] = float(labrec) # number of records in file header + hdr[22] = float(labbyt) # total number of bytes in header + hdr[23] = float(lenbyt) # record length in bytes + + # adjust for Fortran indexing + hdr = hdr[1:] + hdr.append(0.0) + # pack binary data into a string + return [struct.pack("f", v) for v in hdr] + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode != "F": + im = im.convert("F") + + hdr = makeSpiderHeader(im) + if len(hdr) < 256: + msg = "Error creating Spider header" + raise OSError(msg) + + # write the SPIDER header + fp.writelines(hdr) + + rawmode = "F;32NF" # 32-bit native floating point + ImageFile._save(im, fp, [ImageFile._Tile("raw", (0, 0) + im.size, 0, rawmode)]) + + +def _save_spider(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + # get the filename extension and register it with Image + if filename_ext := os.path.splitext(filename)[1]: + ext = filename_ext.decode() if isinstance(filename_ext, bytes) else filename_ext + Image.register_extension(SpiderImageFile.format, ext) + _save(im, fp, filename) + + +# -------------------------------------------------------------------- + + +Image.register_open(SpiderImageFile.format, SpiderImageFile) +Image.register_save(SpiderImageFile.format, _save_spider) + +if __name__ == "__main__": + if len(sys.argv) < 2: + print("Syntax: python3 SpiderImagePlugin.py [infile] [outfile]") + sys.exit() + + filename = sys.argv[1] + if not isSpiderImage(filename): + print("input image must be in Spider format") + sys.exit() + + with Image.open(filename) as im: + print(f"image: {im}") + print(f"format: {im.format}") + print(f"size: {im.size}") + print(f"mode: {im.mode}") + print("max, min: ", end=" ") + print(im.getextrema()) + + if len(sys.argv) > 2: + outfile = sys.argv[2] + + # perform some image operation + transposed_im = im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) + print( + f"saving a flipped version of {os.path.basename(filename)} " + f"as {outfile} " + ) + transposed_im.save(outfile, SpiderImageFile.format) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/SunImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/SunImagePlugin.py new file mode 100644 index 000000000..8912379ea --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/SunImagePlugin.py @@ -0,0 +1,145 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Sun image file handling +# +# History: +# 1995-09-10 fl Created +# 1996-05-28 fl Fixed 32-bit alignment +# 1998-12-29 fl Import ImagePalette module +# 2001-12-18 fl Fixed palette loading (from Jean-Claude Rimbault) +# +# Copyright (c) 1997-2001 by Secret Labs AB +# Copyright (c) 1995-1996 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +from . import Image, ImageFile, ImagePalette +from ._binary import i32be as i32 + + +def _accept(prefix: bytes) -> bool: + return len(prefix) >= 4 and i32(prefix) == 0x59A66A95 + + +## +# Image plugin for Sun raster files. + + +class SunImageFile(ImageFile.ImageFile): + format = "SUN" + format_description = "Sun Raster File" + + def _open(self) -> None: + # The Sun Raster file header is 32 bytes in length + # and has the following format: + + # typedef struct _SunRaster + # { + # DWORD MagicNumber; /* Magic (identification) number */ + # DWORD Width; /* Width of image in pixels */ + # DWORD Height; /* Height of image in pixels */ + # DWORD Depth; /* Number of bits per pixel */ + # DWORD Length; /* Size of image data in bytes */ + # DWORD Type; /* Type of raster file */ + # DWORD ColorMapType; /* Type of color map */ + # DWORD ColorMapLength; /* Size of the color map in bytes */ + # } SUNRASTER; + + assert self.fp is not None + + # HEAD + s = self.fp.read(32) + if not _accept(s): + msg = "not an SUN raster file" + raise SyntaxError(msg) + + offset = 32 + + self._size = i32(s, 4), i32(s, 8) + + depth = i32(s, 12) + # data_length = i32(s, 16) # unreliable, ignore. + file_type = i32(s, 20) + palette_type = i32(s, 24) # 0: None, 1: RGB, 2: Raw/arbitrary + palette_length = i32(s, 28) + + if depth == 1: + self._mode, rawmode = "1", "1;I" + elif depth == 4: + self._mode, rawmode = "L", "L;4" + elif depth == 8: + self._mode = rawmode = "L" + elif depth == 24: + if file_type == 3: + self._mode, rawmode = "RGB", "RGB" + else: + self._mode, rawmode = "RGB", "BGR" + elif depth == 32: + if file_type == 3: + self._mode, rawmode = "RGB", "RGBX" + else: + self._mode, rawmode = "RGB", "BGRX" + else: + msg = "Unsupported Mode/Bit Depth" + raise SyntaxError(msg) + + if palette_length: + if palette_length > 1024: + msg = "Unsupported Color Palette Length" + raise SyntaxError(msg) + + if palette_type != 1: + msg = "Unsupported Palette Type" + raise SyntaxError(msg) + + offset = offset + palette_length + self.palette = ImagePalette.raw("RGB;L", self.fp.read(palette_length)) + if self.mode == "L": + self._mode = "P" + rawmode = rawmode.replace("L", "P") + + # 16 bit boundaries on stride + stride = ((self.size[0] * depth + 15) // 16) * 2 + + # file type: Type is the version (or flavor) of the bitmap + # file. The following values are typically found in the Type + # field: + # 0000h Old + # 0001h Standard + # 0002h Byte-encoded + # 0003h RGB format + # 0004h TIFF format + # 0005h IFF format + # FFFFh Experimental + + # Old and standard are the same, except for the length tag. + # byte-encoded is run-length-encoded + # RGB looks similar to standard, but RGB byte order + # TIFF and IFF mean that they were converted from T/IFF + # Experimental means that it's something else. + # (https://www.fileformat.info/format/sunraster/egff.htm) + + if file_type in (0, 1, 3, 4, 5): + self.tile = [ + ImageFile._Tile("raw", (0, 0) + self.size, offset, (rawmode, stride)) + ] + elif file_type == 2: + self.tile = [ + ImageFile._Tile("sun_rle", (0, 0) + self.size, offset, rawmode) + ] + else: + msg = "Unsupported Sun Raster file type" + raise SyntaxError(msg) + + +# +# registry + + +Image.register_open(SunImageFile.format, SunImageFile, _accept) + +Image.register_extension(SunImageFile.format, ".ras") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/TarIO.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/TarIO.py new file mode 100644 index 000000000..86490a496 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/TarIO.py @@ -0,0 +1,61 @@ +# +# The Python Imaging Library. +# $Id$ +# +# read files from within a tar file +# +# History: +# 95-06-18 fl Created +# 96-05-28 fl Open files in binary mode +# +# Copyright (c) Secret Labs AB 1997. +# Copyright (c) Fredrik Lundh 1995-96. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io + +from . import ContainerIO + + +class TarIO(ContainerIO.ContainerIO[bytes]): + """A file object that provides read access to a given member of a TAR file.""" + + def __init__(self, tarfile: str, file: str) -> None: + """ + Create file object. + + :param tarfile: Name of TAR file. + :param file: Name of member file. + """ + self.fh = open(tarfile, "rb") + + while True: + s = self.fh.read(512) + if len(s) != 512: + self.fh.close() + + msg = "unexpected end of tar file" + raise OSError(msg) + + name = s[:100].decode("utf-8") + i = name.find("\0") + if i == 0: + self.fh.close() + + msg = "cannot find subfile" + raise OSError(msg) + if i > 0: + name = name[:i] + + size = int(s[124:135], 8) + + if file == name: + break + + self.fh.seek((size + 511) & (~511), io.SEEK_CUR) + + # Open region + super().__init__(self.fh, self.fh.tell(), size) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/TgaImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/TgaImagePlugin.py new file mode 100644 index 000000000..b2989a4b7 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/TgaImagePlugin.py @@ -0,0 +1,280 @@ +# +# The Python Imaging Library. +# $Id$ +# +# TGA file handling +# +# History: +# 95-09-01 fl created (reads 24-bit files only) +# 97-01-04 fl support more TGA versions, including compressed images +# 98-07-04 fl fixed orientation and alpha layer bugs +# 98-09-11 fl fixed orientation for runlength decoder +# +# Copyright (c) Secret Labs AB 1997-98. +# Copyright (c) Fredrik Lundh 1995-97. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import os +import warnings +from typing import IO + +from . import Image, ImageFile, ImagePalette +from ._binary import i16le as i16 +from ._binary import i32le as i32 +from ._binary import o8 +from ._binary import o16le as o16 + +# +# -------------------------------------------------------------------- +# Read RGA file + + +MODES = { + # map imagetype/depth to rawmode + (1, 8): "P", + (3, 1): "1", + (3, 8): "L", + (3, 16): "LA", + (2, 16): "BGRA;15Z", + (2, 24): "BGR", + (2, 32): "BGRA", +} + + +## +# Image plugin for Targa files. + + +class TgaImageFile(ImageFile.ImageFile): + format = "TGA" + format_description = "Targa" + + def _open(self) -> None: + # process header + assert self.fp is not None + + s = self.fp.read(18) + + id_len = s[0] + + colormaptype = s[1] + imagetype = s[2] + + depth = s[16] + + flags = s[17] + + self._size = i16(s, 12), i16(s, 14) + + # validate header fields + if ( + colormaptype not in (0, 1) + or self.size[0] <= 0 + or self.size[1] <= 0 + or depth not in (1, 8, 16, 24, 32) + ): + msg = "not a TGA file" + raise SyntaxError(msg) + + # image mode + if imagetype in (3, 11): + self._mode = "L" + if depth == 1: + self._mode = "1" # ??? + elif depth == 16: + self._mode = "LA" + elif imagetype in (1, 9): + self._mode = "P" if colormaptype else "L" + elif imagetype in (2, 10): + self._mode = "RGB" if depth == 24 else "RGBA" + else: + msg = "unknown TGA mode" + raise SyntaxError(msg) + + # orientation + orientation = flags & 0x30 + self._flip_horizontally = orientation in [0x10, 0x30] + if orientation in [0x20, 0x30]: + orientation = 1 + elif orientation in [0, 0x10]: + orientation = -1 + else: + msg = "unknown TGA orientation" + raise SyntaxError(msg) + + self.info["orientation"] = orientation + + if imagetype & 8: + self.info["compression"] = "tga_rle" + + if id_len: + self.info["id_section"] = self.fp.read(id_len) + + if colormaptype: + # read palette + start, size, mapdepth = i16(s, 3), i16(s, 5), s[7] + if mapdepth == 16: + self.palette = ImagePalette.raw( + "BGRA;15Z", bytes(2 * start) + self.fp.read(2 * size) + ) + self.palette.mode = "RGBA" + elif mapdepth == 24: + self.palette = ImagePalette.raw( + "BGR", bytes(3 * start) + self.fp.read(3 * size) + ) + elif mapdepth == 32: + self.palette = ImagePalette.raw( + "BGRA", bytes(4 * start) + self.fp.read(4 * size) + ) + else: + msg = "unknown TGA map depth" + raise SyntaxError(msg) + + # setup tile descriptor + try: + rawmode = MODES[(imagetype & 7, depth)] + if imagetype & 8: + # compressed + self.tile = [ + ImageFile._Tile( + "tga_rle", + (0, 0) + self.size, + self.fp.tell(), + (rawmode, orientation, depth), + ) + ] + else: + self.tile = [ + ImageFile._Tile( + "raw", + (0, 0) + self.size, + self.fp.tell(), + (rawmode, 0, orientation), + ) + ] + except KeyError: + pass # cannot decode + + def load_end(self) -> None: + if self.mode == "RGBA": + assert self.fp is not None + self.fp.seek(-26, os.SEEK_END) + footer = self.fp.read(26) + if footer.endswith(b"TRUEVISION-XFILE.\x00"): + # version 2 + extension_offset = i32(footer) + if extension_offset: + self.fp.seek(extension_offset + 494) + attributes_type = self.fp.read(1) + if attributes_type == b"\x00": + # No alpha + self.im.fillband(3, 255) + + if self._flip_horizontally: + self.im = self.im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) + + +# +# -------------------------------------------------------------------- +# Write TGA file + + +SAVE = { + "1": ("1", 1, 0, 3), + "L": ("L", 8, 0, 3), + "LA": ("LA", 16, 0, 3), + "P": ("P", 8, 1, 1), + "RGB": ("BGR", 24, 0, 2), + "RGBA": ("BGRA", 32, 0, 2), +} + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + try: + rawmode, bits, colormaptype, imagetype = SAVE[im.mode] + except KeyError as e: + msg = f"cannot write mode {im.mode} as TGA" + raise OSError(msg) from e + + if "rle" in im.encoderinfo: + rle = im.encoderinfo["rle"] + else: + compression = im.encoderinfo.get("compression", im.info.get("compression")) + rle = compression == "tga_rle" + if rle: + imagetype += 8 + + id_section = im.encoderinfo.get("id_section", im.info.get("id_section", "")) + id_len = len(id_section) + if id_len > 255: + id_len = 255 + id_section = id_section[:255] + warnings.warn("id_section has been trimmed to 255 characters") + + if colormaptype: + palette = im.im.getpalette("RGB", "BGR") + colormaplength, colormapentry = len(palette) // 3, 24 + else: + colormaplength, colormapentry = 0, 0 + + if im.mode in ("LA", "RGBA"): + flags = 8 + else: + flags = 0 + + orientation = im.encoderinfo.get("orientation", im.info.get("orientation", -1)) + if orientation > 0: + flags = flags | 0x20 + + fp.write( + o8(id_len) + + o8(colormaptype) + + o8(imagetype) + + o16(0) # colormapfirst + + o16(colormaplength) + + o8(colormapentry) + + o16(0) + + o16(0) + + o16(im.size[0]) + + o16(im.size[1]) + + o8(bits) + + o8(flags) + ) + + if id_section: + fp.write(id_section) + + if colormaptype: + fp.write(palette) + + if rle: + ImageFile._save( + im, + fp, + [ImageFile._Tile("tga_rle", (0, 0) + im.size, 0, (rawmode, orientation))], + ) + else: + ImageFile._save( + im, + fp, + [ImageFile._Tile("raw", (0, 0) + im.size, 0, (rawmode, 0, orientation))], + ) + + # write targa version 2 footer + fp.write(b"\000" * 8 + b"TRUEVISION-XFILE." + b"\000") + + +# +# -------------------------------------------------------------------- +# Registry + + +Image.register_open(TgaImageFile.format, TgaImageFile) +Image.register_save(TgaImageFile.format, _save) + +Image.register_extensions(TgaImageFile.format, [".tga", ".icb", ".vda", ".vst"]) + +Image.register_mime(TgaImageFile.format, "image/x-tga") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py new file mode 100644 index 000000000..5094faa13 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/TiffImagePlugin.py @@ -0,0 +1,2353 @@ +# +# The Python Imaging Library. +# $Id$ +# +# TIFF file handling +# +# TIFF is a flexible, if somewhat aged, image file format originally +# defined by Aldus. Although TIFF supports a wide variety of pixel +# layouts and compression methods, the name doesn't really stand for +# "thousands of incompatible file formats," it just feels that way. +# +# To read TIFF data from a stream, the stream must be seekable. For +# progressive decoding, make sure to use TIFF files where the tag +# directory is placed first in the file. +# +# History: +# 1995-09-01 fl Created +# 1996-05-04 fl Handle JPEGTABLES tag +# 1996-05-18 fl Fixed COLORMAP support +# 1997-01-05 fl Fixed PREDICTOR support +# 1997-08-27 fl Added support for rational tags (from Perry Stoll) +# 1998-01-10 fl Fixed seek/tell (from Jan Blom) +# 1998-07-15 fl Use private names for internal variables +# 1999-06-13 fl Rewritten for PIL 1.0 (1.0) +# 2000-10-11 fl Additional fixes for Python 2.0 (1.1) +# 2001-04-17 fl Fixed rewind support (seek to frame 0) (1.2) +# 2001-05-12 fl Added write support for more tags (from Greg Couch) (1.3) +# 2001-12-18 fl Added workaround for broken Matrox library +# 2002-01-18 fl Don't mess up if photometric tag is missing (D. Alan Stewart) +# 2003-05-19 fl Check FILLORDER tag +# 2003-09-26 fl Added RGBa support +# 2004-02-24 fl Added DPI support; fixed rational write support +# 2005-02-07 fl Added workaround for broken Corel Draw 10 files +# 2006-01-09 fl Added support for float/double tags (from Russell Nelson) +# +# Copyright (c) 1997-2006 by Secret Labs AB. All rights reserved. +# Copyright (c) 1995-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import io +import itertools +import logging +import math +import os +import struct +import warnings +from collections.abc import Callable, MutableMapping +from fractions import Fraction +from numbers import Number, Rational +from typing import IO, Any, cast + +from . import ExifTags, Image, ImageFile, ImageOps, ImagePalette, TiffTags +from ._binary import i16be as i16 +from ._binary import i32be as i32 +from ._binary import o8 +from ._util import DeferredError, is_path +from .TiffTags import TYPES + +TYPE_CHECKING = False +if TYPE_CHECKING: + from collections.abc import Iterator + from typing import NoReturn + + from ._typing import Buffer, IntegralLike, StrOrBytesPath + +logger = logging.getLogger(__name__) + +# Set these to true to force use of libtiff for reading or writing. +READ_LIBTIFF = False +WRITE_LIBTIFF = False +STRIP_SIZE = 65536 + +II = b"II" # little-endian (Intel style) +MM = b"MM" # big-endian (Motorola style) + +# +# -------------------------------------------------------------------- +# Read TIFF files + +# a few tag names, just to make the code below a bit more readable +OSUBFILETYPE = 255 +IMAGEWIDTH = 256 +IMAGELENGTH = 257 +BITSPERSAMPLE = 258 +COMPRESSION = 259 +PHOTOMETRIC_INTERPRETATION = 262 +FILLORDER = 266 +IMAGEDESCRIPTION = 270 +STRIPOFFSETS = 273 +SAMPLESPERPIXEL = 277 +ROWSPERSTRIP = 278 +STRIPBYTECOUNTS = 279 +X_RESOLUTION = 282 +Y_RESOLUTION = 283 +PLANAR_CONFIGURATION = 284 +RESOLUTION_UNIT = 296 +TRANSFERFUNCTION = 301 +SOFTWARE = 305 +DATE_TIME = 306 +ARTIST = 315 +PREDICTOR = 317 +COLORMAP = 320 +TILEWIDTH = 322 +TILELENGTH = 323 +TILEOFFSETS = 324 +TILEBYTECOUNTS = 325 +SUBIFD = 330 +EXTRASAMPLES = 338 +SAMPLEFORMAT = 339 +JPEGTABLES = 347 +YCBCRSUBSAMPLING = 530 +REFERENCEBLACKWHITE = 532 +COPYRIGHT = 33432 +IPTC_NAA_CHUNK = 33723 # newsphoto properties +PHOTOSHOP_CHUNK = 34377 # photoshop properties +ICCPROFILE = 34675 +EXIFIFD = 34665 +XMP = 700 +JPEGQUALITY = 65537 # pseudo-tag by libtiff + +# https://github.com/imagej/ImageJA/blob/master/src/main/java/ij/io/TiffDecoder.java +IMAGEJ_META_DATA_BYTE_COUNTS = 50838 +IMAGEJ_META_DATA = 50839 + +COMPRESSION_INFO = { + # Compression => pil compression name + 1: "raw", + 2: "tiff_ccitt", + 3: "group3", + 4: "group4", + 5: "tiff_lzw", + 6: "tiff_jpeg", # obsolete + 7: "jpeg", + 8: "tiff_adobe_deflate", + 32771: "tiff_raw_16", # 16-bit padding + 32773: "packbits", + 32809: "tiff_thunderscan", + 32946: "tiff_deflate", + 34676: "tiff_sgilog", + 34677: "tiff_sgilog24", + 34925: "lzma", + 50000: "zstd", + 50001: "webp", +} + +COMPRESSION_INFO_REV = {v: k for k, v in COMPRESSION_INFO.items()} + +OPEN_INFO = { + # (ByteOrder, PhotoInterpretation, SampleFormat, FillOrder, BitsPerSample, + # ExtraSamples) => mode, rawmode + (II, 0, (1,), 1, (1,), ()): ("1", "1;I"), + (MM, 0, (1,), 1, (1,), ()): ("1", "1;I"), + (II, 0, (1,), 2, (1,), ()): ("1", "1;IR"), + (MM, 0, (1,), 2, (1,), ()): ("1", "1;IR"), + (II, 1, (1,), 1, (1,), ()): ("1", "1"), + (MM, 1, (1,), 1, (1,), ()): ("1", "1"), + (II, 1, (1,), 2, (1,), ()): ("1", "1;R"), + (MM, 1, (1,), 2, (1,), ()): ("1", "1;R"), + (II, 0, (1,), 1, (2,), ()): ("L", "L;2I"), + (MM, 0, (1,), 1, (2,), ()): ("L", "L;2I"), + (II, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), + (MM, 0, (1,), 2, (2,), ()): ("L", "L;2IR"), + (II, 1, (1,), 1, (2,), ()): ("L", "L;2"), + (MM, 1, (1,), 1, (2,), ()): ("L", "L;2"), + (II, 1, (1,), 2, (2,), ()): ("L", "L;2R"), + (MM, 1, (1,), 2, (2,), ()): ("L", "L;2R"), + (II, 0, (1,), 1, (4,), ()): ("L", "L;4I"), + (MM, 0, (1,), 1, (4,), ()): ("L", "L;4I"), + (II, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), + (MM, 0, (1,), 2, (4,), ()): ("L", "L;4IR"), + (II, 1, (1,), 1, (4,), ()): ("L", "L;4"), + (MM, 1, (1,), 1, (4,), ()): ("L", "L;4"), + (II, 1, (1,), 2, (4,), ()): ("L", "L;4R"), + (MM, 1, (1,), 2, (4,), ()): ("L", "L;4R"), + (II, 0, (1,), 1, (8,), ()): ("L", "L;I"), + (MM, 0, (1,), 1, (8,), ()): ("L", "L;I"), + (II, 0, (1,), 2, (8,), ()): ("L", "L;IR"), + (MM, 0, (1,), 2, (8,), ()): ("L", "L;IR"), + (II, 1, (1,), 1, (8,), ()): ("L", "L"), + (MM, 1, (1,), 1, (8,), ()): ("L", "L"), + (II, 1, (2,), 1, (8,), ()): ("L", "L"), + (MM, 1, (2,), 1, (8,), ()): ("L", "L"), + (II, 1, (1,), 2, (8,), ()): ("L", "L;R"), + (MM, 1, (1,), 2, (8,), ()): ("L", "L;R"), + (II, 1, (1,), 1, (12,), ()): ("I;16", "I;12"), + (II, 0, (1,), 1, (16,), ()): ("I;16", "I;16"), + (II, 1, (1,), 1, (16,), ()): ("I;16", "I;16"), + (MM, 1, (1,), 1, (16,), ()): ("I;16B", "I;16B"), + (II, 1, (1,), 2, (16,), ()): ("I;16", "I;16R"), + (II, 1, (2,), 1, (16,), ()): ("I", "I;16S"), + (MM, 1, (2,), 1, (16,), ()): ("I", "I;16BS"), + (II, 0, (3,), 1, (32,), ()): ("F", "F;32F"), + (MM, 0, (3,), 1, (32,), ()): ("F", "F;32BF"), + (II, 1, (1,), 1, (32,), ()): ("I", "I;32N"), + (II, 1, (2,), 1, (32,), ()): ("I", "I;32S"), + (MM, 1, (2,), 1, (32,), ()): ("I", "I;32BS"), + (II, 1, (3,), 1, (32,), ()): ("F", "F;32F"), + (MM, 1, (3,), 1, (32,), ()): ("F", "F;32BF"), + (II, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), + (MM, 1, (1,), 1, (8, 8), (2,)): ("LA", "LA"), + (II, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), + (MM, 2, (1,), 1, (8, 8, 8), ()): ("RGB", "RGB"), + (II, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), + (MM, 2, (1,), 2, (8, 8, 8), ()): ("RGB", "RGB;R"), + (II, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples + (MM, 2, (1,), 1, (8, 8, 8, 8), ()): ("RGBA", "RGBA"), # missing ExtraSamples + (II, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGBX"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (0,)): ("RGB", "RGBX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGBXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (0, 0)): ("RGB", "RGBXX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGBXXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0, 0)): ("RGB", "RGBXXX"), + (II, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (1,)): ("RGBA", "RGBa"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (1, 0)): ("RGBA", "RGBaX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (1, 0, 0)): ("RGBA", "RGBaXX"), + (II, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), + (MM, 2, (1,), 1, (8, 8, 8, 8), (2,)): ("RGBA", "RGBA"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8), (2, 0)): ("RGBA", "RGBAX"), + (II, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), + (MM, 2, (1,), 1, (8, 8, 8, 8, 8, 8), (2, 0, 0)): ("RGBA", "RGBAXX"), + (II, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 + (MM, 2, (1,), 1, (8, 8, 8, 8), (999,)): ("RGBA", "RGBA"), # Corel Draw 10 + (II, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16L"), + (MM, 2, (1,), 1, (16, 16, 16), ()): ("RGB", "RGB;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), ()): ("RGBA", "RGBA;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGB", "RGBX;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (0,)): ("RGB", "RGBX;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (1,)): ("RGBA", "RGBa;16B"), + (II, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16L"), + (MM, 2, (1,), 1, (16, 16, 16, 16), (2,)): ("RGBA", "RGBA;16B"), + (II, 3, (1,), 1, (1,), ()): ("P", "P;1"), + (MM, 3, (1,), 1, (1,), ()): ("P", "P;1"), + (II, 3, (1,), 2, (1,), ()): ("P", "P;1R"), + (MM, 3, (1,), 2, (1,), ()): ("P", "P;1R"), + (II, 3, (1,), 1, (2,), ()): ("P", "P;2"), + (MM, 3, (1,), 1, (2,), ()): ("P", "P;2"), + (II, 3, (1,), 2, (2,), ()): ("P", "P;2R"), + (MM, 3, (1,), 2, (2,), ()): ("P", "P;2R"), + (II, 3, (1,), 1, (4,), ()): ("P", "P;4"), + (MM, 3, (1,), 1, (4,), ()): ("P", "P;4"), + (II, 3, (1,), 2, (4,), ()): ("P", "P;4R"), + (MM, 3, (1,), 2, (4,), ()): ("P", "P;4R"), + (II, 3, (1,), 1, (8,), ()): ("P", "P"), + (MM, 3, (1,), 1, (8,), ()): ("P", "P"), + (II, 3, (1,), 1, (8, 8), (0,)): ("P", "PX"), + (MM, 3, (1,), 1, (8, 8), (0,)): ("P", "PX"), + (II, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), + (MM, 3, (1,), 1, (8, 8), (2,)): ("PA", "PA"), + (II, 3, (1,), 2, (8,), ()): ("P", "P;R"), + (MM, 3, (1,), 2, (8,), ()): ("P", "P;R"), + (II, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), + (MM, 5, (1,), 1, (8, 8, 8, 8), ()): ("CMYK", "CMYK"), + (II, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), + (MM, 5, (1,), 1, (8, 8, 8, 8, 8), (0,)): ("CMYK", "CMYKX"), + (II, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), + (MM, 5, (1,), 1, (8, 8, 8, 8, 8, 8), (0, 0)): ("CMYK", "CMYKXX"), + (II, 5, (1,), 1, (16, 16, 16, 16), ()): ("CMYK", "CMYK;16L"), + (MM, 5, (1,), 1, (16, 16, 16, 16), ()): ("CMYK", "CMYK;16B"), + (II, 6, (1,), 1, (8,), ()): ("L", "L"), + (MM, 6, (1,), 1, (8,), ()): ("L", "L"), + # JPEG compressed images handled by LibTiff and auto-converted to RGBX + # Minimal Baseline TIFF requires YCbCr images to have 3 SamplesPerPixel + (II, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"), + (MM, 6, (1,), 1, (8, 8, 8), ()): ("RGB", "RGBX"), + (II, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), + (MM, 8, (1,), 1, (8, 8, 8), ()): ("LAB", "LAB"), +} + +MAX_SAMPLESPERPIXEL = max(len(key_tp[4]) for key_tp in OPEN_INFO) + +PREFIXES = [ + b"MM\x00\x2a", # Valid TIFF header with big-endian byte order + b"II\x2a\x00", # Valid TIFF header with little-endian byte order + b"MM\x2a\x00", # Invalid TIFF header, assume big-endian + b"II\x00\x2a", # Invalid TIFF header, assume little-endian + b"MM\x00\x2b", # BigTIFF with big-endian byte order + b"II\x2b\x00", # BigTIFF with little-endian byte order +] + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(tuple(PREFIXES)) + + +def _limit_rational( + val: float | Fraction | IFDRational, max_val: int +) -> tuple[IntegralLike, IntegralLike]: + inv = abs(val) > 1 + n_d = IFDRational(1 / val if inv else val).limit_rational(max_val) + return n_d[::-1] if inv else n_d + + +def _limit_signed_rational( + val: IFDRational, max_val: int, min_val: int +) -> tuple[IntegralLike, IntegralLike]: + frac = Fraction(val) + n_d: tuple[IntegralLike, IntegralLike] = frac.numerator, frac.denominator + + if min(float(i) for i in n_d) < min_val: + n_d = _limit_rational(val, abs(min_val)) + + n_d_float = tuple(float(i) for i in n_d) + if max(n_d_float) > max_val: + n_d = _limit_rational(n_d_float[0] / n_d_float[1], max_val) + + return n_d + + +## +# Wrapper for TIFF IFDs. + +_load_dispatch = {} +_write_dispatch = {} + + +def _delegate(op: str) -> Any: + def delegate( + self: IFDRational, *args: tuple[float, ...] + ) -> bool | float | Fraction: + return getattr(self._val, op)(*args) + + return delegate + + +class IFDRational(Rational): + """Implements a rational class where 0/0 is a legal value to match + the in the wild use of exif rationals. + + e.g., DigitalZoomRatio - 0.00/0.00 indicates that no digital zoom was used + """ + + """ If the denominator is 0, store this as a float('nan'), otherwise store + as a fractions.Fraction(). Delegate as appropriate + + """ + + __slots__ = ("_numerator", "_denominator", "_val") + + def __init__( + self, value: float | Fraction | IFDRational, denominator: int = 1 + ) -> None: + """ + :param value: either an integer numerator, a + float/rational/other number, or an IFDRational + :param denominator: Optional integer denominator + """ + self._val: Fraction | float + if isinstance(value, IFDRational): + self._numerator = value.numerator + self._denominator = value.denominator + self._val = value._val + return + + if isinstance(value, Fraction): + self._numerator = value.numerator + self._denominator = value.denominator + else: + if TYPE_CHECKING: + self._numerator = cast(IntegralLike, value) + else: + self._numerator = value + self._denominator = denominator + + if denominator == 0: + self._val = float("nan") + elif denominator == 1: + self._val = Fraction(value) + elif int(value) == value: + self._val = Fraction(int(value), denominator) + else: + self._val = Fraction(value / denominator) + + @property + def numerator(self) -> IntegralLike: + return self._numerator + + @property + def denominator(self) -> int: + return self._denominator + + def limit_rational(self, max_denominator: int) -> tuple[IntegralLike, int]: + """ + + :param max_denominator: Integer, the maximum denominator value + :returns: Tuple of (numerator, denominator) + """ + + if self.denominator == 0: + return self.numerator, self.denominator + + assert isinstance(self._val, Fraction) + f = self._val.limit_denominator(max_denominator) + return f.numerator, f.denominator + + def __repr__(self) -> str: + return str(float(self._val)) + + def __hash__(self) -> int: # type: ignore[override] + return self._val.__hash__() + + def __eq__(self, other: object) -> bool: + val = self._val + if isinstance(other, IFDRational): + other = other._val + if isinstance(other, float): + val = float(val) + return val == other + + def __getstate__(self) -> list[float | Fraction | IntegralLike]: + return [self._val, self._numerator, self._denominator] + + def __setstate__(self, state: list[float | Fraction | IntegralLike]) -> None: + IFDRational.__init__(self, 0) + _val, _numerator, _denominator = state + assert isinstance(_val, (float, Fraction)) + self._val = _val + if TYPE_CHECKING: + self._numerator = cast(IntegralLike, _numerator) + else: + self._numerator = _numerator + assert isinstance(_denominator, int) + self._denominator = _denominator + + """ a = ['add','radd', 'sub', 'rsub', 'mul', 'rmul', + 'truediv', 'rtruediv', 'floordiv', 'rfloordiv', + 'mod','rmod', 'pow','rpow', 'pos', 'neg', + 'abs', 'trunc', 'lt', 'gt', 'le', 'ge', 'bool', + 'ceil', 'floor', 'round'] + print("\n".join("__%s__ = _delegate('__%s__')" % (s,s) for s in a)) + """ + + __add__ = _delegate("__add__") + __radd__ = _delegate("__radd__") + __sub__ = _delegate("__sub__") + __rsub__ = _delegate("__rsub__") + __mul__ = _delegate("__mul__") + __rmul__ = _delegate("__rmul__") + __truediv__ = _delegate("__truediv__") + __rtruediv__ = _delegate("__rtruediv__") + __floordiv__ = _delegate("__floordiv__") + __rfloordiv__ = _delegate("__rfloordiv__") + __mod__ = _delegate("__mod__") + __rmod__ = _delegate("__rmod__") + __pow__ = _delegate("__pow__") + __rpow__ = _delegate("__rpow__") + __pos__ = _delegate("__pos__") + __neg__ = _delegate("__neg__") + __abs__ = _delegate("__abs__") + __trunc__ = _delegate("__trunc__") + __lt__ = _delegate("__lt__") + __gt__ = _delegate("__gt__") + __le__ = _delegate("__le__") + __ge__ = _delegate("__ge__") + __bool__ = _delegate("__bool__") + __ceil__ = _delegate("__ceil__") + __floor__ = _delegate("__floor__") + __round__ = _delegate("__round__") + # Python >= 3.11 + if hasattr(Fraction, "__int__"): + __int__ = _delegate("__int__") + + +_LoaderFunc = Callable[["ImageFileDirectory_v2", bytes, bool], Any] + + +def _register_loader(idx: int, size: int) -> Callable[[_LoaderFunc], _LoaderFunc]: + def decorator(func: _LoaderFunc) -> _LoaderFunc: + from .TiffTags import TYPES + + if func.__name__.startswith("load_"): + TYPES[idx] = func.__name__[5:].replace("_", " ") + _load_dispatch[idx] = size, func # noqa: F821 + return func + + return decorator + + +def _register_writer(idx: int) -> Callable[[Callable[..., Any]], Callable[..., Any]]: + def decorator(func: Callable[..., Any]) -> Callable[..., Any]: + _write_dispatch[idx] = func # noqa: F821 + return func + + return decorator + + +def _register_basic(idx_fmt_name: tuple[int, str, str]) -> None: + from .TiffTags import TYPES + + idx, fmt, name = idx_fmt_name + TYPES[idx] = name + size = struct.calcsize(f"={fmt}") + + def basic_handler( + self: ImageFileDirectory_v2, data: bytes, legacy_api: bool = True + ) -> tuple[Any, ...]: + return self._unpack(f"{len(data) // size}{fmt}", data) + + _load_dispatch[idx] = size, basic_handler # noqa: F821 + _write_dispatch[idx] = lambda self, *values: ( # noqa: F821 + b"".join(self._pack(fmt, value) for value in values) + ) + + +if TYPE_CHECKING: + _IFDv2Base = MutableMapping[int, Any] +else: + _IFDv2Base = MutableMapping + + +class ImageFileDirectory_v2(_IFDv2Base): + """This class represents a TIFF tag directory. To speed things up, we + don't decode tags unless they're asked for. + + Exposes a dictionary interface of the tags in the directory:: + + ifd = ImageFileDirectory_v2() + ifd[key] = 'Some Data' + ifd.tagtype[key] = TiffTags.ASCII + print(ifd[key]) + 'Some Data' + + Individual values are returned as the strings or numbers, sequences are + returned as tuples of the values. + + The tiff metadata type of each item is stored in a dictionary of + tag types in + :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v2.tagtype`. The types + are read from a tiff file, guessed from the type added, or added + manually. + + Data Structures: + + * ``self.tagtype = {}`` + + * Key: numerical TIFF tag number + * Value: integer corresponding to the data type from + :py:data:`.TiffTags.TYPES` + + .. versionadded:: 3.0.0 + + 'Internal' data structures: + + * ``self._tags_v2 = {}`` + + * Key: numerical TIFF tag number + * Value: decoded data, as tuple for multiple values + + * ``self._tagdata = {}`` + + * Key: numerical TIFF tag number + * Value: undecoded byte string from file + + * ``self._tags_v1 = {}`` + + * Key: numerical TIFF tag number + * Value: decoded data in the v1 format + + Tags will be found in the private attributes ``self._tagdata``, and in + ``self._tags_v2`` once decoded. + + ``self.legacy_api`` is a value for internal use, and shouldn't be changed + from outside code. In cooperation with + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1`, if ``legacy_api`` + is true, then decoded tags will be populated into both ``_tags_v1`` and + ``_tags_v2``. ``_tags_v2`` will be used if this IFD is used in the TIFF + save routine. Tags should be read from ``_tags_v1`` if + ``legacy_api == true``. + + """ + + _load_dispatch: dict[int, tuple[int, _LoaderFunc]] = {} + _write_dispatch: dict[int, Callable[..., Any]] = {} + + def __init__( + self, + ifh: bytes = b"II\x2a\x00\x00\x00\x00\x00", + prefix: bytes | None = None, + group: int | None = None, + ) -> None: + """Initialize an ImageFileDirectory. + + To construct an ImageFileDirectory from a real file, pass the 8-byte + magic header to the constructor. To only set the endianness, pass it + as the 'prefix' keyword argument. + + :param ifh: One of the accepted magic headers (cf. PREFIXES); also sets + endianness. + :param prefix: Override the endianness of the file. + """ + if not _accept(ifh): + msg = f"not a TIFF file (header {repr(ifh)} not valid)" + raise SyntaxError(msg) + self._prefix = prefix if prefix is not None else ifh[:2] + if self._prefix == MM: + self._endian = ">" + elif self._prefix == II: + self._endian = "<" + else: + msg = "not a TIFF IFD" + raise SyntaxError(msg) + self._bigtiff = ifh[2] == 43 + self.group = group + self.tagtype: dict[int, int] = {} + """ Dictionary of tag types """ + self.reset() + self.next = ( + self._unpack("Q", ifh[8:])[0] + if self._bigtiff + else self._unpack("L", ifh[4:])[0] + ) + self._legacy_api = False + + prefix = property(lambda self: self._prefix) + offset = property(lambda self: self._offset) + + @property + def legacy_api(self) -> bool: + return self._legacy_api + + @legacy_api.setter + def legacy_api(self, value: bool) -> NoReturn: + msg = "Not allowing setting of legacy api" + raise Exception(msg) + + def reset(self) -> None: + self._tags_v1: dict[int, Any] = {} # will remain empty if legacy_api is false + self._tags_v2: dict[int, Any] = {} # main tag storage + self._tagdata: dict[int, bytes] = {} + self.tagtype = {} # added 2008-06-05 by Florian Hoech + self._next = None + self._offset: int | None = None + + def __str__(self) -> str: + return str(dict(self)) + + def named(self) -> dict[str, Any]: + """ + :returns: dict of name|key: value + + Returns the complete tag dictionary, with named tags where possible. + """ + return { + TiffTags.lookup(code, self.group).name: value + for code, value in self.items() + } + + def __len__(self) -> int: + return len(set(self._tagdata) | set(self._tags_v2)) + + def __getitem__(self, tag: int) -> Any: + if tag not in self._tags_v2: # unpack on the fly + data = self._tagdata[tag] + typ = self.tagtype[tag] + size, handler = self._load_dispatch[typ] + self[tag] = handler(self, data, self.legacy_api) # check type + val = self._tags_v2[tag] + if self.legacy_api and not isinstance(val, (tuple, bytes)): + val = (val,) + return val + + def __contains__(self, tag: object) -> bool: + return tag in self._tags_v2 or tag in self._tagdata + + def __setitem__(self, tag: int, value: Any) -> None: + self._setitem(tag, value, self.legacy_api) + + def _setitem(self, tag: int, value: Any, legacy_api: bool) -> None: + basetypes = (Number, bytes, str) + + info = TiffTags.lookup(tag, self.group) + values = [value] if isinstance(value, basetypes) else value + + if tag not in self.tagtype: + if info.type: + self.tagtype[tag] = info.type + else: + self.tagtype[tag] = TiffTags.UNDEFINED + if all(isinstance(v, IFDRational) for v in values): + for v in values: + assert isinstance(v, IFDRational) + if v < 0: + self.tagtype[tag] = TiffTags.SIGNED_RATIONAL + break + else: + self.tagtype[tag] = TiffTags.RATIONAL + elif all(isinstance(v, int) for v in values): + short = True + signed_short = True + long = True + for v in values: + assert isinstance(v, int) + if short and not (0 <= v < 2**16): + short = False + if signed_short and not (-(2**15) < v < 2**15): + signed_short = False + if long and v < 0: + long = False + if short: + self.tagtype[tag] = TiffTags.SHORT + elif signed_short: + self.tagtype[tag] = TiffTags.SIGNED_SHORT + elif long: + self.tagtype[tag] = TiffTags.LONG + else: + self.tagtype[tag] = TiffTags.SIGNED_LONG + elif all(isinstance(v, float) for v in values): + self.tagtype[tag] = TiffTags.DOUBLE + elif all(isinstance(v, str) for v in values): + self.tagtype[tag] = TiffTags.ASCII + elif all(isinstance(v, bytes) for v in values): + self.tagtype[tag] = TiffTags.BYTE + + if self.tagtype[tag] == TiffTags.UNDEFINED: + values = [ + v.encode("ascii", "replace") if isinstance(v, str) else v + for v in values + ] + elif self.tagtype[tag] == TiffTags.RATIONAL: + values = [float(v) if isinstance(v, int) else v for v in values] + + is_ifd = self.tagtype[tag] == TiffTags.LONG and isinstance(values, dict) + if not is_ifd: + values = tuple( + info.cvt_enum(value) if isinstance(value, str) else value + for value in values + ) + + dest = self._tags_v1 if legacy_api else self._tags_v2 + + # Three branches: + # Spec'd length == 1, Actual length 1, store as element + # Spec'd length == 1, Actual > 1, Warn and truncate. Formerly barfed. + # No Spec, Actual length 1, Formerly (<4.2) returned a 1 element tuple. + # Don't mess with the legacy api, since it's frozen. + if not is_ifd and ( + (info.length == 1) + or self.tagtype[tag] == TiffTags.BYTE + or (info.length is None and len(values) == 1 and not legacy_api) + ): + # Don't mess with the legacy api, since it's frozen. + if legacy_api and self.tagtype[tag] in [ + TiffTags.RATIONAL, + TiffTags.SIGNED_RATIONAL, + ]: # rationals + values = (values,) + try: + (dest[tag],) = values + except ValueError: + # We've got a builtin tag with 1 expected entry + warnings.warn( + f"Metadata Warning, tag {tag} had too many entries: " + f"{len(values)}, expected 1" + ) + dest[tag] = values[0] + + else: + # Spec'd length > 1 or undefined + # Unspec'd, and length > 1 + dest[tag] = values + + def __delitem__(self, tag: int) -> None: + self._tags_v2.pop(tag, None) + self._tags_v1.pop(tag, None) + self._tagdata.pop(tag, None) + + def __iter__(self) -> Iterator[int]: + return iter(set(self._tagdata) | set(self._tags_v2)) + + def _unpack(self, fmt: str, data: bytes) -> tuple[Any, ...]: + return struct.unpack(self._endian + fmt, data) + + def _pack(self, fmt: str, *values: Any) -> bytes: + return struct.pack(self._endian + fmt, *values) + + list( + map( + _register_basic, + [ + (TiffTags.SHORT, "H", "short"), + (TiffTags.LONG, "L", "long"), + (TiffTags.SIGNED_BYTE, "b", "signed byte"), + (TiffTags.SIGNED_SHORT, "h", "signed short"), + (TiffTags.SIGNED_LONG, "l", "signed long"), + (TiffTags.FLOAT, "f", "float"), + (TiffTags.DOUBLE, "d", "double"), + (TiffTags.IFD, "L", "long"), + (TiffTags.LONG8, "Q", "long8"), + ], + ) + ) + + @_register_loader(1, 1) # Basic type, except for the legacy API. + def load_byte(self, data: bytes, legacy_api: bool = True) -> bytes: + return data + + @_register_writer(1) # Basic type, except for the legacy API. + def write_byte(self, data: bytes | int | IFDRational) -> bytes: + if isinstance(data, IFDRational): + data = int(data) + if isinstance(data, int): + data = bytes((data,)) + return data + + @_register_loader(2, 1) + def load_string(self, data: bytes, legacy_api: bool = True) -> str: + if data.endswith(b"\0"): + data = data[:-1] + return data.decode("latin-1", "replace") + + @_register_writer(2) + def write_string(self, value: str | bytes | int) -> bytes: + # remerge of https://github.com/python-pillow/Pillow/pull/1416 + if isinstance(value, int): + value = str(value) + if not isinstance(value, bytes): + value = value.encode("ascii", "replace") + return value + b"\0" + + @_register_loader(5, 8) + def load_rational( + self, data: bytes, legacy_api: bool = True + ) -> tuple[tuple[int, int] | IFDRational, ...]: + vals = self._unpack(f"{len(data) // 4}L", data) + + def combine(a: int, b: int) -> tuple[int, int] | IFDRational: + return (a, b) if legacy_api else IFDRational(a, b) + + return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) + + @_register_writer(5) + def write_rational(self, *values: IFDRational) -> bytes: + return b"".join( + self._pack("2L", *_limit_rational(frac, 2**32 - 1)) for frac in values + ) + + @_register_loader(7, 1) + def load_undefined(self, data: bytes, legacy_api: bool = True) -> bytes: + return data + + @_register_writer(7) + def write_undefined(self, value: bytes | int | IFDRational) -> bytes: + if isinstance(value, IFDRational): + value = int(value) + if isinstance(value, int): + value = str(value).encode("ascii", "replace") + return value + + @_register_loader(10, 8) + def load_signed_rational( + self, data: bytes, legacy_api: bool = True + ) -> tuple[tuple[int, int] | IFDRational, ...]: + vals = self._unpack(f"{len(data) // 4}l", data) + + def combine(a: int, b: int) -> tuple[int, int] | IFDRational: + return (a, b) if legacy_api else IFDRational(a, b) + + return tuple(combine(num, denom) for num, denom in zip(vals[::2], vals[1::2])) + + @_register_writer(10) + def write_signed_rational(self, *values: IFDRational) -> bytes: + return b"".join( + self._pack("2l", *_limit_signed_rational(frac, 2**31 - 1, -(2**31))) + for frac in values + ) + + def _ensure_read(self, fp: IO[bytes], size: int) -> bytes: + ret = fp.read(size) + if len(ret) != size: + msg = ( + "Corrupt EXIF data. " + f"Expecting to read {size} bytes but only got {len(ret)}. " + ) + raise OSError(msg) + return ret + + def load(self, fp: IO[bytes]) -> None: + self.reset() + self._offset = fp.tell() + + try: + tag_count = ( + self._unpack("Q", self._ensure_read(fp, 8)) + if self._bigtiff + else self._unpack("H", self._ensure_read(fp, 2)) + )[0] + for i in range(tag_count): + tag, typ, count, data = ( + self._unpack("HHQ8s", self._ensure_read(fp, 20)) + if self._bigtiff + else self._unpack("HHL4s", self._ensure_read(fp, 12)) + ) + + tagname = TiffTags.lookup(tag, self.group).name + typname = TYPES.get(typ, "unknown") + msg = f"tag: {tagname} ({tag}) - type: {typname} ({typ})" + + try: + unit_size, handler = self._load_dispatch[typ] + except KeyError: + logger.debug("%s - unsupported type %s", msg, typ) + continue # ignore unsupported type + size = count * unit_size + if size > (8 if self._bigtiff else 4): + here = fp.tell() + (offset,) = self._unpack("Q" if self._bigtiff else "L", data) + msg += f" Tag Location: {here} - Data Location: {offset}" + fp.seek(offset) + data = ImageFile._safe_read(fp, size) + fp.seek(here) + else: + data = data[:size] + + if len(data) != size: + warnings.warn( + "Possibly corrupt EXIF data. " + f"Expecting to read {size} bytes but only got {len(data)}." + f" Skipping tag {tag}" + ) + logger.debug(msg) + continue + + if not data: + logger.debug(msg) + continue + + self._tagdata[tag] = data + self.tagtype[tag] = typ + + msg += " - value: " + msg += f"" if size > 32 else repr(data) + + logger.debug(msg) + + (self.next,) = ( + self._unpack("Q", self._ensure_read(fp, 8)) + if self._bigtiff + else self._unpack("L", self._ensure_read(fp, 4)) + ) + except OSError as msg: + warnings.warn(str(msg)) + return + + def _get_ifh(self) -> bytes: + ifh = self._prefix + self._pack("H", 43 if self._bigtiff else 42) + if self._bigtiff: + ifh += self._pack("HH", 8, 0) + ifh += self._pack("Q", 16) if self._bigtiff else self._pack("L", 8) + + return ifh + + def tobytes(self, offset: int = 0) -> bytes: + # FIXME What about tagdata? + result = self._pack("Q" if self._bigtiff else "H", len(self._tags_v2)) + + entries: list[tuple[int, int, int, bytes, bytes]] = [] + + fmt = "Q" if self._bigtiff else "L" + fmt_size = 8 if self._bigtiff else 4 + offset += ( + len(result) + len(self._tags_v2) * (20 if self._bigtiff else 12) + fmt_size + ) + stripoffsets = None + + # pass 1: convert tags to binary format + # always write tags in ascending order + for tag, value in sorted(self._tags_v2.items()): + if tag == STRIPOFFSETS: + stripoffsets = len(entries) + typ = self.tagtype[tag] + logger.debug("Tag %s, Type: %s, Value: %s", tag, typ, repr(value)) + is_ifd = typ == TiffTags.LONG and isinstance(value, dict) + if is_ifd: + ifd = ImageFileDirectory_v2(self._get_ifh(), group=tag) + values = self._tags_v2[tag] + for ifd_tag, ifd_value in values.items(): + ifd[ifd_tag] = ifd_value + data = ifd.tobytes(offset) + else: + values = value if isinstance(value, tuple) else (value,) + data = self._write_dispatch[typ](self, *values) + + tagname = TiffTags.lookup(tag, self.group).name + typname = "ifd" if is_ifd else TYPES.get(typ, "unknown") + msg = f"save: {tagname} ({tag}) - type: {typname} ({typ}) - value: " + msg += f"" if len(data) >= 16 else str(values) + logger.debug(msg) + + # count is sum of lengths for string and arbitrary data + if is_ifd: + count = 1 + elif typ in [TiffTags.BYTE, TiffTags.ASCII, TiffTags.UNDEFINED]: + count = len(data) + else: + count = len(values) + # figure out if data fits into the entry + if len(data) <= fmt_size: + entries.append((tag, typ, count, data.ljust(fmt_size, b"\0"), b"")) + else: + entries.append((tag, typ, count, self._pack(fmt, offset), data)) + offset += (len(data) + 1) // 2 * 2 # pad to word + + # update strip offset data to point beyond auxiliary data + if stripoffsets is not None: + tag, typ, count, value, data = entries[stripoffsets] + if data: + size, handler = self._load_dispatch[typ] + values = [val + offset for val in handler(self, data, self.legacy_api)] + data = self._write_dispatch[typ](self, *values) + else: + value = self._pack(fmt, self._unpack(fmt, value)[0] + offset) + entries[stripoffsets] = tag, typ, count, value, data + + # pass 2: write entries to file + for tag, typ, count, value, data in entries: + logger.debug("%s %s %s %s %s", tag, typ, count, repr(value), repr(data)) + result += self._pack( + "HHQ8s" if self._bigtiff else "HHL4s", tag, typ, count, value + ) + + # -- overwrite here for multi-page -- + result += self._pack(fmt, 0) # end of entries + + # pass 3: write auxiliary data to file + for tag, typ, count, value, data in entries: + result += data + if len(data) & 1: + result += b"\0" + + return result + + def save(self, fp: IO[bytes]) -> int: + if fp.tell() == 0: # skip TIFF header on subsequent pages + fp.write(self._get_ifh()) + + offset = fp.tell() + result = self.tobytes(offset) + fp.write(result) + return offset + len(result) + + +ImageFileDirectory_v2._load_dispatch = _load_dispatch +ImageFileDirectory_v2._write_dispatch = _write_dispatch +for idx, name in TYPES.items(): + name = name.replace(" ", "_") + setattr(ImageFileDirectory_v2, f"load_{name}", _load_dispatch[idx][1]) + setattr(ImageFileDirectory_v2, f"write_{name}", _write_dispatch[idx]) +del _load_dispatch, _write_dispatch, idx, name + + +# Legacy ImageFileDirectory support. +class ImageFileDirectory_v1(ImageFileDirectory_v2): + """This class represents the **legacy** interface to a TIFF tag directory. + + Exposes a dictionary interface of the tags in the directory:: + + ifd = ImageFileDirectory_v1() + ifd[key] = 'Some Data' + ifd.tagtype[key] = TiffTags.ASCII + print(ifd[key]) + ('Some Data',) + + Also contains a dictionary of tag types as read from the tiff image file, + :attr:`~PIL.TiffImagePlugin.ImageFileDirectory_v1.tagtype`. + + Values are returned as a tuple. + + .. deprecated:: 3.0.0 + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + self._legacy_api = True + + tags = property(lambda self: self._tags_v1) + tagdata = property(lambda self: self._tagdata) + + # defined in ImageFileDirectory_v2 + tagtype: dict[int, int] + """Dictionary of tag types""" + + @classmethod + def from_v2(cls, original: ImageFileDirectory_v2) -> ImageFileDirectory_v1: + """Returns an + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` + instance with the same data as is contained in the original + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` + instance. + + :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` + + """ + + ifd = cls(prefix=original.prefix) + ifd._tagdata = original._tagdata + ifd.tagtype = original.tagtype + ifd.next = original.next # an indicator for multipage tiffs + return ifd + + def to_v2(self) -> ImageFileDirectory_v2: + """Returns an + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` + instance with the same data as is contained in the original + :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v1` + instance. + + :returns: :py:class:`~PIL.TiffImagePlugin.ImageFileDirectory_v2` + + """ + + ifd = ImageFileDirectory_v2(prefix=self.prefix) + ifd._tagdata = dict(self._tagdata) + ifd.tagtype = dict(self.tagtype) + ifd._tags_v2 = dict(self._tags_v2) + return ifd + + def __contains__(self, tag: object) -> bool: + return tag in self._tags_v1 or tag in self._tagdata + + def __len__(self) -> int: + return len(set(self._tagdata) | set(self._tags_v1)) + + def __iter__(self) -> Iterator[int]: + return iter(set(self._tagdata) | set(self._tags_v1)) + + def __setitem__(self, tag: int, value: Any) -> None: + for legacy_api in (False, True): + self._setitem(tag, value, legacy_api) + + def __getitem__(self, tag: int) -> Any: + if tag not in self._tags_v1: # unpack on the fly + data = self._tagdata[tag] + typ = self.tagtype[tag] + size, handler = self._load_dispatch[typ] + for legacy in (False, True): + self._setitem(tag, handler(self, data, legacy), legacy) + val = self._tags_v1[tag] + if not isinstance(val, (tuple, bytes)): + val = (val,) + return val + + +# undone -- switch this pointer +ImageFileDirectory = ImageFileDirectory_v1 + + +## +# Image plugin for TIFF files. + + +class TiffImageFile(ImageFile.ImageFile): + format = "TIFF" + format_description = "Adobe TIFF" + _close_exclusive_fp_after_loading = False + + def __init__( + self, + fp: StrOrBytesPath | IO[bytes], + filename: str | bytes | None = None, + ) -> None: + self.tag_v2: ImageFileDirectory_v2 + """ Image file directory (tag dictionary) """ + + self.tag: ImageFileDirectory_v1 + """ Legacy tag entries """ + + super().__init__(fp, filename) + + def _open(self) -> None: + """Open the first image in a TIFF file""" + + # Header + assert self.fp is not None + ifh = self.fp.read(8) + if ifh[2] == 43: + ifh += self.fp.read(8) + + self.tag_v2 = ImageFileDirectory_v2(ifh) + + # setup frame pointers + self.__first = self.__next = self.tag_v2.next + self.__frame = -1 + self._fp = self.fp + self._frame_pos: list[int] = [] + self._n_frames: int | None = None + + logger.debug("*** TiffImageFile._open ***") + logger.debug("- __first: %s", self.__first) + logger.debug("- ifh: %s", repr(ifh)) # Use repr to avoid str(bytes) + + # and load the first frame + self._seek(0) + + @property + def n_frames(self) -> int: + current_n_frames = self._n_frames + if current_n_frames is None: + current = self.tell() + self._seek(len(self._frame_pos)) + while self._n_frames is None: + self._seek(self.tell() + 1) + self.seek(current) + assert self._n_frames is not None + return self._n_frames + + def seek(self, frame: int) -> None: + """Select a given frame as current image""" + if not self._seek_check(frame): + return + self._seek(frame) + if self._im is not None and ( + self.im.size != self._tile_size + or self.im.mode != self.mode + or self.readonly + ): + self._im = None + + def _seek(self, frame: int) -> None: + if isinstance(self._fp, DeferredError): + raise self._fp.ex + self.fp = self._fp + + while len(self._frame_pos) <= frame: + if not self.__next: + msg = "no more images in TIFF file" + raise EOFError(msg) + logger.debug( + "Seeking to frame %s, on frame %s, __next %s, location: %s", + frame, + self.__frame, + self.__next, + self.fp.tell(), + ) + if self.__next >= 2**63: + msg = "Unable to seek to frame" + raise ValueError(msg) + self.fp.seek(self.__next) + self._frame_pos.append(self.__next) + logger.debug("Loading tags, location: %s", self.fp.tell()) + self.tag_v2.load(self.fp) + if self.tag_v2.next in self._frame_pos: + # This IFD has already been processed + # Declare this to be the end of the image + self.__next = 0 + else: + self.__next = self.tag_v2.next + if self.__next == 0: + self._n_frames = frame + 1 + if len(self._frame_pos) == 1: + self.is_animated = self.__next != 0 + self.__frame += 1 + self.fp.seek(self._frame_pos[frame]) + self.tag_v2.load(self.fp) + if XMP in self.tag_v2: + xmp = self.tag_v2[XMP] + if isinstance(xmp, tuple) and len(xmp) == 1: + xmp = xmp[0] + self.info["xmp"] = xmp + elif "xmp" in self.info: + del self.info["xmp"] + self._reload_exif() + # fill the legacy tag/ifd entries + self.tag = self.ifd = ImageFileDirectory_v1.from_v2(self.tag_v2) + self.__frame = frame + self._setup() + + def tell(self) -> int: + """Return the current frame number""" + return self.__frame + + def get_photoshop_blocks(self) -> dict[int, dict[str, bytes]]: + """ + Returns a dictionary of Photoshop "Image Resource Blocks". + The keys are the image resource ID. For more information, see + https://www.adobe.com/devnet-apps/photoshop/fileformatashtml/#50577409_pgfId-1037727 + + :returns: Photoshop "Image Resource Blocks" in a dictionary. + """ + blocks = {} + val = self.tag_v2.get(ExifTags.Base.ImageResources) + if val: + while val.startswith(b"8BIM") and len(val) >= 12: + id = i16(val[4:6]) + n = math.ceil((val[6] + 1) / 2) * 2 + try: + size = i32(val[6 + n : 10 + n]) + except struct.error: + break + data = val[10 + n : 10 + n + size] + blocks[id] = {"data": data} + + val = val[math.ceil((10 + n + size) / 2) * 2 :] + return blocks + + def load(self) -> Image.core.PixelAccess | None: + if self.tile and self.use_load_libtiff: + return self._load_libtiff() + return super().load() + + def load_prepare(self) -> None: + if self._im is None: + Image._decompression_bomb_check(self._tile_size) + self.im = Image.core.new(self.mode, self._tile_size) + ImageFile.ImageFile.load_prepare(self) + + def load_end(self) -> None: + # allow closing if we're on the first frame, there's no next + # This is the ImageFile.load path only, libtiff specific below. + if not self.is_animated: + self._close_exclusive_fp_after_loading = True + + # load IFD data from fp before it is closed + exif = self.getexif() + for key in TiffTags.TAGS_V2_GROUPS: + if key not in exif: + continue + exif.get_ifd(key) + + ImageOps.exif_transpose(self, in_place=True) + if ExifTags.Base.Orientation in self.tag_v2: + del self.tag_v2[ExifTags.Base.Orientation] + + def _load_libtiff(self) -> Image.core.PixelAccess | None: + """Overload method triggered when we detect a compressed tiff + Calls out to libtiff""" + + Image.Image.load(self) + + self.load_prepare() + + if not len(self.tile) == 1: + msg = "Not exactly one tile" + raise OSError(msg) + + # (self._compression, (extents tuple), + # 0, (rawmode, self._compression, fp)) + extents = self.tile[0][1] + args = self.tile[0][3] + + # To be nice on memory footprint, if there's a + # file descriptor, use that instead of reading + # into a string in python. + assert self.fp is not None + try: + fp = hasattr(self.fp, "fileno") and self.fp.fileno() + # flush the file descriptor, prevents error on pypy 2.4+ + # should also eliminate the need for fp.tell + # in _seek + if hasattr(self.fp, "flush"): + self.fp.flush() + except OSError: + # io.BytesIO have a fileno, but returns an OSError if + # it doesn't use a file descriptor. + fp = False + + if fp: + assert isinstance(args, tuple) + args_list = list(args) + args_list[2] = fp + args = tuple(args_list) + + decoder = Image._getdecoder(self.mode, "libtiff", args, self.decoderconfig) + try: + decoder.setimage(self.im, extents) + except ValueError as e: + msg = "Couldn't set the image" + raise OSError(msg) from e + + close_self_fp = self._exclusive_fp and not self.is_animated + if hasattr(self.fp, "getvalue"): + # We've got a stringio like thing passed in. Yay for all in memory. + # The decoder needs the entire file in one shot, so there's not + # a lot we can do here other than give it the entire file. + # unless we could do something like get the address of the + # underlying string for stringio. + # + # Rearranging for supporting byteio items, since they have a fileno + # that returns an OSError if there's no underlying fp. Easier to + # deal with here by reordering. + logger.debug("have getvalue. just sending in a string from getvalue") + n, err = decoder.decode(self.fp.getvalue()) + elif fp: + # we've got a actual file on disk, pass in the fp. + logger.debug("have fileno, calling fileno version of the decoder.") + if not close_self_fp: + self.fp.seek(0) + # Save and restore the file position, because libtiff will move it + # outside of the Python runtime, and that will confuse + # io.BufferedReader and possible others. + # NOTE: This must use os.lseek(), and not fp.tell()/fp.seek(), + # because the buffer read head already may not equal the actual + # file position, and fp.seek() may just adjust it's internal + # pointer and not actually seek the OS file handle. + pos = os.lseek(fp, 0, os.SEEK_CUR) + # 4 bytes, otherwise the trace might error out + n, err = decoder.decode(b"fpfp") + os.lseek(fp, pos, os.SEEK_SET) + else: + # we have something else. + logger.debug("don't have fileno or getvalue. just reading") + self.fp.seek(0) + # UNDONE -- so much for that buffer size thing. + n, err = decoder.decode(self.fp.read()) + + self.tile = [] + self.readonly = 0 + + self.load_end() + + if close_self_fp: + self.fp.close() + self.fp = None # might be shared + + if err < 0: + msg = f"decoder error {err}" + raise OSError(msg) + + return Image.Image.load(self) + + def _setup(self) -> None: + """Setup this image object based on current tags""" + + if 0xBC01 in self.tag_v2: + msg = "Windows Media Photo files not yet supported" + raise OSError(msg) + + # extract relevant tags + self._compression = COMPRESSION_INFO[self.tag_v2.get(COMPRESSION, 1)] + self._planar_configuration = self.tag_v2.get(PLANAR_CONFIGURATION, 1) + + # photometric is a required tag, but not everyone is reading + # the specification + photo = self.tag_v2.get(PHOTOMETRIC_INTERPRETATION, 0) + + # old style jpeg compression images most certainly are YCbCr + if self._compression == "tiff_jpeg": + photo = 6 + + fillorder = self.tag_v2.get(FILLORDER, 1) + + logger.debug("*** Summary ***") + logger.debug("- compression: %s", self._compression) + logger.debug("- photometric_interpretation: %s", photo) + logger.debug("- planar_configuration: %s", self._planar_configuration) + logger.debug("- fill_order: %s", fillorder) + logger.debug("- YCbCr subsampling: %s", self.tag_v2.get(YCBCRSUBSAMPLING)) + + # size + try: + xsize = self.tag_v2[IMAGEWIDTH] + ysize = self.tag_v2[IMAGELENGTH] + except KeyError as e: + msg = "Missing dimensions" + raise TypeError(msg) from e + if not isinstance(xsize, int) or not isinstance(ysize, int): + msg = "Invalid dimensions" + raise ValueError(msg) + self._tile_size = xsize, ysize + orientation = self.tag_v2.get(ExifTags.Base.Orientation) + if orientation in (5, 6, 7, 8): + self._size = ysize, xsize + else: + self._size = xsize, ysize + + logger.debug("- size: %s", self.size) + + sample_format = self.tag_v2.get(SAMPLEFORMAT, (1,)) + if len(sample_format) > 1 and max(sample_format) == min(sample_format): + # SAMPLEFORMAT is properly per band, so an RGB image will + # be (1,1,1). But, we don't support per band pixel types, + # and anything more than one band is a uint8. So, just + # take the first element. Revisit this if adding support + # for more exotic images. + sample_format = (sample_format[0],) + + bps_tuple = self.tag_v2.get(BITSPERSAMPLE, (1,)) + extra_tuple = self.tag_v2.get(EXTRASAMPLES, ()) + samples_per_pixel = self.tag_v2.get( + SAMPLESPERPIXEL, + 3 if self._compression == "tiff_jpeg" and photo in (2, 6) else 1, + ) + if photo in (2, 6, 8): # RGB, YCbCr, LAB + bps_count = 3 + elif photo == 5: # CMYK + bps_count = 4 + else: + bps_count = 1 + if self._planar_configuration == 2 and extra_tuple and max(extra_tuple) == 0: + # If components are stored separately, + # then unspecified extra components at the end can be ignored + bps_tuple = bps_tuple[: -len(extra_tuple)] + samples_per_pixel -= len(extra_tuple) + extra_tuple = () + bps_count += len(extra_tuple) + bps_actual_count = len(bps_tuple) + + if samples_per_pixel > MAX_SAMPLESPERPIXEL: + # DOS check, samples_per_pixel can be a Long, and we extend the tuple below + logger.error( + "More samples per pixel than can be decoded: %s", samples_per_pixel + ) + msg = "Invalid value for samples per pixel" + raise SyntaxError(msg) + + if samples_per_pixel < bps_actual_count: + # If a file has more values in bps_tuple than expected, + # remove the excess. + bps_tuple = bps_tuple[:samples_per_pixel] + elif samples_per_pixel > bps_actual_count and bps_actual_count == 1: + # If a file has only one value in bps_tuple, when it should have more, + # presume it is the same number of bits for all of the samples. + bps_tuple = bps_tuple * samples_per_pixel + + if len(bps_tuple) != samples_per_pixel: + msg = "unknown data organization" + raise SyntaxError(msg) + + # mode: check photometric interpretation and bits per pixel + key = ( + self.tag_v2.prefix, + photo, + sample_format, + fillorder, + bps_tuple, + extra_tuple, + ) + logger.debug("format key: %s", key) + try: + self._mode, rawmode = OPEN_INFO[key] + except KeyError as e: + logger.debug("- unsupported format") + msg = "unknown pixel mode" + raise SyntaxError(msg) from e + + logger.debug("- raw mode: %s", rawmode) + logger.debug("- pil mode: %s", self.mode) + + self.info["compression"] = self._compression + + xres = self.tag_v2.get(X_RESOLUTION, 1) + yres = self.tag_v2.get(Y_RESOLUTION, 1) + + if xres and yres: + resunit = self.tag_v2.get(RESOLUTION_UNIT) + if resunit == 2: # dots per inch + self.info["dpi"] = (xres, yres) + elif resunit == 3: # dots per centimeter. convert to dpi + self.info["dpi"] = (xres * 2.54, yres * 2.54) + elif resunit is None: # used to default to 1, but now 2) + self.info["dpi"] = (xres, yres) + # For backward compatibility, + # we also preserve the old behavior + self.info["resolution"] = xres, yres + else: # No absolute unit of measurement + self.info["resolution"] = xres, yres + + # build tile descriptors + x = y = layer = 0 + self.tile = [] + self.use_load_libtiff = READ_LIBTIFF or self._compression != "raw" + if self.use_load_libtiff: + # Decoder expects entire file as one tile. + # There's a buffer size limit in load (64k) + # so large g4 images will fail if we use that + # function. + # + # Setup the one tile for the whole image, then + # use the _load_libtiff function. + + # libtiff handles the fillmode for us, so 1;IR should + # actually be 1;I. Including the R double reverses the + # bits, so stripes of the image are reversed. See + # https://github.com/python-pillow/Pillow/issues/279 + if fillorder == 2: + # Replace fillorder with fillorder=1 + key = key[:3] + (1,) + key[4:] + logger.debug("format key: %s", key) + # this should always work, since all the + # fillorder==2 modes have a corresponding + # fillorder=1 mode + self._mode, rawmode = OPEN_INFO[key] + # YCbCr images with new jpeg compression with pixels in one plane + # unpacked straight into RGB values + if ( + photo == 6 + and self._compression == "jpeg" + and self._planar_configuration == 1 + ): + rawmode = "RGB" + # libtiff always returns the bytes in native order. + # we're expecting image byte order. So, if the rawmode + # contains I;16, we need to convert from native to image + # byte order. + elif rawmode == "I;16": + rawmode = "I;16N" + elif rawmode.endswith((";16B", ";16L")): + rawmode = rawmode[:-1] + "N" + + # Offset in the tile tuple is 0, we go from 0,0 to + # w,h, and we only do this once -- eds + a = (rawmode, self._compression, False, self.tag_v2.offset) + self.tile.append(ImageFile._Tile("libtiff", (0, 0, xsize, ysize), 0, a)) + + elif STRIPOFFSETS in self.tag_v2 or TILEOFFSETS in self.tag_v2: + # striped image + if STRIPOFFSETS in self.tag_v2: + offsets = self.tag_v2[STRIPOFFSETS] + h = self.tag_v2.get(ROWSPERSTRIP, ysize) + w = xsize + else: + # tiled image + offsets = self.tag_v2[TILEOFFSETS] + tilewidth = self.tag_v2.get(TILEWIDTH) + h = self.tag_v2.get(TILELENGTH) + if not isinstance(tilewidth, int) or not isinstance(h, int): + msg = "Invalid tile dimensions" + raise ValueError(msg) + w = tilewidth + + if w == xsize and h == ysize and self._planar_configuration != 2: + # Every tile covers the image. Only use the last offset + offsets = offsets[-1:] + + for offset in offsets: + if x + w > xsize: + stride = w * sum(bps_tuple) / 8 # bytes per line + else: + stride = 0 + + tile_rawmode = rawmode + if self._planar_configuration == 2: + # each band on it's own layer + tile_rawmode = rawmode[layer] + # adjust stride width accordingly + stride /= bps_count + + args = (tile_rawmode, int(stride), 1) + self.tile.append( + ImageFile._Tile( + self._compression, + (x, y, min(x + w, xsize), min(y + h, ysize)), + offset, + args, + ) + ) + x += w + if x >= xsize: + x, y = 0, y + h + if y >= ysize: + y = 0 + layer += 1 + else: + logger.debug("- unsupported data organization") + msg = "unknown data organization" + raise SyntaxError(msg) + + # Fix up info. + if ICCPROFILE in self.tag_v2: + self.info["icc_profile"] = self.tag_v2[ICCPROFILE] + + # fixup palette descriptor + + if self.mode in ["P", "PA"]: + palette = [o8(b // 256) for b in self.tag_v2[COLORMAP]] + self.palette = ImagePalette.raw("RGB;L", b"".join(palette)) + + +# +# -------------------------------------------------------------------- +# Write TIFF files + +# little endian is default except for image modes with +# explicit big endian byte-order + +SAVE_INFO = { + # mode => rawmode, byteorder, photometrics, + # sampleformat, bitspersample, extra + "1": ("1", II, 1, 1, (1,), None), + "L": ("L", II, 1, 1, (8,), None), + "LA": ("LA", II, 1, 1, (8, 8), 2), + "P": ("P", II, 3, 1, (8,), None), + "PA": ("PA", II, 3, 1, (8, 8), 2), + "I": ("I;32S", II, 1, 2, (32,), None), + "I;16": ("I;16", II, 1, 1, (16,), None), + "I;16L": ("I;16L", II, 1, 1, (16,), None), + "F": ("F;32F", II, 1, 3, (32,), None), + "RGB": ("RGB", II, 2, 1, (8, 8, 8), None), + "RGBX": ("RGBX", II, 2, 1, (8, 8, 8, 8), 0), + "RGBA": ("RGBA", II, 2, 1, (8, 8, 8, 8), 2), + "CMYK": ("CMYK", II, 5, 1, (8, 8, 8, 8), None), + "YCbCr": ("YCbCr", II, 6, 1, (8, 8, 8), None), + "LAB": ("LAB", II, 8, 1, (8, 8, 8), None), + "I;16B": ("I;16B", MM, 1, 1, (16,), None), +} + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + try: + rawmode, prefix, photo, format, bits, extra = SAVE_INFO[im.mode] + except KeyError as e: + msg = f"cannot write mode {im.mode} as TIFF" + raise OSError(msg) from e + + encoderinfo = im.encoderinfo + encoderconfig = im.encoderconfig + + ifd = ImageFileDirectory_v2(prefix=prefix) + if encoderinfo.get("big_tiff"): + ifd._bigtiff = True + + try: + compression = encoderinfo["compression"] + except KeyError: + compression = im.info.get("compression") + if isinstance(compression, int): + # compression value may be from BMP. Ignore it + compression = None + if compression is None: + compression = "raw" + elif compression == "tiff_jpeg": + # OJPEG is obsolete, so use new-style JPEG compression instead + compression = "jpeg" + elif compression == "tiff_deflate": + compression = "tiff_adobe_deflate" + + libtiff = WRITE_LIBTIFF or compression != "raw" + + # required for color libtiff images + ifd[PLANAR_CONFIGURATION] = 1 + + ifd[IMAGEWIDTH] = im.size[0] + ifd[IMAGELENGTH] = im.size[1] + + # write any arbitrary tags passed in as an ImageFileDirectory + if "tiffinfo" in encoderinfo: + info = encoderinfo["tiffinfo"] + elif "exif" in encoderinfo: + info = encoderinfo["exif"] + if isinstance(info, bytes): + exif = Image.Exif() + exif.load(info) + info = exif + else: + info = {} + logger.debug("Tiffinfo Keys: %s", list(info)) + if isinstance(info, ImageFileDirectory_v1): + info = info.to_v2() + for key in info: + if isinstance(info, Image.Exif) and key in TiffTags.TAGS_V2_GROUPS: + ifd[key] = info.get_ifd(key) + else: + ifd[key] = info.get(key) + try: + ifd.tagtype[key] = info.tagtype[key] + except Exception: + pass # might not be an IFD. Might not have populated type + + legacy_ifd = {} + if hasattr(im, "tag"): + legacy_ifd = im.tag.to_v2() + + supplied_tags = {**legacy_ifd, **getattr(im, "tag_v2", {})} + if supplied_tags.get(PLANAR_CONFIGURATION) == 2 and EXTRASAMPLES in supplied_tags: + # If the image used separate component planes, + # then EXTRASAMPLES should be ignored when saving contiguously + if SAMPLESPERPIXEL in supplied_tags: + supplied_tags[SAMPLESPERPIXEL] -= len(supplied_tags[EXTRASAMPLES]) + del supplied_tags[EXTRASAMPLES] + for tag in ( + # IFD offset that may not be correct in the saved image + EXIFIFD, + # Determined by the image format and should not be copied from legacy_ifd. + SAMPLEFORMAT, + ): + if tag in supplied_tags: + del supplied_tags[tag] + + # additions written by Greg Couch, gregc@cgl.ucsf.edu + # inspired by image-sig posting from Kevin Cazabon, kcazabon@home.com + if hasattr(im, "tag_v2"): + # preserve tags from original TIFF image file + for key in ( + RESOLUTION_UNIT, + X_RESOLUTION, + Y_RESOLUTION, + IPTC_NAA_CHUNK, + PHOTOSHOP_CHUNK, + XMP, + ): + if key in im.tag_v2: + if key == IPTC_NAA_CHUNK and im.tag_v2.tagtype[key] not in ( + TiffTags.BYTE, + TiffTags.UNDEFINED, + ): + del supplied_tags[key] + else: + ifd[key] = im.tag_v2[key] + ifd.tagtype[key] = im.tag_v2.tagtype[key] + + # preserve ICC profile (should also work when saving other formats + # which support profiles as TIFF) -- 2008-06-06 Florian Hoech + icc = encoderinfo.get("icc_profile", im.info.get("icc_profile")) + if icc: + ifd[ICCPROFILE] = icc + + for key, name in [ + (IMAGEDESCRIPTION, "description"), + (X_RESOLUTION, "resolution"), + (Y_RESOLUTION, "resolution"), + (X_RESOLUTION, "x_resolution"), + (Y_RESOLUTION, "y_resolution"), + (RESOLUTION_UNIT, "resolution_unit"), + (SOFTWARE, "software"), + (DATE_TIME, "date_time"), + (ARTIST, "artist"), + (COPYRIGHT, "copyright"), + ]: + if name in encoderinfo: + ifd[key] = encoderinfo[name] + + dpi = encoderinfo.get("dpi") + if dpi: + ifd[RESOLUTION_UNIT] = 2 + ifd[X_RESOLUTION] = dpi[0] + ifd[Y_RESOLUTION] = dpi[1] + + if bits != (1,): + ifd[BITSPERSAMPLE] = bits + if len(bits) != 1: + ifd[SAMPLESPERPIXEL] = len(bits) + if extra is not None: + ifd[EXTRASAMPLES] = extra + if format != 1: + ifd[SAMPLEFORMAT] = format + + if PHOTOMETRIC_INTERPRETATION not in ifd: + ifd[PHOTOMETRIC_INTERPRETATION] = photo + elif im.mode in ("1", "L") and ifd[PHOTOMETRIC_INTERPRETATION] == 0: + if im.mode == "1": + inverted_im = im.copy() + px = inverted_im.load() + if px is not None: + for y in range(inverted_im.height): + for x in range(inverted_im.width): + px[x, y] = 0 if px[x, y] == 255 else 255 + im = inverted_im + else: + im = ImageOps.invert(im) + + if im.mode in ["P", "PA"]: + lut = im.im.getpalette("RGB", "RGB;L") + colormap = [] + colors = len(lut) // 3 + for i in range(3): + colormap += [v * 256 for v in lut[colors * i : colors * (i + 1)]] + colormap += [0] * (256 - colors) + ifd[COLORMAP] = colormap + # data orientation + w, h = ifd[IMAGEWIDTH], ifd[IMAGELENGTH] + stride = len(bits) * ((w * bits[0] + 7) // 8) + if ROWSPERSTRIP not in ifd: + # aim for given strip size (64 KB by default) when using libtiff writer + if libtiff: + im_strip_size = encoderinfo.get("strip_size", STRIP_SIZE) + rows_per_strip = 1 if stride == 0 else min(im_strip_size // stride, h) + # JPEG encoder expects multiple of 8 rows + if compression == "jpeg": + rows_per_strip = min(((rows_per_strip + 7) // 8) * 8, h) + else: + rows_per_strip = h + if rows_per_strip == 0: + rows_per_strip = 1 + ifd[ROWSPERSTRIP] = rows_per_strip + strip_byte_counts = 1 if stride == 0 else stride * ifd[ROWSPERSTRIP] + strips_per_image = (h + ifd[ROWSPERSTRIP] - 1) // ifd[ROWSPERSTRIP] + if strip_byte_counts >= 2**16: + ifd.tagtype[STRIPBYTECOUNTS] = TiffTags.LONG + ifd[STRIPBYTECOUNTS] = (strip_byte_counts,) * (strips_per_image - 1) + ( + stride * h - strip_byte_counts * (strips_per_image - 1), + ) + ifd[STRIPOFFSETS] = tuple( + range(0, strip_byte_counts * strips_per_image, strip_byte_counts) + ) # this is adjusted by IFD writer + # no compression by default: + ifd[COMPRESSION] = COMPRESSION_INFO_REV.get(compression, 1) + + if im.mode == "YCbCr": + for tag, default_value in { + YCBCRSUBSAMPLING: (1, 1), + REFERENCEBLACKWHITE: (0, 255, 128, 255, 128, 255), + }.items(): + ifd.setdefault(tag, default_value) + + blocklist = [TILEWIDTH, TILELENGTH, TILEOFFSETS, TILEBYTECOUNTS] + if libtiff: + if "quality" in encoderinfo: + quality = encoderinfo["quality"] + if not isinstance(quality, int) or quality < 0 or quality > 100: + msg = "Invalid quality setting" + raise ValueError(msg) + if compression != "jpeg": + msg = "quality setting only supported for 'jpeg' compression" + raise ValueError(msg) + ifd[JPEGQUALITY] = quality + + logger.debug("Saving using libtiff encoder") + logger.debug("Items: %s", sorted(ifd.items())) + _fp = 0 + if hasattr(fp, "fileno"): + try: + fp.seek(0) + _fp = fp.fileno() + except io.UnsupportedOperation: + pass + + # optional types for non core tags + types = {} + # STRIPOFFSETS and STRIPBYTECOUNTS are added by the library + # based on the data in the strip. + # OSUBFILETYPE is deprecated. + # The other tags expect arrays with a certain length (fixed or depending on + # BITSPERSAMPLE, etc), passing arrays with a different length will result in + # segfaults. Block these tags until we add extra validation. + # SUBIFD may also cause a segfault. + blocklist += [ + OSUBFILETYPE, + REFERENCEBLACKWHITE, + STRIPBYTECOUNTS, + STRIPOFFSETS, + TRANSFERFUNCTION, + SUBIFD, + ] + + # bits per sample is a single short in the tiff directory, not a list. + atts: dict[int, Any] = {BITSPERSAMPLE: bits[0]} + # Merge the ones that we have with (optional) more bits from + # the original file, e.g x,y resolution so that we can + # save(load('')) == original file. + for tag, value in itertools.chain(ifd.items(), supplied_tags.items()): + # Libtiff can only process certain core items without adding + # them to the custom dictionary. + # Custom items are supported for int, float, unicode, string and byte + # values. Other types and tuples require a tagtype. + if tag not in TiffTags.LIBTIFF_CORE: + if tag in TiffTags.TAGS_V2_GROUPS: + types[tag] = TiffTags.LONG8 + elif tag in ifd.tagtype: + types[tag] = ifd.tagtype[tag] + elif isinstance(value, (int, float, str, bytes)) or ( + isinstance(value, tuple) + and all(isinstance(v, (int, float, IFDRational)) for v in value) + ): + type = TiffTags.lookup(tag).type + if type: + types[tag] = type + if tag not in atts and tag not in blocklist: + if isinstance(value, str): + atts[tag] = value.encode("ascii", "replace") + b"\0" + elif isinstance(value, IFDRational): + atts[tag] = float(value) + else: + atts[tag] = value + + if SAMPLEFORMAT in atts and len(atts[SAMPLEFORMAT]) == 1: + atts[SAMPLEFORMAT] = atts[SAMPLEFORMAT][0] + + logger.debug("Converted items: %s", sorted(atts.items())) + + # libtiff always expects the bytes in native order. + # we're storing image byte order. So, if the rawmode + # contains I;16, we need to convert from native to image + # byte order. + if im.mode in ("I;16", "I;16B", "I;16L"): + rawmode = "I;16N" + + # Pass tags as sorted list so that the tags are set in a fixed order. + # This is required by libtiff for some tags. For example, the JPEGQUALITY + # pseudo tag requires that the COMPRESS tag was already set. + tags = list(atts.items()) + tags.sort() + a = (rawmode, compression, _fp, filename, tags, types) + encoder = Image._getencoder(im.mode, "libtiff", a, encoderconfig) + encoder.setimage(im.im, (0, 0) + im.size) + while True: + errcode, data = encoder.encode(ImageFile.MAXBLOCK)[1:] + if not _fp: + fp.write(data) + if errcode: + break + if errcode < 0: + msg = f"encoder error {errcode} when writing image file" + raise OSError(msg) + + else: + for tag in blocklist: + del ifd[tag] + offset = ifd.save(fp) + + ImageFile._save( + im, + fp, + [ImageFile._Tile("raw", (0, 0) + im.size, offset, (rawmode, stride, 1))], + ) + + # -- helper for multi-page save -- + if "_debug_multipage" in encoderinfo: + # just to access o32 and o16 (using correct byte order) + setattr(im, "_debug_multipage", ifd) + + +class AppendingTiffWriter(io.BytesIO): + fieldSizes = [ + 0, # None + 1, # byte + 1, # ascii + 2, # short + 4, # long + 8, # rational + 1, # sbyte + 1, # undefined + 2, # sshort + 4, # slong + 8, # srational + 4, # float + 8, # double + 4, # ifd + 2, # unicode + 4, # complex + 8, # long8 + ] + + Tags = { + 273, # StripOffsets + 288, # FreeOffsets + 324, # TileOffsets + 519, # JPEGQTables + 520, # JPEGDCTables + 521, # JPEGACTables + } + + def __init__(self, fn: StrOrBytesPath | IO[bytes], new: bool = False) -> None: + self.f: IO[bytes] + if is_path(fn): + self.name = fn + self.close_fp = True + try: + self.f = open(fn, "w+b" if new else "r+b") + except OSError: + self.f = open(fn, "w+b") + else: + self.f = cast(IO[bytes], fn) + self.close_fp = False + self.beginning = self.f.tell() + self.setup() + + def setup(self) -> None: + # Reset everything. + self.f.seek(self.beginning, os.SEEK_SET) + + self.whereToWriteNewIFDOffset: int | None = None + self.offsetOfNewPage = 0 + + self.IIMM = iimm = self.f.read(4) + self._bigtiff = b"\x2b" in iimm + if not iimm: + # empty file - first page + self.isFirst = True + return + + self.isFirst = False + if iimm not in PREFIXES: + msg = "Invalid TIFF file header" + raise RuntimeError(msg) + + self.setEndian("<" if iimm.startswith(II) else ">") + + if self._bigtiff: + self.f.seek(4, os.SEEK_CUR) + self.skipIFDs() + self.goToEnd() + + def finalize(self) -> None: + if self.isFirst: + return + + # fix offsets + self.f.seek(self.offsetOfNewPage) + + iimm = self.f.read(4) + if not iimm: + # Make it easy to finish a frame without committing to a new one. + return + + if iimm != self.IIMM: + msg = "IIMM of new page doesn't match IIMM of first page" + raise RuntimeError(msg) + + if self._bigtiff: + self.f.seek(4, os.SEEK_CUR) + ifd_offset = self._read(8 if self._bigtiff else 4) + ifd_offset += self.offsetOfNewPage + assert self.whereToWriteNewIFDOffset is not None + self.f.seek(self.whereToWriteNewIFDOffset) + self._write(ifd_offset, 8 if self._bigtiff else 4) + self.f.seek(ifd_offset) + self.fixIFD() + + def newFrame(self) -> None: + # Call this to finish a frame. + self.finalize() + self.setup() + + def __enter__(self) -> AppendingTiffWriter: + return self + + def __exit__(self, *args: object) -> None: + if self.close_fp: + self.close() + + def tell(self) -> int: + return self.f.tell() - self.offsetOfNewPage + + def seek(self, offset: int, whence: int = io.SEEK_SET) -> int: + """ + :param offset: Distance to seek. + :param whence: Whether the distance is relative to the start, + end or current position. + :returns: The resulting position, relative to the start. + """ + if whence == os.SEEK_SET: + offset += self.offsetOfNewPage + + self.f.seek(offset, whence) + return self.tell() + + def goToEnd(self) -> None: + self.f.seek(0, os.SEEK_END) + pos = self.f.tell() + + # pad to 16 byte boundary + pad_bytes = 16 - pos % 16 + if 0 < pad_bytes < 16: + self.f.write(bytes(pad_bytes)) + self.offsetOfNewPage = self.f.tell() + + def setEndian(self, endian: str) -> None: + self.endian = endian + self.longFmt = f"{self.endian}L" + self.shortFmt = f"{self.endian}H" + self.tagFormat = f"{self.endian}HH" + ("Q" if self._bigtiff else "L") + + def skipIFDs(self) -> None: + while True: + ifd_offset = self._read(8 if self._bigtiff else 4) + if ifd_offset == 0: + self.whereToWriteNewIFDOffset = self.f.tell() - ( + 8 if self._bigtiff else 4 + ) + break + + self.f.seek(ifd_offset) + num_tags = self._read(8 if self._bigtiff else 2) + self.f.seek(num_tags * (20 if self._bigtiff else 12), os.SEEK_CUR) + + def write(self, data: Buffer, /) -> int: + return self.f.write(data) + + def _fmt(self, field_size: int) -> str: + try: + return {2: "H", 4: "L", 8: "Q"}[field_size] + except KeyError: + msg = "offset is not supported" + raise RuntimeError(msg) + + def _read(self, field_size: int) -> int: + (value,) = struct.unpack( + self.endian + self._fmt(field_size), self.f.read(field_size) + ) + return value + + def readShort(self) -> int: + return self._read(2) + + def readLong(self) -> int: + return self._read(4) + + @staticmethod + def _verify_bytes_written(bytes_written: int | None, expected: int) -> None: + if bytes_written is not None and bytes_written != expected: + msg = f"wrote only {bytes_written} bytes but wanted {expected}" + raise RuntimeError(msg) + + def _rewriteLast( + self, value: int, field_size: int, new_field_size: int = 0 + ) -> None: + self.f.seek(-field_size, os.SEEK_CUR) + if not new_field_size: + new_field_size = field_size + bytes_written = self.f.write( + struct.pack(self.endian + self._fmt(new_field_size), value) + ) + self._verify_bytes_written(bytes_written, new_field_size) + + def rewriteLastShortToLong(self, value: int) -> None: + self._rewriteLast(value, 2, 4) + + def rewriteLastShort(self, value: int) -> None: + return self._rewriteLast(value, 2) + + def rewriteLastLong(self, value: int) -> None: + return self._rewriteLast(value, 4) + + def _write(self, value: int, field_size: int) -> None: + bytes_written = self.f.write( + struct.pack(self.endian + self._fmt(field_size), value) + ) + self._verify_bytes_written(bytes_written, field_size) + + def writeShort(self, value: int) -> None: + self._write(value, 2) + + def writeLong(self, value: int) -> None: + self._write(value, 4) + + def close(self) -> None: + self.finalize() + if self.close_fp: + self.f.close() + + def fixIFD(self) -> None: + num_tags = self._read(8 if self._bigtiff else 2) + + for i in range(num_tags): + tag, field_type, count = struct.unpack( + self.tagFormat, self.f.read(12 if self._bigtiff else 8) + ) + + field_size = self.fieldSizes[field_type] + total_size = field_size * count + fmt_size = 8 if self._bigtiff else 4 + is_local = total_size <= fmt_size + if not is_local: + offset = self._read(fmt_size) + self.offsetOfNewPage + self._rewriteLast(offset, fmt_size) + + if tag in self.Tags: + cur_pos = self.f.tell() + + logger.debug( + "fixIFD: %s (%d) - type: %s (%d) - type size: %d - count: %d", + TiffTags.lookup(tag).name, + tag, + TYPES.get(field_type, "unknown"), + field_type, + field_size, + count, + ) + + if is_local: + self._fixOffsets(count, field_size) + self.f.seek(cur_pos + fmt_size) + else: + self.f.seek(offset) + self._fixOffsets(count, field_size) + self.f.seek(cur_pos) + + elif is_local: + # skip the locally stored value that is not an offset + self.f.seek(fmt_size, os.SEEK_CUR) + + def _fixOffsets(self, count: int, field_size: int) -> None: + for i in range(count): + offset = self._read(field_size) + offset += self.offsetOfNewPage + + new_field_size = 0 + if self._bigtiff and field_size in (2, 4) and offset >= 2**32: + # offset is now too large - we must convert long to long8 + new_field_size = 8 + elif field_size == 2 and offset >= 2**16: + # offset is now too large - we must convert short to long + new_field_size = 4 + if new_field_size: + if count != 1: + msg = "not implemented" + raise RuntimeError(msg) # XXX TODO + + # simple case - the offset is just one and therefore it is + # local (not referenced with another offset) + self._rewriteLast(offset, field_size, new_field_size) + # Move back past the new offset, past 'count', and before 'field_type' + rewind = -new_field_size - 4 - 2 + self.f.seek(rewind, os.SEEK_CUR) + self.writeShort(new_field_size) # rewrite the type + self.f.seek(2 - rewind, os.SEEK_CUR) + else: + self._rewriteLast(offset, field_size) + + def fixOffsets( + self, count: int, isShort: bool = False, isLong: bool = False + ) -> None: + if isShort: + field_size = 2 + elif isLong: + field_size = 4 + else: + field_size = 0 + return self._fixOffsets(count, field_size) + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + append_images = list(im.encoderinfo.get("append_images", [])) + if not hasattr(im, "n_frames") and not append_images: + return _save(im, fp, filename) + + cur_idx = im.tell() + try: + with AppendingTiffWriter(fp) as tf: + for ims in [im] + append_images: + encoderinfo = ims._attach_default_encoderinfo(im) + if not hasattr(ims, "encoderconfig"): + ims.encoderconfig = () + nfr = getattr(ims, "n_frames", 1) + + for idx in range(nfr): + ims.seek(idx) + ims.load() + _save(ims, tf, filename) + tf.newFrame() + ims.encoderinfo = encoderinfo + finally: + im.seek(cur_idx) + + +# +# -------------------------------------------------------------------- +# Register + +Image.register_open(TiffImageFile.format, TiffImageFile, _accept) +Image.register_save(TiffImageFile.format, _save) +Image.register_save_all(TiffImageFile.format, _save_all) + +Image.register_extensions(TiffImageFile.format, [".tif", ".tiff"]) + +Image.register_mime(TiffImageFile.format, "image/tiff") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/TiffTags.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/TiffTags.py new file mode 100644 index 000000000..613a3b7de --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/TiffTags.py @@ -0,0 +1,566 @@ +# +# The Python Imaging Library. +# $Id$ +# +# TIFF tags +# +# This module provides clear-text names for various well-known +# TIFF tags. the TIFF codec works just fine without it. +# +# Copyright (c) Secret Labs AB 1999. +# +# See the README file for information on usage and redistribution. +# + +## +# This module provides constants and clear-text names for various +# well-known TIFF tags. +## +from __future__ import annotations + +from typing import NamedTuple + + +class _TagInfo(NamedTuple): + value: int | None + name: str + type: int | None + length: int | None + enum: dict[str, int] + + +class TagInfo(_TagInfo): + __slots__: list[str] = [] + + def __new__( + cls, + value: int | None = None, + name: str = "unknown", + type: int | None = None, + length: int | None = None, + enum: dict[str, int] | None = None, + ) -> TagInfo: + return super().__new__(cls, value, name, type, length, enum or {}) + + def cvt_enum(self, value: str) -> int | str: + # Using get will call hash(value), which can be expensive + # for some types (e.g. Fraction). Since self.enum is rarely + # used, it's usually better to test it first. + return self.enum.get(value, value) if self.enum else value + + +def lookup(tag: int, group: int | None = None) -> TagInfo: + """ + :param tag: Integer tag number + :param group: Which :py:data:`~PIL.TiffTags.TAGS_V2_GROUPS` to look in + + .. versionadded:: 8.3.0 + + :returns: Taginfo namedtuple, From the ``TAGS_V2`` info if possible, + otherwise just populating the value and name from ``TAGS``. + If the tag is not recognized, "unknown" is returned for the name + + """ + + if group is not None: + info = TAGS_V2_GROUPS[group].get(tag) if group in TAGS_V2_GROUPS else None + else: + info = TAGS_V2.get(tag) + return info or TagInfo(tag, TAGS.get(tag, "unknown")) + + +## +# Map tag numbers to tag info. +# +# id: (Name, Type, Length[, enum_values]) +# +# The length here differs from the length in the tiff spec. For +# numbers, the tiff spec is for the number of fields returned. We +# agree here. For string-like types, the tiff spec uses the length of +# field in bytes. In Pillow, we are using the number of expected +# fields, in general 1 for string-like types. + + +BYTE = 1 +ASCII = 2 +SHORT = 3 +LONG = 4 +RATIONAL = 5 +SIGNED_BYTE = 6 +UNDEFINED = 7 +SIGNED_SHORT = 8 +SIGNED_LONG = 9 +SIGNED_RATIONAL = 10 +FLOAT = 11 +DOUBLE = 12 +IFD = 13 +LONG8 = 16 + +_tags_v2: dict[int, tuple[str, int, int] | tuple[str, int, int, dict[str, int]]] = { + 254: ("NewSubfileType", LONG, 1), + 255: ("SubfileType", SHORT, 1), + 256: ("ImageWidth", LONG, 1), + 257: ("ImageLength", LONG, 1), + 258: ("BitsPerSample", SHORT, 0), + 259: ( + "Compression", + SHORT, + 1, + { + "Uncompressed": 1, + "CCITT 1d": 2, + "Group 3 Fax": 3, + "Group 4 Fax": 4, + "LZW": 5, + "JPEG": 6, + "PackBits": 32773, + }, + ), + 262: ( + "PhotometricInterpretation", + SHORT, + 1, + { + "WhiteIsZero": 0, + "BlackIsZero": 1, + "RGB": 2, + "RGB Palette": 3, + "Transparency Mask": 4, + "CMYK": 5, + "YCbCr": 6, + "CieLAB": 8, + "CFA": 32803, # TIFF/EP, Adobe DNG + "LinearRaw": 32892, # Adobe DNG + }, + ), + 263: ("Threshholding", SHORT, 1), + 264: ("CellWidth", SHORT, 1), + 265: ("CellLength", SHORT, 1), + 266: ("FillOrder", SHORT, 1), + 269: ("DocumentName", ASCII, 1), + 270: ("ImageDescription", ASCII, 1), + 271: ("Make", ASCII, 1), + 272: ("Model", ASCII, 1), + 273: ("StripOffsets", LONG, 0), + 274: ("Orientation", SHORT, 1), + 277: ("SamplesPerPixel", SHORT, 1), + 278: ("RowsPerStrip", LONG, 1), + 279: ("StripByteCounts", LONG, 0), + 280: ("MinSampleValue", SHORT, 0), + 281: ("MaxSampleValue", SHORT, 0), + 282: ("XResolution", RATIONAL, 1), + 283: ("YResolution", RATIONAL, 1), + 284: ("PlanarConfiguration", SHORT, 1, {"Contiguous": 1, "Separate": 2}), + 285: ("PageName", ASCII, 1), + 286: ("XPosition", RATIONAL, 1), + 287: ("YPosition", RATIONAL, 1), + 288: ("FreeOffsets", LONG, 1), + 289: ("FreeByteCounts", LONG, 1), + 290: ("GrayResponseUnit", SHORT, 1), + 291: ("GrayResponseCurve", SHORT, 0), + 292: ("T4Options", LONG, 1), + 293: ("T6Options", LONG, 1), + 296: ("ResolutionUnit", SHORT, 1, {"none": 1, "inch": 2, "cm": 3}), + 297: ("PageNumber", SHORT, 2), + 301: ("TransferFunction", SHORT, 0), + 305: ("Software", ASCII, 1), + 306: ("DateTime", ASCII, 1), + 315: ("Artist", ASCII, 1), + 316: ("HostComputer", ASCII, 1), + 317: ("Predictor", SHORT, 1, {"none": 1, "Horizontal Differencing": 2}), + 318: ("WhitePoint", RATIONAL, 2), + 319: ("PrimaryChromaticities", RATIONAL, 6), + 320: ("ColorMap", SHORT, 0), + 321: ("HalftoneHints", SHORT, 2), + 322: ("TileWidth", LONG, 1), + 323: ("TileLength", LONG, 1), + 324: ("TileOffsets", LONG, 0), + 325: ("TileByteCounts", LONG, 0), + 330: ("SubIFDs", LONG, 0), + 332: ("InkSet", SHORT, 1), + 333: ("InkNames", ASCII, 1), + 334: ("NumberOfInks", SHORT, 1), + 336: ("DotRange", SHORT, 0), + 337: ("TargetPrinter", ASCII, 1), + 338: ("ExtraSamples", SHORT, 0), + 339: ("SampleFormat", SHORT, 0), + 340: ("SMinSampleValue", DOUBLE, 0), + 341: ("SMaxSampleValue", DOUBLE, 0), + 342: ("TransferRange", SHORT, 6), + 347: ("JPEGTables", UNDEFINED, 1), + # obsolete JPEG tags + 512: ("JPEGProc", SHORT, 1), + 513: ("JPEGInterchangeFormat", LONG, 1), + 514: ("JPEGInterchangeFormatLength", LONG, 1), + 515: ("JPEGRestartInterval", SHORT, 1), + 517: ("JPEGLosslessPredictors", SHORT, 0), + 518: ("JPEGPointTransforms", SHORT, 0), + 519: ("JPEGQTables", LONG, 0), + 520: ("JPEGDCTables", LONG, 0), + 521: ("JPEGACTables", LONG, 0), + 529: ("YCbCrCoefficients", RATIONAL, 3), + 530: ("YCbCrSubSampling", SHORT, 2), + 531: ("YCbCrPositioning", SHORT, 1), + 532: ("ReferenceBlackWhite", RATIONAL, 6), + 700: ("XMP", BYTE, 0), + # Four private SGI tags + 32995: ("Matteing", SHORT, 1), + 32996: ("DataType", SHORT, 0), + 32997: ("ImageDepth", LONG, 1), + 32998: ("TileDepth", LONG, 1), + 33432: ("Copyright", ASCII, 1), + 33723: ("IptcNaaInfo", UNDEFINED, 1), + 34377: ("PhotoshopInfo", BYTE, 0), + # FIXME add more tags here + 34665: ("ExifIFD", LONG, 1), + 34675: ("ICCProfile", UNDEFINED, 1), + 34853: ("GPSInfoIFD", LONG, 1), + 36864: ("ExifVersion", UNDEFINED, 1), + 37724: ("ImageSourceData", UNDEFINED, 1), + 40965: ("InteroperabilityIFD", LONG, 1), + 41730: ("CFAPattern", UNDEFINED, 1), + # MPInfo + 45056: ("MPFVersion", UNDEFINED, 1), + 45057: ("NumberOfImages", LONG, 1), + 45058: ("MPEntry", UNDEFINED, 1), + 45059: ("ImageUIDList", UNDEFINED, 0), # UNDONE, check + 45060: ("TotalFrames", LONG, 1), + 45313: ("MPIndividualNum", LONG, 1), + 45569: ("PanOrientation", LONG, 1), + 45570: ("PanOverlap_H", RATIONAL, 1), + 45571: ("PanOverlap_V", RATIONAL, 1), + 45572: ("BaseViewpointNum", LONG, 1), + 45573: ("ConvergenceAngle", SIGNED_RATIONAL, 1), + 45574: ("BaselineLength", RATIONAL, 1), + 45575: ("VerticalDivergence", SIGNED_RATIONAL, 1), + 45576: ("AxisDistance_X", SIGNED_RATIONAL, 1), + 45577: ("AxisDistance_Y", SIGNED_RATIONAL, 1), + 45578: ("AxisDistance_Z", SIGNED_RATIONAL, 1), + 45579: ("YawAngle", SIGNED_RATIONAL, 1), + 45580: ("PitchAngle", SIGNED_RATIONAL, 1), + 45581: ("RollAngle", SIGNED_RATIONAL, 1), + 40960: ("FlashPixVersion", UNDEFINED, 1), + 50741: ("MakerNoteSafety", SHORT, 1, {"Unsafe": 0, "Safe": 1}), + 50780: ("BestQualityScale", RATIONAL, 1), + 50838: ("ImageJMetaDataByteCounts", LONG, 0), # Can be more than one + 50839: ("ImageJMetaData", UNDEFINED, 1), # see Issue #2006 +} +_tags_v2_groups = { + # ExifIFD + 34665: { + 36864: ("ExifVersion", UNDEFINED, 1), + 40960: ("FlashPixVersion", UNDEFINED, 1), + 40965: ("InteroperabilityIFD", LONG, 1), + 41730: ("CFAPattern", UNDEFINED, 1), + }, + # GPSInfoIFD + 34853: { + 0: ("GPSVersionID", BYTE, 4), + 1: ("GPSLatitudeRef", ASCII, 2), + 2: ("GPSLatitude", RATIONAL, 3), + 3: ("GPSLongitudeRef", ASCII, 2), + 4: ("GPSLongitude", RATIONAL, 3), + 5: ("GPSAltitudeRef", BYTE, 1), + 6: ("GPSAltitude", RATIONAL, 1), + 7: ("GPSTimeStamp", RATIONAL, 3), + 8: ("GPSSatellites", ASCII, 0), + 9: ("GPSStatus", ASCII, 2), + 10: ("GPSMeasureMode", ASCII, 2), + 11: ("GPSDOP", RATIONAL, 1), + 12: ("GPSSpeedRef", ASCII, 2), + 13: ("GPSSpeed", RATIONAL, 1), + 14: ("GPSTrackRef", ASCII, 2), + 15: ("GPSTrack", RATIONAL, 1), + 16: ("GPSImgDirectionRef", ASCII, 2), + 17: ("GPSImgDirection", RATIONAL, 1), + 18: ("GPSMapDatum", ASCII, 0), + 19: ("GPSDestLatitudeRef", ASCII, 2), + 20: ("GPSDestLatitude", RATIONAL, 3), + 21: ("GPSDestLongitudeRef", ASCII, 2), + 22: ("GPSDestLongitude", RATIONAL, 3), + 23: ("GPSDestBearingRef", ASCII, 2), + 24: ("GPSDestBearing", RATIONAL, 1), + 25: ("GPSDestDistanceRef", ASCII, 2), + 26: ("GPSDestDistance", RATIONAL, 1), + 27: ("GPSProcessingMethod", UNDEFINED, 0), + 28: ("GPSAreaInformation", UNDEFINED, 0), + 29: ("GPSDateStamp", ASCII, 11), + 30: ("GPSDifferential", SHORT, 1), + }, + # InteroperabilityIFD + 40965: {1: ("InteropIndex", ASCII, 1), 2: ("InteropVersion", UNDEFINED, 1)}, +} + +# Legacy Tags structure +# these tags aren't included above, but were in the previous versions +TAGS: dict[int | tuple[int, int], str] = { + 347: "JPEGTables", + 700: "XMP", + # Additional Exif Info + 32932: "Wang Annotation", + 33434: "ExposureTime", + 33437: "FNumber", + 33445: "MD FileTag", + 33446: "MD ScalePixel", + 33447: "MD ColorTable", + 33448: "MD LabName", + 33449: "MD SampleInfo", + 33450: "MD PrepDate", + 33451: "MD PrepTime", + 33452: "MD FileUnits", + 33550: "ModelPixelScaleTag", + 33723: "IptcNaaInfo", + 33918: "INGR Packet Data Tag", + 33919: "INGR Flag Registers", + 33920: "IrasB Transformation Matrix", + 33922: "ModelTiepointTag", + 34264: "ModelTransformationTag", + 34377: "PhotoshopInfo", + 34735: "GeoKeyDirectoryTag", + 34736: "GeoDoubleParamsTag", + 34737: "GeoAsciiParamsTag", + 34850: "ExposureProgram", + 34852: "SpectralSensitivity", + 34855: "ISOSpeedRatings", + 34856: "OECF", + 34864: "SensitivityType", + 34865: "StandardOutputSensitivity", + 34866: "RecommendedExposureIndex", + 34867: "ISOSpeed", + 34868: "ISOSpeedLatitudeyyy", + 34869: "ISOSpeedLatitudezzz", + 34908: "HylaFAX FaxRecvParams", + 34909: "HylaFAX FaxSubAddress", + 34910: "HylaFAX FaxRecvTime", + 36864: "ExifVersion", + 36867: "DateTimeOriginal", + 36868: "DateTimeDigitized", + 37121: "ComponentsConfiguration", + 37122: "CompressedBitsPerPixel", + 37724: "ImageSourceData", + 37377: "ShutterSpeedValue", + 37378: "ApertureValue", + 37379: "BrightnessValue", + 37380: "ExposureBiasValue", + 37381: "MaxApertureValue", + 37382: "SubjectDistance", + 37383: "MeteringMode", + 37384: "LightSource", + 37385: "Flash", + 37386: "FocalLength", + 37396: "SubjectArea", + 37500: "MakerNote", + 37510: "UserComment", + 37520: "SubSec", + 37521: "SubSecTimeOriginal", + 37522: "SubsecTimeDigitized", + 40960: "FlashPixVersion", + 40961: "ColorSpace", + 40962: "PixelXDimension", + 40963: "PixelYDimension", + 40964: "RelatedSoundFile", + 40965: "InteroperabilityIFD", + 41483: "FlashEnergy", + 41484: "SpatialFrequencyResponse", + 41486: "FocalPlaneXResolution", + 41487: "FocalPlaneYResolution", + 41488: "FocalPlaneResolutionUnit", + 41492: "SubjectLocation", + 41493: "ExposureIndex", + 41495: "SensingMethod", + 41728: "FileSource", + 41729: "SceneType", + 41730: "CFAPattern", + 41985: "CustomRendered", + 41986: "ExposureMode", + 41987: "WhiteBalance", + 41988: "DigitalZoomRatio", + 41989: "FocalLengthIn35mmFilm", + 41990: "SceneCaptureType", + 41991: "GainControl", + 41992: "Contrast", + 41993: "Saturation", + 41994: "Sharpness", + 41995: "DeviceSettingDescription", + 41996: "SubjectDistanceRange", + 42016: "ImageUniqueID", + 42032: "CameraOwnerName", + 42033: "BodySerialNumber", + 42034: "LensSpecification", + 42035: "LensMake", + 42036: "LensModel", + 42037: "LensSerialNumber", + 42112: "GDAL_METADATA", + 42113: "GDAL_NODATA", + 42240: "Gamma", + 50215: "Oce Scanjob Description", + 50216: "Oce Application Selector", + 50217: "Oce Identification Number", + 50218: "Oce ImageLogic Characteristics", + # Adobe DNG + 50706: "DNGVersion", + 50707: "DNGBackwardVersion", + 50708: "UniqueCameraModel", + 50709: "LocalizedCameraModel", + 50710: "CFAPlaneColor", + 50711: "CFALayout", + 50712: "LinearizationTable", + 50713: "BlackLevelRepeatDim", + 50714: "BlackLevel", + 50715: "BlackLevelDeltaH", + 50716: "BlackLevelDeltaV", + 50717: "WhiteLevel", + 50718: "DefaultScale", + 50719: "DefaultCropOrigin", + 50720: "DefaultCropSize", + 50721: "ColorMatrix1", + 50722: "ColorMatrix2", + 50723: "CameraCalibration1", + 50724: "CameraCalibration2", + 50725: "ReductionMatrix1", + 50726: "ReductionMatrix2", + 50727: "AnalogBalance", + 50728: "AsShotNeutral", + 50729: "AsShotWhiteXY", + 50730: "BaselineExposure", + 50731: "BaselineNoise", + 50732: "BaselineSharpness", + 50733: "BayerGreenSplit", + 50734: "LinearResponseLimit", + 50735: "CameraSerialNumber", + 50736: "LensInfo", + 50737: "ChromaBlurRadius", + 50738: "AntiAliasStrength", + 50740: "DNGPrivateData", + 50778: "CalibrationIlluminant1", + 50779: "CalibrationIlluminant2", + 50784: "Alias Layer Metadata", +} + +TAGS_V2: dict[int, TagInfo] = {} +TAGS_V2_GROUPS: dict[int, dict[int, TagInfo]] = {} + + +def _populate() -> None: + for k, v in _tags_v2.items(): + # Populate legacy structure. + TAGS[k] = v[0] + if len(v) == 4: + for sk, sv in v[3].items(): + TAGS[(k, sv)] = sk + + TAGS_V2[k] = TagInfo(k, *v) + + for group, tags in _tags_v2_groups.items(): + TAGS_V2_GROUPS[group] = {k: TagInfo(k, *v) for k, v in tags.items()} + + +_populate() +## +# Map type numbers to type names -- defined in ImageFileDirectory. + +TYPES: dict[int, str] = {} + +# +# These tags are handled by default in libtiff, without +# adding to the custom dictionary. From tif_dir.c, searching for +# case TIFFTAG in the _TIFFVSetField function: +# Line: item. +# 148: case TIFFTAG_SUBFILETYPE: +# 151: case TIFFTAG_IMAGEWIDTH: +# 154: case TIFFTAG_IMAGELENGTH: +# 157: case TIFFTAG_BITSPERSAMPLE: +# 181: case TIFFTAG_COMPRESSION: +# 202: case TIFFTAG_PHOTOMETRIC: +# 205: case TIFFTAG_THRESHHOLDING: +# 208: case TIFFTAG_FILLORDER: +# 214: case TIFFTAG_ORIENTATION: +# 221: case TIFFTAG_SAMPLESPERPIXEL: +# 228: case TIFFTAG_ROWSPERSTRIP: +# 238: case TIFFTAG_MINSAMPLEVALUE: +# 241: case TIFFTAG_MAXSAMPLEVALUE: +# 244: case TIFFTAG_SMINSAMPLEVALUE: +# 247: case TIFFTAG_SMAXSAMPLEVALUE: +# 250: case TIFFTAG_XRESOLUTION: +# 256: case TIFFTAG_YRESOLUTION: +# 262: case TIFFTAG_PLANARCONFIG: +# 268: case TIFFTAG_XPOSITION: +# 271: case TIFFTAG_YPOSITION: +# 274: case TIFFTAG_RESOLUTIONUNIT: +# 280: case TIFFTAG_PAGENUMBER: +# 284: case TIFFTAG_HALFTONEHINTS: +# 288: case TIFFTAG_COLORMAP: +# 294: case TIFFTAG_EXTRASAMPLES: +# 298: case TIFFTAG_MATTEING: +# 305: case TIFFTAG_TILEWIDTH: +# 316: case TIFFTAG_TILELENGTH: +# 327: case TIFFTAG_TILEDEPTH: +# 333: case TIFFTAG_DATATYPE: +# 344: case TIFFTAG_SAMPLEFORMAT: +# 361: case TIFFTAG_IMAGEDEPTH: +# 364: case TIFFTAG_SUBIFD: +# 376: case TIFFTAG_YCBCRPOSITIONING: +# 379: case TIFFTAG_YCBCRSUBSAMPLING: +# 383: case TIFFTAG_TRANSFERFUNCTION: +# 389: case TIFFTAG_REFERENCEBLACKWHITE: +# 393: case TIFFTAG_INKNAMES: + +# Following pseudo-tags are also handled by default in libtiff: +# TIFFTAG_JPEGQUALITY 65537 + +# some of these are not in our TAGS_V2 dict and were included from tiff.h + +# This list also exists in encode.c +LIBTIFF_CORE = { + 255, + 256, + 257, + 258, + 259, + 262, + 263, + 266, + 274, + 277, + 278, + 280, + 281, + 340, + 341, + 282, + 283, + 284, + 286, + 287, + 296, + 297, + 321, + 320, + 338, + 32995, + 322, + 323, + 32998, + 32996, + 339, + 32997, + 330, + 531, + 530, + 301, + 532, + 333, + # as above + 269, # this has been in our tests forever, and works + 65537, +} + +LIBTIFF_CORE.remove(255) # We don't have support for subfiletypes +LIBTIFF_CORE.remove(322) # We don't have support for writing tiled images with libtiff +LIBTIFF_CORE.remove(323) # Tiled images + +# Note to advanced users: There may be combinations of these +# parameters and values that when added properly, will work and +# produce valid tiff images that may work in your application. +# It is safe to add and remove tags from this set from Pillow's point +# of view so long as you test against libtiff. diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/WalImageFile.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/WalImageFile.py new file mode 100644 index 000000000..07bbf7471 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/WalImageFile.py @@ -0,0 +1,129 @@ +# +# The Python Imaging Library. +# $Id$ +# +# WAL file handling +# +# History: +# 2003-04-23 fl created +# +# Copyright (c) 2003 by Fredrik Lundh. +# +# See the README file for information on usage and redistribution. +# + +""" +This reader is based on the specification available from: +https://www.flipcode.com/archives/Quake_2_BSP_File_Format.shtml +and has been tested with a few sample files found using google. + +.. note:: + This format cannot be automatically recognized, so the reader + is not registered for use with :py:func:`PIL.Image.open()`. + To open a WAL file, use the :py:func:`PIL.WalImageFile.open()` function instead. +""" + +from __future__ import annotations + +from typing import IO + +from . import Image, ImageFile +from ._binary import i32le as i32 +from ._typing import StrOrBytesPath + + +class WalImageFile(ImageFile.ImageFile): + format = "WAL" + format_description = "Quake2 Texture" + + def _open(self) -> None: + self._mode = "P" + + # read header fields + assert self.fp is not None + header = self.fp.read(32 + 24 + 32 + 12) + self._size = i32(header, 32), i32(header, 36) + Image._decompression_bomb_check(self.size) + + # load pixel data + offset = i32(header, 40) + self.fp.seek(offset) + + # strings are null-terminated + self.info["name"] = header[:32].split(b"\0", 1)[0] + if next_name := header[56 : 56 + 32].split(b"\0", 1)[0]: + self.info["next_name"] = next_name + + def load(self) -> Image.core.PixelAccess | None: + if self._im is None: + assert self.fp is not None + self.im = Image.core.new(self.mode, self.size) + self.frombytes(self.fp.read(self.size[0] * self.size[1])) + self.putpalette(quake2palette) + return Image.Image.load(self) + + +def open(filename: StrOrBytesPath | IO[bytes]) -> WalImageFile: + """ + Load texture from a Quake2 WAL texture file. + + By default, a Quake2 standard palette is attached to the texture. + To override the palette, use the :py:func:`PIL.Image.Image.putpalette()` method. + + :param filename: WAL file name, or an opened file handle. + :returns: An image instance. + """ + return WalImageFile(filename) + + +quake2palette = ( + # default palette taken from piffo 0.93 by Hans Häggström + b"\x01\x01\x01\x0b\x0b\x0b\x12\x12\x12\x17\x17\x17\x1b\x1b\x1b\x1e" + b"\x1e\x1e\x22\x22\x22\x26\x26\x26\x29\x29\x29\x2c\x2c\x2c\x2f\x2f" + b"\x2f\x32\x32\x32\x35\x35\x35\x37\x37\x37\x3a\x3a\x3a\x3c\x3c\x3c" + b"\x24\x1e\x13\x22\x1c\x12\x20\x1b\x12\x1f\x1a\x10\x1d\x19\x10\x1b" + b"\x17\x0f\x1a\x16\x0f\x18\x14\x0d\x17\x13\x0d\x16\x12\x0d\x14\x10" + b"\x0b\x13\x0f\x0b\x10\x0d\x0a\x0f\x0b\x0a\x0d\x0b\x07\x0b\x0a\x07" + b"\x23\x23\x26\x22\x22\x25\x22\x20\x23\x21\x1f\x22\x20\x1e\x20\x1f" + b"\x1d\x1e\x1d\x1b\x1c\x1b\x1a\x1a\x1a\x19\x19\x18\x17\x17\x17\x16" + b"\x16\x14\x14\x14\x13\x13\x13\x10\x10\x10\x0f\x0f\x0f\x0d\x0d\x0d" + b"\x2d\x28\x20\x29\x24\x1c\x27\x22\x1a\x25\x1f\x17\x38\x2e\x1e\x31" + b"\x29\x1a\x2c\x25\x17\x26\x20\x14\x3c\x30\x14\x37\x2c\x13\x33\x28" + b"\x12\x2d\x24\x10\x28\x1f\x0f\x22\x1a\x0b\x1b\x14\x0a\x13\x0f\x07" + b"\x31\x1a\x16\x30\x17\x13\x2e\x16\x10\x2c\x14\x0d\x2a\x12\x0b\x27" + b"\x0f\x0a\x25\x0f\x07\x21\x0d\x01\x1e\x0b\x01\x1c\x0b\x01\x1a\x0b" + b"\x01\x18\x0a\x01\x16\x0a\x01\x13\x0a\x01\x10\x07\x01\x0d\x07\x01" + b"\x29\x23\x1e\x27\x21\x1c\x26\x20\x1b\x25\x1f\x1a\x23\x1d\x19\x21" + b"\x1c\x18\x20\x1b\x17\x1e\x19\x16\x1c\x18\x14\x1b\x17\x13\x19\x14" + b"\x10\x17\x13\x0f\x14\x10\x0d\x12\x0f\x0b\x0f\x0b\x0a\x0b\x0a\x07" + b"\x26\x1a\x0f\x23\x19\x0f\x20\x17\x0f\x1c\x16\x0f\x19\x13\x0d\x14" + b"\x10\x0b\x10\x0d\x0a\x0b\x0a\x07\x33\x22\x1f\x35\x29\x26\x37\x2f" + b"\x2d\x39\x35\x34\x37\x39\x3a\x33\x37\x39\x30\x34\x36\x2b\x31\x34" + b"\x27\x2e\x31\x22\x2b\x2f\x1d\x28\x2c\x17\x25\x2a\x0f\x20\x26\x0d" + b"\x1e\x25\x0b\x1c\x22\x0a\x1b\x20\x07\x19\x1e\x07\x17\x1b\x07\x14" + b"\x18\x01\x12\x16\x01\x0f\x12\x01\x0b\x0d\x01\x07\x0a\x01\x01\x01" + b"\x2c\x21\x21\x2a\x1f\x1f\x29\x1d\x1d\x27\x1c\x1c\x26\x1a\x1a\x24" + b"\x18\x18\x22\x17\x17\x21\x16\x16\x1e\x13\x13\x1b\x12\x12\x18\x10" + b"\x10\x16\x0d\x0d\x12\x0b\x0b\x0d\x0a\x0a\x0a\x07\x07\x01\x01\x01" + b"\x2e\x30\x29\x2d\x2e\x27\x2b\x2c\x26\x2a\x2a\x24\x28\x29\x23\x27" + b"\x27\x21\x26\x26\x1f\x24\x24\x1d\x22\x22\x1c\x1f\x1f\x1a\x1c\x1c" + b"\x18\x19\x19\x16\x17\x17\x13\x13\x13\x10\x0f\x0f\x0d\x0b\x0b\x0a" + b"\x30\x1e\x1b\x2d\x1c\x19\x2c\x1a\x17\x2a\x19\x14\x28\x17\x13\x26" + b"\x16\x10\x24\x13\x0f\x21\x12\x0d\x1f\x10\x0b\x1c\x0f\x0a\x19\x0d" + b"\x0a\x16\x0b\x07\x12\x0a\x07\x0f\x07\x01\x0a\x01\x01\x01\x01\x01" + b"\x28\x29\x38\x26\x27\x36\x25\x26\x34\x24\x24\x31\x22\x22\x2f\x20" + b"\x21\x2d\x1e\x1f\x2a\x1d\x1d\x27\x1b\x1b\x25\x19\x19\x21\x17\x17" + b"\x1e\x14\x14\x1b\x13\x12\x17\x10\x0f\x13\x0d\x0b\x0f\x0a\x07\x07" + b"\x2f\x32\x29\x2d\x30\x26\x2b\x2e\x24\x29\x2c\x21\x27\x2a\x1e\x25" + b"\x28\x1c\x23\x26\x1a\x21\x25\x18\x1e\x22\x14\x1b\x1f\x10\x19\x1c" + b"\x0d\x17\x1a\x0a\x13\x17\x07\x10\x13\x01\x0d\x0f\x01\x0a\x0b\x01" + b"\x01\x3f\x01\x13\x3c\x0b\x1b\x39\x10\x20\x35\x14\x23\x31\x17\x23" + b"\x2d\x18\x23\x29\x18\x3f\x3f\x3f\x3f\x3f\x39\x3f\x3f\x31\x3f\x3f" + b"\x2a\x3f\x3f\x20\x3f\x3f\x14\x3f\x3c\x12\x3f\x39\x0f\x3f\x35\x0b" + b"\x3f\x32\x07\x3f\x2d\x01\x3d\x2a\x01\x3b\x26\x01\x39\x21\x01\x37" + b"\x1d\x01\x34\x1a\x01\x32\x16\x01\x2f\x12\x01\x2d\x0f\x01\x2a\x0b" + b"\x01\x27\x07\x01\x23\x01\x01\x1d\x01\x01\x17\x01\x01\x10\x01\x01" + b"\x3d\x01\x01\x19\x19\x3f\x3f\x01\x01\x01\x01\x3f\x16\x16\x13\x10" + b"\x10\x0f\x0d\x0d\x0b\x3c\x2e\x2a\x36\x27\x20\x30\x21\x18\x29\x1b" + b"\x10\x3c\x39\x37\x37\x32\x2f\x31\x2c\x28\x2b\x26\x21\x30\x22\x20" +) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/WebPImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/WebPImagePlugin.py new file mode 100644 index 000000000..e20e40d91 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/WebPImagePlugin.py @@ -0,0 +1,317 @@ +from __future__ import annotations + +from io import BytesIO + +from . import Image, ImageFile + +try: + from . import _webp + + SUPPORTED = True +except ImportError: + SUPPORTED = False + +TYPE_CHECKING = False +if TYPE_CHECKING: + from typing import IO, Any + +_VP8_MODES_BY_IDENTIFIER = { + b"VP8 ": "RGB", + b"VP8X": "RGBA", + b"VP8L": "RGBA", # lossless +} + + +def _accept(prefix: bytes) -> bool | str: + is_riff_file_format = prefix.startswith(b"RIFF") + is_webp_file = prefix[8:12] == b"WEBP" + is_valid_vp8_mode = prefix[12:16] in _VP8_MODES_BY_IDENTIFIER + + if is_riff_file_format and is_webp_file and is_valid_vp8_mode: + if not SUPPORTED: + return ( + "image file could not be identified because WEBP support not installed" + ) + return True + return False + + +class WebPImageFile(ImageFile.ImageFile): + format = "WEBP" + format_description = "WebP image" + __loaded = 0 + __logical_frame = 0 + + def _open(self) -> None: + # Use the newer AnimDecoder API to parse the (possibly) animated file, + # and access muxed chunks like ICC/EXIF/XMP. + assert self.fp is not None + self._decoder = _webp.WebPAnimDecoder(self.fp.read()) + + # Get info from decoder + self._size, self.info["loop"], bgcolor, self.n_frames, self.rawmode = ( + self._decoder.get_info() + ) + self.info["background"] = ( + (bgcolor >> 16) & 0xFF, # R + (bgcolor >> 8) & 0xFF, # G + bgcolor & 0xFF, # B + (bgcolor >> 24) & 0xFF, # A + ) + self.is_animated = self.n_frames > 1 + self._mode = "RGB" if self.rawmode == "RGBX" else self.rawmode + + # Attempt to read ICC / EXIF / XMP chunks from file + for key, chunk_name in { + "icc_profile": "ICCP", + "exif": "EXIF", + "xmp": "XMP ", + }.items(): + if value := self._decoder.get_chunk(chunk_name): + self.info[key] = value + + # Initialize seek state + self._reset(reset=False) + + def _getexif(self) -> dict[int, Any] | None: + if "exif" not in self.info: + return None + return self.getexif()._get_merged_dict() + + def seek(self, frame: int) -> None: + if not self._seek_check(frame): + return + + # Set logical frame to requested position + self.__logical_frame = frame + + def _reset(self, reset: bool = True) -> None: + if reset: + self._decoder.reset() + self.__physical_frame = 0 + self.__loaded = -1 + self.__timestamp = 0 + + def _get_next(self) -> tuple[bytes, int, int]: + # Get next frame + ret = self._decoder.get_next() + self.__physical_frame += 1 + + # Check if an error occurred + if ret is None: + self._reset() # Reset just to be safe + self.seek(0) + msg = "failed to decode next frame in WebP file" + raise EOFError(msg) + + # Compute duration + data, timestamp = ret + duration = timestamp - self.__timestamp + self.__timestamp = timestamp + + # libwebp gives frame end, adjust to start of frame + timestamp -= duration + return data, timestamp, duration + + def _seek(self, frame: int) -> None: + if self.__physical_frame == frame: + return # Nothing to do + if frame < self.__physical_frame: + self._reset() # Rewind to beginning + while self.__physical_frame < frame: + self._get_next() # Advance to the requested frame + + def load(self) -> Image.core.PixelAccess | None: + if self.__loaded != self.__logical_frame: + self._seek(self.__logical_frame) + + # We need to load the image data for this frame + data, self.info["timestamp"], self.info["duration"] = self._get_next() + self.__loaded = self.__logical_frame + + # Set tile + if self.fp and self._exclusive_fp: + self.fp.close() + self.fp = BytesIO(data) + self.tile = [ImageFile._Tile("raw", (0, 0) + self.size, 0, self.rawmode)] + + return super().load() + + def load_seek(self, pos: int) -> None: + pass + + def tell(self) -> int: + return self.__logical_frame + + +def _convert_frame(im: Image.Image) -> Image.Image: + # Make sure image mode is supported + if im.mode not in ("RGBX", "RGBA", "RGB"): + im = im.convert("RGBA" if im.has_transparency_data else "RGB") + return im + + +def _save_all(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + encoderinfo = im.encoderinfo.copy() + append_images = list(encoderinfo.get("append_images", [])) + + # If total frame count is 1, then save using the legacy API, which + # will preserve non-alpha modes + total = 0 + for ims in [im] + append_images: + total += getattr(ims, "n_frames", 1) + if total == 1: + _save(im, fp, filename) + return + + background: int | tuple[int, ...] = (0, 0, 0, 0) + if "background" in encoderinfo: + background = encoderinfo["background"] + elif "background" in im.info: + background = im.info["background"] + if isinstance(background, int): + # GifImagePlugin stores a global color table index in + # info["background"]. So it must be converted to an RGBA value + palette = im.getpalette() + if palette: + r, g, b = palette[background * 3 : (background + 1) * 3] + background = (r, g, b, 255) + else: + background = (background, background, background, 255) + + duration = im.encoderinfo.get("duration", im.info.get("duration", 0)) + loop = im.encoderinfo.get("loop", 0) + minimize_size = im.encoderinfo.get("minimize_size", False) + kmin = im.encoderinfo.get("kmin", None) + kmax = im.encoderinfo.get("kmax", None) + allow_mixed = im.encoderinfo.get("allow_mixed", False) + verbose = False + lossless = im.encoderinfo.get("lossless", False) + quality = im.encoderinfo.get("quality", 80) + alpha_quality = im.encoderinfo.get("alpha_quality", 100) + method = im.encoderinfo.get("method", 0) + icc_profile = im.encoderinfo.get("icc_profile") or "" + exif = im.encoderinfo.get("exif", "") + if isinstance(exif, Image.Exif): + exif = exif.tobytes() + xmp = im.encoderinfo.get("xmp", "") + if allow_mixed: + lossless = False + + # Sensible keyframe defaults are from gif2webp.c script + if kmin is None: + kmin = 9 if lossless else 3 + if kmax is None: + kmax = 17 if lossless else 5 + + # Validate background color + if ( + not isinstance(background, (list, tuple)) + or len(background) != 4 + or not all(0 <= v < 256 for v in background) + ): + msg = f"Background color is not an RGBA tuple clamped to (0-255): {background}" + raise OSError(msg) + + # Convert to packed uint + bg_r, bg_g, bg_b, bg_a = background + background = (bg_a << 24) | (bg_r << 16) | (bg_g << 8) | (bg_b << 0) + + # Setup the WebP animation encoder + enc = _webp.WebPAnimEncoder( + im.size, + background, + loop, + minimize_size, + kmin, + kmax, + allow_mixed, + verbose, + ) + + # Add each frame + frame_idx = 0 + timestamp = 0 + cur_idx = im.tell() + try: + for ims in [im] + append_images: + # Get number of frames in this image + nfr = getattr(ims, "n_frames", 1) + + for idx in range(nfr): + ims.seek(idx) + + frame = _convert_frame(ims) + + # Append the frame to the animation encoder + enc.add( + frame.getim(), + round(timestamp), + lossless, + quality, + alpha_quality, + method, + ) + + # Update timestamp and frame index + if isinstance(duration, (list, tuple)): + timestamp += duration[frame_idx] + else: + timestamp += duration + frame_idx += 1 + + finally: + im.seek(cur_idx) + + # Force encoder to flush frames + enc.add(None, round(timestamp), lossless, quality, alpha_quality, 0) + + # Get the final output from the encoder + data = enc.assemble(icc_profile, exif, xmp) + if data is None: + msg = "cannot write file as WebP (encoder returned None)" + raise OSError(msg) + + fp.write(data) + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + lossless = im.encoderinfo.get("lossless", False) + quality = im.encoderinfo.get("quality", 80) + alpha_quality = im.encoderinfo.get("alpha_quality", 100) + icc_profile = im.encoderinfo.get("icc_profile") or "" + exif = im.encoderinfo.get("exif", b"") + if isinstance(exif, Image.Exif): + exif = exif.tobytes() + if exif.startswith(b"Exif\x00\x00"): + exif = exif[6:] + xmp = im.encoderinfo.get("xmp", "") + method = im.encoderinfo.get("method", 4) + exact = 1 if im.encoderinfo.get("exact") else 0 + + im = _convert_frame(im) + + data = _webp.WebPEncode( + im.getim(), + lossless, + float(quality), + float(alpha_quality), + icc_profile, + method, + exact, + exif, + xmp, + ) + if data is None: + msg = "cannot write file as WebP (encoder returned None)" + raise OSError(msg) + + fp.write(data) + + +Image.register_open(WebPImageFile.format, WebPImageFile, _accept) +if SUPPORTED: + Image.register_save(WebPImageFile.format, _save) + Image.register_save_all(WebPImageFile.format, _save_all) + Image.register_extension(WebPImageFile.format, ".webp") + Image.register_mime(WebPImageFile.format, "image/webp") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/WmfImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/WmfImagePlugin.py new file mode 100644 index 000000000..f5e244782 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/WmfImagePlugin.py @@ -0,0 +1,183 @@ +# +# The Python Imaging Library +# $Id$ +# +# WMF stub codec +# +# history: +# 1996-12-14 fl Created +# 2004-02-22 fl Turned into a stub driver +# 2004-02-23 fl Added EMF support +# +# Copyright (c) Secret Labs AB 1997-2004. All rights reserved. +# Copyright (c) Fredrik Lundh 1996. +# +# See the README file for information on usage and redistribution. +# +# WMF/EMF reference documentation: +# https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-WMF/[MS-WMF].pdf +# http://wvware.sourceforge.net/caolan/index.html +# http://wvware.sourceforge.net/caolan/ora-wmf.html +from __future__ import annotations + +from typing import IO + +from . import Image, ImageFile +from ._binary import i16le as word +from ._binary import si16le as short +from ._binary import si32le as _long + +_handler = None + + +def register_handler(handler: ImageFile.StubHandler | None) -> None: + """ + Install application-specific WMF image handler. + + :param handler: Handler object. + """ + global _handler + _handler = handler + + +if hasattr(Image.core, "drawwmf"): + # install default handler (windows only) + + class WmfHandler(ImageFile.StubHandler): + def open(self, im: ImageFile.StubImageFile) -> None: + self.bbox = im.info["wmf_bbox"] + + def load(self, im: ImageFile.StubImageFile) -> Image.Image: + assert im.fp is not None + im.fp.seek(0) # rewind + return Image.frombytes( + "RGB", + im.size, + Image.core.drawwmf(im.fp.read(), im.size, self.bbox), + "raw", + "BGR", + (im.size[0] * 3 + 3) & -4, + -1, + ) + + register_handler(WmfHandler()) + +# +# -------------------------------------------------------------------- +# Read WMF file + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith((b"\xd7\xcd\xc6\x9a\x00\x00", b"\x01\x00\x00\x00")) + + +## +# Image plugin for Windows metafiles. + + +class WmfStubImageFile(ImageFile.StubImageFile): + format = "WMF" + format_description = "Windows Metafile" + + def _open(self) -> None: + # check placeable header + assert self.fp is not None + s = self.fp.read(44) + + if s.startswith(b"\xd7\xcd\xc6\x9a\x00\x00"): + # placeable windows metafile + + # get units per inch + inch = word(s, 14) + if inch == 0: + msg = "Invalid inch" + raise ValueError(msg) + self._inch: tuple[float, float] = inch, inch + + # get bounding box + x0 = short(s, 6) + y0 = short(s, 8) + x1 = short(s, 10) + y1 = short(s, 12) + + # normalize size to 72 dots per inch + self.info["dpi"] = 72 + size = ( + (x1 - x0) * self.info["dpi"] // inch, + (y1 - y0) * self.info["dpi"] // inch, + ) + + self.info["wmf_bbox"] = x0, y0, x1, y1 + + # sanity check (standard metafile header) + if s[22:26] != b"\x01\x00\t\x00": + msg = "Unsupported WMF file format" + raise SyntaxError(msg) + + elif s.startswith(b"\x01\x00\x00\x00") and s[40:44] == b" EMF": + # enhanced metafile + + # get bounding box + x0 = _long(s, 8) + y0 = _long(s, 12) + x1 = _long(s, 16) + y1 = _long(s, 20) + + # get frame (in 0.01 millimeter units) + frame = _long(s, 24), _long(s, 28), _long(s, 32), _long(s, 36) + + size = x1 - x0, y1 - y0 + + # calculate dots per inch from bbox and frame + xdpi = 2540.0 * (x1 - x0) / (frame[2] - frame[0]) + ydpi = 2540.0 * (y1 - y0) / (frame[3] - frame[1]) + + self.info["wmf_bbox"] = x0, y0, x1, y1 + + if xdpi == ydpi: + self.info["dpi"] = xdpi + else: + self.info["dpi"] = xdpi, ydpi + self._inch = xdpi, ydpi + + else: + msg = "Unsupported file format" + raise SyntaxError(msg) + + self._mode = "RGB" + self._size = size + + def _load(self) -> ImageFile.StubHandler | None: + return _handler + + def load( + self, dpi: float | tuple[float, float] | None = None + ) -> Image.core.PixelAccess | None: + if dpi is not None: + self.info["dpi"] = dpi + x0, y0, x1, y1 = self.info["wmf_bbox"] + if not isinstance(dpi, tuple): + dpi = dpi, dpi + self._size = ( + int((x1 - x0) * dpi[0] / self._inch[0]), + int((y1 - y0) * dpi[1] / self._inch[1]), + ) + return super().load() + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if _handler is None or not hasattr(_handler, "save"): + msg = "WMF save handler not installed" + raise OSError(msg) + _handler.save(im, fp, filename) + + +# +# -------------------------------------------------------------------- +# Registry stuff + + +Image.register_open(WmfStubImageFile.format, WmfStubImageFile, _accept) +Image.register_save(WmfStubImageFile.format, _save) + +Image.register_extensions(WmfStubImageFile.format, [".wmf", ".emf"]) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/XVThumbImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/XVThumbImagePlugin.py new file mode 100644 index 000000000..192c041d9 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/XVThumbImagePlugin.py @@ -0,0 +1,83 @@ +# +# The Python Imaging Library. +# $Id$ +# +# XV Thumbnail file handler by Charles E. "Gene" Cash +# (gcash@magicnet.net) +# +# see xvcolor.c and xvbrowse.c in the sources to John Bradley's XV, +# available from ftp://ftp.cis.upenn.edu/pub/xv/ +# +# history: +# 98-08-15 cec created (b/w only) +# 98-12-09 cec added color palette +# 98-12-28 fl added to PIL (with only a few very minor modifications) +# +# To do: +# FIXME: make save work (this requires quantization support) +# +from __future__ import annotations + +from . import Image, ImageFile, ImagePalette +from ._binary import o8 + +_MAGIC = b"P7 332" + +# standard color palette for thumbnails (RGB332) +PALETTE = b"" +for r in range(8): + for g in range(8): + for b in range(4): + PALETTE = PALETTE + ( + o8((r * 255) // 7) + o8((g * 255) // 7) + o8((b * 255) // 3) + ) + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(_MAGIC) + + +## +# Image plugin for XV thumbnail images. + + +class XVThumbImageFile(ImageFile.ImageFile): + format = "XVThumb" + format_description = "XV thumbnail image" + + def _open(self) -> None: + # check magic + assert self.fp is not None + + if not _accept(self.fp.read(6)): + msg = "not an XV thumbnail file" + raise SyntaxError(msg) + + # Skip to beginning of next line + self.fp.readline() + + # skip info comments + while True: + s = self.fp.readline() + if not s: + msg = "Unexpected EOF reading XV thumbnail file" + raise SyntaxError(msg) + if s[0] != 35: # ie. when not a comment: '#' + break + + # parse header line (already read) + w, h = s.strip().split(maxsplit=2)[:2] + + self._mode = "P" + self._size = int(w), int(h) + + self.palette = ImagePalette.raw("RGB", PALETTE) + + self.tile = [ + ImageFile._Tile("raw", (0, 0) + self.size, self.fp.tell(), self.mode) + ] + + +# -------------------------------------------------------------------- + +Image.register_open(XVThumbImageFile.format, XVThumbImageFile, _accept) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/XbmImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/XbmImagePlugin.py new file mode 100644 index 000000000..1e57aa162 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/XbmImagePlugin.py @@ -0,0 +1,98 @@ +# +# The Python Imaging Library. +# $Id$ +# +# XBM File handling +# +# History: +# 1995-09-08 fl Created +# 1996-11-01 fl Added save support +# 1997-07-07 fl Made header parser more tolerant +# 1997-07-22 fl Fixed yet another parser bug +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.4) +# 2001-05-13 fl Added hotspot handling (based on code from Bernhard Herzog) +# 2004-02-24 fl Allow some whitespace before first #define +# +# Copyright (c) 1997-2004 by Secret Labs AB +# Copyright (c) 1996-1997 by Fredrik Lundh +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import re +from typing import IO + +from . import Image, ImageFile + +# XBM header +xbm_head = re.compile( + rb"\s*#define[ \t]+.*_width[ \t]+(?P[0-9]+)[\r\n]+" + b"#define[ \t]+.*_height[ \t]+(?P[0-9]+)[\r\n]+" + b"(?P" + b"#define[ \t]+[^_]*_x_hot[ \t]+(?P[0-9]+)[\r\n]+" + b"#define[ \t]+[^_]*_y_hot[ \t]+(?P[0-9]+)[\r\n]+" + b")?" + rb"[\000-\377]*_bits\[]" +) + + +def _accept(prefix: bytes) -> bool: + return prefix.lstrip().startswith(b"#define") + + +## +# Image plugin for X11 bitmaps. + + +class XbmImageFile(ImageFile.ImageFile): + format = "XBM" + format_description = "X11 Bitmap" + + def _open(self) -> None: + assert self.fp is not None + + m = xbm_head.match(self.fp.read(512)) + + if not m: + msg = "not a XBM file" + raise SyntaxError(msg) + + xsize = int(m.group("width")) + ysize = int(m.group("height")) + + if m.group("hotspot"): + self.info["hotspot"] = (int(m.group("xhot")), int(m.group("yhot"))) + + self._mode = "1" + self._size = xsize, ysize + + self.tile = [ImageFile._Tile("xbm", (0, 0) + self.size, m.end())] + + +def _save(im: Image.Image, fp: IO[bytes], filename: str | bytes) -> None: + if im.mode != "1": + msg = f"cannot write mode {im.mode} as XBM" + raise OSError(msg) + + fp.write(f"#define im_width {im.size[0]}\n".encode("ascii")) + fp.write(f"#define im_height {im.size[1]}\n".encode("ascii")) + + hotspot = im.encoderinfo.get("hotspot") + if hotspot: + fp.write(f"#define im_x_hot {hotspot[0]}\n".encode("ascii")) + fp.write(f"#define im_y_hot {hotspot[1]}\n".encode("ascii")) + + fp.write(b"static char im_bits[] = {\n") + + ImageFile._save(im, fp, [ImageFile._Tile("xbm", (0, 0) + im.size)]) + + fp.write(b"};\n") + + +Image.register_open(XbmImageFile.format, XbmImageFile, _accept) +Image.register_save(XbmImageFile.format, _save) + +Image.register_extension(XbmImageFile.format, ".xbm") + +Image.register_mime(XbmImageFile.format, "image/xbm") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/XpmImagePlugin.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/XpmImagePlugin.py new file mode 100644 index 000000000..3be240fbc --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/XpmImagePlugin.py @@ -0,0 +1,157 @@ +# +# The Python Imaging Library. +# $Id$ +# +# XPM File handling +# +# History: +# 1996-12-29 fl Created +# 2001-02-17 fl Use 're' instead of 'regex' (Python 2.1) (0.7) +# +# Copyright (c) Secret Labs AB 1997-2001. +# Copyright (c) Fredrik Lundh 1996-2001. +# +# See the README file for information on usage and redistribution. +# +from __future__ import annotations + +import re + +from . import Image, ImageFile, ImagePalette +from ._binary import o8 + +# XPM header +xpm_head = re.compile(b'"([0-9]*) ([0-9]*) ([0-9]*) ([0-9]*)') + + +def _accept(prefix: bytes) -> bool: + return prefix.startswith(b"/* XPM */") + + +## +# Image plugin for X11 pixel maps. + + +class XpmImageFile(ImageFile.ImageFile): + format = "XPM" + format_description = "X11 Pixel Map" + + def _open(self) -> None: + assert self.fp is not None + if not _accept(self.fp.read(9)): + msg = "not an XPM file" + raise SyntaxError(msg) + + # skip forward to next string + while True: + line = self.fp.readline() + if not line: + msg = "broken XPM file" + raise SyntaxError(msg) + m = xpm_head.match(line) + if m: + break + + self._size = int(m.group(1)), int(m.group(2)) + + palette_length = int(m.group(3)) + bpp = int(m.group(4)) + + # + # load palette description + + palette = {} + + for _ in range(palette_length): + line = self.fp.readline().rstrip() + + c = line[1 : bpp + 1] + s = line[bpp + 1 : -2].split() + + for i in range(0, len(s), 2): + if s[i] == b"c": + # process colour key + rgb = s[i + 1] + if rgb == b"None": + self.info["transparency"] = c + elif rgb.startswith(b"#"): + rgb_int = int(rgb[1:], 16) + palette[c] = ( + o8((rgb_int >> 16) & 255) + + o8((rgb_int >> 8) & 255) + + o8(rgb_int & 255) + ) + else: + # unknown colour + msg = "cannot read this XPM file" + raise ValueError(msg) + break + + else: + # missing colour key + msg = "cannot read this XPM file" + raise ValueError(msg) + + args: tuple[int, dict[bytes, bytes] | tuple[bytes, ...]] + if palette_length > 256: + self._mode = "RGB" + args = (bpp, palette) + else: + self._mode = "P" + self.palette = ImagePalette.raw("RGB", b"".join(palette.values())) + args = (bpp, tuple(palette.keys())) + + self.tile = [ImageFile._Tile("xpm", (0, 0) + self.size, self.fp.tell(), args)] + + def load_read(self, read_bytes: int) -> bytes: + # + # load all image data in one chunk + + xsize, ysize = self.size + + assert self.fp is not None + s = [self.fp.readline()[1 : xsize + 1].ljust(xsize) for i in range(ysize)] + + return b"".join(s) + + +class XpmDecoder(ImageFile.PyDecoder): + _pulls_fd = True + + def decode(self, buffer: bytes | Image.SupportsArrayInterface) -> tuple[int, int]: + assert self.fd is not None + + data = bytearray() + bpp, palette = self.args + dest_length = self.state.xsize * self.state.ysize + if self.mode == "RGB": + dest_length *= 3 + pixel_header = False + while len(data) < dest_length: + line = self.fd.readline() + if not line: + break + if line.rstrip() == b"/* pixels */" and not pixel_header: + pixel_header = True + continue + line = b'"'.join(line.split(b'"')[1:-1]) + for i in range(0, len(line), bpp): + key = line[i : i + bpp] + if self.mode == "RGB": + data += palette[key] + else: + data += o8(palette.index(key)) + self.set_as_raw(bytes(data)) + return -1, 0 + + +# +# Registry + + +Image.register_open(XpmImageFile.format, XpmImageFile, _accept) +Image.register_decoder("xpm", XpmDecoder) + +Image.register_extension(XpmImageFile.format, ".xpm") + +Image.register_mime(XpmImageFile.format, "image/xpm") diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/__init__.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/__init__.py new file mode 100644 index 000000000..faf3e76e0 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/__init__.py @@ -0,0 +1,87 @@ +"""Pillow (Fork of the Python Imaging Library) + +Pillow is the friendly PIL fork by Jeffrey 'Alex' Clark and contributors. + https://github.com/python-pillow/Pillow/ + +Pillow is forked from PIL 1.1.7. + +PIL is the Python Imaging Library by Fredrik Lundh and contributors. +Copyright (c) 1999 by Secret Labs AB. + +Use PIL.__version__ for this Pillow version. + +;-) +""" + +from __future__ import annotations + +from . import _version + +# VERSION was removed in Pillow 6.0.0. +# PILLOW_VERSION was removed in Pillow 9.0.0. +# Use __version__ instead. +__version__ = _version.__version__ +del _version + + +_plugins = [ + "AvifImagePlugin", + "BlpImagePlugin", + "BmpImagePlugin", + "BufrStubImagePlugin", + "CurImagePlugin", + "DcxImagePlugin", + "DdsImagePlugin", + "EpsImagePlugin", + "FitsImagePlugin", + "FliImagePlugin", + "FpxImagePlugin", + "FtexImagePlugin", + "GbrImagePlugin", + "GifImagePlugin", + "GribStubImagePlugin", + "Hdf5StubImagePlugin", + "IcnsImagePlugin", + "IcoImagePlugin", + "ImImagePlugin", + "ImtImagePlugin", + "IptcImagePlugin", + "JpegImagePlugin", + "Jpeg2KImagePlugin", + "McIdasImagePlugin", + "MicImagePlugin", + "MpegImagePlugin", + "MpoImagePlugin", + "MspImagePlugin", + "PalmImagePlugin", + "PcdImagePlugin", + "PcxImagePlugin", + "PdfImagePlugin", + "PixarImagePlugin", + "PngImagePlugin", + "PpmImagePlugin", + "PsdImagePlugin", + "QoiImagePlugin", + "SgiImagePlugin", + "SpiderImagePlugin", + "SunImagePlugin", + "TgaImagePlugin", + "TiffImagePlugin", + "WebPImagePlugin", + "WmfImagePlugin", + "XbmImagePlugin", + "XpmImagePlugin", + "XVThumbImagePlugin", +] + + +class UnidentifiedImageError(OSError): + """ + Raised in :py:meth:`PIL.Image.open` if an image cannot be opened and identified. + + If a PNG image raises this error, setting :data:`.ImageFile.LOAD_TRUNCATED_IMAGES` + to true may allow the image to be opened after all. The setting will ignore missing + data and checksum failures. + """ + + pass diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/__main__.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/__main__.py new file mode 100644 index 000000000..043156e89 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/__main__.py @@ -0,0 +1,7 @@ +from __future__ import annotations + +import sys + +from .features import pilinfo + +pilinfo(supported_formats="--report" not in sys.argv) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_avif.cpython-312-x86_64-linux-gnu.so b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_avif.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..6718d4792bb26b7abf9551a9661a0a21ae7bcc37 GIT binary patch literal 91985 zcmeFa33yah_Ah#dIz`n^dd+oK?9_v(P<=Db;iY!a!OO-}Tt&k)I1tBZ96&sX>N^zj1OPv|7%@n>sUecZ; z&0KPG__8l*=h-j7|L;&jjMb+RlV5PQ$)lY(-ptMV$a-dHkkexg6Y#t3INr=nxgyv} za<+UG2zO9ou!`7?M&xblW92B`(-xN{bzmqFgxSW}ry~1oHQjx$^ zaXv}p=>jzKws!tIxllY8G;`BVGK2MBiKwq$R3P$G0&V6FK_>KnCs!o;!OYG2iZAdY zl@~x?L|yd2MGsu`z(o&S^uR?AT=c+24_x%XMGyQh@_>XB+yC=Fh3QcLgC@@P?`q=* z5Lr^Bb~r$q=gAH0@4#_Hl@bN6F0BG5GDYgd4w*Q=iF2EIemUHo>)F-@zeV78w85M3 z*4bRn)MLxzaB~~He-6j*Z-bWv-eKmPO{yQt3#Oc@Ul;m=ZTM3KzN8Jlo50t%!4DVs zEp6~q1paUv{A_`j=5o7Cd#)4sU>kg`z?ZbaFA?}1ZSZEh*3LU$ziCHt>G^oGy%}Za z<4rrZ%;I=Dld8PP-nUxt$rk)J3qI9?-(kUfE%;^&-aLB~dA|kU$HITWf*)+bAGF|y zSn!7}co7PWnlXnn(Rq8Mg+FA$kFem&E%;#;{8|fsj0L~df)85o5eq)gf_I31Bzy8L z_>cuZ%7QPq;Bzea0~Y*n3%*M9JL%80;H44{(6s{5%$K8tmk6(zNaXGk4iMhFBO#2p zgx)2I@M3CUu)l<54A1U0I4EUU@FZitvPyV~aOT(`%+L~g=labnA%cS?^v>}*FS7Sg z2?t0|951r>q7n`eUR>QUM6m^*z**RPi3M+1@Z}b~%Yv`6;LSOd$V)8vL_&yHeF-m+ zJsyFhY;6e#2%p4@?7gXk1B6fEMfSd_gad>ZSBea=#e(m^S=jql3qH+)-)6ygwBUDG z@Zt)QQJXDzpM`(F1>f0%KVZRkvEUC{@O}&aum#`Mf{$46-7NT17JPRL{;UPx!-AJ) zbAbF7u;3jQd`}DBZNX<)@LmhPmj&;);Cox}85VqB3qH$&?`Odewcz_(@Iebc(}E9K z@L3jokp-V^!53Tb11$Iw3x1#lUv9w#%1OI>Xz;~|BKZY7kI6{ruUvbU~t!b`RS`LI7_BeJkQ(FeV26Ri0H}LN25=4pM za-u~Kx8T)d7r`>Y2N?Vu!E~gGHZ%AMf>naIG5BGE>1Y+*!r=P|rXy9fiNSXfOh>6` zJ%fKwFl}F>RSdp`U^+TQOBlS0U^+5Iix_+Z!E{uL1{qvUa2&x|48D$FIvPd&44y+U z9f_iD246ui9fhJ2gQpNoN1*7bUx4T_fnYlNL=Q7Kk6=3TL=P}{IKgz(i8eEM0KrKF zZ)0$8g6T>jx`n~r2&SV>w28rK1k=?*w4T8pg6YT;tzxiFFkLZ3OBk#WOh=z+5rcmm z4VaER(IA7rC76yn(JTgkMKB$4qJ9P+A()OfQ8$A>BDgcb5`*6+xC_Cj{zdJ7jbJ~) zhZ($!;I0H8VDNJU(~%|G%-|;orlU%98-pJvn65&iTNr#F!E|JaHZk}vg6XIdt!MD> z38o`Tw2HyE5KKptXbFQ?5llytXc2>NAefFK(IA7X3GPF17K5)Nn2sb-KZEBGOh=KZ zo55EQOh=HY#Na6e)6pY(>gSf0(7I6%jlnosr`<={u(P!(7&#X>{J*>c#`r5?P} zZjpn3DdQhpOqiZS ztW?)$dZ=MkH*iX!@E5i5P<ldp#CdGgW4APRe?hJJg3E zLg7!Z3^mpVArJGL{vhAccWKbtM_5L3N_A8FF`}jVrYfJ zCnN8`6-4_9(m)>*=$$}^cV#!PdE2$-pb#qxk8y+LL&5R~A^8@U+%M3p1bTqV6h0%+ z*9-JOQnqgJ0|Gsb)w2VZN~mh}Eu^baJBD}&g}(ydYT|1gn%x}v5uC?6n|%tVmx*cJ z;2Stcl`+~Y2iwevb86Imxmc<#vWBm~?_{=^^M=jy8#5V{U*FFu64QKTg z3HyMcMPvuPp%MAvv5xHK(7v(m2qfTg7(6yumj%JlbF^9wJK&nUEBkFI3GHHt@Ytas z7FzM)u_Hskm4`-Xg}AH@h4a(huGN>pt)a%C<8=LBpvUG~9YIEXZeZQSgz?twx~&)Z z&=Ju;fedG_Mh3oym2Sng=4lkOPlv+G(jAe9&cR8ID7{G05enPVBX=-Va(XEIa;Py+ z)P$;65JO|GiKzWeDEvVvTnHt#)cd4_$(J!`5af4-)|{@L0DEf3(kS=`2(WEU9lE`s zVUJumY+kz8)VnO*T^K$V=|Gi-_gR~`W-ObL@~L($8}}vX<8RSzh}g($XL&q&Sbip= zv;1U4K~C}b9LrBecAaTyiO$6+W%K0@^okU10LbGIljCg6l#!jNydb=XMbtL%gc>)b z*MoImkfs@lxo8Ki{vjH%$5>ZvNIw8XS$NEKJE&*N!Zqap<};4@6mrl((hRX12=vv^ zhO@Hkcb$PP2w#=%#egaZ&rf$p3SlLUs(hB8jEp3!w_!+%`S?YMOK=XwuS6|n5#NZe zf?HRQqV`xPR2Ih&O@@J_wv_AnK85LtK8aCP)&%@ajvvJJ zNAD(lY)xr6>u}xtAuTxTQc9@D=h{|<jgWN5dR;upLvYB8Bak06X?J+{+Y~fYJ0rZF&`j(+D)5cf!leS8HB%tv&}2hTjaw zr$>B0w6rwFQ`|S4OLpD-FZ3^)@j~w$ekfjXORhDCfO<%hbjh{)Qxwtu+2{y37B0RM z+cwO=ON57mP)4yZl;tNQS;)zR2+L1KPJK`GFCz}}a~LBF>v*W~sq|*pPJDjop{Q6! z=Ix_#y#f*z^OpVEyenGGyM~*$3)h_7yeF^=jb6n@BCE$u45(*6?4f#k#Og^szn%fV zu7_lW8<+?<{^;Jn+0Os>@<_)%wsidvW#4+x`fm7G3iXG&On~l!5pM zPCWh@%CCs>dniB4%h5h)0l;bjcH-dO0(^vn(**cO4lWnqX$}q%;Fkb-`*JUj?TWC` zVq2wYI4odCw4|_cE>?i+y|hpA(>}>-?vpyP-Oo_=o>4@*8SJDAu_4NcY$l&J?D13o zZ9+#hPM7lG*Z9UswtTF??)+i9Tx+fcA$QoTt~C@AjW_z&wA2+vJS0hC=V(ToUXFEo zk^^tkGQF2zlOBCEL=3dak{(AHUDK-q7*K2H%>3Y0v@KFTP>}* zUsJ$;@GW_688&+B2G@HqE8l_s0s*ycXm)LH#u7I&QVpiu@GBGynPe8$NfB(cWTh_dq>)N<4@)Bgm$}L#l9T<1{;d8LJ03z*}^vT@to=72+KI&T2 z0BLH=-9R*sVg8kX+Be1zV_=PTLl$-0o+Xy;5gWhSWkgsv_+jc+wj(2Zi8H(TJl=Y) zC?%2eKf(Bi(?%sS1QJwvXR5r$zvgt^OSJkv4)FNXVjM(%bBa8$E4Sfan5p(a85;)q z;ix%T)#Zs1`XIM>2TnD7G@Np?(eNf~_nF8u(9}59Pb=ayOb^FzZ=Ju<(1*C#@qKh3 zKxSmXjOcd=X|y*VaO9-Lkh?Er$Wmbl-+ySCF+&<)NVJ+wNqqf6eKMy;$&{vi%#UkL z{XZu!UMU*+S*(#)^Wk0w$q#Uh;|&av-ZUrxHp;Qbo0$EL+Pxf(E+_qWow_Myn9sGSy^@om)exD9iG<9`$F{HuUp zu!}Z1iDSGB z;YTThm9kJ8%1S|$IC~LF#pt$jKFo0}4`QnqdG!SAuiS>8F-`};thOQSS~Ct^^{ewhb(3PV@~H z%zS*oo?%vdHlXRhw&ww0c_b}{E%mrf;kJx}EzwGh8!TqA@p>7N*A4DQQFaJ?k+Z_Y zAoA!OaP#=e=6uI-7e`!g3$8R~&Zh`Z2~CL(i1DApr4AU6-z?%W%He2)FQ&2jo!mUO zv!U@UsFby;J0JR7|l~NikEK-ie$y5IDX% zor5z98*8#c2wFeF1WQijhvS$rZ>O6G=m?+0XwRVG&d-VY>3t&`z#yWF&T)}^sKbmd z7MvlVq7%UoIrJ4RS6Fa5ShMSQ{lVjU{2N*Z ziz10og1T|qiJXR#Nl>!-Q5X?woLUuXoLG#r7`6(HW6CjJzKDYjr{L)V+JC+6T6+^Q zHhd));2=`B43h$#I~|dKLJ=KB9mlcw)4dep#R(jFg{?DhK<+tMA<;5()>nb?ag8IBWZ_*+EBI2eE^z8WT2rjxQJxUXSPiMcNBZbE&3h{ndt;;LWA z=4;T;V{EE>v^8KGc}9o~alf zy$pV*`1vhYdHgRFceMUEECyA!HK=Y9H)aMTFOL~B7?q*93waksW4*vo3ojl8H*GF<+8e zc2`%MNmmr>2J0}EI(5>Qpfsv$nwL034G}pMR%`pQ5OZ8f(_#>gOnEs#H4Xm2!9~&_ za{N$iK0|d8!r+>U;-3x3<1fbI$+CZk^@WX#!I3J?f`C~F;*u?{{+!&Qx#6(V(5#^GA#8eA7lJ-1{27}JXerHY+;}Tg6|U3H zw4?c{wjGKm>@X4LH%_%R4$N(wG&1*coGNh9I_iBeMfQ`Mai)NaC*k%dxuDSwhbE9i z3&M8S>SE|cWwoiH#<94UTVilmkCj}j`%(34j@G6YG}>^^<#m$_!h2aaL~ChTX)0_?xEE@pdzj83z<*YAi0dslu4#r=w;xsEC`qnDWqI$^D!C5!fMSBg2E?JLm}1hG_$oHo}nq@A?lyi zpSQHcKHEf;?Iz;I*F_Ip^uT!@$S5f2RZ~$>QG>Uts-?Y`_O4jkd$LrpVD`18{<+nq zvui6V7y8R)SIjS+CzaLBpD)d?SWr<5pkU#m+4C#r`KxCyytY&tG(2l~7TyPl_W>y5 zFUD0YOyf~xry3$GpS?@=RF2{;udJ%4`X+}X9I z{?dhWE9aF~OS3B%NVDr|E2XKWwYAXVA6r~7&OdKDYiiH(5 z<($K8^U~fm6>Xb0uaq~>G`wK4e?jSj%Ic*Tu934_YAldi>lDPY>e&lQ{XOcqLncm~ zh%TEmdr?K%EYT)vzeKJmsF^yoV5&5Wh*B=z@`W{29xEI#ESyDl&IK!4KYPynQb}~o zukf5tR8=EgTUtA-VqsY&D=^cf+4B%e%s;pr5pghk-lEwH=a$a%GjV@q6~$dmYp9z3 zxiFvASzKmrW!?OF{)LsbJcwg)_jbp>2lU5)DeH5E5dgw*+a(_2Q5 zx?WsP`jwr+-KL$ENGz+aT+lWa;lJ9_YfG#Bm2i03{L00s(_h6Ro2rzgYHS23DcHk) zi!DPkU@=mx_PR8eM%aCUwABhY1tB}8e&$?*u zfzJZiOTJ->BrkEx9pl?MnxG$RxYP-${!mMc8+?-C9%pzbxZ)N&>ZP2t5xobdcOyaK z$w$h7y;b(1~U7~0Toys<^S)Yz(yGq$M{j2+0Ek?%)3fbv14!)k#M zK{|zW7OCD=V5~)IvRw&T)i3MD(0n5+*T{hWJj09n@(jlq9EBzFe>~cK3jOp3wU^lf zo(tP@nXyftVeF7$1JZt^1M+m>)ElS{*xaU${J5)tAM-1Gi0Td^twr7WIGr9vnd-h( z$u+z;skw%~!3L9+8M@)mH@xs3ES?yrOtQlHaT59Y4YD6PaAXtxFo*fM5MTr}8xH#` z5fh|;opPz+y_NLeWP_~@TE5XFE1&8{22iM)yJl>hay?M_78L5D{vHZFgAj9X2z|FH zlMU}W>bF}--%ZqS4R%thu7gX+A5a|gc^ihC`+hknQl19DMZ^$x^Z3G zmX-lDeO8zc+A}Cq%-ux(YCwGWl?t8t3BfluPAUfZD0mNoH~gRbHQxv-FBzeUMp3R& zJjN&~0u0w*AZl{s*moF%&>4?06;F0td|mXwMGsu`z(o)IALjw{d*^MxXa2wFYyB6i z{r|`V|8E6yGuy=cTH6pm$Bh&D43U?Ke38g+68Rk>e?a8hMZQ<$?~DAH$WM#h-c@3+ zRFMZnK1Af>L_S00Wg=fB@|#3{hsYlg`F4@-75V!jKPK|iBDZ%F^@}_p@*yH0C-NC0 zFBAD9k>4cpJ4F6~$hV7pugKpQ`7x277P-B1)oza!C>-Tb`;6W`We^Y<109lcwgN#S{0`QiV8ZvM`Msl{d%{x9aU+vsmAZ~iWY zsjjVkCjQ^$=I>XS^tSTm?^u}hw)LC%f0wt_XY!f-Qf?ytH_s2x`QNhv|E_<`aY1Lr z{}W#3@1^|j)|T;O#tipojK6exFMsx+{sa1F`v+tV7@U=zo#oG%g6qc6>{>zSmz~v% z|0V~X6=OdZGCnt59ymK&$`W(6nL9vk%Om+oNRm?hEMvdz(U#}qk(_o^$8wnl}`bho3hW>BrT?-6#MpbL`=yl$In{*H=6z8{x;@g;aH z=nwe1+=T>{lX&LQ_I~?eP^3EAJ=YVEO{-W~3rHK^hmcwxWlFm+>eCz*#3bEG9dM&l$XiSKkRC{8Mu$IWqk1wb!>+PJyNVHhas^xeX^d9JHa z&d`tJfvvbw24v}7P)l5yL7Io^Tk#%ut@}L$ZBV}<13-DoMkomB*DadyHu?IT?24^{3uXLBqa_HXzK}GPm?)RcE?R{bVjV`UqVgXL}w5dNO~?- zz_`M=y(l{*(-P7~<&1DCo*ku_(VcVNQi%#w8hmBV8s6o zfIDtpDEy1Uamq?*bZ3B4TMR8w_tu3A3^NKZO&D2yjyv|F&RL7ce<0-KZj1`#iZ!~ z;IOX{J$iDdD?v{f4_9uHjo&*QWZV%@jN7%9OlUETH#Uftyo!i7HZnu}`ft$!V`FEs zDnlOt4aOhbSE2*6^rf)ZxQnq3)eoX-y2!z726}G$*FOs{Q&sWc6;=>;wAN z0D!%Txu6`>cVQSA`#hHdIIQR33yj8V9vUAJ{Sc{s-E#=QDZPQ%-tc?|;H>ctDfm0< zElD=Q5H;R(J&ATXWaB2H9q?QUq+2#-P_Mk@p|2u)W#e8LX1vY&NH#J_?j55JS%z$+ zb^!FQ>oGuCve6%rWW1NK3eZs5IF7D2-Zy9n24!Op_00#Yl_A+kL68^+S?xu#aThh< zLk1N?3w7K_3@VY0<>cN&EY{0qpMGk`{t<6Ml71Mc3%5?UP}zs|gXW96=}O-sB!YxM$VY zNPgK><8V@V-wn^W79~G{K`ZHTh*#HQ1~~MONqR|#9iX`NMzqNg{jU4Qa?iT(}hN6<#s{R{}{@4<<#KXV7`uOnVv4{-nL8+!qGh`U!`gyq2XSo=ND zR<7R)@3^*c=jz?iT-Ot<(j_{z-Srfs)axziE!Wd5tk>#i33#3XP5MoJ0KCwFeobqW zeh#at>;3o%aTNV`_yK&tdU2axM;3g@RPWGVq{ba$s+;wD$sFFj`}ONF=v|*M$^ktd z(}C+#gC0;l7*{b*avfpi!}_1lcGuD5*HC9f4`Rr=zHnc{f`2$EJH~*s#!&;n52;O9 z-Vyvg$%$uOGXUY+LCT6u^k#?T6tpsNRz;2EDRL(}X=KFBsVkG*Da>vu4xi6T?o?)w zBW`}_Ldo5pjS9EE8j;}kGQg|nA)MT4ta*NYDmum8kpby?F;+--r?_`vLx%n=<{Gyz z@kLaVrAGq*Ix}FXz8GQQ?!the{yQ|>?PnH*uyWJHZYR?;2hEepbqGjzS2Yb7r2|^! z?(X`SQEARi3ZkZ;P)H_;WL6>+g!cfU`~nZT)7=S(NzIXj_Y|7fTbZR)hw_v*7P$5u zsj{b&sLuA|V65^?GT|k!4;WeiI?yyHLl3PF9;Nz*->`juAjc^d*u87R9FKt%iT&K%awvxkNUWFt!!M7KH9Q&tns26_J;Q$;SPR_hFNF zcZ`>HCU5Q_M6NPIb{$~6@0+||oyRMs{R<2YZPPvIuZ^b)v8m*_i9vUH1S{(+GGDc3JE>C-&ypk`wo?|l2BohP^ExWBULcbSd zMj0!+$b)HnFc~Q0*-61B9Bxj`t+`?;*6@3Rwj*N=Q!W#yB#FgIrC^ zF0Y4qpQ@J9YN_)JgzA_20hl0wshIqfiE;{sVVawOLSfE+Oclx`0lZG;Tq>vhj#akN ztc;e^WExbhHA-nuV-i;;%PHgt%|YJ~V206>#(60+r8I+Vnj)thVQdkT&5q&2wXqUx z6%E!L&!Tx9lW5#bP*Z83cG7G?(3Nu47y&WgWe5wY^W@%=w9?lL0Vhjo3Zv7O((HO%3uigb3jeG|9^}nGF z##pxJ%Fr*tT5ODSH9}jKF82X2o&iJkzh?jlF(9bNqm4!Z-&yE)z*b`dqZH{q0stm5 z)y4Wb0ty*WqQ8N;$C$)`a-BBs#-$9X(x+f1GA1)%iSEVhY7{YT_4+^2LgO+v6R*`j zBep4w(xksklxa+6lm0%*OlQCr{VU9{#ta5*)kl%lmos3SzBL^{F>C1#eK`Wwn8_&3 z`i*e3aRmeR>jku-ypjP2^uZ)^6$1|HiNtm_0}ks`Nx>`zMD$wnbqNDb>D#E;vl(#K z=t~=>ISjxm_#kz|Jk|z>Y-}Xgmob`KHXfr^T+1LlgRH!u11wiV=x$Guah-EF_4YBU z=lTSiFC~2);@X(c1RVNe0v32^o^sh(O~v zjFP2agFZK^-8AP7)t?}?TBbUvFD9UlX$xUo(@uPmdI`+&c#S1ay8O_;?GEHpVb@id zAdDM?T{MFmHzv`v>z0%q6jIC7HzBNSCz%yqFXS~xXS^p-=+j1`bqppG2r|t89=}oV zyb-W|8%h3_c~R2)QV*@-F4fzS7aADg)=yKAtv2Ezg5%&4+S#vBM*;GS7>`;tcDB^m zc~wb-I#;&qJ4QW+cQ$dh2bwpHm4aYmAY|#x=3GU)7}ps0Sn%oFV6JO&*9oLbPsVt2 z6}2w{;E-GsV4&t8F3sV?yF!Al%Ty{m-@!0*yQaEt0icgUjJjsC?USU}!)va&orvIo z0`35QvT2=wF%f8v4(J+<9Yr(;?Ortp?PxUzHL>fx*o!BYu_kxj z3{{C0ygaBc$_sfp9rI)24Xo_(tC}+%VaYaWs$HDVCqYuxUEGVxa8#(qsq{m*$}IFx zd=guZoo{1UWyJM$uQ27~`l)=Aho_*VxIwN45ZwA&gj?J&c8}xLhr+(N(FxQgeyJN} znuFvOQWlq^jzn2w*F>7*UXx1$367MzNykzIRD#p> zA=B|GNe97xHYQEg@y&_qw!IH8C_Z@Kb9n->b$(^xW?|jlt%-3P&r+m(d5y zoiC2D(=Rcpz9|TAn{Nx=HJ=v~pxt+6Z^-(3LdfB(z_Q@m2U#ZalEe! z0xH4xAzeK9j)33g^MTXt+aEx8_#Cj(<6DDnO7cAee6sIO4B`~u-wV^LJ-od(_y)=RjS4-(X<6`ijtsZoVS8 zOqUdDs^<+g4)!YU43wkH1RP(@={w|s+T-_e)3{bxH=ts%-1-vHvz6C<@m0={Q zzF(lq=6j1KG%1bbJY8jV5h-~Cyh6zk+4z!_^k*G51x}HDxoD%}dmIv~lt#Rsk+S+c z39dv4*%;_X{RpY;1_`nINn5(;=M%W05T1NsI?D*Gj$(=mOby8ZDB2 z8%W5PiV7589U5Wt4T9mCuPZvp?t2llW;N&{Elxi2gE7m@mr#w9oel*d^b?ta3N}qWJDqsoFfmrsivh z!D{#23>UQXO~N74;nTqH^xca7*L@p7jq^=rRkZ_8g711ii$@sc^1VriPG1ye;!sKx ziSJ~8*de9;9ZmN%oNrE}EI&l%d;t?BUkVI{&(TiB*Mx|&`L50+bM_!o?7q$LMLXZK zSQs5XI0WWAfdQcV9)yB8-w7BV@7s^zl;HarRKqu^E19qe?}@%uFbXEz3^~s|+=L#z zVYDQB{v^BKg@(W_6vB_nIsq6VbMST)MK<5JNNL3Fc}!Nf1K0BsRP69PExWz2DPy7J zc}7k+Mq(NBB+m|Bwn=Hk=6P0Dzag17V4%bEyzDL%GA~$UUX%?w|3Ze?JTJ*=4{-Io z3_;-Vyezxxh0Jcw$LiS=lOZdwzp%mObqh_oHM>A;Q}euO!fXkLiwxo&-g0 zBF;|`O|r+OxIZAy98%(oaT3wfSy7)O&QoZt%`;AMyAaudN{njH6^cPaOA4eD<7^Ho zQW~*(<|yh>l6w+EpxLuXad$u=@Hy46Lh)|H2$ceVr4g}K@oop?2n?ZaxP?RhKt&v& zbxPV^(1r%~lPB)rw4%Tk^28<%l?N7M2znk>(kMpi1O3qbp2s+}HZYvp{-k2Gpud{} zH5B5{C~TJ96zD?3a);ujDQRnf?i)SNDqU%IcsOt)(VkN}(cpX}pkhYyJg>NDmfIE> z+zn7O_xw|VB-HA8nL|4Q>#2ROD80x@JEfjUF#fQ|sk*7Xfu9k2o_LjYpcL3ip_RZP zTi|yzw;CLB1lAGFt)|eV9v`@chD4&us&@z4QS~0RGtJe>fhjQ1lcc&c!CGg3{V_`EluCIHIewrtH97@OV&`oyeqP%&K484w<01Qo``HqLD8o8Qyq+Hv^>Zle*#)l6 z@cg8>r$Z({KZxP^my$q$6gWiCFG@lwAX{KA#kjXDxg7zPh?;mKj>o zfyAex$&zm_>Xm(Y%)(7wNjx1f0&$Y?99Gpi;O$9w!$Hqc)m?`5k&nY;Jod#n{E|ar z97Z_g2+%#VC#oiqOX34%@P_9rHI1xy2Y#UudqV9*#$a-$i2j<78BET8K&Lp=iH|32 z^k@?D2UgOg_Z^4Q1M_LR`d)Pg(SnS?dm5m#e2iuVQfb;b$88xZrBNfW_fzjhg?4I4 z`Vll(c%`Gw*bbC$D`X@eT?EL!B#;%~V{owQ+YNWve49|#e7B-byOc)Ko^+eKgj6MB zoC#F{oAEiRO2En_`}&X)DXoGALmwMkBh$K(nZs=Ee}PSNsAy~owK$pHfJjEx^KuAe zc?xXq#ef1mP^D+0t^FxTNP(LPDzqgN$q}eQe0V0?Ql13l4y>YXFSfA{CA@(fX?48D zCS11#9G`RJE% zWnU)7h2qTLKa|eg8 zK_OPpoi=qaIMYvKp%T^JZ8L7CYPVy;k$hdy^|J3Jn27!&F3%%2bphx-zk?AOp2uzO zAE>IY$cn#m4@((U_*l;Kge`uWOnqUeo_&(j+<`zmpr<&^8#qPN+S8oom(ob7XS+?^ z0-fo1!l%Nh9qtUe+1gXf9f1zu@chUFBtAgviAT{`xVQt?P;WUo zlpJV;B_5qa-oX24uE(vhwYXDY3i{2H!XbZP3_9G?kwfW$BQy#-Ybn&h8GHjXSW6@` zvjRFzGD9_H+0ei}Y*pjX$Urjs-!oiGBWDByPtqDbLQA0@2=Oi$sj(oh;%*+Lu`XD` z-JHW|^#K+zS1GCTfWkKuv+iX}!HvOQB8smR=Q=l4qJ`yazM4 z$i27tLAzY*Oi!3^m3!Yz5ipCZ*(Ue)k!{y%U1($T6n*kUi-P8$vEZ78*;I4TXW?no zN1p37H4kh(?}ZAt=RM8c8Ey@zJwf_F^U!fX3Sgd+JO??1=p|Oqhno5wl=Qe6y}n8I z9M#;9Atrc7AJ?oM{WWi_EpU)J>^lxQ0*k0q&TuH6JMbKLlAAl}7f$mA22gWscG0zq z$m(`>)D0@c*BWQ`-`)wLKV|bOz$H-VSoV>l4(1&n-|)qmJ>+u&aGwY5EF8vKY>@?Zz3 za27`z`dpSSFX;&p>FK0*Ko%ROzKPiF$c1Xh-N2!K z!PfUt628(zAD$zm>8dypUT4yp)OTeZ*cPbCGH_1SZ?e&YTSHAYS?aqCJtMDHJ7h36 zNwD?%7*0+ao*0DkN>KQv-Bp12y>fpq4U9Y56QCr^fgk zus@l+&Q@9}D-|?lj^gP^c)BN)`mIC1Cih@f4j?QUoh@a4gtBKN*FwLA#I#6R@6!xg zrMa$(p)v!+c{}G^ZlaT0*W>{oQt(%5Ub3TKZ#X`s8>{Zm#LT?LKF`bQV+WrmyJ$Eh z(;He&*KL{GNx^M))*`YinWB|*WL49GVzasaNqFXr%l;Na>@LqFXY;B2j>!+mXKsB!H^obw*O9OPObM5d%r~Var-{TUQla@ znF`70=xrF@q)a>Q7gVn87Ghw=WsRq{w5YE8Ocd)zDRT+UA9rx0cN2}Zk$H#Sq|E&g z^wub81bsvdy!-yt4?*o`{`|qj@=xLi4utt>WuA7u!A#akS*P2fl38|F8lk8HDeFl( zN?xtH`Vop6EDfB9E^?Q7atK3XRm$v5Yj~N;I-ta4v~+Ri?GW+I;|#yO07Jh|oM8An z8xeOBoq|}(JWQ3(;$k~4B(@p*scAR*4Cdr#SAa?sYpj5t1_0n|V zRO@GR>R|H;WtwM($kSUX_|)$yn#32YauB@cw@+x-PA_@$t8miL1;oJoOR+$&Ve=$; znaVyhS^)4`LM@Wyxr{X*f4~z(c?E&!Lk0g!GU?UNmP;@F9 zuGA2F&PHJp&BlFT40DOO%t$#8S;!MivbnrTInN66jgX$h$)q>2|v7wl=~Gz6mpkP^mGM(N2I)jPC$OAu#Wr<5DSooRpVJ)`FoE1 z3lI+yCw&qr|DdqvnZ5+#b3zvDK%Q3IG?w$w6&Xll@Y5TTd`9umQlzeLTA9a|{u+6|zj!cj7zP}B`7@^q%|3yWBxDfVNKJ44E`3%}Bea=l4z9%GUXL8g{8 z2(61?t)_hK*&+5!oAC!Y&~V&-7KZUIx| z%_$J%bHPp}Ky$(G(c!C*_=tRgkH`t_(C7je=R zulzDcc5`A8LK;Rlz49)O?4V=$LE=-%ZjPkK_VyqRw;`f83v2mEl8-6QvjY&CDIi@P zhlebY#?lxY*AT}t{;G&n26}p>~X^YJcz;{k;ab&K%->bI27_>-w-6c*b z(o5rgI{2p|Nu#%p;AC^WV?YSALPCKeRgqc86)k}IoSC%@qDzpNS(9RBZLylQ9rP!V zm{}%|Dw!qgG~_0|WES0RpFomEZ)#%}0#ukaH)hrWGV6q*yvy@PCgajh-VaH#>19Su%>YH_KvX znI$jL@RAQI2`VNMW@1M-VhAZj>x{{1i(LWdeGe2f)<>imRF!jR|Qn0RY|M4Bnd=W>qzg`Z?6f%E^Tuk;!IXi_U9UF&pNo;4> zCgIVbs5s|Xx z6nGesQ!end&6&dRIIz@@G5t~{$W;AxLX4`v%_0^y#eQRs=bSq%V)wR+1-A%1SuG8k zL){(Xkza)Pq}NfNA@ciU6!V=;NJ%GP0Ro`{DUV%d7APLN7}yHL14v`4XD^oIiTs%Y zWqlEk%R(NP?||WTB)(Od#J4KLQgLoan&^fZ8!(yhGsk3wojINWc$^q21q%w2vCZp4)7HV?@P`880{2fQb#sJ6}Fcl_;1j3vS^3Q zj+*uTfX9pdC?0Zo^IwBzC+v{BQYTDEmR~@GdMtL(8huPq%_yU7%ETZ} z>eq}mwfE)P7eVuU(k^Fm1DN&>0-&qZ0*LTLBL^L8S$wluYp^M90JXTA6Z|2t19`mrdQ? zF{bW^E#$){xhO_{!lL!8MeEA~PZz#!7|H`i%6U`ZX|~7^_~nQP`maayVk-|_7to7L zofPE4E6{|Hz?0Hafya!NQ!MbLbh*GoY0eG{extxILo5Zvltn8Ho0i&x$X^8xoXX@! zW!az35rP#H&p6CoeD;4-?m-g|efyjq8)AF2px~D!vt+82pOUpS$g;gzVrP7|h9m_C z2m!h!51KO6vI&<73Veo;nhqb7p=0Iu*@Rdki0l_jp-0|4`%+1|l``(0Q3>O2yke(#j!ytCATVSELc*9~{JNPNOC;S>HQAl4#{s-A)f zfIsPl@DU|!4%kbcEO(uW@iw9XY!kX;twWNAlhD;MA>x#aG-3sSlPG+FG?v)L-2%))^kW&)xD5c_Lg94+wg3q9z$$_? z?hycMQCLmD4gjyA(2P_>XBM++TdYL3(o23!&(0UaA{Xm^4w6*#653_Tw2PH&OoGX* zB$>CsRR;cfNFzQ0K#x4!f;8?pfTvJ+0!b=r0<Wv?9H8`#SYcZ>3{2sKw1nS4Vg2Ec$=sQN^-U9G03U3qe z4*)GFoIzp+Hlx5_ttAf2+k37bD-4{C2%m+-3|x!CY9wZ$DWytg$<${WxC^Y!NZ3%5 zf4>nG+N3Q&$vce?sS@((mtgt=iTN}EvrZh+SmI)i9Smq7lIUAgj~vrTBzi$-!Z@g* z_36ut1i~60aW?Y&UkB7Iei-OuvxABhuuw#bja@Y&R0e3k$}9pMJZA zSuh`k>yVfQ8&LQ?k~D>`+z*%se(3OcXd``~yWS)pUS^kadRr)eF)7e1<%|&&`hfU#PT_kz z+j=HRPY|0`9ycXVF^g#To^yww)2gb6#L8Nq$AzSv*F>Xfk?z6B(={mGV3S6xVlPFD zKU8(4|C+P`eWNR13cSMDBtWz<0LbGXHIC6?kgN0~Y*e z0#7Y@%z{5B@YIs+0#7YTEaWXmOLFL*f?l-k?IrNEho}GCMlZVV3UNFht}5k7DQ8|U zULvzfgczAM--2Hv@MKo41>Yp_WR@NB^rBvSoZ;cM*!Dli5M-)mpQV~q3;t6}HJvT^ zGnQ(y1fC`m*CgJ0njh%Ug2YZnRRSRUt`+j+h9wsK zN`WUg)LZa(3Ou=Ct-w?7JTCBLN0Y!)@9YzJ>YYsjPpjys0#EJPCh#TTKV#9eOW>(J z9_)88-H7(&c>8h}&{ICWIf;Fi+gspCWbAn&qiGtW7j+s7^MkSVVQQrVbKYO%AjtA@ zh)rXsmA~|+o49G!9f&xJE`+96Nb)1>(q{&{0eXb}%E*jj+_=b(vVHyxn~%!ufs+}x zccOAvlDvHS^`%R3nUiuA>X?rIdV>!kS$PJ#zS+kgDUv2FwL|27{(uDb(DdrcGaS-t zC*wfI4p;YgB&Da&q!UQ|kaj;ir1k5EA%WC~U77!xeccWh2RPBEb3ODd&^1s*lQ;0v zXon!s;~pkbnsiA#47rOL;vdQ-uZ|hAw#YQ(u5>cwI#gJO#0|M?5aAvIOpkZ{ApHXpTa@YBR2`AV5*J&P zuLg8E5?hqFqVNDxuu!O@K{L8q0JK8Wo@W3m%^5C`w2Iw;x~!{Mb}nxt&Cl!0rQlV9 zm!5r+CjE?exrzCt`4Z09>Jw@U@0=#)lQ&__>qy)uP0S}oChoA+KI$`l8}Y1H&XC~P{(}YY2%Y@ zRGRaV;2@vehPwVcpZqL%nNOzL5P#S%km)jQZl=-iVG?1Ppo52pt zH?vP&X0VWGWWTW{73aWSd8RDWN9)trqct;o(*tbNPSA0G=3r7SP5p>~figBtxM+@X z4$L~-6T0b(h4LWw4a6DrjV^gG^W_Zsu9rN7l`o%Br~nw6NE)DToDQfv>r0uA!PD3{ z?B0Vt+BfxE3_97%TSdpeX}Q!7-n1Z--HfrJrl!$zpX#%q&cu%!sHuY~>Swfc1G0TG zp>Y+Ro`mk&i=y%pe@acI&t0#i-}nQjD?Jc+WeJ=FU@$%fk**?-DKD$+ceX5@t!Gxw0o<2M`dlC$@{w68-S;u#p-e`cl?Z3HL!t>TQSMR|d_&XI z&fOkjsgi08j~fv;EUq94;^|Uc+-Pv%>nWlLvo#m6M8>{{vUUX1*DPSFGf7sBxHzst z22oG2XdDW*I3OHm6@-XSfEFqwFj=it);LdA!}^&7Wg{_@yTR&+v#=(D;vkAANw!v> zlp^=+P>@8HBx}st6v7ak+CIh^mKmnKwLU!QD$885Lsv*O0xw(Q)J*v;t_V$Cm-FPLS@*3JEw&!bXejervUHaS3tpapaD!LObgVuDx4|M6JOu zDA?fUSViEViqg+RirRa`oGK6jQ5!Rw>ggHlGQp7n4(g#8N3Zh`=!f3t=>VdS)mFue z4_mCRAw<9aat^*b$~%`DF_O8we}6pxbv_y&e8qTSLMw09`Dm^n8@iHW4fn~}NmJwoID-v88@ia z%JFf~PRP&&OvA@E=ezhkS51gH7#|CfW~!o4kNFDAb4;4`S{qkiDq6(GgmBtq(IP9Z zsI6sj+}W310FTu=hGiWic&Cak7k2nrZ%wlrfIXn_9IG4ahSe18YvQoB6kFABB{N09 z2&pU1k1ft~rM2&{qzKJyOk&}%ig1Bzgi^sVi-yF=4h!*ZaT;?NB>zaogf2Zx>!bX)T{?lG2{y|@DY4yU{^E2mGEv+rDT-a}5|7`qL_JB`%uB@!htgETc#J?#dTIQ0WLuL&b)UUd9 zUis|We)yM>bxShACv1@zuW8tv3VcWLJWS0}fuMgNIp37ZWdGyP%7}YO!u7{X|fjUiNg$)a}NywWldv5%--T2)$uB4$6ci2VRK;KF`L3pq_7>RK^X zORFlYYk3XuCe%PDX+n()D(BT%sw7M)x?x_-2w>)w*37N8B4TA&ShcjK7XK_0+8BTz z)GRBlHtQ;_uCA;WHL(_#({pq4D(2S4RB#(=>Z)38oU^pHw8qLXw-hHIuCu1L8voN0 zWo!%T7FN)|Y>aWjfb$&)-5^%re}8h}wgRBfK`_J=03JD~u3|p9b2K6qJCAJ1shsN0 z%98pgS=O|qBrV(S*0j|l?K8D_yR69#S|7W*Msd`Fh+?8&OBkg&CTLDDXjfj*(PfqNx>p|kQ7sCf+mmRr7i?Ep(+?)e(t8;#{`p-l9O6r$$*l>DQhp~4gk{9z7>Smw*4%(y4DPQv z!&(P*Niq2HTltQj&-UMgj$#O|ar{@3rl~(jvgTBqR^DS*;~gIROu`+JoOAM(M-Ix<#%Wu?9}Fgq^4F&YhWeib8RRP%9mOPWcCS6FcmtS zg<9%72E`oKq;+lpCTQA4-XjyK%PH6FuW18dSn_xjN1>RkdHbTc8bw*_K&?WEFo8@o z_|@eQNrGgu=6F|gEz(%;t4}H9!ckz@Z(+DiP@ho{aP}O{12yoqrSY53mEU?pwQ=LRE*+wQl|3{Q2QVHtg)JA(TMZfyPQW__t zn5|v@y{+-g*3(N#*k@O}?7v{EpfMmACukivK=CTAqg|ePIjb5aEqwPp|xz)vejT5aV(qIxIzNzY^3%Nxp>m8C&AvfPL{YQPgvO*{C|o%cL$0%3J-PfjK#!ov$#8=D6nb_rRDg4(uD7L7|uQMatTNAp7n43~YY`W>}kQvV^r zFcHJ4b|`_1x)p2P!IyxLKzoqa(PVQzYSFJz7vx$R6C~r$*HNdoQdwhB6PgYC>J`Kv zGu1)SPz)PrNUP1u@6i&}W@RLenU|Jh{=fvK^u$=U%b>9MdO^WH9fK#O*1nWn(BT5z z%Q{(|`mGs3td~U{e_?gJ$Lo0b!gah2`(S3=(F-ZKhbcJ175wqS3OxcywHPo#ty8JoKd8u7ZLvK>IoLu2p1y^Y5AYruig^yN{7nqA2S6cmW zpDf!C+2NZ|wK-gwxTI)Kb>Z@429VckrCupg~_+@NxsYcT=h|=bvRO?9A z+gT7&v$UC-F#6H!$%MnAK^X>UlQzVjgjJzj8!`ik(WD0Px$l2YO{rj_d;P#ah9Ls2Qe1TQnt^RH$b}i~RQhz_%td4hh9GhrN1h6mSD_otX zt-kV{Xo#X7Qu&z5X@p~=?-1GQPE|}*8 zUfs0}vvDg6`dz)t_AS}a8$--P6G$P8P2*oTNy-1IFEcOPmlLo~qpb(ExZ%{5 zSHN{itC)+c_oF3m-iTPi%;b213^H5tC|csaLp1A#{`RXIAePodt$X7}=0y}wu_j>8 zdb9R#_N?pKa`!*l`}Xj-jw;V9weQ)Ir%s(ZRjT_R??m}QH}zYP>nYq+ z-L9Yd^Vd*Dc2n1}Yq~^z_!;DyE*&B0khq<2RC=gG!R`D^_gOD9SQ^Cc=6>OiiSML= z$M>4Ld)S5RzS!-4=2-W|Uxcd)KLS#^5H^GRiS=?*YYq{Hh#HTJy8n%^spof}Ujgza z2nY@&jg2d=Tt`BNo|C5CA?kYQRidshks-k7%#$lwU7@Up4<9DiHAnjOa?ZLPP7#f} zpz=H#0zox(kCM@m#E|(Bx^Swx`bH#Ln_9xintDcG&*8&w=z-EP*@f$XTh|9`a8Bw2 zuR26c_c+>+tt(nj%&J9oU*D7ZVmE1|TJLRl|Q{hWN)3%f5%eT2030@9xw#rFPp zQrn)_VUmF&XeKt-gF)^glKkf}11BrWO?31CjXoIcJ6rnOXuj2(sfm}U<9*TTBd(UPW_%U+*Et>+Qeb)V}cTsDynfcvvUq>slU3;RN)aT%VIP>%yB4x85 zJ|Naml)!I#v0L3QgS1Vc2QlARlZKQ}<%}`ZyWb6#hV<`$}lftJ(BlNv8kn z;6&Y$QL=r^E7?~}v}wp-Fm;xA>agx$V+B30PVH-VpPO2^ZUZ}8KRtj(Isbf2k`uM8n{;~Rb@(~!2!2)*w1%K(wh5x2 zb8f`XT7uR-j!Ldh-S9nBj96NmO0zDkxsEG8z``_~?0Q-fJpzK@@g+26TbJs8YC4_W z)waz04V^0uovZ#ubh=Vkbv;C#_ZD*Z;VJ3Nj|LQ)CZC(S9c-j7fYF7;#h7yhfSD|E zd;K9&Oi{L9(#v4}cf>aGxv4vLUbBG(dv@vt?}vPQsK2Iuc;IoEgPj;94tGDVXWeQZ zHr@mq0IFaibphKLQ!o?=B0MWKeWd4c_}cs*G69ue9e^?lmFM@IZ>YQ{NX1rgUFwe2 z7}q${U)xN!=r0v5w60KeLRULq;?g8FhJ32z@4Abvsq=b!rU2?9mQp`62ai7Y93@ zL;Y{X8icc}jUr;7EoX0~*{&ku>$uBayIG#D%r4cZo%CdG*c(fi3b~zLCZ8Q1&Si4h z@lw$nEa5|t{oZ(H)TGI5FXYG4-cbJL@nU++9nFo8c!Swu$=flJ9?g|@A;#)8E7MEO zR<%(FR4Z5O2!c8kQ7x3~a}@_4EAophj0}3i`2tGz(tyF#7zcU1kxF|Ap;ykA%NHu; znPKA7T`nOc>}@Z%hAZXvQnTW;7d?EbuH0@noz@**wOy$>^(n7BGvjz3#g(^u?d00! zGNp`*xGNZ)ovycuLb=s4R9GZZ-3ixLc08LdpuUDCpo!6vH=g&>lLKC^lpQOgIuqkV z4vCiPO+3{X7a(Vpu?U`t;c^TAmQfvWS}P+;yx*%WEwrnP3(HQ;GePZEFza-qK5epA zTizV!TWsvBG@WX#JXa}J4^&30wd$!VI)v7w<|)^_a=o%&l9meT@#1i{;AOU_3+YTL zTgVklxlGZU7%#fnOl~-r9dedhmBDhWl0opfSzJU-9JJ#?#gsi%tySvO)`o%U`DUY5 zo>**^5y+PM`}L;QX@Oa)npBCUEMm;%A<2?g%&K&K<$!Lao#}=0q62kmFE;T7LeA;t zc4kLagEEl3WGzCIGbL{*S4~X`bM=|Zerk&;RITNtp`O_~Md+J( zUgKcJ%W!Rm8vE+DKAyXbel&f1W`3!DyW>?%9;0viFbf`A^G>b2f5%d}-bRI+>4nAl zvNKQOBdIJe?Hz73(e$PkiOn!r+I&s_m@{9g&dp2OOnxYvL3`zMnXFfU+GRx*ePN|X z3h7-2%W9kTOabU;5b$``f$ZDR0S~so!Riuqo(A_xcR2^~dc5L8!kMX*7qC9$RQ6AM zSk_poI36v@m_-QE-r0plqv_35_f}^rSfAMMmX{YAU&2p_`BqgfZ ztWM8QH)@Mzm^osu2um^D9$qNV!Ai_FD-~z4y1%l}a++*dVH@Y0FqCBHnUJx*P-$mx zwH53&r_i@8{R3Q9;pU-oyF5&VfG#cdNxw)iiydRYJ{UN3@zz2W#sWQkrULb;@Q~0V z6JM!KRhrZlnOGt>xol?3z_nYpm}JtW)1&V8w3mZ<@(S4<6S)FTcNQe2h} zHz-LO4bEfGLL04NMj?zDP(Y{I*f&Tkc%}&SEcC8|SIkco(7Q~V?_#^|%s?DiJ)FMX zqwl=vI7O9kmnX|=HMl{&x#|Lvq7jl6Xw1CpP!;Z*k|of|(-WmU3duH`o)`@p;Gj1i zmMlHyiHAK}ZZzuAA`w8r7q}_Ku8CqhJo0$x(X9OAjd}%owS=KoxkiI6QSXGktw8l= z90)ID$RKGhl9|OAGLrR1b7L6)Fz_vcr6v}QXJ(}3TZ@(H>TGq|!x}pJNXrrRppn+7 z2r35yQ$VTcnW$%@>9ng07%?0BTHZoqZlh7jkwMdM%)mad1tU8fk>)ZRFEB;M0iq%w zLDUro{8z<9I$wMLxHNo|p3wIqhCcY3}|4ZTn` zCHez}n=ZNzSmjn)n!>7jb+OF@0rfF&7G|Fcg;ztR@~~V*T@OHCVpKRU`X2SC26ONs z;Zu=_c(L8s_L(ZI++H0o-R1EmvKeE%-Y>n?_ZqT=LcTzKl3!DwBok1@P7QK40Pice zr{|TkM0+!u9~tQH2OTyE-Y{GlBg=GshI}koUGhFC0q-2}3eYIhIEblbMKlK`7%MN1 zlxwvzmCe0~l|s3vKHFY0iozNV#{}=nWMZ=Wt50PXC&q6Yhx<+SWnUTf^~ga}xpxj% z#WA;(-MncdMj4g|sRrx^?Im!a!F#I>;bf37GfT}f4`g7R>uNn5W5vsR%hiSQ6udw9 z0QgsK&apFwzQ>LoH+_0&2>P0aQ5YUgkBH0B%1iGDWol=z@9l(@D`bZO@(AONWa0gx z!;#o9gw)E5i^Q(DD6F_1lpnrzYks<1haW>D3z-{I#SA?a#n@A%q*&u* zHDdd}j(XlkZ!_l<`#p^IfLG}*PnfMFUb;0=8s5rD#N1@4P*PL+Lif}xO^n3$aY@Ed z4^NDaVit&PElnCCSgJfy=8I6vP~U>RDU7E_J=4S3%CKV)v=%Ybhr!aorY!>w%EvI# zkEON@kPC8g3^VlM7gYp?;*20{Y27Yo=&A?++U1*J2t z7KO#+28?>=&oM<~g=vFL>|ES4g0;+~$I1IZcz}F7%*;y&_&8pxyjQK4sjkd3-Fz`u%H_ws z$!q~}g!Cv+*E%{81)7q}r@?CDW*URNc^G+kco36OlS(rKUj_55O0(KR2n&-p4)AQ* zj8wt7whRk(valpZF^*Dy5V9vCL1&_g|kBf z(g^~MTS4(;q2fbX&p5)v=^O=8YBc)NTuvk@v$E{CiL#32y4G8JcJe4;lqa82*P=00qz?M3AA>i&U&{@yDJm6_h{<+i-oFwp;dy&G!n zrF!N1xk?@SFpbA@b9(-I?1|m5WpnR_x!w)=O}!gt>x~Vt=x{eSG{7{X75jj6(J-c- ze(x}`quK%@8s#~jKh(^nHIEe!3W?rriitYCzJieaA&5Dc>lSp3 zhG3DbTgZ=~=wfaX9j}xwWf7E1Pofn_(sAuHlFp4IhUO& z+Jm{L!HJy)s)mY)MtmU^H_Eafzp;Po)#4ntM24LeqOeHkl$A!6Mok8L$tzAFOefCubqG*c4MlL zTxpC4CTM}qj%gi&W#m;l`>^fZtL!D+2{vkeqU7bVn2{aJ7ZC5pAipnHhdYiqbsLP< zmul#5G^mn+qKO7aIEmRJ1+7UbjSE&l*aBW2(>5cP4WI^aG2X9CXc6v!d0U!l@Qn5p zO*@J(B^1LKp}%ax1%<*=91l7*2ks6#lj{g~axUw@n86S0E)x`3;BZi`m8;dzJ`mJm zxwQy$Z>F#4tuWBk&5NRUI+s3Jmw2C+~#esi^7D^e6)?JkyvtD(PUY*&ri_=?h|`jV75{*i_0oVxkF# z+mIqaDKj?}oochu_7DYXA~K1%9%3?xi<7dmF~%$g-eM}?oZQFr<=YqF*^7j*gxtidpqm`FGNv!{ zY=PE_J@hYfOURRfNwI2BXh>IZmpND~4n8DHJ=%;A0T;~A2zp?f!*V;vTnusLnMNH; zv}jRknxGn?)4($6LS!*Jn#E%35CuT|#WlE3851q$=_?$8;QTd64KXpZCa%6E#hBre z(Y%?{#f_CZ5y4b@5?w?W>_cr^M0bY!XzZ0)m1IHXZzg3W7mn*cgz#&S8eZH&!*vhbT~;NDr2?y=fz&A+##Y(ln7H#xZ$uR}jgZaNT@?T?`7p5I1&b4yTN% zWu^p!3qO$;A7#PMSXSf?&YvL#C>!`)J(Bp|B#NQcs0K>9BgDWe+ z9qJ|?PZs>GQeF%Ddt~BuT4Mu3S6c_E4hR}dH%SmiZ359D-nJsO4C+D0CX--$sq>cI ziJ+pJ-Zh#}58;oDo7jxPU4dH!b!wVDC%g>=B7x5-?vz+^X?__l!f_NDnXsyWm4CC= z8stE-bcD!gDNwgR(TYSBLZ{W3rdchN$v4I!S`=p|-7FH3n*_Pg6xXa=HXU~F_$NAF zj`fB%ZyE?n&gyPQ*=*=YKWJ$~XEOe5MdPLLrt)Sw5+rHnrZg8M3dYaoWv6Uy5ewZI zU+fA4Tv`gjBLs;c6T-C^B`D5a;U3CTjO*6J$WmTvH!x_C8^@xIOv=%y<*8O(=vO$Du+hN+#NVLL@-bafpbe}F`$()OV(`o{HuuvLUc6s(= zmIZ?yLZYM{E?1x=>4|33W5)~t5}~n>EraPYi5emvBs^RjO@nHQIk7u3jbrDJLEvJM zy&b!B(dprtuG~RIB7L&@>32pOv+6V)5j!X@Cx*BdCN`MO&^!_TTR;T?WP$o@6rO2bj=7_1^@g_%5-&=FiCi&iogjZCC$*n?1M)+#eryA8t3V+~gr8^{dm$Zws& zV&}#~TKC2XWfo2on^or-GDoCc-P}1j{D2U7unnzwhqOu!YUnD(?#WXJhD|CDvSvId zuLdLUG`=zhE1>~qm<{wci~})KeiH|#u0*b}Xb}{3oYw6ECd1eY-wlIqVO+=hAK9xw zI=`)(8b?oTtnH&_|0YkDNHvKNcClhmc8p~k$HJTJapB=I99N@Qn+?1fZH*hubhBv3 zmNB!)W6tTo_oUYu=)H39awZh~mPHj6d?^l3qidyu6Yr1e(}-ZZoT7Oh{(V>|Jz^=k z3U=GPlWPQ2vR%$(n2W$zIvSw`#P=l=eeaX5F2_~yrO#3nooN`k*2?RRHkqrS=1e*Ga8o!V zouKp;DeY@=U*oi$rt^X|zr%I$QN@18@>B{FNq(jy5$Sq`&FsELz&HCS1&>+OZUyhP zC|5xhQkSz^t2XS{TETy3QIj7M@Z%QcDoEevq6@SXyvm{`6}-oyb}M+)q9zs8<^?T7 zwDb4*Qj-r@E{e*SpR?GR$A7v>a%+vdoLe-vG7eOf;aj5I-QrUXL+_AM-t9|WLBHTV zzmOXE1@E~|#G&Hpa`t>kP=4j~lu}zNjzAYuKJ|#~QZ~^#E4fG_L-Hm`aL^{4R323_ zu$RiCN+!{Sep<-i8$JFM>5UfODLgUR$z`RX7xWBvT4m4fFh}QLR z0H^Rhw*Ibyep^H|5r>(@T&EJqhXMjo_+eil3i>jdJe7>z5U9KgL@Q4<)!N?>sHws# z5eP{I@*2PL3i_3w4A&G#!F61xs`l>!)mB&=9SmrjAMhJaLBGkpQ`PWgKI;nJYf)YY zpLih8N-t$wdlAV^;Ss-O6nvXSMLHYhRCcx3p|>fhqNHS6xZbsI-7j7GF>A_-qaqWP zQGlWfB+#X`#eq`VdRJwQmQje7QBbb^G74%o{4xqkJ9_`H)L@mB*A4}LPf)9!*3Xn=nWI zn`Fl5jdJl-+sv*u0Ug0g7kY()DwUMeI@YDke8Eqrpf(k!Q`Ro9y}(sa+mF+k()?eN zpsN2)+jh5nP>R#y;aB;23`9AHB*)XsnX>t`m&K4L^;NPh%h=@mgfV3>#&IFW_DGJW zmosJamHiS;ZT(+jOv(DzVYgZWWiZACBF6R$;is1~W%J!>8Hg zL_L<$E3G<3D0Mk+k(Z~myr+?<$5PTUIEL{RjuxYaHMZ$bBT>py`lzklq~E@skc(r} z>DnoGczg=BEUKvBt1N0lLHY(eUGaV)PNtCedXKT>l>MM2d!1i`g7i&ky5dVP?=<_{ zZ1$3Z_gmD2f3b_ux8 zq9zs8O0IAg*DCB+crseKNoD&U%cHBH&tt4Ie^oeJZ`s(blG0knm@KZ8`H|Mv{QZ`W ztKepf+O1&LqFe=+Eo!&c`Slj%D(H)0w~FCHzs?G34Zyip!WTotK$?2INecU{Ep+#P z6Utw=CG7sOfKN&8Vo7+DpI2E?vfxfBE7=55---_l(DnOrhqX~~NZK!{moG?`ciF5F zkI>M@7Z4@Mdu>uz!H-!~@rwekQI&RzmkX%8#B>MsI$^OSzmlZxs_>_5F|L9ST2xU% z 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 Any: ... diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_binary.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_binary.py new file mode 100644 index 000000000..d3236c17a --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_binary.py @@ -0,0 +1,113 @@ +# +# The Python Imaging Library. +# $Id$ +# +# Binary input/output support routines. +# +# Copyright (c) 1997-2003 by Secret Labs AB +# Copyright (c) 1995-2003 by Fredrik Lundh +# Copyright (c) 2012 by Brian Crowell +# +# See the README file for information on usage and redistribution. +# + + +"""Binary input/output support routines.""" + +from __future__ import annotations + +from struct import pack, unpack_from + + +def i8(c: bytes) -> int: + return c[0] + + +def o8(i: int) -> bytes: + return bytes((i & 255,)) + + +# Input, le = little endian, be = big endian +def i16le(c: bytes, o: int = 0) -> int: + """ + Converts a 2-bytes (16 bits) string to an unsigned integer. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return unpack_from(" int: + """ + Converts a 2-bytes (16 bits) string to a signed integer. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return unpack_from(" int: + """ + Converts a 2-bytes (16 bits) string to a signed integer, big endian. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return unpack_from(">h", c, o)[0] + + +def i32le(c: bytes, o: int = 0) -> int: + """ + Converts a 4-bytes (32 bits) string to an unsigned integer. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return unpack_from(" int: + """ + Converts a 4-bytes (32 bits) string to a signed integer. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return unpack_from(" int: + """ + Converts a 4-bytes (32 bits) string to a signed integer, big endian. + + :param c: string containing bytes to convert + :param o: offset of bytes to convert in string + """ + return unpack_from(">i", c, o)[0] + + +def i16be(c: bytes, o: int = 0) -> int: + return unpack_from(">H", c, o)[0] + + +def i32be(c: bytes, o: int = 0) -> int: + return unpack_from(">I", c, o)[0] + + +# Output, le = little endian, be = big endian +def o16le(i: int) -> bytes: + return pack(" bytes: + return pack(" bytes: + return pack(">H", i) + + +def o32be(i: int) -> bytes: + return pack(">I", i) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_deprecate.py b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_deprecate.py new file mode 100644 index 000000000..711c62ab2 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_deprecate.py @@ -0,0 +1,72 @@ +from __future__ import annotations + +import warnings + +from . import __version__ + + +def deprecate( + deprecated: str, + when: int | None, + replacement: str | None = None, + *, + action: str | None = None, + plural: bool = False, + stacklevel: int = 3, +) -> None: + """ + Deprecations helper. + + :param deprecated: Name of thing to be deprecated. + :param when: Pillow major version to be removed in. + :param replacement: Name of replacement. + :param action: Instead of "replacement", give a custom call to action + e.g. "Upgrade to new thing". + :param plural: if the deprecated thing is plural, needing "are" instead of "is". + + Usually of the form: + + "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd). + Use [replacement] instead." + + You can leave out the replacement sentence: + + "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd)" + + Or with another call to action: + + "[deprecated] is deprecated and will be removed in Pillow [when] (yyyy-mm-dd). + [action]." + """ + + is_ = "are" if plural else "is" + + if when is None: + removed = "a future version" + elif when <= int(__version__.split(".")[0]): + msg = f"{deprecated} {is_} deprecated and should be removed." + raise RuntimeError(msg) + elif when == 13: + removed = "Pillow 13 (2026-10-15)" + elif when == 14: + removed = "Pillow 14 (2027-10-15)" + else: + msg = f"Unknown removal version: {when}. Update {__name__}?" + raise ValueError(msg) + + if replacement and action: + msg = "Use only one of 'replacement' and 'action'" + raise ValueError(msg) + + if replacement: + action = f". Use {replacement} instead." + elif action: + action = f". {action.rstrip('.')}." + else: + action = "" + + warnings.warn( + f"{deprecated} {is_} deprecated and will be removed in {removed}{action}", + DeprecationWarning, + stacklevel=stacklevel, + ) diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imaging.cpython-312-x86_64-linux-gnu.so b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imaging.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..49f1901dbdd8b6b324ece00c8205f0f5b9678c30 GIT binary patch literal 3365761 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­mWnG zq+wqn5riHwZD?o%h)&g3eY0XR{xFObEiLl4LnZL=svNMx75UowHEmN1N11ZmXkCyqMU~-BWrnG=;S?@9KS|Ia~n-a-nqvJJkA{ z)HZXC+4>RbW>sM_Q$MF^Q!>IRUZYWLr3J=+Eq|f+d6&=-I~c${Va$_9FqRs|#MFYs zTt*Mu@`moBs`k78GqsJ{(gW`K2G)o^)5$ocM9S*Q2hF`03{+i6@?BpkkD zO81YC^ba;qot#`ugrR+|x4-+MBG{d`-}RjZSj#Fw zO}mVT$i~JBaY6kziFm|&x<}?oJ+Z$f#$+#5b}R`Kj1aD{V%|@c!4%);n&P_OA2l#Y zNr{iBq~@QSUN;RoO$}Tp;1i1G|1^0f-lgMf!PyD5hzE@dXw4y7#rU}Q%?e1Bnu~c< zr1|@%C2;{-y5KI@EVs=f8iuUr;aU)3XxnK+sJpTwLPmABd$gY@%Xs^+;9lQmD&cJfQDB)YcKy?b>8Klsp_uZ6>0uIw)==LFH%SxI#b?!$M`4<8X8IH*t!R4)%T1S~Oiib{nQ%jw{UKgC97~R)YVo?N9ehs{6-0C!S z@>flZ;N3bw(;xG`Z@`c=H#tqRypKbaCPXo}Z`j}lm#wwy_mN9AnZcz7r|Cgt97kltoeS^ z9)g^PI(qVEgc=4MXZ4%Bc|t7cB*UGlH?{s^poqa_*dJ>@-wm~P?8zGoU4U6bl<#^? z!qgt;fjYYEZL91Llq|VgY%w*2;8uLWM&KJZGLPY+X`(5_#@I5D7ami!r~ZY&gf@Pf z@+5aH__MAqXiYJI*7!P(8fsB{yYCZ3iYJccbk`8Ks!H1J7{LX)KVJvH|whU3}Uqu;raY9 zlPnC4C%vFCH64|>Z= zW6j^y)Y9n4#_y&m5+tj8z*HixPi<@Lde2s##M9hO#|K`M1Shv*7n`^6{zpI#huRG$z+oEz$qG=85LkTu0 zPdm6q(Le}QPa!Q$w~u9!jEre$g`|pcOCi_eJn-gGZHhKwapA1JEmWO1d6a~+XUY9Z z&g!@0KRkWy`Aa@X=?RjBTM#Zl)IZ^mL2ZMM|CY!4X@$zKE N$vZ2)sP$J-JLxbC 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

jIPsgcX6dste;V|D=AD3Di~bt>#gm<0&(Hg9 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%0D*5K4i9!Gu^erBy;LQZ!<$6{|*w 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�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μ`EK^H2#y2Z!&~d!O`We~;FVc1Jk7doYEcQ7 z>?@km2LhKc4ngostiYg4_69JT*diI-D?t2(Dv?C)38$+}NvJqd%*a`xY^}^k>-O!C zhAl8nQT8)Ij4Hy{>!b0c@$HyEZS_-wzyX_#AerhomFNQWiMvJY zcX=;hLG)P1IUZ<8{BwHFvJ-G-30?t0w{m9g&;*<-2;XQz$_g$&EJ-FkV@M_nB0EYl z$wduGCP5TAeaU2}pStv7dJ`b zmY=OIqwEhC;GS$=KAaRrIteAh)}B30JKLB-|0-32o1`k)Il2<4@B7|aY<8c1NAe&N z>AR9-4S;k%zb_eKi&ds?$Zbwd->@fBH;7v7WwRv4LV(Js5E$}ja_h$G*GwmHl!MIL z^tI6mnDQu{7JS2cQF5{$E7J^2w|x^!C|JDa=gmYhE4VjB@v+sPk+$@05Ss+D8vDc@ zvSK5u1PYU=IC(bcP1yD;x{I60g*Dpuv*QQb#@O*6rh!(Yxo;g~zmLV&7k%9CXUf0) z#J0E;9nh~6S32l`!lV!h>nCPXL>gV{zTgp2+-L5qm=X6psnXSmP&uv`48o(dGQD8jF0h`5d=d<{}AImKMMVQ5>$C|}ArS15nXE`X^L(l>-I@uTz5dY^n-+5 zB+_o5D7>sj+~k9{zm3~l!rbKBTd01sG*)+DCgPgA(VgqrxWe1{c1yuGxCO(05<;}Q zq5CjoVlMIrJCp|Wf5`i`L+P=0Q4FU2vYSz}1%G+!eg)H3B!H{Cd;R66rMPgwa~M(A zO&C6U^_5!a9z)`Ii-ji>B35`*(I zbPiB=YZ@*;8tQYc#?E1k7pHD9Rum#VZF&KL>;J%`Evrknn%>Q%zAfQ#4>R*-gm7Zd zhe<#SD+t@$CrTUW?b&yKz3E7YLkP8kyGxs;8`YhOi0qASFZ;)zO=@eH&w62E&EkR` zoVjl#g``OGwn;TLu4a(LLgD+9>-md>&I|wT*}bjn_Sc*d0U499#I0>;0xX#z`^1C>dHDbrT8 z_FxRF;r1j)n3`;|iwZ0k%WR5e#P~uC4sCE^PHDL+{1rq~UN0Ed%xec6LP@+jsJ>qC z1i1QI0w>J1)?=f?8D-Q$sXf)kpqLE>SfVX3cUNRTI=?(23S_b4gn6kIGSfCwEJ_oZ zTuFJU;R#OCA1IX0e6&61sPf!v!yzd_hegb0^1izV(Dx$qDUxTXvb{%Ep>M$qDQYG|7>eU&E`CxxW%*P{G$z+7;KSdyR zHUC3m^~uESU3U(4?cUk7W81bRgS&R!zGwU3l4a+2?cTL(&?Imqa((N%=i&=*y72rZ zySLxE^X9=Nx8HWh&^=w`ivs!>(t3sbzUSUOHC<}yCZzH0yYIO9_O5Mr-aEK+*BwjF z>s+>+|FW98Lb6g%zeHAPMR&AsxbxnyUtp7P>-K@LKgjkDY@xG9HU^d32)@OHY#Tw! zo%i0kYxf|Pcs;8ub!r#F``foOs9Sg4^49I!Vvbw4@7cDyJYme|R8`$FG%&Dzcc|#f zUAJ!Mi5ZL=qVTe3a5tMHp3kVM>Aq#?w%fJiS!Mef^dPm#Z`Z}m4VpbzZ7_hC_p`qK zLO;*lBddpZY8xJ2>fc}otl4(_hIHq3>DK-B-HzL?^u-m1ckJyfLCkoIzlid+QeM3$ z+YE*SJEC#>`d8xV9hNp+@)ay?HfM);wQe^@DHzmoyrb>mgY~huQ`K7wcTm^E$Hn?M z5;L+17O!hA+r8_~pAuBA@vE8TXEGEB2n!)yEu#1p(CcAS6HWRZ zPr%wq4_%D0o~uP=wa8Dph_53pZDv*>>$CdHb+(-0@spplf)dWL#h9U=UcZVT^e1*^ zBjRgUEdG8U#a6%w6r;7Ue#Kg-_4x#$EUL^QU$~uQcOwp1;4JD5Bmc98<*e^^6*`jy zj9kXrb2W>l!#D}0t-1WRTf)@UbZk?h%RuIn6*8jv;~~#w`j!g%Y08%_Bax?1kx#!w zPQz<1-+lAlKMbzJx&keQXbx=~ylLIWO;?ZrsVzO7fVx9rE2ul~Rn(o7O6pERPTk9& zixt$JFXK}8TW{MH`uz5r2X}6}`S#nzSBwiqx(|=3ruz#-_a{e6`cZ6(Af=KPvq~iW1dPx z&P)8Ho#7T9HeaMkOlc`Z?cxDjZ}taH!a1>)oRp3drp=@Q18-jIX+ZsHNiQZma6QN8 z#M}sZF%e(wr(9xLS|-b7l4}6muFlQ@nK|G`rJieK)@^JnE4!_3*5a=yg|9*)YZx-^ zmTF5<7wIzhxVd6nEeKqWOA=(Q(y3`_k`Nw}8TJiWcU>}k5g1R2A+ zSy%hki>LxqsVNLNZCkl%5*GyMn1zsziHBr?0i_z`nKNu%_-oI0 z0Bz4rbUWBp2KToqTz%0iz_>|LMch_w?(`SBi37*|tm3x@Xe@ba6Bd!G%g^{Tj>VI| z;jZ)9wN~j$1wJ9e^&pMcV4DYrX$^FX6@0#!{OQPf-@JYZXfSdN3ii9W+9co!4x5`;p z4EPy32e(lks(xm~vE;1uag7M8!dF#%u^Zlp`kOT&j9I+VETR$}9Mq2t1WOg?biTYr zF1NDF!^r4HU#B^Gzn}6S!qXKXS%?G8Ve2%Gd=h&-p)&+nFIxUiPAH<@J? zTHL~Fe_86L5l4rmYVkH*3W>Rn+%92L03)mY~t3!jjkt}6OC$l3i{wIN~H6B z)77$bDxRgtM(j>peXtuZxIG8;7Vh!mja%r;zAHoBd^+6Ab#x2y?|% z2Qtm=VJE~&v`1k(ZXl$diJlte_p{y>1_>*|0-3KLF<;P*)S3KZMKa3$ET5?02Q&tLgR3+%h9F;Xe_=N3Wi+*) z-rZGV1rJ9gy*}dJ<3@~{-Onc4vbuk|p8y(Ed*PPjRQ5sHxyvli4Gqc+1g}haM!cu8 zoueeVr#XSa$K&`&Hn7`c^nmQ#O#@TSHY!~4Cz;{ zS$!L~Jhde`zez;64f_ovzt0-+eHjDjWM6Z#)MzhPk{U@Rtek#z$RBe<(Ud}mI_+<7 z^4sGQ;r~A)!s&6kryw6?loac!E3h=sVl1(n_>2X~ASEIp##E0fI}oN!(|gbHphq^( zeE0492P1X_Y-!;pP(zRw_Z{#9LWKZt%vGkVfU=d-$}&K97rTlrgT?Cv!Odf`O7+oL zCH)fPFjg6#t?%|cHmgL22T|E71mc-@Q9PdwXMK8sCcW3)+Yex6L*E3E&cO68KkMQM zqaB(on3eis&w*91_A}O(AO-FnFBAtDrq*$P)iRzPmHv~=#uLNxu&9AXSna2@rWtR( zrhjeJnr8XFc59kbim<3P=R-&0lE&se{a|G?cEX>p=_C1?&W;hw1~$%`E+5rsO7){# z)2l97g#|vUyfS>;w0mputYrC5#iF)_T)x0xyG1R6DT(>yi+baU7q#LP&+3jcVI~FV z@}Zw`R7c~i`ya#lj^cOOS|7E(e;!W&=!5;!3R{6ccOLUaH;D~T^LyNoG;NZG;I{n( zCFMk|8$4dzxawFp($majrS=Gzaj-C8>U%QYhjQ7~M-K1yNatp58!%sXXE^O?@zmn4 zqF?Q6Vywb&lz2B6=837tO7F%Nq>QX!qV5`S2viR2&x-EuempbLs?b{`I7!H!ofE(6 z^Zzzu5G?d3KE&IW(v~ZItF7gu`ir@?y*zAx15J-xu4j#ruFwaZef1-Y_AP!6%`EMf z;LLqQO9%Wa`2UC}>gP0x4Z8LZAy2|zf&pBaDL>+_#0HBLXCs$iAzB%0p})KZ?Ukr+ zkt8_3s@Jc;*9pB20laB+X}@1JT-FxW!cR&J!C2`&JibH24WVIVE7v_j)Gq|mKV ztV69yU1Dwit%c-jI5ZuefK#!4*j(}BkHoJR6Bd^D0`a){;X3bN*h8$-U|Q>&4)_%` zfU}t@PL3#Za%*(0H9o=OAhELk)GR^NwyI?ZS@?J2a$Aan%$Yho3s**XzCPMvG0}Ft z`|Fzi^dQ!y=mY$2UjP)o!(`He`=xyntUnom!9)>r=C~^1CbLk9KPPp+U1NlPkZ0lF zfou#imjsRLipTVTjBR5B;hEE?5zbAfGh_7R+RR({MG+tlTCK-A*D&xl^lMBXw~a&4t(e3=u@en1lCx~)rephtW9Fm4vPP(p0`fS!0J|8xQxJ9y$ zW(;;*k47u(59`9M9a(h<@6hBDxssxgs9Q0Lfz;w5Dke0SeRgO79YGn#unpc9?#JGP zOk++cbBX0KJCUnaT>|Z{7Na(7`b5%A)a*2QccDrr^*>5GBjOxA*0*^}u9uPzY1B&< znd|Mz$8CFK`YU!(3m~_Bn@R__FR&ohVc7Qp-9URT+>dTVN`-=Z38c$tDksM6J@Qpx^B@+B=yYKq ztqQp)9cbhS95B56PN*O{J)A+l1@ut3jj#SXVc(XzzoQGQ;j~!3{*zyN5!SS;A#h7a zxZZL#ar&Yn{1xi{9>4T@2>oMVcQ8i83A*bs-*LU~`aj$s z`vLOf3cAN{dfZ<@-Y3V++k$VlBsAL!*|#^NkMYc?J=#PsQnAzK}R2c%W5b9W2}O`rSE4`_KLjJVPL zWr3rh`t%#dOdT``M;Gx`#SspIhE6Rp!F@n1#{`}^DjYRL2cfH#N}J)4pw4M3|8nNw zuv&3n!PZior@93xAOB-$!D=@KkXSE|MQO@?*~$)g%CYl>6Lok0*p-EDq1>tNu(X`+ zd1}{!_UTnsaLxc2;T>S8$OOj5P;F%}TzaxjojMFfT-?{_l4i~z;(jr-XDZJx<(;jb zfQvjK&#s<(@P@8V*kEnQ_pm0$#SO&ADJT4His#hre*j`%fXt#0HlYts%5HSRxTRYT zk(bdQje!h9+=Emmn%c0|P(xHFCSv|shNq^bA3BzOJf#xW1NS7cNyhHP347S!j)6;; zrtTaz%y!bwb58vE;_ijyOB%j3vVqxpBJDCoTglnLdn(uf`)c=h_aE=rd#hi%!8hNt zVbg|9?C+S44*-twXzsD7<}N3?B|2$GpNg_+dVdJrzfZb3C)El<+sj6tZBHY+YgFg( z0I*R>tfo?uY5%d~I%tTYo*3nCj1vI(9P}JC+i0%f8sDWk+cL?nLGeZ)!GWyllv05R zIb*F@$D%bHT`}4j;%anRPT@L8AcR({;;o2I`o7F{w0Af8rQLt7)h)bjn4&-d@37ekbPVCs~aj*=W zaZENWzIN&prhe`A&3paQOR5fRiifh!mCabzxufcwO^E_DRdK|Kav4X=rv*a$c0wlU zx^5=o-a|p)$R>?}k0$=2cRBG71WkXX5g%flzdZ{2d<~50w<11gj42~)#+1h61hwvG z4#m+_vCJyA{#S@(ji_u1BNO=UU)?XKsYE0(u^1&E$*_2AVM(*}wNbqfi%QbcHto(! zi>moyp^q8T1l-}yfMMT^qgV-JhK19W_|rXb1fVOl7QpQ|KGu?GOos=7=5ymh69UVE zsRpMJ$y4L=?5Ey35*Yz}tlQx|IZ46wu-ea9g(eki26|a{C}b5Uc`p0x>wo)1%px*_ z-@V_M!OxX}?nLM?L9 z87*VgON{)@YPl%@jL0%W^ajmWxedWZe#*Op4Z+X&DW5A@6Wp3v6P!ycEB&0FU{lZ+ zYzk0Ab_SaQ!O{I}5P=1eoMVguh{tpE+=gfJTLHtg3Q-CaezTp@U9MP!L}LlUe|E}B z=o6yDjcOv$jK>YP2O^z#=>a1V+Eaauz6Ij((gQ|34vKh~Z1M>{1j`r4 zh9w9qSW0JvoE^ncu)4&k@0Ec zi2prwtV~uI%wz@Ynk1=;uDz|QYvqJ~KjRzW_ST{mlM&W)J88!osW-mO;+UwYa<04JEpJp=Qd9E^KA1v69{gvVm6J)f1 z!S4zxuc)E5+$`W*%{O>(HqODGG?(sD=F~RysbbG~9G#^p=3GU8rHf}DwmB`nGc>x{ z8vP2%+*EL)MnkOA&?td1@JLpxdAk=`4XQp#HMT)$hUu3#qD;64&nxG_w%4$QUdKa-J&Vo4_c!WbX$YH6Z?b8CVVEosp1f8 zc0#nXiWwfVs;vkUZe@_p9}Z87sPVAYv7L?_P3E_dU;(#O-$CBh3$qE!5-Kt%FJJIDLk~j5n(L`;!jFs__BI1Y8kZ0}pO$Swf@oG~v z;VbU_H{;`zVxtP6(|pxO{XC-CYBght(&l};EoYD5$iBen$T4Ed72JbmRUaVoZbj8n zt#jnTtf%+JCU*GAB(cvGLq+D&T%lhkG#U>+J!TlB6G8aTuk1U_P^S6jgX&Y0+@EK@ z!!IHllGwNBFcL9u5qX=tZ}9UzI&OE(3gcz#?hiyGA|$vUx(Njdpg3nNP>7N?TR0&O z^qSWI5Y~Z4UI~!>0*JNn4Qt_F%31){L^CaG00>d*SsZ?)?;Z;vkc0HE7kHk$Fyt(!P- zwUg$-Fuv@Bdc5;%JC8^%=5|X#qmMrve$TZjz{4k=R?Onym}6Dt0LmONAA0)fIFD{? zKR4nC7s}6~!znj9-x_mYPTq3zlkU(~vOe^LBXr4?SYoMPMdK^_lXosZS+D4uHdux9 zd--{c&Y0|s`y8Fa)WgfiIMZgy)g|+cD;7-(C>?EE;xQ-*9x4^bxYxu3?suidku9ZT z+^^=RxH@S~#y#LxJkXCj?Vra!#l6xX+L+2>QL8Mh8bt!_;QhjG-!bSfBpwOT)Ho}b zrszP)UUB8hof~>qZryNT<5Kl}+nDFAW7^t{bpp1$FMaZ zOzDW-ra^qxO@l1h**dae>7*U=J7vjbP7c~7OcjzFO9$=RWfYRj4KIUup;JM_NDkxl z(I#e2<-}y?>rYlr%-@{i!~o3`S{`H*Bg=#G<8?D74RFa#4^D8ru60&1Si`%dvzfUr zKVFY!j0y>>P)@;!v71PP?(;w&jwf2@YB5YQG#Smu05tmqasCjQR$!MEgP@ueEo>qe zS?Ogze+n#llc3;kN{b>^5V*3p$7m96tM9?E0dY$&A5aC!a;xkM_S`w{bF`*7{(u?6 z6iq?T3ApMhxC7x_#}L96ezMrGC1A*T70&^Wl1mz`!Ao@QrTgP|pc4^A%1^Tme$hMu zbZqz2*ZB_k4Ys})162guXzSaxWzSHutP$av)m!ah@k;45yWGzAMNX)nD)Y6N!PbiN z?B{T>xX6rr=LO?l-5q^WBj4XTrGxAXPI!=AZZTVRkZrn#=RuuHiEGuz%Ox(Z5(kWp zxq!NfuO$IhUxT&9W5}c9TU+#J_7!7TTjbw__7jBm)6%4)snXJ-H@CFdG1}5%8rM;1 z4Cj6FL}nHrDmSw*PIT-G8Pi-!=QyPy<;SpQ4*3L5{^wJB%EjIE6|pLgO~*j%6Zm`y8lGHdFw&(%T@~r z1bRQS??{-wTpVSBB$zTsQS!`Y&}P{r`sPi3Cb_Uz9Psnl*~Z<5G8)fx?_)B@vtppp zt!7|C^O?9=CBL0e+*D&`U&3a-WZ!ry0;dGjV3{(iTrP2rAu(p+YDwZ0MhDA{a*;EL ztahyQrJ5k%RN83>>|s+&un{aa4w}J+*~veLvbD*MM^L(L$K;~fovE7Gu!hw7G+BgM zO#ZSUf2m6rG-hHhhhxDQhYq?s7^|Cxo_m&ifeScJVia=1bsmjEM$9PW1Aghk;e&p) zy{%4`G@DJxizl)PVKa3OmIb+0$Vka5;Z${vy*CP#-ou&l$6X(6 zEu{$|#<4Y2n?90jq0(i6YA=uD_O!LF+gbEqqIU|wEyKOPHv1>B`U=lGs$Ybd*3r?m9D;PwLh$2L!*s0FK z0;mZk`PK4&X}Z%-xyl~y^3&fIr8$(A)35YR9fmnhS6|0{N4=}ZCKIA~X|hBbkpEUA zC4zyJfaXO_Q<@&mK@zZoz=v7ipNPotip`N#%5Ja$y=$}ub#LRwh=ZXyvsEm*UwQ!M zzr&xU?PR96iMoXHq)fT8gX**e#g0pASmGvyX58;a>lD$1=giXcc{!Awxrv(?8u`CI z{Q~+-?L#jV@J2$ccsp30e9+j$RPe(T0*^jG%R!UU^m1j-o`4mgwK3gE(Ar#ErnR}U zLThtNAp68)N0jFP$2}+17Em)a-e>pOGBkX3(knX6rk72=Yd&s!r@4c=uSxp>9Y-5V z#n=%x@xi|~C|;}k4^=jmjKFxQR0{dq)xP$IGLb~g>eeb|MXy`%(wYhvrPnf{FkeDK za|?O`@-K}EwA!}NjOGY%lsC%Z1L*xS`U0B)s^pSr?Xjdart@dH0{|ZP$a?o}T7U?= zKc5IwzFm`x-T6o^jY;L`Asvp){NzckAO`%(qtAV{P+;q9=u*5?qtJZ`GN125f^1sp zFCX#*%52*1FX-`0>|uS(zQNBz8@VK|mxuD@a&HLcK?oZQsM(tjtW}6^qjYUHPu)i2 z3~uqN0gd;uY`p(iG2U8ND}flP@iLDevSbYe2^Bz1XkcwO-7Y~5=YeFwT@fVH{Uh#A zm@a9S@J{(+_CT0(#{WyG?@U6mDmek2cdKg6bbp$0Bto}Kdl(#11tA5J&*t0R)NjjM zHqOGu{?x5H1})@)tH0`Ybo>5|gl1&ozU(i=NEV{p!b6jyO|*5%W4?gTacw&)a;su=kozNI642>h8G;@2?TFPPniR4|qqiqwwW^Ha}N4|>eBX+m7G z00}a2?Ng(BtCgP?VxrX|a%S&iEW2{kNR*V zET-iAX1+Zit~;WY^KK81I$}2ea-jcQNZJz;IKtTB&qQIST6V(?hWsLYgNctfs?T<51gXug>=ef^t%=vYMusmL_Dfa8yL67SXkFMafSv1n3rFxN z_sMe)bVz-~x2^XLkNB2-R$4H0KyD-Y)s4RJutrWBJ|QKD{JGUYy<)k2?~w!Opc)hWsT0M__1zO{f` zE&a10A-@=qrr(g}T+c7?dPDvj@TC7$;t5D$o!k>}16{nj%r%Jweb>`dIjk9Ya{xBIE@4KHr@U>Ft7U$^4(0QpQ+|CBmd*;Y)G{E^n)S$3FYJf={>bWVF| z3zF0C-@v5_?*#W+c!H)E`Q77-FCmG;!Ep`nDd&duNQ?wIfi{bXo!63R}2X9uS*gO-lX(ye|cCB`mDzUw{-oG z!CoZ=Z4$2yWna`8BzvenvxSbC3V%kYCF&}S_huu7R;$Wh8Kl6V3)F`FuqCMe*>Xb^ z!I|K=kw>9fW)pk7u+X`d5AHsY?z_LgDF8Aeul;n)1iZE)eM zv>{g6!=W;8?-6Tn0$4t}l)D=*6goP_Cp9;V;~F^aHiE~{DiY*-bb{fD??88WCC;p8 zk8_+x**=+Q6W|yGYjr-TAL7Y++yJu)Y6TEl2tE3hgpdWt`Yf}=Dfh3ULVv3 zg=>aqbI+c3VQ|;m!-m23d)hGII%fJY+mmsVu6Ei;F8tMX?DJFi+&fJkn4dNs)zwfs z;#KWBJUf$q)u(vVx1xM(+aiQ%^KvBxP%sGARFHvwWF<^OtZV~jZM_=EdZo2k>XohZ z$`Xj^R)Xzd7>DfCN+p=O>TzTxPTodv`qWB1)m~MX7zes#u0;pU# zq#mFH*N-q6dJ3nmP!!C}Wpt}*MYe?!;WzAsvd~5P9%6CrcW=Q@20IW@RHxf1DOBM6 z$e6K!`b8xWv;&UBaxF-({&yxFwZ7Rmy@?waSNh4gD2S3;oSk~2%UcI$9tbSvS@~W! zrMHI*&4^6Xx>|Pyu_@6$0kOaJL7I42@g)%dy8TKu^SCa0p8Ev(n5tpsrTtO-A|RQ8 z7|J{9Kuf4U71u!YCWsEPyP961S{+38*^tvWVa9GJ`VJcwQms{jYOVLJ;*<1(;7;vK z7~=>V92rG5zQx?Z!Kw{Zo*eK?r0e-@BiC)|XU$2o{qcT3$K8F@FISd>rmu85opd_4 za)fu~2M&3KJ|EK`>D7{v*quAN?LG=5(m9a&?vOjyQoNp=c=NX5Xa{qHyb{cx9S+d= zH5Bpyitj8kjXczf;nc_YOwRc6P}xU2wn&Z&eoG@WA^JB?iC3zby8^_2(;$Am+NdRl zi6V8no3q^I(59$F>P-RqZb%C0^F`IP4+Ng=khRto0Mo9JCmvMjs{xYxCls;hJ!1iK zqymrw0U*V_5q^Ho_p3kzbc$019&_aS@V>(SfaFWKu~^0)fu1hWx#T_E968w+?*T8j z(oM`jQMSDpjMkRHY9}U(f+T{Qhp7`CLoa@H9_pHa7a%_ zkOTY+MmNO23W!g&vwUGIM)tKGhlh`&9xvXfeo0!*V% zXfV7DWKmvi2c2{@2kjYRlCkyP@H!CQ*w9&p9pdB@js^iPSz+g{M4PZ)v9VPi6t|oa z+c{W8cQtU-+g5pqz|K9xRzWhinN3IW^8(Lx5M>1P=NRFpbhxv-o7-_;5x4I-Y$ETv zBU_=hO&{j_vr+th`g-BL!bG&AB?)quX$su(L$>3e-+_%H1_xlu&?R!c&5%D^mDHCQ@82w*|$nEpT5=4 z`HXLu_d#*7ZNM}e(tBu+JvHh;+lYX{tyzC|aX2*S-Py6}5`l;xM9?alm!d^Duh(C^ z+Al=ux=+uXIP%KA0jG%6>2Ao$GJpG+rs z-m_9EUWke462D@TZczbf7t+E?zhaeNu*Abi)yN{~_kxXn5f{Ys7v8tRpU(;ApkIi4 z0WNh$Ia^0sQM|SIK5AUzFER&m^-MZByYg$T@6(>|thIi*P=vdpWe2U@w6cZY{l>H~ zXKMl)U3`Lbb0#1!9lc@qr$^=0a!Wd`<_Tg5tn$JQe06W>Z$;n8UC-izq29UL5G~M- z@~p=!afJr7Qeg#@Wd+q;xZSVdUS4iOyi$stxwL*@b9rs@%H=ZA?t$A#~&icFRi#SEWXhX%uE*!aqQ@Imw>g2j!+W}L{ zc6Ps|om_EeOKC56;57GgtJ%v*Of=$w2(emyWb=4+IV$-B?yq(EVZgdX7+6`mI0}}Wn3%~yb;|m zI{D=y7&3TA&ronbhZN*p9TaZi+jM!O3&jNs*gR%m&8|7?(%H@IFB;u<)vZmXZV_(Oy5;JVjzTH< zUP9Wqhs$cG=s$2VCmPU^eIrP=?iDIx1TCjA0-uJFguZ{kYA1fA0CryJ`(NgL4^w1Vrh3ntWl6pS6hGxA9$yF84WEW8)1njRo6q zHeX)0`S&-aceS*BQn^&4yIW4%3Q{ziM^&nT=AVv{m{&_=i`cx0n7FHhd7cqasKWc_4lIF01T0NY|8Zy_zO2F=m89 z+eng6SEcld=r%w>s-L&gf%omj=*{bp7~X<#uk;KrqHlnbE{$m3Wn@(Sk*LN#I38bX zIl8aa7TDKno4c6TD+LXi9KL5STuPPvTC9XKdkU8h1v#n74+U52=y@KWs}2Qy?HkJv z{g#e#=m#}#a?b&D@Q+sT5yIu=n>i4qoQ}|+t|NKh05(g?If-VQ^4xM)VI;~ zp86C>HDG#xSYFRwQjIMKc4+6U5 zLmbFfzzz#afP?5!nv?9zc&L0%r0Qfy{|j(Ta_`-XkONviGEt}(KkY_+tmP@RadomR zCgxPb4ZfCp>m)bSx=9?34uOUZKvv6yDZlbMomjFu*A1>uwU`_oRxY-z#A)lgB7y64RNeb>I$WNo&ChVID z_ASAh49+GUGPK7u8SL}I{gRMBkDQ`~Tp04J((j54@lPwya*92}H5_7d@;)wJu5*81 zBM1fSrT@#`o50ywRC&XFZ{2!wJDuB0`u3K!(}a+y)TvYFoH}*t6!%u(;4lbII1c=d)tEJI_+Q>D$a&jC=5rfa zC#p9Ic57fYUjqbr9&IvSQ-~f_1gpAE9URQgC=O>e+{art60f236SEPeMZeE|`Ny^( z4nQ4d=7@eWF{6ozI>l(vu6qKyS(W>9j0g1_7_>?WBJllV!GUxT#H~xn+YG;44o?Jg z97kQweEO0wXNXh{yvUCujt9@^harqNEFsen&ak(~Pg}VL7CWeoctn`<_xl-Z5I7uD ze>LA(4vir$f_#Ic%nqzK*7zB#W!xj77?)lJau>V+r_9bY1 zpyo|OKsd0tmMz1*ASjUUwi5Wwj($o~mx;a)S0=cM7k+22eM#S?R8esjZV9@)fAg<$ zH3n}={SCR%XxK#;>+IeR40(k=9|~2)=Yv9peSNQxs|{L=VJ{lO7aTjuQ8_nZfAZ1V zVk|+6QT}_JBsW1?7GaOCz0eoW_qEp|4Tf}*GghtOJ%#B1m?0EbZxq*D%o{k0t1sd5 zQl8v!`ZX)587gV|hC2hAY_J77_Gf8AD#9msVw9az0Lw)R*cy#CP_k_Ey4d3zcG#D^ ze+*_W83DqlsP8JZG6|+CO)&@k%wW{KgQ!#TU7>R!G2@yB2Qc5!%S)x*PUk(tmy!|S z?4q7pT?-@O^~;vSsKUhv=Z)~el?;SP|MVqPgj>HD#to{F#*Jnd-PVJESW6gypzs_y zoehUcj`s-)Y_ROGO4tktksF*@TG%{e;^v|I%w!6js9<%%6X=494AnBd%E?X~azNIuEDRe#OJlp-Vb&|w zINIp6W$Z8F+{(ofX-+Q4 zlnH|-xzJS06+X}V53b-dyWb>3K#o0Y;x0!M4dP9FwVepaSUwX!jWmALM+y|%z;7Fs zrEs=Q_A3iWQ!n!1uZ7)Jg^?d7v&Vgq1EEzJ=@XyKRGT;e04X^iZb1J$T6 zaPJRSJ-T`I4TwhwPArcGE4o&Pr}p-Z*ze5!p6K0|}R`3l-|2Bv=xxFJrl(F=zgFI?D= zSHMct;Na;x!Bs(?x^;+@g=Ly+<1%WIv}5Yzu%!A%Znv6$C-!^`(c|Lw@FA|n^3T1A z3xM_X%QlS~OZ)J2DFvRd!B))4zKT8+Yh-P2hM^uev%s9b8s?!je#6yi;o>(u9p>UU-Nl)@))VhTE`CEw`NeNYC|&%Peufg8y4DjpN4WS+ z7sajLv}xle-us5~71%bf%)V}adNvlJrqsY)>y+U1UdaH82y`ILf~F>#OJv2OnZ^K=Ax8nYJia)e1#W51_Lq zpXJUzzu=s+e1Ss23FCNlJ8ee@)6~jsK0afMSp~Sc0V6ehuJpQQIOtbkbqZ;Z6?ot# zG5^qO%s)B}-TMiP%y960yPL?>H+2t-Q?ypgbzBhTqo=vmg9D7Xx}+5a zug4-Enn9XZ>?W^($+g`#=G!2L!!iu#Qo(%KH5X;q)y3=w_AYF+G_ay#eyVT4Qd`~K zgnq%p1USQby&W%?_(d2U_ArY>CMiVjBf7QT=DkqdBv+wx{fR3=@%NV%XZ04-0&6xc z{p*vju%TmB3pb`;)W1R3=K@3j<5y*eyZ3zwWYsNS4YKM)EW$J~DVCOO#k8ZR zGYoHFm$*NBe;>kR$E!5tO&x^O$P*>2PIdIKX4O9Z(%b>34hkHYJ7`hK$%2993o}T} zQHXL#!%CJWgM5@-BJ+sZM-=NYFUy4NFk@M89IY7R;Od7zV_DZY)iRF8hH*OWFir*$ zY*4Z7@JA&JY_z~{s`VovrpUH2C8EV@U*|&gpisOdCtK3D6m8qfMZ+5zv`Z=4V9kj^i6Eo~hg!{Ae}-oh1X# zTtYNg5Y07Y%ncT&*(^DaU(VwbZa5}eoPQ4vjeNjtU_4YwD;PXzuV=4AIXul^*Crq0 z55HA+8r7Xv7?RZs3Esm zBxd0^vPQ8iVisu;Xg19ortC3{>PRXxjseZ-P1T4ulO*E*igYfmWWtzhg`k>{7OXtQ}cF0 zsKL*@kS7j{I1?GIwcyM!E|P&~&{>{N>>!1R3>%hozO41_s3C=+}~}(LWAzS9Oy~>(tW}lfS=H) z{_Qr7Dl@Xkun|vxS^AFIoV^*Dk(Tp=-VqBr7UaHDrc)Y9m)iO2wm!DQHuU~?;r-DJ zYnko-*4|TaWYv)N2RSdY@plQlkE$bXeW-At)R9NAGe{h|^*})ndiJ;QbR@Ckb;v^r zE03yoj_qZw#soDP_sI+yLWWb(T@(P00delp(5dhRORrU-r?>T%fchi`T0pH1Kz&s} zc|@}*1FiJIrvy>q2ep0HeK8%a|7xvSAA3ChV!RW-Lp=XQQ@aFc%e^EZyPKP#HVdktxr#@PgeD( zG#@yePaUa44wVQePo)On(?;H8x}n*p)Ge?UY&Wwz?lbWi@j^r1H1O;nTE)dKY zj9~CiSR5xpR;0c%R2a|tEI%pdGG7>#EK9`wIh)f4T^fg6=#vg7FD~X z*KC*MX53$1 zQHOM7-4ht{Ffi|{aEfvcajO+5)I+8BrxB7){>R&BHxHb9 zBo6-S%H>oa^+N;3y$w^t!PQ^tV&vWynEMdU-)Y4|CgVtp^QTzQh4C?~ET@htIR;j#wrG05a4| z+;Yhj264)=y4k2r3Kj|okgJ$u;^Cnb>kqkPZrRK6li^c_PeBrVqSU9X`+MuGbXWca zHuQZ-)Fk9{lT)A2R`x0Cqg$%FW&*wUEU(CXV)&RZjLU zapXufffMd64MN5}BTne<6RML8hx$x*hBOvbnTJyKKNItVSkr#!$Z$Sm!y)C+n9xHh za1IzahV+Mo4&$QFNZX=L`rxQ-!~zMG2-F8tpdPTfK?6n*84sqK{TkL0npT=Xd~$CH zRZw3x5Dt_;__#m_fLW+$YzE(`6(gySq#8hF zYQWNLDA|CiH@trs`nL^Y*-*0Q2tJvr^~0%J|0xDBu83h8N3AI9z7@FHpQc9OTQ)uh zvSmQnA{IHCcDOGz=zD4bOQb(W3nh6rlCUkwvr&ZYznZXRk8-p{@~$TsjNtR)v45J0 zUh;lDy}0~4{7E10)j48^W1O~$uP6dA?9c(Mj*iK2>KcoHD?}5$y+f#2c#*rG!BC`h zcRQwx&c(xXdljPfb@FH!{cN${OhZV<=Oj7o>s_{(F>d;TX0}za%e1chZEV+}17KxPBc2!4r01`}7`Gj{U4gGZ zU#iU^Z9q*wUs}yG4M7k>t+Vp=bKCaDt-0L+BhRT~mUBqMDP8w(7*l)y z6LCm;+XI-1LIj}G!gnQDD58O7_{JI99g`M{`qmuZhfbp=@4jPKB8@`WY||4gytiA z7F;2EOAxIa86xj^$yMDUYn&JG7!pE16p$ZxNi*?WuqNd5?viieo8~L=e*gB)OLTe` zcksZ~kH-{$9^?3)=9D7Xa;q1@nQbPtgPTk|?K>n_EslWkEt zwKQF!Gxdr-{}px%9FL`!*(gn=A^2JMy$Vxn?$zEwoMuXRdD>p`7Tf{7eZXpyPGBEA zSE0673P%1&{+n37cRO`_mUC!~mCQyRg2`7MpX={Ut72(}t4kM1EW1f4r zW@n_Wxc{0>@9DgK--shQvUN6ykZuwdX3>MV`h19m_J9_0r99xMq;+Q;GTHf((wxyM zdU;$Kt_gra1Ji`k$)PkEx$7S>I~TIORJLHQHF!!@utCX!)I@%8YrGr68VF9-wn;v= z)i#GL(V6C%l+L2`U=NG0S8b)$P$so8^x)Rm-bv^w1kxtV2e%G{zOiYE2v(T0ot|{= z*OcprW@O#hvbL?_sr{2Dd>j{RmvhCK+n~UZtk5`4q8nnZH^A;}RFeRXHV74WzQW#0 zlA9w0$neY!fG4?FI9aX%9x_Ua_#{i!ZnpbaX%Mo^)q=)96uR`WW9ib@ZM)k>?PICl zp!(2czP*I~5fU@*8)?`-W@E)fgRZo$I|}F$(#J|qwP)!&WjkA?gUoP)m-v0sBcV)_I`^$n_lDKtQ1gv&;MPkz?$OwUgmGDG0HTqK{(KYWZ(TJ0la{KF}Dty~)8Np3E{n8tXLn{nT=9;_aMaVyfoR8&B2 zOU>X;pK*;>l)QtI7w)fvrwOMVbJ%vH|(^RLD@A9oBvL7KaVU8&jdp;R{vIHxUd z>4_w3_fV)M=2^MWMvmojEGM=bW=K+B*8Ph*tI(UCgO;;tf+ug=99ZSsU_EdwT}AZ* z?SZY-3{8sti#jORv>;TH+#CQh3(Nys4~8#1(`*LB_LC2$U@0@l3^mHYz8@g?U<$?G zHWV9g{9p>Z-_8yQ+z+M%Q+ZlxgTuT3fZi^O=CX#{((eOQCAD!Rn+x>}tlQoPC81O< zy)FH3S#3-2^^4r{c!lIvzKU(>Ki&!hOtLHeGi&F+Z$84F2Fvkqw-i|S`-jzgU_b#; z$P}i){;}c{>?iEg5XI-avEpNS<%$n7Sskfd`_g5K&-=CxQGC8zruYoW&N*aj*pN}0 z+QV88IT@BFd8>V{ZxjSpGbLlfcy~~I3`R%A#wL>OZoIEVNmt9AF;^Ia&8#rYT7wVuhNSHiJ9yY7j}^;%m<6_`L=eJ|;-s zR%rnH{yD1NL~ZSArtMrChxw(HsZlIPV z*N0rulJ?=e(Tx=`^uJI-|IQRyj4lJ+ivi<1Qy7177{+&|dXRjP!gwk%!T9&n7~h#9 zk{3%*4jw(a9jX}feks6w zXA0(*jA&B(xJj-fAnN6vX^=-q%($1+Am5n+8Kncr?>PpLU)J~qWWFZ_x3y=Ii7Glv(rQUMS!Ky$C@dykx!F9p2ApiRHVZ{YAqQY)SuOwCs)FNKRxUP1IFuU* z-zK`W)vN_zSOL9q^FRR0xgBa(N76L$6WfHmjRTaw3{dV696_YKa&z2pmetrqyPIPS zh<^!kK5Fam4k0{DtzVX^7nJJPFKm*KYtCPPticTivmkrgM^VjACK6U38scu`BbU;vr z#RM~3@P)#;Iokil`ht^Q@-4eSf)WmLCbxc38uqNaO}U}xAp?m+R)9Z0iv9(PV%0V+ zer_~FV38)5H;ETcydY!XDK5BsUjweM&$3c?nM$ce^gL2}*pD;qjR*oI@H5 z3dujS5fyB=r^OdZ_h-k_>)S=T3Y;J4_h%&lU8>!b(v|>IN<<`a>x$_TKNDw>Y(*9E za`2}|0bjfvM78SpPg5O#r=~y}v9U8ts%m~nTcvHTO`-%PaW9j{=2eDqL@qOA6j zSFk@$!E5CZHovrjO>%Pq#vF5lYMJCBWO_h4ay@5M*l@8TMlpAk(Ep>O?+6u%W z#Elba#J(Kp8j0m}{nF7x4GPPK+DE4Ams0Q=6luCna&w`UG+igT8F!cUfJ^N(U0V^O z>pM&6KXmjRVFSY3p_F*K%g~=%z8*?-C;1|^t2jbp#@%he+dAY>iem06f&7DG02$Q^ zAcL$jKKekVi<&xSeS%e?Jg85{<~?Md*u154DIK6$$beOOUfgLY}rPy_kaB;K@)o z37Siin+wpof1?E(t8CT%d}<(f8CKS+1^(nN4DH9-HSTn=9zV-mWA=C&x^4J^I-KT` z=|ye4v5;0nt=hB&;e}GC;Y+KG^twCA&4pakN{!x=T+du}!qRNoA}yG3oBZoR|$^IWO7xsaPidXnpzYf~V`^Y@0~IZYk$;RuitTpYt<>U$-aGe}Eu zmn6f5j5K9@F9jq%Q@6f%GxwECuJhjA7c1Hf8O3ef?*P8i_UuU8xFyrVC?=0Taoomr zQeDkQj^NgYK(lo2%dAzU4GGOKYyNIaEotV)pHIr73OGuRK3H~L-icr%nL+N z6qB+J=ac2a7i=E5pTRG#RHDQT?17cx`ZMiiX~CZ^TdEDm?Stj_D>AyX1st0XlkzL_B8Xu! z7Mi3HlA&pyY4o-YtI)5=tjZcP?o*-k)2Ws|1&bLC{qWX;M>!DD;GRAT(`mq17IoYD z^yyN2F4Z1s)^L}=5T|*TOF?Wk2qxqtj{Z*_1z5(9t=FFpy?!dy>rV&#K9$06QZ9xp z=Z2?wrlp{Ls${liP6F+hj}h8GlfgFgu!*!MWg%rhvhL3U%wJByY^80t&g8|HOZd;> z3mSiO+?)x_I?46S72SVXR$*)7e`hUdfvACIng;h|%C;gp$4BUHJBSA%`*)iy?+TeT>|CZXK|IH$RR$2@p*t$;&3A#MX*B{f1$aD*-mRH z{F65ZGwl#-D7<{7 zw_Wn-K0h@-jWfw!hn&s0f7Bda<2l+ls<`~rhQi3FPHh~ABOCod+LK!k`A#4Zr!3&% zjnf;L+@18<*`M~=84+bG!8kI$6NfXp?F`3ifYcSA;iz>_Y~=xtKWEh_gInt&_cuqZ z)DCbM4@AT-oYuI^4r|~BZa0|0#SQb_p6v*L3K{SZ@{FGOCfqH-P~#2JV%=F84oUF( z%GTtB1TI%Qf%rzMT+zkc2f~?+#=JzV$dJxWZVSdqw2NC+@mG8yx~C)_Mj3wBfHNgH zoH2jy3O{Qu&Syx#>a<3G{5A{Kr897IR01RpWQ+u)ckjeGnL5PkL1-iduM{|LwhW6h z=d9K7DSt@k`T-thxezX<1%AWs+F z*5&6f_lt0M>1-gG!j+N|htlRp_3!Y_dsB&)IUlKzu4@r7q=WJpmvh@UhdT$7+eLWS z)E0{dk7wF=uSi@1IG$??bYC-WG7vV0mT!}YOc zJ2;oSDS7sPkUVGpfHj1Iur~7?$}6LDYDsB3WHFFch`*d!K3|cp5a*Eia;8L-X9O?y zSGEpFhky{YPi{4(ARJ5|l8t>7%U(-Z&&7{+8NzYWSHw``mhIfiE7}@k8n#Npc3G0< zhom*59MiZE#o>GR%hCHkM56)elrVzLi7XxYXXAS=Mh&7J*?mLOawun->n|mLSTY7n;kVdZ=(joTjv*lj}r z`}r{fhKhuppQix3EdciO6kxXnz>;#XxtG380K0uCU_U!Xz-|u>{;WhuFs=u{epVXZ z9MVi>uyVDJ+B7FIfj4nrwMN1kgcwRmXu5VzL{My;K;rq^586pd$u;*1m{r)Vyz$jV zBZCyF%pdeT&^M`jAPmym@ZxYoCszZ?X;*A&NPS3jjpI;e?5DZtx;RoEhSjh%>VkLNx==iT`73g%AW;Z29Idj(h3 zM@;tN#1PWrILkh|G{kjX;q&W!B~JYwk+bcsX1s;foMT_|z6$kAZ(~D(5Z#;i5Av!*QVaB1T9@ zAi>&0MO_5bjTB6&8i$Kr^YfAOz7Tch0sS5KIV26#gX&Nd^bO7y-fURUDZoQ(h^u(V zAnsj28M1}S=qj{R&8tVLe<0){Ba}7Zj6SpuXf}y9v zPkIjojm|x~T~;7Wiv}E=Gd1s7#si;^))@w0N%-1*p@Nrxv7U|q#=YV1rG5$ugKse8 zQ~}|sc!5M0WBYf;ISdn}{>YW%uc5_)C0#SXIQn=ZVEPz|AESng)Kj|sQbamOM|c;< z=V>JJr}p^?N-#LzO9UZeC_u-B3u6|! zi}v7vCZexfzPk<{1gHARuk%xJ$*vpM$CwMyh_A=Ofc0U`!EJXOOFWKsP){D<_f-dw zf&ySqlcU>of_ZXxH_o2pf`K~U*5yw`aUcn2*29M_JDxDci{qa3N5RLF!L?LLFDpS< zdme;d*y$&CN7;G2eyk0_;DM#H*eq@p!j-diQ7;qL%@4RW}X?FeU3YlQM9O z9iKMDkef=+E9s3ejK#?UkIVWRPT8kKS5xZWGOgS=GEZP|CIOlG+cK{#7nOno5A?}!H7v`lvCcy}@Gv+X=c zqBzm!7AFga_Ns7XA|r~+q83r3OkY~2px17EU%np|cIP`?TLwbe);sP4=yhu}=qG^~ z5xrvH{=R@k= zqaF3`n!zVZp)E)Qr0V{t1P`=4KA~wyO|+ z3(T(*QPXRT{5qA7uw0W};XwO=LvBIlAbNU`{p@C-+wSf`JnymYxNd0+o&F3%-iC}n zO-~trHvh(sV!|G7mTq?QIS==dnH@AP2WA&#_Uzq<2CqNZ%d^Ms6(}Ag_5zp+j}13F zTzJvI&l&FktJ79j&nY3+)1LK^StFfqOPXr2LAG zjo0>fY`U`Jipwvb*S~S&)tlG%&s(s#W7Ecs{kjbXMVZ%e!_t#3J8AK}P3zZP`Ii29 zS8upx%MBeUx8a)0ucoX_-yEasqsmh@-?-UYx(xS^uHSUcTdwZ7{MsA)uiSXeyhZH` z7UF+gQ->up_2|EdD=llhqT-zO8*z=(rW=1tF0;Xv2BnKqkK$sRb9q@nTafTShOX|L zDB?jLNlB5^KsPua@;V3fXr--T0m&E3dSLK6D|P9 zt;_C4UZj2n6mBbkPeZlK@ppcoU*7HOd;FB{mHs3=b^FtLeLaL-4{z#dS;^noS0IKm z8z~3r?C7%|x1t0TG_UkvIBkFlojvPHXx^2$UDIJLGVYvpfiB4r-OwS5UK^yUY1>~QVTi-%Ypz4|Mn3UJn)w~?gDW>%%7!tJdv48qF!Qa2`dbL*%Q69C?5FB29~HiD_cVR*sIb=h)ePVD!MGD+-3I4 z0?S0N%Lv;tz3b-?=D<7>5XX60RI6M+rr!G=FeUIutlg28%P+;RYS3jQ8m$(gn-$L7 zt9G!wz{@lZx{@_KT=6tBqj|4xaA=K4rmZZskd(4mq_9}yyO{lN*JFnYFJxCWGD`{X zoM;a*H78&SfBDv{qDs`erLw9y1Y?fA)D!oO?Nw>4d`=h?-56h`rt1y~Bv>GjZ`7%- z65}0An@ivYRTZnSNu;Y0il(uJdBLu?suDg~F`Lvax;LVQ{cj;q_Qbxm^pXW_hQ|Lt zhXpnNma`xd3t3OTHN{G1Y7@r>HM;=%h6Y+Rb8KA3_{d@sDp(EM6su9afyXE@PwHEs zAGM3O5jcw217PMSzj>I_TjKDak&CE|Rj{l8s zeb4bf3QowtKK4MQaO}b>aWhA57;}i5IoU;aeRW_E>Osy!pcs!m=9F5Djt1)BAb)@BHmaFeg=`_u(Oe57oIXY2XU1|FTQIKo|<~YkU z(QlQ`?8aqQsp&sc7kr6cZ1hP-(kx6@5k)23Vip^U)e+)4Q9>5$0;^^D?x2YVd7h_W z9XcZiJnm~DZkAC~Tt>-0ixbqWp3zm|g4rL#SV6NQc33Ay?z&7Db$Q%egKwZt;#ba9 z;xSMlDUs5{MD$6un`ykFHtLlm1J;q#yhk{NgpUT2{sjds+Fynu;@Pm1U0B9Eg^oEA z#F(%sH3!NfYYX$UPfAkqlFAZC4zre(;v(k{*uq;jhO^SE4@yv_!#)C&%cx!(C#4v`hhT@U(@ABnF~~OF)XJVyT$6J0_L_$ zm0l=GAktD?)CF!6N1GaMj02Mb6gqt&i3LQ=5;u!==b51{Xqv+X&mg9PZ~{~u5>Crx z4(ZHf4ky!+YzKx3=I+{k>_s=P`tr7daLMloqaOtI)Tr59vL z&CNtwt467rooUar(S_tMi4MJ(oogpflMJP`u&qhPh>fwes!ObCCdpN3-B&)ixv=A--yfB~q|ex5h?YD_d)q*lwzPe{@h3hPgyQF!mU>kivHxcF}Kk zei^Sm21S?k8kdbV-F*9DSub0}H^Vtiub>vswHp5a;kmO@LUahvJq>mufR=ODbK(h2 zspYYlf)HxUep4c}@SVniu?e672l%^@svG-F2)qIKBe5Iv0*}xp7ovn7I#3kN<#{Fm-X|`MlmNj+RCbWR99MG%@8W3lRxL_R{ zEApq=#7!swU6H)h@Gyxem?Ajwi|r#UpJa-e0vqBOXlAh$2Cf&<}C`8NkTjT@RJ5X4fzAaKh+`EJCVkS zyFj`et(bI4?tyffTxlW-PtE;-tWC=?{I-Zvo1x63L_jj9YeKNI%kYb>ji&BZ%b@t& zYO{u1F)SxE#ll=vs~X0E5n63NXjcPcUy*UWV|^v!;qzYAaTp3Ba?%u(W`4q4^PtveVTK;ED`tnyQ0%#(qA7Fy z98nOTF$*+Ww&8{|b2eVvke41UV|kPTRgzROr%O#sB6#8f{_37#m9U}UN(^cy=IdSr z#EzLE=?rM|XWE`j&3u36Ts02&p)=1l0jm3G$C4JtY2i`52Sk;(Vzs*Y7+8sshf<=1 z*mA;gDbq0Vjws%mBp^_}nbZN+R7b$xUMwrU3@BC>DpM}L zKy{v|Mx$O>L{ONzU&+oH5|~VomvF3X&jgphtA?T5BD$P8WkzA$wl|W;2izB_G#{{9 zY%tRus1SVuz8df|IonS|*=)2uj0;{ca8S88GSr^&C%@mW3=d3?oVjYhc$du|Q~x@n z{2oF+QxMLiDxP}fcwl3Wza`@&l z+sI-qZkOtJG4UYfd@;G;V%&w{#@bS)!S!ngly*0f(!}hWi@yF8KkgR2&ZOx{WTTac z2Ev}O_kEj+EV;o6=P zmU%P6u|uNSnX)&qWavAIWT}R08Ay>CFtKr}aGoriXSfVjH{#OBLrbvh9{lMq;8W-M0qDH@Y?Dm|_D zmZmj|FX;_)AuQ|Il+9;NZ{mANY@5%iN0QBw+)@~{4=reHM_K?=SEw?SmQ6z>8)*sf zJb%HJ4iF(^Q-nWoDcB!FD$~S6Y%_)!SP(;`(Pm7VHDQ0;!XV@CgV(dOjh}q<&tF?eo{aNlu+YXjQEy|SZGW^O2UJ$~a zEfd@)@>)EBd&X)FN|q_aq<}JoI9|r31#9hc;RRz2otVqHSdyLv<}GRZs6T6)o@y7O z!imI=MoOo)O}ilC6&gxf-9)}N_iAJ_`h`QKkSgTceg@yM;msMq38l_ay5oXOB-y}B zjP~SNm+6sHf__Unm`Jp!ohjJxfC3IlgcRyXlY4^fxus0@AQu`4Y%r`cKEkfVi%7twUxSstP-AsO#gwe z?D5CriH8J2Nq_0B?D7ETf_pm|r>ha#-_DZ=e{K-A6T&yYH9&~){eUol*!~8e&o{*| z`p6>Xvk{zY;Q0kq2wQxMd))!NUc}c$d_9k^Jnlw@-s3Z&s`)mhCts@cX^ zemqtcSMg3dyj79F^%LlZ@1lUbtze`9M8?cWD6)TGRcyff^+~9o#Twa%f}Z$O z(3~k~Wm4c|uQB$o?$k@TH*l8WC{-K&H1C45r-=8UW=p|sA&)9hQz?{cE~tA2!B)+# zSF?~ksgu+KsP)6NsK=l;_hv7mLRL80d%&#*<*s{&&x&+r)k=R(asUM^4 zNE}T4)sH%6eKd6Odyu+h5m6Nhs{s|73`{j=(#izmV@2?d{5qlXMxv&moPrH&iB@Zb z)_^YxjRp$TM%LXZ9Zmf!5R5?3n%32%Eu&}=xFzzdp=3=^jX3y8LZnv1NMDrF(q!#B zT-BizL+p4J46%b8@bx8zxR9^smovnP!x`djBQiw5ULW0q-!#P#%a}R(b4bsYLP`=! zV}>Zw6sd|*3M7{T6RT}{R!hlA^Fj@DmE~5EQHnq!&Cft4#8XHhYK=MaDX+)jQ>8Qj zV~s<{6d~>@yKLq)S7@0_RE+d=TVgi zpo$64}&eD=8^=I98};!pvqj zN8p6}S>0hdp^>$*Ms~K0tl8Vc^23E>#?`E&TKtbVsS-alOp&mKIFsJOrXhkQ14@Kg zl0sfX7Er>nh7wZRXei;gMjo1BHHe{&lz<=w z1$ZClqe)8+wx}U*43J;g;HPy3&L~SwR&e?%)&&U!&JyEytVpR*(@osCk;Kr*c~-DQ z&3I^otTfOIbAx!)LDfVXjM<++7GnoBv9)SrZh913(9aN#H@e8wcS9&85va@<`fVxA zcx(B$jd$S-AcI)0XFbpkiQ2Sw$oHTf3YUQ)8jB<+6EX_wX^ItA!&-~XpdO01SyvN) zQp#ZhbzXRuXHZ~%{2tye1yqB7@!2x{L{%TFHNuc z%|63bf4+;?vg3AkF86WJu-sO2vKT-V?LsGmt%jr)Y&Cl1Kqi)xGFy%KU76*CbT-6T zbCnrurpan>8KQQe2y7=(V1gaSn3Wl7I0KXB#)uBa5GgR!aAKAaiJReo%!p(Hqrp{CTBTZc3BGSqa?407uA!3=Uj+6?k) zwEkbe8HD&s3Bd;TS!U;=m{VW{oDeBnNI{(Su-cIf9VQ1w^qgq1p2&o;(k6qsLr9f# zOO+nOAn}_Z6iNI?S`U=*MGkvtk0fer3xbRNh2&$^X-$dHfJ-t&Ln8U0o{$n@2$AY< zE(E4784r*Y(2uyHW^D44(tyMUHGxN(_epMPj;FpYrHv@{-VXpF_4cxkdJS0+cpS1O zrWOfcQMyFg0w5*tSgcImO_#hQ;;O`?t&a&L%t`oDuv%4Xph-YM4Q6=_r3pHn-$7Z{ z7&tnooM|;;`!??UtZXcqX9zLLoYq@dLj%EyWt^Eo_7l(bl2R$^t|xFN$3~NJMl69$ z$Wsn$4WWpYD|aH}f}}T7lKNI9QIQt=tXCU$<=7zp3>zvi3N}iV9c(sbRw0gL1I1NP z`xD8<%45+-gbr2s*<{e@l5yr!iWFJ9(YHzu$yKeRew$%T>eRO#J5KN~5hT4{vRjIQX;@9ph_4HytXAWVn2 z#SKK`SNZ9;_(C5NcPcm-jPHeM3>@HV2?YFv#v|enAODqw3pf-{n|EEm;*1~w34%Z> z+v2cgFAgp83q<&V`+p(7|5kjFsfV0JsFf`PzR;*T^qIR6hl|KR!F_l;g3YB6 z<%`(hX=3x()WL=!KWmBd_nfQh^7g^!nqm6V~Tz*(ehiBe64iWqdi1Z7-s_{`a;{ zlzE3p`1P1QKSHb6qHe;NB4|TpuV0M)pZookK7TywL+Hp}UyI1p__Wuz?NI>&zmh)| zg9!Js0L)tV6V!}y)0l%KGB2CRKSBnYP)6kL2!#ZURy9&UYoj!#ZTbKz zwu=O66T%7&gDPDx?h^}wf8Zm+bvLj+aSw^oy-0rIenB+2>Wo5Q6xaH(I8sx^xEo_n z=U>=tL87p8`LU<%@l{*#dI8Eq8JDQKkDbRgc%23vTdw{GEDheG6N<0E9qG1 zWyQAokTN0JYd_|-Z^8$?i*UajXUacTV8*n#z1!hM=}tHp9bAjxQ4Ji&Uf<}}_xdV0 zkUIn$sd8^+n8BXNO@^AsoW`Ej{y4;%TJ5VYM$TFV45{h%jcXVaxCX3#HKMgJ;0o78 z;Gz@y5}Y*7K_drXZ*mA1xaJOO>ua zVU^3UDW^Tapls*i*ha>|z(x=ou{4t2)g;}#$T4kVgISVz6RVbQc@gI)@htP0j4Vz1 zO5QVOXGo!gt*erHRx)0M0{a?Kam+{{oh3*xl$g`b2uPqN7?9AHAVCWAP%sIU0)*FR zm$8TSk@Yl7@tlq13s*0l6ghLoM{XaPF&Hc6jdx!{@L@2Nzszur>mDXYQBa}!V&huy zZqgQlTjVeKlk49O{G0wjJ_6v7yv8^D1(MeU8vLZhU}N`7AkI|s+WLkd%D`jp>|O6` zZe;u*hT|I_t?)I=2q+Z{iw)F>SFrj5&)!l#H=W|g&-S$p{&SwMv^YYH1PaySdIa8M zX-$C1gV45KF7XwFqUOb;h+>Fe8A8UB7<9*=22?ZKGtHiebFVQr`==LyIE2lR$D=Km zZEwKz|61)*)Mnu^(>z>YfLmbeju`wSMiEld`Elowi^^h;iXf~3-v&XZ+PGX zjNk)-=zb1vPg1Xn+|RZV-h$w->Q?PCztm`eYq)mNdqLK)IytO(1A_FY-i~MU)^8z% z{Wc`Yur=N|_;{5kw{&5?tnOdR`rHm-aSxE5N2{U$@|6uxoP|~V>60a9YE&b8QA22SgsO&ks3AtgOS0M7oN2ZuP01!=sfL7LW<#;kPi{vH zIJO1(^wnQYKC%5+K7pk4X0dRND4*Izn37Lf2>>t#cA;tz%bOhtUFW3))^xTHKyBNF zsrGfK(wS~LHP>N9;Wom->S9C>h0Mj2%;XpNag(8$UEd3HSoB_=p!1oV5c2M()?UP_ zTU^cPbw7PA3az5hp0mFH^wT%q@LL$X?r`yFPo^nxXUe0h0b&5m(x1!~VU_!Q#eT$P zJ%`KE4hB)H^G(zl-4eKEkuss&=a+{^o)-w5f)g_mrx_#GF@_Aqd}Br9FrFe|j1&>q z#~JB@634&HlX1tmCg-Zn;>nT$&H4-hJ(1pGzpTFAGFe%(s<603<5j&KnkWjS#!h}Y zfdzHC^LW*FJUQ&~ny@n>nVDwLE_9rP((x>OylS1HI@*+sUuK-ZpSk=VPWJpIOPZ}2 ztmsPfm^f>Ye5+lp^8I)%-HtaVt6s=RA|_!L%xa#iZa@raejT~r-;t3kFdev`X3>q{pO&Z&YY<50> zW@r>%1$EgH{oEbCuGmoQ+qpbYp;~cX#&*K0n{={rKONox= zvs7M2yP-p=bF7iNI9u`2>;u*^gCjPqEhZvB7=Dwc+6A;uB25%-CKJLbtYnHb2`u$D zGHGb*vMx?gZDI6LD38!P1bA3sw~>t_o{Hkjgf{$&{Oh6afH|yypoS**DZj$q2)n}_ z-JQ`ISBsr@Fbzpi=$Xb5#zj}C$Kwd0&3H4v%N@}6WSkBRfkIe>1nu=n86|PHS_$o@ zcy%OI!uIzN>>A~&tVMRr_zzly0u9$wc$e-$m|}tma=&iyx)2f@@8hDpIT71uoMy1{ z^JR=&yxe|*_iBJ-Pmc=7O4xVWe+t1)`%XJ-jQQhz`&mAJ8kp=NNpTo8C!kg+@t3>(bnrL}DcQS126IKos0xO)vF#mQsK{M5 zz_*2%@u&(?@d{P9x+d;XOY}GGs1vuOph4a_pxDS9 z6I-7mF2JNn5u0()4XIf;_@;_5%C|-IZZ`8|W+j83TFJSgq_4Y7y3{^H8tupFK6U%! zX~-=gnDueOj)hAuU^P_dru8C%dvjFn>&}m^EOlI=y7N1&ox6ts~-4)-RlPWrJd-9T^XL~VH&a21W8FdT*L2z7jI zW`Eo~3LGAZ?bg%?NVE|dt#MeUM`)bikR_X)tKTA=yW=_g%m}sz!L1o4mUw4SX|5=H zLm+e(g2z0rb80MlVg?s53GcK=xBXsR{sxR1i-w-Xq3P{w{*rZIT8N0c z-F|80+Q3SRc&I&qi4fhSSxd8CvA(_;0Z@v*&Kg0{H)Xt5$gZv3FLiI~1zjT#ptm6u zzLiowfY&Q6)jKrbwW7wPC}jK;w;5q?yOx9O5SHAxG>XX06AZBk_$vc%l%HY!if;9-TX-WyEi9b|LT&UAwiA5)b*QU9O#7~S*#}^|B2S?u zyM~(`@ae~6EhFl$lFc5Mc-6thsxhixjt6ib(Eo(fd?UlkqYk69E%=5`_~`hi0Gmx) z4KL175{}w%2q?U!=5@EP-3fpP#hYk(2yho&&455FATB!&7$86|xlk9OY3~F**)@~nWZ8r#{h zS=k6i&tBZ4Qxvm>wX>|poiNGV0k+Fg$AS-kuan6b;R*4Uaqrj;3npU9|9b^P))SZ= zJZ2TS^N}05p3DF+=}zR}{}B^jm+5U~3hqb{M%|Yx%)E|q>M0urFd8>y5VXO8a&OJ# zv2J`ux0n3nwRNMd8#na*R^485&W67BD`5huINY+am&?Zc!m@E02vWNnxVNW(yGkmt z1J<|{M7qk3dR2mBkZQ+~{@$wtLF3+pyAy80mLro+@w`uUdj5c6C)z%(N0cpTV>1#K;UBsCpO&w;H1Szl&L& zaEYIMGG4n>wgGJrrwzdEV*EX!%g-d|>QU+psJ{pv3P!h6(1LM*ostnYfT5G)v*dBO z{-K!{Anf)tm9)Z`x)=s;OV|e-y7zCF`uJ}Z?Y6l}p|D0Hg?`rK1u_Hjp@))VCU^)h zSCAxhH^q#RoCSQXbqD&2oos#q)>#+bhzv-y&S(!8UU`azN-cXTrQ>_8>9mNJnKU0A z;JO9QB9VnZj4hz~Zl>dHSUP&|J_*x$#yyki?QPxLC+YC>ZM=pBfe}vi3zz!V^Ze8< zKlyaf2(F}TUEpix0M1haeRegAC<@W*!{6QYqO1Za&v^SiLUCR6PU$a{Es*WYGk%FX z6Ia}Hk;s;txvq@d#=Ayr3F|(sd4Q#eP2mPe1|Fv4Ah*B}Gv0lB8*c@907S+Ct8*WO zf==?IMv-?fSI{164)BQeAI9w_$UY=jy^cS9VN7rf4PLX!m|z&(SGHldp(S$dhbS@- zP{2=j-$#qMa2+l3nVS)K#;R((+ahp3zI~u5)D-!80V(8SUNbP8ATDU~U4RZ7%3YMF zpAo4|z;;1vbenE0!6hyY(T)Ci6jF)&s!)U%>okNi!hm}V?tau0t^&1`0~NGXlVCcd z{!u8#JY>1Pi%Evc-O-Q?ijO5)gPG<4dj8BdE_mE8D+Yl4qCf6jysf}!*ZSgo^yfCe zPyjy6zeK}5o~y)+5dFD^yn56f|Ef?YT7xp-_lESdS%D(HGbFrK|nK zll@YNvU9~_DLudyt4u0PK}vtFmF~|l|8Tq0 zH?i#seWek%mGruY*&F0$+}F7qYwHNv$TPeE7g&=JoC-6+8NSV3-$@w^K~g;3`#^mTC7q3(ii!65~#z+tZq-N5znl>UV^z8RJ~8v6MP zL>5t5Evh&j-VivzkDFD2HLMJYw8>Pc@Cs^R=`(*1n%50b8G8JgulMtpkxnR1yPAAA zMtA9AoYlDjH~Heyr%vC+{irosQR<2=d|%`O2A9Y3kz0Wh!9|vHg?=W%5*$8zk}w0Z(@OaI#n4!cseO-ow(!twY~^nFi2!BmZr}4^XGc35vQ*8CoS_3 zOt^))vBOWEr(dqMxs1&C*7?418Qek2i`f0c= zY&8;l^+^L(#f2i#ybEZ?jbPi@oh?kbM|f`^ig#OjSHe4vcrU>3k8X352-Frel5y3Y zz1ZY)-`uK8#Ga}E#?g2~^thUYU7vTTy^(u-xUh=qTL-A99r|XQ+qoTU{RuGot?+Fx zqDuEIh^&nJ5cznt3ba1vbSQ@&3(YIy%iMrji)?LHy#i~3U z>^MAbDGXt5CG?FgfOIibP1jAO3)I}=pq!Zz(_MauNkiwJ>N+T5k^9Xw^P zZ@UOzK+}hQ<9cal_;@*~5DmBvFQ%3vr9hX=na{}eZSVF@&;(Eh4=dq}gwlYcc7Xpp z*jn(p3`!6CC7=zkhSS>lJ7c+Df_wYGCTN$rLYTo-j?{5a#3%5#I#GrfUsntWaSOqj zxHiHJ-M1edzL3T<7?F?T{pQ%K1Po_mX;Sau=4sX%AfiC;Bx4>c_$B-{;Zd4_Q28kA z&<)Y%cuF1jd+^J=VK0*6$#fiDXwNnFa^+C=vP|q{g+J-sq3oq~1y^ar0#PS6X6?tk zWdp*-G~)J8K)se6%*}usBXAQ)jLNiqaAg|c)8WV5=iAqzF-{Z+p0?G#1zbp44Z`wmU^BHes<0y0c;tRvp&C!XzFuLH07&~{Kd>Wk+-;5H>c z#dM*LyJ@(o%Pr{i1`a4^n%&Yl8LK5y5`2S-V(W$IF|5WMj-S`@?o%=_E{xbSN?e)_ zr@8yEm_egc4wTKd!2i4I6I5vIQ2j1d)PgQ>UjkDIzo_6}FrrPEbb#kCAjm~|O;MAt zU*eli^R=_k%o&&+_FMAY?3QPUkrd5XK1Y~;*%c-;l; zVnTFWRg+n7fh!Crfl(|Ht_)m!w~#=@cxH<=Md6>4U;r2oS0nHLMX^u+;_HNJA$(dh5v|!XJhf&OuH`mVO*}H zXcU^whB67Op* zov4h21syCY42b>_5T#^Qme(`?6c;+W3T*n}`FHVJ$BJ{;-|$;y)2#5iclqJ4u2B@y zdfc!ajDr`s8{z%+xW8zr&T3`oUC(8Nc@aZTsl+5NG-1I*76tpoeC`-tJQ8NaM2HC6 zKb%Wf%vIWg!ZMqyw92)hjupOg3bu%%AER6Y{#N_S>3-UUzVcN4UJBxlHzIE*UHjrG zzHlc}J5&`Tx=}{aiwCP*9(mwqW#&x-t!Qo{{XQFg+fsiDtm|fRu&skr+>P`ocUAq! z;=&rX2A;*bC#-RB9MA!}wTkK(j9~u*( zf)c!gf1~_;koedKY{1zb%C#1#pj_hggs8m zP3mkwyG9Dj1XxS7F^;8&8JH!GrZc;x&Gq$>Q z?HZmBKxF{l>1tldQHYU$6|5&XV`00Uhe!Vo-}nTTFLfx&->spbO(4HT8zV|z?icmQ zT9dk7UOp~E@D6QZ13(3;|Fc3{oz3nKw`+kn87F`MC{Bi<=6jxq-2&_;Z9BUQvy$!% zztzv@P1#s8PXSABJr~dMwdVqkHfEHa9N}goT2*P)%`W%tJxE&Pr!~N;mGLWhLH5oO z9+$8*3>|~ELJh7B7YBgUfQ=bN&XAVdgI`1Kt12yGB%B>1fl1?=z%+pF4B!X=t~uRI zSiMk!`#}6VojF_zeFDlGJTZO4E*ywn9*P}(0> zxiLN&2$WN7E=8+f3MwGHwh1^5YUMoS&F>F4$X|3gjMcjLZr?|+zlg2yk>SQAVV1EA zK(Fx)%h3S$5<~+%ydHh}08fgI0R0I8`tmV}p|Ap(uuikh$t~C!AqT^ci_19c=?fNU`Eo?t=$aUo1 zNM6|UE9sorPU-NXz62_k-h>^?6(Ha}DxbMa8u@Ub}HqKb|8#6F=+L z_ieU!+>CzZ#&sLtde!>NLy2|kH($OfoiO4vw6SY%eCw9JzV(}|qVqPcTaPE`XW?#n zdx;T&w|qr~_1$tx`}mdI(+_u=+w+EvD1yh%w{F>Rb^p8#*Q~(p^%WJKciP|b>7X0@ zGgg354jfi(6Z0KhKrLDBx$s)ytIy?Y(*i&HY;gT8aDBr(@=z9N+L_kt&w!zUn*bfS zgau57tOM6H@()*{JGB~~$;TBY?kTQKY`@b4={^2r2><-}K6pV+;&=2tU5Infdg;dF z0ej?1@gKmb>nZ9MEceYj{FK!+Mo*DHl4d*?%0XT(#9>IVuZ#V{D>2XaXp0Wg;u4(3 ztoN1F+ZVcN;5qq2Flk=4AGT}s22WUw3W{kkGU35R*^BGqIvcX5*Ow~dvEA~TXdJyP z08Y!u!hKd3EM)UTwR>1(Fm7TXZenKAME-v0@t0^kQcz-l#9aoD00Rv+G=T=&Efb7o zJ9J5}#+6@nCCh)8D-j-7a=UaS{FYGDz@4R6IVkZ*92pD=V}fL(npiId2~Nzna!1Qu zw$DsKX2oy!wLIf}sugra?L1sCh*KJ~+xJ74fi;Z&q%;+UIdC>wqWP*zqz`x3=DB(^ znh4E92SVUwx6%lTlXeQNCF5NWoIzQJK4V5r&^?(DG+RDG|HGdY^zgcSdwx$pRVywx zhhaoBXc(E6SL~ag?P7E`y5CaD;`jr1F^2TN3eyWRzBfO9fG9vQcX2!HUX0I>MgZ-{ zh5#DKQyn1w9tMoRm-Kw0n~Mq0sdQlsWkheqk(qaRPp*hjZ{eIzmKPSJ;FYoOG zOIi4cU!H%zU$~Zj81RM$V?3$XPg(94^pa(_bdx>OxTz=*31e)*xzsu!=aHC`ePnx@ zC*lMjm?Hf>9>h+Gk;s9HLBEhk)92G0qC7n?$%KP}@pi%>8sV^W(gILa;*|%m7c@VA zP&MsOw}7pklj7RnW{FMy0ctVEPAzX5Vibx?3A_PL* z`M9E(j$fuv`x%jYPKC>oO$v9_K}?HV`!OFdE!sIP{L+8-%g-I~ zOIKlT%=Jq@L%*Gxcy65i4r7>DQ=@835N;V7%fKYb&f=`NPKzaQX>Lx$1O`U*ET+X$ z*hEg+2jci3T;hy4zFjeZ823hJXT^0jWEa_*OVwbbEs%bwhE6<7FZ7dc_e+=hlLl2^ ztTnK{^Fw`aDAkw8LKgrf6rTo&WdFeuwSK!Icu*KjCB4F41MS;R$Ea1R>`H$Uj)f1e zxjR5ts=1-(Fu-vt4Fhgy6(f&zrQ3u(SqurpME>M5F%iapBKv{W;333`c@EQkc{gaI z!R_AODM|S~4B1KGijb2n;L2o%U0Ue3j4UUgKtBcpl1)&)fEvcTd$99nqy0jOr^Kv4 zpu;~wVzMMIASU0I-$UqF=LpnKIXTj_8GdYGKTd8`Lh?h7AC3rKJ)U85xX(9t?Z>ta zjK|Gg3^_9mcmt7A|F1`QRrdzJ1a7&||GWI`m0SqGhoYJ;0uX6*khcerBZM1mEz_X# zAN4xm_C}k>S^!KKz&`R`1kkiJca_fnXR`AUDF+icXgtlGegO`|a8g61$p+JZ47`IdU2Aw4-i9ejd#zM#3O!Pb((1++UM=Q@ps5A)4BUd`AJbSIuArulT9eh6-1eu!5~w%)?4J= zTl~cPebcGF`fTsk(_`K(^GnuX<=5e-ttf5!oB{9hspn|DM*+a~-$=&HEfBo*{!DBM z!*Lb|63qkkO!Oy<^rGz(orwxgVHa_gJpb4}5w~Y&@v#d|TihV3bT^n^2ttmk$#~yr zS9rhO&VXRYStpmxY>ma-4{14eAKRA4v->)#=S#budHCXE+d5GIO34AB4~NP9BE)!H z&JCKzHC-1Y!@MW?mmA)VI5a}fhn?}k^h)>fZHJHnXOADF1~`}Bu?>cDy#55Q@NQ2n z{DvpW8L|;YVYjAv<((j%A}XTiLjE39OG5*k2Hq4Oo%DsB#b^)oi#+1r;Sc-~gN~E)WrJSG*JBjWEnKl4!#oYv5)AOTZhA;WFQ>a_ z>B&feuH%uq1aOy;4xGV%0wRs6L2lUPlw=;XMV#cJw^p`|1Td6LIBvGt52=$f|;}%nX~d&44S*44_7Z88jM1 z25~`z0nsSvpfOEb9bA&!-U_BkZ*yZ_=F4hzM-34x+pi&-BbQTLi;-I`A+1k9 zWn*1MGq?>m>&dTpx5}T_WjdNJ(_**rB{vEwmg_-bL%d^$L)A)TS)?xXGiL+(I2#4M z_8M6VlOjB9gfa|Zhzn0w+Wbmp{R%y9_ZGMXCx+dA(z2x%vuEUN%HYsI83J8%8GI0A zW+%(2GL+uguf$gLVXWJUvc`?+_NbsHVOBzq1p01QufIrx8Pnrex?RZK9F|ORSM10F zH*k!pHS|YNjNveK9`4p8Yw46YViUHqahUGJwohRaXw zA-4Qo!t(#?VGc^O-6s<^tvmK`r(NTF%(Ws4d?0~3l%>am3*T(q-LARXH&CkGFP!6N zuaYiS9W;+>Hmv-saOggyAS4TkOA<^KWTG~p1n zwE?ciUl-B5+a{u&;NNFU$_yKvXSc>%O(YIxz5Bw$IMB0dP!{*UA0|9H$l+HLzAGmi zTRy*VrEgfJ1!U>;3Th-0~V)kX2NQ2e^KpcSfkh#%z zNo^zS|2V&uP}ZA`rNo010G&t-BXNBnE|dYw%%=E65Z6$zhid{l_}3#)e-5C8C^%fj zQPD&+8Aa3(;s+5FC7jtVgA+4c0MU<@pUv*p7BT4{KEk)<{7TejZnqRacMPP9wSx#^ z2mw7(0S!kQKQkShZQZQ)vmzzJP%Bmps&;dV4Px(t2A8g0lvKWon+q_Njq=`a)>L=~w17zixn)w(Te58cl?Tte+v za#R_+%RV@m6|pYb%pda8U(R~0&KXN0UiP)vzZc`LMYZO6Hn*Xl(0E)><&PaZXp9IQ zj5FR7_z|Y~bbUo9DED5QxzKA?jy6o zAz;iKt`K>RYE~dvMJ8^$bgr*H6d2u{`;;4o(TIG;_EJ7$Ybmu6Qpc~uP(&$*VaR#H zA@PKtd#IDu{*b}IHy>&?gS=mJ|2Z7R4`JnR7HvZDEXPaq}R#@HL*bV9*hhA7d` zS@oCDLEsyOHu_7nx3&`(1n%jgf8N6B19lC{%uPmwZ;L`U``RV1j9&3<}UF+1X`yF@B8W+aw{kJ=iZ z;U%sp-)CZ>0-5JPpRrJKX|I6g%=i&VyB+yq5)0C}9mTAZEPjTg?nPrL?S8Kxf|1fN zP4bits_U#csvr;05X1o%Gb>Q|*n9Yt-fV~_LxI~CK|p{o)L6QP;8Y~@wT^}LP(q}U z$NcmI*%Hj+csmqh_4NTvYk{#U?JM$Ew-awFF?=QrGBFERLB5m_n02Y%hQs&3ju)}t z1=gx)@~yA>)9t4pKOK{mbvBbv6){=M{iKzJNgK>$J>f6i4BOPu!#M7NU39hWJ#blf zB3^mKPkZi|o{+~*CV3pzw`G(S_ew&!+?O5Hdv#E6UhAv&Q;Iw@{o<5`>>M1K7b1iT zY!Ob)jHq8;Qjp3NWG=&&IHEQ}?e7(RLNXou;4^;V;{GD}rdWp0A(24{{@g>o4Ce<9 z`9-~Z{Gm?qi$8EOP@j8NFqyUOE||L$T+py zfHZSfKjYMjxh~|-G_`RcwH1x;Z^RZ%Z4^n0q9vP2ilDYn4{Sm7`kY!IuKHj;BeqZ? zNct;icC`daHB3|{Mf!dby)JZ3Qlz1oyB7n!e$J>)q%VQ;)Ra=jv!i_dgsh*ome4NR z4s;koCKB9FQS+Rc%f^zYAo7-*BPKz9Ww<3C*Cd|7)m}{Izr7RauX3+BAfX;8>Z5M8 z`#T_~02KZ7e*ipSCZkq!?)$~8dnrJO-52X#SiMYANS%Iet1!ty7Ww^5mcK?#8~VGx-Nt0c(?e1Sa~pph7oq)V9zx>qzn<8calh@rYAWyra8 zE9yqX@@2Xa2su&6q|2ehyx0;xOjs)^a@D``iDovbryM?UK> z-7k_{?+!mKE%>(*xTKr7{pE-ACz1=4WY+yF_sauI6urv`bAjl-?_rVI?<0AxcTYTgs^}V~!TnVd32a^|Y763a zJNn8~R7CCZOo4(QXh5aIDo}L%Dv;^I`FXfTNa9L+C2Ej>TOS*U8H-vdp^V=t5wyRn zAZY)mHz#PP=eIHv_rQ@iLK}6)9YF3HiGOVX>~4$H4$Tx9L`2>G{UMZSRREMxxA#3P zr?hJKw~0}=ImI(EXhAY6^G|PPL5dm~c0tw@cO%oCM7Su?eEe0(f;?7O5W(M|#XgPB zYk=k>E=YFnhP>R6o$LoJQC6gM5o|F_6e1@rBxiy2d=!c>oND2#k??%9aQZD#E%d)0 zu8Ee^z5Woc*ot-9LVz{@N;_Cpp%pB%1)(K72vs?sbaZl##FQqj!jUAsEN$(hoHE{e zTo)xt&2>$&Itfw7c2DtFk;X{msgA2kU$eG{leluLs@X)vUnLmWNW6bAJ%xawbe2?; z(_UkKDg{v$lQ9sQRHHQ8xS2~k!N0l~i6$gq_37tc`|clE2av5IvbLD`}Do}sV|X`fp90n8}t-=mNDE;Bu6sAXfq zA#=yAfyL@4Zg3le@BInJv&ZaDD$-ZUF0CfQO&Vf*aCgtk;CoLRz%ZX3qp4tz76x1+@zp(#=8>fA&%^)d_x6s6(ApaQm0GdQ9T{n6E zI1pcZ#N^R`^>BNv;GRr+Fw{APA%plD@7|N-f?=24Ze(c>?(577|25Ww4emMCIu!m+ zE*3`c_L=>N8?+oYQ>}w$%GHC#0ZEh6y}bVf3p;^K=;OQ081EDgafC7cI89fipm>r< zbF8HM0$Zt?fLX~+CZ-=Xleo9jr=iN&j!_^4`Ez5ClWvD{unNzHiCY(E{L=K8^p5t0aA6#Jnf zePPHRpX}`<^@V$xJXGK$HR#h@Y;iBfK2aO>=J@nl`z1dQtA1Bu!SO^-Wv#-)-N)2Y z4>(ks*fRF1;40@xFMdgyf2Z2NgpoE*rO}XLz_1sqep80M1R~1i^c@vuu@X;6nco?w zkTMUQZAh7032L%s=XL_EY$lM&9rtc;n%_Kk9{&{ruY|{XI)Wf9JuN%$XxX}Xb5qZ~ z_ujp0OHb3>1uZ-8y|>4LsolNpHoa@vyXeweFI~{IbIa{_Z0c#cd)xNids`?ML%Ebh zZ)s74nbIe_9vJZ8%><#zh7~?>jv-}=qrw+rwlK2cYCw1y3Kzo5@U4>YGTaXcFT<14@G?9obhR|33~$~*NSWd= zGCQ|z-x}h`bl-jNrk=ugXnE6ZjBt}hyy0#H2&F8!?B8Nwndty_onP-3ir9lng6S3s zY=6nmU+32^%6A&ROfGJ)z*S8Uj%aU-a9vnR@qUxp)iRX$2g992AP#4V{?kUXI3T{d z%qpw@6+W{!F$_*U>l!&LV*Lz!vJWetZr8nY!=!GocWNN`r?;F;=#tZJZyw`?67^agF#;k!suhSKQ@^Hwrn z5x#;f>Go{JbLrmzR1f4a*T8Mo<RLhdnWhZrE-Xz}c6VGFGCK(=WYb#$-o;zaAP^tGE#T(-o#7z~T)h*mgsWCumMZdJ-5V z%T8_bLIK;Vl^JTKe;)|eLo2ss2)-i!a`=8f{;lmtk)@ZR>Y}V_xGllTq6?*UG>E}Z zL)8^ORxJ%RjyE>C(2~u;2471Wgh<3}=7##rfazkF44%@Vx{`5c*^r@(v$h_!A@*zuHaFKKRxDV zE>GAyztN9b!riiswh0t5DtA~a*S+oS{_50i*Kr-O;MH_t%(^ILM6{6WARqwpse*j5 zPQDO#BVRl~YaNm$7XB#<7X6U!t6#48+IRl|nalj-f@s$eL^?PG*4HZ_dz9jUFx)2} zCJnYYYl*ldx_KGVO}+a^B+LcAthB& zF|A$WC*H@mUz8HCnhO|IX?`TN5XUMX8NsdMcLN?=(U3yfAd6Jb%uvWp=#{2V)nADQ zQ6J69ssSkhJsEja{rq-GQ>qU53*b%C?`Fm3gtkohDRXpqmu@2jo)~``ql}Fumsax7 z*bU9LJkBKDRi7u5YH$^Id+eAaS#Je`M9ry^n|oJ9=eZfHQ2v)&N~$Gzp-m-ajXvJv zrwX0!@o?5tQFM~GGkYb-_;{%M-0odOm%x%vNahZ3KO1f zxdjEkD*_=}V&_)Bz->JS#E$FLm4t?FT(d6aUp1~<*?Ks)aLKf}ZAWLLsM4H2de%87M1Kv=%Ok5Rbyjl~2KI6E5d<>dnpdp>?_YFJ>e&8qUM2G_JeleKb&m?ljsI8@gOic2v_NOGChhF@Qo|<_}pIz z?ak6g9X$SIdX1kXyZi?&Wa#;)K+8Z$ogcf<*FE8Z_pwScT$VneNGXCM_qQWX1bI-I zJ4J->2KS_et{3Y4+Yt!DHQ5^p=x5pU#21dmvtoi0e7$G@p*W(_Dfsj^B5HXLwBc1U z4MIxB)+*RbCBv3q&9wED0ymCNE8p#F@8jkGpxfXVzX$W-9YR!3(A|lE4N3( z=H~&-6WwS6n_^wED8#REW3je$Y#TLb6sOKtuJ(C(o49F*B0hLm#$L@Pi$c}I^f})| zHV}GSoqn2x!z^#ZBYyTWxx&@0WkwE~7(nO~ZT0V4xGNOIDN|F5a>_-m|ZME zuL3$vd+hti80xgi?2MTxpzsqI2pBfuTlT2m-*a60 z>boq)?_ceMuezK9buaph9$`sdkv znGB#rUld~CzsczTx8AyI+g8+Bw<=_Rzy9V&9rB+Z+I1ZH;igcVK>zK$;3>%iMzFm|^*b5p;-C96tO$pTS^u9P9w>y6aTyZ0OVcQt zSGUgR7Xh0$iGB6cTH5^ik8m5(?ecq*SSbRe@L(s;JB+i^`7vm(b<_Vg)g1 z)W1geiqb3sYglGzI;wF{or6kWuQ z)GjS?Ee|{ zxOcm36;7k~AA))mEBXt{eWo%~?w9KMOO^Y)`w6BV8f(lQ!(|{fkeA|AGXrzVOn}_{ z`Gt|(kfvc~F|~m@kn~pirt>%tjXobd*5*@ognqRteUD#(Ss(@h5T%QtC)GQJc6D9- zm7QxOx>;ic;2JDxK z2+L`Q=~w)uRmz7a`DgA+Adn6_R|pM%8(c*gv>SQ&QA1n8#G$R13r$tj*ZPa;7ua*H zonY|wCu|f}MKbE)st!DQel8Em-G5s_J#Q5h`&H5Kt<|Sb1Qh~(xy-veZ|2c zpE3e#quMXq8mlagRqVO66XQ)N0eNPQZt@q<_VP}D0h$*u>T;VpKw-ee9_Es~hMLI= zm>Dgnh;Bf@2erOhh?k6Z5OY?U@SuT~uS_Sw4$DuW5VEQ%)U70M*{_b4CLL6lh`&Y_ z&EGc^er0|dtsb>jr;*uDa=~X~CtR5<$<>XIg|EuQ?P-hRx13Mz^_TAObGQ0SmCP0o zKT2Z0FjnCt_Sh;zAD@7dlB(`-^i1XfZ{%x|k% z%bGNQB~JqZn}gLaoz&b+q)m0I_2T#eT&YGKUo|ME461=lfo@VTv$^RdCO6IGcfh7AtTB_kPAL>L=pqFe}%_ zV%z?#e|oyQjC41Cg_1q?p22k4VHS&sP>$@XdL|NISWp{u_U!SmhsB~Jmm-1jWZAxy z!mQkD7)@ScmxnD0H1PHDcqaUSzhosv?ze9!38c=_%+7~$WG6}UZ_{-nqD`HrFLa;B zqlQdUweCH+6USdLs$QSIDzn9Eci%Bilk1P!ib@tS&aFmhHWhQeIn*V={Tve917P*= zP{GP|Sm-8LPXO~hj(A_E-3UcR-%fZygauPcnZwMFXJdRpFcN0{Zp2X+1QYG?AYZ1@ zg4Dx6$Z+rghG%ZX7k_Hg!H!tFsb}Z5y+0u-U`P1NAj5N-A{i!+lul&zY;eg(^7+P) z0J%@N5CeM>PU-M~Q7=(Y#&En^CVu+sKz^>hU6;WQB*@mEHEhj>fVu^2gaLisjofAi zOi!b8Q6aXG;&4koG6zY2yI+p96s{Tho-D_?>h@RiqFXP_IcKe(I$JFN)HQy_dOcm# zr?gxvH~2YSNO@(ptE`T7e#R2LozW%x@yj~=q78l}g}eMJME=V0q2NW@#g+q-z9cdR zA1Rq*BB7mGJi~GeVcLgL?Pc%YL@DXvEl+9c_QtHUnV4008Ywd$;p}oBw9ZvB8TzK( z29d1JH4TS)r6hD~`*b&-a=(>y)9V|0tylh^mrzx3!K1beAR8f@e0OPkygZm z4c_W>OlA|=vb@G2BIjF3?FA!*vd;bzUh#@ve=(;0aW#(ng-w11Gb$_U!c1!ZhMFT; z!H2;Y!oPR%!`>R*yHUa1>}Ng#MkO(7(!vp37fld?`^JD?SFU5}%kO!oKt@L9>9rKv2!U5H(b)MLE-A zqv8F3w4d%r!3RGe-9_ANumvz`V6moGGuCw?{y}ie6Z02z`uVhyr2E4w*tWp>Obk#g zhE#kZs_F^i?K{Y`%}2#%DPYX2wzVaHn#lKN@QXk0Qfu&kgp#eH{gttKRi?)cu0kqE zsgC1TjT|_kaPbtt1OgsxtsPQe87H-%#uI2oTuJ>wHPavJ->_ zb$dV}R^@EJh1-MWt1`TYYz2O$6I}2JM{qad%RjZaV8psDTQ~J=+q2~-Wb=>k6WQ>O z%!?bo-Zp&L>=UIHd7C!2xTC#Z*R4v@`uE01wj({R}B7QhCJb@8_lGNRW&%eWBq zIb8ALKDV8e!MSPc;5iIHR|lAmJA$06>9rQ91%peG@BCD=#n*IqqgeQffxt_E zz!CE!1mcPXTO1(pl3xVyzQ7q#oLj{^T1yGcM@=||6sP72I5%t!B(DNm`6ccg472oq z+_x!kX7)x0dcAQt0*X*cC6T5trUF6xlb9BHWcVw19+{HsOuyn9!=Kci_v+qQ*dw|U zo*tR%GEvDSG^wYF8uzI#?N1^u^4(Lg4G&+xq4?{0`<9g(nYY%{WbqlkFBW>FDevvm zX}B!@s(X7la%%f5o2TvbuMqpUgi>?Fh-)`(zU#EW9QmdGWZ#1ss59|4u&@J#qH_dx zmqf7pDtZXKo}uxE;&T4y(w$o&s~e?l)@f^-`SUdkxwV8cc5JJ=RzaLNW?@LDr52>d z7RrJLv223Nh%;obD+(`zEAr^&zH+^==;*nj0I}0TbsCc;2#`7&51ydq&&@GH-#vU| zRG#9g(pTZ$ZQI&H|r#N=pP!!22>W!MN?^~^lyTj347{(&Ffi(rn51U`Uf z|2Ilse8g7~O2oOXwc-M(h;It_6Di6h=C1`i zdC316PGI2qrm+Nbs>@p|bh_TxqW$Nf7%Z~#Tdmv~ zp9i~O`Zu8b>7Q3U?I)w$N?#q&nHC$8IGX$d*cG{Qc9`V2ieN7Y>T2Entw(u?U!S^3 z@QZR%C@XryacjwcC@?vNT9}Kv2c|H^#3z&3IZQUM!=xW2q)0t!>6`WhLmMJcZ&uKw`p#qpEvX}{7J;B?h?Oh;+pg$Etf-!o-xl)`Zmv9}()4x#OU*Zr z`PCRzoTBlt5@q?yrgurB_DuCv3}T;UP;giCWQd1t+u@FnnG@ExHgM) z8Blz;1Pw?CE7B#VfT;r*mvJZMJsS8eHrBxbh009Z#_JGlUNT&R=YSrw z#^{^myRldh!T%_V=}Twv(UM{|3Fw~cu#3^oEFB4iDwbB@mtjXDJq7VLnXoQH_$5Vg zBq^R~qYt3}w}**8&zE;2`9`3q<(ohJ^5Lw@Y|HgRB!y1}CMlb9X`4~TC-bpA6X$-W zHKhD*VM=gparffVVPRU;q1SkE|4?7s6b|2bm|^=O35=kgLv zJsP#1!hkp~Acg=o(n8@f_FG{~g~$Q6R|mCf)qn!qy21oOoe~O%CbY-jdiCNCvd*1L zKa1dEgP1YxQ=6$FhiQ9Otmo;=*-i{XW(wwCv=%FfwbbFO#Qelh7*-g#R5_yT*zCIp zr}*+dq2Mxw1Ph0G%_ar z(+aDlW^hncT^txWft9(QDSio#CbF2S<0_Jm)H;MNgUwNgamUlXPWHL^)q&yw_kHp^ z65!X7#A*%ilFN8tfUM(ZKM`uiPAXQUlgT0Cv{1#E!>l@vNojKZ5Y?lgps;kB-Qra& zT8qKoF4>wLxP z!H8+_=nF!&9HwWm5CCV0sejKJgLuL($^WU&E$q2-@^C#E&T@H6vvRU2JQ-KrfRGgS(jtCx@EbB7ipPb{63LCQx7?&`h^sCVl&7jWG$u zAb-va@W$v^cI-RtHa6fG)FFfV0-u}A9ze&|{*dSxep90nFUpcWa&v7+NXiK&Mh8X` z8Akos$?P3B%Uwc@l}m~s^I%IYKC;L3ecfFu4m-*ZWKok%fkS#23xrpq6{G>>6>MTp z_z1$1IiiyG#dv%*Ubu+GEKk1~8W2;dfG9dlcLbKXs8}w2KS<)E1K8Z<1IQz$z7+@gV0al7lz|>iPlENDFOKaRE?k4s)1`fTj`U|Knl;~fMH zgLm|4iDnVH85+2L)?S#u(^JGVPvhxH;~DE~Zw3E#70pK$mB=lysG^a@7^@$Cik}XK zlwxjGXI#-toa0N*eP`Mb5V#LQH2*WULeZR^Ev5X~Rw$aZftP~;#9+RdIe6=Ag=kX+ z_(ATBU;NST1;1p!pOQ2+;FkIie#)18jrhd;?dCi(Az4XYfIdIrl%LY;Ct&eR7+C)D zguguLvnRdwut+|8BLXH)6y#}39cn94zy<>P% z)6EM!)o`k=qAUDWspK_y0m=n1k%MUD3(ArUYi%YX(yX{vcxnQPsX~85)YVW%`-`s; z`l{`=Asa?9Q`Tt#S@tq}>f#z7&grpn)SIDk*>$!QT?Z!P%#9yIL@)33>^NO z7sNAc*fvqpS4lJ|As@3;_tRrUiOs%otv^3Jw<#z{fF)L3VBxc~4{#f0Y(eIyle%K< z6?g!GIWbU@GZP`H^jqZLi64=>19pfu{Wtij>-?;ukC(^`7TD;7u;W@){Zou$ct0Pm zGfU?-PJN1SLK}tk#fq2cMA`aw)tZS3CSJ8qcM{c1URR4^%UPjC*|~RxY`XD0 z`#j)I$%WZ^Wtzo9YFcrS*Y!VW+MvY?Nj z>r~9g7}KUAf_Xt%XAqps)~UlzGDJ^9pFZTA*rI?bAqK?K#7<_=8kFU?5&#aAGVqO6 zEggj-jQ0~sNXgS>joj`EQ-;iSv9i?()X}vKohNiX)f*0RMKw~6yAI!)MFZZl!Vf%T!JWt=Yw9d94h}KDHOznXZYN?6|y1Ox@CjRCZNBakWtB{ zOS8!-Py4iJuZHP`Ig9gCw0BAkx$qxM?>^JIY2tP4hfG1sXAZk~DwkRS7PbgsdvDgy_FiFA z48r+^4f-S7d+s_h5oXXJBSPFT%aW>h1{VcFClFi{D(73{n)!x2&VvD2?pg*n+{ z#Z1J+lWc6`g-PXlO`fvLxlV|aYtP_I51TE#yq?jv$_%dxZdE?m3V(8*9_^8DBN1im ziTZ?tNiKK99I%f6^g02`W93bTw;SxjQb;j`tL~552Y7^cK+Yo>rgI_-6Vb3@_rS`9wKkjYk9#}OV66j08CEMXhjV(fjnj@-^2|p7J=`eg#8lCn{H$xD&*RmZ zXEEWGp*uFzMRA~Q5kMVY&P4eg&Xu(W}pm z$k~4VZk0T~K5{l5Uju_n4v5Tk?WVi8^z=mM*DMqlF2SW9TKx|)7k8eV$wLdALMtJh z71tvG0dU#F(LZY}sH`5Llj6)w$JuX+$0A+1)v! z{brNk_;e1xM_Bdf_7hAXrTsc!;S%MOTEzPT7slq|jxepm7O4MNVT(<;ow4ScO5RMq z&1a{$-BUV+gI~z{Jtp>hig}AwE}#gpcPc+eFAiJp%JW|cKCx-CK025atdDaKA(H5? zKD1CVqliNkf;G7@8L-4sdv1S8|I2@gG6XV~XZWBpZ}=5i?T2fSs86M@bT~)|{G~p} z_!5Po(1AhaWB++|ny;MWD<-bAQ+#C5v*9{As9=8&hwJM>5De z_rafT2+ZV5G2mC*;8lEU4f1s3coR!u(e0Ao_D#!Azbl4=xYGdRP_IfyA(<8XH;M(k z8+A0|&Ch_|mfNWsoj-n0ksaVV2#J<+4_7Wp*=k2|!UQOoMv@Bqo&NnvG6AOnxEs8l$Ow)Q=X! z1zRy1dSuZPI{fGj+0`X{X{6;NvRA#{9`uFRL|N18lO=bNZ#fj+Ngmr3F0LPRkeQf*LWPVg(+r<%%t-PS(2vE~$isrpR|q2=zH@F1&vD%{4Fkttj8*cS37y8QlxUZ%;_!H#@nvWNhe$;^27 zB}#n7+8&8;adiIaaQ%oMy{2%b9KfV=uptzNc+1d3%=&erWKeV@_RAWH-Rlew4~3z{ zyJT8TxNpy@*udl4(wgyON)l+zXZIJD-p7{Wcj!xXavVFG^5kMjb23K(>+?H74KIWd zCzn<6ZjP4wQ>60N^rQ7C&tH)I0!2BA9Yf3b$M|uGn=LyYg-NKfZr;N zXD$hi=@&Y?Y%Hxd7E=*r+fQHZB4nu8M6d27&0$MOxe-Ph+DHt z7O^)RZSGUy?oi^E7AVAdvL;?p%W;bnc?o~(G{iK zJvwYJ<1=KBus$F!a^)sacYE+TwJyo)rYZzfMWs1T)SF{%tA)PO8EPVgO~2!ajW8Yp zH(?c*7zY?c%TmE&vGTsC=3%Qb5!fG86Jq-YYvO+QBd__!dwZ@m;SeMSun}Ur9YfsO zv`!!x>fA+PO$N>EfO;XM7_eL~LjuVk6jNBg7qQx)v0XUr23R0$AJ9_`nh1a(3|HrB z*oM&rF4lnS2{jB{PU)|)E1l$dUxP$vBl5=usr$1LNF;Ue7JpOjst+mh`vP}|Kwg=} zh=PjzLAAx65DXu4wOHI-j?%(U;`t=& z$hlD*_2=V-7+J&lHwH4Z)>rGJvSK0ntY#wj(v(9c?fBpvNjv`fr&c;y8m{o#O}jFA z4dRuMBOPf>Cc8n>l3k7*D8>mA8KUkqWnvtj{AWrjiz5{djOJtV%je=z;u$j8*a@Ld z8AczJ(`x>o;qb15Ysc*nXi>=W(GX70J{lbY749(@m#iQ21@Tk~pr3wFPeHqS+!;2q z@d7#^dIfFoEYYCu+uBkBd@a$PCiVhT?Hqdv{nJFcE`dRh7Bi|_5~^HA$2u9mi7gX z9LFOJhPqpOx?5XumDi@6z}|-gYFC=8OYQHppbtov`o%4NISiV`g)JkkwB`ZMKrBj> z$11jodk-^A`m_g+(Y2{!=<=I1ueKlc;&Q}lZr;)KXxfUod(QpEK6QUguC^|hp0Exo zPb8_obiFzyTa|n*N#BFQLa4@`Kc$zwe)$uAE_tVV{BqK=owVy#LK?nG&WI~-_l;}( zmFs!bA#l0GgoV+EPFU)nlDb{w1jU# z`v%Gf9|MtXJ5B{bVV`f53tZik%211h_n6R5@>N&k8$dIkX#miB?2b99sPGC z1=lcyw)3y@SP3R_t(dAbkn&CintTIEIDo^_;?)OKu#e~#0}7JjrKH`gVBb$=!T-eR z8MK5$ugp<|2WPc}XH(GZDEqJtJX4FYAmK}u%Va>$1d!l@NhDu2n=Jz3q{l&$Wv(xm zE9}`{RK}gSXLZP7=bpu$^~?W>9r%NNz`1(@etCI*iQPB*E8XMl=EleTm4DAB{+E5) zukX$!({i0s?c_h4?a^tgwJ+JG=PmOypY#`z8Aoc!!P_*rmJisb^^Z%*z;!kBhW>BxjUA_a!y)Et(1>D5=Bx8) z0LP)005j>q;P|x>{owdpZ=8f^jeCK)P0A58y_K~ivya@uSUA4`WJ5(X{#X1MJEB?s*I2v^4#>e&@+71k>K_|Q!rLLzup1&@j5olT2p zUGS_w{U0$wXFHm+?&Kj@l{3vx*h&TwU-pe{p$|i#D8v5kodS#D(EpJE`wbDW`^_Tk z|9xXP$K?7MHp7%=f7_cL8pyCUya*G>0)rXHcKHT5HimfrVvUW+1TN|b#9&ghpZmOo zoy3f~9sU%IT2Y4`z!*Q1z+QWlj_hL01G;@Z$x`<$lg?g_S~B&0%;bhf4_?j~tGX1S ze06#`MTi=Fkjph3Sp$|&W*eFC;2+mx^GXy@hL5 zdOXNgO!2GM%zw8c?^Kce?x)B{@f1!s_C9>(z4rcAy{GydenmW}o?M5{hyL3RC`#yn zEPGLunb@mO`tk7k*ZBI?zF`f^{a`!7w8leze4B67Xv{hTN<8!2j7&m=(IiCR zP@iNeIdTQiUZET8Hn6`pQ0HJl=kg@(pv%kagv`-m47(NW+;%Jjnppq~vUf&lP)4d@ zlAsH4fC@)s$)&#l)U^1e$(7YW%h+Ur_E7;+01zMnU|F!y&s!yUDL~4cE&~#Iu0;39 z!a-*cu-t0EvMY$M#wK(5)K)(>xrkptC%G&9uC_b+g$wZ5E#y*8w$~)vYQLsQ(+mO) z7gu*}>DsV$Lw;F)a`t%rMl@knFJ!lHvyI6m0Y+qcmLS|5cE*!M6nu;>EYau{=sCY3 z>*a6fLO1hYHgE=z6{$+Qi9Q3+fbyeU+iXKlV|tDr%Bt?pXAwGWEj^^vX( zT^nBCurWXTj_h64##I~pk|niI6-wt6{Hg%hw#+vU-D#TERDLh?u`#ksOMLycz79K{ z4g*dA4cJ7Y$At2CDHQ-z?bCKnx^L{2@II-jhS)3-awm;xM*tGw)gE!6RW@%OaF;2q z6V$~R-N3XGn{N=Iv1$grP@0JI-XHRG_QS70mtfmOoz>M-ezB`O;+HP<!3cD{8z(l=t!*{!p@B6e8L(3w5V-)L~ZpSGH8j2ZTyNijMI!V z%-J)|}7{*uHjyg8*m;mI}jzy_pvyEzk* z31howfLGfD0K=sAcp21z>;?A+kZ_jvjC7tDL82h(JFfVRHD|d_fsE}Y~WWc>08|zKMRf#wHffz z)3H8cgxaRzP=hUP2q#g@^-Tjp2>VvVKSj7$0fe-|WE#8}M5P8uY;aiFEvL+u6&{x8 za?{os4||8_6j|r?s*`PGpbV@ox;Zi=A|VW)U|SgnOA1OUJ^H)ySbbw)Q^m9n?vB)b zgFD3MUdrWm_rc!Ksjo6?vg9u56$)s~YYM$0U`IM;@0;t;Bsw#2YQ#Bzc>w2(JpSb* z-wJP_95t|3=$1@I@AIESLjRD@&yhLN!aB*d+jenD3edA@49#^EvMU_DkWc?@guGi1Qj$yZWp53TvK@Jvg z8Yz_?6tGH69!p0jq%VrGs!Fb^@Dn%}VataR6T9#vOc#)%Y+1^}3Zz6u@&pUqTF;rD zV#dvca$N(;)o-5?qiQCXt?`5M9^Uh|3VV6vG8r#1VR{Y@_zl&j6^Bcd|?Aua-tw| zNcj?r!EvCKjii7a7r-inR97heF6i(x$T>pNOg1iAX|(}Swgwbn>uS=c_a#{u`eon> zxVu4iuQM>g?eg>7dYQ4#kaCttV|+-;=Awo;&0L418!3os%p~t-CXjb4x1D>i+ZG*_ zwD<&ZGl%OfTQd#LCRZ>5jb0vRVgeDI%h0iWlKD(7w1YtMq=~nsXHnb5iqPW?VTBZ2 zETX1rMGIjaPGHi-QW%`02UT{amLW0_(Hw@(;gkAhrfNyCe&@&aj(@fC($w6SSs~?Lj3X z+6_obU>XQ>KW2Re!FWIdf0NMU4=t-r@xr4x3&6x9&I;f1 z6CMaWb<$StC$xp@CirVQybq3n0Wy-Kc6bnx&(01U9?WXZ^lFDQA}x;3dSmB@!-&nn zWN+jAkpHZ>wPlf8gVIjuPL3kj9G`pu@=pvmgq!tgeh~k!-1a(5aP%08x%2hM?I_VH zG3%kw`FNCwLn$0i!cn59_h&_a(q_O8NoTjPr9~w*D?Pzh-yBZ{91@<3mzk%vAr2D_ zE3982{2BhRcb11UcM6i|y0rgv)@id}<2X2FMZIyBxAwo<4(=>v9je@Xwm*B}IRkvj z`*o@r&{O+hR7ihK%}7p-&O|!xLC3&wzJX<}LntW4LjEg8;W^Am;4r{iDKxFWc6URaHkyt2+#1WHkxBs8*cRJH{PhGv?|~`l{9WlO&7(Kp>c(QqCIV63AW? zWlv8br~ud8ZX()?g=q`Ni0Tk~2|KF5Su|y+r#iV&=Y#Bd^mC)fMFtR9m1n1k;!vW`+ReBBgvC&~5qIW4AN_L#uV85# zCCDq6Tk?$#(V*vWh_0i~-)Lql4cq-_c?sZ{h|91_%H1%za4cI*AcUzxKd#XJI{;hB zUcX7P)n&gil{-`ub6fp5V%v$Ci_dyO%~^i#+M-vMetk@A)WX}Td*PVtmtMyg6}b(s zo_0*E)CC-`%hLZhmc;T(!Q`_}!R)F_FKXlY>bZWxN(Ejm?nLMqG^(Uy)(JYc+>a}~ zI#b86UMcjgxwvn?%9f&EGBm@qz}>_?WGdxZQlD6wJ(dkhDLbp(MKxc9<7n76$;23IlPU{ zU*>Pz;b;D8t4C1e)6Zvtfyj7C?!yoys0`JgWab3vfrMiFAd#*@KocUm!(Xt<&+hgY z3FfgtuOWvlk$lQ9vIzl-h!;?6{M_UYe?GZmByYhmi542a?#JHF9kE3lITu!>Z)1yD zydxZOl(2p(dV-~XDoUr-7TYL`YV>Qott*XcbkrS%MT2c^K7}lr#zk&*l+ziK4XfrK zr}^w`w^8gV-(Bj_zwmm_q7{w2l#-zk+lkTF;B>$& zGTVDpxA0mYarY67fJZsEysr~ndvw2q*%(mq463^qVYglF)^HOK(S11oQ%`jFUcG(u zy|>2@PCxc8fg}7nHuUEzX(uU4i~VZ`WCTkV?hXA`CpvC}o%jo13c0gfVj3 zr0dwN4U4IJe-_K*IRnfV%!(IcasuPIkhj5%+j24{x&e*#j+~&Dx%ox_?H8*W%udoXV%Kq`CC# zLOq^14gB4uzf*~SlJnC~YQ7O;;?w_9J#eH#y51Tl@0GokI`9R{Ev z6CwjlU&`H9e?E5$miqIt8P$U}uK@Y(V|dR^qY4c#&>X34c`#!NHW4ND5j)^aIm*p5 zc1eIW6j`%Y@*r&HiORWbJ!mNUd^Ne>f+_ZH==A}R6r;iTOUQs(nD%~l^cVeQ;4=r^)9&}xi;3PgoAnv5v%?x18GAh!GVE^fvwzu7y3CJX?{1?*Er$74W?t~jVVK;5XE}j=+2@CzKz(&$`hnBT-h9n> z>eh40#7sz$Go~`z@>85jZ_iI%HOE(XFFHeRg=$$DLaI+^mS!xrg_xGQ8!`KFvzocR zgZ{Yd6*{eH3h?2sXTGU4fl!j;Qa1)$a_(j>^OKfvztJFQBEQr1lmorH=O|Tc)Dm## z?%~_2-ENh8tui>ezvlaFUZ$I0w>!?6BYS+@ zCDT{i_K@+!#Prd@Pm??hNXsZOAiwuhd(;?l?Y#sPXx@y0uEIV3c*i3c;a9+XjA)3= z#{``wVgNAUq+D+LMDG*|%J~%>G3@fP5S3`H9&<8S3~LZV;>%z|eDnarjc)jg!?xQ{ zL~)*0{EniC8Wt>xT6UB-v*i$8BS}|=?|~Lm0w1&&XKkT(?TdW*w&D(khKjqDWjr{G zZs|BgLIC=49=?)hDpDJIT97%Ebkx|cAv)?tp?c1`+OE)3L-g^}nmVGsYU;@D6{jrw zEs~q)G>}|Mz6SM+$x|;yJo|guReBfuT#?C1&aThIXZvAv*;l-N_B|c4-v#L=7)W!( zK!b!QOqe*b60mUPC;Z9*a51_BYFEA)s3n=Z2sq|V0cLj%IjzIO?5%_PR=T6Y5Fhs| z-2=om(h#o;FwqaML%@W#Q!-P51IGehRe$NvdxBjRx`+an$VUNyN@sAWPPU5msK`&5 zGR3#1-%yksi4s~(yqEtQ#hJa#EQbZ8<_(k1<=Y$rBoA0;B4VF@OpoBggehcZ>r|u9?H1!oi9DcCbmc*T`xUGPa1otn8n}fLq3GIQd@2T z@p>TK#Ffesd$ImLJHhANMrmQN6HUka3bz;afes24ZZ}s?2l1KPiM17nmffc`%H=4U z#<|OTI{g(2*;sX6#CTueu%dAX3+*f11ASrkz&F=x1$+Ug!K|dL525QL{5u**joEB-78~w5cD70TkEKp257zi+iUY1{JwZ2t_({ z^Y&Qf~Og&_(3hiC{Xi$OW^7s4ZC4No^ zYK|%Y5W2s?6SLBKz9Bpydq#;PjgB;BW&7q5FbckGdbu za2F2I0sDx7Obpz^hA&=7z0Vtb2<~q6)kKm$fJ1O+SdB1g8JOMA#5KAyowbiglZ+6| zryilSoppm=?+`35R-lS=RqZc21>NC%#Frc&55>YBWb}3$F^i@(NmqnvMdau60|9o`@xtB{-Q$UhW~c$+}uLM?A7;d+PZD~))6iD?&xXRc}L6E&6}Hg z?!EW!U0ZsZ<}PU2dGEbFCgP>2-nHyqbm^^^E@;}h<@P%^^)%hRZTs%MEtK1~ee>PB zZ{Jc9^1J1>Z9Th6pX_>|^g;OSt*~`lc5dHvcgtpi*WYpP_NMvGbLa72)@)07tf%K* zBWrZTi0gK5dUO0^h%io!eb~?8Vp|bLsw4tG_xEgJP`BTE+nrlB_cY%zf+x3c*|m9R z@q;0+!IV25xNUcL_m-WZ+Awj@ZCp1zuw%oSVI{BG z+_Q7bmhf_5Xsk9+_GObJ%Kj6f>{`sBs(m>@;$??>on`suN1?0~#%-(QV`Adugi3Zq z#NQU`S2zp}3OV(1WEoEXi=Cw5s;0L>s@+6{USyk~Os>semHvL=ZYvHxAJm;9Rq<}7 zq+H6Q8YFFmcrohzw4b>oT&?ky+M6L)MebihstUrzO@|RijMoTuyPT%7pu=*?mw?-{ z5Oi_W7Z3fIJyPT?L~yNLTa4HQX`J#4Lp91EGeIz)=K&5q(ljCMv+5F=i+UZvXG?{~ zKynD_k-nd3k>S`LAmTgSHm}Rw}{(ycO9`ti3d0)-GqC(iiNMe zn0@V5JCZgNL#zxUktLyC^lr*IgDXj1ec}D*JdkM2Bu7 zg{8CPhuFRWKsUg8G0`$-%ek3-dMT03#dOtmW4HcyOZ}*2&A!G}6Y197*Xoz1Zq6xz ziI6FkwjzXZpKyo5BdJ3PPzE>Ukt<16kzmM>yNOT1=2+C$T&wI|l1_hp>Yh;Ke_Fae zt(xL1=lSaw`O3@U-!V%B9X41AZs8P+OxU1aj)QAa`js&8UA02ZK9{eXLPvM^81(-+ z%n=~IGOZ^3DxMSaZKEr>wTs(ZTfZ^u@y(BS`=9$FkLU8V+5enazPZ+pX<3+wu5OKQ zyN1U_^%OsYZvs&)UoSf@{|$db>b^e$uh&|xs`|0{O%3$^Ujh)T*jsE>X zP;S<5teli9R#3RZHmOH{8`x6RE!u8OXE4W6a?uDhW@1IVYXFK0UwMr=dCN{Q=F%*x zgT^ZW+MBB*P?9Hk$wzYO`0i%EEOme3j`5x)LSV=m`%%OLS;aja&U|<=N3>vd zaAUYw-Q2_GGHswLm~XM9_P-XvWVb<1`9`@n&Oa*P%YuXRBnkum%wK>h_-lTW)Y$ES zXFPmZ1lug(r*-G3pNZPyc8Z07CWvLL9`zS!WLwRqT*xQZo(U$eKyx6?;j(0AOvykr zgEf8*u?08+M;{Z6wA%cY9Dc+AEh8Sg5I~px3MISrhO9~JPtgGmj+vsKcQ*GQL#n!( z#j_tLLW>^{*5O~B9_+CAk*-N_{Jf-~nj!eMdDQp@-JSI1`a!zRPm(?v_o|)&qCWi_pzK|w?R9^O zxezik|x^MKVW}*nbY4oz|>&9GQY|`eKApZ#6|?E|5%wxg_v2^p1Z%>k5%FT zJ(XRhZ8Oxn5v=Ib!LW1MiKb$mtYGRa-?F|K9InkZtDMuV`>4e!8m%1bwqRmF>_ZC6 z`AfnO!g%(Crd+4o{;-e5?c}@q$+#3$~$&UbSIGTevCtq)u zQ~NIoduxvd{6_K?NA!*e5aD2;0l(IdE>3CZpNEW{uqetTTt(xkwZgGnjl-GMqHF|` zJ}NxCo|e-sQ%WEfX^ zYz~aJSGZB_hteKPkK-yk5Aqh2`5~fw3aOW+pSNG&>+N`|#>6=8d4Oh4`U<#ELF5-x za9XcoicahF3;Tqdur?=Z8vcC}Vn}5)=rR7WdfXdJV+k5$MK{J3v+>0<936U@#nzmc zrLUJ@rkER4G31EfA!bfd2pKee9`)-%cXah>_Y@u-d|{Zzz{O%Xq?_E&-#few9h zslTYrn9-sz#bG|@|A<0Vq+rU&1iH7qgx7DE9K1*xmP8ql2 zg8i^lD2(V;Ng*6(FQdVcMaHd!oM6O4nWBji@ntY&$nHsd2VPQFpj0o~{<)AmL(*&) zS#3Q>=b(#<(;5cjzKH>pPze%>IloWg*#nmG(9p}6tyi|XXTOZXn(nvvwRYJm3c|R3 z*zlA4F5m`m`41F8jH|Q~_C-LCg`D8u@ZkE=x%cS_aZS%pIJ^i66~6w51jl%3+f`cC6RxvcV|UJ}nKzB*SaqHfF-NM)!eT_t5yi-@-y z`)k;pHdw}Tlo2MU9Bd%mC@kXEhgab7o6}z7(1qXZb2P4VN1+R6)BNkFYkiFE@pJ8p zFgPRA&!Fb5y<^S^YKjZ9 zn@)okz$5cMidgnXvHG<8&|CiZT-Q=r3q+{JVUaanM-r^9rtxyz*s_QZ_Q1 zu-#-@;uV5|ibH{~Lu7Esmth#jCSOThV(>kOYWExa2o3K37=?wdJL5HU>-l{;11V|;Cxu$_#z?+IT6>#-pxP+A zlex%~^HQ&j{_uJO&oafZeIH)oOX8Uo1K_ByAoW5S^0PpqKLY#BY)Wg1U_^vr@TCEM zIx`YQq$Rg>bgX&}>XNRv#2+p);5b$4Pu?+9ufS@=8q4<$ibVuvv_B{~|MC+7Syf8HaCqA7ED@zmqK z;?I*CP#%$lq(rdp{qUXf-BJ++zFQGMBHKPaxVQ|@wg*trUs)Kt^3L>Vulb<-3g6Me zl^s;&KCzF+zg4}0Ri zgz2fl4Ti0T)tF@`g|9bnZ@xPTzZ=~df8VyW%};8|9%w7_PP@?+&K~x`r}P(>BYqO- zR^0t%?s~dTr+<%ujB~FLLOjQHk6j;%opV!_mn2Vj|7U!%)tUqbmMgbxb=n=DSNn_6 zfZ=%yn(Fj(@F^7*33*vVpH{^$TLT-4`^1LVZ2(#AI?mM`uU%d4vBw@eV9V-$fnIty zHFp^H(#@1f6|3-V9=(5mzCCq|J9$yzE|fJ8JL;sC?1THs{9ricL%W1izFFQW8EER> z`w&vRh)IM>$mhe@zk@ds>|Jdm9Vk(kKBHyyN<2|+f^812Hiia2W*=K(Z-xj2B}aoE zSE1Vljd`RKb%uu}kJ0(N0ulC1_h3*_&Qv=E@GsrECN_BwD$O89z`J7fquzIRpr9eewXiNhusiCJCSQ)kny)9g7iNnVUe-JvUu4q>G=CoP(kRWK`~7`#KK!i+ z!Z~-qVrWR%RNLU@<>)TBU%QM&6_j#j)kfCEI_46^(FQ%Ub)TxyGq_$h()B!*OOHmg zQvK?bZL@JN9CIsb)8-ThRbE!4_fveVuV2VzM?)xV4*y7^giPCv1Xvs9Xkcw*G=V@l zoB>zljtP@4!`5WIAHB<0qN-5hm*<%&?eH2AZS+3spEwy;C9cHn!qbVja^#nmorKr& z_9CU%gezlSH@AZxNVB5zZLnve9&FRVdK7VYQ&)x{6UaFbW`f#f4wRuU1B8SqfL4=8QV-vA&2IIY#*NO8B{^+$S3z7!WP|~VoB{gY(5cHEZO;L zwh2RX`MY%5)<&yvL?s(5!(0@Z-&G245P%ywK%Ai7MN%cax{(4zE z|DpB0!>BKevCTkJSO6Zg+BfVGqe>bf-Bz*$Ef7(6gLb*1EofE>zcz9=BiCijSeZno zZr4#jo}K2ZTGL*HA*nm;bMT1@cI4lT86Zrc? zK)Ol<*0pB)=Bj*;O65(CVt*7aJ$FohL>=5Xf}t@2b2W5hg4~*EwANf#Cy_buOBU?3 zP->D8M7W&LQY8v`xJM&xSDeE$JgBG_t*577 zL^9>wFS4;EPx=5@_jh*->l*tD)iaW4(w)a7ra3waiVxoM?!zb(8r-W|wDe_kxHQKF ze<97^HwL09*CjsT79kn@r#SY!;v3*h*67;1$>cDig-t>Zt_(j?*Psd_!Sw3_7$!C( zl-YfF@5u;Am~4gjuca7q)yXz(ErL+88v43N`TXvTj2-BTtju%PlfcS!1mOG%_}q7e@H) zu-|yz-O0Jc&bSn@@uy~7l-kyNDstPH_-V^}s9!)jnL z8_2sn{m{EhK|t&`T2C6G&5zO$!ZCNc2@GmrUEXC}I?@9eW(bY~s1MTR z;f~sWCPw~4CGOqPhkD$X+zHW(4?o0Ix>1AGW1Nehr$RhBgp&>k6UEaUb{%t}6RjPC zGd(o>GZ6gj5G?krAKA*;?cD|iGxPuG$F4vl@`qAsfwf_gq~opM!p(ueF&ax?Fh%Z$ z8AONRiv*QGcO|xG5@;kq_0^f4r{bWsjowZN7l2Oy;6`=QE>ZnyF753!Uggn|8I}&X zT7Mr8cso;FyJfZ~04O^#xbN(>@gtjXe~@7PcgP6xpTlC?HaO1C9Fyk%7vKj`W`pb@ zeAPnSOpFc?Gn z8xP|H&$BuLiVJ&c(?wZZ0D|^pG&Y8xE|b;a=VfSkCac5UyLJ|g{05l|7F)8J*GHCa z5_`r07I-{4gB9F8n|kipyy@<{Wg}_~XaF}AiRdF8Q6efHR>vi1 zK&2m*C*Xptf6QN-S(Zi9)5evMMKy<-8e9zU3);cA} zM8p|cl-Qbb|Yv{4%S?Z~VTsBvY0eZwi0#95<&t&TYQi`{IKrLBSN zXfDJ0&t)oW+%;&;r=%y}*owb)P78h{!cav4gcP6yD8n)t5XB)>5C?(iUFhq!vs%yCW^#B02HLBoDD{tiCV@9`y_XHdR z04jG&pXB)q^-_UwILW<$-M{9nRwhp;ef`I1W7%Lp8FkW*G7&oV;KXTgf`g}^Bn_-Y z37EWE026gYHtrSwXv=H?Kc=(?MrMaLuOR$z+$J{x@z9^uJjzaI*=FbnJE#lD^>-OC zQbu@PXKv=VvPYKtSkbv{GFu$mJjK4UEEu{jgF*vFzbPr9jTd9J<0Al(diM!3mlj6d z6NiK-;g5>P{NTVbhpl07m2HjwG3(4LSpjg}NnZ$290zUJK%8d*`WAi}J&jT-g#+(XSUZ%Yxar1=JoDhSm%(U= zwf+WQc}pCugmJ~gW$qEcZ3J{+7^K7VeknpMQ{lZW5G+kSPY5RMerw+mUb;WfY3(5Q zFPZ-7tC)NMdM_emGqgYUYQU|4^|7v1=S$GO&Y^lxjPD8iU4rik(RJ?lUM?iIs0wya zg7CYCMfm+tJ&s90I*h#&;ndjDwfU)HUIGcinO!YEl~E|4f44^cxg6nr!1bTo*A22q z$#Hhbp1si28ElbJU0B>VL;b4@NK}pg|LnaBeAU-==c{uz`_GXqcUMcHdz!dLu^4`misD|YI+avpQx9l zEwYfoh|J!4iV@)!>eM#q9O72^tUg(yspAFkqABp1{1p=D!!ru17dMkZrN5w(6*XFH zMU75;j|yC>t|`;N)U}X@P>^`=a8R=f)h~|6t6XzXxgNMDs$5}5GZJF3P}lPBQ(Y<`~NuHHmPiC38xs0A!ZGN(D<>Q;C;<7jW zrO!`!1IpSAl+m+3;7h2Thg3ti6FhI{R@mmlEMXOLw6~NJeghfqHifD-6A0BOETW{^ z0I}X?!8CxXQ`Y$g)*_zaEB%DQA%!U8I_OnozD=p}tk%vXa!H?DqaQ7g5QJ)E=94=$ zQ8wfK_1G=;Eq9pE@x;wwSrdu52!)D$3H_eNrFWDE5A@pSFf(Qc1eUpn>Ng*Zzu4fo|dQ#4%XzZq*RX zl}~A0#h~K53V9%9yx+u4wj-dsnq|=pPSXWOe^vY~^~Kx$f_r@Nz1+{ME7Kn1>^I}0 zmLOfo?Cv$urj_oLP#B{vhCWI99E!@xOm-4B&R>_y-uauiLM}guEUU3;J=aT@$A}6P zIq52c3Jx&dpvor>@$`6_-3T$3^+uZgc?lWCk1_?S(&7F!| z&rgF-{!|PQhpRFuT6BDN$d|u^law{7xW6WU172|AM0B{<*l2|oJF4B|ZLCOa=HO%( z?{A3*)0gmEdo;K0FCL3kx~T%B&_=Zz5*JWq5ZoLd=2`8~AUz8$3dv|@0PW;|F7@rZ ze3`DZIVjg6qtL0)Epwmn9yM?Oh+zeG`>MpfATOT$6)63zun;;amq}QN;xA+|6(ch9 zt5S7u(4+ci`x(KiO26Qp2(a}2`1hvxcT4>HLLr{MY?RVuG@vSDCB!n`w3Z%)YFRhA z<3{_8po!k(sDRqo`u zJEH^AJ&FM-Q4Qa^>AA1{^V4% z-|RksT~f6lKKHFt!+zem!naEC4i_%s{KS^f7O;Hb1;d7~hUPLdF$2Z%4faP9 z&L0CC+i0(T!l7|e2)P?Sp@HrBlRJv)8PV+y1*u2#k9#t091OWw1QI7}Wo3LPfB7jX})h z4**=rmd4PF`|K$MI6>#LdPe~Sy}-AQ;1P!>`}=r!EkKuyA0I zq;(@S+%yV=pq;gMcMqEr?#nj)ua9DrQrKYLhDRW#hWIn~%uz$QjQjGNpo-r3CEj4N z{`6FaxFKQ1~@g(@ZvfxvloB^c#SvK;S7j-BJ~WHrIHfGgZunh{)dYbmwT+z#DZ zn!jZuB`Ql7K4lol_&}-wOru{?(FdiX!9hx>%O#*F66j?x<$r?=-|Gk%eA`6r{Wd-N zFQ+c#{wVjyxo=BMeL`D)NukqHm3yzBz0|vPK6lVpo(Z~dX1`}^UW)@-;!E$7jDoic z$^{x;(xu%_r%ImpVceinkq*Uf3i3wW(5&w)0h)n2#WSK*JdwGgIWJ+IVfu5Pq>Sk* z2jMC#C!twRJ7`Pd*ytvCNl+nK@@Dsir*Lprfe-HnFK%G7A_t8S=09&od;2;N#BXqq zvs*&9N|{5gpTmvL+SYI4>JAk6nXq{N)u+V6=%Zo<_4isVgqJY@jAhIst%F5+=8#AW z5eBD(YR+?qF8Nuvf)JY2TeWOtBr?mfzQ584$2f`@PndRu=AamNjrpJ|q)8A_q^#3v z3{F-qVEZsVw=QeHarZUSUBUo9%m6&@zG8R~OG2*|K*@dMDN3Xns4!F9tJ!n~{j01x zm!IXc%s8<%IB^xJLf&__X}X`w3t0*dkH!PY<*Vg*yTe|*SmNZv*kezpeZruXm2Ove z`P!a%zvG|ce)8$G)zFCu3UdRh7s8~U2VCXoFROj|Nfy!nf(Zwo_K&!q%VuU&F~NVP z>@a{FOp4rcpvnbgO}Ow^%x)l@ZKJNq^+DViKn!4K_6FEJ^G^)LH=Ct5gEGMSEFd!vnEO=77P7^&a{&MV z%hWm8rf~Cm<2Mu~S4~o1h$bj>{{I6C6o7NT3MPPDUwmqSzQbf*%Vt!2q*CK3Uh8W~ zH{(}>bf0?)Pm%jPlsGdvHUave*?vAHboY6}dsx}M3dl%_Uwf(zd&V4i?r-#YW&elM zBVv|Ac>VFFxUc-E(9^U1d2!`gyis)XlPq2$0LR{t`Qv`kWnQVkm+gLY>`mSKw7vDk zaW_~{=DK;Oknw+cDo6289)9|i_Hi9W4P7fy$?dNe5ZyFr&LVm-QKUcG=m07&qMj>)ELa5_lz|N_-@2>jjx%G zfu$*(Fy$=P8p0eM`IDz|U8cVL2YdVzSE(=71-(37nw90Se7*Xw2-RE%x;(#UhZ80z+F=$}EcqCNrokDpGZv8#X}-R@JTF6Dm9{=0Z7 zwlJ7^n)b7k@%*&n^KnJ1-h$^RcvE&9IbdFu;2$koU?rvhR^@o!Y@z%I;W%os@;v&| z52zx~*y8bb?K|@J+YTM36wnVzjmNxu4Zm34dB*X0=h+6FXMgzi=sar|JC@G7At|}! zag>_de#Cf6RxusF9huheXf1TmqYtkYl@5n3#PDqCOrEsoqua7S6d$R~&6b9<8IGoe z%Mup!I&cxRDH!0p*zqw;$dQpF&IxlPB1COjDA-h(Gbc!&&I>q(IV^Uq;)7UqcEfGu z9nL4a)#7-?tR$x|R;g9-NB>*SaiA$t{ zID5+3V)*(tEi%X-SnD3My_N4G5(9{2+#2PRbm$s^_5i=xU_O~D;Svr8r^MP11= zCDM4Xf%q-6u~q0og*n5j3<&a9X&@OEO!-qB6i8jL)$3wiWPO6)Dai#L>q4n1Qi$u? zKc=@cfDdZL9V(=pp_+`Ipj!uX8seCK={4&Y%Xl1?*eAwxPnXAbFP(3jxRBbMXu#Gp z%6M>SeZotwLzWbElNrekh9moJ3-2Ja2W*z6=xV8r>zcg~LQwe^f%#iS#`G%&u&k@d zCZM#&u*A3}sw?hB$~k^bHJZ81&s2?LGSOGd+}1FF$*z^XMYvk&w&G#p02CIs726Ps z6Cnl0ju0YDyr)dCP&13Q&?RD zYu)V-9}VQ(+GaZ)9#74hmdeB;!YhT=g|IR(8TeCRiBO!z78uPK8qhok+Pn%BqjG43m!ZCzUqBq7&TI`DH z8M|yj_V@nTDhfq+?R)%(YGWD36AJEyU1fHhh|<5(q(7U=l=;%!yTjUOPg*?edA|@Q zx0Z!uwp&@-sV!2{kerg_1q<_*qh1!v%#D8PJqYzsI)$_>3a)I08h*9bsotg)f$FgNl4Qaj{03S^)AR1o6-)J~Qy6lnbfaw^Lf(|^t+7Upb*Qm5 zef8MJVgIJ(Mp^&kpDksLSHU0uq1xi*dRn(Oe|i64q&qN8_1CwXKXrkFb?5NIioWhJ zFseEn}NI0Bry3Wk}T68GOb^ctP-N=-dRXO z(-U`;r~4tvN?-i6U$ow@2_(5r$0Esfkfh#h!1C34Uyom-9zrd27(VeF*Y+A`P<1F@ zZ3D>kEB=r>?k;(mME9;N>;a>+e2p>VW)Y-_u0>K-Pko+@usDL<`=IRJFaEQonxeb* zKRoo%56?zOEzrW}hXO6sn*FJ$petThUq5v(m$5>s`j@4?7AM=?4`K)1>+inVe(&+M zFZ((%eb<1YR(qPe zWKAZ|f!NuNWk!U^iBP;BH`g*EBWmz_cl%|pht?JHk=tdZt!AzFb?Z3orUWi&y4swV zy^GW{Eg6xGU#pd^M(#nTw{hKd`uWteWwE$V`*^RU=LdXyuiwTv;}fJq#}=wyw&3Pk zVky)FxydX0d=m*^xN$er7_sl9Wh>4(>Yo=xoKuF)@5T{pM_QMo%EIE2n5m^8Zi7cY zq+l(<$E4SVTHLhA12Lyd%C6!C?KFZozDC_}-F%0BsP>}%s*+=jaZ6vc%Q2=yyN^2+ zT~vJv2G3}#7*`yrO(r+&RC+H~Ty4_eZ{Zqwe+Ic$e+!%9HT&g#st!H@wDv@3z2>!1 zz&t*sdW<#19y5F74y)OOoiv4G-=Xm0d@a8Tjv3e86`Pw&L2BL12C8xR%oQ@ge?q(S$xKlyFdlXVGjpTKP90EHs1l&F&XCl!e z3UY{1sY}j<&*7+{@?P^aV4%R2FR|nl0kw*h23FU%boyIZL~QqqdIgDDEq+yd7)p+C#S+?csryH6=uZZml`7DrGt-FCD{B&a$=tS4a66HHx{uaigEv8!R^NR-JwPh_7 zFQ6S|Juc#{@FW8YZ#9H%cZ7EhWETqYpb6H`4gOrUD`sTwjMIB8JITj6Nh zg&HH;Dlxz(L6*iHI)Dr|+us3ncAItA&&)V>QC<Rls%qA?9kE236l{w5yMw#&m>Ah!g3pTi&IpVW0xJgBkc1+B;VGC6v^;WFl z#0@(g26X*#8lF*+LqZg`SX~s}Th-;akXj=kwpiRIcevlm{V_M&C%TEoqFGV!Yj{n~ zHhWw&G|OBXLb93@dsQ2>m|5^=UI8wYI}!qi4>uAct}|)^YARODqGzB8Br3G zZ)6l|mB1zLjFKezYf<7&6H?+?QQ|GVdKpTrW6br?U+P>LkEf}fnq>H z9MO#!m4R%0W1to|N>!wvKs0-)!dvU+=BZ|HB#5hsrjS~q3?o#yfP@Ak3GE(+5}Iz=c{hoysY(0HyE{y#rd`Q`M596 z$2gofEbqS-mfzwY&ZH>bo=5Ti6veM2Yz)Pti~+e{8!uzNg0wl$thKy#>=u!K*Ld<< zlQDVhjsV)afuW2OHF>!(3aEFFkqPkn&O)JJm@AN^f+ElA(H9GGRET0;KNt+?TAIh! zDHp03H$i2M8w^=@>Y(;^U!~t1{4=uiha&qPkC=vm0S%)*W{4fxdsr~0T8e4Wr@_n{ za_0;)NgjA>Jo0(5&)>eteyuQ3FcK(W-y0LD{*{D|IWv@uC3ux(|iZ)jGX|f>s(8H3}N*QYPHSG?>*94%hQQ z2ZJ%4+j<5Yt3~!NLp9xjuK5JQ9K9Zyu|d&T+8ASPt5FTARQr1N)bUFZ!xV-dkSDFC zEok!E&n2|!%h?;&7~&cE!Bkwhj+<+UP9sckcBP+#in@S59V%3~c&T5jgpR!Sj$dse z?Oogn3|3~NRM0~ErY3ojE-Mrji{S=_B9mb;`{J}&@#UB|%z{=_{lPyq#zXd@(U$XI z;S;;q)|IES^gMmq&ZXK@S1G9CQ5~TrJD0QKH9CRnFE3>nhJ8x8(|<^!b&dPr>C5V@ zfy$&vUaiMxiCVwDD;j{vgMbhR(kr$0e2NtZc-*yKWE%i|!R^&4)tciO)}xzC7@^yo zUaB(%N?mmOgF0VDLc%kghw@jb@>QYopOG=Uh>k>6zB*`XKMhpa3PK9K@fWtegjpml zK+VpTAz<8g3pxcEKWyxGT1*S?C4|&;uU~b$Z$i0W>znTA?r3kPrKiR-T{Dx``Hi5N zwEd8&v$jtb(^~3J_i~NxSLwm>E-ny=i&+cFai!ZY@8yXmdjdN@HAN+jWB00ZN1}c8 zN}dC0UFHlq94tCxoX&!b`2eSWK7qYDYtfnN_|0$PbD;y)d{t6e!+n$XJ5p&6^9w?r zy;iH9G&Pyc(<38&WMW1d=Q)ah)Hs{Z?WsC^DdHOQs~fQnM9N8045Ws^8pb{J z)~0SCOkJEQo4W&k`F>_9Y_MD~Qzhy5t8%Nx&(o3?U#}Nzs>aS#x8|mm4|H;$cEx?) zWNz|PGd-Oe%p(KTI2mUIhox>aaxhp)1O65^(-mm6TW|#L!4$mGL~{Rwp2&n68ii>S zEO^l=zY6>ZjxW*AH6n>ctDz0y;Fm_h8BE-9ln~ZD*7o&-=F0SoSTE?#idLRB(a2-^ z!m$wS@`9isWIGH4F?4d4Z<2D5s3oo`ofh*?cp zf&j{GtX!=@QsBRj7s57p(j;yVnZr05E2)YLJ0lKHJ1<}!2-u0m)RDc(o+;YKuh0op zL$oJBhav)FIzg>0WHEskrHZPr!wm0BnU;_{_bY@7u{mMhakc@JZS(YV85NzOou;%9BlyNGTOsTPpRn-A~6j~7Vseig=i-V3Mept*52yp!!z^e z@!6_meW9#~tlm*gw-)~}uuX-=AO*^zv^aJRS{q~f4QMJxA}QS+;K|$@28=2xcmpmL zT^>L-9306*InTQWU{!^)C6Wiz3k1TL*@7Lu=x^zZ)>v)w%S<|pGrg_8jl6ix<~{58QZ|Ff7HuB;UPSo5`P#gl@6 zunUtsLZ4d`a=Nk5_qTi{z#$LJw+omJqp1H@fVl|oUz@Q0kG~gC8no8=CF>`E*19~j zJ{X~OR;b%G%J(Dg8t}l*JlnTHyGI2lmIsafUkcmC<3vO?e=9&)^mQ3e>{j+0MFjH6 zbYc~fQ#}18-;B6Am5f)112N_D#(r3_Ga0L@I#@r_Oi`x!djQokgHb{{w-}JDi&4gI z+~^!nk|?JH-E!sdRCV|TOC|ACgrbgXOAwtn;T9k)Wh%;C3Ho_ny$>Qmt);cLZp+^j zu(N4z(XH*9aq-87Fz6ROn`g7dsT%PvU$&2)e%FRUz(KhfXgeutHW)3ojt)jrsEmXu z6L$q3bt1^C-e6$0gikbTQfg($RB1W4kp!dmZmr&EKcUL>K&nUBU zm9J(;RckwO4wpsy#(V2@w< zD8CoeA)xeMe+a+?A(j993SYa`SFP}kJEaAsz@rFLJx~|u*w!_Ijs>6qr;_V@Lg;=o zPZlCS@hT7aR*kYwKy(#aHzZek90`=Fs_tGONf5EmUL-_q0n671V?@0ozS= zk!7^BQ?}Dmsi(-#?ze>WLHb8!WF$-?`=wjYSdB>D-<4L~niP zYOf?*K6LbYxSTti&iPfy%=}C2P~V$M2;gk}fNw)BWr>l3(2X6w_Mop{;&FP{uJ>*0 z?0S!H`(?j!K+bttjN5(ViymHz2a{iFm8^u5bze%+;#!zJhN~M3LcO#}!pb(nW5hWe5VPN|x48`9Okw6A!G{n*>3uWaK0^?(t1)eCZeM>~O|ZaEbG7T?@KL1Tlb(nlM_+N&$IeHZ z+h@z?mm}egf_sb*PA^Btha7CHLP7xqx<|4lC-XZ<%_)+aLz0?PBsCuga)70=!`MjU zb`gO{uFtpa7BzINGhp@K9H3Pt5WzY|L9}~x#7(fJ^?sB6cBm{t?Os@sdve5YqS}H% zT`=05(v@i*EBH^rlX$f z7M(UDXhgrPD`Tc_{RXO6dKNJ7{_^5$T5>lRT2n4;mt9;jim1ddAXRAnaHHG75zjiU`td1 z#c&sZpY1YWZk5~ld(Z~+l~>33gCibB_J+Q@=$*r<<)wU!GD`lMa(mc@3D0|yk0Ln> zN2z7}m3{4UGor;6YK5t)YdnG^d=_xVnA&jBs@%2JLv!kwIzvu4iV`T^xJMY$?mMJU z?$#ml76d2tyB>X7Heg62F}2gwt3Qf_O^xbFdQ1Ra~Sb8Hn0x zUg?YGRC(^Z=AmaD3uzqcDxi~YgisLC&3>baYc@(;(kXI8Mi-D{SOvP4n9kFh5mcK@+)@xkmn>2a3-kN!S8-)Zo&VwG+UB)r(<* zghdHrM7`;V7(y>&h0ov@@6uJ&h#k21;86Vb`yB=nfC&r%N!!0MF_-Gd2-(^Vqo(UM zDDyg_WkcpmQM9VSocd424zop#GcqyM*KxPkZ>4zGQiZuu1aAQ#4vv|U2^}*N(>_t$5*trNOpR-0aj7i$ z`YD{qBkWrqm(Pq7j8WPNNGM|w+?dK<3FtT-hk;h^M$_OMFfD>YVxk&1O@N+xa+lrwD#UVkr^~PxQ>R}* zr&Ps@XvrpPhF8*1eyb=I{q9Z_lmhLn9Iv^uAF3QjwK{5a<<0W8R;d_xqZ?%UnAF>u zWll{Hz(?@)F{5@9anrHOrekz!Ibup45F#OZ+J#o2lg%}k2831ViMeog zGHV=wZe7ANrnYufM20~aIR56ozEq1G?`Q@lnvIwTjl5A@v$>IT#DC%;BNCf*ZCb-*U7RP($=)jcon4tXfkMl z@}BE}vfHR+3}y#V*0#XfquP8;qtK`&4nLLB>F^;M1jLt%*sFSs^QDB4M?+p%R;wd? zB=F_&u`?e+e?Xlk_P2x+44Ssv9Au^k2&Ur(A)qqSgBpiWWR5&KcX z*b@cZH`l<&fzXJ42mhYGlAUl-f20VK$l`76^wpZnH>0Xf!bppShNn z#q92IZwKs9)ZKmum=Bq>in>hmYSM#T>bNgh^KXx+54nhvfR-Ay+k3QAs-qA4KaEld|9Xb;hLlg-NxFk(u5X zUSJkX$&+4=O$?GsQS$Y>g{?x&lxv){@)lys)4KA@w%1V6$0iPqV-qJ$3;JdeNk?Ps zHJ5Fk5I#N`n$TRXGoLiEI0$c8m-(YZOs{D~1(tJOIeII4lIalg zpe4B>jOm%gd|`xLWlqoDqJ+n#?qpvyu6F=cRI1H>i9|C_2hPfqmFQ5|+3QSgYV~!y z{m%V<$%B69y`GgHetYbQJLWR5{OGXD8}i}u z<-qWxKT0CH$NP4+F%5UBgJhs zBm+n=VO*hej=(lhM5^4)=X5mei7wjm3x3r@e#-}Z{eHjY6=hLw8IjG--@T|M;cxwF zzvVu^%6?gy-10X0LHX^lUlu909P*v~60Ne%Z(*s;emlc4KJwk30CTL%m39ET>FC!L zP*Jyb!PlzWe6M>OE;4P<)#M%;w8bw+Fj;-xAAx5AS8Rc2BG|sE7T9Ni%$flslzPb-C8ZA-6(%~j2h*{=AoOQ zDXQxnHMMvYuX-t0n}c%Y2E;6HMC;HF!gkc;_KSnxh~JkQuYMB~(ISINsvHAAl{4i| z13+EGBu4?XD^cBJ04R5KASj}yQs%GZ6+pdZ&lI-2a*yA#lNVE+up`w8>-YFgy5U#t zrfc{)Mzw*J?#TJ^u9|CgHLrCF);64c#{{?h0Ig$vsjiyu>ebKWhm&sy8JBva`UTLN z`Vb+}9`B!6UyXsz##W#iahkkQu9H+@_#~TzbF>*j$#!%i8BIf=SN`)y(*#y}ujhO1|TS+GXcq z$}ua(fsE33=u}U38ha5_3hagkVIF)TFr5U>K)?mW-zPgm+)O3PQNDKQJaUK_Wr?99 z)`0PIEz@oy0z**{ewtl3j=-2unSTW&rwO$yyako9$c-X}0?g|$1jG|9Ky=Nlm&k10 z;s%F({YKw=k6*RXH|-280Vn4emT-BD6`H3|k@H*T1!LXB zUmj<$>TJ?eeJ=(NjYXF{SB{?0CnCD^vITVpz1~+<`d${}Dswf+TlA93z4}}4D|hHG zk(nQ&fY3*+a8a52k43f>&X!P?gzeec!vkiGTKRXUqF!lB$O=@(RzPlxx9|21yG&u6 zo4?fV=gR+gCRL52?Ww0@N=lS4^B%ZBEIR3on0z%PP*y$7$t#3W$HWpyeQB33$oxBI9DISBgp< zwejZ>!*Id(@Qh17%|}CE}H?*`)v!h@8=9Sq~2I7Pu^{B6E>>_ybGdX-IQ-hS>E^!6%DZ#7t|{uoAvj zyOWWEszps==ZB)LGiuV<qhThhyP%&@W`Gkq`LU+s0`q^xR$vQnmF&jj~ zU?Fr~@wI9cCB!yfuQ0ucY~rQh?!0&URl4~ZKabKG>-@YPUz1~1ILRr|Hz1gFofN^S z@L>oxcN~Ik;u#@WcoqcfNfB(*bRTa1eg5Vc1PeEt!p(6A_Jg};UrG^d%xA|T*w}l5 z3{dLeuMkWMXM~i|z6G)E6^5nwg&j9ratWWn;t?t(=A+iYs%u)=g~)~ZqmMkNpOHY7 z+K+P9a5y$;8!7}0Pl)$St23Y#*RS;462^w1HAFD-wplVvT3Os)-O-EO9&n z&kbegf=0{+AV>i%l0^SOWRiIVex71Q)4I-G1brVJ2VewNKtZdV;6U75*p;oRHUI7qIRmWl&@jX_G=g`N|)^Hkcl z3J-*XE&;a|_IphGh4^Vds^vqQMr z4bcj;=8(8~!A2=&R6vf|wJL~|(@t(YnT06{6fXJu_>fdiV`(IS)`U5Aq<&fpFwXvP z&r&|ai$92a_N6BFkGrZ%z%X{{>h5L?+8KWAL+t$x}zKX6$Aeen!&yJOAA7X^h;WwZ(Rf$Y>eo@MzOjL zkEYyP74;gziwcdUmBxyy%2@tPq+L&%d2O%V7mEom-duLa%d5HL<)VuejuStJGoRlWk2a=WkC=Bw6E^v4(1 z#HOry?6U~$@miXRG|2`7dt|0sxqFhj4Dik+##NP(Q;vabP||71@h-4M7uzDFPe59FTieT8EBXN~ z!fW$D*064pu_7MYR{+jDA*!iB%2>X~DV(`gyP|ut9~+n@qi^>bUMiN!zEzav1FW5x znvRpy-R7q*_tbN9YcBd(%XMD9mpwW$lcwIwnn{n|LOl7+0St+2fWa3aUW5TzS?cJs z$ZI@FbEN{$w*(Abl}DPj>n^1D3H)wVT$@BrUhV~E?FvYPGeqG5>_(lMdt94AZpYiQ z3q`xk7Py=0hij#wP|y-9#$@jqznLdMTNOOGO@~;K90tZ_0>};lM<4myRK%#T0t`#? zWw6+Mm1=*RF8Di%96T2*w{@ls)PB$ug;_MI9Q0+Fd{;uQI!YM}4<-|X>S3h`3?V@} zYFi=@tn+e5td^E%)+`l=1QnxIvZvjQe9eVJG0Y>brzG!)SU3`KP_HGI^~)XwZua?e z4Ah;dH!g|a)?kp_MKGiBAOWcD_4d_nifX9F0{g z6;f=7w2pC-A=E}_?g6usCEKI%3qYy)~x)xtWz%-7vEsG2CXNTc;Yg?+DCt5Cffp&fz2 zW9s4=hBXBI!q*p344Qnvk`g4S7-GboK^6HbwfQPsZ3&o)M=KAxbyl;HG{*5@ zOOf?8L)QAXODU!{iD#{cqssH6Fzj+Ns@!VtKLpYI*P=_!AlBUqkERZghO3&V`fE6; z`dmx!rQq)d(hG1p-H+OBr`n=BrE zD|fX=SHYuwCOM_lg|_W|;mTfdpU8Y3H$1T)F(1e=;si<3fp+XQ3m>0KxM2XnS;PH> z+f~?x%v+QK9j^)M*S)?LTwEhaX-U)s8EiOtmi(dtUvsmcdxyW7Y!Ee!l|ZNvy7sHG zdpT$?>?}+8(!%APvLSTJ?@$-UrNI`Ai+~W?8*f(AhrKpi&B)A&v9MdASal!v4KJHWPjlfI^@~Ozn*3IE%`h^-uSZ>B zE1{>0WL2&` zM0i9BBzI(}0c`e|E5p&Q=c(MFKk*sEDR3XsDak-wH3J^#3baN(Z2f9rT!eBd@BiuOGK3s z5f_4p4eZzYK415cZ`dBN5aTDwHkJd%zN3YKH&Z5YpR_NspzZqVgtV{x+Jbeo^O zT^ujUi>nyl%`iT);O2JYe^}&a{X%4XYFgx&n-d*RS988s>`vr-b=}brdhso?J?aYU z8<)H!@gyPAB&e~@?a7R=HTVb>?Cq~#%AIUb%CaWthX9WmCxyEX3Dig@WR z5;%~k+H#v^iA`uRa3Qxe*Mf9@mOWA`hU?kNL=J_`thMkJU{vcioA{y9RLHL(rk%Gdlb^G{Sho$p zk(yO6((m2=M()*s*7{qOyo9L_y&OWy+x3I-`Ult}7atHGu5u4ubY)k(Zqt?hC-yyZ?C|~{ zl3foU**AFbp?!xBpJ0O{HrFZK1abVvht+I5vGH4z**+6|AhnErXoc_EMvZE?Q@@Tf z+2Psn{YD5O-kZ{WaTtR56?<^%*L|j2>y0}N2{YTYor#;y1CSRD@vzT5>!&=Of5Rt- z@^AL=;)lU_c1vPGhmx!2v!m)xaq=lc`Z*UoXG@WxT~dkvtwTwHgdySzowMFpk~`x4 zt=Rh%n#kSB9=jN-oKV2_J$#ZgGL$u#bR{cyz?Xa`ZWZ0{tHnq#bK_k%bcNkii80-b zj;Ob^bA02Eo9|1W7<^#ON_nH)W=ZnvkStqhuk+Kz6Yy~fZo1KrthzCLb3RhL>?3}D z4^adV{RkEpv9So{_2CJ&4xn6rQ#k4L%X^eh+DAc$rM~hVrsqj#jE$A-)pky5*aAMO zNygfLo8Rz?Z@+yKReJ~(T#sM~>CajHgiU3Ml+Gk)`ue&8C@~oHymifb?M~(f^|b9OU#|Vz$4=g@ z-rrIgxT#%xBt5?v&RuixJ9w-K&NWx^M)np)ebOCO95f{CWq=1W0R)-xvZ zR%Z5$%{n0MZH(>R+y!Eu(Ei?f-Bs=jKo2A(48Y)&DtoP-u4(k4v= zCqLTfnIim<1ag7&CKEAR^$qPelJ~5IOVRkC7EbQ2!JwO?*0T<~Wib9|F?c3 zj6S8Oi~-C_89<6lY_OL{rciyz$Bzh^V!$J_Y#)lqMA6zG1MhG`%!l1^vyR-y&G2o; zAp=*Js(u90hcbz+HPt$f&mcv7$~Ft34#R({aQ@?PlfR84RnHR=7So9z9%#M+|eMHXF@Wp*&zZlWy5vU^KPsMrg=dl<|ra(!~G!Q7~ zGQ&I9?yL9PP!R|ASKc=*9mZjr4$LltHr(Wo%#xUdS~zyV*PiXbFYQn#u=98g>O}8 z*q2PefZLffmgtr3L<90=;$fK=BxN2Oj=MfTTVK z#v|cxi7N$%osyec9$<5KG_e-<_!ZqmD1DPrbl-u*LQC4_OK#`%kT%X6mc+CjwlDY_ zsX(HRFZNUP2lwrUaP%loZ<9udl1Gf@3pPI-(AW)a+G)E#&g{GKe`I{=xzTGT>X0^5 zlicHUs+MpM_wcZv`VuP3ruR=}lbPcJtHeO&P1E`zM=|0|Z$Wqv6)U_vh*{_aJoy z+-x!@>Uz0DT&g~pxP7o-M___I#A#F(Gj>-qbLrsb0_`5X9x{$e*@fNCCP2l2!W z48Eelxnr4O*T^0LSP*8alNMK=Xd3AE9UqM6|YtFb- z;h@>26jDcrB;#hizqxg+BB^w9lOP0Iu{Kuw4uWndadXhu{%^l{z%QV*B+i!|e6az~ zy*{zTH&6)y)lR}~eYiFFW*6*D72Vmf#W%FYr-LdgT_pB^`T6pxzOJ^5T^H2z&)XDz zZgh$=1XCadGUfSS`o)7^;K4?9QTft0w zL#H1*nw0ljQoP$*4T4UVot;LEc$F8j@~34@qs8eI(IenXoF+Yh$G`^p9v$1-KP&P& zP8`*~qjCcu4YTNWUtv+_1;1j@ucnfROIUv-^ui_m zTtgc-jfX&L9?94|*xNQ4=hDf*-4Q3F>S8(>hX=xBT=J_4-q89ML=`7v3{hQYGKe0T z!%T{<1~7yx-)uq}$l3*)#?8=b<)}ycNoQzv!3=#c*n{Shz>RN$M2b`=Lsg_*G5cG{{}9CoT0s;al%g#V z9|)6x?b~@e_b5VE61ZJ!#@&q^@Kq-!Hpu7fF7Yf`nV&@l) zoevvM|J^7~7osl!1?|u9$S7>F`l%v!wH7o6%7LASstrUuZ3Au^@z9&fsPS>CRl)W1XoTSiBt$D^kabCsz7D@E4b_JmfNVsT3}nD^8Zb z@(M;#Nyd7E9anaN^AEyxW>~t#K7Gk`@T6NKXEC?b?c%WQ9DgxILwmb@aqbgmUU?-! zRUEi{<`rL3LDN_QMC#p4*RqP0SkJ+vi>cSh&M29$i-B0Pxo2#ldJ^ulaCM{pG{-ZJ zW&FT3aYymGr*?Pk*Z ze914UxsneuG5B2=*VN=aK`uREu425v<=J^9K*QBR_zmu1i#i_~_H&b8^Yc$=t?D9M z7!L{tlmptMTBTL)QF#RZCe(#48A^U4J>u45BUjYPhqbiK=NJ&}&L)wmUQ*tXLzhWv z2zDgqB=cl_y^fmuSnO?_qQ%}n|Chzyp@;Vu72SQ{&|Qc3-@5;yqYwYEEch}cmU@}r z!lm9K->1dhOfD?$eh8@)wN1hS5ID0|`961&6^}pjxT0)}PFx*$%8GF~O_oEnn?p3Z zTtGCRyli@;hkOHT`XC;;O094D-QO6?>8w- zwqd!hyvUVqu9U0jX%40rhGH%*%xvyea?h@EKRDotD8b)4BPMa+LhFl%!@fzcvmQ{K zWN)cN{rXr?0G1{0_kix~HZmWkxR0M=acD;3ewRyH+Qup}mkmo>l*J)9%);!~SX1=j z4qGm)MsXfwr0qaVo~@;{{^8L2^2EJPQ*%P=KYxm-cv`$uCJ zX2jxE@heycF-?Ng+4h7yjO^{pb@Wm)&6g1z#R`5fAR4(mQ>(`tV2a}UpF^yxmh?<1 zm}Q6j%(ZrNCirsW8wwOaX``@GGv_n+i|>8s6i%}$_+_cSCeHtK@^vv=k1brBycE@V zVxJ@iij%LW2anqwa!YwAl@St|R?SA+4!uNIGRi2EnwRwYYIch4WGI#DY550v!tEW7 zpS6)jyBIe4({uy@x{AxF0|*$|Avo09?LuELVAw4d(Yy)O!oBD8d0fUPh_=Q#Wug2? zTUFHAqcf#tln{Ji{7eCX>3x-Dz8uf8oq_V-w==dQq)}xVzizD(nl$>!__fim+J*jtZhSv3ggH*!gBi`D z>>g}aX8)md_I>ezh+P5QpcDD71H%1Dif|vF0O8ICbW+E5Z$ z43hHyBHY+}v9ODx@##<4Uo;f?Gh?vjVXU`H)T&;%?83k#V9W3ncuYrc`b71ypIwMeuXD!EoL z@Bs*;)vAC|UaDYv#NA!FTjI$Z#BQs2_%)m?4|IWfZK#IdW_& zf-jpD&SLkAr$;O{p7)trm6%?N;mvxWq#jIn7d{NB=vk&@i~h1rt^QCPMt{h2;*U~~ zQ#oemVcSp^TgwTgNI9ujIUmLLR>q4ewzB2;(W8SFk4WRX*Yd=gTkgMQWz+Hf4_CGX;q6u(NG#}nS5aJ65 zPafN^P{T<@Md_ipCxA^8|34D$@ro`Cjb1r+^4QViu|dE@GqkCe_`oCkf#$=7pL}@# ziHD9CUdSIOMMcL>J~%Wmu>W{?d7D&wQ;0VmKYsM_a2V$;oSYau&Kz<~=;N`I5A8d4 zVu(hxuOn>HknziEEZJ5;J8G_PlJUrIgRII%&pcaC15nm` zGv^ZSCGNk)JKGcYuYQzx6e@kgB)}ld(sUpB9AKNL%UgX<-%9>EmdScJs9Xcd__1mV$ z%A38omXTUgK@-();Ou~=Vno1qe{~AWn6DQ19PkzU?6Xot^m!%i=<^yG=lvgy4`Mmo zeZ2>}UEf8GW7oKGOf-h=Tm1Np(QQXsU5=%L-E4IJGE4uCq! ze=oSpEt?Wx`=R)lz&yTt>0<(VyK6Kjp~#!m!UUdCUmkcyjnG$=cOwqjh1}b(3sQr8 za?ox-Vg%UCvdHX8Go}M?VP@^A=L)WQzh~T82Kx1cP-iOY{oRRMMN%N`OLDUEu_^hA z&X`Jlki`kYlJUqr8~c7h>m&Xarga#5rJQ(^d90hV&1NRKqmNnxTNAC{dJL1T-18qN ziy;VYV}G`oBgg?91vN~?XHdd)PixgR4h6-t0ttWbwMRTl`kDjJYOStk`q?@QN+ujZ zK(7;1Imd;dx>w%q37ne6hEepOn;w+rV0qH9MhBp5qj}AKnv{^o;ei0T0T3UVgR^D>UDH6e>5U5ojahkqfA>H)*n43`vm)##q_Dt z`$S#3DL?5((@@}MsV)0cx<#ffZ9F!RJ8F)N${xRt?bHNr=`(s?9IZ2P)ff3I*G4C* zUFk=&nOD}5*{GtP;RfQ5!-$=f{c(@au{ zyRmr5fS>*p*EZ@}?|rn!zbZGL?z5lU+rC994o zauPgZ6F7P#dqg73@PiYvbqBl#_a-jaiW%C^4-d7VZz`M~?zV?5N(e58nZ5rK)H$>9KTfc4JHn*_d7^(-C1K#71i+mD_GGH$9B2!Z#62 zSG`Pbow8%TYNIc^P1~T*f7bq|xNXuqS9Woxsv$hXCrj8%0wgzQgv#UGguS5xT94UY z+TEmf_WL_g)Xg!kvPa?57sm!E!N*C-4SeEb0KeigY4q+6@-lHC+^EeZJHQvFQh?Ju z7AL>KN4~)%4rvm}Nw|6vaboj!3xp@Jey$mZ_1l~A`}Y9exwxQ;a1Jt=a~boL?Ve&N z78k!UC^SE*usdu3!A;Y!!#-`J!09)IFBYTC2YH4QjK^GA7-Yskojo?4Cvsn+dDG-Y zjbonj#c${yZ3L5P>`gzT5E@;Eq?5Vz`R^HZ3c?%d_iUakobB0{;T0gUgbuSPq}C9W-l+F0Q* z3n3!YI2%C=SFY4;^-FzG`vkKkJepXEjdIxGEY>DyH6U1z5R6Sq;k~XJxsOK}#Gc`) zQrdy-NT6jLf5$_-b-yk`?Kj*cGzfa-VmLgKMibDK%S~V*uqF zaR%=ds&V}eL5sa}gzp1>%7G8~8-B}A>EX_=jSl~^FFwN+H*?sAyHUgaLQxx+393+R zuv;y~u2WKP^|)B&$9KmDwJr}q0|edWC3W$kGA3^73;)xA|`eJL0@Of;Rk zWh+!DKgAl8=oV-Og2Wj;{WWWiHg)NOFV*?D7pJ)U_4)_LUAFcdQ62>?ZbtsHCh3FW zQw-CSY}5iEU@2i`)vN`Wa1J3~@c?uGRk7r0?O=?1C%EjFQuIM$)J7CG zj4zm~tKtDNrabC>q?a4tgBEp=U2$)8tgIF%kDAYmy6&uMPmvrB)-A>w$sf`gDM%%1 zmgWq%kkMsHZb6%x)#3?wmn&XWUcJfB+NyQHnk~Gu*64zQZF8aBF34^!_I0@|TG=8H znVkB$nGisQXM1B7eix9X*{jM;Uig$vq};~N zH~F&FDwtEYm1j2bI^QFTtlgKawGi%Nw_CM!w%Pde+@~itCVM+=R)3BA%w&@RDTjrO z=k>sN_y&atG5y0!PZYokTVX-7ib9l-45!-`;F|oY4VrQ|7;fw1=1DJd?SM9IR~R4SS4hYcOnQGaGX3Q)i*N^WX3f7o(1cNM>cC&XotyK$7su*gFYX*B> z*b!;0i98BlDe4P}vyImhOZtJuo-2B|`6DOO^gktnyrLqrY>F&&l2iY$RnzpN#D2 z@e0!cid%if8AbL{CdNH3tKw_$ryAp6pfK%KMPhp1UW9{~2H|c9{(Z2U(nd3r+J}Al zY7ldqdLZ&Db-!}@lAlU;{Ruy{n}vK7zsCRIO!W95lYqI7Z6H8 z?IiuF{V3o1snKuIA4XjGA@e1=H~3bK3PF)Ccb-@cdI70!;0vX`gm~@ZM0?R!8d!=k zy!3!<`z7RL(%{rJoPB~b{M}X^ubAS%>~u`=1~_|XvPWuFrJuIMSNG^wF+F1A_@tgY zjaQOG23$D|AS(eRG9oYu7VWtedF%qge3^LsaT37L27%HNzhIl+2){-fT#G|;>Nzf8 z3Fn%VE7JFJb4Q^;it<^Y@$cRo8m|M5S=&jYnNA%-${W*%`Pyc1E{i*t*wbTIhV0QA zw;?x@yDZDp&B1zP>{9vgZO!3#P+W?YmwF@$uOp8Z990H3p)AGZzs+Y0Dn;;I&~0~9 zb91&BUe;SK6|3*9uDAYRR!@gcjPjT7c`5ZDyZCzeD79M(*xR9jfq#6k;=bcr>;%eV z*@@OXC?KX)sx-E$jE`VNJnj8B$D>q{4}EC z&QZ~E2sh7b#ut~OIMEJGcClE7*>w!9B>6n5;FHb#!S8ZIrmvaK{D~fGv(J6aFSXCL zN#DGWuZh9Vl;(x+M(pfBIOA#!s~A!%YKUt2%(&W2 zJuc}|DHfHkgd#Cb`Z`@DfRFd4vr332w${T2>@#7V6fVi?g_g7{MsN#lN!($4=3>p_ ziLXT-d9Qt1(x-_yWYsU`W;c(lp?(6qzJdcBhPM+?=qp$S`kFKvy399cvc{yrah~bc zl4416w{ejgxyQSyUlyNiu;hH!tqeL1@M>1FciVK;(K|DP@{A$`3T!E}6y4 z^vE`QWPMVKYgmuS=ER>Vr>E5TJJI8Kiop)hliT2}<_#2l8kow36(C5hzpcWr1a&H- zaHSdm_Z83|{*qW_=OGG5;z!)yqf65+IbBFOM6b$wmigS*Ecq5s_4F^{qqNBTVx%A( zf4Y`-cT>4*$apf#Q}QO94>7A&)ML^m4X}@&No^Rk_I#~yq}eE z>9|kxypduIzD5LD!Lc?kzd==pH@cxg9pwgzW?&fd^i3lqSYu(u7bqLGCEqbSOlye@ zl=LU83SeqWSbFrlWe*T#U`|G()E9`YM4@2kZ_R}e*yEpKz+zl;VlFwXI?%p?a6hH*lJbT=8z`Q3`XGu7P<%>Leuxfrgw)md4#|E$0L?R zPn|t%MEt%rq=j=ZM93`nC^1qExs{?hbof%%MfHv}2JLAmpw7$g^Is96^iCT+IDV-JC%5riVY=!E%?QQ0xjf@% zfX{Agwd&m*5^Sb9Os`>O-xPuOJE$eencRAtE@siBjT?l*S%t<>Gc zC>J&Vq^(pM_f4lG4PAdZPDilYEjtnaPg;8>nt0E~l=!k>@jYuPVHvtnLb|<7ZoX?Ulvy;| zk`eYrofC|gh6CQ9fpf~L&XiT; zPn~3ubIScX=)0I6=x@4wA_BD?FoYJ{41Jbk{KFGMAk!QCE%y}Y^+dBTk=t?|Wq8@n zj%0*R?ISBj-OO-|R|EvA+U}>{!$pKRwSxkRvhK-4%ah!KQBwa>#MXD^amy%al+?}c zz(;9-j6i=@CrQo6{Jn zPqRU8`8u3V;t6%-p|Kn#(*i26Yepe5jQHkv5Yic$7c)y*f2KtqELIVTGcb(kWjx2y zlITyK50yov6MVxS7!<#0ittb@gCqCAk${5iby9*{300$nQKdP`UoY}yq>x#R5X`Y^ zF~@k^6W1!k6RNkSaFM zp4%9fM0sY)1;cz>T$gSmOO~}cIw}PEHpkET;yu13nEZyJtdgs?F}80mSiP(C=!K9N z!JOkZ7l}~^cB3Q*jw{_yET|zN>Y0^H1=X~^&ocI?*1xb@GG{q^e<6pG9wO+Kyr&vA z_GVx&ESQ4$2Q!SwxTQO)JR4PpU(LgCjK^6^p!cHPD&Ote#o}iw3W#OfvY*tPnpQ~7 zo$G36K?@tz(j-QicVp99u@8LWF`J?ev~0i*s~_|^$399H^WYv5vMJ9%^P4$LoYD#c z*oiHu)T4yb+}JOOJVSTsja2i|0HphZ;K+7N6I-J`R!{+{0kK6~4HmFeL#eie{EC%+ zg^CSUY}Q|~G$ythg>fqTdk~G{P7p4WTcUkAD%ShuyL6pH35BhMTOL$5r(6gwjEu_t z@3FyVcLjfqKqf^4ZMPR1Yw!dZeaSFcv;rS5M=zesgos@VY6*j|x3Tu^7Zd_hm=4^!)$hHytg8~qztAJdCZN&uFqS;7| zM&i*f2`)lm2DK1u398$WUCOkeiK+@OD6~_##0pe!ZzEB%-!~AR+4hWw(Uk1+4UfwU z{Uc(dA!rCaq>Wyan^TG6T94NWPmG!-*_ibtG}bvI$hNyB)|#ZT##+C9A^57)RY(Oy z;oud+4y{Um2`s9B^1mtUQJ3rf(w7X8XZ18HQ$^Bem0e$Lm%-DtVijrQ;Hack!$=)Y#MFWVG4#YSsg zi}m#YJvj5#AR7MOK=dX^bM7C4G-SKx(PMPV3sLDGb+wws`sIc+%LI(KfHuw7g~>`+ z-#3ajD@90#HG?V^FH?OyCFQ37gYo9Twa}ygnl~oIn`=LA?HEQAJRlq<1C}P%EnX%X z%VW;Lt1)Nfx=@0+ux}~97~@D+;M}vrO?-qr%ChWYRzHhTq9lRJWM@qZW^R^Tw)j$U z_NK5}Q6{5d5{0w*lTG&L?~{dTuM-YzcfK9&AVSZ4|89ifWVpllZ;ZY1sxNDgkBkl= zK7s}lUOo}KPH&YlIF)c^m70*w5gzzz;R8tGJ>h(ooOUac++9+l;NNg7pB=U`sFV?ZV)QY3Xy zmPK9G$phdaN(3bV;30q@2?LY~Dt0CVU;vJYOPB!($h90(K62KS6DO(bNJ-PQX=7)b zy8FpSb`ockZ6zmZyKO4xldIWO?zU-m)5>X*?X~;;J;@=|9I=5w&{u`JDEL<%3<}#8rCYViK}4XHz-n*oQi!4P5h!jBg=jL zPc#hGxYcC>jaC2}oWOua+9ewXeJOVv(5^%~v*Go&AKup)eA(ds7ya&SUcJlq{!ot@9c`+5C&arK&*LTiWb$ac7k4$*)&g6UT~i@=qee(x54 z@rz>f_i~69ap8h4X_2+SH_XRPcpW%0gD*H?^S6f29qDiECCZ8?MFbw49~;xk@1+@b zQ@IaQt^F^YV`$B>i#%xz$8~-ykNNC;77MGTEjeei7sClqE=mnHt!Ao7xY&J^7rA66hy8fWqVM!gLf5vt4*W0 zTpWneQ(NLS(@Od7lJT^WZz<|{)3o3tsPzuL66>%zIj1sjaw6ZX+9L%0WlEj5_p{1#ks@&_D9pVy7NW#T--*5pY}Ik07+Zf7eD_syx>6J z_D%T<8`Hi-p6mMIL?Hr?;z?#^5N;9Z@&F>F^wNDpHGM^N z7rtuZlW1fk`0CB?M|*} z|NXe@x3zPsLHB8Ll0XfqgCye|X|-Eh-5;$_>a`MQNd3u-bmHsb+wvpqFjMV*CiSxn zpvm{~Lft&$W!CS30&|lEkpFX-V;6_pH0bKC3xnA03g->P1x9*W(MRXN@ z$;XHNLFb9(ASE*>!9l|$nj$E7kwWY0`SpdJY>Q4*Kk;l+E`v3iQTo0w)s2F3DO%%f zFKQ56P0yx(8_8ws9v3Nb2cRY{I*Bv_p_lG!%(+0_*Ltai;qY`CQF#Tn%ADPTm7y$ z8Q_*zbBOBPMrh&1U&jxm)X<*-h$M-kBUP8T!KJg*FeHHGy%;;YCKIn1#_IQIdBf}2Dqh-`Zcs#}od zo{5zfz9a6!p^jc+I`HGF=f|&JmGrBV`?_?A6}d7ST#0q@!-K3UVWQA9ogUY8h>jg~ zRfj_gy9$4L5oKpDPVTx?y;!5HDTBPkCijFU_ap;E)~4T$d26#({vjXdh2EhdB1;$3 zpZ2glSK~_?DA)oNY`*nL-8!0`e#Z6?iQFy2f~7gxXD zYe#)@TgjswCnr6Hzjv_t0I7XPHGY?+eBH+YI6CaUs&46B_h7u0s-2(KytwM3X(ZMu zB3;ATZ`o^!+V*CIi(T!zxv+lUe&EmPsFpFY^#apB8E@r=G}CQ4b%EnK}n~AVPGob&;crzQ;PKr!B zk0?Y(iRqI^KBV7%^V+(h{C9cImOCtIr?(Bst}Emp+^9|-Cenx<^x+5L1z)D0lSgEt z+M)XV8ZRID=_4OH_47wQbmXT`eVp%||H|IVa-#B*>aNf4A?3V)R@{Pu2ql#`die7a z)VTPmws}U0oXVKn@n+Kc-ea<4N(sB`PVqxT!V&t4c|#r)IC=8OexYyo?#t1d1}x~sTPz&?fkD^fePHxnlann_J zzO{Y}0kI{%u|02J%5ES-3;4g)p0F+P3S}4&@N<~1lQ~ykmdgWU7sn6TGC(H}J|mu( z)c0)n*IQO6J6!)pc1IvP&UT=QgP9Q}h;m6SCe(Kx{RrwKbtI*}y2eydDIy=6^4p9A z_N6ZBAIeKVhY0fT-B5U`jn=zKVu8_;9wWQ3EB{Yb1Anu7p-CYzZ*l(U2C$d{4&%g? zjr-XR0JZRiHt$=|yzZ@T=Vbk6EN*kcTPJ12$ z|CF%9lp75|;faGA+Qm2+%EtU7*A#vAZ3}-b%mA-;O0=R(e638U4MYNu%E*Sxz>=WL1|0l`2rX};rzSLAYD4qjcl^m+@CnkBPgK$C^`2C(`~ zh)DZLMRY{km$=gKBl11qn>p)VO_ia$Q#MrzvL!#r7YU(T!{?>M>$lU4QBzQq3i;oD zg8}=x#>DA8EgDtJy43^r<^}fmsRH)RSUih!?Kp7oj7!OG^V$Sr-3$McFFMivO^2~! z*-a-ssa>i>v!3M4i^IJ*_pd?kR-i|xm6>HPt8)!L!3X5fUst%x61g}0JOzGDY1tah zHWSZM;jYl$tXP8D?%a$u%+BZZOh&ZD4!TrsjeTWzSy$nQw_BbKsR`I30bPh5ETq2O zuH zVz>lI>}kM>Z%#~?c+T8Q8UsL?%)`F~gU zts=}4vdQ;Jgwj!-y=0pR!L!5a(Rke#>@R)rJ->&sk%#u&u*W8B5W_YII{vf`g+csG zyotY`utxa%*R81s<*!pCHY`lF;CB7ay4y7~n2;2v6V`pu_;O7YKby%-N!+dVdaY_w zS}m!beAZK3zTuile3f;WyrD^XGX^q(nNoV)DXOi~m(n1NHYwKp`C7p3C~WQ|BM@%B zO7fg)uH|$*bDk=P#GCS*KwRqe%18I{Lo`vAPr=qD{OjCEUS_-jnHUE8) z8y=j4VkTLBH^1dfBR}LBN_fgcXvx!KlyE5cZz7+tEC1(eKveuvXh2EAvS>&*e!isv zG7Wj{!HiqA0*&oA`b*>{OHGdaZQmlr4S_;Rap#Ylf;&$>*Q!bI8A#`25>(t2Q1Ckc!YN-re9S$v>MQ zmH43XAyNsAT^)bjC_tP1{ntX2wwYb8froFZ@(sxHi8hc8ks{$jyMY_JTr?DL)Eu`L z(oj)5=ToB#gge&oePj)O>%rm-N=y98Da&Vc@FpH9D?*0Xw^LcClO?)+bJdyF`PHjF z5OVucaZ2V|`u&ZI){Au6C|mz5#nyWgY{loD2-nso8l`KS_bup`6|dhyq<9?Bxw>vK+t+o+2p{*l;wGC}tA`$OtUhJ47_ zNP-mkUrB^*KIJ}~G$Y%f58I&4QX*~l{iR9UOTw*h6881_xboT)HC!=it89N#EKORF z39pol-rnafOVG+f%?jGOood{u^VN9McI9fnqFp2FbowP)o`O^}OJ=_sv=g4n!F zW7(h?S3r_KWv&3rB%A^EHr%=kfUKAA;P5$a~;SK?)pcTY!evvN5owW(&NZiPygR|3^8T@t4$Z*c_*vG0xv- zQ(WtuK&>GiG{pKe&)1gKPXyFgt)MRLqb1x(k5UJiH`igQ-p4sqY^$}U*zb1mFE^}Q zqj0v6Sx5d|tOPEUwe0h3X|qd+vlfSa^BWtXj8V2QT-u6VGUQ$xDrU!7E`*>$vg;cM z3%W|0xMlO{d@kNtM`aGLqk{`ZH&9S_;@|B|V386v$?NQve86&Xe1|0E`&Hh?h_E#L zP0MpLx`@$|P{WxaD#)2-jpf>4eOk|tE4L=zeD!>*r4Oz?)z=@V*RyGJhM{~iuQkoE zGxqhmv88=Ze^az^FZWv8zr~)Mw41i8(5UzlqAvU+(@2~fTI*)ZNwBc#%61)bAU&aG zYuayLXX~`F^2P;L(|fg5B-+ri;ab0I6U5ldRV7Zv1>Ik+ZGYBTI{y9Fae>@gJAp8& zLiAj$2xqt}nm2sgyy3d|US97WitlAdp-%6c=O{`>8tF7iA2)p>{&ad8yNDFPj#kF4 zRip{mlc0EUNTn37=4o0NI;&)drpST&$+D(wUW{muZGd@$wK;L_Wv>7Bpk|>r1UCg~ zKa^G9a06>XGGwAcr=CY-O6rX~y-|V9;`XVtT%-KA*WXCjh|EbNa7N;?QNjOOy2EQc z)%(`6um9B0!-nN$Z3upDBbTjbr(itaUDZRz>9+J1KKn*MFL9gDkH}zLe;4^XBOCUH7GBb&^7gu3#&(N>L00sQ)c3`-FiE5V z`5^Q(9HKBZUUsLR&+YqT>tL5Fknod6j`OL)!VEFwy z)t{jHWwU|z)-gQA{Z8}h=9lWP3|zMCCKm!Dc)>_Kl@^!v)Pd04LiVY#FGDhas(zw^ zS;`%SZ5iyh;imW_T!ImFZg?Zmn5s{?85-w1>hJ#Y!Qnjh4TEF)lE85hau#l7xq~()Ig=dOK>`cdYxETh`B@ z>+e$5l;Mr9J)aDR%QT#}bKAwo(Y!3L2iEg8L_>l^Xgi0>vdO&hHwUVQ22d}2Cf;Fp zrZiap>=j+Nzr8j2Fxvt}xfiC515YZ*fIl z+GOLYC0K!`x3fiCx?$t7Fkk1FKFWRZM!XrVofC?+k#SsmyO$k>YdHn~Y3=n02AN7V zPA(9wz)affIAH!swBi;p=WoB7s`m)44$@=eTr0cNbbQ+H~NT zh}O`O`) zsp+^|+&X~UGj`U!4!Av!jup8CaDVoj1l&Yk8o}K-v1Y;8UFhUCm`2I?7QC|>RB~G5 zMbJBecaoxcDd28o+bOtV-2uIQL*HBI-9VGZO)d}I9CqD;-JNCuke;=(lVjm@DT_Jh zEde(Ft7#5+>K5(l^a~^Gm`YN(jCrMR?N{RHm3kD;3^$eZt-_ZDjSzmgG|+vE6gK<{ zdFU-3ds58}ciTd&qi`LkH|~s9hGZ#q{$M?zlcbC%NbC}rBY8XbG>ZZ!7EX=N-z~ke z^WR+#v9yf$En>koPoVCMQ-Sp4keo;tB4$5$oGRwtIb z-XfN76an`Zv1Iwon~YfQGRbo7Tax9nl%=m<;kSt8>qjiX*pMxG*@6WNWoPI2OAEVX zT9IP-mdWyUw8`G0m9Gn}n8^~9FeTGo++w+y5+*f`4D+3x9~8m-Vh}FcH~yM7ep^fG zEwkk#V&q3Q8T0FJ$(YN+>#twow6=As&f-k2G>BbBj2ql1r57GNoEAKFIgHHsjkvMEFaVm#^~!*q^i3&UVq|%BSMH z8PSb;#I>LWZckftecZ7<-;wL+_)Tuej&e^j^p1}IdevI~k`%}f{#BPIx6f842IopM zmHC<6_T}o*_R9R^?DAB3`$VNyO)l|1H89}!c-K}J%hheCb9r65J*BIt^x56lzJPW@0vAdBoxMYa7YZ*Io-1%0il)K|GF^w` zdvtD!wt^WNq#Ih;$1p_LzPIp^Y_q+E2e?}2N}fk&NgIo9mt@o!FwFA59p)jPall!*F*k}^9SGS-wyfnZC;A>hok=d`~5i$Km2O`wrdJ6 z2;S^c=av_;4K~DE*{~BXj~kBH5*uMVLw%DSrvq}8X4ovz#r3e3oFLup2i1iFk3Cxws!B@zO=AVvn2-w^ltmg-aW-V zyS6Tsr%sn@TW2ft%PZR{7cim?dNd$Rb+ww?uAYiuKzV7tG`oFrakX}OVSek*ZQVWm zOIq6QkM;EOYb1>dH>;;hON&QK)z`jdK0#XG)rhohFPvXoU0kq><>OqAaf0wuMiSlI4pG=jjlS|nLZNC@P)Wq`iba~0EUF25#TpU3#BkKaeY!w++D4&p{GZVtE78#!E@yWIEjdR;Wu z8y}3ePRF-lufq4MTdIhBhiD?T!Ca`Kad$aH%@8nH*3hzE&=QjZ*E%fXy06)ntM2H?w3AzvGyKN zd&ge4y)S%F4gP8_ZSjSRw)oJcwfJ+^;!E`w|L2Rg_$#?&!L-3EAVr%c>xBIrhmxY) zi{HAeXnbPsKzVXus_bGCHUraeIhk-DK$Lv_Mqosb!HB+iO<+XVi$ z0C;WhHfR{CehYnMLLZbad<^2? zcFrd@n#epBJ=Gg`etUfFck_^M;OjNy@7@8j-Wokg*d@C11x{DG8V}^T^Z^l5`ro`ju@oi>mdCSWv0nyu4Ep4^d!SvVm#+y0h zFL^3uCLOr=Dt=0_^o51AA#DT)cOS1AY*|9}(cWsq|gE*?69TjM{*1h*rgsqAQ1*I_!zU6%U$cu4TExz_he9w?5Qy4}DC>?+UjD`{i~bfOm+oopQ>Oz5EPhvEHBB#)CWJcUs@S@Z%feTMO%l z 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�V@hb@X!rpuI!d#gEPr@G?>^;0 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�kt8x;~TsT>pv0H}KctCr%E@x^x!A}PEceP>b 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%0D4ZTi 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 literal 0 HcmV?d00001 diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imaging.pyi b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imaging.pyi new file mode 100644 index 000000000..81028a596 --- /dev/null +++ b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imaging.pyi @@ -0,0 +1,31 @@ +from typing import Any + +class ImagingCore: + def __getitem__(self, index: int) -> float | tuple[int, ...] | None: ... + def __getattr__(self, name: str) -> Any: ... + +class ImagingFont: + def __getattr__(self, name: str) -> Any: ... + +class ImagingDraw: + def __getattr__(self, name: str) -> Any: ... + +class PixelAccess: + def __getitem__(self, xy: tuple[int, int]) -> float | tuple[int, ...]: ... + def __setitem__( + self, xy: tuple[int, int], color: float | tuple[int, ...] + ) -> None: ... + +class ImagingDecoder: + def __getattr__(self, name: str) -> Any: ... + +class ImagingEncoder: + def __getattr__(self, name: str) -> Any: ... + +class _Outline: + def close(self) -> None: ... + def __getattr__(self, name: str) -> Any: ... + +def font(image: ImagingCore, glyphdata: bytes) -> ImagingFont: ... +def outline() -> _Outline: ... +def __getattr__(name: str) -> Any: ... diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imagingcms.cpython-312-x86_64-linux-gnu.so b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imagingcms.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..ea34a8772df9951e84e398714b300f32a2c709f4 GIT binary patch literal 157841 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 int: ... + @property + def creation_date(self) -> datetime.datetime | None: ... + @property + def copyright(self) -> str | None: ... + @property + def target(self) -> str | None: ... + @property + def manufacturer(self) -> str | None: ... + @property + def model(self) -> str | None: ... + @property + def profile_description(self) -> str | None: ... + @property + def screening_description(self) -> str | None: ... + @property + def viewing_condition(self) -> str | None: ... + @property + def version(self) -> float: ... + @property + def icc_version(self) -> int: ... + @property + def attributes(self) -> int: ... + @property + def header_flags(self) -> int: ... + @property + def header_manufacturer(self) -> str: ... + @property + def header_model(self) -> str: ... + @property + def device_class(self) -> str: ... + @property + def connection_space(self) -> str: ... + @property + def xcolor_space(self) -> str: ... + @property + def profile_id(self) -> bytes: ... + @property + def is_matrix_shaper(self) -> bool: ... + @property + def technology(self) -> str | None: ... + @property + def colorimetric_intent(self) -> str | None: ... + @property + def perceptual_rendering_intent_gamut(self) -> str | None: ... + @property + def saturation_rendering_intent_gamut(self) -> str | None: ... + @property + def red_colorant(self) -> _Tuple2x3f | None: ... + @property + def green_colorant(self) -> _Tuple2x3f | None: ... + @property + def blue_colorant(self) -> _Tuple2x3f | None: ... + @property + def red_primary(self) -> _Tuple2x3f | None: ... + @property + def green_primary(self) -> _Tuple2x3f | None: ... + @property + def blue_primary(self) -> _Tuple2x3f | None: ... + @property + def media_white_point_temperature(self) -> float | None: ... + @property + def media_white_point(self) -> _Tuple2x3f | None: ... + @property + def media_black_point(self) -> _Tuple2x3f | None: ... + @property + def luminance(self) -> _Tuple2x3f | None: ... + @property + def chromatic_adaptation(self) -> tuple[_Tuple3x3f, _Tuple3x3f] | None: ... + @property + def chromaticity(self) -> _Tuple3x3f | None: ... + @property + def colorant_table(self) -> list[str] | None: ... + @property + def colorant_table_out(self) -> list[str] | None: ... + @property + def intent_supported(self) -> dict[int, tuple[bool, bool, bool]] | None: ... + @property + def clut(self) -> dict[int, tuple[bool, bool, bool]] | None: ... + @property + def icc_measurement_condition(self) -> _IccMeasurementCondition | None: ... + @property + def icc_viewing_condition(self) -> _IccViewingCondition | None: ... + def is_intent_supported(self, intent: int, direction: int, /) -> int: ... + +class CmsTransform: + def apply(self, id_in: CapsuleType, id_out: CapsuleType) -> int: ... + +def profile_open(profile: str, /) -> CmsProfile: ... +def profile_frombytes(profile: bytes, /) -> CmsProfile: ... +def profile_tobytes(profile: CmsProfile, /) -> bytes: ... +def buildTransform( + input_profile: CmsProfile, + output_profile: CmsProfile, + in_mode: str, + out_mode: str, + rendering_intent: int = 0, + cms_flags: int = 0, + /, +) -> CmsTransform: ... +def buildProofTransform( + input_profile: CmsProfile, + output_profile: CmsProfile, + proof_profile: CmsProfile, + in_mode: str, + out_mode: str, + rendering_intent: int = 0, + proof_intent: int = 0, + cms_flags: int = 0, + /, +) -> CmsTransform: ... +def createProfile( + color_space: Literal["LAB", "XYZ", "sRGB"], color_temp: SupportsFloat = 0.0, / +) -> CmsProfile: ... + +if sys.platform == "win32": + def get_display_profile_win32(handle: int = 0, is_dc: int = 0, /) -> str | None: ... diff --git a/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imagingft.cpython-312-x86_64-linux-gnu.so b/Python/Flask_Blog/11-Blueprints/venv/lib/python3.12/site-packages/PIL/_imagingft.cpython-312-x86_64-linux-gnu.so new file mode 100755 index 0000000000000000000000000000000000000000..7e8d46e98c34f88d1f29ca58763b293db3f7a974 GIT binary patch literal 331169 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 z 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 u59yFBy?;KnDUg-fLtg)xl=u|lcTSc=8x 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