diff -pruN 0.11.1-1/.github/dependabot.yml 0.12.0-1/.github/dependabot.yml
--- 0.11.1-1/.github/dependabot.yml	2025-02-18 15:35:49.000000000 +0000
+++ 0.12.0-1/.github/dependabot.yml	2025-10-24 19:19:32.000000000 +0000
@@ -5,6 +5,8 @@ updates:
     directory: /
     schedule:
       interval: weekly
+    cooldown:
+      default-days: 7
 
   - package-ecosystem: github-actions
     directory: /
@@ -12,3 +14,5 @@ updates:
       interval: weekly
     open-pull-requests-limit: 99
     rebase-strategy: "disabled"
+    cooldown:
+      default-days: 7
diff -pruN 0.11.1-1/.github/workflows/ci.yml 0.12.0-1/.github/workflows/ci.yml
--- 0.11.1-1/.github/workflows/ci.yml	2025-02-18 15:35:49.000000000 +0000
+++ 0.12.0-1/.github/workflows/ci.yml	2025-10-24 19:19:32.000000000 +0000
@@ -7,6 +7,8 @@ on:
   pull_request:
   workflow_dispatch:
 
+permissions: {}
+
 jobs:
   test:
     strategy:
@@ -17,16 +19,18 @@ jobs:
           - "3.11"
           - "3.12"
           - "3.13"
+          - "3.14"
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
         with:
           persist-credentials: false
 
-      - uses: actions/setup-python@v5
+      - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
         with:
           python-version: ${{ matrix.python }}
           cache: pip
+          allow-prereleases: true
 
       - name: test
         run: make test INSTALL_EXTRA=test
@@ -35,24 +39,24 @@ jobs:
     if: always()
 
     needs:
-    - test
+      - test
 
     runs-on: ubuntu-latest
 
     steps:
       - name: check test jobs
-        uses: re-actors/alls-green@v1.2.2
+        uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # v1.2.2
         with:
           jobs: ${{ toJSON(needs) }}
 
   lint:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
         with:
           persist-credentials: false
 
-      - uses: actions/setup-python@v5
+      - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
         with:
           python-version: "3.x"
 
diff -pruN 0.11.1-1/.github/workflows/docs.yml 0.12.0-1/.github/workflows/docs.yml
--- 0.11.1-1/.github/workflows/docs.yml	2025-02-18 15:35:49.000000000 +0000
+++ 0.12.0-1/.github/workflows/docs.yml	2025-10-24 19:19:32.000000000 +0000
@@ -6,15 +6,17 @@ on:
       - main
   workflow_dispatch:
 
+permissions: {}
+
 jobs:
   build:
     runs-on: ubuntu-latest
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
         with:
           persist-credentials: false
 
-      - uses: actions/setup-python@v5
+      - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
         with:
           python-version: "3.x"
           cache: "pip"
@@ -29,7 +31,7 @@ jobs:
           make doc
 
       - name: upload docs artifact
-        uses: actions/upload-pages-artifact@v3.0.1
+        uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0
         with:
           path: ./docs/_build/html/
 
@@ -45,4 +47,4 @@ jobs:
       url: ${{ steps.deployment.outputs.page_url }}
     steps:
       - id: deployment
-        uses: actions/deploy-pages@v4.0.5
+        uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5
diff -pruN 0.11.1-1/.github/workflows/listgen.yml 0.12.0-1/.github/workflows/listgen.yml
--- 0.11.1-1/.github/workflows/listgen.yml	2025-02-18 15:35:49.000000000 +0000
+++ 0.12.0-1/.github/workflows/listgen.yml	2025-10-24 19:19:32.000000000 +0000
@@ -10,6 +10,8 @@ on:
   schedule:
     - cron: "0 0 * * 2"
 
+permissions: {}
+
 jobs:
   pre-list-legacy:
     strategy:
@@ -20,11 +22,11 @@ jobs:
     runs-on: ubuntu-latest
 
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
         with:
           persist-credentials: false
 
-      - uses: actions/setup-python@v5
+      - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
         with:
           # NOTE: matrix.python is intentionally not used here.
           python-version: "3.x"
@@ -39,7 +41,7 @@ jobs:
           ./env/bin/python ./support/fetch-sphinx.py "${LISTGEN_PYTHON_VERSION}" > pre-list.txt
 
       - name: upload pre-list
-        uses: actions/upload-artifact@v4
+        uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
         with:
           name: pre-list-${{ matrix.python }}
           path: pre-list.txt
@@ -49,22 +51,22 @@ jobs:
     strategy:
       matrix:
         python:
-          - "3.7"
-          - "3.8"
+          # - "3.7" # EOL
+          # - "3.8" # EOL
           - "3.9"
 
     runs-on: ubuntu-latest
 
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
         with:
           persist-credentials: false
 
-      - uses: actions/setup-python@v5
+      - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
         with:
           python-version: ${{ matrix.python }}
 
-      - uses: actions/download-artifact@v4
+      - uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
         with:
           name: pre-list-${{ matrix.python }}
 
@@ -93,7 +95,7 @@ jobs:
 
       - name: create PR
         if: ${{ !inputs.dry-run }}
-        uses: peter-evans/create-pull-request@v7
+        uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
         with:
           commit-message: "[BOT] update list for ${{ matrix.python }}"
           branch: update-stdlib-list-${{ matrix.python }}
@@ -115,44 +117,32 @@ jobs:
           - "3.11"
           - "3.12"
           - "3.13"
+          - "3.14"
 
     runs-on: ubuntu-latest
 
     steps:
-      - uses: actions/checkout@v4
+      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
         with:
           persist-credentials: false
 
-
-      - uses: actions/setup-python@v5
+      - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
         with:
           python-version: ${{ matrix.python }}
+          allow-prereleases: true
 
       - name: walk modules
         env:
           LISTGEN_PYTHON_VERSION: ${{ matrix.python }}
