)]}'
{
  "log": [
    {
      "commit": "368facc251e812f5d0d09b3c9f930d7f8e53633d",
      "tree": "a0e6ae0701fc473b579fa1649f824a3c9ec3ff59",
      "parents": [
        "e47ae4a730ad280a5a95953b76efe3a39e6ae635",
        "8ccf4ca009dbf3195684e7c7370d334fb6e72f73"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Wed Jul 22 02:53:55 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Wed Jul 22 02:53:55 2026 -0700"
      },
      "message": "deduplication: eliminate a loop over the hash partitions am: 8ccf4ca009\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41085908\n\nChange-Id: I08aeb52ed34439083a04ddf462138efb32dda82c\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "e47ae4a730ad280a5a95953b76efe3a39e6ae635",
      "tree": "29c8e85ba5772bcf81114fdbaee82a55998ea949",
      "parents": [
        "6f8cfa2270011a5647fe7b7cefa4943f8da15683",
        "15d42d6ec437dca474e4f1b2b1c4d7430829875f"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Wed Jul 22 02:53:44 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Wed Jul 22 02:53:44 2026 -0700"
      },
      "message": "stg -\u003e deduplication: move node hashing am: 15d42d6ec4\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41085907\n\nChange-Id: I0a8b7605ed6d4609f0dedd4a8c68a9621da6a480\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "8ccf4ca009dbf3195684e7c7370d334fb6e72f73",
      "tree": "a0e6ae0701fc473b579fa1649f824a3c9ec3ff59",
      "parents": [
        "15d42d6ec437dca474e4f1b2b1c4d7430829875f"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 18:13:00 2026 +0000"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 23:41:34 2026 +0000"
      },
      "message": "deduplication: eliminate a loop over the hash partitions\n\nThe gathering of hash partition sizes is now done during the partition\nrefinement by equality loop.\n\nPiperOrigin-RevId: 951594046\nChange-Id: I809618585e09ccb63f1f1c858b1560b1655019b5\n"
    },
    {
      "commit": "15d42d6ec437dca474e4f1b2b1c4d7430829875f",
      "tree": "29c8e85ba5772bcf81114fdbaee82a55998ea949",
      "parents": [
        "961069e5fe307e7d2d31ea31f6349ce2a138cee8"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 18:09:33 2026 +0000"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 23:41:28 2026 +0000"
      },
      "message": "stg -\u003e deduplication: move node hashing\n\nThe driver code in `stg.cc` did not need to be exposed to this\nimplementation detail.\n\nPiperOrigin-RevId: 951591867\nChange-Id: I874db97b8a3d5ac6a5c2b8536c340f3d65c20dca\n"
    },
    {
      "commit": "6f8cfa2270011a5647fe7b7cefa4943f8da15683",
      "tree": "c04143afbc6b7419e8a047e8785712d258b84d0b",
      "parents": [
        "c19fc8b87fb48cade8272dca32bf5aa8f9c4ee02",
        "961069e5fe307e7d2d31ea31f6349ce2a138cee8"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 05:47:04 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 05:47:04 2026 -0700"
      },
      "message": "stgdiff: remove support for --exact option am: 961069e5fe\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41101958\n\nChange-Id: I571f7deee5527ef3e3cc17780465a6abc61fc497\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "c19fc8b87fb48cade8272dca32bf5aa8f9c4ee02",
      "tree": "e16cd264daecf7b3799e0b8c608891c797cb3296",
      "parents": [
        "38d1face26393c12af82530114743bd82f19224d",
        "7cf59dd8f07465ff25f370a4beee75f7c9e5bd1d"
      ],
      "author": {
        "name": "Ricardo Barreira",
        "email": "rsf@google.com",
        "time": "Tue Jul 21 05:46:56 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 05:46:56 2026 -0700"
      },
      "message": "stgdiff: simplify code by using unordered_set::contains am: 7cf59dd8f0\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41101957\n\nChange-Id: I1d9c4d3e190b14f50a5a6ef03e3193ed6d78eb2d\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "38d1face26393c12af82530114743bd82f19224d",
      "tree": "bce26972ba14b0b5be948237d66712e2536f3210",
      "parents": [
        "3f3fb1c6c2279b31e34b4f304dfcc89ac2439b5f",
        "25d25861a1cc2dd41ecc1bea89f48d1cfb4648ad"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 05:46:48 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 05:46:48 2026 -0700"
      },
      "message": "substitution: introduce Rewrite helper function am: 25d25861a1\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41101956\n\nChange-Id: I0a90d949ff62d6dfe5acf5f0b20fa4fe1af3820f\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "3f3fb1c6c2279b31e34b4f304dfcc89ac2439b5f",
      "tree": "5ef801a75fe8b6bcfa228348dc242b6d27440850",
      "parents": [
        "2277e73460ea4312f50009c5239c3e761ef03db5",
        "d14c9fb29b76c9194b736bb774da263c1fedbb08"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 05:46:40 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 05:46:40 2026 -0700"
      },
      "message": "substitution: move silent store avoidance into Substitute am: d14c9fb29b\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41101955\n\nChange-Id: Ied44577cf1e3465996fbd27e0cd886a8fdcd0f2b\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "2277e73460ea4312f50009c5239c3e761ef03db5",
      "tree": "f2dc86ac690d13ec653b3a27ab4163488536ecc9",
      "parents": [
        "43bbad03843aee77025a3597b152d9ce084c3a76",
        "8014a645bf535c0074cb9d3e71a78f358e75fe16"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 05:46:33 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 05:46:33 2026 -0700"
      },
      "message": "equality cache -\u003e deduplication: move EqualityCache out of header file am: 8014a645bf\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41088734\n\nChange-Id: I25b9507c0d0b4c3670ccd6dde2311a20300f898f\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "43bbad03843aee77025a3597b152d9ce084c3a76",
      "tree": "e950552ccf5576e7bd796727d9d9ff6e0e412305",
      "parents": [
        "174977ffd963662287756d8aff6154af2577ba78",
        "3c78cd96724b943b7845d7e150c27341e4dd3706"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 05:46:25 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 05:46:25 2026 -0700"
      },
      "message": "equality: simplify Equals cache insertion interface to single pairs am: 3c78cd9672\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41088733\n\nChange-Id: I75859072e4583fb0df5e0550f060420dc2944323\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "174977ffd963662287756d8aff6154af2577ba78",
      "tree": "b558e8228d6aeae0511f9d7ee644f503da2d597b",
      "parents": [
        "57b2d7c1cd4950c8bb9b39fb42d13d8456812859",
        "0ce6e3fffc7fca92710d05b3880ac6742b409c35"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 05:46:15 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 05:46:15 2026 -0700"
      },
      "message": "equality: simplify Equals cache Query return type to bool am: 0ce6e3fffc\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41088732\n\nChange-Id: I308effa7c1506f0010674099df69a3e3a3f4cea4\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "57b2d7c1cd4950c8bb9b39fb42d13d8456812859",
      "tree": "519f4996abddc4d2e82a47afe53eaf4f2dd8fe5d",
      "parents": [
        "f8b06748fee3fdf3cd9de6c9bf6c8acf5055de26",
        "9ede7f39fb1b838a72faccdd75a714d658f433ef"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 05:46:07 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 05:46:07 2026 -0700"
      },
      "message": "union find: factor out UnionFind template class am: 9ede7f39fb\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41088731\n\nChange-Id: Iec0f52e1b125605a218b05adbebf7bd6bcc087e8\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "f8b06748fee3fdf3cd9de6c9bf6c8acf5055de26",
      "tree": "db13b28c22912feed4a23b485cf98d7661b8acaf",
      "parents": [
        "91708da3f25a928576ad0f8550869085373c2ba3",
        "92b55d11b88451ec55ddcf81137be766b5c1ec3f"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 05:46:00 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 05:46:00 2026 -0700"
      },
      "message": "equality cache: introduce SparseIdMapping am: 92b55d11b8\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41088730\n\nChange-Id: Ia96305c522f06554bb43c32b513cb06c3318b393\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "91708da3f25a928576ad0f8550869085373c2ba3",
      "tree": "7c9747ec759b71597d239ba414bc10de951972f5",
      "parents": [
        "366c8c2efe025ff73a16f84a1f7ee143fd46f2bc",
        "1e40af432030bb5bf4a2a171ac79c15d7562efca"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 05:45:51 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 05:45:51 2026 -0700"
      },
      "message": "graph: DenseIdMapping: add Get and Add methods am: 1e40af4320\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41088729\n\nChange-Id: Ibf8c3354ed99f9d2b24b8c8c7547964dbff5411e\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "366c8c2efe025ff73a16f84a1f7ee143fd46f2bc",
      "tree": "5521297ad17bf36b0aa4e12df8ccfaeccd8d112a",
      "parents": [
        "253a42437b22794a76e96e5020b8730b62dbfa59",
        "da5a0b93d205de708d1463354c971bf0fdea9551"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 05:45:44 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 05:45:44 2026 -0700"
      },
      "message": "equality cache: remove hash checking am: da5a0b93d2\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41088728\n\nChange-Id: Ia4b78b55632185165a4fcd24685bc4c6a98a4cd4\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "253a42437b22794a76e96e5020b8730b62dbfa59",
      "tree": "37dbb86afa91629c16acb38a7a2574123e59424e",
      "parents": [
        "5c526633a09ad58af0dcbd0ad770868d96741cf1",
        "5b49196d31d14359104c52e069a193a8d39f6732"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 05:45:35 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 05:45:35 2026 -0700"
      },
      "message": "equality cache: remove rank logic from EqualityCache am: 5b49196d31\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41088727\n\nChange-Id: Idc9692d9ba5b257304ed4dc7029c4351aec7f853\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "5c526633a09ad58af0dcbd0ad770868d96741cf1",
      "tree": "a0b83456ae9408988cfb2daf1c06dc060ff7c0ba",
      "parents": [
        "e757fffed89a0063b046ee1bd6698a4d9367c872",
        "b43fb61bff75215b1e0fdf86be54c22c09d78533"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 05:45:26 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 05:45:26 2026 -0700"
      },
      "message": "equality cache: remove AllDifferent from Equals interface and caches am: b43fb61bff\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41088726\n\nChange-Id: I62dc1713f4812a0a6191d4c4d00047c315bea2e7\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "e757fffed89a0063b046ee1bd6698a4d9367c872",
      "tree": "307505ff7803198d217eca7b63e2f33cfcbd8b03",
      "parents": [
        "232d343de9480180130aa1bb743cc4565391e855",
        "ccb7352c041ee7e1946eef78f8e803bbe6999fba"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 05:45:19 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 05:45:19 2026 -0700"
      },
      "message": "equality cache: remove inequality tracking from EqualityCache am: ccb7352c04\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41088725\n\nChange-Id: Ib161ff49acc101a97287be3e1cbbbdb97244ec0b\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "232d343de9480180130aa1bb743cc4565391e855",
      "tree": "44177af9644ff6867ff2cbeedda5fa5494fa9c0d",
      "parents": [
        "c9e8d66b20388c1c5b58b086ce280a4216d288a6",
        "36848f772b4acb40a67585e12f39333a780a42b8"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 05:45:01 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 05:45:01 2026 -0700"
      },
      "message": "equality cache: remove SimpleEqualityCache function object am: 36848f772b\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41088724\n\nChange-Id: I340e32dd7ac3849882ff02eeceed4e4284a6a386\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "c9e8d66b20388c1c5b58b086ce280a4216d288a6",
      "tree": "f57d1435689dfbd26faab3a7905d44d8fbeeeee9",
      "parents": [
        "3fbfb246d526eb49d7fc31a0280963e432cc63e1",
        "95575a0ae7f4942e152878c7989cc40b86b95389"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 05:44:49 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 05:44:49 2026 -0700"
      },
      "message": "stg: time the final graph deduplication stages am: 95575a0ae7\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41088723\n\nChange-Id: Ia98c9b89f78d1ecd8d3c13a8480d3dc6de06482e\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "961069e5fe307e7d2d31ea31f6349ce2a138cee8",
      "tree": "c04143afbc6b7419e8a047e8785712d258b84d0b",
      "parents": [
        "7cf59dd8f07465ff25f370a4beee75f7c9e5bd1d"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 20 19:45:50 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 11:53:33 2026 +0100"
      },
      "message": "stgdiff: remove support for --exact option\n\nThe `--exact` flag performs exact node equality checks using `Equals`\nand is completely unused in practice. Removing it cleans up dead code\nand simplifies `stgdiff` maintenance.\n\nChanges:\n\n* remove `-x` / `--exact` command line option and `RunExact` helper\n  function from `stgdiff.cc`, and drop dependency on `equality.h`\n* update `stgdiff` usage and return code documentation in\n  `stgdiff.md`\n\nPiperOrigin-RevId: 950965860\nChange-Id: Id6f3842e183fae28a1057762eec70b6549c4969b\n"
    },
    {
      "commit": "7cf59dd8f07465ff25f370a4beee75f7c9e5bd1d",
      "tree": "e16cd264daecf7b3799e0b8c608891c797cb3296",
      "parents": [
        "25d25861a1cc2dd41ecc1bea89f48d1cfb4648ad"
      ],
      "author": {
        "name": "Ricardo Barreira",
        "email": "rsf@google.com",
        "time": "Thu Jul 16 14:49:46 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 11:53:19 2026 +0100"
      },
      "message": "stgdiff: simplify code by using unordered_set::contains\n\nPiperOrigin-RevId: 948944752\nChange-Id: I57323f88f6a5e47485931d1fbfd932dc5cb8d57c\n"
    },
    {
      "commit": "25d25861a1cc2dd41ecc1bea89f48d1cfb4648ad",
      "tree": "bce26972ba14b0b5be948237d66712e2536f3210",
      "parents": [
        "d14c9fb29b76c9194b736bb774da263c1fedbb08"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 20 19:44:32 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 11:52:50 2026 +0100"
      },
      "message": "substitution: introduce Rewrite helper function\n\nRefactor duplicate graph rewrite logic from `Deduplicate` and\n`UnifyingGraph` into a generic `Rewrite` template function.\n\nPiperOrigin-RevId: 950965157\nChange-Id: Id67ae8e237b5241aecfadea858c9561de17e3039\n"
    },
    {
      "commit": "d14c9fb29b76c9194b736bb774da263c1fedbb08",
      "tree": "5ef801a75fe8b6bcfa228348dc242b6d27440850",
      "parents": [
        "8014a645bf535c0074cb9d3e71a78f358e75fe16"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 20 19:39:54 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 11:52:38 2026 +0100"
      },
      "message": "substitution: move silent store avoidance into Substitute\n\nMove the check that avoids silent stores (only writing to an `Id` if\nthe mapped value differs) into `Substitute::Update`.\n\nCallers in `Deduplicate` and `UnifyingGraph` now pass a mapping lambda\nreturning `Id` directly.\n\nPiperOrigin-RevId: 950962540\nChange-Id: Ib64a7b63ff90d2fb2b56441951c62f29268b04ba\n"
    },
    {
      "commit": "8014a645bf535c0074cb9d3e71a78f358e75fe16",
      "tree": "f2dc86ac690d13ec653b3a27ab4163488536ecc9",
      "parents": [
        "3c78cd96724b943b7845d7e150c27341e4dd3706"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 20 19:30:22 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 11:52:26 2026 +0100"
      },
      "message": "equality cache -\u003e deduplication: move EqualityCache out of header file\n\n`EqualityCache` is only used by `Deduplicate` and need not be exposed.\n\nPiperOrigin-RevId: 950956977\nChange-Id: Ic7e22b274e28c3627e3dea49201acba6a7df0a0f\n"
    },
    {
      "commit": "3c78cd96724b943b7845d7e150c27341e4dd3706",
      "tree": "e950552ccf5576e7bd796727d9d9ff6e0e412305",
      "parents": [
        "0ce6e3fffc7fca92710d05b3880ac6742b409c35"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 20 19:28:42 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 11:52:15 2026 +0100"
      },
      "message": "equality: simplify Equals cache insertion interface to single pairs\n\nEvery implementation of `AllSame` was doing the same loop over node\npairs. This change factors it out and inlining means there should be\nno performance impact. The new method is called `Record`.\n\nPiperOrigin-RevId: 950956049\nChange-Id: I903ef80a040dd386dbb7eee0d3e2e834703e86e0\n"
    },
    {
      "commit": "0ce6e3fffc7fca92710d05b3880ac6742b409c35",
      "tree": "b558e8228d6aeae0511f9d7ee644f503da2d597b",
      "parents": [
        "9ede7f39fb1b838a72faccdd75a714d658f433ef"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 20 19:20:38 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 11:52:00 2026 +0100"
      },
      "message": "equality: simplify Equals cache Query return type to bool\n\n`EqualityCache` no longer caches inequalities and the simpler\n`PairCache` and `NoCache` never did. So `Query` now only needs to\ndistinguish two cases:\n\n* equal\n* unknown\n\nThis change:\n\n- updates `Query` to return `bool`\n- simplifies the lookup check in `Equals::operator()`\n- removes `#include \u003coptional\u003e` where no longer needed\n\nPiperOrigin-RevId: 950951442\nChange-Id: I0f8d308f31dfbab8b51d27472e4b617695a2aa7b\n"
    },
    {
      "commit": "9ede7f39fb1b838a72faccdd75a714d658f433ef",
      "tree": "519f4996abddc4d2e82a47afe53eaf4f2dd8fe5d",
      "parents": [
        "92b55d11b88451ec55ddcf81137be766b5c1ec3f"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 20 19:18:00 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 11:51:31 2026 +0100"
      },
      "message": "union find: factor out UnionFind template class\n\nFactor out Union-Find algorithm and DSU counters into a generic\n`UnionFind\u003cMapping\u003e` template class.\n\nNow:\n\n* `EqualityCache` uses `UnionFind\u003cSparseIdMapping\u003e`\n* `UnifyingGraph` uses `UnionFind\u003cDenseIdMapping\u003e`\n\nPiperOrigin-RevId: 950949949\nChange-Id: If208ca14a485ebbe632d2f430cb8f4cdc1377827\n"
    },
    {
      "commit": "92b55d11b88451ec55ddcf81137be766b5c1ec3f",
      "tree": "db13b28c22912feed4a23b485cf98d7661b8acaf",
      "parents": [
        "1e40af432030bb5bf4a2a171ac79c15d7562efca"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 20 19:17:10 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 11:51:13 2026 +0100"
      },
      "message": "equality cache: introduce SparseIdMapping\n\nThis encapsulates the operations needed for Union-Find with path\nhalving, matching `DenseIdMapping`.\n\n* `Get` - look up existing mappings, allow non-self mapping updates\n* `Add` - create new non-self mappings\n\nAlso:\n\n* Update call sites in `EqualityCache`.\n\nPiperOrigin-RevId: 950949480\nChange-Id: Ie3233ae7013716263d4f24a55f0dca12ac4f1455\n"
    },
    {
      "commit": "1e40af432030bb5bf4a2a171ac79c15d7562efca",
      "tree": "7c9747ec759b71597d239ba414bc10de951972f5",
      "parents": [
        "da5a0b93d205de708d1463354c971bf0fdea9551"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 20 19:16:39 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 11:51:06 2026 +0100"
      },
      "message": "graph: DenseIdMapping: add Get and Add methods\n\nThese are the low-level mapping operations needed for Union-Find with\npath halving:\n\n* `Get` - look up existing mappings, allow non-self mapping updates\n* `Add` - create new non-self mappings\n\nAlso:\n\n* Rename `operator[]` to `At` and make it private.\n* Update call sites in `UnifyingGraph`.\n\nPiperOrigin-RevId: 950949170\nChange-Id: I0ddfe387c7a573b8fc22be3d052369bcc68801b6\n"
    },
    {
      "commit": "da5a0b93d205de708d1463354c971bf0fdea9551",
      "tree": "5521297ad17bf36b0aa4e12df8ccfaeccd8d112a",
      "parents": [
        "5b49196d31d14359104c52e069a193a8d39f6732"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 20 19:16:04 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 11:50:43 2026 +0100"
      },
      "message": "equality cache: remove hash checking\n\nIt was effectively useless.\n\nSince `Deduplicate` partitions nodes by fingerprint hash before\nperforming equality comparisons, all direct comparisons performed by\n`EqualityCache` within a partition are guaranteed to have identical\nhashes.\n\nWithin the entire test suite, recursion resulted in comparisons\nbetween nodes in different hash partitions exactly twice.\n\nPiperOrigin-RevId: 950948849\nChange-Id: I3ebac795d3d355333fc5eb085472ee6cdbccddb4\n"
    },
    {
      "commit": "5b49196d31d14359104c52e069a193a8d39f6732",
      "tree": "37dbb86afa91629c16acb38a7a2574123e59424e",
      "parents": [
        "b43fb61bff75215b1e0fdf86be54c22c09d78533"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 20 19:15:25 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 11:50:24 2026 +0100"
      },
      "message": "equality cache: remove rank logic from EqualityCache\n\nUnion-find rank management in `EqualityCache` had very low utility in\npractice as the trees are extremely shallow. This change removes the\n`rank` map, the `GetRank` and `SetRank` methods, and related counters.\n\nThis simplifies `Union` to always map `fid1` to `fid2` (which is also\nconsistent with `UnifyingGraph` behaviour).\n\nPiperOrigin-RevId: 950948431\nChange-Id: I5cc216fd4879637a422cc6e47cd7f2293cdd836c\n"
    },
    {
      "commit": "b43fb61bff75215b1e0fdf86be54c22c09d78533",
      "tree": "a0b83456ae9408988cfb2daf1c06dc060ff7c0ba",
      "parents": [
        "ccb7352c041ee7e1946eef78f8e803bbe6999fba"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 20 19:14:58 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 11:49:54 2026 +0100"
      },
      "message": "equality cache: remove AllDifferent from Equals interface and caches\n\nSince inequality tracking was removed from `EqualityCache`, this\nmethod became a no-op in all implementations.\n\nThis change removes `AllDifferent` from:\n\n- the `Equals` operator (removing the call)\n- `EqualityCache` in `equality_cache.h`\n- `PairCache` in `stgdiff.cc`\n- `NoCache` in `abigail_reader_test.cc`\n\nPiperOrigin-RevId: 950948107\nChange-Id: Ib44c73d0a8408701b0ef6f6bb4ab9add1da41684\n"
    },
    {
      "commit": "ccb7352c041ee7e1946eef78f8e803bbe6999fba",
      "tree": "307505ff7803198d217eca7b63e2f33cfcbd8b03",
      "parents": [
        "36848f772b4acb40a67585e12f39333a780a42b8"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 20 19:14:31 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 11:49:47 2026 +0100"
      },
      "message": "equality cache: remove inequality tracking from EqualityCache\n\nInequality tracking in `EqualityCache` had zero utility in practice\ndue to highly effective hash bucketing. This change removes the\n`inequalities` map, the `Disunion` method, and related counters.\n\nPiperOrigin-RevId: 950947792\nChange-Id: I184a429c130598dd085a43c029f5e45608500ed4\n"
    },
    {
      "commit": "36848f772b4acb40a67585e12f39333a780a42b8",
      "tree": "44177af9644ff6867ff2cbeedda5fa5494fa9c0d",
      "parents": [
        "95575a0ae7f4942e152878c7989cc40b86b95389"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 20 19:14:00 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 11:49:31 2026 +0100"
      },
      "message": "equality cache: remove SimpleEqualityCache function object\n\nThis was dead code once the ELF reader handling of symbols with\nmultiple DWARF type declarations switched from a strict equality check\nto type unification.\n\nPiperOrigin-RevId: 950947429\nChange-Id: Ia6c7fedd20df0ac16010958b5fc95ae3065320e5\n"
    },
    {
      "commit": "95575a0ae7f4942e152878c7989cc40b86b95389",
      "tree": "f57d1435689dfbd26faab3a7905d44d8fbeeeee9",
      "parents": [
        "01501b5057be9b8848bd2fe134138e0efe0c52c0"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 20 19:11:58 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 11:49:25 2026 +0100"
      },
      "message": "stg: time the final graph deduplication stages\n\nThis change affects `stg --metrics` instrumentation.\n\nThese happen regardless of which reader generated the graph:\n\n* type resolution\n* node deduplication\n\nPiperOrigin-RevId: 950946162\nChange-Id: I608efe47e1031ee7daceb205dc137e27721cf306\n"
    },
    {
      "commit": "3fbfb246d526eb49d7fc31a0280963e432cc63e1",
      "tree": "68c5f659306a38f34a89d049b9db5d59bd628905",
      "parents": [
        "68ed7fd9a8e57e9f56434a50c64b462e8d262de1",
        "01501b5057be9b8848bd2fe134138e0efe0c52c0"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 03:01:16 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 03:01:16 2026 -0700"
      },
      "message": "graph: use 32-bit internal node ids am: 01501b5057\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41013197\n\nChange-Id: Ib006ddc600bce3b1831fe406f5cdb34b4f563684\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "68ed7fd9a8e57e9f56434a50c64b462e8d262de1",
      "tree": "daa81cffbd78d3ba0bb1f7a3b32bceb683d5abde",
      "parents": [
        "bbe80e424b1e79d7896479dcf3290a7b060b7e8e",
        "1244bb5686b9fa0a2ffbf3a6a6191e54238c1038"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 03:01:03 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 03:01:03 2026 -0700"
      },
      "message": "graph: use auto instead of template parameters where possible am: 1244bb5686\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41013196\n\nChange-Id: Id0c62f3ac4bcd75b2ed143b062085d9d54282aaf\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "bbe80e424b1e79d7896479dcf3290a7b060b7e8e",
      "tree": "1c8b35ded4cbc1cd01f26689b869ab8efa1878cf",
      "parents": [
        "8b4c62a2e3052d4ef378c5b006f385f98aad4aa4",
        "b932d0226d302c4b8e6c70318deb23bcb338393e"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 21 03:00:51 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 21 03:00:51 2026 -0700"
      },
      "message": "graph: use auto instead of template parameter FunctionObject am: b932d0226d\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/41013195\n\nChange-Id: Iccec828e08ec9d22591aff9675693dc5bae80bfd\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "01501b5057be9b8848bd2fe134138e0efe0c52c0",
      "tree": "68c5f659306a38f34a89d049b9db5d59bd628905",
      "parents": [
        "1244bb5686b9fa0a2ffbf3a6a6191e54238c1038"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 13 14:52:06 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Thu Jul 16 09:41:54 2026 +0100"
      },
      "message": "graph: use 32-bit internal node ids\n\nThis means:\n\n* the node ID type `Id` wraps a `uint32_t` value\n* the node arrays are also indexed by `uint32_t` values\n\nThis reduces heap usage and increases performance by around 3% for\ntypical workloads.\n\nIn any case, 2^32 nodes:\n\n* would need more than 1 hour of processing time, at 1M node/s\n* with 64-bit indexing, would typically need about 300G of RAM\n* would break the external format, as it uses 32-bit node IDs\n\nPiperOrigin-RevId: 947013642\nChange-Id: I2da5352f34acd4f961933bbbfeea9678aca46a68\n"
    },
    {
      "commit": "1244bb5686b9fa0a2ffbf3a6a6191e54238c1038",
      "tree": "daa81cffbd78d3ba0bb1f7a3b32bceb683d5abde",
      "parents": [
        "b932d0226d302c4b8e6c70318deb23bcb338393e"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Wed Jul 08 15:04:44 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Thu Jul 16 09:41:20 2026 +0100"
      },
      "message": "graph: use auto instead of template parameters where possible\n\nThese template parameters were not used in these template functions:\n\n* the graph `Self` type in `WithVector`\n* the `Node` type in the default case in `InterfaceKey`\n\nPiperOrigin-RevId: 944479655\nChange-Id: I0ba8511cb475cc20dba1655ed4e073aacd997c1a\n"
    },
    {
      "commit": "b932d0226d302c4b8e6c70318deb23bcb338393e",
      "tree": "1c8b35ded4cbc1cd01f26689b869ab8efa1878cf",
      "parents": [
        "6a5aca349dc76f603861310377d9ac5c80e77e38"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Wed Jul 08 14:48:51 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Thu Jul 16 09:40:57 2026 +0100"
      },
      "message": "graph: use auto instead of template parameter FunctionObject\n\nThe name was not used inside these template functions:\n\n* `Apply`\n* `Apply2`\n* `ForEach`\n* `WithVector`\n\nPiperOrigin-RevId: 944473204\nChange-Id: Icd21abaed42b34ecdb6382356bf18357159cb1d8\n"
    },
    {
      "commit": "8b4c62a2e3052d4ef378c5b006f385f98aad4aa4",
      "tree": "f09213f34cacf7453cbb25bd3b691d8afaf6de41",
      "parents": [
        "c2dae64ea4c8198f9e10c8b1b95cb3fe18436260",
        "6a5aca349dc76f603861310377d9ac5c80e77e38"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 10:19:48 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 10:19:48 2026 -0700"
      },
      "message": "order: use sentinel values for matching vectors in MatchReorderForEach am: 6a5aca349d\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40841172\n\nChange-Id: I641c7748986763171da6215c3012fd97f4423faf\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "c2dae64ea4c8198f9e10c8b1b95cb3fe18436260",
      "tree": "4881c33328f56f0bb0f21519ed141282b99404b6",
      "parents": [
        "0de23a8fc0ee837d326d8bdf24f351b6aa8e8e13",
        "c15abc36aa482560bd75f2f24c0cd636970e2a59"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 10:19:24 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 10:19:24 2026 -0700"
      },
      "message": "order: remove dead code from trailing loop in MatchReorderForEach am: c15abc36aa\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40841171\n\nChange-Id: Ibd417e2c4ff476706cc3b8669777181faf0fd693\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "0de23a8fc0ee837d326d8bdf24f351b6aa8e8e13",
      "tree": "464723baab27ff929c785c33c9aacd03650bb308",
      "parents": [
        "ce810f77867baede0646783e5e2627f67a7d2519",
        "ee11cca42106ab26604b999b69751a9fa362628d"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:44:10 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:44:10 2026 -0700"
      },
      "message": "order: optimise greedy sequence comparison to linear time am: ee11cca421\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830390\n\nChange-Id: Ia24b81eb4df9f7d14918f31f50b318a575c3d70e\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "ce810f77867baede0646783e5e2627f67a7d2519",
      "tree": "79a84cd845b2176bdba7313d9bc57a6fccad65f4",
      "parents": [
        "39ed91497216e6e8c141164721a681abf69d60f2",
        "dc5c37bba00da28d887a7982ed8c2671f1d6dbe8"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:44:00 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:44:00 2026 -0700"
      },
      "message": "order: inline CombineOrders and fuse callbacks am: dc5c37bba0\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830389\n\nChange-Id: I38cafa86e562d2e53326adf411104bc0be7ede61\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "39ed91497216e6e8c141164721a681abf69d60f2",
      "tree": "0a9a19239da1f978339db53e3dfac5c0b53f9db1",
      "parents": [
        "0e55d9239433b58fb871bd4b6ccde1996b456a8f",
        "b05bc9dcdaf79b002317b8fcaafcf6822b8b34ca"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:43:50 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:43:50 2026 -0700"
      },
      "message": "order: inline Reorder and eliminate sorting am: b05bc9dcda\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830388\n\nChange-Id: I542224c9f7e7a147e7583753b357b7e1bd8745f4\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "0e55d9239433b58fb871bd4b6ccde1996b456a8f",
      "tree": "2c43f5b0acff6c5bef3fa0df277b9780a15dffcf",
      "parents": [
        "3134ee1177d7531c3106a4f04bce189754498b03",
        "30b219be97ecf4146a8681640bacea2a134d5d1f"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:43:40 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:43:40 2026 -0700"
      },
      "message": "order: simplify Reorder and inline Permute am: 30b219be97\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830387\n\nChange-Id: Ic010b7c75d6893ffe3630752580e66471e98a832\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "3134ee1177d7531c3106a4f04bce189754498b03",
      "tree": "5c283522ddc1922479d5e15ae087b4775f286834",
      "parents": [
        "7df7351a01c139c2bdeef81723a1edb8ce0286b9",
        "aabde503127bbc7ec15f9ddd1b5a2a9631b17f9f"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:43:31 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:43:31 2026 -0700"
      },
      "message": "order test: add hand-curated test case with multiple optimal solutions am: aabde50312\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830386\n\nChange-Id: Iaf2695016ac995fdf6de9d415c2e4d7e39c5381b\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "7df7351a01c139c2bdeef81723a1edb8ce0286b9",
      "tree": "beb6b98b6dc6b1663a44d59c1e950964c04dfa7a",
      "parents": [
        "d2b9c68bce837c82cc4f88e13f3f5f30d0ca726a",
        "df6a2db93fb75e53c454b7f7246854083f3b4429"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:43:21 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:43:21 2026 -0700"
      },
      "message": "order test: document behavior of hand-curated test cases am: df6a2db93f\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830385\n\nChange-Id: I4cddd7679cae3c2a73498d6480e5cfbe16ee929c\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "d2b9c68bce837c82cc4f88e13f3f5f30d0ca726a",
      "tree": "08ee95ee4edcd13b3ca52c4af0cd8bad4d3d5e33",
      "parents": [
        "7bc22fae7741bbfce7a52df2341a9067d6adcb24",
        "625aadb34bcf9c4f6acab7104ad5a4f2d3ed313a"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:43:13 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:43:13 2026 -0700"
      },
      "message": "order test: add unit tests for MatchReorderForEach am: 625aadb34b\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830384\n\nChange-Id: I971482c968f74e85d962bd1d38931a4cb310d275\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "7bc22fae7741bbfce7a52df2341a9067d6adcb24",
      "tree": "6a0b9bb3abbe442d1cfad63bd871fe14aca7fdd3",
      "parents": [
        "a1c8ea73682c016d5f60964ddcd59de01f8e2d5c",
        "a677fafcc7aa68a77c7089408f600a0dad013414"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:43:03 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:43:03 2026 -0700"
      },
      "message": "order test: clean up helpers and types am: a677fafcc7\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830383\n\nChange-Id: I787957d6d975544873d8a0c9d278d572ca8f83b8\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "a1c8ea73682c016d5f60964ddcd59de01f8e2d5c",
      "tree": "82e081ae8aaa29fa3abcf9d4a9937d5872d062ff",
      "parents": [
        "98bf49db8661061bde21533f29325744325672f0",
        "3d3d65b1ae4580e2cb4e163c99b1e66d0c468265"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:42:55 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:42:55 2026 -0700"
      },
      "message": "order: refactor MatchReorderForEach to use hash map matching am: 3d3d65b1ae\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830382\n\nChange-Id: I5d86cfc0439088daec60e711ec0ad005eaabc449\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "98bf49db8661061bde21533f29325744325672f0",
      "tree": "73ff65e0a4801d0ca61cb9cd9ccf1bd0fefb0979",
      "parents": [
        "d811bed57995e6b618772b99be36e72e133bc704",
        "a2c30d0f3597ba287c93cecf0bc4714c1195e485"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:42:46 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:42:46 2026 -0700"
      },
      "message": "order: inline PairUp into MatchReorderForEach am: a2c30d0f35\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830381\n\nChange-Id: I2d5cafc41059acccb4d9ef662d5c6fa4282ace75\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "d811bed57995e6b618772b99be36e72e133bc704",
      "tree": "1773d5e6e46603b679c8f110afb25d18adfbf99d",
      "parents": [
        "11e1862d02d05c871e5742d13a8767831f2282b0",
        "50cffd7b67da965de28853cb67ac970c48dfabea"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:42:38 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:42:38 2026 -0700"
      },
      "message": "comparison -\u003e order: move PairUp and MatchReorderForEach am: 50cffd7b67\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830380\n\nChange-Id: I230109f644ec4feac6f43c4344f2bafc27c33a94\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "11e1862d02d05c871e5742d13a8767831f2282b0",
      "tree": "d7ce081769d1f8bf2cb8bb5f515a5f53f56a50b4",
      "parents": [
        "8167c063f0fe43bb2f65c0ed594cb5ba5b3e8bc3",
        "bc51dcb4693964ec060d025f2b0905fb47ab50e0"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:42:29 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:42:29 2026 -0700"
      },
      "message": "comparison: refactor sequence matching into MatchReorderForEach am: bc51dcb469\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830379\n\nChange-Id: Ife3b26cb3a809bded816036f04bd851f870fe333\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "8167c063f0fe43bb2f65c0ed594cb5ba5b3e8bc3",
      "tree": "97c6eeaab1d8009d51cd83b4fef7a7e04726d69f",
      "parents": [
        "09926d34a001213f594227ae1d45076b98988481",
        "53a12168c38a6b8a2a13148dff342ab7167ce209"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:42:21 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:42:21 2026 -0700"
      },
      "message": "comparison: move stable_sort calls out of MatchingKeys into PairUp am: 53a12168c3\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830378\n\nChange-Id: Iae0dfb70b8f67272afbc8d420fe1e2e2d673d8ec\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "09926d34a001213f594227ae1d45076b98988481",
      "tree": "51b3ba62a73a51036cb84483d94afb0450b75982",
      "parents": [
        "126dc505cea3ced8781761f45382e48246d85a9b",
        "a17ad8002540ae4f6c0c2043fcc4f4e7b2976066"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:42:11 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:42:11 2026 -0700"
      },
      "message": "test cases: diff tests: add a test case with many enumerators am: a17ad80025\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830377\n\nChange-Id: Ie04f58a2f177e8f604f93544557563b5ced5d1c3\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "126dc505cea3ced8781761f45382e48246d85a9b",
      "tree": "784ffb291799d4793edcf70cfd57817fcf5b95e7",
      "parents": [
        "1736b896195e8e8fe7912f96518ae268507e070b",
        "54f1f1f25ddc8041171770247c54e220c20e0b4c"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:42:00 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:42:00 2026 -0700"
      },
      "message": "unification: fold Unification class into UnifyingGraph am: 54f1f1f25d\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830376\n\nChange-Id: If1ec53d533419c9357f72e556fc2f5ccd8152ea8\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "1736b896195e8e8fe7912f96518ae268507e070b",
      "tree": "4442949339ac088f5185caa144e583c36676c99c",
      "parents": [
        "53f00ba5f2bb07e49995f4d31f0b72e784b99530",
        "670ab830511668f764143ab632b9f3fb3aa2554e"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:41:51 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:41:51 2026 -0700"
      },
      "message": "type_resolution: use UnifyingGraph in ResolveTypes am: 670ab83051\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830375\n\nChange-Id: I457089e23d80db29c7a2980ff338a82ecde8a9f3\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "53f00ba5f2bb07e49995f4d31f0b72e784b99530",
      "tree": "0124f25faca21c69277f8cedbcba5af4f8fa380b",
      "parents": [
        "16c3fa7d955a4218b04bae7e8e30497b22c25dee",
        "2bd554dbd1227ce93653aa5e46271aa52289e5cd"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:41:43 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:41:43 2026 -0700"
      },
      "message": "unification: use UnifyingGraph in Unifier am: 2bd554dbd1\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830374\n\nChange-Id: Ic9e2c996515ed354504668d575b7bd67e183b3d2\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "16c3fa7d955a4218b04bae7e8e30497b22c25dee",
      "tree": "9d198a4de60294baaee388d7466e7051f6b44dc5",
      "parents": [
        "bab708a62d15a08a5217317fa8f4e666283c886c",
        "4a8f4d67dd94be866af3c602fd684ca0c9ac82ab"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:41:33 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:41:33 2026 -0700"
      },
      "message": "unification: introduce UnifyingGraph class am: 4a8f4d67dd\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830373\n\nChange-Id: I632c58bd7dd23a84a18a96a3bd26d5a7970592c7\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "bab708a62d15a08a5217317fa8f4e666283c886c",
      "tree": "8138ff2b531c1827d1d12511a59eb62fb584f23b",
      "parents": [
        "1bca8095c01830353c7b3b0a971984bd91ef7d1b",
        "2b03137e66cd8e7f535214bedcd87d22b097c7d6"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:41:25 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:41:25 2026 -0700"
      },
      "message": "unification: simplify Unifier::Find lookup loop am: 2b03137e66\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830372\n\nChange-Id: I7cb4c4e5f93b8c02e3a7b4e9ca19da9ba38c824c\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "1bca8095c01830353c7b3b0a971984bd91ef7d1b",
      "tree": "b8ffc4736bb583dc1c160e059812f6b1237f5829",
      "parents": [
        "9b8110bc157b96d779ca014ca75dbe69303ca3cc",
        "6b40ba7461d171a1968666329818aa239cc8b261"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:41:17 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:41:17 2026 -0700"
      },
      "message": "graph: eliminate ConstAdapter helper with direct Apply overload am: 6b40ba7461\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830371\n\nChange-Id: I5255c0191b5aad1abba24c27ce3fae6bc9c327b2\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "9b8110bc157b96d779ca014ca75dbe69303ca3cc",
      "tree": "25318e8bc707e6ed934014095d0dbfe41d3751d3",
      "parents": [
        "b93c0c357725372613966bd2e20b071609ff31e2",
        "a34096cdda58f9cbd47ff14be544bbf15dc35208"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:41:08 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:41:08 2026 -0700"
      },
      "message": "graph: move member functions into class definition am: a34096cdda\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830370\n\nChange-Id: Ibb3f7d2bc050f27e8d297ba628e69ebdafe0cda5\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "b93c0c357725372613966bd2e20b071609ff31e2",
      "tree": "8b3f74c30378430f46cf547ff76b74471107661e",
      "parents": [
        "df6aa6d4c9d45f126715a0b69a5d05e31a72d56d",
        "39ea5e742384cead19d80b95c3aeb4d75978897a"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:40:59 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:40:59 2026 -0700"
      },
      "message": "graph: introduce WithVector helper to eliminate switch duplication in Apply/Apply2 am: 39ea5e7423\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830369\n\nChange-Id: I250aae673f4c964e001fc6d1cec5ce2cad2f35fd\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "df6aa6d4c9d45f126715a0b69a5d05e31a72d56d",
      "tree": "864360f027d5a2664b8fbbc407a9086cdd66cfe2",
      "parents": [
        "5e5266aecdfc1313373d3ae4113c720c4cfd598f",
        "b8d5db518ceb2726f483f27869940f8f6cdb1de3"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:40:50 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:40:50 2026 -0700"
      },
      "message": "graph: do not report internal node IDs to users am: b8d5db518c\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830368\n\nChange-Id: I802afd56de828bfd40624b5fe2c3425b6ce698c5\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "5e5266aecdfc1313373d3ae4113c720c4cfd598f",
      "tree": "cef0eefe4374fc1b41ea0c2d73150f22810e5417",
      "parents": [
        "56c7eae222e26e84a286032c372b2171d699b870",
        "7ca6df48af62fbe0a347d5be317e94ec108202b0"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:40:39 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:40:39 2026 -0700"
      },
      "message": "test cases: diff tests: cover C++ enumerator values am: 7ca6df48af\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830367\n\nChange-Id: I90a7e06534fbd0e97dd7ff268f31c523b3e4fa10\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "56c7eae222e26e84a286032c372b2171d699b870",
      "tree": "db08083351dec8014cf6e9735b210ac28fdc763b",
      "parents": [
        "80d78124e1d58d279160b36f961e1cafae9e43c3",
        "45904d8ef10e2d91e6794624392228f5fbd74ee3"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:40:30 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:40:30 2026 -0700"
      },
      "message": "test cases: info tests: cover C++ enumerator values am: 45904d8ef1\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830366\n\nChange-Id: I5b0f136cea0c2cdb11909cd284d10f626a4da26f\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "80d78124e1d58d279160b36f961e1cafae9e43c3",
      "tree": "ca7892d38c9c167e501cf2b22ec445dd040c08cf",
      "parents": [
        "56d3026b96da783095b80454bd199d7979a29c9f",
        "f757ca7fc4687b9723c304c5645c4fcc8a0325b1"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:40:22 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:40:22 2026 -0700"
      },
      "message": "test cases: diff tests: add fully anonymous member test am: f757ca7fc4\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830365\n\nChange-Id: I321416c0fc5af9a334e36485d92969d362758685\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "56d3026b96da783095b80454bd199d7979a29c9f",
      "tree": "98fcd3aa13fd1bc6bd790a4292c94ac167470afb",
      "parents": [
        "054d455d97580c81c02647a3074167c2cbf09ad4",
        "33a6e4e8762b1579c7e97ccbf544ec60b1841ab5"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Tue Jul 07 07:40:13 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:40:13 2026 -0700"
      },
      "message": "stg: remove const std::unique_ptr\u003cFilter\u003e\u0026 anti-pattern am: 33a6e4e876\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830364\n\nChange-Id: Id0023f750a2bb0b84bb239d0c80a412d8099a32a\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "054d455d97580c81c02647a3074167c2cbf09ad4",
      "tree": "89bee0df9f7a1767ec578ec384c21aa89b847924",
      "parents": [
        "3ff549eb18c5a1c5c392c362e303bbd0de28ef0f",
        "379f5ea98aa9d995c7030e5ca66578da799440e2"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:40:05 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:40:05 2026 -0700"
      },
      "message": "stg, stgdiff: make opts arrays const am: 379f5ea98a\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830363\n\nChange-Id: I138fd00ff625c04a603e2a31ffd154143a9c51d8\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "3ff549eb18c5a1c5c392c362e303bbd0de28ef0f",
      "tree": "1a5831f40a225f9c4934f3915ef86bfc008465f7",
      "parents": [
        "e7f169c8135925287247227760999ea0da025765",
        "57f1b86cb00b2c570b51e0837be95add78473fba"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Tue Jul 07 07:39:55 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:39:55 2026 -0700"
      },
      "message": "filter: simplify string operations and line processing am: 57f1b86cb0\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830362\n\nChange-Id: I23b87dd0829e1ab43a67bfb3549eea0c3afb3698\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "e7f169c8135925287247227760999ea0da025765",
      "tree": "3917fa46a9aacef43837c2d1880b8e839d2f7060",
      "parents": [
        "0973951b46a243f1c803eea02e2a1889f7e61676",
        "14d04ac0936b04b413a18316311bc477cf2b1098"
      ],
      "author": {
        "name": "Matthias Maennich",
        "email": "maennich@google.com",
        "time": "Tue Jul 07 07:39:46 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:39:46 2026 -0700"
      },
      "message": "ELF loader: replace strnlen with std::string_view::find am: 14d04ac093\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830361\n\nChange-Id: Ide8fc4afda83e0909b7de03aca3c30f29d984ac6\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "0973951b46a243f1c803eea02e2a1889f7e61676",
      "tree": "9031c46f2f36f7f87754b8df0b47a8832b9ccfc4",
      "parents": [
        "650076c8142b36af4f7c53b02217ea1adf94a2b6",
        "4aaf554103b283e0f2005fbc8669113ad472e0e3"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 07:39:35 2026 -0700"
      },
      "committer": {
        "name": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "email": "android-build-automerger-merge-worker@system.gserviceaccount.com",
        "time": "Tue Jul 07 07:39:35 2026 -0700"
      },
      "message": "stg: move handling of single root node case into Merge am: 4aaf554103\n\nOriginal change: https://googleplex-android-review.googlesource.com/c/platform/external/stg/+/40830360\n\nChange-Id: I79fb5a9e542ec2e75d2d901f2eeafa1a55525f51\nSigned-off-by: Automerger Merge Worker \u003candroid-build-automerger-merge-worker@system.gserviceaccount.com\u003e\n"
    },
    {
      "commit": "6a5aca349dc76f603861310377d9ac5c80e77e38",
      "tree": "f09213f34cacf7453cbb25bd3b691d8afaf6de41",
      "parents": [
        "c15abc36aa482560bd75f2f24c0cd636970e2a59"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 14:35:58 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 15:24:40 2026 +0100"
      },
      "message": "order: use sentinel values for matching vectors in MatchReorderForEach\n\nReplace `std::vector\u003cstd::optional\u003csize_t\u003e\u003e` with `std::vector\u003csize_t\u003e`\nusing sentinel values `size2` and `size1` to represent unmatched\nelements in `ix1_to_ix2` and `ix2_to_ix1`, respectively.\n\nThis halves the memory occupancy of these temporary arrays and reduces\nmemory traffic during sequence matching.\n\nPiperOrigin-RevId: 943860551\nChange-Id: I18893845370da543f1783ac634fb7630d8437629\n"
    },
    {
      "commit": "c15abc36aa482560bd75f2f24c0cd636970e2a59",
      "tree": "4881c33328f56f0bb0f21519ed141282b99404b6",
      "parents": [
        "ee11cca42106ab26604b999b69751a9fa362628d"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 14:34:34 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 15:24:32 2026 +0100"
      },
      "message": "order: remove dead code from trailing loop in MatchReorderForEach\n\nThe trailing loop in `MatchReorderForEach` checked whether each\nremaining `items2` element was matched or unmatched, but the\n`in_both` branch was unreachable as all matching items had\nalready been processed.\n\nThis simplifies the trailing loop to call `added` unconditionally,\nremoving the dead `in_both` branch, the `ix2_to_ix1` lookup and\nthe index value check.\n\nPiperOrigin-RevId: 943859944\nChange-Id: I0232f21046b3fac267993f9a55edee93778b904e\n"
    },
    {
      "commit": "ee11cca42106ab26604b999b69751a9fa362628d",
      "tree": "464723baab27ff929c785c33c9aacd03650bb308",
      "parents": [
        "dc5c37bba00da28d887a7982ed8c2671f1d6dbe8"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 23:11:54 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:58:01 2026 +0100"
      },
      "message": "order: optimise greedy sequence comparison to linear time\n\nOptimise greedy sequence comparison in `MatchReorderForEach` from\nO(N * M) quadratic time to O(N + M) linear time.\n\nThis replaces linear `std::find` lookups with direct index mapping\nvectors (`ix1_to_ix2` and `ix2_to_ix1`), dramatically accelerating\nsequence reconciliation for large inputs.\n\nThe following changes are made:\n\n* `order.h`: update `MatchReorderForEach` to use index mapping vectors\n  `ix1_to_ix2` and `ix2_to_ix1` for O(1) index lookups\n* `g3doc/comparison.md`: update documentation describing sequence\n  comparison time complexity\n\nPiperOrigin-RevId: 943518219\nChange-Id: I4202bb4ec268bad0a249b69d6b08140914e8ac81\n"
    },
    {
      "commit": "dc5c37bba00da28d887a7982ed8c2671f1d6dbe8",
      "tree": "79a84cd845b2176bdba7313d9bc57a6fccad65f4",
      "parents": [
        "b05bc9dcdaf79b002317b8fcaafcf6822b8b34ca"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 23:10:49 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:57:56 2026 +0100"
      },
      "message": "order: inline CombineOrders and fuse callbacks\n\nInline `CombineOrders` into `MatchReorderForEach` and fuse callback\ndispatch directly into the greedy reconciliation loop.\n\nThis eliminates intermediate `pairs`, `indexes1`, `indexes2`, and\n`permutation` vector allocations, invoking callbacks (`removed`,\n`added`, `in_both`) on the fly.\n\nThe following changes are made:\n\n* inline greedy order reconciliation directly into `MatchReorderForEach`\n* invoke `removed`, `added`, and `in_both` callbacks on the fly during\n  greedy sequence traversal\n* remove `CombineOrders` function template\n\nPiperOrigin-RevId: 943517645\nChange-Id: I6daa912da9bf793fa613e9ac6f9aa7afe8144151\n"
    },
    {
      "commit": "b05bc9dcdaf79b002317b8fcaafcf6822b8b34ca",
      "tree": "0a9a19239da1f978339db53e3dfac5c0b53f9db1",
      "parents": [
        "30b219be97ecf4146a8681640bacea2a134d5d1f"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 23:10:02 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:57:17 2026 +0100"
      },
      "message": "order: inline Reorder and eliminate sorting\n\nInline `Reorder` into `MatchReorderForEach` and eliminate position\nsorting.\n\nThis simplifies sequence ordering by passing `indexes1` and `indexes2`\ndirectly to `CombineOrders`.\n\nThe following changes are made:\n\n* inline `Reorder` logic into `MatchReorderForEach`, using `std::iota`\n  for `indexes1` and direct mapping for `indexes2`\n* call `CombineOrders` directly inside `MatchReorderForEach`\n* remove `Reorder` function template\n\nPiperOrigin-RevId: 943517230\nChange-Id: Ic43b11b9d5a63096eee7bd5620d4957bf0038932\n"
    },
    {
      "commit": "30b219be97ecf4146a8681640bacea2a134d5d1f",
      "tree": "2c43f5b0acff6c5bef3fa0df277b9780a15dffcf",
      "parents": [
        "aabde503127bbc7ec15f9ddd1b5a2a9631b17f9f"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 23:09:32 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:56:51 2026 +0100"
      },
      "message": "order: simplify Reorder and inline Permute\n\nRefactor `Reorder` to return a permutation vector rather than permuting\ndata in-place, and inline `Permute`.\n\nThis separates permutation calculation from callback dispatch in\n`MatchReorderForEach`.\n\nThe following changes are made:\n\n* update `Reorder` to return `std::vector\u003csize_t\u003e` permutation vector\n* update `MatchReorderForEach` to iterate over the permutation vector\n* remove obsolete `Permute` function template\n\nThe following tests were removed:\n\n* `hand-curated permutation` which tested `Permute`\n* `hand-curated reorderings with input order randomisation` which\n  relied on `Permute` and tested `Reorder` which itself will be\n  osboleted in the next change\n\nPiperOrigin-RevId: 943516987\nChange-Id: I75499ee2fa530fe46dbb69845a52d2119b99f534\n"
    },
    {
      "commit": "aabde503127bbc7ec15f9ddd1b5a2a9631b17f9f",
      "tree": "5c283522ddc1922479d5e15ae087b4775f286834",
      "parents": [
        "df6a2db93fb75e53c454b7f7246854083f3b4429"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 23:08:57 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:56:48 2026 +0100"
      },
      "message": "order test: add hand-curated test case with multiple optimal solutions\n\nIn this case the problem is underconstrained and there are two optimal\nsolutions. The current algorithm deterministically picks one of them.\n\nPiperOrigin-RevId: 943516625\nChange-Id: Idb0413dbf1b8dc8deadde87db334e57dbd17ec03\n"
    },
    {
      "commit": "df6a2db93fb75e53c454b7f7246854083f3b4429",
      "tree": "beb6b98b6dc6b1663a44d59c1e950964c04dfa7a",
      "parents": [
        "625aadb34bcf9c4f6acab7104ad5a4f2d3ed313a"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 23:08:27 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:56:30 2026 +0100"
      },
      "message": "order test: document behavior of hand-curated test cases\n\nAnnotate hand-curated test cases to clarify sequence ordering\nexpectations:\n\n* Distinguish cases that have a unique ordering compatible with both\n  inputs.\n* Explain conflicting cases (e.g. `{\"z\", \"a\", \"q\"}` vs `{\"a\", \"z\"}`),\n  noting how preference is given to the second sequence\u0027s order when\n  constraints conflict.\n\nPiperOrigin-RevId: 943516265\nChange-Id: I485b8a8af7a202c6c5c3ca90587633d0b5be6f2b\n"
    },
    {
      "commit": "625aadb34bcf9c4f6acab7104ad5a4f2d3ed313a",
      "tree": "08ee95ee4edcd13b3ca52c4af0cd8bad4d3d5e33",
      "parents": [
        "a677fafcc7aa68a77c7089408f600a0dad013414"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 23:05:16 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:56:26 2026 +0100"
      },
      "message": "order test: add unit tests for MatchReorderForEach\n\nUnit tests for `MatchReorderForEach` are added covering:\n\n* collections\n* duplicate keys\n* anonymous items\n\nThe following helper functions are added:\n\n* `CombineOrders` as a `MatchReorderForEach` wrapper\n* `GetMappingCalls` to capture callback outputs as formatted strings\n  (`item\u003e`, `\u003citem`, `item1\u003ditem2`)\n\nPiperOrigin-RevId: 943514520\nChange-Id: I1e297076c9cb50214985fe8eb36247a3f4c4484f\n"
    },
    {
      "commit": "a677fafcc7aa68a77c7089408f600a0dad013414",
      "tree": "6a0b9bb3abbe442d1cfad63bd871fe14aca7fdd3",
      "parents": [
        "3d3d65b1ae4580e2cb4e163c99b1e66d0c468265"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 22:58:07 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:56:18 2026 +0100"
      },
      "message": "order test: clean up helpers and types\n\nThis simplifies and improves the readability of various test cases.\n\nThe following changes are made:\n\n* define `using Sequence \u003d std::vector\u003cstd::string\u003e;` helper type alias\n* put helpers into an anonymous namespace\n* change `MakePermutation`\n    * add a starting offset `k`\n    * radically simplify with `std::iota` and `std::shuffle`\n* clean up various test names, comments and indentation\n\nPiperOrigin-RevId: 943511189\nChange-Id: I794b7ab8c613212f127c0a98c9ea0d02ca7a68e4\n"
    },
    {
      "commit": "3d3d65b1ae4580e2cb4e163c99b1e66d0c468265",
      "tree": "82e081ae8aaa29fa3abcf9d4a9937d5872d062ff",
      "parents": [
        "a2c30d0f3597ba287c93cecf0bc4714c1195e485"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 22:55:40 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:56:16 2026 +0100"
      },
      "message": "order: refactor MatchReorderForEach to use hash map matching\n\nThis replaces key sorting and 2-pointer merging with hash-map-based\nkey index lookup, enabling duplicate key detection for input sequences.\n\nPiperOrigin-RevId: 943510095\nChange-Id: I46b82ebfbeeee965e17d270e87919ed1e96ef05a\n"
    },
    {
      "commit": "a2c30d0f3597ba287c93cecf0bc4714c1195e485",
      "tree": "73ff65e0a4801d0ca61cb9cd9ccf1bd0fefb0979",
      "parents": [
        "50cffd7b67da965de28853cb67ac970c48dfabea"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 22:53:04 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:56:13 2026 +0100"
      },
      "message": "order: inline PairUp into MatchReorderForEach\n\nInline `PairUp` into `MatchReorderForEach`, exposing further\nsimplification opportunities.\n\nAlso make `KeyIndexPairs` generic, allowing `MatchReorderForEach` to\noperate on sequences with any comparable key type rather than just\n`std::string`.\n\nThe following changes are made:\n\n* template `KeyIndexPairs` as `template \u003ctypename Key\u003e using KeyIndexPairs`\n* deduce `Key` as `std::decay_t\u003cstd::invoke_result_t\u003cExtractKey, const T\u0026\u003e\u003e`\n* inline the 2-pointer `PairUp` merging loop directly into\n  `MatchReorderForEach`\n* drop unreachable impossible pair check\n* remove `PairUp` helper function\n\nPiperOrigin-RevId: 943508855\nChange-Id: I203aa17638850a471778c076c45d5900df2e543a\n"
    },
    {
      "commit": "50cffd7b67da965de28853cb67ac970c48dfabea",
      "tree": "1773d5e6e46603b679c8f110afb25d18adfbf99d",
      "parents": [
        "bc51dcb4693964ec060d025f2b0905fb47ab50e0"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 22:51:30 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:56:10 2026 +0100"
      },
      "message": "comparison -\u003e order: move PairUp and MatchReorderForEach\n\nThis cleanly separates sequence comparison from graph comparison.\n\nThese definitions are moved verbatim:\n\n* `KeyIndexPairs`\n* `MatchedPairs`\n* `PairUp`\n* `MatchReorderForEach`\n\nPiperOrigin-RevId: 943508102\nChange-Id: I3fc291be85014a8f47496ff4c13dbc42a601bca3\n"
    },
    {
      "commit": "bc51dcb4693964ec060d025f2b0905fb47ab50e0",
      "tree": "d7ce081769d1f8bf2cb8bb5f515a5f53f56a50b4",
      "parents": [
        "53a12168c38a6b8a2a13148dff342ab7167ce209"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 22:46:47 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:56:02 2026 +0100"
      },
      "message": "comparison: refactor sequence matching into MatchReorderForEach\n\nExtract common sequence matching, sorting, pairing and callback dispatch\nlogic into a new `MatchReorderForEach` template helper function.\n\nThis consolidates duplicate sequence matching code across graph nodes\nand enumerators, establishing a clean interface between comparison and\nordering functionality.\n\nThe following adjustments are made:\n\n* define local `MatchReorderForEach` template function taking 4 lambdas:\n    * `extract_key`\n    * `removed`\n    * `added`\n    * `in_both`\n* copy key extractor function so stateful extractors (such as anonymous\n  node index counters) generate matching keys across both input sequences\n* update `CompareWorker::Nodes` to call `MatchReorderForEach`\n* update `CompareWorker::operator()(const Enumeration\u0026, ...)` to call\n  `MatchReorderForEach`\n* remove `MatchingKeys` helper functions obsoleted by `extract_key`\n  lambdas\n\nPiperOrigin-RevId: 943505858\nChange-Id: I160223ed922502cb8173eb161d3ee935fd7f3d6b\n"
    },
    {
      "commit": "53a12168c38a6b8a2a13148dff342ab7167ce209",
      "tree": "97c6eeaab1d8009d51cd83b4fef7a7e04726d69f",
      "parents": [
        "a17ad8002540ae4f6c0c2043fcc4f4e7b2976066"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 22:42:41 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:55:55 2026 +0100"
      },
      "message": "comparison: move stable_sort calls out of MatchingKeys into PairUp\n\nThis is the first step in refactoring sequence matching, moving\nordering logic out of the comparison code.\n\nThe following changes are made:\n\n* remove `std::stable_sort` from `MatchingKeys` over graph nodes\n* remove `std::stable_sort` from `MatchingKeys` over enumerators\n* add `std::stable_sort` for both key sequences at entry to `PairUp`\n\nPiperOrigin-RevId: 943504047\nChange-Id: I46892ff8f7df7d6b657fa6f981566144b7f1641b\n"
    },
    {
      "commit": "a17ad8002540ae4f6c0c2043fcc4f4e7b2976066",
      "tree": "51b3ba62a73a51036cb84483d94afb0450b75982",
      "parents": [
        "54f1f1f25ddc8041171770247c54e220c20e0b4c"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 22:41:21 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:55:46 2026 +0100"
      },
      "message": "test cases: diff tests: add a test case with many enumerators\n\nThis test case compares two enums containing 10,000 completely\ndisjoint enumerators each and so maximises the search depth in\nordering algorithms, helping to identify quadratic slowdowns.\n\nPiperOrigin-RevId: 943503492\nChange-Id: I403d56d28ce1230fc9c758b2f4daed51eacbec83\n"
    },
    {
      "commit": "54f1f1f25ddc8041171770247c54e220c20e0b4c",
      "tree": "784ffb291799d4793edcf70cfd57817fcf5b95e7",
      "parents": [
        "670ab830511668f764143ab632b9f3fb3aa2554e"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 22:39:02 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:55:17 2026 +0100"
      },
      "message": "unification: fold Unification class into UnifyingGraph\n\n`UnifyingGraph` now directly owns the union-find state, provides `Find`,\n`Union`, `Unify`, and `Apply` operations, and rewrites the graph on\ndestruction (`~UnifyingGraph`).\n\nThis removes the separate `Unification` class and redundant wrapper\nindirection.\n\nPiperOrigin-RevId: 943502452\nChange-Id: Ie6b141cd88710c013945311db3b7793838808ec2\n"
    },
    {
      "commit": "670ab830511668f764143ab632b9f3fb3aa2554e",
      "tree": "4442949339ac088f5185caa144e583c36676c99c",
      "parents": [
        "2bd554dbd1227ce93653aa5e46271aa52289e5cd"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 22:37:37 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:55:14 2026 +0100"
      },
      "message": "type_resolution: use UnifyingGraph in ResolveTypes\n\nChange `ResolveTypes` to take `UnifyingGraph\u0026` and update its callers.\n\nPiperOrigin-RevId: 943501670\nChange-Id: I7690af5c3d523fd7f0770f8e89ce3255e099c2eb\n"
    },
    {
      "commit": "2bd554dbd1227ce93653aa5e46271aa52289e5cd",
      "tree": "0124f25faca21c69277f8cedbcba5af4f8fa380b",
      "parents": [
        "4a8f4d67dd94be866af3c602fd684ca0c9ac82ab"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 22:34:07 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:55:12 2026 +0100"
      },
      "message": "unification: use UnifyingGraph in Unifier\n\nRefactor `Unifier` struct and `Unification::Unify` in `unification.cc`\nto use `UnifyingGraph`.\n\nPiperOrigin-RevId: 943499997\nChange-Id: I362914178966c9feb07ed726a2ea449475d144a5\n"
    },
    {
      "commit": "4a8f4d67dd94be866af3c602fd684ca0c9ac82ab",
      "tree": "9d198a4de60294baaee388d7466e7051f6b44dc5",
      "parents": [
        "2b03137e66cd8e7f535214bedcd87d22b097c7d6"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 22:30:29 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:55:08 2026 +0100"
      },
      "message": "unification: introduce UnifyingGraph class\n\nIntroduce `UnifyingGraph` wrapper class in `unification.h` bundling\n`Graph\u0026` and `Unification\u0026`.\n\n`UnifyingGraph` exposes `Find`, `Unify`, and `Union` operations, and\nprovides `Apply` and `Apply2` methods that resolve canonical `Id`s via\n`unification.Find(id)` before delegating node pattern-matching to\n`Graph`.\n\nPiperOrigin-RevId: 943498243\nChange-Id: I0f9f716b7391618c78e835111c8152411690e73a\n"
    },
    {
      "commit": "2b03137e66cd8e7f535214bedcd87d22b097c7d6",
      "tree": "8138ff2b531c1827d1d12511a59eb62fb584f23b",
      "parents": [
        "6b40ba7461d171a1968666329818aa239cc8b261"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 22:28:37 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:55:05 2026 +0100"
      },
      "message": "unification: simplify Unifier::Find lookup loop\n\nCanonicalise `id` via `unification.Find(id)` upon entry and when\nfollowing speculative `mapping` targets in `Unifier::Find`.\n\nThis ensures `mapping` keys (which are canonical IDs) are correctly\nmatched while avoiding redundant `unification.Find` calls on loop\ntermination when no local speculative mapping exists.\n\nPiperOrigin-RevId: 943497440\nChange-Id: I118d89f27452f51cf27193ab899ba4efd307b92d\n"
    },
    {
      "commit": "6b40ba7461d171a1968666329818aa239cc8b261",
      "tree": "b8ffc4736bb583dc1c160e059812f6b1237f5829",
      "parents": [
        "a34096cdda58f9cbd47ff14be544bbf15dc35208"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 22:24:50 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:55:02 2026 +0100"
      },
      "message": "graph: eliminate ConstAdapter helper with direct Apply overload\n\nEliminate `ConstAdapter` wrapper struct by implementing non-const\n`Apply` directly using `WithVector`.\n\nPiperOrigin-RevId: 943495633\nChange-Id: Ifca5e66c00984d8d53f1f09d1ef1b0d61aa06c80\n"
    },
    {
      "commit": "a34096cdda58f9cbd47ff14be544bbf15dc35208",
      "tree": "25318e8bc707e6ed934014095d0dbfe41d3751d3",
      "parents": [
        "39ea5e742384cead19d80b95c3aeb4d75978897a"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 22:24:05 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:54:59 2026 +0100"
      },
      "message": "graph: move member functions into class definition\n\n`ConstAdapter`, `Apply`, and `Apply2` are now all straightforward.\n\nPiperOrigin-RevId: 943495289\nChange-Id: Ibb9d4c5d40a852a33da1ae78303b817360a73574\n"
    },
    {
      "commit": "39ea5e742384cead19d80b95c3aeb4d75978897a",
      "tree": "8b3f74c30378430f46cf547ff76b74471107661e",
      "parents": [
        "b8d5db518ceb2726f483f27869940f8f6cdb1de3"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 22:19:38 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:54:56 2026 +0100"
      },
      "message": "graph: introduce WithVector helper to eliminate switch duplication in Apply/Apply2\n\nIntroduce static `WithVector` helper method in `Graph` to eliminate\nduplicate `switch (which)` statements across `Apply` and `Apply2`.\n\nPiperOrigin-RevId: 943493268\nChange-Id: Id6c1ad448d4c6149719ad7d877d8bbb28181a2cd\n"
    },
    {
      "commit": "b8d5db518ceb2726f483f27869940f8f6cdb1de3",
      "tree": "864360f027d5a2664b8fbbc407a9086cdd66cfe2",
      "parents": [
        "7ca6df48af62fbe0a347d5be317e94ec108202b0"
      ],
      "author": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Mon Jul 06 22:18:54 2026 +0100"
      },
      "committer": {
        "name": "Giuliano Procida",
        "email": "gprocida@google.com",
        "time": "Tue Jul 07 06:54:50 2026 +0100"
      },
      "message": "graph: do not report internal node IDs to users\n\nWhen an invalid operation is attempted, the internal node ID is not\nactionable or useful to end users in any way.\n\nPiperOrigin-RevId: 943492926\nChange-Id: If9372cd4ccf8b3fdc83751e9e272ff1ea8367549\n"
    }
  ],
  "next": "7ca6df48af62fbe0a347d5be317e94ec108202b0"
}
