)]}'
{
  "log": [
    {
      "commit": "e2073db14d28d1c3299649dd0c2dd4205b43ebfd",
      "tree": "af8158ce77eeff9ed222c9f67487ad60af799e98",
      "parents": [
        "a5d90c6ed8279a3ca6a39ad10fed84f46b797287",
        "cba1f53e9ef351e747f7290ba369c0d567eab3fc"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu Aug 20 04:12:48 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 04:12:48 2026"
      },
      "message": "Merge pull request #272 from kjd/condense-exception-attrs-doc\n\nCondense the README section on machine-readable exception attributes"
    },
    {
      "commit": "cba1f53e9ef351e747f7290ba369c0d567eab3fc",
      "tree": "af8158ce77eeff9ed222c9f67487ad60af799e98",
      "parents": [
        "f7c797d9431f54500cf5fe4e3bb68252c10459c3"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu Aug 20 03:58:24 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu Aug 20 03:58:35 2026"
      },
      "message": "Drop the README table cross-check now that the code list is not documented there\n"
    },
    {
      "commit": "f7c797d9431f54500cf5fe4e3bb68252c10459c3",
      "tree": "e7ce93c772b97627ff745cb10d0c60db6e045747",
      "parents": [
        "d7b6f0501b64abfbc7918332cc0bdc099376bc76",
        "a5d90c6ed8279a3ca6a39ad10fed84f46b797287"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu Aug 20 03:55:00 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu Aug 20 03:55:00 2026"
      },
      "message": "Merge branch \u0027master\u0027 into condense-exception-attrs-doc"
    },
    {
      "commit": "d7b6f0501b64abfbc7918332cc0bdc099376bc76",
      "tree": "c88103f77c0d42f2595920b5fad7f830b09ff020",
      "parents": [
        "2798a9afce01a98af425351bbac070a4f7410616"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu Aug 20 03:48:59 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu Aug 20 03:48:59 2026"
      },
      "message": "Condense the README section on machine-readable exception attributes\n"
    },
    {
      "commit": "a5d90c6ed8279a3ca6a39ad10fed84f46b797287",
      "tree": "389f1ea72569082e8accc8edf6007d9bdbb6a0a3",
      "parents": [
        "2798a9afce01a98af425351bbac070a4f7410616",
        "b90f25be787d64df8158c002c5697682e4a2bcdf"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 16:46:30 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 16:46:30 2026"
      },
      "message": "Merge pull request #271 from kjd/fix-fuzz-length-findings\n\nFix fuzz length findings"
    },
    {
      "commit": "b90f25be787d64df8158c002c5697682e4a2bcdf",
      "tree": "389f1ea72569082e8accc8edf6007d9bdbb6a0a3",
      "parents": [
        "bc8622a36c4dcdf38a7d1f178966506fd0e661a8"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 16:32:06 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 16:35:37 2026"
      },
      "message": "Skip the uts46_remap idempotency check when mapping expands past the input cap\n"
    },
    {
      "commit": "bc8622a36c4dcdf38a7d1f178966506fd0e661a8",
      "tree": "ddb1b360e17482c2514bd897cdd205c02786185d",
      "parents": [
        "2798a9afce01a98af425351bbac070a4f7410616"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 16:32:06 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 16:35:37 2026"
      },
      "message": "Enforce the whole-domain length limit in the incremental idna2008 codec\n"
    },
    {
      "commit": "2798a9afce01a98af425351bbac070a4f7410616",
      "tree": "0d8a23abf3fe1ae2dafe18fed21c2b557b7b3ac7",
      "parents": [
        "5d4f189856819a1c6bea79a7688d68d5a39c615c",
        "0d379e10eb8b08b5fc0281d1a030a3b7bd6c2ab3"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 05:25:30 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 05:25:30 2026"
      },
      "message": "Merge pull request #270 from kjd/fix-history-date\n\nAdd 3.19 release date"
    },
    {
      "commit": "0d379e10eb8b08b5fc0281d1a030a3b7bd6c2ab3",
      "tree": "0d8a23abf3fe1ae2dafe18fed21c2b557b7b3ac7",
      "parents": [
        "5d4f189856819a1c6bea79a7688d68d5a39c615c"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 05:20:39 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 05:20:39 2026"
      },
      "message": "Add 3.19 release date\n"
    },
    {
      "commit": "5d4f189856819a1c6bea79a7688d68d5a39c615c",
      "tree": "71e74744c8e0814e9a763ac757e8f6c42d636935",
      "parents": [
        "5cce1308d148019c5fa0febceafa13e99cdacfe7",
        "03a9a11dd8aecd4fea742cabe20f4d3d9ed82abb"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 05:17:36 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 05:17:36 2026"
      },
      "message": "Merge pull request #269 from kjd/release-3.19\n\nRelease 3.19"
    },
    {
      "commit": "03a9a11dd8aecd4fea742cabe20f4d3d9ed82abb",
      "tree": "71e74744c8e0814e9a763ac757e8f6c42d636935",
      "parents": [
        "2d2a7ef0c59210a48407b3dde6d884933cecf093"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 05:10:29 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 05:10:29 2026"
      },
      "message": "Release 3.19\n"
    },
    {
      "commit": "2d2a7ef0c59210a48407b3dde6d884933cecf093",
      "tree": "03e6324cec8c3bb40c39bee215a094af8707f41b",
      "parents": [
        "5cce1308d148019c5fa0febceafa13e99cdacfe7"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 05:05:50 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 05:05:50 2026"
      },
      "message": "Pre-release 3.19rc0\n"
    },
    {
      "commit": "5cce1308d148019c5fa0febceafa13e99cdacfe7",
      "tree": "1daa5af995a35ea533abab89202f766e46f66e28",
      "parents": [
        "ce9fd98ac4073866db276e93834b259f2a5a4ac4",
        "3914b75f3e4cbc11e59f92eeecdb16d10871e57f"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 05:01:38 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 05:01:38 2026"
      },
      "message": "Merge pull request #268 from kjd/fix-std3-regex-alert\n\nSplit the STD3 disallowed-character range so uppercase is explicit"
    },
    {
      "commit": "3914b75f3e4cbc11e59f92eeecdb16d10871e57f",
      "tree": "1daa5af995a35ea533abab89202f766e46f66e28",
      "parents": [
        "ce9fd98ac4073866db276e93834b259f2a5a4ac4"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 04:31:17 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 04:31:17 2026"
      },
      "message": "Split the STD3 disallowed-character range so uppercase is explicit\n"
    },
    {
      "commit": "ce9fd98ac4073866db276e93834b259f2a5a4ac4",
      "tree": "38f292b7f88a0b5baca1f6f94c90a5dcb630db13",
      "parents": [
        "35c57f2bc15e4e63592850b194abb16a64246783",
        "809240c3cc9358c9c9c79b2d12ffe39e75ccfb0f"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 03:28:02 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Aug 18 03:28:02 2026"
      },
      "message": "Merge pull request #267 from kjd/housekeeping\n\nHousekeeping"
    },
    {
      "commit": "809240c3cc9358c9c9c79b2d12ffe39e75ccfb0f",
      "tree": "38f292b7f88a0b5baca1f6f94c90a5dcb630db13",
      "parents": [
        "d9e16c523d7d25dcc14100fa80f3e303404e09be"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 03:05:33 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Aug 18 03:05:33 2026"
      },
      "message": "Fail CI when the license copyright year is behind the current year\n"
    },
    {
      "commit": "d9e16c523d7d25dcc14100fa80f3e303404e09be",
      "tree": "96fe425137ed5bab3edee6580c3f1055865c4360",
      "parents": [
        "ef30feeed3a758e96286fdab0315a551f7f5e7d6"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 19:23:27 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 19:23:27 2026"
      },
      "message": "Consolidate test fixtures, prune stale gitignore entries, and fix doc typos\n"
    },
    {
      "commit": "ef30feeed3a758e96286fdab0315a551f7f5e7d6",
      "tree": "81dd5f21646980a8715996332df91894aa2020d7",
      "parents": [
        "b907913f854d26cc714f721c6c2cb626d41ac468"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 19:21:51 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 19:21:51 2026"
      },
      "message": "Remove dead code and pare back superfluous comments\n"
    },
    {
      "commit": "b907913f854d26cc714f721c6c2cb626d41ac468",
      "tree": "122c1cd1ad2f87dbe5c67641641eec20961a38ba",
      "parents": [
        "6204cbe343ef438df7c58bc80b94d0f960991d90"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 19:10:52 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 19:10:52 2026"
      },
      "message": "Tighten the version support and Unicode notes in the README\n"
    },
    {
      "commit": "6204cbe343ef438df7c58bc80b94d0f960991d90",
      "tree": "14a1f024077eaa2da2955bd138f27edb9947949d",
      "parents": [
        "35c57f2bc15e4e63592850b194abb16a64246783"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 19:09:00 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 19:10:45 2026"
      },
      "message": "Ignore local build artifacts and stop packaging stray tooling config\n"
    },
    {
      "commit": "35c57f2bc15e4e63592850b194abb16a64246783",
      "tree": "f2adacc334bfab9c2221f318cade0a4bde076aea",
      "parents": [
        "880ea904d1d32314bbf6df5e0eeee698f3bd7ba4",
        "2d62fb816ca84c461f1a9bf249f935e4a2c19f9f"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 18:57:17 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 18:57:17 2026"
      },
      "message": "Merge pull request #266 from kjd/unicode-version-and-ci-checks\n\nUnicode version and ci checks"
    },
    {
      "commit": "2d62fb816ca84c461f1a9bf249f935e4a2c19f9f",
      "tree": "f2adacc334bfab9c2221f318cade0a4bde076aea",
      "parents": [
        "7d06ef685de7a052230b440ede2f2b840d1ca817"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 18:51:58 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 18:51:58 2026"
      },
      "message": "Look up sys._is_gil_enabled dynamically so type checking against Python 3.9 passes\n"
    },
    {
      "commit": "7d06ef685de7a052230b440ede2f2b840d1ca817",
      "tree": "12186814706bf430472281d086a0cd4642931c2f",
      "parents": [
        "d67cca071eb3f230617f64c17b7021101bc082b9"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 18:41:43 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 18:41:43 2026"
      },
      "message": "Measure test coverage in CI on CPython and fail below 95%\n"
    },
    {
      "commit": "d67cca071eb3f230617f64c17b7021101bc082b9",
      "tree": "73d4845a0c97388aabf2472235465269ad359a24",
      "parents": [
        "9e2ef62db2ebee0079aa3044b4418897dbc65c9e"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 18:34:46 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 18:34:46 2026"
      },
      "message": "Test on free-threaded Python with the GIL disabled and document thread safety\n"
    },
    {
      "commit": "9e2ef62db2ebee0079aa3044b4418897dbc65c9e",
      "tree": "3eb31a9f555651ed5abca279295feec39646c1f1",
      "parents": [
        "880ea904d1d32314bbf6df5e0eeee698f3bd7ba4"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 18:31:40 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 18:31:40 2026"
      },
      "message": "Expose the Unicode version of the generated tables as idna.unicode_version\n"
    },
    {
      "commit": "880ea904d1d32314bbf6df5e0eeee698f3bd7ba4",
      "tree": "640648e80b408e5dc0fdfbce7dfdffb1a27d7976",
      "parents": [
        "9984fc1dead9cccd037307b12f42c4c67e4927f6",
        "4d7df15d9eb50f61868b3f8e8055bf24080ba651"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 18:12:56 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Mon Aug 17 18:12:56 2026"
      },
      "message": "Merge pull request #265 from kjd/structured-attributes\n\nStructured attributes"
    },
    {
      "commit": "4d7df15d9eb50f61868b3f8e8055bf24080ba651",
      "tree": "640648e80b408e5dc0fdfbce7dfdffb1a27d7976",
      "parents": [
        "4130d91cdf7e9c37856e4f40f842f6087317d400"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 18:05:23 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 18:05:23 2026"
      },
      "message": "Give the CI jobs descriptive names and rename the test job from build to test\n"
    },
    {
      "commit": "4130d91cdf7e9c37856e4f40f842f6087317d400",
      "tree": "f74d6d5af5b8f8f74ef8d4d1093d10996d9a6be2",
      "parents": [
        "c1014f4eb87987892dd47eff1ecc3cc8e28dc4ca"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 17:56:53 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 17:56:53 2026"
      },
      "message": "Force-reinstall the built wheel before testing it so the PyPI release pulled in by twine is not tested instead\n"
    },
    {
      "commit": "c1014f4eb87987892dd47eff1ecc3cc8e28dc4ca",
      "tree": "945755465d7167f1acde2196e100d5526fc9a528",
      "parents": [
        "381a69646ff3f564b6d15ac15301497d0e8c4f42"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 17:47:46 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 17:47:46 2026"
      },
      "message": "Drop hash pinning of the build toolchain, which broke on Linux-only dependencies\n"
    },
    {
      "commit": "381a69646ff3f564b6d15ac15301497d0e8c4f42",
      "tree": "8b885801b34e7a5328bf7f61c5f04753989260a3",
      "parents": [
        "cfc3f48d78c3348b61303d0579f42b2fe38790ed"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 17:33:25 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 17:33:25 2026"
      },
      "message": "Remove redundant comments\n"
    },
    {
      "commit": "cfc3f48d78c3348b61303d0579f42b2fe38790ed",
      "tree": "df67db1711e97a56759157a50b98a08d3a57d7fc",
      "parents": [
        "11e56d8bb6cd1ff71c68126b857c5ccf49aa09a3"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 17:16:58 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 17:16:58 2026"
      },
      "message": "Add hypothesis and ty to the all extra so it covers the full test and lint toolchain\n"
    },
    {
      "commit": "11e56d8bb6cd1ff71c68126b857c5ccf49aa09a3",
      "tree": "3d97e3cc73a55c9c746978d1ec7d6f41c666cbd5",
      "parents": [
        "cdc69bd33f616e75b38686e5a99dbffd5e45b982"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 17:16:58 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 17:16:58 2026"
      },
      "message": "Fetch Unicode data with a timeout and write cache files atomically\n"
    },
    {
      "commit": "cdc69bd33f616e75b38686e5a99dbffd5e45b982",
      "tree": "dc9970c4614df6c2690ffc5d123224fb41c9bb4b",
      "parents": [
        "39175fa435ec0591d884b312439b2cbf67b09427"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 07:00:55 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 07:00:55 2026"
      },
      "message": "Publish only hash-pinned, tested distributions from version tags and take release notes from HISTORY.md\n"
    },
    {
      "commit": "39175fa435ec0591d884b312439b2cbf67b09427",
      "tree": "46d067b76274f893b6e8339bb36bb80d75f001c2",
      "parents": [
        "5a0c98aaf338405362aa994f0f5555013f7b3186"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 06:52:01 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 06:52:01 2026"
      },
      "message": "Make the deprecated transitional argument a no-op so deviation characters are always kept\n"
    },
    {
      "commit": "5a0c98aaf338405362aa994f0f5555013f7b3186",
      "tree": "107aa87e511a6f8ef061a140bdc101f2687402c3",
      "parents": [
        "4c5c42775950b31b21029fe90d40d2faa1fb47ba"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 06:51:24 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon Aug 17 06:51:47 2026"
      },
      "message": "Reject A-labels that are not the canonical Punycode encoding of their U-label\n"
    },
    {
      "commit": "4c5c42775950b31b21029fe90d40d2faa1fb47ba",
      "tree": "5de633d31b1f5ebdf27502a2aba6bef243f20903",
      "parents": [
        "5b5a9afe764acf9a6c99d25dd5db740bb895710b"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 19:49:06 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 19:49:06 2026"
      },
      "message": "Simulate unknown bidi directionality in tests since Python 3.15 reports a default class for every codepoint\n"
    },
    {
      "commit": "5b5a9afe764acf9a6c99d25dd5db740bb895710b",
      "tree": "de9216fe41403956524c367894ba24f8e5e66389",
      "parents": [
        "5e6e75291d71a2fdae04f4c1aba9fc679871cda9"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 19:36:04 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 19:36:53 2026"
      },
      "message": "Add a stable code attribute to IDNAError identifying the rule that failed\n"
    },
    {
      "commit": "5e6e75291d71a2fdae04f4c1aba9fc679871cda9",
      "tree": "e40538a56d5c8919c2a4c403070e51dc2be1fc36",
      "parents": [
        "6ac8a0ab21dffed6b651c0428e675b5e7bbbd1e4"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 19:25:03 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 19:25:03 2026"
      },
      "message": "Carry the offending codepoint and its position as attributes on IDNAError\n"
    },
    {
      "commit": "6ac8a0ab21dffed6b651c0428e675b5e7bbbd1e4",
      "tree": "a480a5d49e61624559344a99ca90479e02e6c126",
      "parents": [
        "9984fc1dead9cccd037307b12f42c4c67e4927f6"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 19:21:26 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 19:21:26 2026"
      },
      "message": "Do not assert uts46_remap idempotence under transitional processing\n"
    },
    {
      "commit": "9984fc1dead9cccd037307b12f42c4c67e4927f6",
      "tree": "8a5aebc8ab57d5aeae499f0a9bd7b89f08217b67",
      "parents": [
        "ec110d02a6e97a5be1f707de260cb44795f7e803",
        "245ad41cd2aed4bd919a4d71ff4cc60a8d24a03e"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 18:22:10 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 16 18:22:10 2026"
      },
      "message": "Merge pull request #264 from kjd/general-improvements\n\nGeneral improvements"
    },
    {
      "commit": "245ad41cd2aed4bd919a4d71ff4cc60a8d24a03e",
      "tree": "8a5aebc8ab57d5aeae499f0a9bd7b89f08217b67",
      "parents": [
        "c1cd0dc02ec6be07988c3fedb7df04ec2a754329"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 07:54:57 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 18:15:23 2026"
      },
      "message": "Draft history entries for 3.19\n"
    },
    {
      "commit": "c1cd0dc02ec6be07988c3fedb7df04ec2a754329",
      "tree": "4f45a86743c9b0629d01eb9f38232c41a392d33c",
      "parents": [
        "a7070b33f0c9594e26363e6b1fb9b457a47aa8c2"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 07:47:13 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 16:58:17 2026"
      },
      "message": "Restore std3_rules by applying UseSTD3ASCIIRules to the mapped output per UTS #46 revision 33\n"
    },
    {
      "commit": "a7070b33f0c9594e26363e6b1fb9b457a47aa8c2",
      "tree": "bb184243d70e137dc52872c49a92723ed67caf77",
      "parents": [
        "fe4ae48b87136fd2a1835b7f67d615318891d8cc"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 07:36:38 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 16:58:17 2026"
      },
      "message": "Speed up uts46_remap with an ASCII fast path and run-based copying\n"
    },
    {
      "commit": "fe4ae48b87136fd2a1835b7f67d615318891d8cc",
      "tree": "d7c66711689937303609e3ccdfa63d19800e9621",
      "parents": [
        "59ba52b1fc6afa4eb2590f0738a78a444d8f6523"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 07:27:29 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 16:58:17 2026"
      },
      "message": "Add OSS-Fuzz targets for the full API and the incremental codec\n"
    },
    {
      "commit": "59ba52b1fc6afa4eb2590f0738a78a444d8f6523",
      "tree": "75b60e1548fa6b107ef11e3049f0254629bdb5ae",
      "parents": [
        "1c6f4a4d152e43419577f2db0893fb8dbdd248db"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 07:27:29 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 07:27:29 2026"
      },
      "message": "Add property-based tests with Hypothesis\n"
    },
    {
      "commit": "1c6f4a4d152e43419577f2db0893fb8dbdd248db",
      "tree": "8bf86fc3f4830c6658ebec2b38f4cf2868424686",
      "parents": [
        "63a64a8e63ffb01e608556974f296cd041d1a81a"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 07:27:29 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 07:27:29 2026"
      },
      "message": "Raise IDNAError rather than IndexError or UnicodeDecodeError on empty labels and non-ASCII bytes\n"
    },
    {
      "commit": "63a64a8e63ffb01e608556974f296cd041d1a81a",
      "tree": "e5dd83004e0df30b67269d7c88bf52ee09bbc75b",
      "parents": [
        "7278b7a4f2fb902a8b89c608a65b7d91040847d5"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 07:27:29 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 07:27:29 2026"
      },
      "message": "Publish to TestPyPI only from master, release branches and tags\n"
    },
    {
      "commit": "7278b7a4f2fb902a8b89c608a65b7d91040847d5",
      "tree": "54f50771054b07cb4443a2cc311d9401573a36bb",
      "parents": [
        "babf1947480748f06ac68c34e4795302c7b56291"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 07:27:29 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 07:27:29 2026"
      },
      "message": "Add scheduled workflow that opens an issue when a new Unicode version is released\n"
    },
    {
      "commit": "babf1947480748f06ac68c34e4795302c7b56291",
      "tree": "58802a3aafc61ec6b8fb817984be7dee78c88e94",
      "parents": [
        "1fe72ab8fd6ee178a478cff839aff9005555e3cf"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 07:27:29 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 07:27:29 2026"
      },
      "message": "Verify checked-in tables match the generator output in CI\n"
    },
    {
      "commit": "1fe72ab8fd6ee178a478cff839aff9005555e3cf",
      "tree": "1a5100ce1d982c948ab1c29438f3b27b690856a4",
      "parents": [
        "ec110d02a6e97a5be1f707de260cb44795f7e803"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 07:27:29 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 07:27:29 2026"
      },
      "message": "Make idna-data output independent of the host Python\u0027s Unicode version\n"
    },
    {
      "commit": "ec110d02a6e97a5be1f707de260cb44795f7e803",
      "tree": "c8f704306400bde73a23065e526070e6bec1333b",
      "parents": [
        "b54576b13fd31e0d5b51ba9ce36d018feeeebaec",
        "3187398b94ffe3bf0743e50a344588e0458d9ed9"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 06:55:20 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sun Aug 16 06:55:20 2026"
      },
      "message": "Merge pull request #262 from kjd/ruff-update\n\nUpdate to ruff 0.16 and adopt its expanded default rule set"
    },
    {
      "commit": "3187398b94ffe3bf0743e50a344588e0458d9ed9",
      "tree": "c8f704306400bde73a23065e526070e6bec1333b",
      "parents": [
        "b54576b13fd31e0d5b51ba9ce36d018feeeebaec"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 05:00:29 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun Aug 16 05:00:29 2026"
      },
      "message": "Update to ruff 0.16 and adopt its expanded default rule set\n"
    },
    {
      "commit": "b54576b13fd31e0d5b51ba9ce36d018feeeebaec",
      "tree": "1c9829596bd172624130429602bfb85f770da6b5",
      "parents": [
        "62f30346a210028aa37b9002c3e4814a2c06416a",
        "fae77295f4540fa3ec027e677543e17239b27951"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sat Aug 08 23:01:00 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 08 23:01:00 2026"
      },
      "message": "Merge pull request #261 from kjd/issue-260 (fixes #260)\n\nIssue 260 fix"
    },
    {
      "commit": "fae77295f4540fa3ec027e677543e17239b27951",
      "tree": "1c9829596bd172624130429602bfb85f770da6b5",
      "parents": [
        "9067b803a55441805934410b11c0899209b66785"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sat Aug 08 22:56:41 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sat Aug 08 22:56:41 2026"
      },
      "message": "Bump pypa/gh-action-pypi-publish to v1.14.2 for metadata 2.5 support\n"
    },
    {
      "commit": "9067b803a55441805934410b11c0899209b66785",
      "tree": "7b5f0a5576e66076a17665f55d33ba7a78ec0236",
      "parents": [
        "62f30346a210028aa37b9002c3e4814a2c06416a"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sat Aug 08 21:54:47 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sat Aug 08 21:57:02 2026"
      },
      "message": "Fix CONTEXTJ violations being masked as generic IDNAError (#260)\n"
    },
    {
      "commit": "62f30346a210028aa37b9002c3e4814a2c06416a",
      "tree": "86d4b82c0ac3fbb3e98dba02e426571d4d9ae1c7",
      "parents": [
        "5a954ffed62b15e2a313e5de0f949f60ed15416e",
        "90020dedbaba8151fbed01888874e5078bb94b55"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sat Aug 01 15:50:57 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Sat Aug 01 15:50:57 2026"
      },
      "message": "Merge pull request #259 from kjd/unicode-license\n\nUnicode license (closes #258)"
    },
    {
      "commit": "90020dedbaba8151fbed01888874e5078bb94b55",
      "tree": "86d4b82c0ac3fbb3e98dba02e426571d4d9ae1c7",
      "parents": [
        "82a3713d71a98f63d8fc9c00f4be98803451378b"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sat Aug 01 15:40:54 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sat Aug 01 15:43:01 2026"
      },
      "message": "Adding original text makes Github reclassify the whole project, try this instead\n"
    },
    {
      "commit": "82a3713d71a98f63d8fc9c00f4be98803451378b",
      "tree": "c70db7132fe20dfc63f6ad7253ca21cc1ea20b43",
      "parents": [
        "5a954ffed62b15e2a313e5de0f949f60ed15416e"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sat Aug 01 15:32:10 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sat Aug 01 15:37:48 2026"
      },
      "message": "Add reference to Unicode license\n"
    },
    {
      "commit": "5a954ffed62b15e2a313e5de0f949f60ed15416e",
      "tree": "86bb29081b16d256f7e44617b28087d3eb9fd211",
      "parents": [
        "862150e12779792900343b48a1223beb5e2b62f7",
        "7af9334440bc40b883cc9567201fa0d5004f3b7e"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Wed Jul 01 17:26:14 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 17:26:14 2026"
      },
      "message": "Merge pull request #256 from kjd/dependabot/github_actions/actions-2217aebe03\n\nBump actions/checkout from 6.0.2 to 7.0.0 in the actions group"
    },
    {
      "commit": "7af9334440bc40b883cc9567201fa0d5004f3b7e",
      "tree": "86bb29081b16d256f7e44617b28087d3eb9fd211",
      "parents": [
        "862150e12779792900343b48a1223beb5e2b62f7"
      ],
      "author": {
        "name": "dependabot[bot]",
        "email": "49699333+dependabot[bot]@users.noreply.github.com",
        "time": "Wed Jul 01 15:28:23 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed Jul 01 15:28:23 2026"
      },
      "message": "Bump actions/checkout from 6.0.2 to 7.0.0 in the actions group\n\nBumps the actions group with 1 update: [actions/checkout](https://github.com/actions/checkout).\n\n\nUpdates `actions/checkout` from 6.0.2 to 7.0.0\n- [Release notes](https://github.com/actions/checkout/releases)\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\n- [Commits](https://github.com/actions/checkout/compare/de0fac2e4500dabe0009e67214ff5f5447ce83dd...9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0)\n\n---\nupdated-dependencies:\n- dependency-name: actions/checkout\n  dependency-version: 7.0.0\n  dependency-type: direct:production\n  update-type: version-update:semver-major\n  dependency-group: actions\n...\n\nSigned-off-by: dependabot[bot] \u003csupport@github.com\u003e"
    },
    {
      "commit": "862150e12779792900343b48a1223beb5e2b62f7",
      "tree": "9cf67b793f55f8809faf8feb1321bd5f6589ce85",
      "parents": [
        "1a5bf80f2fa40454589e6144efe5f72015ef9d24",
        "f39ea903ba49eb5a0b2c6723c9a929b41ed4a0f1"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Jun 02 14:38:20 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 02 14:38:20 2026"
      },
      "message": "Merge pull request #254 from kjd/release-3.18\n\nRelease 3.18"
    },
    {
      "commit": "f39ea903ba49eb5a0b2c6723c9a929b41ed4a0f1",
      "tree": "9cf67b793f55f8809faf8feb1321bd5f6589ce85",
      "parents": [
        "40f4e407bc7452da37c24b0c112dcda9a5b299ba"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Jun 02 14:31:25 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Jun 02 14:31:25 2026"
      },
      "message": "Release 3.18\n"
    },
    {
      "commit": "40f4e407bc7452da37c24b0c112dcda9a5b299ba",
      "tree": "48200c1e660318fafe063747737515e2ac40beed",
      "parents": [
        "1a5bf80f2fa40454589e6144efe5f72015ef9d24"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Jun 02 02:54:52 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Jun 02 02:54:52 2026"
      },
      "message": "Pre-release 3.18rc0\n"
    },
    {
      "commit": "1a5bf80f2fa40454589e6144efe5f72015ef9d24",
      "tree": "0bcce953e66a544e84044a62a61ddd2393067b5a",
      "parents": [
        "0b1758ba11952a2e88fd6141ffa620409bff0580",
        "5bbb26fc86e28c4ee1434ae8ae8db76de4c2a5ac"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Jun 02 02:24:15 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 02 02:24:15 2026"
      },
      "message": "Merge pull request #253 from kjd/lenient-decode\n\nAdd a lenient decode mode for display applications"
    },
    {
      "commit": "5bbb26fc86e28c4ee1434ae8ae8db76de4c2a5ac",
      "tree": "0bcce953e66a544e84044a62a61ddd2393067b5a",
      "parents": [
        "c532bae5270489cef8faf9f6b1eb70cbcb454c6d",
        "0b1758ba11952a2e88fd6141ffa620409bff0580"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Jun 02 02:19:32 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue Jun 02 02:19:32 2026"
      },
      "message": "Merge branch \u0027master\u0027 into lenient-decode"
    },
    {
      "commit": "c532bae5270489cef8faf9f6b1eb70cbcb454c6d",
      "tree": "0a6a565b2a1c021be6f5de982a0e4d6b9245ffa7",
      "parents": [
        "47b5cde6fffd1a33c4a600228152c919c6de0eb4"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Jun 02 02:15:13 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue Jun 02 02:15:13 2026"
      },
      "message": "Rename decode() lenient\u003d option to display\u003d (issue #248)\n"
    },
    {
      "commit": "0b1758ba11952a2e88fd6141ffa620409bff0580",
      "tree": "03532b7dfdc4960eb717ac422016328c8801140f",
      "parents": [
        "22ebb73b164081f209449b50162eb7ce086e96a4",
        "f48619c4cea6859b938d560fdd9feb898e678567"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 28 15:12:35 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 28 15:12:35 2026"
      },
      "message": "Merge pull request #252 from kjd/release-3.17\n\nRelease 3.17"
    },
    {
      "commit": "f48619c4cea6859b938d560fdd9feb898e678567",
      "tree": "03532b7dfdc4960eb717ac422016328c8801140f",
      "parents": [
        "7421ba8003227f816142ab40178e3a7d204e6847"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 28 14:30:10 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 28 14:30:10 2026"
      },
      "message": "Release 3.17\n"
    },
    {
      "commit": "7421ba8003227f816142ab40178e3a7d204e6847",
      "tree": "935f466c7b1f051fcba3a2f51a1a67ee81257434",
      "parents": [
        "22ebb73b164081f209449b50162eb7ce086e96a4"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 28 14:24:38 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 28 14:24:38 2026"
      },
      "message": "Pre-release 3.17rc0\n"
    },
    {
      "commit": "22ebb73b164081f209449b50162eb7ce086e96a4",
      "tree": "79306998e5c5f0e519c2900d55d9c3a17f059f02",
      "parents": [
        "f90b87adc6b6b2a591dfc7fb3f8e47870dc81722",
        "2a7ac0a58c788d50112a5003af545a83807fb108"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 28 14:08:12 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 28 14:08:12 2026"
      },
      "message": "Merge pull request #251 from kjd/structure-optimizations\n\nStructure optimizations"
    },
    {
      "commit": "2a7ac0a58c788d50112a5003af545a83807fb108",
      "tree": "79306998e5c5f0e519c2900d55d9c3a17f059f02",
      "parents": [
        "354eee9850a7b2962b65ae02010f7ebd9c99b7ed"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 28 14:04:03 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 28 14:04:03 2026"
      },
      "message": "Drop redundant parallel-arrays comment from uts46data\n"
    },
    {
      "commit": "354eee9850a7b2962b65ae02010f7ebd9c99b7ed",
      "tree": "88b412524e86142d24fb8100270a576ea0e51655",
      "parents": [
        "8c34ffcab603b4a7a727d4e286b1f3342813281d"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 28 02:44:23 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 28 13:59:15 2026"
      },
      "message": "Apply ruff format to uts46data.py\n"
    },
    {
      "commit": "8c34ffcab603b4a7a727d4e286b1f3342813281d",
      "tree": "e16a8635ac5367d000f0165228ac4e002383332a",
      "parents": [
        "1189629e8a319f7c2b4678b5716c180ebd97de03"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 28 02:35:54 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 28 13:59:15 2026"
      },
      "message": "Refactor uts46data into parallel arrays\n\nUse a more memory efficient approach of three parallel arrays indexed by\nrow number:\n\n  - uts46_starts: array.array(\u0027I\u0027) of codepoint starts (4 bytes each),\n    still sorted so bisect.bisect_right gives the matching row.\n  - uts46_statuses: bytes, one byte per row (V/M/D/I/X/3).\n  - uts46_replacements: tuple[Optional[str], ...], None where no\n    mapping applies.\n\nResident memory drops from ~1mb to ~350kb.\n"
    },
    {
      "commit": "1189629e8a319f7c2b4678b5716c180ebd97de03",
      "tree": "713b73e0a1e2d72a58b8764dad18b4963d64e902",
      "parents": [
        "f90b87adc6b6b2a591dfc7fb3f8e47870dc81722"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 28 02:15:53 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 28 13:57:32 2026"
      },
      "message": "Range-encode joining_types for compact representation\n\nRefactor joining_types to reduce memory usage (~232kb to ~22kb), and\nmore efficient lookups by avoiding dicts.\n"
    },
    {
      "commit": "47b5cde6fffd1a33c4a600228152c919c6de0eb4",
      "tree": "7c6809dc1a8230dcef8419c906e4e2c6612fe7ca",
      "parents": [
        "d6ffd28be164dfbd3ebca8b3396e39d191f4909b"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Mon May 25 23:00:18 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Wed May 27 19:06:33 2026"
      },
      "message": "Add lenient option to decode() for best-effort label recovery (issue #248)\n\nWhen lenient\u003dTrue, any xn-- label that fails to decode is returned\nunchanged rather than aborting the whole domain. This matches the\nper-label recovery prescribed by UTS #46 and WHATWG URL for\n\"decode for display\" use cases.\n"
    },
    {
      "commit": "f90b87adc6b6b2a591dfc7fb3f8e47870dc81722",
      "tree": "e80ba4b1d3bd5dff650fed5a7dd9043c1bd51078",
      "parents": [
        "d6ffd28be164dfbd3ebca8b3396e39d191f4909b"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Fri May 22 14:12:19 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Fri May 22 14:12:19 2026"
      },
      "message": "Generic length limit for functions\n\nAdd a belt-and-suspender general length limit. 1024 is a value that\nis roughly an order of magnitude higher than expected inputs and\nshouldn\u0027t get caught up trapping legitimate inputs.\n"
    },
    {
      "commit": "d6ffd28be164dfbd3ebca8b3396e39d191f4909b",
      "tree": "a8a64efe51d7f372aff27cad8b2e4b8d140550a9",
      "parents": [
        "d4bc9e742b753cff2ec6c53bd4be730863ca9c53",
        "6d1a0de52a8b4690f1b2a89829aa85ff1de3635a"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Fri May 22 00:18:08 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Fri May 22 00:18:08 2026"
      },
      "message": "Merge pull request #247 from kjd/release-3.16\n\nRelease 3.16"
    },
    {
      "commit": "6d1a0de52a8b4690f1b2a89829aa85ff1de3635a",
      "tree": "a8a64efe51d7f372aff27cad8b2e4b8d140550a9",
      "parents": [
        "4e6cbe225a3e0b6e7eed2082086a12cba526e787"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Fri May 22 00:14:16 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Fri May 22 00:14:16 2026"
      },
      "message": "Release 3.16\n"
    },
    {
      "commit": "4e6cbe225a3e0b6e7eed2082086a12cba526e787",
      "tree": "55613139132b407257e1f71ba9a7a3505c8672db",
      "parents": [
        "223533c34c9e23470e714ed9b1f1c41867177732"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 23:46:19 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 23:46:19 2026"
      },
      "message": "Demote installation instruction to usage section\n"
    },
    {
      "commit": "223533c34c9e23470e714ed9b1f1c41867177732",
      "tree": "3cee66d1b3ecbb6ceafc78f981d8d4455968910d",
      "parents": [
        "b1640b228a50b3c94ffcf8a664eb6cb186550f3e",
        "7f3b15e8839f0e404a00054c4072e69347e727f2"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 23:42:52 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 23:42:52 2026"
      },
      "message": "Merge branch \u0027readme-simplification\u0027 into release-3.16\n"
    },
    {
      "commit": "b1640b228a50b3c94ffcf8a664eb6cb186550f3e",
      "tree": "b35d039a65b581b61d8ec06a7e49b2171e0cd68e",
      "parents": [
        "3a861132be61091454aae10c292d98bcfd3cd797"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 23:37:13 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 23:37:13 2026"
      },
      "message": "Bump version to 3.16rc0\n"
    },
    {
      "commit": "3a861132be61091454aae10c292d98bcfd3cd797",
      "tree": "da003166d47fec06d61d76d481f26f3476ca9d51",
      "parents": [
        "d4bc9e742b753cff2ec6c53bd4be730863ca9c53"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 23:35:58 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 23:35:58 2026"
      },
      "message": "Update history for 3.16 release\n"
    },
    {
      "commit": "d4bc9e742b753cff2ec6c53bd4be730863ca9c53",
      "tree": "2674b311cc2bcab8ed18195a70b5be523fa06343",
      "parents": [
        "51f4555582c2d27718e5f0540a4380571aa5a1c0",
        "a21d9fca6b04c47ddbd0303d62bbc0712b55f43d"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 23:21:30 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 23:21:30 2026"
      },
      "message": "Merge pull request #246 from kjd/python-3.9\n\nUpdate version support to Python 3.9+"
    },
    {
      "commit": "a21d9fca6b04c47ddbd0303d62bbc0712b55f43d",
      "tree": "2674b311cc2bcab8ed18195a70b5be523fa06343",
      "parents": [
        "b46492694aa21dc1c3608f59dd5b9620c08b2d0f"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 23:18:09 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 23:18:09 2026"
      },
      "message": "Update deprecation policy\n"
    },
    {
      "commit": "b46492694aa21dc1c3608f59dd5b9620c08b2d0f",
      "tree": "5366a126c577a2b0e9d48ec1f34ce7112239dafd",
      "parents": [
        "51f4555582c2d27718e5f0540a4380571aa5a1c0"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 23:11:47 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 23:14:35 2026"
      },
      "message": "Raise minimum Python to 3.9 and modernize typing\n"
    },
    {
      "commit": "7f3b15e8839f0e404a00054c4072e69347e727f2",
      "tree": "d4becf33cb3f86174c6fc57f5dd04e766b3582af",
      "parents": [
        "7530c7020ae2bcf0acff1fafd71fb047a3b117ed"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 19:47:58 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 19:47:58 2026"
      },
      "message": "Explicit example not needed\n"
    },
    {
      "commit": "7530c7020ae2bcf0acff1fafd71fb047a3b117ed",
      "tree": "976b63fd2d25f754dc1dfe860ba4d280b7ac27c2",
      "parents": [
        "7aa2ae857244e98e923dcd7adb2e937432b918e1"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 19:46:30 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 19:46:30 2026"
      },
      "message": "Remove unnecessary print()\n"
    },
    {
      "commit": "7aa2ae857244e98e923dcd7adb2e937432b918e1",
      "tree": "2a5d63f66511dc0515d6cfaafef8c4e63d11ba2e",
      "parents": [
        "51f4555582c2d27718e5f0540a4380571aa5a1c0"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 19:38:05 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 19:38:05 2026"
      },
      "message": "Simplify README and split idna-data docs into tools/README.md\n"
    },
    {
      "commit": "51f4555582c2d27718e5f0540a4380571aa5a1c0",
      "tree": "ac1b38bb83aa33cff25a7e1a9ef9e6e46bdc34b7",
      "parents": [
        "a1d0a0fe3167a1a844ceb80303a3b932873039e9",
        "641e13dec1611500955e684977c4035f7bf6937f"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 19:13:52 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 19:13:52 2026"
      },
      "message": "Merge pull request #245 from kjd/ruff-lint-refinements\n\nRuff lint refinements"
    },
    {
      "commit": "641e13dec1611500955e684977c4035f7bf6937f",
      "tree": "ac1b38bb83aa33cff25a7e1a9ef9e6e46bdc34b7",
      "parents": [
        "78dfa437f4331f0ad8e496be731d2125a6f7b640"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 19:03:24 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 19:03:24 2026"
      },
      "message": "Apply PLR1714 and TRY300 refinements in alabel/valid_contexto\n"
    },
    {
      "commit": "78dfa437f4331f0ad8e496be731d2125a6f7b640",
      "tree": "07db30ee94929838215f8674ec86dcc418860c3e",
      "parents": [
        "a1d0a0fe3167a1a844ceb80303a3b932873039e9"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 18:29:36 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 18:29:36 2026"
      },
      "message": "Extend ruff lint config and apply auto-fixes\n"
    },
    {
      "commit": "a1d0a0fe3167a1a844ceb80303a3b932873039e9",
      "tree": "5a5f21ad4d1220910be741436c2cc8cd0ccd42cf",
      "parents": [
        "7bc9e4afd9350166c5cf34f24844b958ebe4d666"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 18:10:39 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 18:10:39 2026"
      },
      "message": "Test Python 3.15 beta and update PyPy test to 3.11 (#244)\n\n* Add Python 3.15 to CI matrix\n* Update PyPy test target to 3.11"
    },
    {
      "commit": "7bc9e4afd9350166c5cf34f24844b958ebe4d666",
      "tree": "a7091a30cf14acde3566dc0887641652778ea67f",
      "parents": [
        "ca9c91b56b26cdd85acc6072b15db557ab82ce5f"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Thu May 21 17:55:50 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Thu May 21 17:55:50 2026"
      },
      "message": "Add a command-line interface (#242)\n\n* Add command-line interface for encoding and decoding domains\n* Accept multiple domains and read from stdin in the CLI"
    },
    {
      "commit": "ca9c91b56b26cdd85acc6072b15db557ab82ce5f",
      "tree": "ea0b50089c282d59d6d09ec858d60f1fd1a18f76",
      "parents": [
        "4329802d9c1f91988072d11fb1c5bd6ded0a625f",
        "0e8ae3027a637457a5b2604124b0566c2e224d94"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Wed May 20 15:43:41 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Wed May 20 15:43:41 2026"
      },
      "message": "Merge pull request #239 from kjd/pin-ci-dependencies-by-hash\n\nPin CI Python dependencies by hash"
    },
    {
      "commit": "0e8ae3027a637457a5b2604124b0566c2e224d94",
      "tree": "ea0b50089c282d59d6d09ec858d60f1fd1a18f76",
      "parents": [
        "4329802d9c1f91988072d11fb1c5bd6ded0a625f"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun May 17 17:55:50 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Sun May 17 17:55:50 2026"
      },
      "message": "Pin CI Python dependencies by hash\n"
    },
    {
      "commit": "4329802d9c1f91988072d11fb1c5bd6ded0a625f",
      "tree": "2f2d3a498240baeb4770c012a5466ac8f2c7da85",
      "parents": [
        "05d4b219aa9eddc47371fcbd2000f0301016f3e9",
        "d2473f49eb3d1fae67c52b272321e6903528d7d4"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue May 12 22:46:55 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 12 22:46:55 2026"
      },
      "message": "Merge pull request #238 from kjd/release-3.15\n\nRelease 3.15"
    },
    {
      "commit": "d2473f49eb3d1fae67c52b272321e6903528d7d4",
      "tree": "2f2d3a498240baeb4770c012a5466ac8f2c7da85",
      "parents": [
        "30314d4628744ca14cf2b5820564e5127a9f86f2"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue May 12 22:40:29 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue May 12 22:42:51 2026"
      },
      "message": "Release 3.15\n"
    },
    {
      "commit": "30314d4628744ca14cf2b5820564e5127a9f86f2",
      "tree": "36b9ceaff2042dad392c60ee7cc81e62855daa69",
      "parents": [
        "05d4b219aa9eddc47371fcbd2000f0301016f3e9"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue May 12 22:31:21 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue May 12 22:31:21 2026"
      },
      "message": "Pre-release 3.15rc0\n"
    },
    {
      "commit": "05d4b219aa9eddc47371fcbd2000f0301016f3e9",
      "tree": "6501c8f9f355d73d33cfef03500aacc7ddda97ce",
      "parents": [
        "59fa8002d514bf4a5ce7b58f67b9ec587d53fa9c",
        "2987fdba1962bbb2358399e0084ba062b98a0bee"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue May 12 22:21:10 2026"
      },
      "committer": {
        "name": "GitHub",
        "email": "noreply@github.com",
        "time": "Tue May 12 22:21:10 2026"
      },
      "message": "Merge pull request #237 from kjd/convert-docs-to-markdown\n\nConvert README and HISTORY from reStructuredText to Markdown"
    },
    {
      "commit": "2987fdba1962bbb2358399e0084ba062b98a0bee",
      "tree": "6501c8f9f355d73d33cfef03500aacc7ddda97ce",
      "parents": [
        "59fa8002d514bf4a5ce7b58f67b9ec587d53fa9c"
      ],
      "author": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue May 12 22:19:00 2026"
      },
      "committer": {
        "name": "Kim Davies",
        "email": "kim@cynosure.com.au",
        "time": "Tue May 12 22:19:00 2026"
      },
      "message": "Convert README and HISTORY from reStructuredText to Markdown\n"
    }
  ],
  "next": "59fa8002d514bf4a5ce7b58f67b9ec587d53fa9c"
}