-          LISTGEN_DRY_RUN: ${{ inputs.dry-run }}
-        run: |
-          python ./support/walk-modules.py "${LISTGEN_PYTHON_VERSION}.txt"
-
-          if [[ -f "./stdlib_list/lists/"${LISTGEN_PYTHON_VERSION}.txt"" ]]; then
-            sort -u -o ./stdlib_list/lists/"${LISTGEN_PYTHON_VERSION}.txt" \
-              ./stdlib_list/lists/"${LISTGEN_PYTHON_VERSION}.txt" \
-              "${LISTGEN_PYTHON_VERSION}.txt"
-          else
-            sort -u -o ./stdlib_list/lists/"${LISTGEN_PYTHON_VERSION}.txt" \
-              "${LISTGEN_PYTHON_VERSION}.txt"
-          fi
+        run: python ./support/walk-modules.py ./stdlib_list/lists/"${LISTGEN_PYTHON_VERSION}.txt"
 
-          rm "${LISTGEN_PYTHON_VERSION}.txt"
-
-          if [[ "${LISTGEN_DRY_RUN}" == "true" ]]; then
-            git diff
-          fi
+      - name: show diff
+        if: ${{ inputs.dry-run }}
+        run: git diff
 
       - name: create PR
         if: ${{ !inputs.dry-run }}
-        uses: peter-evans/create-pull-request@v7
+        uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
         with:
           commit-message: "[BOT] update list for ${{ matrix.python }}"
           branch: update-stdlib-list-${{ matrix.python }}
diff -pruN 0.11.1-1/.github/workflows/release.yml 0.12.0-1/.github/workflows/release.yml
--- 0.11.1-1/.github/workflows/release.yml	2025-02-18 15:35:49.000000000 +0000
+++ 0.12.0-1/.github/workflows/release.yml	2025-10-24 19:19:32.000000000 +0000
@@ -5,6 +5,8 @@ on:
 
 name: release
 
+permissions: {}
+
 jobs:
   pypi:
     name: upload release to PyPI
@@ -19,21 +21,21 @@ jobs:
       contents: write
 
     steps:
-    - uses: actions/checkout@v4
-      with:
-        persist-credentials: false
-
-    - uses: actions/setup-python@v5
-      with:
-        python-version: "3.x"
-
-    - name: deps
-      run: python -m pip install -U build
-
-    - name: build
-      run: python -m build
-
-    - name: publish
-      uses: pypa/gh-action-pypi-publish@v1.12.4
-      with:
-        attestations: true
+      - uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
+        with:
+          persist-credentials: false
+
+      - uses: actions/setup-python@e797f83bcb11b83ae66e0230d6156d7c80228e7c # v6.0.0
+        with:
+          python-version: "3.x"
+
+      - name: deps
+        run: python -m pip install -U build
+
+      - name: build
+        run: python -m build
+
+      - name: publish
+        uses: pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # v1.13.0
+        with:
+          attestations: true
diff -pruN 0.11.1-1/.github/workflows/zizmor.yml 0.12.0-1/.github/workflows/zizmor.yml
--- 0.11.1-1/.github/workflows/zizmor.yml	2025-02-18 15:35:49.000000000 +0000
+++ 0.12.0-1/.github/workflows/zizmor.yml	2025-10-24 19:19:32.000000000 +0000
@@ -6,31 +6,19 @@ on:
   pull_request:
     branches: ["**"]
 
+permissions: {}
+
 jobs:
   zizmor:
-    name: zizmor latest via PyPI
+    name: Run zizmor 🌈
     runs-on: ubuntu-latest
     permissions:
       security-events: write
-      # required for workflows in private repositories
-      contents: read
-      actions: read
     steps:
       - name: Checkout repository
-        uses: actions/checkout@v4
+        uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
         with:
           persist-credentials: false
 
-      - name: Install the latest version of uv
-        uses: astral-sh/setup-uv@v5
-
       - name: Run zizmor 🌈
-        run: uvx zizmor --format sarif . > results.sarif
-        env:
-          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
-
-      - name: Upload SARIF file
-        uses: github/codeql-action/upload-sarif@v3
-        with:
-          sarif_file: results.sarif
-          category: zizmor
+        uses: zizmorcore/zizmor-action@e673c3917a1aef3c65c972347ed84ccd013ecda4 # v0.2.0
diff -pruN 0.11.1-1/CONTRIBUTING.md 0.12.0-1/CONTRIBUTING.md
--- 0.11.1-1/CONTRIBUTING.md	1970-01-01 00:00:00.000000000 +0000
+++ 0.12.0-1/CONTRIBUTING.md	2025-10-24 19:19:32.000000000 +0000
@@ -0,0 +1,135 @@
+# Contributing to stdlib-list
+
+Thank you for your interest in contributing to `stdlib-list`! We welcome contributions from everyone.
+
+## Overview
+
+`stdlib-list` provides lists of Python standard library modules for Python versions 2.6 through 3.13. The project maintains high standards for code quality, documentation, and testing.
+
+## Development Setup
+
+We use a `Makefile` to streamline the development workflow. To get started:
+
+1. **Clone the repository:**
+   ```bash
+   git clone https://github.com/pypi/stdlib-list.git
+   cd stdlib-list
+   ```
+
+2. **Set up the development environment:**
+   ```bash
+   make dev
+   ```
+   This creates a Python virtual environment and installs all development dependencies.
+
+## Code Quality Standards
+
+We maintain high code quality standards using automated tools:
+
+### Linting and Formatting
+
+- **Ruff**: Used for code linting and formatting
+- **MyPy**: Used for static type checking
+
+Run linting checks:
+```bash
+make lint
+```
+
+Auto-format code:
+```bash
+make reformat
+```
+
+### Testing
+
+We require **100% test coverage** for all code changes.
+
+Run tests:
+```bash
+make test
+```
+
+If you're working on a specific test, you can run individual tests:
+```bash
+make test TESTS="test_name_pattern"
+```
+
+## Documentation
+
+Documentation is built using Sphinx and hosted at [pypi.github.io/stdlib-list](https://pypi.github.io/stdlib-list/).
+
+Build documentation locally:
+```bash
+make doc
+```
+
+### Module Inclusion Policy
+
+Please read our [module inclusion policy](docs/module-policy.rst) to understand how we determine which modules should be included in the standard library lists.
+
+## Making Contributions
+
+### Types of Contributions
+
+We welcome several types of contributions:
+
+1. **Bug reports**: If you find a missing or incorrectly included module
+2. **Bug fixes**: Corrections to module lists or code issues
+3. **Documentation improvements**: Clarifications or additions to docs
+4. **New Python version support**: Adding support for new Python releases
+
+### Submission Process
+
+1. **Fork the repository** on GitHub
+2. **Create a feature branch** from `main`:
+   ```bash
+   git checkout -b feature/your-feature-name
+   ```
+3. **Make your changes** following our code quality standards
+4. **Run the full test suite** to ensure nothing is broken:
+   ```bash
+   make lint && make test
+   ```
+5. **Commit your changes** with a clear, descriptive commit message
+6. **Push to your fork** and **create a pull request**
+
+### Pull Request Guidelines
+
+- Provide a clear description of the problem and solution
+- Include tests for any new functionality
+- Ensure all CI checks pass
+- Keep changes focused and atomic
+- Reference any related issues
+
+### Code Style
+
+- Follow Python PEP 8 (enforced by Ruff)
+- Use type hints (checked by MyPy)
+- Write clear, descriptive commit messages
+- Add docstrings for new functions and classes
+
+## Development Workflow Commands
+
+Here's a quick reference of useful `make` commands:
+
+| Command | Purpose |
+|---------|---------|
+| `make dev` | Set up development environment |
+| `make lint` | Run linting and type checking |
+| `make reformat` | Auto-format code with Ruff |
+| `make test` | Run full test suite with coverage |
+| `make doc` | Build documentation |
+| `make package` | Build distribution packages |
+
+## Getting Help
+
+- **Issues**: For bug reports and feature requests, please use [GitHub Issues](https://github.com/pypi/stdlib-list/issues)
+- **Discussions**: For questions about usage or contribution ideas
+- **Documentation**: Check our [online documentation](https://pypi.github.io/stdlib-list/)
+
+## Project History
+
+This project was originally created by [@jackmaney](https://github.com/jackmaney) and later transferred to the PyPI organization with new maintainers. We appreciate all contributions that help maintain this valuable resource for the Python community.
+
+Thank you for contributing! 🐍
\ No newline at end of file
diff -pruN 0.11.1-1/README.md 0.12.0-1/README.md
--- 0.11.1-1/README.md	2025-02-18 15:35:49.000000000 +0000
+++ 0.12.0-1/README.md	2025-10-24 19:19:32.000000000 +0000
@@ -5,7 +5,7 @@
 [![CI](https://github.com/pypi/stdlib-list/actions/workflows/ci.yml/badge.svg)](https://github.com/pypi/stdlib-list/actions/workflows/ci.yml)
 
 This package includes lists of all of the standard libraries for Python 2.6
-through 3.13.
+through 3.14.
 
 **IMPORTANT**: If you're on Python 3.10 or newer, you **probably don't need this library**.
 See [`sys.stdlib_module_names`](https://docs.python.org/3/library/sys.html#sys.stdlib_module_names)
diff -pruN 0.11.1-1/debian/changelog 0.12.0-1/debian/changelog
--- 0.11.1-1/debian/changelog	2025-02-24 18:16:20.000000000 +0000
+++ 0.12.0-1/debian/changelog	2025-10-27 22:36:26.000000000 +0000
@@ -1,3 +1,17 @@
+python-stdlib-list (0.12.0-1) unstable; urgency=medium
+
+  * Team upload.
+
+  [ Alexandre Detiste ]
+  * Update long description.
+  * Drop build-dependency on python3-setuptools.
+  * Drop "Rules-Requires-Root: no": this is now the default.
+
+  [ Colin Watson ]
+  * New upstream release.
+
+ -- Colin Watson <cjwatson@debian.org>  Mon, 27 Oct 2025 22:36:26 +0000
+
 python-stdlib-list (0.11.1-1) unstable; urgency=medium
 
   * Team upload.
diff -pruN 0.11.1-1/debian/control 0.12.0-1/debian/control
--- 0.11.1-1/debian/control	2025-02-24 18:16:20.000000000 +0000
+++ 0.12.0-1/debian/control	2025-10-27 22:36:26.000000000 +0000
@@ -2,25 +2,27 @@ Source: python-stdlib-list
 Section: python
 Priority: optional
 Maintainer: Debian Python Team <team+python@tracker.debian.org>
-Uploaders: Robbi Nespu <robbinespu@gmail.com>
+Uploaders:
+ Robbi Nespu <robbinespu@gmail.com>,
 Testsuite: autopkgtest-pkg-pybuild
-Build-Depends: debhelper-compat (= 13),
-                dh-sequence-python3,
-                pybuild-plugin-pyproject,
-                python3-all,
-                python3-pytest,
-                python3-setuptools,
-                flit
+Build-Depends:
+ debhelper-compat (= 13),
+ dh-sequence-python3,
+ flit,
+ pybuild-plugin-pyproject,
+ python3-all,
+ python3-pytest,
 Standards-Version: 4.6.2
 Vcs-Browser: https://salsa.debian.org/python-team/packages/python-stdlib-list
 Vcs-Git: https://salsa.debian.org/python-team/packages/python-stdlib-list.git
 Homepage: https://github.com/jackmaney/python-stdlib-list
-Rules-Requires-Root: no
 
 Package: python3-stdlib-list
 Architecture: all
-Depends: ${python3:Depends}, ${misc:Depends}
-Description: List of Python Standard Libraries (2.6-7, 3.2-9)
+Depends:
+ ${misc:Depends},
+ ${python3:Depends},
+Description: List of Python Standard Libraries
  This package includes lists of all of the standard libraries for
- Python 2.6, 2.7, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, and 3.9 along
+ Python 2.6, 2.7 and 3.2 until 3.14 along
  with the code for scraping the official Python docs to get said lists.
diff -pruN 0.11.1-1/debian/copyright 0.12.0-1/debian/copyright
--- 0.11.1-1/debian/copyright	2025-02-24 18:16:20.000000000 +0000
+++ 0.12.0-1/debian/copyright	2025-10-27 22:36:26.000000000 +0000
@@ -27,4 +27,3 @@ License: MIT
  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 -pruN 0.11.1-1/docs/index.rst 0.12.0-1/docs/index.rst
--- 0.11.1-1/docs/index.rst	2025-02-18 15:35:49.000000000 +0000
+++ 0.12.0-1/docs/index.rst	2025-10-24 19:19:32.000000000 +0000
@@ -2,7 +2,7 @@ stdlib-list
 ===========
 
 This package includes lists of all of the standard libraries for Python 2.6
-through 3.13.
+through 3.14.
 
 .. note::
 
diff -pruN 0.11.1-1/pyproject.toml 0.12.0-1/pyproject.toml
--- 0.11.1-1/pyproject.toml	2025-02-18 15:35:49.000000000 +0000
+++ 0.12.0-1/pyproject.toml	2025-10-24 19:19:32.000000000 +0000
@@ -11,7 +11,7 @@ include = ["tests/"]
 [project]
 name = "stdlib-list"
 dynamic = ["version"]
-description = "A list of Python Standard Libraries (2.7 through 3.13)."
+description = "A list of Python Standard Libraries (2.7 through 3.14)."
 readme = "README.md"
 license = { file = "LICENSE" }
 authors = [{ name = "Jack Maney", email = "jackmaney@gmail.com" }]
diff -pruN 0.11.1-1/stdlib_list/__init__.py 0.12.0-1/stdlib_list/__init__.py
--- 0.11.1-1/stdlib_list/__init__.py	2025-02-18 15:35:49.000000000 +0000
+++ 0.12.0-1/stdlib_list/__init__.py	2025-10-24 19:19:32.000000000 +0000
@@ -1,4 +1,4 @@
-__version__ = "0.11.1"
+__version__ = "0.12.0"
 
 # Import all the things that used to be in here for backwards-compatibility reasons
 from .base import (
diff -pruN 0.11.1-1/stdlib_list/base.py 0.12.0-1/stdlib_list/base.py
--- 0.11.1-1/stdlib_list/base.py	2025-02-18 15:35:49.000000000 +0000
+++ 0.12.0-1/stdlib_list/base.py	2025-10-24 19:19:32.000000000 +0000
@@ -20,6 +20,7 @@ long_versions = [
     "3.11",
     "3.12",
     "3.13",
+    "3.14",
 ]
 
 short_versions = [".".join(x.split(".")[:2]) for x in long_versions]
@@ -58,18 +59,17 @@ def stdlib_list(version: str | None = No
 
     data = pkgutil.get_data("stdlib_list", module_list_file).decode()  # type: ignore[union-attr]
 
-    result = [y for y in [x.strip() for x in data.splitlines()] if y]
+    result = [y for x in data.splitlines() if (y := x.strip())]
 
     return result
 
 
 @lru_cache(maxsize=16)
-def _stdlib_list_with_cache(version: str | None = None) -> list[str]:
+def _stdlib_list_with_cache(version: str | None = None) -> frozenset[str]:
     """Internal cached version of `stdlib_list`"""
-    return stdlib_list(version=version)
+    return frozenset(stdlib_list(version=version))
 
 
-@lru_cache(maxsize=256)
 def in_stdlib(module_name: str, version: str | None = None) -> bool:
     """
     Return a ``bool`` indicating if module ``module_name`` is in the list of stdlib
diff -pruN 0.11.1-1/stdlib_list/lists/3.13.txt 0.12.0-1/stdlib_list/lists/3.13.txt
--- 0.11.1-1/stdlib_list/lists/3.13.txt	2025-02-18 15:35:49.000000000 +0000
+++ 0.12.0-1/stdlib_list/lists/3.13.txt	2025-10-24 19:19:32.000000000 +0000
@@ -67,6 +67,7 @@ _pyrepl
 _pyrepl.__main__
 _pyrepl._minimal_curses
 _pyrepl._threading_handler
+_pyrepl.base_eventqueue
 _pyrepl.commands
 _pyrepl.completing_reader
 _pyrepl.console
@@ -86,6 +87,7 @@ _pyrepl.unix_console
 _pyrepl.unix_eventqueue
 _pyrepl.utils
 _pyrepl.windows_console
+_pyrepl.windows_eventqueue
 _queue
 _random
 _scproxy
diff -pruN 0.11.1-1/stdlib_list/lists/3.14.txt 0.12.0-1/stdlib_list/lists/3.14.txt
--- 0.11.1-1/stdlib_list/lists/3.14.txt	1970-01-01 00:00:00.000000000 +0000
+++ 0.12.0-1/stdlib_list/lists/3.14.txt	2025-10-24 19:19:32.000000000 +0000
@@ -0,0 +1,827 @@
+__future__
+__main__
+_abc
+_aix_support
+_android_support
+_apple_support
+_ast
+_ast_unparse
+_asyncio
+_bisect
+_blake2
+_bz2
+_codecs
+_codecs_cn
+_codecs_hk
+_codecs_iso2022
+_codecs_jp
+_codecs_kr
+_codecs_tw
+_collections
+_collections_abc
+_colorize
+_compat_pickle
+_contextvars
+_csv
+_ctypes
+_curses
+_curses_panel
+_datetime
+_dbm
+_decimal
+_elementtree
+_frozen_importlib
+_frozen_importlib_external
+_functools
+_gdbm
+_hashlib
+_heapq
+_hmac
+_imp
+_interpchannels
+_interpqueues
+_interpreters
+_io
+_ios_support
+_json
+_locale
+_lsprof
+_lzma
+_markupbase
+_md5
+_multibytecodec
+_multiprocessing
+_opcode
+_opcode_metadata
+_operator
+_osx_support
+_overlapped
+_pickle
+_posixshmem
+_posixsubprocess
+_py_abc
+_py_warnings
+_pydatetime
+_pydecimal
+_pyio
+_pylong
+_pyrepl
+_pyrepl.__main__
+_pyrepl._module_completer
+_pyrepl._threading_handler
+_pyrepl.base_eventqueue
+_pyrepl.commands
+_pyrepl.completing_reader
+_pyrepl.console
+_pyrepl.fancy_termios
+_pyrepl.historical_reader
+_pyrepl.input
+_pyrepl.keymap
+_pyrepl.main
+_pyrepl.pager
+_pyrepl.reader
+_pyrepl.readline
+_pyrepl.simple_interact
+_pyrepl.terminfo
+_pyrepl.trace
+_pyrepl.types
+_pyrepl.unix_console
+_pyrepl.unix_eventqueue
+_pyrepl.utils
+_pyrepl.windows_console
+_pyrepl.windows_eventqueue
+_queue
+_random
+_remote_debugging
+_scproxy
+_sha1
+_sha2
+_sha3
+_signal
+_sitebuiltins
+_socket
+_sqlite3
+_sre
+_ssl
+_stat
+_statistics
+_string
+_strptime
+_struct
+_suggestions
+_symtable
+_sysconfig
+_thread
+_threading_local
+_tkinter
+_tokenize
+_tracemalloc
+_types
+_typing
+_uuid
+_warnings
+_weakref
+_weakrefset
+_winapi
+_wmi
+_zoneinfo
+_zstd
+abc
+annotationlib
+antigravity
+argparse
+array
+ast
+asyncio
+asyncio.__main__
+asyncio.base_events
+asyncio.base_futures
+asyncio.base_subprocess
+asyncio.base_tasks
+asyncio.constants
+asyncio.coroutines
+asyncio.events
+asyncio.exceptions
+asyncio.format_helpers
+asyncio.futures
+asyncio.graph
+asyncio.locks
+asyncio.log
+asyncio.mixins
+asyncio.proactor_events
+asyncio.protocols
+asyncio.queues
+asyncio.runners
+asyncio.selector_events
+asyncio.sslproto
+asyncio.staggered
+asyncio.streams
+asyncio.subprocess
+asyncio.taskgroups
+asyncio.tasks
+asyncio.threads
+asyncio.timeouts
+asyncio.tools
+asyncio.transports
+asyncio.trsock
+asyncio.unix_events
+asyncio.windows_events
+asyncio.windows_utils
+atexit
+base64
+bdb
+binascii
+bisect
+builtins
+bz2
+cProfile
+calendar
+cmath
+cmd
+code
+codecs
+codeop
+collections
+colorsys
+compileall
+compression
+compression._common
+compression._common._streams
+compression.bz2
+compression.gzip
+compression.lzma
+compression.zlib
+compression.zstd
+compression.zstd._zstdfile
+concurrent
+concurrent.futures
+concurrent.futures._base
+concurrent.futures.interpreter
+concurrent.futures.process
+concurrent.futures.thread
+concurrent.interpreters
+concurrent.interpreters._crossinterp
+concurrent.interpreters._queues
+configparser
+contextlib
+contextvars
+copy
+copyreg
+csv
+ctypes
+ctypes._aix
+ctypes._endian
+ctypes._layout
+ctypes.macholib
+ctypes.macholib.dyld
+ctypes.macholib.dylib
+ctypes.macholib.framework
+ctypes.util
+ctypes.wintypes
+curses
+curses.ascii
+curses.has_key
+curses.panel
+curses.textpad
+dataclasses
+datetime
+dbm
+dbm.dumb
+dbm.gnu
+dbm.ndbm
+dbm.sqlite3
+decimal
+difflib
+dis
+doctest
+email
+email._encoded_words
+email._header_value_parser
+email._parseaddr
+email._policybase
+email.base64mime
+email.charset
+email.contentmanager
+email.encoders
+email.errors
+email.feedparser
+email.generator
+email.header
+email.headerregistry
+email.iterators
+email.message
+email.mime
+email.mime.application
+email.mime.audio
+email.mime.base
+email.mime.image
+email.mime.message
+email.mime.multipart
+email.mime.nonmultipart
+email.mime.text
+email.parser
+email.policy
+email.quoprimime
+email.utils
+encodings
+encodings._win_cp_codecs
+encodings.aliases
+encodings.ascii
+encodings.base64_codec
+encodings.big5
+encodings.big5hkscs
+encodings.bz2_codec
+encodings.charmap
+encodings.cp037
+encodings.cp1006
+encodings.cp1026
+encodings.cp1125
+encodings.cp1140
+encodings.cp1250
+encodings.cp1251
+encodings.cp1252
+encodings.cp1253
+encodings.cp1254
+encodings.cp1255
+encodings.cp1256
+encodings.cp1257
+encodings.cp1258
+encodings.cp273
+encodings.cp424
+encodings.cp437
+encodings.cp500
+encodings.cp720
+encodings.cp737
+encodings.cp775
+encodings.cp850
+encodings.cp852
+encodings.cp855
+encodings.cp856
+encodings.cp857
+encodings.cp858
+encodings.cp860
+encodings.cp861
+encodings.cp862
+encodings.cp863
+encodings.cp864
+encodings.cp865
+encodings.cp866
+encodings.cp869
+encodings.cp874
+encodings.cp875
+encodings.cp932
+encodings.cp949
+encodings.cp950
+encodings.euc_jis_2004
+encodings.euc_jisx0213
+encodings.euc_jp
+encodings.euc_kr
+encodings.gb18030
+encodings.gb2312
+encodings.gbk
+encodings.hex_codec
+encodings.hp_roman8
+encodings.hz
+encodings.idna
+encodings.iso2022_jp
+encodings.iso2022_jp_1
+encodings.iso2022_jp_2
+encodings.iso2022_jp_2004
+encodings.iso2022_jp_3
+encodings.iso2022_jp_ext
+encodings.iso2022_kr
+encodings.iso8859_1
+encodings.iso8859_10
+encodings.iso8859_11
+encodings.iso8859_13
+encodings.iso8859_14
+encodings.iso8859_15
+encodings.iso8859_16
+encodings.iso8859_2
+encodings.iso8859_3
+encodings.iso8859_4
+encodings.iso8859_5
+encodings.iso8859_6
+encodings.iso8859_7
+encodings.iso8859_8
+encodings.iso8859_9
+encodings.johab
+encodings.koi8_r
+encodings.koi8_t
+encodings.koi8_u
+encodings.kz1048
+encodings.latin_1
+encodings.mac_arabic
+encodings.mac_croatian
+encodings.mac_cyrillic
+encodings.mac_farsi
+encodings.mac_greek
+encodings.mac_iceland
+encodings.mac_latin2
+encodings.mac_roman
+encodings.mac_romanian
+encodings.mac_turkish
+encodings.mbcs
+encodings.oem
+encodings.palmos
+encodings.ptcp154
+encodings.punycode
+encodings.quopri_codec
+encodings.raw_unicode_escape
+encodings.rot_13
+encodings.shift_jis
+encodings.shift_jis_2004
+encodings.shift_jisx0213
+encodings.tis_620
+encodings.undefined
+encodings.unicode_escape
+encodings.utf_16
+encodings.utf_16_be
+encodings.utf_16_le
+encodings.utf_32
+encodings.utf_32_be
+encodings.utf_32_le
+encodings.utf_7
+encodings.utf_8
+encodings.utf_8_sig
+encodings.uu_codec
+encodings.zlib_codec
+ensurepip
+ensurepip.__main__
+ensurepip._uninstall
+enum
+errno
+faulthandler
+fcntl
+filecmp
+fileinput
+fnmatch
+fractions
+ftplib
+functools
+gc
+genericpath
+getopt
+getpass
+gettext
+glob
+graphlib
+grp
+gzip
+hashlib
+heapq
+hmac
+html
+html.entities
+html.parser
+http
+http.client
+http.cookiejar
+http.cookies
+http.server
+idlelib
+idlelib.__main__
+idlelib.autocomplete
+idlelib.autocomplete_w
+idlelib.autoexpand
+idlelib.browser
+idlelib.calltip
+idlelib.calltip_w
+idlelib.codecontext
+idlelib.colorizer
+idlelib.config
+idlelib.config_key
+idlelib.configdialog
+idlelib.debugger
+idlelib.debugger_r
+idlelib.debugobj
+idlelib.debugobj_r
+idlelib.delegator
+idlelib.dynoption
+idlelib.editor
+idlelib.filelist
+idlelib.format
+idlelib.grep
+idlelib.help
+idlelib.help_about
+idlelib.history
+idlelib.hyperparser
+idlelib.idle
+idlelib.idle_test
+idlelib.idle_test.htest
+idlelib.idle_test.mock_idle
+idlelib.idle_test.mock_tk
+idlelib.idle_test.template
+idlelib.idle_test.test_autocomplete
+idlelib.idle_test.test_autocomplete_w
+idlelib.idle_test.test_autoexpand
+idlelib.idle_test.test_browser
+idlelib.idle_test.test_calltip
+idlelib.idle_test.test_calltip_w
+idlelib.idle_test.test_codecontext
+idlelib.idle_test.test_colorizer
+idlelib.idle_test.test_config
+idlelib.idle_test.test_config_key
+idlelib.idle_test.test_configdialog
+idlelib.idle_test.test_debugger
+idlelib.idle_test.test_debugger_r
+idlelib.idle_test.test_debugobj
+idlelib.idle_test.test_debugobj_r
+idlelib.idle_test.test_delegator
+idlelib.idle_test.test_editmenu
+idlelib.idle_test.test_editor
+idlelib.idle_test.test_filelist
+idlelib.idle_test.test_format
+idlelib.idle_test.test_grep
+idlelib.idle_test.test_help
+idlelib.idle_test.test_help_about
+idlelib.idle_test.test_history
+idlelib.idle_test.test_hyperparser
+idlelib.idle_test.test_iomenu
+idlelib.idle_test.test_macosx
+idlelib.idle_test.test_mainmenu
+idlelib.idle_test.test_multicall
+idlelib.idle_test.test_outwin
+idlelib.idle_test.test_parenmatch
+idlelib.idle_test.test_pathbrowser
+idlelib.idle_test.test_percolator
+idlelib.idle_test.test_pyparse
+idlelib.idle_test.test_pyshell
+idlelib.idle_test.test_query
+idlelib.idle_test.test_redirector
+idlelib.idle_test.test_replace
+idlelib.idle_test.test_rpc
+idlelib.idle_test.test_run
+idlelib.idle_test.test_runscript
+idlelib.idle_test.test_scrolledlist
+idlelib.idle_test.test_search
+idlelib.idle_test.test_searchbase
+idlelib.idle_test.test_searchengine
+idlelib.idle_test.test_sidebar
+idlelib.idle_test.test_squeezer
+idlelib.idle_test.test_stackviewer
+idlelib.idle_test.test_statusbar
+idlelib.idle_test.test_text
+idlelib.idle_test.test_textview
+idlelib.idle_test.test_tooltip
+idlelib.idle_test.test_tree
+idlelib.idle_test.test_undo
+idlelib.idle_test.test_util
+idlelib.idle_test.test_warning
+idlelib.idle_test.test_window
+idlelib.idle_test.test_zoomheight
+idlelib.idle_test.test_zzdummy
+idlelib.idle_test.tkinter_testing_utils
+idlelib.iomenu
+idlelib.macosx
+idlelib.mainmenu
+idlelib.multicall
+idlelib.outwin
+idlelib.parenmatch
+idlelib.pathbrowser
+idlelib.percolator
+idlelib.pyparse
+idlelib.pyshell
+idlelib.query
+idlelib.redirector
+idlelib.replace
+idlelib.rpc
+idlelib.run
+idlelib.runscript
+idlelib.scrolledlist
+idlelib.search
+idlelib.searchbase
+idlelib.searchengine
+idlelib.sidebar
+idlelib.squeezer
+idlelib.stackviewer
+idlelib.statusbar
+idlelib.textview
+idlelib.tooltip
+idlelib.tree
+idlelib.undo
+idlelib.util
+idlelib.window
+idlelib.zoomheight
+idlelib.zzdummy
+imaplib
+importlib
+importlib._abc
+importlib._bootstrap
+importlib._bootstrap_external
+importlib.abc
+importlib.machinery
+importlib.metadata
+importlib.metadata._adapters
+importlib.metadata._collections
+importlib.metadata._functools
+importlib.metadata._itertools
+importlib.metadata._meta
+importlib.metadata._text
+importlib.metadata.diagnose
+importlib.readers
+importlib.resources
+importlib.resources._adapters
+importlib.resources._common
+importlib.resources._functional
+importlib.resources._itertools
+importlib.resources.abc
+importlib.resources.readers
+importlib.resources.simple
+importlib.simple
+importlib.util
+inspect
+io
+ipaddress
+itertools
+json
+json.__main__
+json.decoder
+json.encoder
+json.scanner
+json.tool
+keyword
+linecache
+locale
+logging
+logging.config
+logging.handlers
+lzma
+mailbox
+marshal
+math
+mimetypes
+mmap
+modulefinder
+msvcrt
+multiprocessing
+multiprocessing.connection
+multiprocessing.context
+multiprocessing.dummy
+multiprocessing.dummy.connection
+multiprocessing.forkserver
+multiprocessing.heap
+multiprocessing.managers
+multiprocessing.pool
+multiprocessing.popen_fork
+multiprocessing.popen_forkserver
+multiprocessing.popen_spawn_posix
+multiprocessing.popen_spawn_win32
+multiprocessing.process
+multiprocessing.queues
+multiprocessing.reduction
+multiprocessing.resource_sharer
+multiprocessing.resource_tracker
+multiprocessing.shared_memory
+multiprocessing.sharedctypes
+multiprocessing.spawn
+multiprocessing.synchronize
+multiprocessing.util
+netrc
+nt
+ntpath
+nturl2path
+numbers
+opcode
+operator
+optparse
+os
+os.path
+pathlib
+pathlib._os
+pathlib.types
+pdb
+pickle
+pickletools
+pkgutil
+platform
+plistlib
+poplib
+posix
+posixpath
+pprint
+profile
+pstats
+pty
+pwd
+py_compile
+pyclbr
+pydoc
+pydoc_data
+pydoc_data.topics
+pyexpat
+pyexpat.errors
+pyexpat.model
+queue
+quopri
+random
+re
+re._casefix
+re._compiler
+re._constants
+re._parser
+readline
+reprlib
+resource
+rlcompleter
+runpy
+sched
+secrets
+select
+selectors
+shelve
+shlex
+shutil
+signal
+site
+smtplib
+socket
+socketserver
+sqlite3
+sqlite3.__main__
+sqlite3.dbapi2
+sqlite3.dump
+sre_compile
+sre_constants
+sre_parse
+ssl
+stat
+statistics
+string
+string.templatelib
+stringprep
+struct
+subprocess
+symtable
+sys
+sysconfig
+sysconfig.__main__
+syslog
+tabnanny
+tarfile
+tempfile
+termios
+textwrap
+this
+threading
+time
+timeit
+tkinter
+tkinter.__main__
+tkinter.colorchooser
+tkinter.commondialog
+tkinter.constants
+tkinter.dialog
+tkinter.dnd
+tkinter.filedialog
+tkinter.font
+tkinter.messagebox
+tkinter.scrolledtext
+tkinter.simpledialog
+tkinter.ttk
+token
+tokenize
+tomllib
+tomllib._parser
+tomllib._re
+tomllib._types
+trace
+traceback
+tracemalloc
+tty
+turtle
+turtledemo
+turtledemo.__main__
+turtledemo.bytedesign
+turtledemo.chaos
+turtledemo.clock
+turtledemo.colormixer
+turtledemo.forest
+turtledemo.fractalcurves
+turtledemo.lindenmayer
+turtledemo.minimal_hanoi
+turtledemo.nim
+turtledemo.paint
+turtledemo.peace
+turtledemo.penrose
+turtledemo.planet_and_moon
+turtledemo.rosette
+turtledemo.round_dance
+turtledemo.sorting_animate
+turtledemo.tree
+turtledemo.two_canvases
+turtledemo.yinyang
+types
+typing
+unicodedata
+unittest
+unittest.__main__
+unittest._log
+unittest.async_case
+unittest.case
+unittest.loader
+unittest.main
+unittest.mock
+unittest.result
+unittest.runner
+unittest.signals
+unittest.suite
+unittest.util
+urllib
+urllib.error
+urllib.parse
+urllib.request
+urllib.response
+urllib.robotparser
+uuid
+venv
+venv.__main__
+warnings
+wave
+weakref
+webbrowser
+winreg
+winsound
+wsgiref
+wsgiref.handlers
+wsgiref.headers
+wsgiref.simple_server
+wsgiref.types
+wsgiref.util
+wsgiref.validate
+xml
+xml.dom
+xml.dom.NodeFilter
+xml.dom.domreg
+xml.dom.expatbuilder
+xml.dom.minicompat
+xml.dom.minidom
+xml.dom.pulldom
+xml.dom.xmlbuilder
+xml.etree
+xml.etree.ElementInclude
+xml.etree.ElementPath
+xml.etree.ElementTree
+xml.etree.cElementTree
+xml.parsers
+xml.parsers.expat
+xml.sax
+xml.sax._exceptions
+xml.sax.expatreader
+xml.sax.handler
+xml.sax.saxutils
+xml.sax.xmlreader
+xmlrpc
+xmlrpc.client
+xmlrpc.server
+zipapp
+zipfile
+zipfile.__main__
+zipfile._path
+zipfile._path.glob
+zipimport
+zlib
+zoneinfo
+zoneinfo._common
+zoneinfo._tzpath
+zoneinfo._zoneinfo
diff -pruN 0.11.1-1/support/walk-modules.py 0.12.0-1/support/walk-modules.py
--- 0.11.1-1/support/walk-modules.py	2025-02-18 15:35:49.000000000 +0000
+++ 0.12.0-1/support/walk-modules.py	2025-10-24 19:19:32.000000000 +0000
@@ -1,24 +1,30 @@
 #!/usr/bin/env python
+from __future__ import annotations
 
+import importlib
 import inspect
 import pkgutil
 import sys
 
+TYPE_CHECKING = False
+if TYPE_CHECKING:
+    from collections.abc import Sequence
+    from types import ModuleType
+
 SEEN_MODS = set()
 
 
-def walk_pkgutil(mod_name, mod, io):
-    for pkg in pkgutil.walk_packages(mod.__path__, mod_name + "."):
+def walk_pkgutil(mod_name: str, locations: Sequence[str]) -> None:
+    for pkg in pkgutil.walk_packages(locations, f"{mod_name}."):
         if pkg.name in SEEN_MODS:
             continue
         else:
             # We don't recurse here because `walk_packages` takes care of
             # it for us.
             SEEN_MODS.add(pkg.name)
-            print(pkg.name, file=io)
 
 
-def walk_naive(mod_name, mod, io):
+def walk_naive(mod_name: str, mod: ModuleType) -> None:
     for attr in dir(mod):
         attr_obj = getattr(mod, attr, None)
         # Shouldn't happen, but who knows.
@@ -33,9 +39,9 @@ def walk_naive(mod_name, mod, io):
         # and import the submodule by its qualified name.
         # If the import fails, we know it's a re-exported module.
         try:
-            submod_name = mod_name + "." + attr
-            __import__(submod_name)
-            walk(submod_name, io)
+            submod_name = f"{mod_name}.{attr}"
+            importlib.import_module(submod_name)
+            walk(submod_name)
         except ImportError:
             # ...but sometimes we do want to include re-exports, since
             # they might be things like "accelerator" modules that don't
@@ -45,47 +51,59 @@ def walk_naive(mod_name, mod, io):
                 # Again, try and import to avoid module-looking object
                 # that don't actually appear on disk. Experimentally,
                 # there are a few of these (like "TK").
-                __import__(attr)
-                walk(attr, io)
+                importlib.import_module(attr)
+                walk(attr)
             except ImportError:
                 continue
 
 
-def walk(mod_name, io):
+def walk(mod_name: str) -> None:
     if mod_name in SEEN_MODS:
         return
     else:
         SEEN_MODS.add(mod_name)
-        print(mod_name, file=io)
 
     # Try and import it.
     try:
-        mod = __import__(mod_name)
+        mod = importlib.import_module(mod_name)
+    except ImportError:
+        return
 
-        if hasattr(mod, "__path__"):
-            walk_pkgutil(mod_name, mod, io)
-        else:
-            walk_naive(mod_name, mod, io)
+    try:
+        locations = mod.__spec__.submodule_search_locations
+    except AttributeError:
+        locations = None
 
-    except ImportError:
-        pass
+    if locations is not None:
+        walk_pkgutil(mod_name, locations)
+    else:
+        walk_naive(mod_name, mod)
 
 
 if __name__ == "__main__":
     output = sys.argv[1]
 
-    with open(output, mode="w") as io:
-        for mod_name in sys.builtin_module_names:
-            walk(mod_name, io)
-
-        if hasattr(sys, "stdlib_module_names"):
-            for mod_name in sys.stdlib_module_names:
-                walk(mod_name, io)
-        else:
-            for mod_name in sys.stdin:
-                # Our precomputed list might not start at the root, since it
-                # might be a package rather than a module.
-                if "." in mod_name:
-                    top_mod = mod_name.split(".")[0]
-                    walk(top_mod, io)
-                walk(mod_name.rstrip("\n"), io)
+    for mod_name in sys.builtin_module_names:
+        walk(mod_name)
+
+    if hasattr(sys, "stdlib_module_names"):
+        for mod_name in sys.stdlib_module_names:
+            walk(mod_name)
+    else:
+        for mod_name in sys.stdin:
+            # Our precomputed list might not start at the root, since it
+            # might be a package rather than a module.
+            if "." in mod_name:
+                top_mod = mod_name.split(".")[0]
+                walk(top_mod)
+            walk(mod_name.rstrip("\n"))
+
+    try:
+        with open(output, encoding="utf-8") as io:
+            SEEN_MODS.update(io.read().splitlines())
+    except FileNotFoundError:
+        pass
+
+    with open(output, mode="w", encoding="utf-8") as io:
+        for line in sorted(SEEN_MODS):
+            print(line, file=io)
