diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a7d998d..e9687470 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,94 @@ ## Unreleased +- Made `ReplaceRange` corroborate the selected Head/root byte extent and exact + requested-range materialization before no-op classification, so truncated or + absent retained roots fail with a typed malformed-rope obstruction. +- Extended split-boundary corroboration through every enclosing retained branch, + so zero and internal insertions cannot preserve false aggregate metrics. +- Made every zero-width `ReplaceRange` split boundary perform cycle-safe Blob, + leaf-extent, and UTF-8 validation before preserving adjacent rope structure. +- Made exact-end `ReplaceRange` validation corroborate every retained branch + byte, UTF-16, line-break, and height aggregate on its endpoint path. +- Made exact-end `ReplaceRange` validation reject cyclic retained rope links + with a typed malformed-fact obstruction instead of looping indefinitely. +- Scoped the ReplaceRange historical planner checkpoint to provenance only. +- Cross-checked every committable `ReplaceRange` corpus result against its + authenticated basis and patched Buffer, Head, Rewrite, and Diff fact chain. +- Made strict `ReplaceRange` corpus validation preserve Echo's canonical patch + phase ordering and ascending node identity order within each phase. +- Made strict `ReplaceRange` corpus validation decode every committable patch + attachment through its declared native fact type, require canonical bytes, + and authenticate the keyed or content-addressed node identity. +- Hardened the strict ReplaceRange corpus mutation harness so a negative witness + cannot pass solely because its test re-encoding changed canonical member order. +- Made `ReplaceRange` refuse to produce a `MutationPlan` from a selected basis + Head unless its retained bytes reproduce its content address, are canonical, + and name the target Buffer. The structurally separate retained-consequence + gate now proves the same laws. +- Made the DL-0158 final-audit ledger exhaustive. The release test now parses a + closed claim grammar, binds every named claim to its retrospective section + and complete ordered source-citation set, and rejects hidden, malformed, + missing, extra, or displaced evidence links. +- Made every retained-rope coordinate and metric calculation used by + `ReplaceRange` fail with a typed arithmetic obstruction instead of panicking + in debug builds or wrapping in optimized builds. Adversarial leaf, branch, + and resulting-Head witnesses prove legacy parity and zero parent mutation; + exact-end insertion now authenticates its retained Leaf/Blob extent. +- Added an independent byte-splice oracle for successful `ReplaceRange` cases. + Internally consistent retained graph evidence is refused unless its + materialized text equals the declared basis prefix, replacement, and suffix. +- Tightened retrospective source citations from commit-level presence to exact + claim-bearing paths and lines, including distinct stale- and foreign-basis + anchors and the serialized update command itself. +- Bound every exact digest in the `ReplaceRange` retrospective to independently + hashed schema, codec-vector, and oracle bytes plus their committed sidecars. + The evidence ledger can no longer drift for only one artifact class. +- Bound the published fact type-ID domain to the pinned Echo `warp-core` + implementation for every declared Jedit fact. The schema keeps a named + publication constant without claiming ownership of Echo's identity law. +- Extended the canonical fact-string golden vector through the maximum Unicode + scalar U+10FFFF. Conformance now proves supplementary scalars remain literal + four-byte UTF-8 and cannot be emitted as surrogate escapes. +- Made retained `ReplaceRange` consequence validation recompute the keyed + Buffer identity in both the basis and result graphs. Mutually consistent + Buffer facts retained under the wrong node address now fail closed. +- Made the production `ReplaceRange` planner emit a closed typed obstruction + reason at each decision site while retaining its exact legacy `HostError`. + Oracle evidence consumes that reason; non-structural host failures cannot + mint semantic categories, and order/bounds diagnostics remain distinct. +- Strengthened the `ReplaceRange` stale- and foreign-basis witnesses to prove + the retained causal relationships they claim. A stale basis must be the + direct ancestor of the target Buffer's canonical Head, while a foreign basis + must be the canonical Head of its own retained Buffer. +- Made the `ReplaceRange` lawpack updater run only its exact serial writer tests + before the complete locked reader/conformance pass, eliminating an + update-time race against stale committed resources. +- Replaced the member-name-only `ReplaceRange` oracle check with a typed + raw-byte contract. Envelope identities, source provenance, canonical + identifier and UTF-8 lexemes, invocation bytes, footprints, patches, result + metrics, no-partial-mutation obstruction evidence, member order, whitespace, + and final-newline framing now fail closed. +- Enforced the published `ReplaceRange` oracle-invocation lexical law. Strict + conformance now rejects uppercase, malformed, or wrong-width identifiers and + odd, malformed, or non-UTF-8 replacement-byte encodings. +- Added a retained-consequence consistency gate to the `ReplaceRange` oracle. + Buffer, Head, Rewrite, and Diff identities, cross-links, ranges, metrics, and + planner summaries must agree before result evidence can be published. +- Qualified every flattened `ReplaceRange` oracle footprint and patch + identifier by the corpus WARP. Generation and local fixture application now + reject foreign-WARP node, edge, and attachment keys before projection. +- Replaced free-form `ReplaceRange` oracle obstruction strings with an + exhaustive semantic enum and published strict corpus, terminal, footprint, + patch, and result shapes. Conformance now rejects unknown fields and semantic + obstruction codes. +- Bound the native Cargo manifest and lockfile into the published + `ReplaceRange` oracle source-set digest, so generator provenance now includes + exact feature and dependency selection. +- Replaced the fabricated `ReplaceRange` noncanonical-basis fixture with + distinct retained stale-head and real foreign-head obstruction witnesses. + Both causal postures now prove that planning yields no patch and leaves the + parent graph unchanged. - Hard-cut production text authority to the real Echo WASM boundary. Jim now requires and initializes a configured Echo kernel before constructing the workspace; when the generated Jim Edict package is unavailable, every text diff --git a/contracts/jedit/lawpacks/replace-range-v1/codec-vectors-v1.json b/contracts/jedit/lawpacks/replace-range-v1/codec-vectors-v1.json new file mode 100644 index 00000000..15501e57 --- /dev/null +++ b/contracts/jedit/lawpacks/replace-range-v1/codec-vectors-v1.json @@ -0,0 +1,637 @@ +{ + "formatVersion": 1, + "schemaCoordinate": "jedit.text.schema@1", + "vectors": [ + { + "fact": "Buffer", + "typeLabel": "jedit.text.BufferWorldline.v1", + "typeIdHex": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "identity": { + "kind": "keyed", + "bufferKey": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f\"\\/猫

􏿿", + "nodeIdHex": "494aa40d2b2c6a6f7afd6423ad937ed0cc8f9ca7d01e1b94d7b61eefb2949e44" + }, + "value": { + "buffer_key": "\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\t\n\u000b\f\r\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f\"\\/猫

􏿿", + "canonical_head_id": [ + 82, + 126, + 161, + 35, + 203, + 212, + 69, + 112, + 124, + 25, + 221, + 229, + 126, + 51, + 62, + 211, + 137, + 116, + 20, + 191, + 98, + 20, + 165, + 11, + 229, + 192, + 147, + 113, + 73, + 4, + 219, + 146 + ], + "projection_path": null, + "version": 2147483648 + }, + "canonicalBytesHex": "7b226275666665725f6b6579223a225c75303030305c75303030315c75303030325c75303030335c75303030345c75303030355c75303030365c75303030375c625c745c6e5c75303030625c665c725c75303030655c75303030665c75303031305c75303031315c75303031325c75303031335c75303031345c75303031355c75303031365c75303031375c75303031385c75303031395c75303031615c75303031625c75303031635c75303031645c75303031655c75303031665c225c5c2fe78cabe280a8e280a9f48fbfbf222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b38322c3132362c3136312c33352c3230332c3231322c36392c3131322c3132342c32352c3232312c3232392c3132362c35312c36322c3231312c3133372c3131362c32302c3139312c39382c32302c3136352c31312c3232392c3139322c3134372c3131332c37332c342c3231392c3134365d2c2276657273696f6e223a323134373438333634387d" + }, + { + "fact": "Blob", + "typeLabel": "jedit.text.TextBlob.v1", + "typeIdHex": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "identity": { + "kind": "content-addressed", + "domainHex": "6a656469742e746578742e626c6f622e763100", + "nodeIdHex": "501b5f1bd32d468c5d9221f80693f447e5a7e3146714eda0b80fe611add60e21" + }, + "value": { + "bytes": [ + 65, + 240, + 159, + 152, + 128, + 10 + ], + "content_hash": [ + 160, + 88, + 200, + 187, + 228, + 195, + 174, + 104, + 85, + 103, + 22, + 50, + 129, + 147, + 199, + 190, + 206, + 58, + 140, + 54, + 245, + 219, + 241, + 63, + 195, + 0, + 31, + 4, + 154, + 208, + 125, + 185 + ] + }, + "canonicalBytesHex": "7b22636f6e74656e745f68617368223a5b3136302c38382c3230302c3138372c3232382c3139352c3137342c3130342c38352c3130332c32322c35302c3132392c3134372c3139392c3139302c3230362c35382c3134302c35342c3234352c3231392c3234312c36332c3139352c302c33312c342c3135342c3230382c3132352c3138355d2c226279746573223a5b36352c3234302c3135392c3135322c3132382c31305d7d" + }, + { + "fact": "Leaf", + "typeLabel": "jedit.text.RopeLeaf.v1", + "typeIdHex": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "identity": { + "kind": "content-addressed", + "domainHex": "6a656469742e746578742e6c6561662e763100", + "nodeIdHex": "543c5617ada7ac68cfeed18a6d504fbb31c4693358bf5d4b6e41cb1b30b9c8dd" + }, + "value": { + "blob_id": [ + 80, + 27, + 95, + 27, + 211, + 45, + 70, + 140, + 93, + 146, + 33, + 248, + 6, + 147, + 244, + 71, + 229, + 167, + 227, + 20, + 103, + 20, + 237, + 160, + 184, + 15, + 230, + 17, + 173, + 214, + 14, + 33 + ], + "byte_length": 6, + "byte_start": 0, + "line_breaks": 1, + "utf16_length": 4 + }, + "canonicalBytesHex": "7b22626c6f625f6964223a5b38302c32372c39352c32372c3231312c34352c37302c3134302c39332c3134362c33332c3234382c362c3134372c3234342c37312c3232392c3136372c3232372c32302c3130332c32302c3233372c3136302c3138342c31352c3233302c31372c3137332c3231342c31342c33335d2c22627974655f7374617274223a302c22627974655f6c656e677468223a362c2275746631365f6c656e677468223a342c226c696e655f627265616b73223a317d" + }, + { + "fact": "Branch", + "typeLabel": "jedit.text.RopeBranch.v1", + "typeIdHex": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "identity": { + "kind": "content-addressed", + "domainHex": "6a656469742e746578742e6272616e63682e763100", + "nodeIdHex": "8a3ed35007c5621ff1dba65ef526532d479c650cac73bc8caf1ab38165d793a5" + }, + "value": { + "byte_length": 12, + "height": 2, + "left": [ + 84, + 60, + 86, + 23, + 173, + 167, + 172, + 104, + 207, + 238, + 209, + 138, + 109, + 80, + 79, + 187, + 49, + 196, + 105, + 51, + 88, + 191, + 93, + 75, + 110, + 65, + 203, + 27, + 48, + 185, + 200, + 221 + ], + "line_breaks": 2, + "right": [ + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34, + 34 + ], + "utf16_length": 8 + }, + "canonicalBytesHex": "7b226c656674223a5b38342c36302c38362c32332c3137332c3136372c3137322c3130342c3230372c3233382c3230392c3133382c3130392c38302c37392c3138372c34392c3139362c3130352c35312c38382c3139312c39332c37352c3131302c36352c3230332c32372c34382c3138352c3230302c3232315d2c227269676874223a5b33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33342c33345d2c22627974655f6c656e677468223a31322c2275746631365f6c656e677468223a382c226c696e655f627265616b73223a322c22686569676874223a327d" + }, + { + "fact": "Head", + "typeLabel": "jedit.text.RopeHead.v1", + "typeIdHex": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "identity": { + "kind": "content-addressed", + "domainHex": "6a656469742e746578742e686561642e763100", + "nodeIdHex": "527ea123cbd445707c19dde57e333ed3897414bf6214a50be5c093714904db92" + }, + "value": { + "basis_head_id": [ + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51 + ], + "buffer_id": [ + 73, + 74, + 164, + 13, + 43, + 44, + 106, + 111, + 122, + 253, + 100, + 35, + 173, + 147, + 126, + 208, + 204, + 143, + 156, + 167, + 208, + 30, + 27, + 148, + 215, + 182, + 30, + 239, + 178, + 148, + 158, + 68 + ], + "byte_length": 6, + "line_count": 2, + "root_digest": [ + 84, + 60, + 86, + 23, + 173, + 167, + 172, + 104, + 207, + 238, + 209, + 138, + 109, + 80, + 79, + 187, + 49, + 196, + 105, + 51, + 88, + 191, + 93, + 75, + 110, + 65, + 203, + 27, + 48, + 185, + 200, + 221 + ], + "root_node_id": [ + 84, + 60, + 86, + 23, + 173, + 167, + 172, + 104, + 207, + 238, + 209, + 138, + 109, + 80, + 79, + 187, + 49, + 196, + 105, + 51, + 88, + 191, + 93, + 75, + 110, + 65, + 203, + 27, + 48, + 185, + 200, + 221 + ], + "sequence": 2147483648, + "utf16_length": 4 + }, + "canonicalBytesHex": "7b226275666665725f6964223a5b37332c37342c3136342c31332c34332c34342c3130362c3131312c3132322c3235332c3130302c33352c3137332c3134372c3132362c3230382c3230342c3134332c3135362c3136372c3230382c33302c32372c3134382c3231352c3138322c33302c3233392c3137382c3134382c3135382c36385d2c2262617369735f686561645f6964223a5b35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35315d2c22726f6f745f6e6f64655f6964223a5b38342c36302c38362c32332c3137332c3136372c3137322c3130342c3230372c3233382c3230392c3133382c3130392c38302c37392c3138372c34392c3139362c3130352c35312c38382c3139312c39332c37352c3131302c36352c3230332c32372c34382c3138352c3230302c3232315d2c22627974655f6c656e677468223a362c2275746631365f6c656e677468223a342c226c696e655f636f756e74223a322c22726f6f745f646967657374223a5b38342c36302c38362c32332c3137332c3136372c3137322c3130342c3230372c3233382c3230392c3133382c3130392c38302c37392c3138372c34392c3139362c3130352c35312c38382c3139312c39332c37352c3131302c36352c3230332c32372c34382c3138352c3230302c3232315d2c2273657175656e6365223a323134373438333634387d" + }, + { + "fact": "Rewrite", + "typeLabel": "jedit.text.RopeRewrite.v1", + "typeIdHex": "c30835603fa3940cf7845d961d0e41d338c40fea99698639dfc155117465943a", + "identity": { + "kind": "content-addressed", + "domainHex": "6a656469742e746578742e726577726974652e763100", + "nodeIdHex": "462c1003621e710d927f3d90342cf8cb2cd64abafbfba079e59cd5d75a524e50" + }, + "value": { + "basis_head_id": [ + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51 + ], + "buffer_id": [ + 73, + 74, + 164, + 13, + 43, + 44, + 106, + 111, + 122, + 253, + 100, + 35, + 173, + 147, + 126, + 208, + 204, + 143, + 156, + 167, + 208, + 30, + 27, + 148, + 215, + 182, + 30, + 239, + 178, + 148, + 158, + 68 + ], + "end_byte": 2147483652, + "inserted_byte_length": 6, + "next_head_id": [ + 82, + 126, + 161, + 35, + 203, + 212, + 69, + 112, + 124, + 25, + 221, + 229, + 126, + 51, + 62, + 211, + 137, + 116, + 20, + 191, + 98, + 20, + 165, + 11, + 229, + 192, + 147, + 113, + 73, + 4, + 219, + 146 + ], + "start_byte": 2147483648 + }, + "canonicalBytesHex": "7b226275666665725f6964223a5b37332c37342c3136342c31332c34332c34342c3130362c3131312c3132322c3235332c3130302c33352c3137332c3134372c3132362c3230382c3230342c3134332c3135362c3136372c3230382c33302c32372c3134382c3231352c3138322c33302c3233392c3137382c3134382c3135382c36385d2c2262617369735f686561645f6964223a5b35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35315d2c226e6578745f686561645f6964223a5b38322c3132362c3136312c33352c3230332c3231322c36392c3131322c3132342c32352c3232312c3232392c3132362c35312c36322c3231312c3133372c3131362c32302c3139312c39382c32302c3136352c31312c3232392c3139322c3134372c3131332c37332c342c3231392c3134365d2c2273746172745f62797465223a323134373438333634382c22656e645f62797465223a323134373438333635322c22696e7365727465645f627974655f6c656e677468223a367d" + }, + { + "fact": "Diff", + "typeLabel": "jedit.text.RopeDiff.v1", + "typeIdHex": "d5ed88f6007b97cda5106fc3548d6252f164bd86b18f6b41d22e7c6a72f21ccd", + "identity": { + "kind": "content-addressed", + "domainHex": "6a656469742e746578742e646966662e763100", + "nodeIdHex": "9882cc76dcdee98cd11f4c820fb81ba0952c5dc2028bea60945401a7dbb22549" + }, + "value": { + "basis_head_id": [ + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51, + 51 + ], + "deleted_byte_length": 18446744073709551615, + "end_byte": 2147483652, + "inserted_byte_length": 6, + "next_head_id": [ + 82, + 126, + 161, + 35, + 203, + 212, + 69, + 112, + 124, + 25, + 221, + 229, + 126, + 51, + 62, + 211, + 137, + 116, + 20, + 191, + 98, + 20, + 165, + 11, + 229, + 192, + 147, + 113, + 73, + 4, + 219, + 146 + ], + "rewrite_id": [ + 70, + 44, + 16, + 3, + 98, + 30, + 113, + 13, + 146, + 127, + 61, + 144, + 52, + 44, + 248, + 203, + 44, + 214, + 74, + 186, + 251, + 251, + 160, + 121, + 229, + 156, + 213, + 215, + 90, + 82, + 78, + 80 + ], + "start_byte": 2147483648 + }, + "canonicalBytesHex": "7b22726577726974655f6964223a5b37302c34342c31362c332c39382c33302c3131332c31332c3134362c3132372c36312c3134342c35322c34342c3234382c3230332c34342c3231342c37342c3138362c3235312c3235312c3136302c3132312c3232392c3135362c3231332c3231352c39302c38322c37382c38305d2c2262617369735f686561645f6964223a5b35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35312c35315d2c226e6578745f686561645f6964223a5b38322c3132362c3136312c33352c3230332c3231322c36392c3131322c3132342c32352c3232312c3232392c3132362c35312c36322c3231312c3133372c3131362c32302c3139312c39382c32302c3136352c31312c3232392c3139322c3134372c3131332c37332c342c3231392c3134365d2c2273746172745f62797465223a323134373438333634382c22656e645f62797465223a323134373438333635322c22696e7365727465645f627974655f6c656e677468223a362c2264656c657465645f627974655f6c656e677468223a31383434363734343037333730393535313631357d" + } + ] +} diff --git a/contracts/jedit/lawpacks/replace-range-v1/codec-vectors-v1.sha256 b/contracts/jedit/lawpacks/replace-range-v1/codec-vectors-v1.sha256 new file mode 100644 index 00000000..8afee5f3 --- /dev/null +++ b/contracts/jedit/lawpacks/replace-range-v1/codec-vectors-v1.sha256 @@ -0,0 +1 @@ +1ac26477e1d6c08df49446627ad002e40bd214235ce93b563d62bb50e40dc14c diff --git a/contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.json b/contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.json new file mode 100644 index 00000000..f0b878ec --- /dev/null +++ b/contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.json @@ -0,0 +1,3081 @@ +{ + "schemaVersion": 1, + "coordinate": "jedit.text.ReplaceRange.oracle@1", + "applicationSchemaCoordinate": "jedit.text.schema@1", + "invocationSchemaCoordinate": "jedit.text.ReplaceRange.oracle-invocation@1", + "historicalPlannerCheckpointCommit": "c70e12d73b4b00bc92412bab67e1761f7dd22f82", + "sourceSet": { + "algorithm": "sha256", + "domainHex": "6a656469742e7265706c6163652d72616e67652e6f7261636c652d736f757263652e763100", + "framing": "domain || repeated(u32be-path-length || path-utf8 || u64be-byte-length || bytes)", + "paths": [ + "native/jedit-echo-host/Cargo.toml", + "native/jedit-echo-host/Cargo.lock", + "native/jedit-echo-host/src/error.rs", + "native/jedit-echo-host/src/identity.rs", + "native/jedit-echo-host/src/records.rs", + "native/jedit-echo-host/src/rope.rs", + "native/jedit-echo-host/src/rope/fact_read.rs", + "native/jedit-echo-host/src/rope/fault.rs", + "native/jedit-echo-host/src/rope/replace.rs", + "native/jedit-echo-host/src/rope/tree.rs", + "native/jedit-echo-host/src/rope/window.rs", + "native/jedit-echo-host/tests/replace_range_oracle.rs", + "native/jedit-echo-host/tests/support/replace_range_basis.rs", + "native/jedit-echo-host/tests/support/replace_range_basis_witness.rs", + "native/jedit-echo-host/tests/support/replace_range_contract.rs", + "native/jedit-echo-host/tests/support/replace_range_consequence.rs", + "native/jedit-echo-host/tests/support/replace_range_consequence_tests.rs", + "native/jedit-echo-host/tests/support/replace_range_legacy.rs", + "native/jedit-echo-host/tests/support/replace_range_oracle.rs", + "native/jedit-echo-host/tests/support/replace_range_oracle_tests.rs", + "native/jedit-echo-host/tests/support/replace_range_source_set.rs" + ], + "digestHex": "2adf83f798205f52636ad64ca45178f33a8e1cc663874f8a6113484c945e3052" + }, + "evidenceGrade": "deterministic-self-validation", + "independenceLimit": "independent finite-corpus evidence begins only when a separately implemented Echo evaluator agrees", + "warpId": "50ac1cc17b2ccc05195d403cba33921618a03b9143e8e6e169bd57712fae0d2a", + "cases": [ + { + "id": "empty-unicode-insert", + "purpose": "finite persistent-rope ReplaceRange conformance witness", + "basisFacts": [ + { + "nodeId": "58137c62c8d0d3586914ad89fc40839b12413c0778c78ed5b5b1092df99fa858", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a22656d7074792d756e69636f64652d696e73657274222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3231342c38382c3133362c3138342c3137372c3134322c31382c35322c3234392c3137302c3131312c36382c3133372c39362c3134302c3131332c3130352c33372c3134392c3130322c34382c39392c35322c3233352c35362c33352c3131382c3137392c3233312c38312c38312c3234375d2c2276657273696f6e223a307d" + }, + { + "nodeId": "d65888b8b18e1234f9aa6f4489608c7169259566306334eb382376b3e75151f7", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b38382c31392c3132342c39382c3230302c3230382c3231312c38382c3130352c32302c3137332c3133372c3235322c36342c3133312c3135352c31382c36352c36302c372c3132302c3139392c3134322c3231332c3138312c3137372c392c34352c3234392c3135392c3136382c38385d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a6e756c6c2c22627974655f6c656e677468223a302c2275746631365f6c656e677468223a302c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3138332c3135362c38392c3139352c36382c34332c34352c39302c34302c3136302c3235312c3139392c3235352c31382c3131372c3231362c3130382c36362c34332c3232382c3134372c3131322c3131342c3231372c3139312c302c38372c34332c34392c31332c3233322c38385d2c2273657175656e6365223a307d" + } + ], + "invocation": { + "bufferId": "58137c62c8d0d3586914ad89fc40839b12413c0778c78ed5b5b1092df99fa858", + "basisHeadId": "d65888b8b18e1234f9aa6f4489608c7169259566306334eb382376b3e75151f7", + "startByte": 0, + "endByte": 0, + "replacementUtf8Hex": "e78cab0a" + }, + "invocationBytesHex": "7b226275666665724964223a2235383133376336326338643064333538363931346164383966633430383339623132343133633037373863373865643562356231303932646639396661383538222c226261736973486561644964223a2264363538383862386231386531323334663961613666343438393630386337313639323539353636333036333334656233383233373662336537353135316637222c22737461727442797465223a302c22656e6442797465223a302c227265706c6163656d656e7455746638486578223a226537386361623061227d", + "terminal": { + "posture": "committable", + "footprint": { + "nodeReads": [ + "58137c62c8d0d3586914ad89fc40839b12413c0778c78ed5b5b1092df99fa858", + "d65888b8b18e1234f9aa6f4489608c7169259566306334eb382376b3e75151f7" + ], + "nodeWrites": [ + "1f4ce47e0ea86a8ed65fd1bf82834b32b0187d20023e361eb431cc3ffafabcee", + "58137c62c8d0d3586914ad89fc40839b12413c0778c78ed5b5b1092df99fa858", + "7312130c9693715646ad46b641e768a0fbb6805b7fec173a33e955dee095fa17", + "7b5a5e4291fc41641320e437bfad5a56c49330c30b13a45c96c441a53ac63a13", + "9adc06013f853037d340431a5db6caec255bf04342657f7905994f6fcc100591", + "e8e471b2a9828e3f16db7a69fafecc20f246ebfe06f69be01babe46e7be1f44b" + ], + "attachmentReads": [ + "58137c62c8d0d3586914ad89fc40839b12413c0778c78ed5b5b1092df99fa858", + "d65888b8b18e1234f9aa6f4489608c7169259566306334eb382376b3e75151f7" + ], + "attachmentWrites": [ + "1f4ce47e0ea86a8ed65fd1bf82834b32b0187d20023e361eb431cc3ffafabcee", + "58137c62c8d0d3586914ad89fc40839b12413c0778c78ed5b5b1092df99fa858", + "7312130c9693715646ad46b641e768a0fbb6805b7fec173a33e955dee095fa17", + "7b5a5e4291fc41641320e437bfad5a56c49330c30b13a45c96c441a53ac63a13", + "9adc06013f853037d340431a5db6caec255bf04342657f7905994f6fcc100591", + "e8e471b2a9828e3f16db7a69fafecc20f246ebfe06f69be01babe46e7be1f44b" + ], + "edgeReads": [], + "edgeWrites": [] + }, + "patch": [ + { + "kind": "upsert-node", + "nodeId": "1f4ce47e0ea86a8ed65fd1bf82834b32b0187d20023e361eb431cc3ffafabcee", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9" + }, + { + "kind": "upsert-node", + "nodeId": "58137c62c8d0d3586914ad89fc40839b12413c0778c78ed5b5b1092df99fa858", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e" + }, + { + "kind": "upsert-node", + "nodeId": "7312130c9693715646ad46b641e768a0fbb6805b7fec173a33e955dee095fa17", + "typeId": "c30835603fa3940cf7845d961d0e41d338c40fea99698639dfc155117465943a" + }, + { + "kind": "upsert-node", + "nodeId": "7b5a5e4291fc41641320e437bfad5a56c49330c30b13a45c96c441a53ac63a13", + "typeId": "d5ed88f6007b97cda5106fc3548d6252f164bd86b18f6b41d22e7c6a72f21ccd" + }, + { + "kind": "upsert-node", + "nodeId": "9adc06013f853037d340431a5db6caec255bf04342657f7905994f6fcc100591", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e" + }, + { + "kind": "upsert-node", + "nodeId": "e8e471b2a9828e3f16db7a69fafecc20f246ebfe06f69be01babe46e7be1f44b", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4" + }, + { + "kind": "set-node-alpha", + "nodeId": "1f4ce47e0ea86a8ed65fd1bf82834b32b0187d20023e361eb431cc3ffafabcee", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3134362c38352c31392c37392c38362c35382c37352c3132392c3138352c3134332c33382c3133342c38352c37312c3233362c3231372c35322c3136342c3233362c38382c3133352c37362c36312c372c3234382c36392c3138302c36332c3232372c31312c31352c32305d2c226279746573223a5b3233312c3134302c3137312c31305d7d" + }, + { + "kind": "set-node-alpha", + "nodeId": "58137c62c8d0d3586914ad89fc40839b12413c0778c78ed5b5b1092df99fa858", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a22656d7074792d756e69636f64652d696e73657274222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3135342c3232302c362c312c36332c3133332c34382c35352c3231312c36342c36372c32362c39332c3138322c3230322c3233362c33372c39312c3234302c36372c36362c3130312c3132372c3132312c352c3135332c37392c3131312c3230342c31362c352c3134355d2c2276657273696f6e223a317d" + }, + { + "kind": "set-node-alpha", + "nodeId": "7312130c9693715646ad46b641e768a0fbb6805b7fec173a33e955dee095fa17", + "typeId": "c30835603fa3940cf7845d961d0e41d338c40fea99698639dfc155117465943a", + "attachmentBytesHex": "7b226275666665725f6964223a5b38382c31392c3132342c39382c3230302c3230382c3231312c38382c3130352c32302c3137332c3133372c3235322c36342c3133312c3135352c31382c36352c36302c372c3132302c3139392c3134322c3231332c3138312c3137372c392c34352c3234392c3135392c3136382c38385d2c2262617369735f686561645f6964223a5b3231342c38382c3133362c3138342c3137372c3134322c31382c35322c3234392c3137302c3131312c36382c3133372c39362c3134302c3131332c3130352c33372c3134392c3130322c34382c39392c35322c3233352c35362c33352c3131382c3137392c3233312c38312c38312c3234375d2c226e6578745f686561645f6964223a5b3135342c3232302c362c312c36332c3133332c34382c35352c3231312c36342c36372c32362c39332c3138322c3230322c3233362c33372c39312c3234302c36372c36362c3130312c3132372c3132312c352c3135332c37392c3131312c3230342c31362c352c3134355d2c2273746172745f62797465223a302c22656e645f62797465223a302c22696e7365727465645f627974655f6c656e677468223a347d" + }, + { + "kind": "set-node-alpha", + "nodeId": "7b5a5e4291fc41641320e437bfad5a56c49330c30b13a45c96c441a53ac63a13", + "typeId": "d5ed88f6007b97cda5106fc3548d6252f164bd86b18f6b41d22e7c6a72f21ccd", + "attachmentBytesHex": "7b22726577726974655f6964223a5b3131352c31382c31392c31322c3135302c3134372c3131332c38362c37302c3137332c37302c3138322c36352c3233312c3130342c3136302c3235312c3138322c3132382c39312c3132372c3233362c32332c35382c35312c3233332c38352c3232322c3232342c3134392c3235302c32335d2c2262617369735f686561645f6964223a5b3231342c38382c3133362c3138342c3137372c3134322c31382c35322c3234392c3137302c3131312c36382c3133372c39362c3134302c3131332c3130352c33372c3134392c3130322c34382c39392c35322c3233352c35362c33352c3131382c3137392c3233312c38312c38312c3234375d2c226e6578745f686561645f6964223a5b3135342c3232302c362c312c36332c3133332c34382c35352c3231312c36342c36372c32362c39332c3138322c3230322c3233362c33372c39312c3234302c36372c36362c3130312c3132372c3132312c352c3135332c37392c3131312c3230342c31362c352c3134355d2c2273746172745f62797465223a302c22656e645f62797465223a302c22696e7365727465645f627974655f6c656e677468223a342c2264656c657465645f627974655f6c656e677468223a307d" + }, + { + "kind": "set-node-alpha", + "nodeId": "9adc06013f853037d340431a5db6caec255bf04342657f7905994f6fcc100591", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b38382c31392c3132342c39382c3230302c3230382c3231312c38382c3130352c32302c3137332c3133372c3235322c36342c3133312c3135352c31382c36352c36302c372c3132302c3139392c3134322c3231332c3138312c3137372c392c34352c3234392c3135392c3136382c38385d2c2262617369735f686561645f6964223a5b3231342c38382c3133362c3138342c3137372c3134322c31382c35322c3234392c3137302c3131312c36382c3133372c39362c3134302c3131332c3130352c33372c3134392c3130322c34382c39392c35322c3233352c35362c33352c3131382c3137392c3233312c38312c38312c3234375d2c22726f6f745f6e6f64655f6964223a5b3233322c3232382c3131332c3137382c3136392c3133302c3134322c36332c32322c3231392c3132322c3130352c3235302c3235342c3230342c33322c3234322c37302c3233352c3235342c362c3234362c3135352c3232342c32372c3137312c3232382c3131302c3132332c3232352c3234342c37355d2c22627974655f6c656e677468223a342c2275746631365f6c656e677468223a322c226c696e655f636f756e74223a322c22726f6f745f646967657374223a5b3233322c3232382c3131332c3137382c3136392c3133302c3134322c36332c32322c3231392c3132322c3130352c3235302c3235342c3230342c33322c3234322c37302c3233352c3235342c362c3234362c3135352c3232342c32372c3137312c3232382c3131302c3132332c3232352c3234342c37355d2c2273657175656e6365223a317d" + }, + { + "kind": "set-node-alpha", + "nodeId": "e8e471b2a9828e3f16db7a69fafecc20f246ebfe06f69be01babe46e7be1f44b", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b33312c37362c3232382c3132362c31342c3136382c3130362c3134322c3231342c39352c3230392c3139312c3133302c3133312c37352c35302c3137362c32342c3132352c33322c322c36322c35342c33302c3138302c34392c3230342c36332c3235302c3235302c3138382c3233385d2c22627974655f7374617274223a302c22627974655f6c656e677468223a342c2275746631365f6c656e677468223a322c226c696e655f627265616b73223a317d" + } + ], + "createdNodeIds": [ + "1f4ce47e0ea86a8ed65fd1bf82834b32b0187d20023e361eb431cc3ffafabcee", + "7312130c9693715646ad46b641e768a0fbb6805b7fec173a33e955dee095fa17", + "7b5a5e4291fc41641320e437bfad5a56c49330c30b13a45c96c441a53ac63a13", + "9adc06013f853037d340431a5db6caec255bf04342657f7905994f6fcc100591", + "e8e471b2a9828e3f16db7a69fafecc20f246ebfe06f69be01babe46e7be1f44b" + ], + "updatedNodeIds": [ + "58137c62c8d0d3586914ad89fc40839b12413c0778c78ed5b5b1092df99fa858" + ], + "untouchedBasisNodeIds": [ + "d65888b8b18e1234f9aa6f4489608c7169259566306334eb382376b3e75151f7" + ], + "result": { + "bufferId": "58137c62c8d0d3586914ad89fc40839b12413c0778c78ed5b5b1092df99fa858", + "headId": "9adc06013f853037d340431a5db6caec255bf04342657f7905994f6fcc100591", + "rootNodeId": "e8e471b2a9828e3f16db7a69fafecc20f246ebfe06f69be01babe46e7be1f44b", + "rootDigest": "e8e471b2a9828e3f16db7a69fafecc20f246ebfe06f69be01babe46e7be1f44b", + "rewriteId": "7312130c9693715646ad46b641e768a0fbb6805b7fec173a33e955dee095fa17", + "diffId": "7b5a5e4291fc41641320e437bfad5a56c49330c30b13a45c96c441a53ac63a13", + "byteLength": 4, + "utf16Length": 2, + "lineCount": 2, + "sequence": 1, + "version": 1, + "materializedTextUtf8Hex": "e78cab0a" + } + } + }, + { + "id": "middle-ascii-insert", + "purpose": "finite persistent-rope ReplaceRange conformance witness", + "basisFacts": [ + { + "nodeId": "03f150de0814d97ad25a26ff414ef48d2ec0871ac939acef1cdad52df6380e7c", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b35342c3231322c3137392c37372c33382c3139392c3137382c322c3234342c3231372c38342c37382c39322c3130332c3137332c37392c3130392c3136382c3136352c35342c312c3130342c36382c3137392c31352c37372c3132392c3230372c35322c34312c35332c3234385d2c22627974655f7374617274223a302c22627974655f6c656e677468223a342c2275746631365f6c656e677468223a342c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "36d4b34d26c7b202f4d9544e5c67ad4f6da8a536016844b30f4d81cf342935f8", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3138352c3134342c3233382c3134322c3135302c33342c3134302c3135312c37312c3233352c37312c3135352c37372c3234372c3131352c3136302c3230352c3133322c3136302c36362c38312c322c3231332c3136372c3133312c3139322c3130312c3132342c3136332c32352c3130332c35315d2c226279746573223a5b39372c39382c39392c3130305d7d" + }, + { + "nodeId": "431817db784a33420d1859566b85b23f484ded55725a38d532790ce79382f452", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3139392c38322c33362c3138332c3235322c3231362c37342c35352c3138382c3231352c3135332c36302c36312c34302c3139392c3137372c3231332c3134372c3132322c3230372c3235352c3131372c3234302c31332c3137302c32342c32392c3139372c3232352c32392c3234332c3233325d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b332c3234312c38302c3232322c382c32302c3231372c3132322c3231302c39302c33382c3235352c36352c37382c3234342c3134312c34362c3139322c3133352c32362c3230312c35372c3137322c3233392c32382c3231382c3231332c34352c3234362c35362c31342c3132345d2c22627974655f6c656e677468223a342c2275746631365f6c656e677468223a342c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b332c3234312c38302c3232322c382c32302c3231372c3132322c3231302c39302c33382c3235352c36352c37382c3234342c3134312c34362c3139322c3133352c32362c3230312c35372c3137322c3233392c32382c3231382c3231332c34352c3234362c35362c31342c3132345d2c2273657175656e6365223a307d" + }, + { + "nodeId": "c75224b7fcd84a37bcd7993c3d28c7b1d5937acfff75f00daa181dc5e11df3e8", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226d6964646c652d61736369692d696e73657274222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b36372c32342c32332c3231392c3132302c37342c35312c36362c31332c32342c38392c38362c3130372c3133332c3137382c36332c37322c37372c3233372c38352c3131342c39302c35362c3231332c35302c3132312c31322c3233312c3134372c3133302c3234342c38325d2c2276657273696f6e223a307d" + } + ], + "invocation": { + "bufferId": "c75224b7fcd84a37bcd7993c3d28c7b1d5937acfff75f00daa181dc5e11df3e8", + "basisHeadId": "431817db784a33420d1859566b85b23f484ded55725a38d532790ce79382f452", + "startByte": 2, + "endByte": 2, + "replacementUtf8Hex": "5859" + }, + "invocationBytesHex": "7b226275666665724964223a2263373532323462376663643834613337626364373939336333643238633762316435393337616366666637356630306461613138316463356531316466336538222c226261736973486561644964223a2234333138313764623738346133333432306431383539353636623835623233663438346465643535373235613338643533323739306365373933383266343532222c22737461727442797465223a322c22656e6442797465223a322c227265706c6163656d656e7455746638486578223a2235383539227d", + "terminal": { + "posture": "committable", + "footprint": { + "nodeReads": [ + "03f150de0814d97ad25a26ff414ef48d2ec0871ac939acef1cdad52df6380e7c", + "36d4b34d26c7b202f4d9544e5c67ad4f6da8a536016844b30f4d81cf342935f8", + "431817db784a33420d1859566b85b23f484ded55725a38d532790ce79382f452", + "c75224b7fcd84a37bcd7993c3d28c7b1d5937acfff75f00daa181dc5e11df3e8" + ], + "nodeWrites": [ + "2b36e79a3d5b16a823e530c2428acf9f69a0aa06786ec6f7217533ae10cec21a", + "3bd4626bc71bff2931b94911f3987ef9ec5cbd2157a691b5cc77edf269c785ac", + "590054fca5e0ec5f79d5a474f3204579a77d4fbe0c64a00903cc372491e91978", + "6c269527a00ea013bc3cc84302f088612cb9b1c975ab7fa4b6e73811390780da", + "6f35b4d75864d0515e7de5397ee204ca3c5978943c80ce8facd7915eaddb08bf", + "6f6669839671d8391426ae434d19ae981ae5af83c3288a539b700cf88e115d22", + "ad1100adc61c927ca63848eb1764879cdd02abc1e192efe68ecc6dcf68703668", + "c75224b7fcd84a37bcd7993c3d28c7b1d5937acfff75f00daa181dc5e11df3e8", + "d6a24d09cebb1d5914a6d2275e23a7255f60d41a009a50ea7e79635a25dc8ab1", + "d903058e13d6f5af17984f4a8c206741c95e3c7514f0d78555ab604961cfd125" + ], + "attachmentReads": [ + "03f150de0814d97ad25a26ff414ef48d2ec0871ac939acef1cdad52df6380e7c", + "36d4b34d26c7b202f4d9544e5c67ad4f6da8a536016844b30f4d81cf342935f8", + "431817db784a33420d1859566b85b23f484ded55725a38d532790ce79382f452", + "c75224b7fcd84a37bcd7993c3d28c7b1d5937acfff75f00daa181dc5e11df3e8" + ], + "attachmentWrites": [ + "2b36e79a3d5b16a823e530c2428acf9f69a0aa06786ec6f7217533ae10cec21a", + "3bd4626bc71bff2931b94911f3987ef9ec5cbd2157a691b5cc77edf269c785ac", + "590054fca5e0ec5f79d5a474f3204579a77d4fbe0c64a00903cc372491e91978", + "6c269527a00ea013bc3cc84302f088612cb9b1c975ab7fa4b6e73811390780da", + "6f35b4d75864d0515e7de5397ee204ca3c5978943c80ce8facd7915eaddb08bf", + "6f6669839671d8391426ae434d19ae981ae5af83c3288a539b700cf88e115d22", + "ad1100adc61c927ca63848eb1764879cdd02abc1e192efe68ecc6dcf68703668", + "c75224b7fcd84a37bcd7993c3d28c7b1d5937acfff75f00daa181dc5e11df3e8", + "d6a24d09cebb1d5914a6d2275e23a7255f60d41a009a50ea7e79635a25dc8ab1", + "d903058e13d6f5af17984f4a8c206741c95e3c7514f0d78555ab604961cfd125" + ], + "edgeReads": [], + "edgeWrites": [] + }, + "patch": [ + { + "kind": "upsert-node", + "nodeId": "2b36e79a3d5b16a823e530c2428acf9f69a0aa06786ec6f7217533ae10cec21a", + "typeId": "d5ed88f6007b97cda5106fc3548d6252f164bd86b18f6b41d22e7c6a72f21ccd" + }, + { + "kind": "upsert-node", + "nodeId": "3bd4626bc71bff2931b94911f3987ef9ec5cbd2157a691b5cc77edf269c785ac", + "typeId": "c30835603fa3940cf7845d961d0e41d338c40fea99698639dfc155117465943a" + }, + { + "kind": "upsert-node", + "nodeId": "590054fca5e0ec5f79d5a474f3204579a77d4fbe0c64a00903cc372491e91978", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1" + }, + { + "kind": "upsert-node", + "nodeId": "6c269527a00ea013bc3cc84302f088612cb9b1c975ab7fa4b6e73811390780da", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4" + }, + { + "kind": "upsert-node", + "nodeId": "6f35b4d75864d0515e7de5397ee204ca3c5978943c80ce8facd7915eaddb08bf", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e" + }, + { + "kind": "upsert-node", + "nodeId": "6f6669839671d8391426ae434d19ae981ae5af83c3288a539b700cf88e115d22", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1" + }, + { + "kind": "upsert-node", + "nodeId": "ad1100adc61c927ca63848eb1764879cdd02abc1e192efe68ecc6dcf68703668", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4" + }, + { + "kind": "upsert-node", + "nodeId": "c75224b7fcd84a37bcd7993c3d28c7b1d5937acfff75f00daa181dc5e11df3e8", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e" + }, + { + "kind": "upsert-node", + "nodeId": "d6a24d09cebb1d5914a6d2275e23a7255f60d41a009a50ea7e79635a25dc8ab1", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4" + }, + { + "kind": "upsert-node", + "nodeId": "d903058e13d6f5af17984f4a8c206741c95e3c7514f0d78555ab604961cfd125", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9" + }, + { + "kind": "set-node-alpha", + "nodeId": "2b36e79a3d5b16a823e530c2428acf9f69a0aa06786ec6f7217533ae10cec21a", + "typeId": "d5ed88f6007b97cda5106fc3548d6252f164bd86b18f6b41d22e7c6a72f21ccd", + "attachmentBytesHex": "7b22726577726974655f6964223a5b35392c3231322c39382c3130372c3139392c32372c3235352c34312c34392c3138352c37332c31372c3234332c3135322c3132362c3234392c3233362c39322c3138392c33332c38372c3136362c3134352c3138312c3230342c3131392c3233372c3234322c3130352c3139392c3133332c3137325d2c2262617369735f686561645f6964223a5b36372c32342c32332c3231392c3132302c37342c35312c36362c31332c32342c38392c38362c3130372c3133332c3137382c36332c37322c37372c3233372c38352c3131342c39302c35362c3231332c35302c3132312c31322c3233312c3134372c3133302c3234342c38325d2c226e6578745f686561645f6964223a5b3131312c35332c3138302c3231352c38382c3130302c3230382c38312c39342c3132352c3232392c35372c3132362c3232362c342c3230322c36302c38392c3132302c3134382c36302c3132382c3230362c3134332c3137322c3231352c3134352c39342c3137332c3231392c382c3139315d2c2273746172745f62797465223a322c22656e645f62797465223a322c22696e7365727465645f627974655f6c656e677468223a322c2264656c657465645f627974655f6c656e677468223a307d" + }, + { + "kind": "set-node-alpha", + "nodeId": "3bd4626bc71bff2931b94911f3987ef9ec5cbd2157a691b5cc77edf269c785ac", + "typeId": "c30835603fa3940cf7845d961d0e41d338c40fea99698639dfc155117465943a", + "attachmentBytesHex": "7b226275666665725f6964223a5b3139392c38322c33362c3138332c3235322c3231362c37342c35352c3138382c3231352c3135332c36302c36312c34302c3139392c3137372c3231332c3134372c3132322c3230372c3235352c3131372c3234302c31332c3137302c32342c32392c3139372c3232352c32392c3234332c3233325d2c2262617369735f686561645f6964223a5b36372c32342c32332c3231392c3132302c37342c35312c36362c31332c32342c38392c38362c3130372c3133332c3137382c36332c37322c37372c3233372c38352c3131342c39302c35362c3231332c35302c3132312c31322c3233312c3134372c3133302c3234342c38325d2c226e6578745f686561645f6964223a5b3131312c35332c3138302c3231352c38382c3130302c3230382c38312c39342c3132352c3232392c35372c3132362c3232362c342c3230322c36302c38392c3132302c3134382c36302c3132382c3230362c3134332c3137322c3231352c3134352c39342c3137332c3231392c382c3139315d2c2273746172745f62797465223a322c22656e645f62797465223a322c22696e7365727465645f627974655f6c656e677468223a327d" + }, + { + "kind": "set-node-alpha", + "nodeId": "590054fca5e0ec5f79d5a474f3204579a77d4fbe0c64a00903cc372491e91978", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3137332c31372c302c3137332c3139382c32382c3134362c3132342c3136362c35362c37322c3233352c32332c3130302c3133352c3135362c3232312c322c3137312c3139332c3232352c3134362c3233392c3233302c3134322c3230342c3130392c3230372c3130342c3131322c35342c3130345d2c227269676874223a5b3130382c33382c3134392c33392c3136302c31342c3136302c31392c3138382c36302c3230302c36372c322c3234302c3133362c39372c34342c3138352c3137372c3230312c3131372c3137312c3132372c3136342c3138322c3233312c35362c31372c35372c372c3132382c3231385d2c22627974655f6c656e677468223a342c2275746631365f6c656e677468223a342c226c696e655f627265616b73223a302c22686569676874223a327d" + }, + { + "kind": "set-node-alpha", + "nodeId": "6c269527a00ea013bc3cc84302f088612cb9b1c975ab7fa4b6e73811390780da", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3231372c332c352c3134322c31392c3231342c3234352c3137352c32332c3135322c37392c37342c3134302c33322c3130332c36352c3230312c39342c36302c3131372c32302c3234302c3231352c3133332c38352c3137312c39362c37332c39372c3230372c3230392c33375d2c22627974655f7374617274223a302c22627974655f6c656e677468223a322c2275746631365f6c656e677468223a322c226c696e655f627265616b73223a307d" + }, + { + "kind": "set-node-alpha", + "nodeId": "6f35b4d75864d0515e7de5397ee204ca3c5978943c80ce8facd7915eaddb08bf", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3139392c38322c33362c3138332c3235322c3231362c37342c35352c3138382c3231352c3135332c36302c36312c34302c3139392c3137372c3231332c3134372c3132322c3230372c3235352c3131372c3234302c31332c3137302c32342c32392c3139372c3232352c32392c3234332c3233325d2c2262617369735f686561645f6964223a5b36372c32342c32332c3231392c3132302c37342c35312c36362c31332c32342c38392c38362c3130372c3133332c3137382c36332c37322c37372c3233372c38352c3131342c39302c35362c3231332c35302c3132312c31322c3233312c3134372c3133302c3234342c38325d2c22726f6f745f6e6f64655f6964223a5b3131312c3130322c3130352c3133312c3135302c3131332c3231362c35372c32302c33382c3137342c36372c37372c32352c3137342c3135322c32362c3232392c3137352c3133312c3139352c34302c3133382c38332c3135352c3131322c31322c3234382c3134322c31372c39332c33345d2c22627974655f6c656e677468223a362c2275746631365f6c656e677468223a362c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3131312c3130322c3130352c3133312c3135302c3131332c3231362c35372c32302c33382c3137342c36372c37372c32352c3137342c3135322c32362c3232392c3137352c3133312c3139352c34302c3133382c38332c3135352c3131322c31322c3234382c3134322c31372c39332c33345d2c2273657175656e6365223a317d" + }, + { + "kind": "set-node-alpha", + "nodeId": "6f6669839671d8391426ae434d19ae981ae5af83c3288a539b700cf88e115d22", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b38392c302c38342c3235322c3136352c3232342c3233362c39352c3132312c3231332c3136342c3131362c3234332c33322c36392c3132312c3136372c3132352c37392c3139302c31322c3130302c3136302c392c332c3230342c35352c33362c3134352c3233332c32352c3132305d2c227269676874223a5b3231342c3136322c37372c392c3230362c3138372c32392c38392c32302c3136362c3231302c33392c39342c33352c3136372c33372c39352c39362c3231322c32362c302c3135342c38302c3233342c3132362c3132312c39392c39302c33372c3232302c3133382c3137375d2c22627974655f6c656e677468223a362c2275746631365f6c656e677468223a362c226c696e655f627265616b73223a302c22686569676874223a337d" + }, + { + "kind": "set-node-alpha", + "nodeId": "ad1100adc61c927ca63848eb1764879cdd02abc1e192efe68ecc6dcf68703668", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b35342c3231322c3137392c37372c33382c3139392c3137382c322c3234342c3231372c38342c37382c39322c3130332c3137332c37392c3130392c3136382c3136352c35342c312c3130342c36382c3137392c31352c37372c3132392c3230372c35322c34312c35332c3234385d2c22627974655f7374617274223a302c22627974655f6c656e677468223a322c2275746631365f6c656e677468223a322c226c696e655f627265616b73223a307d" + }, + { + "kind": "set-node-alpha", + "nodeId": "c75224b7fcd84a37bcd7993c3d28c7b1d5937acfff75f00daa181dc5e11df3e8", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226d6964646c652d61736369692d696e73657274222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3131312c35332c3138302c3231352c38382c3130302c3230382c38312c39342c3132352c3232392c35372c3132362c3232362c342c3230322c36302c38392c3132302c3134382c36302c3132382c3230362c3134332c3137322c3231352c3134352c39342c3137332c3231392c382c3139315d2c2276657273696f6e223a317d" + }, + { + "kind": "set-node-alpha", + "nodeId": "d6a24d09cebb1d5914a6d2275e23a7255f60d41a009a50ea7e79635a25dc8ab1", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b35342c3231322c3137392c37372c33382c3139392c3137382c322c3234342c3231372c38342c37382c39322c3130332c3137332c37392c3130392c3136382c3136352c35342c312c3130342c36382c3137392c31352c37372c3132392c3230372c35322c34312c35332c3234385d2c22627974655f7374617274223a322c22627974655f6c656e677468223a322c2275746631365f6c656e677468223a322c226c696e655f627265616b73223a307d" + }, + { + "kind": "set-node-alpha", + "nodeId": "d903058e13d6f5af17984f4a8c206741c95e3c7514f0d78555ab604961cfd125", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b35322c39372c38302c3134332c38372c33342c3230322c3234332c3233352c3137312c3134362c3138332c37332c3138372c39342c3133312c38312c3136302c3234362c32382c3139322c3131302c36312c38362c3234322c36322c32382c3233322c3130382c3233302c36382c3232395d2c226279746573223a5b38382c38395d7d" + } + ], + "createdNodeIds": [ + "2b36e79a3d5b16a823e530c2428acf9f69a0aa06786ec6f7217533ae10cec21a", + "3bd4626bc71bff2931b94911f3987ef9ec5cbd2157a691b5cc77edf269c785ac", + "590054fca5e0ec5f79d5a474f3204579a77d4fbe0c64a00903cc372491e91978", + "6c269527a00ea013bc3cc84302f088612cb9b1c975ab7fa4b6e73811390780da", + "6f35b4d75864d0515e7de5397ee204ca3c5978943c80ce8facd7915eaddb08bf", + "6f6669839671d8391426ae434d19ae981ae5af83c3288a539b700cf88e115d22", + "ad1100adc61c927ca63848eb1764879cdd02abc1e192efe68ecc6dcf68703668", + "d6a24d09cebb1d5914a6d2275e23a7255f60d41a009a50ea7e79635a25dc8ab1", + "d903058e13d6f5af17984f4a8c206741c95e3c7514f0d78555ab604961cfd125" + ], + "updatedNodeIds": [ + "c75224b7fcd84a37bcd7993c3d28c7b1d5937acfff75f00daa181dc5e11df3e8" + ], + "untouchedBasisNodeIds": [ + "03f150de0814d97ad25a26ff414ef48d2ec0871ac939acef1cdad52df6380e7c", + "36d4b34d26c7b202f4d9544e5c67ad4f6da8a536016844b30f4d81cf342935f8", + "431817db784a33420d1859566b85b23f484ded55725a38d532790ce79382f452" + ], + "result": { + "bufferId": "c75224b7fcd84a37bcd7993c3d28c7b1d5937acfff75f00daa181dc5e11df3e8", + "headId": "6f35b4d75864d0515e7de5397ee204ca3c5978943c80ce8facd7915eaddb08bf", + "rootNodeId": "6f6669839671d8391426ae434d19ae981ae5af83c3288a539b700cf88e115d22", + "rootDigest": "6f6669839671d8391426ae434d19ae981ae5af83c3288a539b700cf88e115d22", + "rewriteId": "3bd4626bc71bff2931b94911f3987ef9ec5cbd2157a691b5cc77edf269c785ac", + "diffId": "2b36e79a3d5b16a823e530c2428acf9f69a0aa06786ec6f7217533ae10cec21a", + "byteLength": 6, + "utf16Length": 6, + "lineCount": 1, + "sequence": 1, + "version": 1, + "materializedTextUtf8Hex": "616258596364" + } + } + }, + { + "id": "whole-buffer-delete", + "purpose": "finite persistent-rope ReplaceRange conformance witness", + "basisFacts": [ + { + "nodeId": "2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3233372c3139322c34362c3139322c3231332c3232312c36302c37302c3130372c3130332c3137342c3136322c3234312c32312c3131322c32362c332c3231332c3131312c39362c3134302c32392c3231302c33382c35342c3235352c3132382c3135362c3230352c32312c3131362c3135345d2c226279746573223a5b39372c39382c39395d7d" + }, + { + "nodeId": "8c03a279f084d313f6e68caed20908c8e881050ee91d1fa4e1274721f0b44aa6", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a2277686f6c652d6275666665722d64656c657465222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3134362c3132372c3135392c34332c3233362c33322c39332c342c32302c3136342c3230382c31362c3131382c38322c3234372c352c3232392c34322c3135332c3233362c3131382c3232342c38322c3132392c3233372c34332c3230392c34342c36342c33342c3136342c3132365d2c2276657273696f6e223a307d" + }, + { + "nodeId": "927f9f2bec205d0414a4d0107652f705e52a99ec76e05281ed2bd12c4022a47e", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3134302c332c3136322c3132312c3234302c3133322c3231312c31392c3234362c3233302c3134302c3137342c3231302c392c382c3230302c3233322c3132392c352c31342c3233332c32392c33312c3136342c3232352c33392c37312c33332c3234302c3138302c37342c3136365d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c2273657175656e6365223a307d" + }, + { + "nodeId": "b18fc548c67874d9ffa852ee4955f3236115798b79c4f561c49dfde168e8d7dc", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b34332c3135372c382c39312c37302c3234372c37342c35362c3135322c35392c322c3233332c37342c33332c3230372c3139382c3134302c39392c3136392c3135372c34352c3139312c3234322c38382c3132372c3234342c33352c3233332c3139342c38342c3232332c34325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "8c03a279f084d313f6e68caed20908c8e881050ee91d1fa4e1274721f0b44aa6", + "basisHeadId": "927f9f2bec205d0414a4d0107652f705e52a99ec76e05281ed2bd12c4022a47e", + "startByte": 0, + "endByte": 3, + "replacementUtf8Hex": "" + }, + "invocationBytesHex": "7b226275666665724964223a2238633033613237396630383464333133663665363863616564323039303863386538383130353065653931643166613465313237343732316630623434616136222c226261736973486561644964223a2239323766396632626563323035643034313461346430313037363532663730356535326139396563373665303532383165643262643132633430323261343765222c22737461727442797465223a302c22656e6442797465223a332c227265706c6163656d656e7455746638486578223a22227d", + "terminal": { + "posture": "committable", + "footprint": { + "nodeReads": [ + "2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a", + "8c03a279f084d313f6e68caed20908c8e881050ee91d1fa4e1274721f0b44aa6", + "927f9f2bec205d0414a4d0107652f705e52a99ec76e05281ed2bd12c4022a47e", + "b18fc548c67874d9ffa852ee4955f3236115798b79c4f561c49dfde168e8d7dc" + ], + "nodeWrites": [ + "1a6d115b1c8352ae4d46fcff7f40fac0f5c7a64471225a8b4cc60242bbcff533", + "8c03a279f084d313f6e68caed20908c8e881050ee91d1fa4e1274721f0b44aa6", + "a78efae08f57282b98760c965c4df321fd9daeafc1840e4529252aec85fcc884", + "c9c27a15901bff12f089a124d55adf246897ef1e6023f3c5a1895edac848d77b" + ], + "attachmentReads": [ + "2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a", + "8c03a279f084d313f6e68caed20908c8e881050ee91d1fa4e1274721f0b44aa6", + "927f9f2bec205d0414a4d0107652f705e52a99ec76e05281ed2bd12c4022a47e", + "b18fc548c67874d9ffa852ee4955f3236115798b79c4f561c49dfde168e8d7dc" + ], + "attachmentWrites": [ + "1a6d115b1c8352ae4d46fcff7f40fac0f5c7a64471225a8b4cc60242bbcff533", + "8c03a279f084d313f6e68caed20908c8e881050ee91d1fa4e1274721f0b44aa6", + "a78efae08f57282b98760c965c4df321fd9daeafc1840e4529252aec85fcc884", + "c9c27a15901bff12f089a124d55adf246897ef1e6023f3c5a1895edac848d77b" + ], + "edgeReads": [], + "edgeWrites": [] + }, + "patch": [ + { + "kind": "upsert-node", + "nodeId": "1a6d115b1c8352ae4d46fcff7f40fac0f5c7a64471225a8b4cc60242bbcff533", + "typeId": "c30835603fa3940cf7845d961d0e41d338c40fea99698639dfc155117465943a" + }, + { + "kind": "upsert-node", + "nodeId": "8c03a279f084d313f6e68caed20908c8e881050ee91d1fa4e1274721f0b44aa6", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e" + }, + { + "kind": "upsert-node", + "nodeId": "a78efae08f57282b98760c965c4df321fd9daeafc1840e4529252aec85fcc884", + "typeId": "d5ed88f6007b97cda5106fc3548d6252f164bd86b18f6b41d22e7c6a72f21ccd" + }, + { + "kind": "upsert-node", + "nodeId": "c9c27a15901bff12f089a124d55adf246897ef1e6023f3c5a1895edac848d77b", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e" + }, + { + "kind": "set-node-alpha", + "nodeId": "1a6d115b1c8352ae4d46fcff7f40fac0f5c7a64471225a8b4cc60242bbcff533", + "typeId": "c30835603fa3940cf7845d961d0e41d338c40fea99698639dfc155117465943a", + "attachmentBytesHex": "7b226275666665725f6964223a5b3134302c332c3136322c3132312c3234302c3133322c3231312c31392c3234362c3233302c3134302c3137342c3231302c392c382c3230302c3233322c3132392c352c31342c3233332c32392c33312c3136342c3232352c33392c37312c33332c3234302c3138302c37342c3136365d2c2262617369735f686561645f6964223a5b3134362c3132372c3135392c34332c3233362c33322c39332c342c32302c3136342c3230382c31362c3131382c38322c3234372c352c3232392c34322c3135332c3233362c3131382c3232342c38322c3132392c3233372c34332c3230392c34342c36342c33342c3136342c3132365d2c226e6578745f686561645f6964223a5b3230312c3139342c3132322c32312c3134342c32372c3235352c31382c3234302c3133372c3136312c33362c3231332c39302c3232332c33362c3130342c3135312c3233392c33302c39362c33352c3234332c3139372c3136312c3133372c39342c3231382c3230302c37322c3231352c3132335d2c2273746172745f62797465223a302c22656e645f62797465223a332c22696e7365727465645f627974655f6c656e677468223a307d" + }, + { + "kind": "set-node-alpha", + "nodeId": "8c03a279f084d313f6e68caed20908c8e881050ee91d1fa4e1274721f0b44aa6", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a2277686f6c652d6275666665722d64656c657465222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3230312c3139342c3132322c32312c3134342c32372c3235352c31382c3234302c3133372c3136312c33362c3231332c39302c3232332c33362c3130342c3135312c3233392c33302c39362c33352c3234332c3139372c3136312c3133372c39342c3231382c3230302c37322c3231352c3132335d2c2276657273696f6e223a317d" + }, + { + "kind": "set-node-alpha", + "nodeId": "a78efae08f57282b98760c965c4df321fd9daeafc1840e4529252aec85fcc884", + "typeId": "d5ed88f6007b97cda5106fc3548d6252f164bd86b18f6b41d22e7c6a72f21ccd", + "attachmentBytesHex": "7b22726577726974655f6964223a5b32362c3130392c31372c39312c32382c3133312c38322c3137342c37372c37302c3235322c3235352c3132372c36342c3235302c3139322c3234352c3139392c3136362c36382c3131332c33342c39302c3133392c37362c3139382c322c36362c3138372c3230372c3234352c35315d2c2262617369735f686561645f6964223a5b3134362c3132372c3135392c34332c3233362c33322c39332c342c32302c3136342c3230382c31362c3131382c38322c3234372c352c3232392c34322c3135332c3233362c3131382c3232342c38322c3132392c3233372c34332c3230392c34342c36342c33342c3136342c3132365d2c226e6578745f686561645f6964223a5b3230312c3139342c3132322c32312c3134342c32372c3235352c31382c3234302c3133372c3136312c33362c3231332c39302c3232332c33362c3130342c3135312c3233392c33302c39362c33352c3234332c3139372c3136312c3133372c39342c3231382c3230302c37322c3231352c3132335d2c2273746172745f62797465223a302c22656e645f62797465223a332c22696e7365727465645f627974655f6c656e677468223a302c2264656c657465645f627974655f6c656e677468223a337d" + }, + { + "kind": "set-node-alpha", + "nodeId": "c9c27a15901bff12f089a124d55adf246897ef1e6023f3c5a1895edac848d77b", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3134302c332c3136322c3132312c3234302c3133322c3231312c31392c3234362c3233302c3134302c3137342c3231302c392c382c3230302c3233322c3132392c352c31342c3233332c32392c33312c3136342c3232352c33392c37312c33332c3234302c3138302c37342c3136365d2c2262617369735f686561645f6964223a5b3134362c3132372c3135392c34332c3233362c33322c39332c342c32302c3136342c3230382c31362c3131382c38322c3234372c352c3232392c34322c3135332c3233362c3131382c3232342c38322c3132392c3233372c34332c3230392c34342c36342c33342c3136342c3132365d2c22726f6f745f6e6f64655f6964223a6e756c6c2c22627974655f6c656e677468223a302c2275746631365f6c656e677468223a302c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3138332c3135362c38392c3139352c36382c34332c34352c39302c34302c3136302c3235312c3139392c3235352c31382c3131372c3231362c3130382c36362c34332c3232382c3134372c3131322c3131342c3231372c3139312c302c38372c34332c34392c31332c3233322c38385d2c2273657175656e6365223a317d" + } + ], + "createdNodeIds": [ + "1a6d115b1c8352ae4d46fcff7f40fac0f5c7a64471225a8b4cc60242bbcff533", + "a78efae08f57282b98760c965c4df321fd9daeafc1840e4529252aec85fcc884", + "c9c27a15901bff12f089a124d55adf246897ef1e6023f3c5a1895edac848d77b" + ], + "updatedNodeIds": [ + "8c03a279f084d313f6e68caed20908c8e881050ee91d1fa4e1274721f0b44aa6" + ], + "untouchedBasisNodeIds": [ + "2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a", + "927f9f2bec205d0414a4d0107652f705e52a99ec76e05281ed2bd12c4022a47e", + "b18fc548c67874d9ffa852ee4955f3236115798b79c4f561c49dfde168e8d7dc" + ], + "result": { + "bufferId": "8c03a279f084d313f6e68caed20908c8e881050ee91d1fa4e1274721f0b44aa6", + "headId": "c9c27a15901bff12f089a124d55adf246897ef1e6023f3c5a1895edac848d77b", + "rootNodeId": null, + "rootDigest": "b79c59c3442b2d5a28a0fbc7ff1275d86c422be4937072d9bf00572b310de858", + "rewriteId": "1a6d115b1c8352ae4d46fcff7f40fac0f5c7a64471225a8b4cc60242bbcff533", + "diffId": "a78efae08f57282b98760c965c4df321fd9daeafc1840e4529252aec85fcc884", + "byteLength": 0, + "utf16Length": 0, + "lineCount": 1, + "sequence": 1, + "version": 1, + "materializedTextUtf8Hex": "" + } + } + }, + { + "id": "unicode-replacement", + "purpose": "finite persistent-rope ReplaceRange conformance witness", + "basisFacts": [ + { + "nodeId": "4ca1d0af6f518e869ba7ef0f98524ab013ae63d3b4ace8ba7b396bb3d2cc75e7", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3132382c34302c3138352c3232342c3133352c332c37342c3235332c39322c3134372c3134382c3138372c3231322c3130302c36382c3233372c3131302c3137312c38342c3233342c33352c31342c33362c3139332c3134312c3235342c38362c3233382c3130342c3232302c34352c315d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3134302c33322c3130392c3139332c3232302c3138302c34322c3133322c3230362c3132312c39362c3133352c32392c3231312c38322c3130312c3139352c3135312c38322c35352c3231322c3235332c32382c38382c32372c32322c3231362c3139322c34362c3131392c39302c395d2c22627974655f6c656e677468223a392c2275746631365f6c656e677468223a362c226c696e655f636f756e74223a322c22726f6f745f646967657374223a5b3134302c33322c3130392c3139332c3232302c3138302c34322c3133322c3230362c3132312c39362c3133352c32392c3231312c38322c3130312c3139352c3135312c38322c35352c3231322c3235332c32382c38382c32372c32322c3231362c3139322c34362c3131392c39302c395d2c2273657175656e6365223a307d" + }, + { + "nodeId": "8028b9e087034afd5c9394bbd46444ed6eab54ea230e24c18dfe56ee68dc2d01", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a22756e69636f64652d7265706c6163656d656e74222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b37362c3136312c3230382c3137352c3131312c38312c3134322c3133342c3135352c3136372c3233392c31352c3135322c38322c37342c3137362c31392c3137342c39392c3231312c3138302c3137322c3233322c3138362c3132332c35372c3130372c3137392c3231302c3230342c3131372c3233315d2c2276657273696f6e223a307d" + }, + { + "nodeId": "8c206dc1dcb42a84ce7960871dd35265c3975237d4fd1c581b16d8c02e775a09", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3139302c3133372c37332c32312c38312c3132302c3232352c39302c3232322c38392c3233322c3137302c36352c3230302c33382c3231352c39332c3138382c38312c36322c3138362c3233332c34312c3234382c3233312c3130312c3134312c34302c3235312c3138372c3131322c37325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a392c2275746631365f6c656e677468223a362c226c696e655f627265616b73223a317d" + }, + { + "nodeId": "be8949155178e15ade59e8aa41c826d75dbc513ebae929f8e7658d28fbbb7048", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3131312c3234382c39352c31332c3135312c3233332c35372c33372c3137302c32342c3230302c3133352c36372c36372c302c3138302c3234352c32342c35312c39302c3131322c3232332c3235332c33362c34322c3232392c37312c3232392c392c3133332c3136332c3139355d2c226279746573223a5b36352c3234302c3135392c3135322c3132382c3139352c3136392c31302c36365d7d" + } + ], + "invocation": { + "bufferId": "8028b9e087034afd5c9394bbd46444ed6eab54ea230e24c18dfe56ee68dc2d01", + "basisHeadId": "4ca1d0af6f518e869ba7ef0f98524ab013ae63d3b4ace8ba7b396bb3d2cc75e7", + "startByte": 1, + "endByte": 5, + "replacementUtf8Hex": "cebb0a" + }, + "invocationBytesHex": "7b226275666665724964223a2238303238623965303837303334616664356339333934626264343634343465643665616235346561323330653234633138646665353665653638646332643031222c226261736973486561644964223a2234636131643061663666353138653836396261376566306639383532346162303133616536336433623461636538626137623339366262336432636337356537222c22737461727442797465223a312c22656e6442797465223a352c227265706c6163656d656e7455746638486578223a22636562623061227d", + "terminal": { + "posture": "committable", + "footprint": { + "nodeReads": [ + "4ca1d0af6f518e869ba7ef0f98524ab013ae63d3b4ace8ba7b396bb3d2cc75e7", + "8028b9e087034afd5c9394bbd46444ed6eab54ea230e24c18dfe56ee68dc2d01", + "8c206dc1dcb42a84ce7960871dd35265c3975237d4fd1c581b16d8c02e775a09", + "be8949155178e15ade59e8aa41c826d75dbc513ebae929f8e7658d28fbbb7048" + ], + "nodeWrites": [ + "0953b40b6434bfdef2fd10afb2318626b74cf712e4dc253a53b1b066a7c92f0c", + "531f189bca556328a4141c2a56688bcebef4f7326add66515c0b1e64a6118599", + "624dfeaf0d86691cf4af9bfadcbe23b239c973bde92a2d3be07d9e9e8bc560a6", + "7e0ea8e49c450d74a6aee640493b5edb7da971548c51eafc34f081705b6519a7", + "8028b9e087034afd5c9394bbd46444ed6eab54ea230e24c18dfe56ee68dc2d01", + "88b5ce6420bf26f155f4c5870c73c86e510c011bbbdd0d7f7c4a9c5816e4e0e2", + "892de50db20728e8f8c2c75f55c995e9efecde6bec8f6edc24cdfcd559aa5a78", + "9bb29f54373162317da113a54fbc152ad498642c91f7b59b81b5130aef2b2637", + "b28f6ce96a6f2c5cfbaac58686685dc8565106eb568fa59666f92a00c8fd130f", + "b591b47c47bef32126cab7dc07f494e9cbcdee9e01addb444aec1ce800729958", + "baeb0fd1dbbbb5c9ef6142ba9586fbf99e77ad412f27cc0d39cdb15229c8dbbe", + "e7473ebef62c3d8a699077741bc73204fb3c8bb3cb9789fbb20ec29c145d4086" + ], + "attachmentReads": [ + "4ca1d0af6f518e869ba7ef0f98524ab013ae63d3b4ace8ba7b396bb3d2cc75e7", + "8028b9e087034afd5c9394bbd46444ed6eab54ea230e24c18dfe56ee68dc2d01", + "8c206dc1dcb42a84ce7960871dd35265c3975237d4fd1c581b16d8c02e775a09", + "be8949155178e15ade59e8aa41c826d75dbc513ebae929f8e7658d28fbbb7048" + ], + "attachmentWrites": [ + "0953b40b6434bfdef2fd10afb2318626b74cf712e4dc253a53b1b066a7c92f0c", + "531f189bca556328a4141c2a56688bcebef4f7326add66515c0b1e64a6118599", + "624dfeaf0d86691cf4af9bfadcbe23b239c973bde92a2d3be07d9e9e8bc560a6", + "7e0ea8e49c450d74a6aee640493b5edb7da971548c51eafc34f081705b6519a7", + "8028b9e087034afd5c9394bbd46444ed6eab54ea230e24c18dfe56ee68dc2d01", + "88b5ce6420bf26f155f4c5870c73c86e510c011bbbdd0d7f7c4a9c5816e4e0e2", + "892de50db20728e8f8c2c75f55c995e9efecde6bec8f6edc24cdfcd559aa5a78", + "9bb29f54373162317da113a54fbc152ad498642c91f7b59b81b5130aef2b2637", + "b28f6ce96a6f2c5cfbaac58686685dc8565106eb568fa59666f92a00c8fd130f", + "b591b47c47bef32126cab7dc07f494e9cbcdee9e01addb444aec1ce800729958", + "baeb0fd1dbbbb5c9ef6142ba9586fbf99e77ad412f27cc0d39cdb15229c8dbbe", + "e7473ebef62c3d8a699077741bc73204fb3c8bb3cb9789fbb20ec29c145d4086" + ], + "edgeReads": [], + "edgeWrites": [] + }, + "patch": [ + { + "kind": "upsert-node", + "nodeId": "0953b40b6434bfdef2fd10afb2318626b74cf712e4dc253a53b1b066a7c92f0c", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1" + }, + { + "kind": "upsert-node", + "nodeId": "531f189bca556328a4141c2a56688bcebef4f7326add66515c0b1e64a6118599", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4" + }, + { + "kind": "upsert-node", + "nodeId": "624dfeaf0d86691cf4af9bfadcbe23b239c973bde92a2d3be07d9e9e8bc560a6", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4" + }, + { + "kind": "upsert-node", + "nodeId": "7e0ea8e49c450d74a6aee640493b5edb7da971548c51eafc34f081705b6519a7", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e" + }, + { + "kind": "upsert-node", + "nodeId": "8028b9e087034afd5c9394bbd46444ed6eab54ea230e24c18dfe56ee68dc2d01", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e" + }, + { + "kind": "upsert-node", + "nodeId": "88b5ce6420bf26f155f4c5870c73c86e510c011bbbdd0d7f7c4a9c5816e4e0e2", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4" + }, + { + "kind": "upsert-node", + "nodeId": "892de50db20728e8f8c2c75f55c995e9efecde6bec8f6edc24cdfcd559aa5a78", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4" + }, + { + "kind": "upsert-node", + "nodeId": "9bb29f54373162317da113a54fbc152ad498642c91f7b59b81b5130aef2b2637", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9" + }, + { + "kind": "upsert-node", + "nodeId": "b28f6ce96a6f2c5cfbaac58686685dc8565106eb568fa59666f92a00c8fd130f", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1" + }, + { + "kind": "upsert-node", + "nodeId": "b591b47c47bef32126cab7dc07f494e9cbcdee9e01addb444aec1ce800729958", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4" + }, + { + "kind": "upsert-node", + "nodeId": "baeb0fd1dbbbb5c9ef6142ba9586fbf99e77ad412f27cc0d39cdb15229c8dbbe", + "typeId": "c30835603fa3940cf7845d961d0e41d338c40fea99698639dfc155117465943a" + }, + { + "kind": "upsert-node", + "nodeId": "e7473ebef62c3d8a699077741bc73204fb3c8bb3cb9789fbb20ec29c145d4086", + "typeId": "d5ed88f6007b97cda5106fc3548d6252f164bd86b18f6b41d22e7c6a72f21ccd" + }, + { + "kind": "set-node-alpha", + "nodeId": "0953b40b6434bfdef2fd10afb2318626b74cf712e4dc253a53b1b066a7c92f0c", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b38332c33312c32342c3135352c3230322c38352c39392c34302c3136342c32302c32382c34322c38362c3130342c3133392c3230362c3139302c3234342c3234372c35302c3130362c3232312c3130322c38312c39322c31312c33302c3130302c3136362c31372c3133332c3135335d2c227269676874223a5b3138312c3134352c3138302c3132342c37312c3139302c3234332c33332c33382c3230322c3138332c3232302c372c3234342c3134382c3233332c3230332c3230352c3233382c3135382c312c3137332c3231392c36382c37342c3233362c32382c3233322c302c3131342c3135332c38385d2c22627974655f6c656e677468223a342c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a312c22686569676874223a327d" + }, + { + "kind": "set-node-alpha", + "nodeId": "531f189bca556328a4141c2a56688bcebef4f7326add66515c0b1e64a6118599", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3139302c3133372c37332c32312c38312c3132302c3232352c39302c3232322c38392c3233322c3137302c36352c3230302c33382c3231352c39332c3138382c38312c36322c3138362c3233332c34312c3234382c3233312c3130312c3134312c34302c3235312c3138372c3131322c37325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a307d" + }, + { + "kind": "set-node-alpha", + "nodeId": "624dfeaf0d86691cf4af9bfadcbe23b239c973bde92a2d3be07d9e9e8bc560a6", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3139302c3133372c37332c32312c38312c3132302c3232352c39302c3232322c38392c3233322c3137302c36352c3230302c33382c3231352c39332c3138382c38312c36322c3138362c3233332c34312c3234382c3233312c3130312c3134312c34302c3235312c3138372c3131322c37325d2c22627974655f7374617274223a312c22627974655f6c656e677468223a342c2275746631365f6c656e677468223a322c226c696e655f627265616b73223a307d" + }, + { + "kind": "set-node-alpha", + "nodeId": "7e0ea8e49c450d74a6aee640493b5edb7da971548c51eafc34f081705b6519a7", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3132382c34302c3138352c3232342c3133352c332c37342c3235332c39322c3134372c3134382c3138372c3231322c3130302c36382c3233372c3131302c3137312c38342c3233342c33352c31342c33362c3139332c3134312c3235342c38362c3233382c3130342c3232302c34352c315d2c2262617369735f686561645f6964223a5b37362c3136312c3230382c3137352c3131312c38312c3134322c3133342c3135352c3136372c3233392c31352c3135322c38322c37342c3137362c31392c3137342c39392c3231312c3138302c3137322c3233322c3138362c3132332c35372c3130372c3137392c3231302c3230342c3131372c3233315d2c22726f6f745f6e6f64655f6964223a5b3137382c3134332c3130382c3233332c3130362c3131312c34342c39322c3235312c3137302c3139372c3133342c3133342c3130342c39332c3230302c38362c38312c362c3233352c38362c3134332c3136352c3135302c3130322c3234392c34322c302c3230302c3235332c31392c31355d2c22627974655f6c656e677468223a382c2275746631365f6c656e677468223a362c226c696e655f636f756e74223a332c22726f6f745f646967657374223a5b3137382c3134332c3130382c3233332c3130362c3131312c34342c39322c3235312c3137302c3139372c3133342c3133342c3130342c39332c3230302c38362c38312c362c3233352c38362c3134332c3136352c3135302c3130322c3234392c34322c302c3230302c3235332c31392c31355d2c2273657175656e6365223a317d" + }, + { + "kind": "set-node-alpha", + "nodeId": "8028b9e087034afd5c9394bbd46444ed6eab54ea230e24c18dfe56ee68dc2d01", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a22756e69636f64652d7265706c6163656d656e74222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3132362c31342c3136382c3232382c3135362c36392c31332c3131362c3136362c3137342c3233302c36342c37332c35392c39342c3231392c3132352c3136392c3131332c38342c3134302c38312c3233342c3235322c35322c3234302c3132392c3131322c39312c3130312c32352c3136375d2c2276657273696f6e223a317d" + }, + { + "kind": "set-node-alpha", + "nodeId": "88b5ce6420bf26f155f4c5870c73c86e510c011bbbdd0d7f7c4a9c5816e4e0e2", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3139302c3133372c37332c32312c38312c3132302c3232352c39302c3232322c38392c3233322c3137302c36352c3230302c33382c3231352c39332c3138382c38312c36322c3138362c3233332c34312c3234382c3233312c3130312c3134312c34302c3235312c3138372c3131322c37325d2c22627974655f7374617274223a312c22627974655f6c656e677468223a382c2275746631365f6c656e677468223a352c226c696e655f627265616b73223a317d" + }, + { + "kind": "set-node-alpha", + "nodeId": "892de50db20728e8f8c2c75f55c995e9efecde6bec8f6edc24cdfcd559aa5a78", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3139302c3133372c37332c32312c38312c3132302c3232352c39302c3232322c38392c3233322c3137302c36352c3230302c33382c3231352c39332c3138382c38312c36322c3138362c3233332c34312c3234382c3233312c3130312c3134312c34302c3235312c3138372c3131322c37325d2c22627974655f7374617274223a352c22627974655f6c656e677468223a342c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a317d" + }, + { + "kind": "set-node-alpha", + "nodeId": "9bb29f54373162317da113a54fbc152ad498642c91f7b59b81b5130aef2b2637", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b37302c3131312c38352c3132322c3134382c3136312c3235302c3132392c34362c3134372c33382c3134362c3139332c3230322c3233382c3131382c3231382c3136352c34332c3233382c3134302c32302c38342c3137372c3137362c3137362c3132342c39372c3232332c31372c3139362c33315d2c226279746573223a5b3230362c3138372c31305d7d" + }, + { + "kind": "set-node-alpha", + "nodeId": "b28f6ce96a6f2c5cfbaac58686685dc8565106eb568fa59666f92a00c8fd130f", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b392c38332c3138302c31312c3130302c35322c3139312c3232322c3234322c3235332c31362c3137352c3137382c34392c3133342c33382c3138332c37362c3234372c31382c3232382c3232302c33372c35382c38332c3137372c3137362c3130322c3136372c3230312c34372c31325d2c227269676874223a5b3133372c34352c3232392c31332c3137382c372c34302c3233322c3234382c3139342c3139392c39352c38352c3230312c3134392c3233332c3233392c3233362c3232322c3130372c3233362c3134332c3131302c3232302c33362c3230352c3235322c3231332c38392c3137302c39302c3132305d2c22627974655f6c656e677468223a382c2275746631365f6c656e677468223a362c226c696e655f627265616b73223a322c22686569676874223a337d" + }, + { + "kind": "set-node-alpha", + "nodeId": "b591b47c47bef32126cab7dc07f494e9cbcdee9e01addb444aec1ce800729958", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3135352c3137382c3135392c38342c35352c34392c39382c34392c3132352c3136312c31392c3136352c37392c3138382c32312c34322c3231322c3135322c3130302c34342c3134352c3234372c3138312c3135352c3132392c3138312c31392c31302c3233392c34332c33382c35355d2c22627974655f7374617274223a302c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a322c226c696e655f627265616b73223a317d" + }, + { + "kind": "set-node-alpha", + "nodeId": "baeb0fd1dbbbb5c9ef6142ba9586fbf99e77ad412f27cc0d39cdb15229c8dbbe", + "typeId": "c30835603fa3940cf7845d961d0e41d338c40fea99698639dfc155117465943a", + "attachmentBytesHex": "7b226275666665725f6964223a5b3132382c34302c3138352c3232342c3133352c332c37342c3235332c39322c3134372c3134382c3138372c3231322c3130302c36382c3233372c3131302c3137312c38342c3233342c33352c31342c33362c3139332c3134312c3235342c38362c3233382c3130342c3232302c34352c315d2c2262617369735f686561645f6964223a5b37362c3136312c3230382c3137352c3131312c38312c3134322c3133342c3135352c3136372c3233392c31352c3135322c38322c37342c3137362c31392c3137342c39392c3231312c3138302c3137322c3233322c3138362c3132332c35372c3130372c3137392c3231302c3230342c3131372c3233315d2c226e6578745f686561645f6964223a5b3132362c31342c3136382c3232382c3135362c36392c31332c3131362c3136362c3137342c3233302c36342c37332c35392c39342c3231392c3132352c3136392c3131332c38342c3134302c38312c3233342c3235322c35322c3234302c3132392c3131322c39312c3130312c32352c3136375d2c2273746172745f62797465223a312c22656e645f62797465223a352c22696e7365727465645f627974655f6c656e677468223a337d" + }, + { + "kind": "set-node-alpha", + "nodeId": "e7473ebef62c3d8a699077741bc73204fb3c8bb3cb9789fbb20ec29c145d4086", + "typeId": "d5ed88f6007b97cda5106fc3548d6252f164bd86b18f6b41d22e7c6a72f21ccd", + "attachmentBytesHex": "7b22726577726974655f6964223a5b3138362c3233352c31352c3230392c3231392c3138372c3138312c3230312c3233392c39372c36362c3138362c3134392c3133342c3235312c3234392c3135382c3131392c3137332c36352c34372c33392c3230342c31332c35372c3230352c3137372c38322c34312c3230302c3231392c3139305d2c2262617369735f686561645f6964223a5b37362c3136312c3230382c3137352c3131312c38312c3134322c3133342c3135352c3136372c3233392c31352c3135322c38322c37342c3137362c31392c3137342c39392c3231312c3138302c3137322c3233322c3138362c3132332c35372c3130372c3137392c3231302c3230342c3131372c3233315d2c226e6578745f686561645f6964223a5b3132362c31342c3136382c3232382c3135362c36392c31332c3131362c3136362c3137342c3233302c36342c37332c35392c39342c3231392c3132352c3136392c3131332c38342c3134302c38312c3233342c3235322c35322c3234302c3132392c3131322c39312c3130312c32352c3136375d2c2273746172745f62797465223a312c22656e645f62797465223a352c22696e7365727465645f627974655f6c656e677468223a332c2264656c657465645f627974655f6c656e677468223a347d" + } + ], + "createdNodeIds": [ + "0953b40b6434bfdef2fd10afb2318626b74cf712e4dc253a53b1b066a7c92f0c", + "531f189bca556328a4141c2a56688bcebef4f7326add66515c0b1e64a6118599", + "624dfeaf0d86691cf4af9bfadcbe23b239c973bde92a2d3be07d9e9e8bc560a6", + "7e0ea8e49c450d74a6aee640493b5edb7da971548c51eafc34f081705b6519a7", + "88b5ce6420bf26f155f4c5870c73c86e510c011bbbdd0d7f7c4a9c5816e4e0e2", + "892de50db20728e8f8c2c75f55c995e9efecde6bec8f6edc24cdfcd559aa5a78", + "9bb29f54373162317da113a54fbc152ad498642c91f7b59b81b5130aef2b2637", + "b28f6ce96a6f2c5cfbaac58686685dc8565106eb568fa59666f92a00c8fd130f", + "b591b47c47bef32126cab7dc07f494e9cbcdee9e01addb444aec1ce800729958", + "baeb0fd1dbbbb5c9ef6142ba9586fbf99e77ad412f27cc0d39cdb15229c8dbbe", + "e7473ebef62c3d8a699077741bc73204fb3c8bb3cb9789fbb20ec29c145d4086" + ], + "updatedNodeIds": [ + "8028b9e087034afd5c9394bbd46444ed6eab54ea230e24c18dfe56ee68dc2d01" + ], + "untouchedBasisNodeIds": [ + "4ca1d0af6f518e869ba7ef0f98524ab013ae63d3b4ace8ba7b396bb3d2cc75e7", + "8c206dc1dcb42a84ce7960871dd35265c3975237d4fd1c581b16d8c02e775a09", + "be8949155178e15ade59e8aa41c826d75dbc513ebae929f8e7658d28fbbb7048" + ], + "result": { + "bufferId": "8028b9e087034afd5c9394bbd46444ed6eab54ea230e24c18dfe56ee68dc2d01", + "headId": "7e0ea8e49c450d74a6aee640493b5edb7da971548c51eafc34f081705b6519a7", + "rootNodeId": "b28f6ce96a6f2c5cfbaac58686685dc8565106eb568fa59666f92a00c8fd130f", + "rootDigest": "b28f6ce96a6f2c5cfbaac58686685dc8565106eb568fa59666f92a00c8fd130f", + "rewriteId": "baeb0fd1dbbbb5c9ef6142ba9586fbf99e77ad412f27cc0d39cdb15229c8dbbe", + "diffId": "e7473ebef62c3d8a699077741bc73204fb3c8bb3cb9789fbb20ec29c145d4086", + "byteLength": 8, + "utf16Length": 6, + "lineCount": 3, + "sequence": 1, + "version": 1, + "materializedTextUtf8Hex": "41cebb0ac3a90a42" + } + } + }, + { + "id": "cross-leaf-rebalance", + "purpose": "finite persistent-rope ReplaceRange conformance witness", + "basisFacts": [ + { + "nodeId": "01562d87f0f9dacf7851d40539542ee2ef6754a77e871facccf9d00fdd9af0c5", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3134302c3135302c36342c36332c34382c3133342c3230312c34362c3136372c35382c35352c39392c31362c32312c3230332c3131352c36302c3135382c39362c3234302c36352c3133302c3136302c3130302c3133332c3132312c35372c3231322c31342c36332c33322c3139325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a343039362c2275746631365f6c656e677468223a343039362c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "02aedab2e321cd11b064b9b560e7a1b2b58b119ccefb64fcf01679a8ad14253c", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b31392c33382c3135392c36382c3137322c3139372c33322c3137362c3230342c3135352c3232352c3137352c3130362c3139362c3134322c3231322c3231312c3137302c37372c32332c3235352c3132362c3131302c3230392c3232342c32382c39312c38312c3133362c3139312c39382c3136385d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3233302c3130312c3135322c3133392c31322c39382c3138362c3235302c3133342c3134352c3232392c3132322c35372c3234392c3135352c3130302c3231372c3132392c34322c33362c39322c39312c3138362c3130302c3130302c3133362c34332c3132312c32352c3233362c34332c3138325d2c22627974655f6c656e677468223a31323238382c2275746631365f6c656e677468223a31323238382c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3233302c3130312c3135322c3133392c31322c39382c3138362c3235302c3133342c3134352c3232392c3132322c35372c3234392c3135352c3130302c3231372c3132392c34322c33362c39322c39312c3138362c3130302c3130302c3133362c34332c3132312c32352c3233362c34332c3138325d2c2273657175656e6365223a307d" + }, + { + "nodeId": "13269f44acc520b0cc9be1af6ac48ed4d3aa4d17ff7e6ed1e01c5b5188bf62a8", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a2263726f73732d6c6561662d726562616c616e6365222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b322c3137342c3231382c3137382c3232372c33332c3230352c31372c3137362c3130302c3138352c3138312c39362c3233312c3136312c3137382c3138312c3133392c31372c3135362c3230362c3235312c3130302c3235322c3234302c32322c3132312c3136382c3137332c32302c33372c36305d2c2276657273696f6e223a307d" + }, + { + "nodeId": "4d197711c188115df4eb1268a70574a93f16a2127a178a4e3cd1c99a76c5f043", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b37302c3131302c39362c3234382c39382c3135302c35362c37372c31302c34392c3233342c3232342c33372c3139322c34322c34362c36362c3130342c33332c3231362c32342c3135352c34362c302c3130322c3137382c3231392c3230392c3234362c31332c38372c34315d2c226279746573223a5b39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39375d7d" + }, + { + "nodeId": "4e1b4ee17eb1129bdcc8081c5b04c63702038252e8298234208854017fc68d54", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3136302c3135382c31312c32312c38332c3135332c3230392c3231332c3234302c3130362c3134372c39312c3138312c3134362c3131332c3137312c3130352c3133312c3231372c3233382c33312c3234392c3133372c35382c3135362c3230392c35382c3134332c3139332c3130312c3230382c3232365d2c22627974655f7374617274223a302c22627974655f6c656e677468223a343039362c2275746631365f6c656e677468223a343039362c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "89d138e87e58cce6c0c8362e4924c259f45dd8811bc03fda8625e96244cf6e83", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b37372c32352c3131392c31372c3139332c3133362c31372c39332c3234342c3233352c31382c3130342c3136372c352c3131362c3136392c36332c32322c3136322c31382c3132322c32332c3133382c37382c36302c3230392c3230312c3135342c3131382c3139372c3234302c36375d2c22627974655f7374617274223a302c22627974655f6c656e677468223a343039362c2275746631365f6c656e677468223a343039362c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "8c96403f3086c92ea73a37631015cb733c9e60f04182a064857939d40e3f20c0", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b37352c3132352c3133302c3133352c3130392c3135312c3133312c36312c36392c3131392c3134382c3134392c362c38332c3135382c37312c3233382c3136362c3137382c3231372c33322c352c34342c39352c382c3132392c3138312c33392c32352c3233372c32332c3230355d2c226279746573223a5b39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39382c39385d7d" + }, + { + "nodeId": "a09e0b155399d1d5f06a935bb59271ab6983d9ee1ff9893a9cd13a8fc165d0e2", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b37312c3135332c3233352c3232352c32352c38302c36332c3134362c3136302c3230322c36382c38372c3134392c322c36322c3135342c31302c3135332c3130342c3138322c3137342c38332c3132312c32392c3130322c3230372c3131352c3135342c3134322c3230352c3230392c3137315d2c226279746573223a5b39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39392c39395d7d" + }, + { + "nodeId": "c0ac798dea10d63d1c706ddc6acb666a6a55fb22564bcc573b73aecbb085097e", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3133372c3230392c35362c3233322c3132362c38382c3230342c3233302c3139322c3230302c35342c34362c37332c33362c3139342c38392c3234342c39332c3231362c3132392c32372c3139322c36332c3231382c3133342c33372c3233332c39382c36382c3230372c3131302c3133315d2c227269676874223a5b312c38362c34352c3133352c3234302c3234392c3231382c3230372c3132302c38312c3231322c352c35372c38342c34362c3232362c3233392c3130332c38342c3136372c3132362c3133352c33312c3137322c3230342c3234392c3230382c31352c3232312c3135342c3234302c3139375d2c22627974655f6c656e677468223a383139322c2275746631365f6c656e677468223a383139322c226c696e655f627265616b73223a302c22686569676874223a327d" + }, + { + "nodeId": "e665988b0c62bafa8691e57a39f99b64d9812a245c5bba6464882b7919ec2bb6", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3139322c3137322c3132312c3134312c3233342c31362c3231342c36312c32382c3131322c3130392c3232302c3130362c3230332c3130322c3130362c3130362c38352c3235312c33342c38362c37352c3230342c38372c35392c3131352c3137342c3230332c3137362c3133332c392c3132365d2c227269676874223a5b37382c32372c37382c3232352c3132362c3137372c31382c3135352c3232302c3230302c382c32382c39312c342c3139382c35352c322c332c3133302c38322c3233322c34312c3133302c35322c33322c3133362c38342c312c3132372c3139382c3134312c38345d2c22627974655f6c656e677468223a31323238382c2275746631365f6c656e677468223a31323238382c226c696e655f627265616b73223a302c22686569676874223a337d" + } + ], + "invocation": { + "bufferId": "13269f44acc520b0cc9be1af6ac48ed4d3aa4d17ff7e6ed1e01c5b5188bf62a8", + "basisHeadId": "02aedab2e321cd11b064b9b560e7a1b2b58b119ccefb64fcf01679a8ad14253c", + "startByte": 4094, + "endByte": 8194, + "replacementUtf8Hex": "ceb20a5a" + }, + "invocationBytesHex": "7b226275666665724964223a2231333236396634346163633532306230636339626531616636616334386564346433616134643137666637653665643165303163356235313838626636326138222c226261736973486561644964223a2230326165646162326533323163643131623036346239623536306537613162326235386231313963636566623634666366303136373961386164313432353363222c22737461727442797465223a343039342c22656e6442797465223a383139342c227265706c6163656d656e7455746638486578223a226365623230613561227d", + "terminal": { + "posture": "committable", + "footprint": { + "nodeReads": [ + "01562d87f0f9dacf7851d40539542ee2ef6754a77e871facccf9d00fdd9af0c5", + "02aedab2e321cd11b064b9b560e7a1b2b58b119ccefb64fcf01679a8ad14253c", + "13269f44acc520b0cc9be1af6ac48ed4d3aa4d17ff7e6ed1e01c5b5188bf62a8", + "4d197711c188115df4eb1268a70574a93f16a2127a178a4e3cd1c99a76c5f043", + "4e1b4ee17eb1129bdcc8081c5b04c63702038252e8298234208854017fc68d54", + "89d138e87e58cce6c0c8362e4924c259f45dd8811bc03fda8625e96244cf6e83", + "8c96403f3086c92ea73a37631015cb733c9e60f04182a064857939d40e3f20c0", + "a09e0b155399d1d5f06a935bb59271ab6983d9ee1ff9893a9cd13a8fc165d0e2", + "c0ac798dea10d63d1c706ddc6acb666a6a55fb22564bcc573b73aecbb085097e", + "e665988b0c62bafa8691e57a39f99b64d9812a245c5bba6464882b7919ec2bb6" + ], + "nodeWrites": [ + "0e1886c0fb0eb9b0ce9ae0d72ca5870163ebcdb5ad40d1230cf4d71e753b077f", + "13269f44acc520b0cc9be1af6ac48ed4d3aa4d17ff7e6ed1e01c5b5188bf62a8", + "1be4400b3d12df9c6d9217c7161a62a9ec9b88adb69e329980d0c8fd6d480b0d", + "33c310d66818430776a88cbdb757c39403b17d29810852f16c797ccbc5311375", + "4d7e1cbb323c7bf2e6226887f35e42132fc0ae89b80ad73118ad769964194f5f", + "53944ec802f7ac24209dcbd261da9da9af4b1bc308e192d15ccd98c8c4ee2b6f", + "59645ec30419509f3f7a4ca80bcffd85203ba7a2792b07f3a73fa86cc278f56e", + "5984dc86ddd2631f51ec589f23bf0975a53f7422ff47b8028297ea356e64f5f3", + "9153d0ad9b6d249f9d9d48785699a64ebdc378271711496bfc3de768526849f2", + "aab4280bf8d823a0692cbdc998c99d143362f857cc943768a1e123bc5369ebaf", + "bb7602b30a93833e7afc1abb4a9c8a4fdbb3aeb982e0e404bebcf91403e51a5a", + "d8b4236fef26140fbae630016a83e62c78d7111485c631402e7d10c01a0cc8ee", + "e7369137c62d0c6ce1b64065c0d3311325918075238e8952dba105b945e2093d", + "f5e7e901d1017721cfd70bb9868b9453134e81d5ccab38f853e0d80048e61fed", + "ffcddc1cb682508a527fe6c94216d9a8cce40b362446df7f66a6c53804153a46" + ], + "attachmentReads": [ + "01562d87f0f9dacf7851d40539542ee2ef6754a77e871facccf9d00fdd9af0c5", + "02aedab2e321cd11b064b9b560e7a1b2b58b119ccefb64fcf01679a8ad14253c", + "13269f44acc520b0cc9be1af6ac48ed4d3aa4d17ff7e6ed1e01c5b5188bf62a8", + "4d197711c188115df4eb1268a70574a93f16a2127a178a4e3cd1c99a76c5f043", + "4e1b4ee17eb1129bdcc8081c5b04c63702038252e8298234208854017fc68d54", + "89d138e87e58cce6c0c8362e4924c259f45dd8811bc03fda8625e96244cf6e83", + "8c96403f3086c92ea73a37631015cb733c9e60f04182a064857939d40e3f20c0", + "a09e0b155399d1d5f06a935bb59271ab6983d9ee1ff9893a9cd13a8fc165d0e2", + "c0ac798dea10d63d1c706ddc6acb666a6a55fb22564bcc573b73aecbb085097e", + "e665988b0c62bafa8691e57a39f99b64d9812a245c5bba6464882b7919ec2bb6" + ], + "attachmentWrites": [ + "0e1886c0fb0eb9b0ce9ae0d72ca5870163ebcdb5ad40d1230cf4d71e753b077f", + "13269f44acc520b0cc9be1af6ac48ed4d3aa4d17ff7e6ed1e01c5b5188bf62a8", + "1be4400b3d12df9c6d9217c7161a62a9ec9b88adb69e329980d0c8fd6d480b0d", + "33c310d66818430776a88cbdb757c39403b17d29810852f16c797ccbc5311375", + "4d7e1cbb323c7bf2e6226887f35e42132fc0ae89b80ad73118ad769964194f5f", + "53944ec802f7ac24209dcbd261da9da9af4b1bc308e192d15ccd98c8c4ee2b6f", + "59645ec30419509f3f7a4ca80bcffd85203ba7a2792b07f3a73fa86cc278f56e", + "5984dc86ddd2631f51ec589f23bf0975a53f7422ff47b8028297ea356e64f5f3", + "9153d0ad9b6d249f9d9d48785699a64ebdc378271711496bfc3de768526849f2", + "aab4280bf8d823a0692cbdc998c99d143362f857cc943768a1e123bc5369ebaf", + "bb7602b30a93833e7afc1abb4a9c8a4fdbb3aeb982e0e404bebcf91403e51a5a", + "d8b4236fef26140fbae630016a83e62c78d7111485c631402e7d10c01a0cc8ee", + "e7369137c62d0c6ce1b64065c0d3311325918075238e8952dba105b945e2093d", + "f5e7e901d1017721cfd70bb9868b9453134e81d5ccab38f853e0d80048e61fed", + "ffcddc1cb682508a527fe6c94216d9a8cce40b362446df7f66a6c53804153a46" + ], + "edgeReads": [], + "edgeWrites": [] + }, + "patch": [ + { + "kind": "upsert-node", + "nodeId": "0e1886c0fb0eb9b0ce9ae0d72ca5870163ebcdb5ad40d1230cf4d71e753b077f", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4" + }, + { + "kind": "upsert-node", + "nodeId": "13269f44acc520b0cc9be1af6ac48ed4d3aa4d17ff7e6ed1e01c5b5188bf62a8", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e" + }, + { + "kind": "upsert-node", + "nodeId": "1be4400b3d12df9c6d9217c7161a62a9ec9b88adb69e329980d0c8fd6d480b0d", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4" + }, + { + "kind": "upsert-node", + "nodeId": "33c310d66818430776a88cbdb757c39403b17d29810852f16c797ccbc5311375", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1" + }, + { + "kind": "upsert-node", + "nodeId": "4d7e1cbb323c7bf2e6226887f35e42132fc0ae89b80ad73118ad769964194f5f", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4" + }, + { + "kind": "upsert-node", + "nodeId": "53944ec802f7ac24209dcbd261da9da9af4b1bc308e192d15ccd98c8c4ee2b6f", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4" + }, + { + "kind": "upsert-node", + "nodeId": "59645ec30419509f3f7a4ca80bcffd85203ba7a2792b07f3a73fa86cc278f56e", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1" + }, + { + "kind": "upsert-node", + "nodeId": "5984dc86ddd2631f51ec589f23bf0975a53f7422ff47b8028297ea356e64f5f3", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1" + }, + { + "kind": "upsert-node", + "nodeId": "9153d0ad9b6d249f9d9d48785699a64ebdc378271711496bfc3de768526849f2", + "typeId": "c30835603fa3940cf7845d961d0e41d338c40fea99698639dfc155117465943a" + }, + { + "kind": "upsert-node", + "nodeId": "aab4280bf8d823a0692cbdc998c99d143362f857cc943768a1e123bc5369ebaf", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1" + }, + { + "kind": "upsert-node", + "nodeId": "bb7602b30a93833e7afc1abb4a9c8a4fdbb3aeb982e0e404bebcf91403e51a5a", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1" + }, + { + "kind": "upsert-node", + "nodeId": "d8b4236fef26140fbae630016a83e62c78d7111485c631402e7d10c01a0cc8ee", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9" + }, + { + "kind": "upsert-node", + "nodeId": "e7369137c62d0c6ce1b64065c0d3311325918075238e8952dba105b945e2093d", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e" + }, + { + "kind": "upsert-node", + "nodeId": "f5e7e901d1017721cfd70bb9868b9453134e81d5ccab38f853e0d80048e61fed", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4" + }, + { + "kind": "upsert-node", + "nodeId": "ffcddc1cb682508a527fe6c94216d9a8cce40b362446df7f66a6c53804153a46", + "typeId": "d5ed88f6007b97cda5106fc3548d6252f164bd86b18f6b41d22e7c6a72f21ccd" + }, + { + "kind": "set-node-alpha", + "nodeId": "0e1886c0fb0eb9b0ce9ae0d72ca5870163ebcdb5ad40d1230cf4d71e753b077f", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b37372c32352c3131392c31372c3139332c3133362c31372c39332c3234342c3233352c31382c3130342c3136372c352c3131362c3136392c36332c32322c3136322c31382c3132322c32332c3133382c37382c36302c3230392c3230312c3135342c3131382c3139372c3234302c36375d2c22627974655f7374617274223a343039342c22627974655f6c656e677468223a322c2275746631365f6c656e677468223a322c226c696e655f627265616b73223a307d" + }, + { + "kind": "set-node-alpha", + "nodeId": "13269f44acc520b0cc9be1af6ac48ed4d3aa4d17ff7e6ed1e01c5b5188bf62a8", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a2263726f73732d6c6561662d726562616c616e6365222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3233312c35342c3134352c35352c3139382c34352c31322c3130382c3232352c3138322c36342c3130312c3139322c3231312c34392c31392c33372c3134352c3132382c3131372c33352c3134322c3133372c38322c3231392c3136312c352c3138352c36392c3232362c392c36315d2c2276657273696f6e223a317d" + }, + { + "kind": "set-node-alpha", + "nodeId": "1be4400b3d12df9c6d9217c7161a62a9ec9b88adb69e329980d0c8fd6d480b0d", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3136302c3135382c31312c32312c38332c3135332c3230392c3231332c3234302c3130362c3134372c39312c3138312c3134362c3131332c3137312c3130352c3133312c3231372c3233382c33312c3234392c3133372c35382c3135362c3230392c35382c3134332c3139332c3130312c3230382c3232365d2c22627974655f7374617274223a322c22627974655f6c656e677468223a343039342c2275746631365f6c656e677468223a343039342c226c696e655f627265616b73223a307d" + }, + { + "kind": "set-node-alpha", + "nodeId": "33c310d66818430776a88cbdb757c39403b17d29810852f16c797ccbc5311375", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3137302c3138302c34302c31312c3234382c3231362c33352c3136302c3130352c34342c3138392c3230312c3135322c3230312c3135372c32302c35312c39382c3234382c38372c3230342c3134382c35352c3130342c3136312c3232352c33352c3138382c38332c3130352c3233352c3137355d2c227269676874223a5b32372c3232382c36342c31312c36312c31382c3232332c3135362c3130392c3134362c32332c3139392c32322c32362c39382c3136392c3233362c3135352c3133362c3137332c3138322c3135382c35302c3135332c3132382c3230382c3230302c3235332c3130392c37322c31312c31335d2c22627974655f6c656e677468223a383139322c2275746631365f6c656e677468223a383139312c226c696e655f627265616b73223a312c22686569676874223a337d" + }, + { + "kind": "set-node-alpha", + "nodeId": "4d7e1cbb323c7bf2e6226887f35e42132fc0ae89b80ad73118ad769964194f5f", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3136302c3135382c31312c32312c38332c3135332c3230392c3231332c3234302c3130362c3134372c39312c3138312c3134362c3131332c3137312c3130352c3133312c3231372c3233382c33312c3234392c3133372c35382c3135362c3230392c35382c3134332c3139332c3130312c3230382c3232365d2c22627974655f7374617274223a302c22627974655f6c656e677468223a322c2275746631365f6c656e677468223a322c226c696e655f627265616b73223a307d" + }, + { + "kind": "set-node-alpha", + "nodeId": "53944ec802f7ac24209dcbd261da9da9af4b1bc308e192d15ccd98c8c4ee2b6f", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b37372c32352c3131392c31372c3139332c3133362c31372c39332c3234342c3233352c31382c3130342c3136372c352c3131362c3136392c36332c32322c3136322c31382c3132322c32332c3133382c37382c36302c3230392c3230312c3135342c3131382c3139372c3234302c36375d2c22627974655f7374617274223a302c22627974655f6c656e677468223a343039342c2275746631365f6c656e677468223a343039342c226c696e655f627265616b73223a307d" + }, + { + "kind": "set-node-alpha", + "nodeId": "59645ec30419509f3f7a4ca80bcffd85203ba7a2792b07f3a73fa86cc278f56e", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b31342c32342c3133342c3139322c3235312c31342c3138352c3137362c3230362c3135342c3232342c3231352c34342c3136352c3133352c312c39392c3233352c3230352c3138312c3137332c36342c3230392c33352c31322c3234342c3231352c33302c3131372c35392c372c3132375d2c227269676874223a5b312c38362c34352c3133352c3234302c3234392c3231382c3230372c3132302c38312c3231322c352c35372c38342c34362c3232362c3233392c3130332c38342c3136372c3132362c3133352c33312c3137322c3230342c3234392c3230382c31352c3232312c3135342c3234302c3139375d2c22627974655f6c656e677468223a343039382c2275746631365f6c656e677468223a343039382c226c696e655f627265616b73223a302c22686569676874223a327d" + }, + { + "kind": "set-node-alpha", + "nodeId": "5984dc86ddd2631f51ec589f23bf0975a53f7422ff47b8028297ea356e64f5f3", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b38392c3130302c39342c3139352c342c32352c38302c3135392c36332c3132322c37362c3136382c31312c3230372c3235332c3133332c33322c35392c3136372c3136322c3132312c34332c372c3234332c3136372c36332c3136382c3130382c3139342c3132302c3234352c3131305d2c227269676874223a5b37382c32372c37382c3232352c3132362c3137372c31382c3135352c3232302c3230302c382c32382c39312c342c3139382c35352c322c332c3133302c38322c3233322c34312c3133302c35322c33322c3133362c38342c312c3132372c3139382c3134312c38345d2c22627974655f6c656e677468223a383139342c2275746631365f6c656e677468223a383139342c226c696e655f627265616b73223a302c22686569676874223a337d" + }, + { + "kind": "set-node-alpha", + "nodeId": "9153d0ad9b6d249f9d9d48785699a64ebdc378271711496bfc3de768526849f2", + "typeId": "c30835603fa3940cf7845d961d0e41d338c40fea99698639dfc155117465943a", + "attachmentBytesHex": "7b226275666665725f6964223a5b31392c33382c3135392c36382c3137322c3139372c33322c3137362c3230342c3135352c3232352c3137352c3130362c3139362c3134322c3231322c3231312c3137302c37372c32332c3235352c3132362c3131302c3230392c3232342c32382c39312c38312c3133362c3139312c39382c3136385d2c2262617369735f686561645f6964223a5b322c3137342c3231382c3137382c3232372c33332c3230352c31372c3137362c3130302c3138352c3138312c39362c3233312c3136312c3137382c3138312c3133392c31372c3135362c3230362c3235312c3130302c3235322c3234302c32322c3132312c3136382c3137332c32302c33372c36305d2c226e6578745f686561645f6964223a5b3233312c35342c3134352c35352c3139382c34352c31322c3130382c3232352c3138322c36342c3130312c3139322c3231312c34392c31392c33372c3134352c3132382c3131372c33352c3134322c3133372c38322c3231392c3136312c352c3138352c36392c3232362c392c36315d2c2273746172745f62797465223a343039342c22656e645f62797465223a383139342c22696e7365727465645f627974655f6c656e677468223a347d" + }, + { + "kind": "set-node-alpha", + "nodeId": "aab4280bf8d823a0692cbdc998c99d143362f857cc943768a1e123bc5369ebaf", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b38332c3134382c37382c3230302c322c3234372c3137322c33362c33322c3135372c3230332c3231302c39372c3231382c3135372c3136392c3137352c37352c32372c3139352c382c3232352c3134362c3230392c39322c3230352c3135322c3230302c3139362c3233382c34332c3131315d2c227269676874223a5b3234352c3233312c3233332c312c3230392c312c3131392c33332c3230372c3231352c31312c3138352c3133342c3133392c3134382c38332c31392c37382c3132392c3231332c3230342c3137312c35362c3234382c38332c3232342c3231362c302c37322c3233302c33312c3233375d2c22627974655f6c656e677468223a343039382c2275746631365f6c656e677468223a343039372c226c696e655f627265616b73223a312c22686569676874223a327d" + }, + { + "kind": "set-node-alpha", + "nodeId": "bb7602b30a93833e7afc1abb4a9c8a4fdbb3aeb982e0e404bebcf91403e51a5a", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b38392c3130302c39342c3139352c342c32352c38302c3135392c36332c3132322c37362c3136382c31312c3230372c3235332c3133332c33322c35392c3136372c3136322c3132312c34332c372c3234332c3136372c36332c3136382c3130382c3139342c3132302c3234352c3131305d2c227269676874223a5b37372c3132362c32382c3138372c35302c36302c3132332c3234322c3233302c33342c3130342c3133352c3234332c39342c36362c31392c34372c3139322c3137342c3133372c3138342c31302c3231352c34392c32342c3137332c3131382c3135332c3130302c32352c37392c39355d2c22627974655f6c656e677468223a343130302c2275746631365f6c656e677468223a343130302c226c696e655f627265616b73223a302c22686569676874223a337d" + }, + { + "kind": "set-node-alpha", + "nodeId": "d8b4236fef26140fbae630016a83e62c78d7111485c631402e7d10c01a0cc8ee", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3231392c3136312c3133382c3134312c3133342c3232322c35342c32372c37342c3139362c3133332c3134392c33332c3132312c3139352c32362c3138392c3130392c3132302c3133392c3231352c32312c3234302c3130322c3138332c31362c3134342c312c3233362c33302c3230352c3230365d2c226279746573223a5b3230362c3137382c31302c39305d7d" + }, + { + "kind": "set-node-alpha", + "nodeId": "e7369137c62d0c6ce1b64065c0d3311325918075238e8952dba105b945e2093d", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b31392c33382c3135392c36382c3137322c3139372c33322c3137362c3230342c3135352c3232352c3137352c3130362c3139362c3134322c3231322c3231312c3137302c37372c32332c3235352c3132362c3131302c3230392c3232342c32382c39312c38312c3133362c3139312c39382c3136385d2c2262617369735f686561645f6964223a5b322c3137342c3231382c3137382c3232372c33332c3230352c31372c3137362c3130302c3138352c3138312c39362c3233312c3136312c3137382c3138312c3133392c31372c3135362c3230362c3235312c3130302c3235322c3234302c32322c3132312c3136382c3137332c32302c33372c36305d2c22726f6f745f6e6f64655f6964223a5b35312c3139352c31362c3231342c3130342c32342c36372c372c3131382c3136382c3134302c3138392c3138332c38372c3139352c3134382c332c3137372c3132352c34312c3132392c382c38322c3234312c3130382c3132312c3132342c3230332c3139372c34392c31392c3131375d2c22627974655f6c656e677468223a383139322c2275746631365f6c656e677468223a383139312c226c696e655f636f756e74223a322c22726f6f745f646967657374223a5b35312c3139352c31362c3231342c3130342c32342c36372c372c3131382c3136382c3134302c3138392c3138332c38372c3139352c3134382c332c3137372c3132352c34312c3132392c382c38322c3234312c3130382c3132312c3132342c3230332c3139372c34392c31392c3131375d2c2273657175656e6365223a317d" + }, + { + "kind": "set-node-alpha", + "nodeId": "f5e7e901d1017721cfd70bb9868b9453134e81d5ccab38f853e0d80048e61fed", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3231362c3138302c33352c3131312c3233392c33382c32302c31352c3138362c3233302c34382c312c3130362c3133312c3233302c34342c3132302c3231352c31372c32302c3133332c3139382c34392c36342c34362c3132352c31362c3139322c32362c31322c3230302c3233385d2c22627974655f7374617274223a302c22627974655f6c656e677468223a342c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a317d" + }, + { + "kind": "set-node-alpha", + "nodeId": "ffcddc1cb682508a527fe6c94216d9a8cce40b362446df7f66a6c53804153a46", + "typeId": "d5ed88f6007b97cda5106fc3548d6252f164bd86b18f6b41d22e7c6a72f21ccd", + "attachmentBytesHex": "7b22726577726974655f6964223a5b3134352c38332c3230382c3137332c3135352c3130392c33362c3135392c3135372c3135372c37322c3132302c38362c3135332c3136362c37382c3138392c3139352c3132302c33392c32332c31372c37332c3130372c3235322c36312c3233312c3130342c38322c3130342c37332c3234325d2c2262617369735f686561645f6964223a5b322c3137342c3231382c3137382c3232372c33332c3230352c31372c3137362c3130302c3138352c3138312c39362c3233312c3136312c3137382c3138312c3133392c31372c3135362c3230362c3235312c3130302c3235322c3234302c32322c3132312c3136382c3137332c32302c33372c36305d2c226e6578745f686561645f6964223a5b3233312c35342c3134352c35352c3139382c34352c31322c3130382c3232352c3138322c36342c3130312c3139322c3231312c34392c31392c33372c3134352c3132382c3131372c33352c3134322c3133372c38322c3231392c3136312c352c3138352c36392c3232362c392c36315d2c2273746172745f62797465223a343039342c22656e645f62797465223a383139342c22696e7365727465645f627974655f6c656e677468223a342c2264656c657465645f627974655f6c656e677468223a343130307d" + } + ], + "createdNodeIds": [ + "0e1886c0fb0eb9b0ce9ae0d72ca5870163ebcdb5ad40d1230cf4d71e753b077f", + "1be4400b3d12df9c6d9217c7161a62a9ec9b88adb69e329980d0c8fd6d480b0d", + "33c310d66818430776a88cbdb757c39403b17d29810852f16c797ccbc5311375", + "4d7e1cbb323c7bf2e6226887f35e42132fc0ae89b80ad73118ad769964194f5f", + "53944ec802f7ac24209dcbd261da9da9af4b1bc308e192d15ccd98c8c4ee2b6f", + "59645ec30419509f3f7a4ca80bcffd85203ba7a2792b07f3a73fa86cc278f56e", + "5984dc86ddd2631f51ec589f23bf0975a53f7422ff47b8028297ea356e64f5f3", + "9153d0ad9b6d249f9d9d48785699a64ebdc378271711496bfc3de768526849f2", + "aab4280bf8d823a0692cbdc998c99d143362f857cc943768a1e123bc5369ebaf", + "bb7602b30a93833e7afc1abb4a9c8a4fdbb3aeb982e0e404bebcf91403e51a5a", + "d8b4236fef26140fbae630016a83e62c78d7111485c631402e7d10c01a0cc8ee", + "e7369137c62d0c6ce1b64065c0d3311325918075238e8952dba105b945e2093d", + "f5e7e901d1017721cfd70bb9868b9453134e81d5ccab38f853e0d80048e61fed", + "ffcddc1cb682508a527fe6c94216d9a8cce40b362446df7f66a6c53804153a46" + ], + "updatedNodeIds": [ + "13269f44acc520b0cc9be1af6ac48ed4d3aa4d17ff7e6ed1e01c5b5188bf62a8" + ], + "untouchedBasisNodeIds": [ + "01562d87f0f9dacf7851d40539542ee2ef6754a77e871facccf9d00fdd9af0c5", + "02aedab2e321cd11b064b9b560e7a1b2b58b119ccefb64fcf01679a8ad14253c", + "4d197711c188115df4eb1268a70574a93f16a2127a178a4e3cd1c99a76c5f043", + "4e1b4ee17eb1129bdcc8081c5b04c63702038252e8298234208854017fc68d54", + "89d138e87e58cce6c0c8362e4924c259f45dd8811bc03fda8625e96244cf6e83", + "8c96403f3086c92ea73a37631015cb733c9e60f04182a064857939d40e3f20c0", + "a09e0b155399d1d5f06a935bb59271ab6983d9ee1ff9893a9cd13a8fc165d0e2", + "c0ac798dea10d63d1c706ddc6acb666a6a55fb22564bcc573b73aecbb085097e", + "e665988b0c62bafa8691e57a39f99b64d9812a245c5bba6464882b7919ec2bb6" + ], + "result": { + "bufferId": "13269f44acc520b0cc9be1af6ac48ed4d3aa4d17ff7e6ed1e01c5b5188bf62a8", + "headId": "e7369137c62d0c6ce1b64065c0d3311325918075238e8952dba105b945e2093d", + "rootNodeId": "33c310d66818430776a88cbdb757c39403b17d29810852f16c797ccbc5311375", + "rootDigest": "33c310d66818430776a88cbdb757c39403b17d29810852f16c797ccbc5311375", + "rewriteId": "9153d0ad9b6d249f9d9d48785699a64ebdc378271711496bfc3de768526849f2", + "diffId": "ffcddc1cb682508a527fe6c94216d9a8cce40b362446df7f66a6c53804153a46", + "byteLength": 8192, + "utf16Length": 8191, + "lineCount": 2, + "sequence": 1, + "version": 1, + "materializedTextUtf8Hex": "6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161ceb20a5a6363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363" + } + } + }, + { + "id": "replacement-larger-than-leaf", + "purpose": "finite persistent-rope ReplaceRange conformance witness", + "basisFacts": [ + { + "nodeId": "18560c12d14a67205c3bb96056986ed76fe7751ddf6150f1042818fb7a55e47a", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3233352c3132372c3138352c3130322c3133312c3139382c302c31322c3133392c31322c3133352c3133352c3138302c392c34342c32322c3138332c3130352c3132302c3133302c35322c332c34332c37302c3231302c32352c3136332c3138382c3232302c32382c3135312c31325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a352c2275746631365f6c656e677468223a352c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "650df2a29fbf512fd5a26f3733bd475540bc93ed5542505269a940860642dfd4", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a227265706c6163656d656e742d6c61726765722d7468616e2d6c656166222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3232332c39352c3232322c38312c33352c3134362c34382c36372c3137342c35392c3138322c39342c3134372c3133322c3132342c3230392c3131342c3136312c3133392c3130382c32372c33302c38332c34362c35342c3138382c38352c34342c39392c37362c302c345d2c2276657273696f6e223a307d" + }, + { + "nodeId": "df5fde5123923043ae3bb65e93847cd172a18b6c1b1e532e36bc552c634c0004", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3130312c31332c3234322c3136322c3135392c3139312c38312c34372c3231332c3136322c3131312c35352c35312c3138392c37312c38352c36342c3138382c3134372c3233372c38352c36362c38302c38322c3130352c3136392c36342c3133342c362c36362c3232332c3231325d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b32342c38362c31322c31382c3230392c37342c3130332c33322c39322c35392c3138352c39362c38362c3135322c3131302c3231352c3131312c3233312c3131372c32392c3232332c39372c38302c3234312c342c34302c32342c3235312c3132322c38352c3232382c3132325d2c22627974655f6c656e677468223a352c2275746631365f6c656e677468223a352c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b32342c38362c31322c31382c3230392c37342c3130332c33322c39322c35392c3138352c39362c38362c3135322c3131302c3231352c3131312c3233312c3131372c32392c3232332c39372c38302c3234312c342c34302c32342c3235312c3132322c38352c3232382c3132325d2c2273657175656e6365223a307d" + }, + { + "nodeId": "eb7fb96683c6000c8b0c8787b4092c16b769788234032b46d219a3bcdc1c970c", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3130302c3133332c39372c34352c34342c3133372c38332c3233302c3230322c39382c3139382c3132322c372c3135312c3139372c3139322c35332c3134352c3231372c3138332c3231372c3136372c3231322c3230372c3232352c37362c36312c3136352c35352c3133302c39372c3232335d2c226279746573223a5b3130312c3130302c3130332c3130312c3131355d7d" + } + ], + "invocation": { + "bufferId": "650df2a29fbf512fd5a26f3733bd475540bc93ed5542505269a940860642dfd4", + "basisHeadId": "df5fde5123923043ae3bb65e93847cd172a18b6c1b1e532e36bc552c634c0004", + "startByte": 0, + "endByte": 5, + "replacementUtf8Hex": "e78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cab0a" + }, + "invocationBytesHex": "7b226275666665724964223a2236353064663261323966626635313266643561323666333733336264343735353430626339336564353534323530353236396139343038363036343264666434222c226261736973486561644964223a2264663566646535313233393233303433616533626236356539333834376364313732613138623663316231653533326533366263353532633633346330303034222c22737461727442797465223a302c22656e6442797465223a352c227265706c6163656d656e7455746638486578223a226537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361626537386361623061227d", + "terminal": { + "posture": "committable", + "footprint": { + "nodeReads": [ + "18560c12d14a67205c3bb96056986ed76fe7751ddf6150f1042818fb7a55e47a", + "650df2a29fbf512fd5a26f3733bd475540bc93ed5542505269a940860642dfd4", + "df5fde5123923043ae3bb65e93847cd172a18b6c1b1e532e36bc552c634c0004", + "eb7fb96683c6000c8b0c8787b4092c16b769788234032b46d219a3bcdc1c970c" + ], + "nodeWrites": [ + "055bace365d4bc0f864c35716307ac08870ac97f83af88f6f2e7adbd05c3f3ae", + "07a9352f16e5e0864b30cba05c2399a172d7afdd298ad7bdb86c9cf269068112", + "100f589f0d9182b0c91c89f08864b8faf3f2a63f49a2bde4c447bd5548c946bc", + "5f01ecc74054ec3a4f446f8d29b1f4d1dd738780f9872c2b02f559269238624a", + "650df2a29fbf512fd5a26f3733bd475540bc93ed5542505269a940860642dfd4", + "b535d8a661f942f2c1e34ac0f1f072f0a21ebe8a0b515f2ae71ff41a3da466b8", + "bc2dd50c36efe3ffa2c51672853051d48774c5fc8ec548ed42fd5091cd5280c5", + "c133e67ec0210b76e42e7c63fa22b0ebffdae09bc1273454c039ce48e4269091", + "f9954850fe25bb9fd0f23388728805a505b0d2edb24d64bec65a2d18a32b5818" + ], + "attachmentReads": [ + "18560c12d14a67205c3bb96056986ed76fe7751ddf6150f1042818fb7a55e47a", + "650df2a29fbf512fd5a26f3733bd475540bc93ed5542505269a940860642dfd4", + "df5fde5123923043ae3bb65e93847cd172a18b6c1b1e532e36bc552c634c0004", + "eb7fb96683c6000c8b0c8787b4092c16b769788234032b46d219a3bcdc1c970c" + ], + "attachmentWrites": [ + "055bace365d4bc0f864c35716307ac08870ac97f83af88f6f2e7adbd05c3f3ae", + "07a9352f16e5e0864b30cba05c2399a172d7afdd298ad7bdb86c9cf269068112", + "100f589f0d9182b0c91c89f08864b8faf3f2a63f49a2bde4c447bd5548c946bc", + "5f01ecc74054ec3a4f446f8d29b1f4d1dd738780f9872c2b02f559269238624a", + "650df2a29fbf512fd5a26f3733bd475540bc93ed5542505269a940860642dfd4", + "b535d8a661f942f2c1e34ac0f1f072f0a21ebe8a0b515f2ae71ff41a3da466b8", + "bc2dd50c36efe3ffa2c51672853051d48774c5fc8ec548ed42fd5091cd5280c5", + "c133e67ec0210b76e42e7c63fa22b0ebffdae09bc1273454c039ce48e4269091", + "f9954850fe25bb9fd0f23388728805a505b0d2edb24d64bec65a2d18a32b5818" + ], + "edgeReads": [], + "edgeWrites": [] + }, + "patch": [ + { + "kind": "upsert-node", + "nodeId": "055bace365d4bc0f864c35716307ac08870ac97f83af88f6f2e7adbd05c3f3ae", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e" + }, + { + "kind": "upsert-node", + "nodeId": "07a9352f16e5e0864b30cba05c2399a172d7afdd298ad7bdb86c9cf269068112", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9" + }, + { + "kind": "upsert-node", + "nodeId": "100f589f0d9182b0c91c89f08864b8faf3f2a63f49a2bde4c447bd5548c946bc", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4" + }, + { + "kind": "upsert-node", + "nodeId": "5f01ecc74054ec3a4f446f8d29b1f4d1dd738780f9872c2b02f559269238624a", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9" + }, + { + "kind": "upsert-node", + "nodeId": "650df2a29fbf512fd5a26f3733bd475540bc93ed5542505269a940860642dfd4", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e" + }, + { + "kind": "upsert-node", + "nodeId": "b535d8a661f942f2c1e34ac0f1f072f0a21ebe8a0b515f2ae71ff41a3da466b8", + "typeId": "c30835603fa3940cf7845d961d0e41d338c40fea99698639dfc155117465943a" + }, + { + "kind": "upsert-node", + "nodeId": "bc2dd50c36efe3ffa2c51672853051d48774c5fc8ec548ed42fd5091cd5280c5", + "typeId": "d5ed88f6007b97cda5106fc3548d6252f164bd86b18f6b41d22e7c6a72f21ccd" + }, + { + "kind": "upsert-node", + "nodeId": "c133e67ec0210b76e42e7c63fa22b0ebffdae09bc1273454c039ce48e4269091", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1" + }, + { + "kind": "upsert-node", + "nodeId": "f9954850fe25bb9fd0f23388728805a505b0d2edb24d64bec65a2d18a32b5818", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4" + }, + { + "kind": "set-node-alpha", + "nodeId": "055bace365d4bc0f864c35716307ac08870ac97f83af88f6f2e7adbd05c3f3ae", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3130312c31332c3234322c3136322c3135392c3139312c38312c34372c3231332c3136322c3131312c35352c35312c3138392c37312c38352c36342c3138382c3134372c3233372c38352c36362c38302c38322c3130352c3136392c36342c3133342c362c36362c3232332c3231325d2c2262617369735f686561645f6964223a5b3232332c39352c3232322c38312c33352c3134362c34382c36372c3137342c35392c3138322c39342c3134372c3133322c3132342c3230392c3131342c3136312c3133392c3130382c32372c33302c38332c34362c35342c3138382c38352c34342c39392c37362c302c345d2c22726f6f745f6e6f64655f6964223a5b3139332c35312c3233302c3132362c3139322c33332c31312c3131382c3232382c34362c3132342c39392c3235302c33342c3137362c3233352c3235352c3231382c3232342c3135352c3139332c33392c35322c38342c3139322c35372c3230362c37322c3232382c33382c3134342c3134355d2c22627974655f6c656e677468223a343230312c2275746631365f6c656e677468223a313430312c226c696e655f636f756e74223a322c22726f6f745f646967657374223a5b3139332c35312c3233302c3132362c3139322c33332c31312c3131382c3232382c34362c3132342c39392c3235302c33342c3137362c3233352c3235352c3231382c3232342c3135352c3139332c33392c35322c38342c3139322c35372c3230362c37322c3232382c33382c3134342c3134355d2c2273657175656e6365223a317d" + }, + { + "kind": "set-node-alpha", + "nodeId": "07a9352f16e5e0864b30cba05c2399a172d7afdd298ad7bdb86c9cf269068112", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b37382c34332c38352c3132312c31332c392c34302c3234322c32352c37382c36322c3135372c34382c3230332c31352c37392c3230312c3137382c3232312c3234342c3133372c3138372c3130312c3234312c3232372c3134392c3135392c3136342c3130302c3134322c3234352c3232385d2c226279746573223a5b3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137315d7d" + }, + { + "kind": "set-node-alpha", + "nodeId": "100f589f0d9182b0c91c89f08864b8faf3f2a63f49a2bde4c447bd5548c946bc", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b372c3136392c35332c34372c32322c3232392c3232342c3133342c37352c34382c3230332c3136302c39322c33352c3135332c3136312c3131342c3231352c3137352c3232312c34312c3133382c3231352c3138392c3138342c3130382c3135362c3234322c3130352c362c3132392c31385d2c22627974655f7374617274223a302c22627974655f6c656e677468223a343039352c2275746631365f6c656e677468223a313336352c226c696e655f627265616b73223a307d" + }, + { + "kind": "set-node-alpha", + "nodeId": "5f01ecc74054ec3a4f446f8d29b1f4d1dd738780f9872c2b02f559269238624a", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3139352c3135362c3232342c3232352c3133322c3139332c3231362c3138392c3136332c37362c31312c39342c34392c3234372c3139392c3131362c3138362c38312c3232352c35352c37392c3130342c3133362c3231372c35352c38342c3230332c3139302c3232312c39392c3135342c32375d2c226279746573223a5b3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c3233312c3134302c3137312c31305d7d" + }, + { + "kind": "set-node-alpha", + "nodeId": "650df2a29fbf512fd5a26f3733bd475540bc93ed5542505269a940860642dfd4", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a227265706c6163656d656e742d6c61726765722d7468616e2d6c656166222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b352c39312c3137322c3232372c3130312c3231322c3138382c31352c3133342c37362c35332c3131332c39392c372c3137322c382c3133352c31302c3230312c3132372c3133312c3137352c3133362c3234362c3234322c3233312c3137332c3138392c352c3139352c3234332c3137345d2c2276657273696f6e223a317d" + }, + { + "kind": "set-node-alpha", + "nodeId": "b535d8a661f942f2c1e34ac0f1f072f0a21ebe8a0b515f2ae71ff41a3da466b8", + "typeId": "c30835603fa3940cf7845d961d0e41d338c40fea99698639dfc155117465943a", + "attachmentBytesHex": "7b226275666665725f6964223a5b3130312c31332c3234322c3136322c3135392c3139312c38312c34372c3231332c3136322c3131312c35352c35312c3138392c37312c38352c36342c3138382c3134372c3233372c38352c36362c38302c38322c3130352c3136392c36342c3133342c362c36362c3232332c3231325d2c2262617369735f686561645f6964223a5b3232332c39352c3232322c38312c33352c3134362c34382c36372c3137342c35392c3138322c39342c3134372c3133322c3132342c3230392c3131342c3136312c3133392c3130382c32372c33302c38332c34362c35342c3138382c38352c34342c39392c37362c302c345d2c226e6578745f686561645f6964223a5b352c39312c3137322c3232372c3130312c3231322c3138382c31352c3133342c37362c35332c3131332c39392c372c3137322c382c3133352c31302c3230312c3132372c3133312c3137352c3133362c3234362c3234322c3233312c3137332c3138392c352c3139352c3234332c3137345d2c2273746172745f62797465223a302c22656e645f62797465223a352c22696e7365727465645f627974655f6c656e677468223a343230317d" + }, + { + "kind": "set-node-alpha", + "nodeId": "bc2dd50c36efe3ffa2c51672853051d48774c5fc8ec548ed42fd5091cd5280c5", + "typeId": "d5ed88f6007b97cda5106fc3548d6252f164bd86b18f6b41d22e7c6a72f21ccd", + "attachmentBytesHex": "7b22726577726974655f6964223a5b3138312c35332c3231362c3136362c39372c3234392c36362c3234322c3139332c3232372c37342c3139322c3234312c3234302c3131342c3234302c3136322c33302c3139302c3133382c31312c38312c39352c34322c3233312c33312c3234342c32362c36312c3136342c3130322c3138345d2c2262617369735f686561645f6964223a5b3232332c39352c3232322c38312c33352c3134362c34382c36372c3137342c35392c3138322c39342c3134372c3133322c3132342c3230392c3131342c3136312c3133392c3130382c32372c33302c38332c34362c35342c3138382c38352c34342c39392c37362c302c345d2c226e6578745f686561645f6964223a5b352c39312c3137322c3232372c3130312c3231322c3138382c31352c3133342c37362c35332c3131332c39392c372c3137322c382c3133352c31302c3230312c3132372c3133312c3137352c3133362c3234362c3234322c3233312c3137332c3138392c352c3139352c3234332c3137345d2c2273746172745f62797465223a302c22656e645f62797465223a352c22696e7365727465645f627974655f6c656e677468223a343230312c2264656c657465645f627974655f6c656e677468223a357d" + }, + { + "kind": "set-node-alpha", + "nodeId": "c133e67ec0210b76e42e7c63fa22b0ebffdae09bc1273454c039ce48e4269091", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b31362c31352c38382c3135392c31332c3134352c3133302c3137362c3230312c32382c3133372c3234302c3133362c3130302c3138342c3235302c3234332c3234322c3136362c36332c37332c3136322c3138392c3232382c3139362c37312c3138392c38352c37322c3230312c37302c3138385d2c227269676874223a5b3234392c3134392c37322c38302c3235342c33372c3138372c3135392c3230382c3234322c35312c3133362c3131342c3133362c352c3136352c352c3137362c3231302c3233372c3137382c37372c3130302c3139302c3139382c39302c34352c32342c3136332c34332c38382c32345d2c22627974655f6c656e677468223a343230312c2275746631365f6c656e677468223a313430312c226c696e655f627265616b73223a312c22686569676874223a327d" + }, + { + "kind": "set-node-alpha", + "nodeId": "f9954850fe25bb9fd0f23388728805a505b0d2edb24d64bec65a2d18a32b5818", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b39352c312c3233362c3139392c36342c38342c3233362c35382c37392c36382c3131312c3134312c34312c3137372c3234342c3230392c3232312c3131352c3133352c3132382c3234392c3133352c34342c34332c322c3234352c38392c33382c3134362c35362c39382c37345d2c22627974655f7374617274223a302c22627974655f6c656e677468223a3130362c2275746631365f6c656e677468223a33362c226c696e655f627265616b73223a317d" + } + ], + "createdNodeIds": [ + "055bace365d4bc0f864c35716307ac08870ac97f83af88f6f2e7adbd05c3f3ae", + "07a9352f16e5e0864b30cba05c2399a172d7afdd298ad7bdb86c9cf269068112", + "100f589f0d9182b0c91c89f08864b8faf3f2a63f49a2bde4c447bd5548c946bc", + "5f01ecc74054ec3a4f446f8d29b1f4d1dd738780f9872c2b02f559269238624a", + "b535d8a661f942f2c1e34ac0f1f072f0a21ebe8a0b515f2ae71ff41a3da466b8", + "bc2dd50c36efe3ffa2c51672853051d48774c5fc8ec548ed42fd5091cd5280c5", + "c133e67ec0210b76e42e7c63fa22b0ebffdae09bc1273454c039ce48e4269091", + "f9954850fe25bb9fd0f23388728805a505b0d2edb24d64bec65a2d18a32b5818" + ], + "updatedNodeIds": [ + "650df2a29fbf512fd5a26f3733bd475540bc93ed5542505269a940860642dfd4" + ], + "untouchedBasisNodeIds": [ + "18560c12d14a67205c3bb96056986ed76fe7751ddf6150f1042818fb7a55e47a", + "df5fde5123923043ae3bb65e93847cd172a18b6c1b1e532e36bc552c634c0004", + "eb7fb96683c6000c8b0c8787b4092c16b769788234032b46d219a3bcdc1c970c" + ], + "result": { + "bufferId": "650df2a29fbf512fd5a26f3733bd475540bc93ed5542505269a940860642dfd4", + "headId": "055bace365d4bc0f864c35716307ac08870ac97f83af88f6f2e7adbd05c3f3ae", + "rootNodeId": "c133e67ec0210b76e42e7c63fa22b0ebffdae09bc1273454c039ce48e4269091", + "rootDigest": "c133e67ec0210b76e42e7c63fa22b0ebffdae09bc1273454c039ce48e4269091", + "rewriteId": "b535d8a661f942f2c1e34ac0f1f072f0a21ebe8a0b515f2ae71ff41a3da466b8", + "diffId": "bc2dd50c36efe3ffa2c51672853051d48774c5fc8ec548ed42fd5091cd5280c5", + "byteLength": 4201, + "utf16Length": 1401, + "lineCount": 2, + "sequence": 1, + "version": 1, + "materializedTextUtf8Hex": "e78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cabe78cab0a" + } + } + }, + { + "id": "reversed-range", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3233372c3139322c34362c3139322c3231332c3232312c36302c37302c3130372c3130332c3137342c3136322c3234312c32312c3131322c32362c332c3231332c3131312c39362c3134302c32392c3231302c33382c35342c3235352c3132382c3135362c3230352c32312c3131362c3135345d2c226279746573223a5b39372c39382c39395d7d" + }, + { + "nodeId": "5c9778f04fffc5a5d49549952e2f9c4893a1785e39101f7d6431ef13679d305b", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3135362c3234372c3132302c3130332c3231362c3235302c36332c3139312c3135332c3232362c3135332c34302c37372c3130372c3230392c33312c38322c3134392c3130392c3230322c34392c3138382c39372c38332c3139392c3139312c3234372c37392c35362c38382c39392c39395d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c2273657175656e6365223a307d" + }, + { + "nodeId": "9cf77867d8fa3fbf99e299284d6bd11f52956dca31bc6153c7bff74f38586363", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a2272657665727365642d72616e6765222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b39322c3135312c3132302c3234302c37392c3235352c3139372c3136352c3231322c3134392c37332c3134392c34362c34372c3135362c37322c3134372c3136312c3132302c39342c35372c31362c33312c3132352c3130302c34392c3233392c31392c3130332c3135372c34382c39315d2c2276657273696f6e223a307d" + }, + { + "nodeId": "b18fc548c67874d9ffa852ee4955f3236115798b79c4f561c49dfde168e8d7dc", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b34332c3135372c382c39312c37302c3234372c37342c35362c3135322c35392c322c3233332c37342c33332c3230372c3139382c3134302c39392c3136392c3135372c34352c3139312c3234322c38382c3132372c3234342c33352c3233332c3139342c38342c3232332c34325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "9cf77867d8fa3fbf99e299284d6bd11f52956dca31bc6153c7bff74f38586363", + "basisHeadId": "5c9778f04fffc5a5d49549952e2f9c4893a1785e39101f7d6431ef13679d305b", + "startByte": 2, + "endByte": 1, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2239636637373836376438666133666266393965323939323834643662643131663532393536646361333162633631353363376266663734663338353836333633222c226261736973486561644964223a2235633937373866303466666663356135643439353439393532653266396334383933613137383565333931303166376436343331656631333637396433303562222c22737461727442797465223a322c22656e6442797465223a312c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "range-order-invalid", + "legacyErrorClass": "invalid-request", + "legacyMessage": "replace range start must not exceed end: 2 > 1", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "out-of-bounds-range", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "1b0a708a2fe3cbf3f7032588504563c8ce1d21ca66a3ae2ee67e447a6938700a", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226f75742d6f662d626f756e64732d72616e6765222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b38302c32392c34392c3232322c3232392c35312c32382c39392c33362c3130342c3136312c3138312c35322c3135312c35372c3137392c31322c3235332c3135392c39362c36352c35352c38382c3136302c3139312c31372c3232312c3233322c32322c3133372c3233302c3234355d2c2276657273696f6e223a307d" + }, + { + "nodeId": "2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3233372c3139322c34362c3139322c3231332c3232312c36302c37302c3130372c3130332c3137342c3136322c3234312c32312c3131322c32362c332c3231332c3131312c39362c3134302c32392c3231302c33382c35342c3235352c3132382c3135362c3230352c32312c3131362c3135345d2c226279746573223a5b39372c39382c39395d7d" + }, + { + "nodeId": "501d31dee5331c632468a1b5349739b30cfd9f60413758a0bf11dde81689e6f5", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b32372c31302c3131322c3133382c34372c3232372c3230332c3234332c3234372c332c33372c3133362c38302c36392c39392c3230302c3230362c32392c33332c3230322c3130322c3136332c3137342c34362c3233302c3132362c36382c3132322c3130352c35362c3131322c31305d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c2273657175656e6365223a307d" + }, + { + "nodeId": "b18fc548c67874d9ffa852ee4955f3236115798b79c4f561c49dfde168e8d7dc", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b34332c3135372c382c39312c37302c3234372c37342c35362c3135322c35392c322c3233332c37342c33332c3230372c3139382c3134302c39392c3136392c3135372c34352c3139312c3234322c38382c3132372c3234342c33352c3233332c3139342c38342c3232332c34325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "1b0a708a2fe3cbf3f7032588504563c8ce1d21ca66a3ae2ee67e447a6938700a", + "basisHeadId": "501d31dee5331c632468a1b5349739b30cfd9f60413758a0bf11dde81689e6f5", + "startByte": 0, + "endByte": 4, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2231623061373038613266653363626633663730333235383835303435363363386365316432316361363661336165326565363765343437613639333837303061222c226261736973486561644964223a2235303164333164656535333331633633323436386131623533343937333962333063666439663630343133373538613062663131646465383136383965366635222c22737461727442797465223a302c22656e6442797465223a342c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "range-out-of-bounds", + "legacyErrorClass": "invalid-request", + "legacyMessage": "replace range 0..4 exceeds 3 bytes", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "start-inside-codepoint", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "4a19e71439b9a987507f00733b25f63abe5bc609eb5390a6908ea68b281298d4", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3133362c3130332c3231312c38362c3234362c34312c3135362c3130382c35302c3133332c3131382c3134362c39342c3136392c3137312c3138372c34362c3232342c36342c35362c3132362c3131382c3232392c3137312c302c3131332c3132302c3135382c3234392c3139372c3230362c3135375d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3235332c3233322c3232312c39382c34342c3231322c3133362c38372c3137302c38362c3137322c39372c3135342c31382c38322c3234362c38302c3134362c3231302c3137312c3232372c3136342c3131342c3131312c3130362c31352c3133302c3234372c332c3131382c3133382c3233365d2c22627974655f6c656e677468223a362c2275746631365f6c656e677468223a342c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3235332c3233322c3232312c39382c34342c3231322c3133362c38372c3137302c38362c3137322c39372c3135342c31382c38322c3234362c38302c3134362c3231302c3137312c3232372c3136342c3131342c3131312c3130362c31352c3133302c3234372c332c3131382c3133382c3233365d2c2273657175656e6365223a307d" + }, + { + "nodeId": "8867d356f6299c6c328576925ea9abbb2ee040387e76e5ab0071789ef9c5ce9d", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a2273746172742d696e736964652d636f6465706f696e74222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b37342c32352c3233312c32302c35372c3138352c3136392c3133352c38302c3132372c302c3131352c35392c33372c3234362c35382c3139302c39312c3139382c392c3233352c38332c3134342c3136362c3134342c3134322c3136362c3133392c34302c31382c3135322c3231325d2c2276657273696f6e223a307d" + }, + { + "nodeId": "ae2fcaae9f471f0bfcc5e1206f1340911c8290e9da837677c42fef4e0c2ef816", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3131372c3235302c3135392c3136352c3136372c3130342c38392c38332c3139382c302c3135312c3137302c3137362c332c3235302c38322c3132362c33392c342c3131312c3138362c3137382c372c3235322c3139362c39362c37332c31302c3131322c3139362c3130372c3230355d2c226279746573223a5b36352c3234302c3135392c3135322c3132382c36365d7d" + }, + { + "nodeId": "fde8dd622cd48857aa56ac619a1252f65092d2abe3a4726f6a0f82f703768aec", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3137342c34372c3230322c3137342c3135392c37312c33312c31312c3235322c3139372c3232352c33322c3131312c31392c36342c3134352c32382c3133302c3134342c3233332c3231382c3133312c3131382c3131392c3139362c34372c3233392c37382c31322c34362c3234382c32325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a362c2275746631365f6c656e677468223a342c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "8867d356f6299c6c328576925ea9abbb2ee040387e76e5ab0071789ef9c5ce9d", + "basisHeadId": "4a19e71439b9a987507f00733b25f63abe5bc609eb5390a6908ea68b281298d4", + "startByte": 2, + "endByte": 5, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2238383637643335366636323939633663333238353736393235656139616262623265653034303338376537366535616230303731373839656639633563653964222c226261736973486561644964223a2234613139653731343339623961393837353037663030373333623235663633616265356263363039656235333930613639303865613638623238313239386434222c22737461727442797465223a322c22656e6442797465223a352c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "utf8-boundary-invalid", + "legacyErrorClass": "invalid-request", + "legacyMessage": "replace offset splits a UTF-8 code point", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "end-inside-codepoint", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "0ae3aa9121f7ab1edaf9518539b19ab7012b14532c4632166eef4e1e8396f378", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a22656e642d696e736964652d636f6465706f696e74222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3232392c3233382c3130312c34342c36342c34352c38332c3234372c3139392c3232332c3233382c3235352c31362c372c35312c3136392c3131302c36392c38362c3135392c3233362c372c3136342c3132302c32332c34382c3135312c35362c3131302c31382c3233312c33395d2c2276657273696f6e223a307d" + }, + { + "nodeId": "ae2fcaae9f471f0bfcc5e1206f1340911c8290e9da837677c42fef4e0c2ef816", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3131372c3235302c3135392c3136352c3136372c3130342c38392c38332c3139382c302c3135312c3137302c3137362c332c3235302c38322c3132362c33392c342c3131312c3138362c3137382c372c3235322c3139362c39362c37332c31302c3131322c3139362c3130372c3230355d2c226279746573223a5b36352c3234302c3135392c3135322c3132382c36365d7d" + }, + { + "nodeId": "e5ee652c402d53f7c7dfeeff100733a96e45569fec07a478173097386e12e727", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b31302c3232372c3137302c3134352c33332c3234372c3137312c33302c3231382c3234392c38312c3133332c35372c3137372c3135342c3138332c312c34332c32302c38332c34342c37302c35302c32322c3131302c3233392c37382c33302c3133312c3135302c3234332c3132305d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3235332c3233322c3232312c39382c34342c3231322c3133362c38372c3137302c38362c3137322c39372c3135342c31382c38322c3234362c38302c3134362c3231302c3137312c3232372c3136342c3131342c3131312c3130362c31352c3133302c3234372c332c3131382c3133382c3233365d2c22627974655f6c656e677468223a362c2275746631365f6c656e677468223a342c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3235332c3233322c3232312c39382c34342c3231322c3133362c38372c3137302c38362c3137322c39372c3135342c31382c38322c3234362c38302c3134362c3231302c3137312c3232372c3136342c3131342c3131312c3130362c31352c3133302c3234372c332c3131382c3133382c3233365d2c2273657175656e6365223a307d" + }, + { + "nodeId": "fde8dd622cd48857aa56ac619a1252f65092d2abe3a4726f6a0f82f703768aec", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3137342c34372c3230322c3137342c3135392c37312c33312c31312c3235322c3139372c3232352c33322c3131312c31392c36342c3134352c32382c3133302c3134342c3233332c3231382c3133312c3131382c3131392c3139362c34372c3233392c37382c31322c34362c3234382c32325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a362c2275746631365f6c656e677468223a342c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "0ae3aa9121f7ab1edaf9518539b19ab7012b14532c4632166eef4e1e8396f378", + "basisHeadId": "e5ee652c402d53f7c7dfeeff100733a96e45569fec07a478173097386e12e727", + "startByte": 1, + "endByte": 4, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2230616533616139313231663761623165646166393531383533396231396162373031326231343533326334363332313636656566346531653833393666333738222c226261736973486561644964223a2265356565363532633430326435336637633764666565666631303037333361393665343535363966656330376134373831373330393733383665313265373237222c22737461727442797465223a312c22656e6442797465223a342c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "utf8-boundary-invalid", + "legacyErrorClass": "invalid-request", + "legacyMessage": "replace offset splits a UTF-8 code point", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "empty-range-inside-codepoint", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "ae2fcaae9f471f0bfcc5e1206f1340911c8290e9da837677c42fef4e0c2ef816", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3131372c3235302c3135392c3136352c3136372c3130342c38392c38332c3139382c302c3135312c3137302c3137362c332c3235302c38322c3132362c33392c342c3131312c3138362c3137382c372c3235322c3139362c39362c37332c31302c3131322c3139362c3130372c3230355d2c226279746573223a5b36352c3234302c3135392c3135322c3132382c36365d7d" + }, + { + "nodeId": "c23bc665e15fdeb2a38915d8bda0b9d5c67f63d34f2c243d16b1270d0ce73443", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a22656d7074792d72616e67652d696e736964652d636f6465706f696e74222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3231332c33382c3135332c37372c3132362c3135322c39362c3234302c31312c3231392c35342c33322c3138312c33362c3139362c3230322c3232362c3133352c3136302c39342c37342c34392c36342c3137322c3235332c32302c3132302c3230382c3135302c3138392c33362c3130365d2c2276657273696f6e223a307d" + }, + { + "nodeId": "d526994d7e9860f00bdb3620b524c4cae287a05e4a3140acfd1478d096bd246a", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3139342c35392c3139382c3130312c3232352c39352c3232322c3137382c3136332c3133372c32312c3231362c3138392c3136302c3138352c3231332c3139382c3132372c39392c3231312c37392c34342c33362c36312c32322c3137372c33392c31332c31322c3233312c35322c36375d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3235332c3233322c3232312c39382c34342c3231322c3133362c38372c3137302c38362c3137322c39372c3135342c31382c38322c3234362c38302c3134362c3231302c3137312c3232372c3136342c3131342c3131312c3130362c31352c3133302c3234372c332c3131382c3133382c3233365d2c22627974655f6c656e677468223a362c2275746631365f6c656e677468223a342c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3235332c3233322c3232312c39382c34342c3231322c3133362c38372c3137302c38362c3137322c39372c3135342c31382c38322c3234362c38302c3134362c3231302c3137312c3232372c3136342c3131342c3131312c3130362c31352c3133302c3234372c332c3131382c3133382c3233365d2c2273657175656e6365223a307d" + }, + { + "nodeId": "fde8dd622cd48857aa56ac619a1252f65092d2abe3a4726f6a0f82f703768aec", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3137342c34372c3230322c3137342c3135392c37312c33312c31312c3235322c3139372c3232352c33322c3131312c31392c36342c3134352c32382c3133302c3134342c3233332c3231382c3133312c3131382c3131392c3139362c34372c3233392c37382c31322c34362c3234382c32325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a362c2275746631365f6c656e677468223a342c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "c23bc665e15fdeb2a38915d8bda0b9d5c67f63d34f2c243d16b1270d0ce73443", + "basisHeadId": "d526994d7e9860f00bdb3620b524c4cae287a05e4a3140acfd1478d096bd246a", + "startByte": 2, + "endByte": 2, + "replacementUtf8Hex": "" + }, + "invocationBytesHex": "7b226275666665724964223a2263323362633636356531356664656232613338393135643862646130623964356336376636336433346632633234336431366231323730643063653733343433222c226261736973486561644964223a2264353236393934643765393836306630306264623336323062353234633463616532383761303565346133313430616366643134373864303936626432343661222c22737461727442797465223a322c22656e6442797465223a322c227265706c6163656d656e7455746638486578223a22227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "utf8-boundary-invalid", + "legacyErrorClass": "invalid-request", + "legacyMessage": "replace offset splits a UTF-8 code point", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "empty-no-op", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3233372c3139322c34362c3139322c3231332c3232312c36302c37302c3130372c3130332c3137342c3136322c3234312c32312c3131322c32362c332c3231332c3131312c39362c3134302c32392c3231302c33382c35342c3235352c3132382c3135362c3230352c32312c3131362c3135345d2c226279746573223a5b39372c39382c39395d7d" + }, + { + "nodeId": "58f691d61290cc43def016c286a77a43cbdff4910e58516c14ebf4876c61026e", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3231332c33362c37382c3135342c3233372c3139332c3131302c3230322c38332c38322c3133352c3231342c33302c38322c33382c3233382c38352c3139332c3139372c3233342c39362c3230342c3139352c3231302c302c3130372c35342c32322c3131302c3138352c39392c34345d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c2273657175656e6365223a307d" + }, + { + "nodeId": "b18fc548c67874d9ffa852ee4955f3236115798b79c4f561c49dfde168e8d7dc", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b34332c3135372c382c39312c37302c3234372c37342c35362c3135322c35392c322c3233332c37342c33332c3230372c3139382c3134302c39392c3136392c3135372c34352c3139312c3234322c38382c3132372c3234342c33352c3233332c3139342c38342c3232332c34325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "d5244e9aedc16eca535287d61e5226ee55c1c5ea60ccc3d2006b36166eb9632c", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a22656d7074792d6e6f2d6f70222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b38382c3234362c3134352c3231342c31382c3134342c3230342c36372c3232322c3234302c32322c3139342c3133342c3136372c3132322c36372c3230332c3232332c3234342c3134352c31342c38382c38312c3130382c32302c3233352c3234342c3133352c3130382c39372c322c3131305d2c2276657273696f6e223a307d" + } + ], + "invocation": { + "bufferId": "d5244e9aedc16eca535287d61e5226ee55c1c5ea60ccc3d2006b36166eb9632c", + "basisHeadId": "58f691d61290cc43def016c286a77a43cbdff4910e58516c14ebf4876c61026e", + "startByte": 1, + "endByte": 1, + "replacementUtf8Hex": "" + }, + "invocationBytesHex": "7b226275666665724964223a2264353234346539616564633136656361353335323837643631653532323665653535633163356561363063636333643230303662333631363665623936333263222c226261736973486561644964223a2235386636393164363132393063633433646566303136633238366137376134336362646666343931306535383531366331346562663438373663363130323665222c22737461727442797465223a312c22656e6442797465223a312c227265706c6163656d656e7455746638486578223a22227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "no-op", + "legacyErrorClass": "invalid-request", + "legacyMessage": "replace range is a no-op", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "identical-no-op", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3233372c3139322c34362c3139322c3231332c3232312c36302c37302c3130372c3130332c3137342c3136322c3234312c32312c3131322c32362c332c3231332c3131312c39362c3134302c32392c3231302c33382c35342c3235352c3132382c3135362c3230352c32312c3131362c3135345d2c226279746573223a5b39372c39382c39395d7d" + }, + { + "nodeId": "4bca4c37d1c349e181939b1e3b9dac5d8077106806d1371ffb418e9ee07abe20", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3132392c33332c36352c32392c3234382c3134332c392c32382c3233322c3134332c3130372c3137352c3132332c3130362c3235352c35392c39362c37372c372c39342c37392c3132312c3134392c3136332c37362c3136372c392c382c38342c34372c342c3132335d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c2273657175656e6365223a307d" + }, + { + "nodeId": "8121411df88f091ce88f6baf7b6aff3b604d075e4f7995a34ca70908542f047b", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226964656e746963616c2d6e6f2d6f70222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b37352c3230322c37362c35352c3230392c3139352c37332c3232352c3132392c3134372c3135352c33302c35392c3135372c3137322c39332c3132382c3131392c31362c3130342c362c3230392c35352c33312c3235312c36352c3134322c3135382c3232342c3132322c3139302c33325d2c2276657273696f6e223a307d" + }, + { + "nodeId": "b18fc548c67874d9ffa852ee4955f3236115798b79c4f561c49dfde168e8d7dc", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b34332c3135372c382c39312c37302c3234372c37342c35362c3135322c35392c322c3233332c37342c33332c3230372c3139382c3134302c39392c3136392c3135372c34352c3139312c3234322c38382c3132372c3234342c33352c3233332c3139342c38342c3232332c34325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "8121411df88f091ce88f6baf7b6aff3b604d075e4f7995a34ca70908542f047b", + "basisHeadId": "4bca4c37d1c349e181939b1e3b9dac5d8077106806d1371ffb418e9ee07abe20", + "startByte": 0, + "endByte": 3, + "replacementUtf8Hex": "616263" + }, + "invocationBytesHex": "7b226275666665724964223a2238313231343131646638386630393163653838663662616637623661666633623630346430373565346637393935613334636137303930383534326630343762222c226261736973486561644964223a2234626361346333376431633334396531383139333962316533623964616335643830373731303638303664313337316666623431386539656530376162653230222c22737461727442797465223a302c22656e6442797465223a332c227265706c6163656d656e7455746638486578223a22363136323633227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "no-op", + "legacyErrorClass": "invalid-request", + "legacyMessage": "replace range is a no-op", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "stale-basis", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "1520e6699245a445b3aa9d319e9da8dcb7f5be63289bf249972e84dfc2ae462d", + "typeId": "c30835603fa3940cf7845d961d0e41d338c40fea99698639dfc155117465943a", + "attachmentBytesHex": "7b226275666665725f6964223a5b3136382c3230322c3132332c3133312c39392c3133372c3133322c39342c37362c3231322c3139312c33342c3232372c37372c33352c3133302c33362c302c3139392c3233332c34312c3233392c3138362c36342c36372c35352c3133342c37302c35342c302c39302c33385d2c2262617369735f686561645f6964223a5b3134392c3230372c3132352c32342c3234372c3131312c38342c3134362c38342c33342c3135382c33382c32372c3135382c3135342c3130372c3233342c37392c3235352c3134342c3130332c3132312c34322c39332c3230342c3235312c3135322c32322c3139312c3235332c3137302c3133305d2c226e6578745f686561645f6964223a5b3131352c3134342c3133372c39372c3134342c3135302c3132302c3139352c39342c35392c3137372c35302c3233352c3137352c3137392c3233322c3134312c3136322c34382c382c39332c37332c3134322c3233352c3132392c36302c36332c38372c3139342c3131322c3132312c3135305d2c2273746172745f62797465223a302c22656e645f62797465223a302c22696e7365727465645f627974655f6c656e677468223a367d" + }, + { + "nodeId": "27f8f8c5f95e4a7c2e778b2a00ad90659685d759ec471b3e03084274a3e695ae", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3233302c3130392c3131392c36312c3138352c32302c3233322c37362c3137332c36372c34342c3130382c3139392c37342c3233352c3139392c3231342c3139322c3133302c3133382c3134322c3235302c36352c35362c3233362c3233392c35362c3134392c34372c3139332c33342c3234315d2c226279746573223a5b3130322c3131342c3130312c3131352c3130342c34355d7d" + }, + { + "nodeId": "2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3233372c3139322c34362c3139322c3231332c3232312c36302c37302c3130372c3130332c3137342c3136322c3234312c32312c3131322c32362c332c3231332c3131312c39362c3134302c32392c3231302c33382c35342c3235352c3132382c3135362c3230352c32312c3131362c3135345d2c226279746573223a5b39372c39382c39395d7d" + }, + { + "nodeId": "5c3a4a12e2d1fc419246771bd6535b786ceb137953c2feab9c0016fac5b6ed2e", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3234302c38362c3139342c3139372c33352c3139372c31352c3136372c3133312c37322c3233332c36362c3139332c3234382c3131382c3136382c33342c3135362c33392c3130332c3134342c35302c3136362c36372c3233332c37312c38382c3135302c39332c39342c39382c365d2c227269676874223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c22627974655f6c656e677468223a392c2275746631365f6c656e677468223a392c226c696e655f627265616b73223a302c22686569676874223a327d" + }, + { + "nodeId": "73908961909678c35e3bb132ebafb3e88da230085d498eeb813c3f57c2707996", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3136382c3230322c3132332c3133312c39392c3133372c3133322c39342c37362c3231322c3139312c33342c3232372c37372c33352c3133302c33362c302c3139392c3233332c34312c3233392c3138362c36342c36372c35352c3133342c37302c35342c302c39302c33385d2c2262617369735f686561645f6964223a5b3134392c3230372c3132352c32342c3234372c3131312c38342c3134362c38342c33342c3135382c33382c32372c3135382c3135342c3130372c3233342c37392c3235352c3134342c3130332c3132312c34322c39332c3230342c3235312c3135322c32322c3139312c3235332c3137302c3133305d2c22726f6f745f6e6f64655f6964223a5b39322c35382c37342c31382c3232362c3230392c3235322c36352c3134362c37302c3131392c32372c3231342c38332c39312c3132302c3130382c3233352c31392c3132312c38332c3139342c3235342c3137312c3135362c302c32322c3235302c3139372c3138322c3233372c34365d2c22627974655f6c656e677468223a392c2275746631365f6c656e677468223a392c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b39322c35382c37342c31382c3232362c3230392c3235322c36352c3134362c37302c3131392c32372c3231342c38332c39312c3132302c3130382c3233352c31392c3132312c38332c3139342c3235342c3137312c3135362c302c32322c3235302c3139372c3138322c3233372c34365d2c2273657175656e6365223a317d" + }, + { + "nodeId": "95cf7d18f76f549254229e261b9e9a6bea4fff9067792a5dccfb9816bffdaa82", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3136382c3230322c3132332c3133312c39392c3133372c3133322c39342c37362c3231322c3139312c33342c3232372c37372c33352c3133302c33362c302c3139392c3233332c34312c3233392c3138362c36342c36372c35352c3133342c37302c35342c302c39302c33385d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c2273657175656e6365223a307d" + }, + { + "nodeId": "a015c99476489617aa0cd77dec3f9186d3b32024de982cf0e219728c10fc0233", + "typeId": "d5ed88f6007b97cda5106fc3548d6252f164bd86b18f6b41d22e7c6a72f21ccd", + "attachmentBytesHex": "7b22726577726974655f6964223a5b32312c33322c3233302c3130352c3134362c36392c3136342c36392c3137392c3137302c3135372c34392c3135382c3135372c3136382c3232302c3138332c3234352c3139302c39392c34302c3135352c3234322c37332c3135312c34362c3133322c3232332c3139342c3137342c37302c34355d2c2262617369735f686561645f6964223a5b3134392c3230372c3132352c32342c3234372c3131312c38342c3134362c38342c33342c3135382c33382c32372c3135382c3135342c3130372c3233342c37392c3235352c3134342c3130332c3132312c34322c39332c3230342c3235312c3135322c32322c3139312c3235332c3137302c3133305d2c226e6578745f686561645f6964223a5b3131352c3134342c3133372c39372c3134342c3135302c3132302c3139352c39342c35392c3137372c35302c3233352c3137352c3137392c3233322c3134312c3136322c34382c382c39332c37332c3134322c3233352c3132392c36302c36332c38372c3139342c3131322c3132312c3135305d2c2273746172745f62797465223a302c22656e645f62797465223a302c22696e7365727465645f627974655f6c656e677468223a362c2264656c657465645f627974655f6c656e677468223a307d" + }, + { + "nodeId": "a8ca7b836389845e4cd4bf22e34d23822400c7e929efba404337864636005a26", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a227374616c652d6261736973222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3131352c3134342c3133372c39372c3134342c3135302c3132302c3139352c39342c35392c3137372c35302c3233352c3137352c3137392c3233322c3134312c3136322c34382c382c39332c37332c3134322c3233352c3132392c36302c36332c38372c3139342c3131322c3132312c3135305d2c2276657273696f6e223a317d" + }, + { + "nodeId": "b18fc548c67874d9ffa852ee4955f3236115798b79c4f561c49dfde168e8d7dc", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b34332c3135372c382c39312c37302c3234372c37342c35362c3135322c35392c322c3233332c37342c33332c3230372c3139382c3134302c39392c3136392c3135372c34352c3139312c3234322c38382c3132372c3234342c33352c3233332c3139342c38342c3232332c34325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "f056c2c523c50fa78348e942c1f876a8229c27679032a643e94758965d5e6206", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b33392c3234382c3234382c3139372c3234392c39342c37342c3132342c34362c3131392c3133392c34322c302c3137332c3134342c3130312c3135302c3133332c3231352c38392c3233362c37312c32372c36322c332c382c36362c3131362c3136332c3233302c3134392c3137345d2c22627974655f7374617274223a302c22627974655f6c656e677468223a362c2275746631365f6c656e677468223a362c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "a8ca7b836389845e4cd4bf22e34d23822400c7e929efba404337864636005a26", + "basisHeadId": "95cf7d18f76f549254229e261b9e9a6bea4fff9067792a5dccfb9816bffdaa82", + "startByte": 0, + "endByte": 1, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2261386361376238333633383938343565346364346266323265333464323338323234303063376539323965666261343034333337383634363336303035613236222c226261736973486561644964223a2239356366376431386637366635343932353432323965323631623965396136626561346666663930363737393261356463636662393831366266666461613832222c22737461727442797465223a302c22656e6442797465223a312c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "basis-not-canonical", + "legacyErrorClass": "invalid-request", + "legacyMessage": "stale replace basis 95cf7d18f76f549254229e261b9e9a6bea4fff9067792a5dccfb9816bffdaa82; canonical head is 73908961909678c35e3bb132ebafb3e88da230085d498eeb813c3f57c2707996", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "foreign-basis", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3233372c3139322c34362c3139322c3231332c3232312c36302c37302c3130372c3130332c3137342c3136322c3234312c32312c3131322c32362c332c3231332c3131312c39362c3134302c32392c3231302c33382c35342c3235352c3132382c3135362c3230352c32312c3131362c3135345d2c226279746573223a5b39372c39382c39395d7d" + }, + { + "nodeId": "3a95caa4f8246e57b24eb9e483fdf7e2d856325e70872d4b340cae2d8b0487f2", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3233382c33312c32392c35362c3139382c36372c3233332c3134382c3135332c3230352c3139312c3234392c37342c3139312c39302c3132342c3130352c37392c3234312c3130362c3231322c3139392c35322c3134382c3138392c3131302c3138352c35392c3130302c3133362c3137362c365d2c226279746573223a5b3130322c3131312c3131342c3130312c3130352c3130332c3131305d7d" + }, + { + "nodeId": "69a53646567e20cd6b98932a656fe26bacf1173b75dd149ed51bc289536e5ec0", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3138352c3233382c3137332c37342c3233312c3130302c3135302c3234312c3135302c3138312c3134332c3136382c3136302c3234392c34312c3130362c3139382c3131342c33312c3135342c3137372c3139362c35382c33332c3133372c38392c3232362c3131302c3132362c3131312c39372c37395d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c2273657175656e6365223a307d" + }, + { + "nodeId": "a4dd16ed3056cdd04cf10f275a5e51a848a20a332b3e4a85e9e97ac21c306f47", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a22666f726569676e2d62617369732d666f726569676e222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3137332c36322c3131342c3133392c36352c33382c31392c31302c3234312c3231382c3234352c3232362c3135382c31382c3130392c3133362c3232342c3137302c3135372c3230302c3230392c3235302c3138312c3131382c3137372c3130372c3234382c3132362c3137342c3130392c3136322c3135325d2c2276657273696f6e223a307d" + }, + { + "nodeId": "ad3e728b4126130af1daf5e29e126d88e0aa9dc8d1fab576b16bf87eae6da298", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3136342c3232312c32322c3233372c34382c38362c3230352c3230382c37362c3234312c31352c33392c39302c39342c38312c3136382c37322c3136322c31302c35312c34332c36322c37342c3133332c3233332c3233332c3132322c3139342c32382c34382c3131312c37315d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3233332c37342c3136332c3132372c3136342c3132322c37352c35362c3136312c36352c3133312c3132322c37322c3136382c36392c37322c3133392c322c3139302c3135322c3138352c3232362c39332c3230342c39362c39372c3138332c3139352c3134332c3130392c3132322c3231385d2c22627974655f6c656e677468223a372c2275746631365f6c656e677468223a372c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3233332c37342c3136332c3132372c3136342c3132322c37352c35362c3136312c36352c3133312c3132322c37322c3136382c36392c37322c3133392c322c3139302c3135322c3138352c3232362c39332c3230342c39362c39372c3138332c3139352c3134332c3130392c3132322c3231385d2c2273657175656e6365223a307d" + }, + { + "nodeId": "b18fc548c67874d9ffa852ee4955f3236115798b79c4f561c49dfde168e8d7dc", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b34332c3135372c382c39312c37302c3234372c37342c35362c3135322c35392c322c3233332c37342c33332c3230372c3139382c3134302c39392c3136392c3135372c34352c3139312c3234322c38382c3132372c3234342c33352c3233332c3139342c38342c3232332c34325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "b9eead4ae76496f196b58fa8a0f9296ac6721f9ab1c43a218959e26e7e6f614f", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a22666f726569676e2d6261736973222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3130352c3136352c35342c37302c38362c3132362c33322c3230352c3130372c3135322c3134372c34322c3130312c3131312c3232362c3130372c3137322c3234312c32332c35392c3131372c3232312c32302c3135382c3231332c32372c3139342c3133372c38332c3131302c39342c3139325d2c2276657273696f6e223a307d" + }, + { + "nodeId": "e94aa37fa47a4b38a141837a48a845488b02be98b9e25dcc6061b7c38f6d7ada", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b35382c3134392c3230322c3136342c3234382c33362c3131302c38372c3137382c37382c3138352c3232382c3133312c3235332c3234372c3232362c3231362c38362c35302c39342c3131322c3133352c34352c37352c35322c31322c3137342c34352c3133392c342c3133352c3234325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a372c2275746631365f6c656e677468223a372c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "b9eead4ae76496f196b58fa8a0f9296ac6721f9ab1c43a218959e26e7e6f614f", + "basisHeadId": "ad3e728b4126130af1daf5e29e126d88e0aa9dc8d1fab576b16bf87eae6da298", + "startByte": 0, + "endByte": 1, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2262396565616434616537363439366631393662353866613861306639323936616336373231663961623163343361323138393539653236653765366636313466222c226261736973486561644964223a2261643365373238623431323631333061663164616635653239653132366438386530616139646338643166616235373662313662663837656165366461323938222c22737461727442797465223a302c22656e6442797465223a312c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "basis-not-canonical", + "legacyErrorClass": "invalid-request", + "legacyMessage": "stale replace basis ad3e728b4126130af1daf5e29e126d88e0aa9dc8d1fab576b16bf87eae6da298; canonical head is 69a53646567e20cd6b98932a656fe26bacf1173b75dd149ed51bc289536e5ec0", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "head-sequence-overflow", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "28cf20c879207dc9af92107a1391fcf23f1aaeb3904f14464a7f197d81f80c5e", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3131342c36312c3231332c3233392c3139342c3231332c31392c3233382c38382c3136352c3136322c37352c37342c3231322c3233382c3135322c3130362c3230342c3132342c3134312c36352c3135332c3135362c33322c31362c3133362c3230372c37382c33312c38322c3132392c3131345d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c2273657175656e6365223a307d" + }, + { + "nodeId": "2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3233372c3139322c34362c3139322c3231332c3232312c36302c37302c3130372c3130332c3137342c3136322c3234312c32312c3131322c32362c332c3231332c3131312c39362c3134302c32392c3231302c33382c35342c3235352c3132382c3135362c3230352c32312c3131362c3135345d2c226279746573223a5b39372c39382c39395d7d" + }, + { + "nodeId": "612841a7b66c7c7f3e954bffe99bc096b6ea554d0fc5ca42ed2a85c36415fa36", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3131342c36312c3231332c3233392c3139342c3231332c31392c3233382c38382c3136352c3136322c37352c37342c3231322c3233382c3135322c3130362c3230342c3132342c3134312c36352c3135332c3135362c33322c31362c3133362c3230372c37382c33312c38322c3132392c3131345d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c2273657175656e6365223a31383434363734343037333730393535313631357d" + }, + { + "nodeId": "723dd5efc2d513ee58a5a24b4ad4ee986acc7c8d41999c201088cf4e1f528172", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a22686561642d73657175656e63652d6f766572666c6f77222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b39372c34302c36352c3136372c3138322c3130382c3132342c3132372c36322c3134392c37352c3235352c3233332c3135352c3139322c3135302c3138322c3233342c38352c37372c31352c3139372c3230322c36362c3233372c34322c3133332c3139352c3130302c32312c3235302c35345d2c2276657273696f6e223a307d" + }, + { + "nodeId": "b18fc548c67874d9ffa852ee4955f3236115798b79c4f561c49dfde168e8d7dc", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b34332c3135372c382c39312c37302c3234372c37342c35362c3135322c35392c322c3233332c37342c33332c3230372c3139382c3134302c39392c3136392c3135372c34352c3139312c3234322c38382c3132372c3234342c33352c3233332c3139342c38342c3232332c34325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "723dd5efc2d513ee58a5a24b4ad4ee986acc7c8d41999c201088cf4e1f528172", + "basisHeadId": "612841a7b66c7c7f3e954bffe99bc096b6ea554d0fc5ca42ed2a85c36415fa36", + "startByte": 0, + "endByte": 1, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2237323364643565666332643531336565353861356132346234616434656539383661636337633864343139393963323031303838636634653166353238313732222c226261736973486561644964223a2236313238343161376236366337633766336539353462666665393962633039366236656135353464306663356361343265643261383563333634313566613336222c22737461727442797465223a302c22656e6442797465223a312c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "arithmetic-overflow", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "head sequence overflow", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "buffer-version-overflow", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "033a23c64d304b2f3891322139a0e85b380db4614aaf14218e4343f2b7d8c74b", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3132312c382c3235332c3230382c32342c3130312c3130382c39332c372c3132312c3130382c37312c3131392c342c3139312c34382c3232322c3233302c38342c32372c3234342c3230392c37312c3130362c3139332c3130312c3132372c3138392c3139382c34382c35372c35365d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c2273657175656e6365223a307d" + }, + { + "nodeId": "2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3233372c3139322c34362c3139322c3231332c3232312c36302c37302c3130372c3130332c3137342c3136322c3234312c32312c3131322c32362c332c3231332c3131312c39362c3134302c32392c3231302c33382c35342c3235352c3132382c3135362c3230352c32312c3131362c3135345d2c226279746573223a5b39372c39382c39395d7d" + }, + { + "nodeId": "7908fdd018656c5d07796c477704bf30dee6541bf4d1476ac1657fbdc6303938", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226275666665722d76657273696f6e2d6f766572666c6f77222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b332c35382c33352c3139382c37372c34382c37352c34372c35362c3134352c35302c33332c35372c3136302c3233322c39312c35362c31332c3138302c39372c37342c3137352c32302c33332c3134322c36372c36372c3234322c3138332c3231362c3139392c37355d2c2276657273696f6e223a31383434363734343037333730393535313631357d" + }, + { + "nodeId": "b18fc548c67874d9ffa852ee4955f3236115798b79c4f561c49dfde168e8d7dc", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b34332c3135372c382c39312c37302c3234372c37342c35362c3135322c35392c322c3233332c37342c33332c3230372c3139382c3134302c39392c3136392c3135372c34352c3139312c3234322c38382c3132372c3234342c33352c3233332c3139342c38342c3232332c34325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "7908fdd018656c5d07796c477704bf30dee6541bf4d1476ac1657fbdc6303938", + "basisHeadId": "033a23c64d304b2f3891322139a0e85b380db4614aaf14218e4343f2b7d8c74b", + "startByte": 0, + "endByte": 1, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2237393038666464303138363536633564303737393663343737373034626633306465653635343162663464313437366163313635376662646336333033393338222c226261736973486561644964223a2230333361323363363464333034623266333839313332323133396130653835623338306462343631346161663134323138653433343366326237643863373462222c22737461727442797465223a302c22656e6442797465223a312c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "arithmetic-overflow", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "buffer version overflow", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "missing-buffer", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [], + "invocation": { + "bufferId": "1111111111111111111111111111111111111111111111111111111111111111", + "basisHeadId": "2222222222222222222222222222222222222222222222222222222222222222", + "startByte": 0, + "endByte": 0, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2231313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131222c226261736973486561644964223a2232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232222c22737461727442797465223a302c22656e6442797465223a302c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "fact-missing", + "legacyErrorClass": "missing-fact", + "legacyMessage": "jedit.text.BufferWorldline.v1 at 1111111111111111111111111111111111111111111111111111111111111111", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "malformed-buffer", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "0f59b7794cb8d181317b2ac66564c34c7b246590a3082b3dd8b03869618b4260", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b34302c3230302c3230382c3234312c3136382c3137312c3234342c3130372c39312c38382c33332c3232342c3134372c3231352c38362c36332c3233332c31322c3232342c36362c3133322c3134332c34322c3231312c32312c33352c3234322c3230312c36352c31302c3232302c3130315d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c2273657175656e6365223a307d" + }, + { + "nodeId": "28c8d0f1a8abf46b5b5821e093d7563fe90ce042848f2ad31523f2c9410adc65", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b" + }, + { + "nodeId": "2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3233372c3139322c34362c3139322c3231332c3232312c36302c37302c3130372c3130332c3137342c3136322c3234312c32312c3131322c32362c332c3231332c3131312c39362c3134302c32392c3231302c33382c35342c3235352c3132382c3135362c3230352c32312c3131362c3135345d2c226279746573223a5b39372c39382c39395d7d" + }, + { + "nodeId": "b18fc548c67874d9ffa852ee4955f3236115798b79c4f561c49dfde168e8d7dc", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b34332c3135372c382c39312c37302c3234372c37342c35362c3135322c35392c322c3233332c37342c33332c3230372c3139382c3134302c39392c3136392c3135372c34352c3139312c3234322c38382c3132372c3234342c33352c3233332c3139342c38342c3232332c34325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "28c8d0f1a8abf46b5b5821e093d7563fe90ce042848f2ad31523f2c9410adc65", + "basisHeadId": "0f59b7794cb8d181317b2ac66564c34c7b246590a3082b3dd8b03869618b4260", + "startByte": 0, + "endByte": 1, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2232386338643066316138616266343662356235383231653039336437353633666539306365303432383438663261643331353233663263393431306164633635222c226261736973486561644964223a2230663539623737393463623864313831333137623261633636353634633334633762323436353930613330383262336464386230333836393631386234323630222c22737461727442797465223a302c22656e6442797465223a312c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "fact-malformed", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "decode jedit.text.BufferWorldline.v1: EOF while parsing an object at line 1 column 1", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "bad-blob-content-hash", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b302c302c302c302c302c302c302c302c302c302c302c302c302c302c302c302c302c302c302c302c302c302c302c302c302c302c302c302c302c302c302c305d2c226279746573223a5b39372c39382c39395d7d" + }, + { + "nodeId": "555827b7604632ae760278902bac577e66c4175e252c75b62b2978bbc8a3897d", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226261642d626c6f622d636f6e74656e742d68617368222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3231362c3135322c3133302c35342c3132362c3231372c3133312c3132362c3137382c3131322c372c3133322c3134382c38392c32352c31322c3138362c3230352c342c362c3133342c31342c3139372c3131392c32342c3230372c3234352c3135332c34302c3137302c3137362c34315d2c2276657273696f6e223a307d" + }, + { + "nodeId": "b18fc548c67874d9ffa852ee4955f3236115798b79c4f561c49dfde168e8d7dc", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b34332c3135372c382c39312c37302c3234372c37342c35362c3135322c35392c322c3233332c37342c33332c3230372c3139382c3134302c39392c3136392c3135372c34352c3139312c3234322c38382c3132372c3234342c33352c3233332c3139342c38342c3232332c34325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "d89882367ed9837eb27007849459190cbacd0406860ec57718cff59928aab029", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b38352c38382c33392c3138332c39362c37302c35302c3137342c3131382c322c3132302c3134342c34332c3137322c38372c3132362c3130322c3139362c32332c39342c33372c34342c3131372c3138322c34332c34312c3132302c3138372c3230302c3136332c3133372c3132355d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c2273657175656e6365223a307d" + } + ], + "invocation": { + "bufferId": "555827b7604632ae760278902bac577e66c4175e252c75b62b2978bbc8a3897d", + "basisHeadId": "d89882367ed9837eb27007849459190cbacd0406860ec57718cff59928aab029", + "startByte": 0, + "endByte": 1, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2235353538323762373630343633326165373630323738393032626163353737653636633431373565323532633735623632623239373862626338613338393764222c226261736973486561644964223a2264383938383233363765643938333765623237303037383439343539313930636261636430343036383630656335373731386366663539393238616162303239222c22737461727442797465223a302c22656e6442797465223a312c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "content-identity-mismatch", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "blob 2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a content hash does not match", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "branch-extent-mismatch-at-zero", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "0f76680ce34f9521ee4701b6e69fe8b10f430e61aa9b40dcc2d32168d5a11dc1", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b35392c332c33392c37332c33332c3132322c3135302c3132372c382c38332c37392c31302c3133332c3232372c3233352c31342c3137342c3232302c35332c3233322c3235312c39332c3136342c3134302c3132302c3137372c3233352c32342c3132382c35322c34372c39305d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3230332c35362c3233362c3139322c382c3137362c362c38312c3230332c3233372c3133372c35392c3132322c38342c38362c3134362c3137322c3136392c32382c3132342c3136352c37362c3136362c37382c3233352c3133392c36362c3132392c3132342c38372c3132302c33345d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3230332c35362c3233362c3139322c382c3137362c362c38312c3230332c3233372c3133372c35392c3132322c38342c38362c3134362c3137322c3136392c32382c3132342c3136352c37362c3136362c37382c3233352c3133392c36362c3132392c3132342c38372c3132302c33345d2c2273657175656e6365223a307d" + }, + { + "nodeId": "3b032749217a967f08534f0a85e3eb0eaedc35e8fb5da48c78b1eb1880342f5a", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226272616e63682d657874656e742d6d69736d617463682d61742d7a65726f222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3232382c35352c3137332c3134392c3230392c3233302c37382c3130342c37322c3132352c3134362c39362c37352c3138362c39322c3131362c3130392c36342c3233302c3234392c3130302c3138382c3136392c37372c34372c37342c3136362c3139392c3134342c3231362c33342c33345d2c2276657273696f6e223a307d" + }, + { + "nodeId": "4d197711c188115df4eb1268a70574a93f16a2127a178a4e3cd1c99a76c5f043", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b37302c3131302c39362c3234382c39382c3135302c35362c37372c31302c34392c3233342c3232342c33372c3139322c34322c34362c36362c3130342c33332c3231362c32342c3135352c34362c302c3130322c3137382c3231392c3230392c3234362c31332c38372c34315d2c226279746573223a5b39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39375d7d" + }, + { + "nodeId": "87bc414f79ec6ff8431cb551c434f17f9ea1959d63892ed83cc018341b497617", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3232372c3232332c31372c37332c35382c3138382c3137362c38392c35362c32362c3230332c3133372c37312c3138312c31382c3235342c3232322c34322c3136392c39352c3139312c3137372c312c3137372c3230392c39382c3134302c3133372c3230302c32332c3235312c3132395d2c226279746573223a5b39385d7d" + }, + { + "nodeId": "89d138e87e58cce6c0c8362e4924c259f45dd8811bc03fda8625e96244cf6e83", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b37372c32352c3131392c31372c3139332c3133362c31372c39332c3234342c3233352c31382c3130342c3136372c352c3131362c3136392c36332c32322c3136322c31382c3132322c32332c3133382c37382c36302c3230392c3230312c3135342c3131382c3139372c3234302c36375d2c22627974655f7374617274223a302c22627974655f6c656e677468223a343039362c2275746631365f6c656e677468223a343039362c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "8da3c1b53b66fea09ac5151a6f37310e71f930d0300fecb092718df6df700475", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3133352c3138382c36352c37392c3132312c3233362c3131312c3234382c36372c32382c3138312c38312c3139362c35322c3234312c3132372c3135382c3136312c3134392c3135372c39392c3133372c34362c3231362c36302c3139322c32342c35322c32372c37332c3131382c32335d2c22627974655f7374617274223a302c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "9ca89f9147d9fe652d61397586142ef8a5574d9cee73190dcec52d3063fef6a5", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3133372c3230392c35362c3233322c3132362c38382c3230342c3233302c3139322c3230302c35342c34362c37332c33362c3139342c38392c3234342c39332c3231362c3132392c32372c3139322c36332c3231382c3133342c33372c3233332c39382c36382c3230372c3131302c3133315d2c227269676874223a5b3134312c3136332c3139332c3138312c35392c3130322c3235342c3136302c3135342c3139372c32312c32362c3131312c35352c34392c31342c3131332c3234392c34382c3230382c34382c31352c3233362c3137362c3134362c3131332c3134312c3234362c3232332c3131322c342c3131375d2c22627974655f6c656e677468223a343039382c2275746631365f6c656e677468223a343039372c226c696e655f627265616b73223a302c22686569676874223a327d" + }, + { + "nodeId": "cb38ecc008b00651cbed893b7a545692aca91c7ca54ca64eeb8b42817c577822", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3133372c3230392c35362c3233322c3132362c38382c3230342c3233302c3139322c3230302c35342c34362c37332c33362c3139342c38392c3234342c39332c3231362c3132392c32372c3139322c36332c3231382c3133342c33372c3233332c39382c36382c3230372c3131302c3133315d2c227269676874223a5b3134312c3136332c3139332c3138312c35392c3130322c3235342c3136302c3135342c3139372c32312c32362c3131312c35352c34392c31342c3131332c3234392c34382c3230382c34382c31352c3233362c3137362c3134362c3131332c3134312c3234362c3232332c3131322c342c3131375d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f627265616b73223a302c22686569676874223a327d" + }, + { + "nodeId": "e437ad95d1e64e68487d92604bba5c746d40e6f964bca94d2f4aa6c790d82222", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b35392c332c33392c37332c33332c3132322c3135302c3132372c382c38332c37392c31302c3133332c3232372c3233352c31342c3137342c3232302c35332c3233322c3235312c39332c3136342c3134302c3132302c3137372c3233352c32342c3132382c35322c34372c39305d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3135362c3136382c3135392c3134352c37312c3231372c3235342c3130312c34352c39372c35372c3131372c3133342c32302c34362c3234382c3136352c38372c37372c3135362c3233382c3131352c32352c31332c3230362c3139372c34352c34382c39392c3235342c3234362c3136355d2c22627974655f6c656e677468223a343039382c2275746631365f6c656e677468223a343039372c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3135362c3136382c3135392c3134352c37312c3231372c3235342c3130312c34352c39372c35372c3131372c3133342c32302c34362c3234382c3136352c38372c37372c3135362c3233382c3131352c32352c31332c3230362c3139372c34352c34382c39392c3235342c3234362c3136355d2c2273657175656e6365223a307d" + } + ], + "invocation": { + "bufferId": "3b032749217a967f08534f0a85e3eb0eaedc35e8fb5da48c78b1eb1880342f5a", + "basisHeadId": "e437ad95d1e64e68487d92604bba5c746d40e6f964bca94d2f4aa6c790d82222", + "startByte": 0, + "endByte": 0, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2233623033323734393231376139363766303835333466306138356533656230656165646333356538666235646134386337386231656231383830333432663561222c226261736973486561644964223a2265343337616439356431653634653638343837643932363034626261356337343664343065366639363462636139346432663461613663373930643832323232222c22737461727442797465223a302c22656e6442797465223a302c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "fact-malformed", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "branch byte length does not match children at 9ca89f9147d9fe652d61397586142ef8a5574d9cee73190dcec52d3063fef6a5", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "branch-extent-mismatch-at-exact-end", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "4d197711c188115df4eb1268a70574a93f16a2127a178a4e3cd1c99a76c5f043", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b37302c3131302c39362c3234382c39382c3135302c35362c37372c31302c34392c3233342c3232342c33372c3139322c34322c34362c36362c3130342c33332c3231362c32342c3135352c34362c302c3130322c3137382c3231392c3230392c3234362c31332c38372c34315d2c226279746573223a5b39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39375d7d" + }, + { + "nodeId": "642ad59a5cfda243e926c1c0944a639ac3b3cdd0f09d5b25f176f238b2fb89e2", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3131342c33332c3134322c3231382c3135322c39362c3231332c3132342c3230352c33382c38312c3231372c3133332c38352c3230362c3133322c34392c3233382c302c3137382c37342c3135362c3133342c3137362c3138322c3132392c35322c34342c31332c37312c3235302c385d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3135362c3136382c3135392c3134352c37312c3231372c3235342c3130312c34352c39372c35372c3131372c3133342c32302c34362c3234382c3136352c38372c37372c3135362c3233382c3131352c32352c31332c3230362c3139372c34352c34382c39392c3235342c3234362c3136355d2c22627974655f6c656e677468223a343039382c2275746631365f6c656e677468223a343039372c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3135362c3136382c3135392c3134352c37312c3231372c3235342c3130312c34352c39372c35372c3131372c3133342c32302c34362c3234382c3136352c38372c37372c3135362c3233382c3131352c32352c31332c3230362c3139372c34352c34382c39392c3235342c3234362c3136355d2c2273657175656e6365223a307d" + }, + { + "nodeId": "72218eda9860d57ccd2651d98555ce8431ee00b24a9c86b0b681342c0d47fa08", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226272616e63682d657874656e742d6d69736d617463682d61742d65786163742d656e64222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3130302c34322c3231332c3135342c39322c3235332c3136322c36372c3233332c33382c3139332c3139322c3134382c37342c39392c3135342c3139352c3137392c3230352c3230382c3234302c3135372c39312c33372c3234312c3131382c3234322c35362c3137382c3235312c3133372c3232365d2c2276657273696f6e223a307d" + }, + { + "nodeId": "87bc414f79ec6ff8431cb551c434f17f9ea1959d63892ed83cc018341b497617", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3232372c3232332c31372c37332c35382c3138382c3137362c38392c35362c32362c3230332c3133372c37312c3138312c31382c3235342c3232322c34322c3136392c39352c3139312c3137372c312c3137372c3230392c39382c3134302c3133372c3230302c32332c3235312c3132395d2c226279746573223a5b39385d7d" + }, + { + "nodeId": "89d138e87e58cce6c0c8362e4924c259f45dd8811bc03fda8625e96244cf6e83", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b37372c32352c3131392c31372c3139332c3133362c31372c39332c3234342c3233352c31382c3130342c3136372c352c3131362c3136392c36332c32322c3136322c31382c3132322c32332c3133382c37382c36302c3230392c3230312c3135342c3131382c3139372c3234302c36375d2c22627974655f7374617274223a302c22627974655f6c656e677468223a343039362c2275746631365f6c656e677468223a343039362c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "8da3c1b53b66fea09ac5151a6f37310e71f930d0300fecb092718df6df700475", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3133352c3138382c36352c37392c3132312c3233362c3131312c3234382c36372c32382c3138312c38312c3139362c35322c3234312c3132372c3135382c3136312c3134392c3135372c39392c3133372c34362c3231362c36302c3139322c32342c35322c32372c37332c3131382c32335d2c22627974655f7374617274223a302c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "9ca89f9147d9fe652d61397586142ef8a5574d9cee73190dcec52d3063fef6a5", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3133372c3230392c35362c3233322c3132362c38382c3230342c3233302c3139322c3230302c35342c34362c37332c33362c3139342c38392c3234342c39332c3231362c3132392c32372c3139322c36332c3231382c3133342c33372c3233332c39382c36382c3230372c3131302c3133315d2c227269676874223a5b3134312c3136332c3139332c3138312c35392c3130322c3235342c3136302c3135342c3139372c32312c32362c3131312c35352c34392c31342c3131332c3234392c34382c3230382c34382c31352c3233362c3137362c3134362c3131332c3134312c3234362c3232332c3131322c342c3131375d2c22627974655f6c656e677468223a343039382c2275746631365f6c656e677468223a343039372c226c696e655f627265616b73223a302c22686569676874223a327d" + }, + { + "nodeId": "cb38ecc008b00651cbed893b7a545692aca91c7ca54ca64eeb8b42817c577822", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3133372c3230392c35362c3233322c3132362c38382c3230342c3233302c3139322c3230302c35342c34362c37332c33362c3139342c38392c3234342c39332c3231362c3132392c32372c3139322c36332c3231382c3133342c33372c3233332c39382c36382c3230372c3131302c3133315d2c227269676874223a5b3134312c3136332c3139332c3138312c35392c3130322c3235342c3136302c3135342c3139372c32312c32362c3131312c35352c34392c31342c3131332c3234392c34382c3230382c34382c31352c3233362c3137362c3134362c3131332c3134312c3234362c3232332c3131322c342c3131375d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f627265616b73223a302c22686569676874223a327d" + }, + { + "nodeId": "e8c7e662fd7d2149676a0cfab65ba3bc5256ddbbdf4294e3cf9b461ba6d3fe06", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3131342c33332c3134322c3231382c3135322c39362c3231332c3132342c3230352c33382c38312c3231372c3133332c38352c3230362c3133322c34392c3233382c302c3137382c37342c3135362c3133342c3137362c3138322c3132392c35322c34342c31332c37312c3235302c385d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3230332c35362c3233362c3139322c382c3137362c362c38312c3230332c3233372c3133372c35392c3132322c38342c38362c3134362c3137322c3136392c32382c3132342c3136352c37362c3136362c37382c3233352c3133392c36362c3132392c3132342c38372c3132302c33345d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3230332c35362c3233362c3139322c382c3137362c362c38312c3230332c3233372c3133372c35392c3132322c38342c38362c3134362c3137322c3136392c32382c3132342c3136352c37362c3136362c37382c3233352c3133392c36362c3132392c3132342c38372c3132302c33345d2c2273657175656e6365223a307d" + } + ], + "invocation": { + "bufferId": "72218eda9860d57ccd2651d98555ce8431ee00b24a9c86b0b681342c0d47fa08", + "basisHeadId": "642ad59a5cfda243e926c1c0944a639ac3b3cdd0f09d5b25f176f238b2fb89e2", + "startByte": 4098, + "endByte": 4098, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2237323231386564613938363064353763636432363531643938353535636538343331656530306232346139633836623062363831333432633064343766613038222c226261736973486561644964223a2236343261643539613563666461323433653932366331633039343461363339616333623363646430663039643562323566313736663233386232666238396532222c22737461727442797465223a343039382c22656e6442797465223a343039382c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "fact-malformed", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "branch byte length does not match children at 9ca89f9147d9fe652d61397586142ef8a5574d9cee73190dcec52d3063fef6a5", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "branch-extent-mismatch-at-internal-boundary", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "4d197711c188115df4eb1268a70574a93f16a2127a178a4e3cd1c99a76c5f043", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b37302c3131302c39362c3234382c39382c3135302c35362c37372c31302c34392c3233342c3232342c33372c3139322c34322c34362c36362c3130342c33332c3231362c32342c3135352c34362c302c3130322c3137382c3231392c3230392c3234362c31332c38372c34315d2c226279746573223a5b39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39375d7d" + }, + { + "nodeId": "85bdbcb12a32143dd7b6c8ef152080247152ccf7a5432eef3172b749301a672a", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226272616e63682d657874656e742d6d69736d617463682d61742d696e7465726e616c2d626f756e64617279222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3135332c3233382c3137382c3134362c34352c3233322c38312c3138322c3233312c3130382c3134352c3135372c34322c37362c3234332c3139322c34312c3135372c39342c3130362c3231312c3134302c3137392c3233392c35372c3234352c3230322c33322c31362c312c3138382c3230385d2c2276657273696f6e223a307d" + }, + { + "nodeId": "87bc414f79ec6ff8431cb551c434f17f9ea1959d63892ed83cc018341b497617", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3232372c3232332c31372c37332c35382c3138382c3137362c38392c35362c32362c3230332c3133372c37312c3138312c31382c3235342c3232322c34322c3136392c39352c3139312c3137372c312c3137372c3230392c39382c3134302c3133372c3230302c32332c3235312c3132395d2c226279746573223a5b39385d7d" + }, + { + "nodeId": "89d138e87e58cce6c0c8362e4924c259f45dd8811bc03fda8625e96244cf6e83", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b37372c32352c3131392c31372c3139332c3133362c31372c39332c3234342c3233352c31382c3130342c3136372c352c3131362c3136392c36332c32322c3136322c31382c3132322c32332c3133382c37382c36302c3230392c3230312c3135342c3131382c3139372c3234302c36375d2c22627974655f7374617274223a302c22627974655f6c656e677468223a343039362c2275746631365f6c656e677468223a343039362c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "8da3c1b53b66fea09ac5151a6f37310e71f930d0300fecb092718df6df700475", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3133352c3138382c36352c37392c3132312c3233362c3131312c3234382c36372c32382c3138312c38312c3139362c35322c3234312c3132372c3135382c3136312c3134392c3135372c39392c3133372c34362c3231362c36302c3139322c32342c35322c32372c37332c3131382c32335d2c22627974655f7374617274223a302c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "99eeb2922de851b6e76c919d2a4cf3c0299d5e6ad38cb3ef39f5ca201001bcd0", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3133332c3138392c3138382c3137372c34322c35302c32302c36312c3231352c3138322c3230302c3233392c32312c33322c3132382c33362c3131332c38322c3230342c3234372c3136352c36372c34362c3233392c34392c3131342c3138332c37332c34382c32362c3130332c34325d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3135362c3136382c3135392c3134352c37312c3231372c3235342c3130312c34352c39372c35372c3131372c3133342c32302c34362c3234382c3136352c38372c37372c3135362c3233382c3131352c32352c31332c3230362c3139372c34352c34382c39392c3235342c3234362c3136355d2c22627974655f6c656e677468223a343039382c2275746631365f6c656e677468223a343039372c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3135362c3136382c3135392c3134352c37312c3231372c3235342c3130312c34352c39372c35372c3131372c3133342c32302c34362c3234382c3136352c38372c37372c3135362c3233382c3131352c32352c31332c3230362c3139372c34352c34382c39392c3235342c3234362c3136355d2c2273657175656e6365223a307d" + }, + { + "nodeId": "9ca89f9147d9fe652d61397586142ef8a5574d9cee73190dcec52d3063fef6a5", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3133372c3230392c35362c3233322c3132362c38382c3230342c3233302c3139322c3230302c35342c34362c37332c33362c3139342c38392c3234342c39332c3231362c3132392c32372c3139322c36332c3231382c3133342c33372c3233332c39382c36382c3230372c3131302c3133315d2c227269676874223a5b3134312c3136332c3139332c3138312c35392c3130322c3235342c3136302c3135342c3139372c32312c32362c3131312c35352c34392c31342c3131332c3234392c34382c3230382c34382c31352c3233362c3137362c3134362c3131332c3134312c3234362c3232332c3131322c342c3131375d2c22627974655f6c656e677468223a343039382c2275746631365f6c656e677468223a343039372c226c696e655f627265616b73223a302c22686569676874223a327d" + }, + { + "nodeId": "a3ee58f61161a1fb205b373c0f32fb7e0e701158475f48122c318df31b019773", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3133332c3138392c3138382c3137372c34322c35302c32302c36312c3231352c3138322c3230302c3233392c32312c33322c3132382c33362c3131332c38322c3230342c3234372c3136352c36372c34362c3233392c34392c3131342c3138332c37332c34382c32362c3130332c34325d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3230332c35362c3233362c3139322c382c3137362c362c38312c3230332c3233372c3133372c35392c3132322c38342c38362c3134362c3137322c3136392c32382c3132342c3136352c37362c3136362c37382c3233352c3133392c36362c3132392c3132342c38372c3132302c33345d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3230332c35362c3233362c3139322c382c3137362c362c38312c3230332c3233372c3133372c35392c3132322c38342c38362c3134362c3137322c3136392c32382c3132342c3136352c37362c3136362c37382c3233352c3133392c36362c3132392c3132342c38372c3132302c33345d2c2273657175656e6365223a307d" + }, + { + "nodeId": "cb38ecc008b00651cbed893b7a545692aca91c7ca54ca64eeb8b42817c577822", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3133372c3230392c35362c3233322c3132362c38382c3230342c3233302c3139322c3230302c35342c34362c37332c33362c3139342c38392c3234342c39332c3231362c3132392c32372c3139322c36332c3231382c3133342c33372c3233332c39382c36382c3230372c3131302c3133315d2c227269676874223a5b3134312c3136332c3139332c3138312c35392c3130322c3235342c3136302c3135342c3139372c32312c32362c3131312c35352c34392c31342c3131332c3234392c34382c3230382c34382c31352c3233362c3137362c3134362c3131332c3134312c3234362c3232332c3131322c342c3131375d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f627265616b73223a302c22686569676874223a327d" + } + ], + "invocation": { + "bufferId": "85bdbcb12a32143dd7b6c8ef152080247152ccf7a5432eef3172b749301a672a", + "basisHeadId": "99eeb2922de851b6e76c919d2a4cf3c0299d5e6ad38cb3ef39f5ca201001bcd0", + "startByte": 4096, + "endByte": 4096, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2238356264626362313261333231343364643762366338656631353230383032343731353263636637613534333265656633313732623734393330316136373261222c226261736973486561644964223a2239396565623239323264653835316236653736633931396432613463663363303239396435653661643338636233656633396635636132303130303162636430222c22737461727442797465223a343039362c22656e6442797465223a343039362c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "fact-malformed", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "branch byte length does not match children at 9ca89f9147d9fe652d61397586142ef8a5574d9cee73190dcec52d3063fef6a5", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "branch-truncated-no-op-mask", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "4d197711c188115df4eb1268a70574a93f16a2127a178a4e3cd1c99a76c5f043", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b37302c3131302c39362c3234382c39382c3135302c35362c37372c31302c34392c3233342c3232342c33372c3139322c34322c34362c36362c3130342c33332c3231362c32342c3135352c34362c302c3130322c3137382c3231392c3230392c3234362c31332c38372c34315d2c226279746573223a5b39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39375d7d" + }, + { + "nodeId": "87bc414f79ec6ff8431cb551c434f17f9ea1959d63892ed83cc018341b497617", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3232372c3232332c31372c37332c35382c3138382c3137362c38392c35362c32362c3230332c3133372c37312c3138312c31382c3235342c3232322c34322c3136392c39352c3139312c3137372c312c3137372c3230392c39382c3134302c3133372c3230302c32332c3235312c3132395d2c226279746573223a5b39385d7d" + }, + { + "nodeId": "89d138e87e58cce6c0c8362e4924c259f45dd8811bc03fda8625e96244cf6e83", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b37372c32352c3131392c31372c3139332c3133362c31372c39332c3234342c3233352c31382c3130342c3136372c352c3131362c3136392c36332c32322c3136322c31382c3132322c32332c3133382c37382c36302c3230392c3230312c3135342c3131382c3139372c3234302c36375d2c22627974655f7374617274223a302c22627974655f6c656e677468223a343039362c2275746631365f6c656e677468223a343039362c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "8da3c1b53b66fea09ac5151a6f37310e71f930d0300fecb092718df6df700475", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3133352c3138382c36352c37392c3132312c3233362c3131312c3234382c36372c32382c3138312c38312c3139362c35322c3234312c3132372c3135382c3136312c3134392c3135372c39392c3133372c34362c3231362c36302c3139322c32342c35322c32372c37332c3131382c32335d2c22627974655f7374617274223a302c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "9ca89f9147d9fe652d61397586142ef8a5574d9cee73190dcec52d3063fef6a5", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3133372c3230392c35362c3233322c3132362c38382c3230342c3233302c3139322c3230302c35342c34362c37332c33362c3139342c38392c3234342c39332c3231362c3132392c32372c3139322c36332c3231382c3133342c33372c3233332c39382c36382c3230372c3131302c3133315d2c227269676874223a5b3134312c3136332c3139332c3138312c35392c3130322c3235342c3136302c3135342c3139372c32312c32362c3131312c35352c34392c31342c3131332c3234392c34382c3230382c34382c31352c3233362c3137362c3134362c3131332c3134312c3234362c3232332c3131322c342c3131375d2c22627974655f6c656e677468223a343039382c2275746631365f6c656e677468223a343039372c226c696e655f627265616b73223a302c22686569676874223a327d" + }, + { + "nodeId": "b5d48f063c12e0b8fe3cfe365cd356c285a5726d0401d6d01a9f902351f8feed", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3231302c3139342c3131372c3130392c3134372c3131322c3232302c3234342c3133302c34342c3138332c32332c3132302c3133382c3131372c3130362c3135312c3133342c37372c34332c3132332c3232392c37312c3139342c3232342c302c32382c3232312c392c35332c35342c3230315d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3230332c35362c3233362c3139322c382c3137362c362c38312c3230332c3233372c3133372c35392c3132322c38342c38362c3134362c3137322c3136392c32382c3132342c3136352c37362c3136362c37382c3233352c3133392c36362c3132392c3132342c38372c3132302c33345d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3230332c35362c3233362c3139322c382c3137362c362c38312c3230332c3233372c3133372c35392c3132322c38342c38362c3134362c3137322c3136392c32382c3132342c3136352c37362c3136362c37382c3233352c3133392c36362c3132392c3132342c38372c3132302c33345d2c2273657175656e6365223a307d" + }, + { + "nodeId": "cb38ecc008b00651cbed893b7a545692aca91c7ca54ca64eeb8b42817c577822", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3133372c3230392c35362c3233322c3132362c38382c3230342c3233302c3139322c3230302c35342c34362c37332c33362c3139342c38392c3234342c39332c3231362c3132392c32372c3139322c36332c3231382c3133342c33372c3233332c39382c36382c3230372c3131302c3133315d2c227269676874223a5b3134312c3136332c3139332c3138312c35392c3130322c3235342c3136302c3135342c3139372c32312c32362c3131312c35352c34392c31342c3131332c3234392c34382c3230382c34382c31352c3233362c3137362c3134362c3131332c3134312c3234362c3232332c3131322c342c3131375d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f627265616b73223a302c22686569676874223a327d" + }, + { + "nodeId": "d2c2756d9370dcf4822cb717788a756a97864d2b7be547c2e0001cdd093536c9", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226272616e63682d7472756e63617465642d6e6f2d6f702d6d61736b222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3231392c39382c3136372c3131372c3133372c3138322c38322c3130362c3231342c3233332c31352c37382c3136322c3130302c39372c34322c37322c37392c3132392c3233332c3233352c3137332c3130362c38362c3134352c302c38322c3230312c3131302c3135332c3231372c33335d2c2276657273696f6e223a307d" + }, + { + "nodeId": "db62a77589b6526ad6e90f4ea264612a484f81e9ebad6a56910052c96e99d921", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3231302c3139342c3131372c3130392c3134372c3131322c3232302c3234342c3133302c34342c3138332c32332c3132302c3133382c3131372c3130362c3135312c3133342c37372c34332c3132332c3232392c37312c3139342c3232342c302c32382c3232312c392c35332c35342c3230315d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3135362c3136382c3135392c3134352c37312c3231372c3235342c3130312c34352c39372c35372c3131372c3133342c32302c34362c3234382c3136352c38372c37372c3135362c3233382c3131352c32352c31332c3230362c3139372c34352c34382c39392c3235342c3234362c3136355d2c22627974655f6c656e677468223a343039382c2275746631365f6c656e677468223a343039372c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3135362c3136382c3135392c3134352c37312c3231372c3235342c3130312c34352c39372c35372c3131372c3133342c32302c34362c3234382c3136352c38372c37372c3135362c3233382c3131352c32352c31332c3230362c3139372c34352c34382c39392c3235342c3234362c3136355d2c2273657175656e6365223a307d" + } + ], + "invocation": { + "bufferId": "d2c2756d9370dcf4822cb717788a756a97864d2b7be547c2e0001cdd093536c9", + "basisHeadId": "db62a77589b6526ad6e90f4ea264612a484f81e9ebad6a56910052c96e99d921", + "startByte": 0, + "endByte": 4098, + "replacementUtf8Hex": "6161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616162" + }, + "invocationBytesHex": "7b226275666665724964223a2264326332373536643933373064636634383232636237313737383861373536613937383634643262376265353437633265303030316364643039333533366339222c226261736973486561644964223a2264623632613737353839623635323661643665393066346561323634363132613438346638316539656261643661353639313030353263393665393964393231222c22737461727442797465223a302c22656e6442797465223a343039382c227265706c6163656d656e7455746638486578223a2236313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313631363136313632227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "malformed-rope", + "legacyErrorClass": "invalid-request", + "legacyMessage": "replace range did not materialize the declared byte length", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "cyclic-right-endpoint", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "19528fc30b0596f411e8283dcfc466a947d738c8d24919584f1eeebb83e8ce5b", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3230322c3231382c3137332c392c3137322c3233392c3138322c3134382c3132352c33332c3131332c39382c3135312c3230372c39382c38332c3137332c31352c3138382c3230382c3136342c3134342c3231322c312c3130382c3131372c3139342c32302c3136392c38382c33372c3130365d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c2273657175656e6365223a307d" + }, + { + "nodeId": "2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3233372c3139322c34362c3139322c3231332c3232312c36302c37302c3130372c3130332c3137342c3136322c3234312c32312c3131322c32362c332c3231332c3131312c39362c3134302c32392c3231302c33382c35342c3235352c3132382c3135362c3230352c32312c3131362c3135345d2c226279746573223a5b39372c39382c39395d7d" + }, + { + "nodeId": "6762ad83b3c30e8859f83a1736c4054e583388127f36fe13382c59e76ca33cde", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3230322c3231382c3137332c392c3137322c3233392c3138322c3134382c3132352c33332c3131332c39382c3135312c3230372c39382c38332c3137332c31352c3138382c3230382c3136342c3134342c3231322c312c3130382c3131372c3139342c32302c3136392c38382c33372c3130365d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230345d2c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230345d2c2273657175656e6365223a307d" + }, + { + "nodeId": "b18fc548c67874d9ffa852ee4955f3236115798b79c4f561c49dfde168e8d7dc", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b34332c3135372c382c39312c37302c3234372c37342c35362c3135322c35392c322c3233332c37342c33332c3230372c3139382c3134302c39392c3136392c3135372c34352c3139312c3234322c38382c3132372c3234342c33352c3233332c3139342c38342c3232332c34325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "cadaad09acefb6947d21716297cf6253ad0fbcd0a490d4016c75c214a958256a", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226379636c69632d72696768742d656e64706f696e74222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3130332c39382c3137332c3133312c3137392c3139352c31342c3133362c38392c3234382c35382c32332c35342c3139362c352c37382c38382c35312c3133362c31382c3132372c35342c3235342c31392c35362c34342c38392c3233312c3130382c3136332c36302c3232325d2c2276657273696f6e223a307d" + }, + { + "nodeId": "cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c227269676874223a5b3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230342c3230345d2c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a302c22686569676874223a327d" + } + ], + "invocation": { + "bufferId": "cadaad09acefb6947d21716297cf6253ad0fbcd0a490d4016c75c214a958256a", + "basisHeadId": "6762ad83b3c30e8859f83a1736c4054e583388127f36fe13382c59e76ca33cde", + "startByte": 3, + "endByte": 3, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2263616461616430396163656662363934376432313731363239376366363235336164306662636430613439306434303136633735633231346139353832353661222c226261736973486561644964223a2236373632616438336233633330653838353966383361313733366334303534653538333338383132376633366665313333383263353965373663613333636465222c22737461727442797465223a332c22656e6442797465223a332c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "fact-malformed", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "rope node cycle at cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "empty-root-nonzero-length-no-op-mask", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "8fbe435562030902c48740da3b9a4c44464bc7edcdadf2f4102df0ba877445ac", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3230312c3232322c302c3230392c3136382c3233382c39332c35342c3234372c32302c38392c3232312c3137322c37382c34392c3133352c36332c31352c3136312c3231352c3233392c3131302c32372c3234332c3135342c3230322c3139332c3234392c3232312c3139342c3137382c3131345d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a6e756c6c2c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a302c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3138332c3135362c38392c3139352c36382c34332c34352c39302c34302c3136302c3235312c3139392c3235352c31382c3131372c3231362c3130382c36362c34332c3232382c3134372c3131322c3131342c3231372c3139312c302c38372c34332c34392c31332c3233322c38385d2c2273657175656e6365223a307d" + }, + { + "nodeId": "c9de00d1a8ee5d36f71459ddac4e31873f0fa1d7ef6e1bf39acac1f9ddc2b272", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a22656d7074792d726f6f742d6e6f6e7a65726f2d6c656e6774682d6e6f2d6f702d6d61736b222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3134332c3139302c36372c38352c39382c332c392c322c3139362c3133352c36342c3231382c35392c3135342c37362c36382c37302c37352c3139392c3233372c3230352c3137332c3234322c3234342c31362c34352c3234302c3138362c3133352c3131362c36392c3137325d2c2276657273696f6e223a307d" + }, + { + "nodeId": "f6ab1b0198c4d2603716a59efa3af375833a3e3f602e81f9eca68405ff7aa393", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3230312c3232322c302c3230392c3136382c3233382c39332c35342c3234372c32302c38392c3232312c3137322c37382c34392c3133352c36332c31352c3136312c3231352c3233392c3131302c32372c3234332c3135342c3230322c3139332c3234392c3232312c3139342c3137382c3131345d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a6e756c6c2c22627974655f6c656e677468223a302c2275746631365f6c656e677468223a302c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3138332c3135362c38392c3139352c36382c34332c34352c39302c34302c3136302c3235312c3139392c3235352c31382c3131372c3231362c3130382c36362c34332c3232382c3134372c3131322c3131342c3231372c3139312c302c38372c34332c34392c31332c3233322c38385d2c2273657175656e6365223a307d" + } + ], + "invocation": { + "bufferId": "c9de00d1a8ee5d36f71459ddac4e31873f0fa1d7ef6e1bf39acac1f9ddc2b272", + "basisHeadId": "8fbe435562030902c48740da3b9a4c44464bc7edcdadf2f4102df0ba877445ac", + "startByte": 0, + "endByte": 1, + "replacementUtf8Hex": "" + }, + "invocationBytesHex": "7b226275666665724964223a2263396465303064316138656535643336663731343539646461633465333138373366306661316437656636653162663339616361633166396464633262323732222c226261736973486561644964223a2238666265343335353632303330393032633438373430646133623961346334343436346263376564636461646632663431303264663062613837373434356163222c22737461727442797465223a302c22656e6442797465223a312c227265706c6163656d656e7455746638486578223a22227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "malformed-rope", + "legacyErrorClass": "invalid-request", + "legacyMessage": "basis head byte length does not match root", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "empty-root-nonzero-length-zero-insert", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "5f6fd5f808214389e6de5ceafd434c630a485ffb7dd52ab808d25966084e6647", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a22656d7074792d726f6f742d6e6f6e7a65726f2d6c656e6774682d7a65726f2d696e73657274222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3134362c35342c3137362c3132312c3136352c3235352c3136322c31392c3132362c32382c3132362c3137382c33362c3136312c3234372c392c3131352c35312c3230362c3235302c3132302c3138352c3131372c37392c3233332c3233352c33352c33382c35332c3138352c3232312c39365d2c2276657273696f6e223a307d" + }, + { + "nodeId": "9236b079a5ffa2137e1c7eb224a1f7097333cefa78b9754fe9eb232635b9dd60", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b39352c3131312c3231332c3234382c382c33332c36372c3133372c3233302c3232322c39322c3233342c3235332c36372c37362c39392c31302c37322c39352c3235312c3132352c3231332c34322c3138342c382c3231302c38392c3130322c382c37382c3130322c37315d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a6e756c6c2c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a302c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3138332c3135362c38392c3139352c36382c34332c34352c39302c34302c3136302c3235312c3139392c3235352c31382c3131372c3231362c3130382c36362c34332c3232382c3134372c3131322c3131342c3231372c3139312c302c38372c34332c34392c31332c3233322c38385d2c2273657175656e6365223a307d" + }, + { + "nodeId": "e46c2286a35ea0e687f2e738186d47b93ee4319a4aaf289806dd6e8e47a5d6d6", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b39352c3131312c3231332c3234382c382c33332c36372c3133372c3233302c3232322c39322c3233342c3235332c36372c37362c39392c31302c37322c39352c3235312c3132352c3231332c34322c3138342c382c3231302c38392c3130322c382c37382c3130322c37315d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a6e756c6c2c22627974655f6c656e677468223a302c2275746631365f6c656e677468223a302c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3138332c3135362c38392c3139352c36382c34332c34352c39302c34302c3136302c3235312c3139392c3235352c31382c3131372c3231362c3130382c36362c34332c3232382c3134372c3131322c3131342c3231372c3139312c302c38372c34332c34392c31332c3233322c38385d2c2273657175656e6365223a307d" + } + ], + "invocation": { + "bufferId": "5f6fd5f808214389e6de5ceafd434c630a485ffb7dd52ab808d25966084e6647", + "basisHeadId": "9236b079a5ffa2137e1c7eb224a1f7097333cefa78b9754fe9eb232635b9dd60", + "startByte": 0, + "endByte": 0, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2235663666643566383038323134333839653664653563656166643433346336333061343835666662376464353261623830386432353936363038346536363437222c226261736973486561644964223a2239323336623037396135666661323133376531633765623232346131663730393733333363656661373862393735346665396562323332363335623964643630222c22737461727442797465223a302c22656e6442797465223a302c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "malformed-rope", + "legacyErrorClass": "invalid-request", + "legacyMessage": "basis head byte length does not match root", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "leaf-ends-inside-codepoint-at-exact-end", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "02e81cc9bfbf823e2f0901b6dee20a04bc9238651c5644ceb6acb21fa6d7596f", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b34332c31312c3138332c3232362c3136352c3135302c35322c3136392c3233322c3233382c35392c3138372c3131372c3233372c36372c3132312c3134302c3134322c32362c3135332c3136312c3135372c3138312c3134352c3130352c3136302c3132392c3233332c3233342c3139302c3139322c36355d2c226279746573223a5b3139352c3136395d7d" + }, + { + "nodeId": "1817ce4888b97571d16981aec10975649a8994f9d7cac9044bfbf5a1944a7208", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226c6561662d656e64732d696e736964652d636f6465706f696e742d61742d65786163742d656e64222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b34382c3232382c3138332c34332c3230312c3231372c3130372c3134352c34392c3232382c3234312c3134392c36342c3231352c3139342c362c3231322c3132352c3135312c3132392c3137312c37322c33372c3234302c3235332c3130392c3232332c35332c382c3136372c3130312c31325d2c2276657273696f6e223a307d" + }, + { + "nodeId": "30e4b72bc9d96b9131e4f19540d7c206d47d9781ab4825f0fd6ddf3508a7650c", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b32342c32332c3230362c37322c3133362c3138352c3131372c3131332c3230392c3130352c3132392c3137342c3139332c392c3131372c3130302c3135342c3133372c3134382c3234392c3231352c3230322c3230312c342c37352c3235312c3234352c3136312c3134382c37342c3131342c385d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3134302c3139382c39342c3139372c37362c39312c3231362c33322c3132342c3134302c34332c35312c31362c33342c3131362c3133392c37342c33392c3233352c34382c32362c3230312c3133392c36332c3133372c32332c3137342c3135322c3234342c33372c3232302c3137335d2c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3134302c3139382c39342c3139372c37362c39312c3231362c33322c3132342c3134302c34332c35312c31362c33342c3131362c3133392c37342c33392c3233352c34382c32362c3230312c3133392c36332c3133372c32332c3137342c3135322c3234342c33372c3232302c3137335d2c2273657175656e6365223a307d" + }, + { + "nodeId": "6eb70feded5c1bfe2d445f35e166c88abbef309bd1aeee6634fa96bce7778648", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b322c3233322c32382c3230312c3139312c3139312c3133302c36322c34372c392c312c3138322c3232322c3232362c31302c342c3138382c3134362c35362c3130312c32382c38362c36382c3230362c3138322c3137322c3137382c33312c3136362c3231352c38392c3131315d2c22627974655f7374617274223a302c22627974655f6c656e677468223a322c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "8cc65ec54c5bd8207c8c2b331022748b4a27eb301ac98b3f8917ae98f425dcad", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b322c3233322c32382c3230312c3139312c3139312c3133302c36322c34372c392c312c3138322c3232322c3232362c31302c342c3138382c3134362c35362c3130312c32382c38362c36382c3230362c3138322c3137322c3137382c33312c3136362c3231352c38392c3131315d2c22627974655f7374617274223a302c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "fcab0e59c60fb0f23f6a365672e4338a9f8e308d4a2a119b01c8296e42a437c0", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b32342c32332c3230362c37322c3133362c3138352c3131372c3131332c3230392c3130352c3132392c3137342c3139332c392c3131372c3130302c3135342c3133372c3134382c3234392c3231352c3230322c3230312c342c37352c3235312c3234352c3136312c3134382c37342c3131342c385d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3131302c3138332c31352c3233372c3233372c39322c32372c3235342c34352c36382c39352c35332c3232352c3130322c3230302c3133382c3138372c3233392c34382c3135352c3230392c3137342c3233382c3130322c35322c3235302c3135302c3138382c3233312c3131392c3133342c37325d2c22627974655f6c656e677468223a322c2275746631365f6c656e677468223a312c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3131302c3138332c31352c3233372c3233372c39322c32372c3235342c34352c36382c39352c35332c3232352c3130322c3230302c3133382c3138372c3233392c34382c3135352c3230392c3137342c3233382c3130322c35322c3235302c3135302c3138382c3233312c3131392c3133342c37325d2c2273657175656e6365223a307d" + } + ], + "invocation": { + "bufferId": "1817ce4888b97571d16981aec10975649a8994f9d7cac9044bfbf5a1944a7208", + "basisHeadId": "30e4b72bc9d96b9131e4f19540d7c206d47d9781ab4825f0fd6ddf3508a7650c", + "startByte": 1, + "endByte": 1, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2231383137636534383838623937353731643136393831616563313039373536343961383939346639643763616339303434626662663561313934346137323038222c226261736973486561644964223a2233306534623732626339643936623931333165346631393534306437633230366434376439373831616234383235663066643664646633353038613736353063222c22737461727442797465223a312c22656e6442797465223a312c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "utf8-boundary-invalid", + "legacyErrorClass": "invalid-request", + "legacyMessage": "replace offset splits a UTF-8 code point", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "leaf-exceeds-blob-at-zero", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3233372c3139322c34362c3139322c3231332c3232312c36302c37302c3130372c3130332c3137342c3136322c3234312c32312c3131322c32362c332c3231332c3131312c39362c3134302c32392c3231302c33382c35342c3235352c3132382c3135362c3230352c32312c3131362c3135345d2c226279746573223a5b39372c39382c39395d7d" + }, + { + "nodeId": "2e698e18e47fee6641813f9ec798cb75f80690a088703ca593e3f798c102e221", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3230372c37382c3233322c33302c33362c3233302c39372c3130362c3235322c39332c31372c3130342c3136362c3131362c342c3231322c3136322c3232312c3139352c3131302c3132312c3131372c3133362c3230382c3231342c3131382c3234302c34392c3139342c31392c3132382c3230395d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c2273657175656e6365223a307d" + }, + { + "nodeId": "38a16be5c61ba08128feb42e649594496e5923a688f4c7a43abd56fc563de81f", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3230372c37382c3233322c33302c33362c3233302c39372c3130362c3235322c39332c31372c3130342c3136362c3131362c342c3231322c3136322c3232312c3139352c3131302c3132312c3131372c3133362c3230382c3231342c3131382c3234302c34392c3139342c31392c3132382c3230395d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3132332c3132372c39312c3138372c3130392c3130372c3230382c3139302c3138392c3230312c3139362c3137322c3131352c34382c36322c31352c3138322c34352c3231332c3130302c3138342c3137342c37312c32372c3134392c3133332c3135322c3233322c39362c3134342c3136312c34385d2c22627974655f6c656e677468223a342c2275746631365f6c656e677468223a332c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3132332c3132372c39312c3138372c3130392c3130372c3230382c3139302c3138392c3230312c3139362c3137322c3131352c34382c36322c31352c3138322c34352c3231332c3130302c3138342c3137342c37312c32372c3134392c3133332c3135322c3233322c39362c3134342c3136312c34385d2c2273657175656e6365223a307d" + }, + { + "nodeId": "7b7f5bbb6d6bd0bebdc9c4ac73303e0fb62dd564b8ae471b958598e86090a130", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b34332c3135372c382c39312c37302c3234372c37342c35362c3135322c35392c322c3233332c37342c33332c3230372c3139382c3134302c39392c3136392c3135372c34352c3139312c3234322c38382c3132372c3234342c33352c3233332c3139342c38342c3232332c34325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a342c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "b18fc548c67874d9ffa852ee4955f3236115798b79c4f561c49dfde168e8d7dc", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b34332c3135372c382c39312c37302c3234372c37342c35362c3135322c35392c322c3233332c37342c33332c3230372c3139382c3134302c39392c3136392c3135372c34352c3139312c3234322c38382c3132372c3234342c33352c3233332c3139342c38342c3232332c34325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "cf4ee81e24e6616afc5d1168a67404d4a2ddc36e797588d0d676f031c21380d1", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226c6561662d657863656564732d626c6f622d61742d7a65726f222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b35362c3136312c3130372c3232392c3139382c32372c3136302c3132392c34302c3235342c3138302c34362c3130302c3134392c3134382c37332c3131302c38392c33352c3136362c3133362c3234342c3139392c3136342c35382c3138392c38362c3235322c38362c36312c3233322c33315d2c2276657273696f6e223a307d" + } + ], + "invocation": { + "bufferId": "cf4ee81e24e6616afc5d1168a67404d4a2ddc36e797588d0d676f031c21380d1", + "basisHeadId": "38a16be5c61ba08128feb42e649594496e5923a688f4c7a43abd56fc563de81f", + "startByte": 0, + "endByte": 0, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2263663465653831653234653636313661666335643131363861363734303464346132646463333665373937353838643064363736663033316332313338306431222c226261736973486561644964223a2233386131366265356336316261303831323866656234326536343935393434393665353932336136383866346337613433616264353666633536336465383166222c22737461727442797465223a302c22656e6442797465223a302c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "fact-malformed", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "leaf 2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a exceeds blob bounds", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "leaf-exceeds-blob-at-exact-end", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3233372c3139322c34362c3139322c3231332c3232312c36302c37302c3130372c3130332c3137342c3136322c3234312c32312c3131322c32362c332c3231332c3131312c39362c3134302c32392c3231302c33382c35342c3235352c3132382c3135362c3230352c32312c3131362c3135345d2c226279746573223a5b39372c39382c39395d7d" + }, + { + "nodeId": "34d765ab2f4b110bc348dd427f0ca5f16ac2b7966b5a353181e9881db51ae770", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3130392c36372c3131372c36342c3138382c35332c3139382c3133362c35342c3235342c3235312c34312c3233352c36362c37332c39392c3132342c35312c32332c3134392c3235332c37312c3137332c35302c3135392c34392c3231322c32382c3233362c31302c3235352c39385d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3137372c3134332c3139372c37322c3139382c3132302c3131362c3231372c3235352c3136382c38322c3233382c37332c38352c3234332c33352c39372c32312c3132312c3133392c3132312c3139362c3234352c39372c3139362c3135372c3235332c3232352c3130342c3233322c3231352c3232305d2c2273657175656e6365223a307d" + }, + { + "nodeId": "6c2fcc7a5ea107666e317fbb79c72862da91073e53a51f30ad44e6789d648600", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3130392c36372c3131372c36342c3138382c35332c3139382c3133362c35342c3235342c3235312c34312c3233352c36362c37332c39392c3132342c35312c32332c3134392c3235332c37312c3137332c35302c3135392c34392c3231322c32382c3233362c31302c3235352c39385d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3132332c3132372c39312c3138372c3130392c3130372c3230382c3139302c3138392c3230312c3139362c3137322c3131352c34382c36322c31352c3138322c34352c3231332c3130302c3138342c3137342c37312c32372c3134392c3133332c3135322c3233322c39362c3134342c3136312c34385d2c22627974655f6c656e677468223a342c2275746631365f6c656e677468223a332c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3132332c3132372c39312c3138372c3130392c3130372c3230382c3139302c3138392c3230312c3139362c3137322c3131352c34382c36322c31352c3138322c34352c3231332c3130302c3138342c3137342c37312c32372c3134392c3133332c3135322c3233322c39362c3134342c3136312c34385d2c2273657175656e6365223a307d" + }, + { + "nodeId": "6d437540bc35c68836fefb29eb4249637c331795fd47ad329f31d41cec0aff62", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226c6561662d657863656564732d626c6f622d61742d65786163742d656e64222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3130382c34372c3230342c3132322c39342c3136312c372c3130322c3131302c34392c3132372c3138372c3132312c3139392c34302c39382c3231382c3134352c372c36322c38332c3136352c33312c34382c3137332c36382c3233302c3132302c3135372c3130302c3133342c305d2c2276657273696f6e223a307d" + }, + { + "nodeId": "7b7f5bbb6d6bd0bebdc9c4ac73303e0fb62dd564b8ae471b958598e86090a130", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b34332c3135372c382c39312c37302c3234372c37342c35362c3135322c35392c322c3233332c37342c33332c3230372c3139382c3134302c39392c3136392c3135372c34352c3139312c3234322c38382c3132372c3234342c33352c3233332c3139342c38342c3232332c34325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a342c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "b18fc548c67874d9ffa852ee4955f3236115798b79c4f561c49dfde168e8d7dc", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b34332c3135372c382c39312c37302c3234372c37342c35362c3135322c35392c322c3233332c37342c33332c3230372c3139382c3134302c39392c3136392c3135372c34352c3139312c3234322c38382c3132372c3234342c33352c3233332c3139342c38342c3232332c34325d2c22627974655f7374617274223a302c22627974655f6c656e677468223a332c2275746631365f6c656e677468223a332c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "6d437540bc35c68836fefb29eb4249637c331795fd47ad329f31d41cec0aff62", + "basisHeadId": "6c2fcc7a5ea107666e317fbb79c72862da91073e53a51f30ad44e6789d648600", + "startByte": 4, + "endByte": 4, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2236643433373534306263333563363838333666656662323965623432343936333763333331373935666434376164333239663331643431636563306166663632222c226261736973486561644964223a2236633266636337613565613130373636366533313766626237396337323836326461393130373365353361353166333061643434653637383964363438363030222c22737461727442797465223a342c22656e6442797465223a342c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "fact-malformed", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "leaf 2b9d085b46f74a38983b02e94a21cfc68c63a99d2dbff2587ff423e9c254df2a exceeds blob bounds", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "leaf-exceeds-blob-at-internal-boundary", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "4986b6a960a7d3e874ef4074425eae7a79990881e13acc996249909413088793", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226c6561662d657863656564732d626c6f622d61742d696e7465726e616c2d626f756e64617279222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3234372c3232312c31352c32332c38302c3233392c31332c3133312c362c31312c3232332c34322c3232312c39362c3138362c36352c3131372c3131392c35342c3232322c3136382c3139332c3138392c3233382c31362c3135392c3136322c3134392c3136372c32372c36392c3231395d2c2276657273696f6e223a307d" + }, + { + "nodeId": "4d197711c188115df4eb1268a70574a93f16a2127a178a4e3cd1c99a76c5f043", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b37302c3131302c39362c3234382c39382c3135302c35362c37372c31302c34392c3233342c3232342c33372c3139322c34322c34362c36362c3130342c33332c3231362c32342c3135352c34362c302c3130322c3137382c3231392c3230392c3234362c31332c38372c34315d2c226279746573223a5b39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39375d7d" + }, + { + "nodeId": "5a3ad2a5f28db2242fb1a422f3632074607841a08358702ba9bf4916d9b6f5ae", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b37332c3133342c3138322c3136392c39362c3136372c3231312c3233322c3131362c3233392c36342c3131362c36362c39342c3137342c3132322c3132312c3135332c382c3132392c3232352c35382c3230342c3135332c39382c37332c3134342c3134382c31392c382c3133352c3134375d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3230332c35362c3233362c3139322c382c3137362c362c38312c3230332c3233372c3133372c35392c3132322c38342c38362c3134362c3137322c3136392c32382c3132342c3136352c37362c3136362c37382c3233352c3133392c36362c3132392c3132342c38372c3132302c33345d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3230332c35362c3233362c3139322c382c3137362c362c38312c3230332c3233372c3133372c35392c3132322c38342c38362c3134362c3137322c3136392c32382c3132342c3136352c37362c3136362c37382c3233352c3133392c36362c3132392c3132342c38372c3132302c33345d2c2273657175656e6365223a307d" + }, + { + "nodeId": "87bc414f79ec6ff8431cb551c434f17f9ea1959d63892ed83cc018341b497617", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3232372c3232332c31372c37332c35382c3138382c3137362c38392c35362c32362c3230332c3133372c37312c3138312c31382c3235342c3232322c34322c3136392c39352c3139312c3137372c312c3137372c3230392c39382c3134302c3133372c3230302c32332c3235312c3132395d2c226279746573223a5b39385d7d" + }, + { + "nodeId": "89d138e87e58cce6c0c8362e4924c259f45dd8811bc03fda8625e96244cf6e83", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b37372c32352c3131392c31372c3139332c3133362c31372c39332c3234342c3233352c31382c3130342c3136372c352c3131362c3136392c36332c32322c3136322c31382c3132322c32332c3133382c37382c36302c3230392c3230312c3135342c3131382c3139372c3234302c36375d2c22627974655f7374617274223a302c22627974655f6c656e677468223a343039362c2275746631365f6c656e677468223a343039362c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "8da3c1b53b66fea09ac5151a6f37310e71f930d0300fecb092718df6df700475", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3133352c3138382c36352c37392c3132312c3233362c3131312c3234382c36372c32382c3138312c38312c3139362c35322c3234312c3132372c3135382c3136312c3134392c3135372c39392c3133372c34362c3231362c36302c3139322c32342c35322c32372c37332c3131382c32335d2c22627974655f7374617274223a302c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "cb38ecc008b00651cbed893b7a545692aca91c7ca54ca64eeb8b42817c577822", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3133372c3230392c35362c3233322c3132362c38382c3230342c3233302c3139322c3230302c35342c34362c37332c33362c3139342c38392c3234342c39332c3231362c3132392c32372c3139322c36332c3231382c3133342c33372c3233332c39382c36382c3230372c3131302c3133315d2c227269676874223a5b3134312c3136332c3139332c3138312c35392c3130322c3235342c3136302c3135342c3139372c32312c32362c3131312c35352c34392c31342c3131332c3234392c34382c3230382c34382c31352c3233362c3137362c3134362c3131332c3134312c3234362c3232332c3131322c342c3131375d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f627265616b73223a302c22686569676874223a327d" + }, + { + "nodeId": "e8a6a8246afb46cd194833aa556ff62630e3c0371412543ae30051f70eea1214", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3235342c3135352c3235322c3233372c3232382c342c3132302c3138332c31332c3138392c3233392c38302c3232302c302c3234342c35332c32302c3232302c3231322c33332c3234372c32302c3233352c3231352c3137392c3234362c39312c3139362c3138322c34302c35382c3230335d2c227269676874223a5b3134312c3136332c3139332c3138312c35392c3130322c3235342c3136302c3135342c3139372c32312c32362c3131312c35352c34392c31342c3131332c3234392c34382c3230382c34382c31352c3233362c3137362c3134362c3131332c3134312c3234362c3232332c3131322c342c3131375d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f627265616b73223a302c22686569676874223a327d" + }, + { + "nodeId": "f7dd0f1750ef0d83060bdf2add60ba41757736dea8c1bdee109fa295a71b45db", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b37332c3133342c3138322c3136392c39362c3136372c3231312c3233322c3131362c3233392c36342c3131362c36362c39342c3137342c3132322c3132312c3135332c382c3132392c3232352c35382c3230342c3135332c39382c37332c3134342c3134382c31392c382c3133352c3134375d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3233322c3136362c3136382c33362c3130362c3235312c37302c3230352c32352c37322c35312c3137302c38352c3131312c3234362c33382c34382c3232372c3139322c35352c32302c31382c38342c35382c3232372c302c38312c3234372c31342c3233342c31382c32305d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3233322c3136362c3136382c33362c3130362c3235312c37302c3230352c32352c37322c35312c3137302c38352c3131312c3234362c33382c34382c3232372c3139322c35352c32302c31382c38342c35382c3232372c302c38312c3234372c31342c3233342c31382c32305d2c2273657175656e6365223a307d" + }, + { + "nodeId": "fe9bfcede40478b70dbdef50dc00f43514dcd421f714ebd7b3f65bc4b6283acb", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b37372c32352c3131392c31372c3139332c3133362c31372c39332c3234342c3233352c31382c3130342c3136372c352c3131362c3136392c36332c32322c3136322c31382c3132322c32332c3133382c37382c36302c3230392c3230312c3135342c3131382c3139372c3234302c36375d2c22627974655f7374617274223a312c22627974655f6c656e677468223a343039362c2275746631365f6c656e677468223a343039362c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "4986b6a960a7d3e874ef4074425eae7a79990881e13acc996249909413088793", + "basisHeadId": "f7dd0f1750ef0d83060bdf2add60ba41757736dea8c1bdee109fa295a71b45db", + "startByte": 4096, + "endByte": 4096, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2234393836623661393630613764336538373465663430373434323565616537613739393930383831653133616363393936323439393039343133303838373933222c226261736973486561644964223a2266376464306631373530656630643833303630626466326164643630626134313735373733366465613863316264656531303966613239356137316234356462222c22737461727442797465223a343039362c22656e6442797465223a343039362c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "fact-malformed", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "leaf 4d197711c188115df4eb1268a70574a93f16a2127a178a4e3cd1c99a76c5f043 exceeds blob bounds", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "coordinate-above-graphql-int", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "67d0e0573b4bd007ce1033f2117d47183544cef7a538fbdfad84861ea05894ff", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3133342c3138312c3134392c34342c312c33302c38392c37312c3135372c3133352c33322c3230302c392c3138322c38352c3134382c3132372c3231312c3139352c32302c38322c38342c3230392c3230322c33362c33322c38382c35362c3133372c3136352c3132332c3234355d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a6e756c6c2c22627974655f6c656e677468223a302c2275746631365f6c656e677468223a302c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3138332c3135362c38392c3139352c36382c34332c34352c39302c34302c3136302c3235312c3139392c3235352c31382c3131372c3231362c3130382c36362c34332c3232382c3134372c3131322c3131342c3231372c3139312c302c38372c34332c34392c31332c3233322c38385d2c2273657175656e6365223a307d" + }, + { + "nodeId": "7acee21e29fab35cc0e92c06da65b2d27a5de5ce14f65cf577b5e631c7527a3d", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3133342c3138312c3134392c34342c312c33302c38392c37312c3135372c3133352c33322c3230302c392c3138322c38352c3134382c3132372c3231312c3139352c32302c38322c38342c3230392c3230322c33362c33322c38382c35362c3133372c3136352c3132332c3234355d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a6e756c6c2c22627974655f6c656e677468223a323134373438333634382c2275746631365f6c656e677468223a302c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3138332c3135362c38392c3139352c36382c34332c34352c39302c34302c3136302c3235312c3139392c3235352c31382c3131372c3231362c3130382c36362c34332c3232382c3134372c3131322c3131342c3231372c3139312c302c38372c34332c34392c31332c3233322c38385d2c2273657175656e6365223a307d" + }, + { + "nodeId": "86b5952c011e59479d8720c809b655947fd3c3145254d1ca2420583889a57bf5", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a22636f6f7264696e6174652d61626f76652d6772617068716c2d696e74222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3132322c3230362c3232362c33302c34312c3235302c3137392c39322c3139322c3233332c34342c362c3231382c3130312c3137382c3231302c3132322c39332c3232392c3230362c32302c3234362c39322c3234352c3131392c3138312c3233302c34392c3139392c38322c3132322c36315d2c2276657273696f6e223a307d" + } + ], + "invocation": { + "bufferId": "86b5952c011e59479d8720c809b655947fd3c3145254d1ca2420583889a57bf5", + "basisHeadId": "7acee21e29fab35cc0e92c06da65b2d27a5de5ce14f65cf577b5e631c7527a3d", + "startByte": 2147483648, + "endByte": 2147483648, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2238366235393532633031316535393437396438373230633830396236353539343766643363333134353235346431636132343230353833383839613537626635222c226261736973486561644964223a2237616365653231653239666162333563633065393263303664613635623264323761356465356365313466363563663537376235653633316337353237613364222c22737461727442797465223a323134373438333634382c22656e6442797465223a323134373438333634382c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "malformed-rope", + "legacyErrorClass": "invalid-request", + "legacyMessage": "basis head byte length does not match root", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "leaf-range-start-overflow", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "1ec26f91b0daf19174853e7d6b37663fd03a5cff05e7ce3eb34a74b2b0eeb142", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b33322c3133332c3232322c39312c3231372c34332c3138382c32352c3134382c39332c3233382c3230362c3136342c3235352c3130372c3234322c3233302c37302c33322c35362c3231342c3138302c36362c3134362c3138322c3233352c34342c3132312c3139362c3230322c3231332c3232335d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b36342c3138342c39382c3230312c3234302c31362c3137302c31362c3136352c33372c3233362c35332c3131352c3136352c39352c33312c3135392c3135392c312c3232342c35302c3234372c3233392c35362c31352c3137332c3134362c3134312c3135312c3131352c3132312c3137305d2c22627974655f6c656e677468223a322c2275746631365f6c656e677468223a322c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b36342c3138342c39382c3230312c3234302c31362c3137302c31362c3136352c33372c3233362c35332c3131352c3136352c39352c33312c3135392c3135392c312c3232342c35302c3234372c3233392c35362c31352c3137332c3134362c3134312c3135312c3131352c3132312c3137305d2c2273657175656e6365223a307d" + }, + { + "nodeId": "2085de5bd92bbc19945deecea4ff6bf2e6462038d6b44292b6eb2c79c4cad5df", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226c6561662d72616e67652d73746172742d6f766572666c6f77222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b33302c3139342c3131312c3134352c3137362c3231382c3234312c3134352c3131362c3133332c36322c3132352c3130372c35352c3130322c36332c3230382c35382c39322c3235352c352c3233312c3230362c36322c3137392c37342c3131362c3137382c3137362c3233382c3137372c36365d2c2276657273696f6e223a307d" + }, + { + "nodeId": "40b862c9f010aa10a525ec3573a55f1f9f9f01e032f7ef380fad928d977379aa", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3138382c31372c332c352c352c3138392c38322c3135322c3130342c3137362c3130362c3139352c3233312c3132332c3138352c3132342c3230322c3233382c3232312c36342c3231392c3130392c3134322c35302c37352c3130362c3130382c3132302c3130312c3130302c35392c3135385d2c22627974655f7374617274223a31383434363734343037333730393535313631352c22627974655f6c656e677468223a322c2275746631365f6c656e677468223a322c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "4eaac81b34c389cdaa75878a163bb5160102d8d90264f1a69ba8a859ea01ee0d", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b33322c3133332c3232322c39312c3231372c34332c3138382c32352c3134382c39332c3233382c3230362c3136342c3235352c3130372c3234322c3233302c37302c33322c35362c3231342c3138302c36362c3134362c3138322c3233352c34342c3132312c3139362c3230322c3231332c3232335d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3231312c3135382c3130302c3230302c3130302c34322c3230362c3131352c38392c38312c32382c3130342c3131332c3134312c38302c37312c3130332c35352c3230392c36382c37322c33392c35342c3136382c3138392c3233322c3134312c3133312c3233362c3139392c3232382c3135355d2c22627974655f6c656e677468223a322c2275746631365f6c656e677468223a322c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3231312c3135382c3130302c3230302c3130302c34322c3230362c3131352c38392c38312c32382c3130342c3131332c3134312c38302c37312c3130332c35352c3230392c36382c37322c33392c35342c3136382c3138392c3233322c3134312c3133312c3233362c3139392c3232382c3135355d2c2273657175656e6365223a307d" + }, + { + "nodeId": "bc11030505bd529868b06ac3e77bb97ccaeedd40db6d8e324b6a6c7865643b9e", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3232372c3232372c33342c36362c3138332c3135332c32312c32332c3232352c3136362c3136372c3137372c3231322c3135382c32372c3233302c3232372c3135302c3131352c3131322c3135372c3137392c3138362c3137322c38372c3133332c3130342c3230332c3130392c36332c33362c3234325d2c226279746573223a5b39372c39385d7d" + }, + { + "nodeId": "d39e64c8642ace7359511c68718d50476737d144482736a8bde88d83ecc7e49b", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3138382c31372c332c352c352c3138392c38322c3135322c3130342c3137362c3130362c3139352c3233312c3132332c3138352c3132342c3230322c3233382c3232312c36342c3231392c3130392c3134322c35302c37352c3130362c3130382c3132302c3130312c3130302c35392c3135385d2c22627974655f7374617274223a302c22627974655f6c656e677468223a322c2275746631365f6c656e677468223a322c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "2085de5bd92bbc19945deecea4ff6bf2e6462038d6b44292b6eb2c79c4cad5df", + "basisHeadId": "1ec26f91b0daf19174853e7d6b37663fd03a5cff05e7ce3eb34a74b2b0eeb142", + "startByte": 1, + "endByte": 2, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2232303835646535626439326262633139393435646565636561346666366266326536343632303338643662343432393262366562326337396334636164356466222c226261736973486561644964223a2231656332366639316230646166313931373438353365376436623337363633666430336135636666303565376365336562333461373462326230656562313432222c22737461727442797465223a312c22656e6442797465223a322c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "arithmetic-overflow", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "leaf range start overflow", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "leaf-range-end-overflow", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "6f8945859beec5438d4c51052425503894eb2714baff54c0407c1755921e040f", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3136392c3131302c3131342c3233372c3134372c35302c34372c3234322c3138302c3138372c35322c3133392c36362c3137312c34332c39302c37302c3230302c37372c3136382c38382c3133382c32302c31332c3134332c38342c34332c3133342c3130392c3133332c32302c3132395d2c22627974655f7374617274223a31383434363734343037333730393535313631352c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "8996ce4ad683cd9d23c897225e9b1765e5d2edeb2744c2ee8a06efc084eaff0c", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226c6561662d72616e67652d656e642d6f766572666c6f77222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3139382c39312c31392c3234322c3136372c3231392c3138312c3233392c37322c3132312c31312c3231382c37372c3235302c32352c3231322c39382c3230312c3231302c3131322c3132382c3133382c39342c3233392c3233372c3235342c32382c3137312c36302c34352c3230382c3131385d2c2276657273696f6e223a307d" + }, + { + "nodeId": "8ac010bbd072db661bc6dcb94bac23c40656d9d6a98c6d5be8938a2d13d0ce8a", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3133372c3135302c3230362c37342c3231342c3133312c3230352c3135372c33352c3230302c3135312c33342c39342c3135352c32332c3130312c3232392c3231302c3233372c3233352c33392c36382c3139342c3233382c3133382c362c3233392c3139322c3133322c3233342c3235352c31325d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3234312c35352c3135372c39352c34382c35372c32392c3231302c3234332c312c3234302c3135392c3131302c33372c3134392c31322c3134332c3133362c3230312c35302c34352c3137362c3234312c3134372c3135372c3234302c3138302c35302c3130342c3131302c3131302c3133325d2c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3234312c35352c3135372c39352c34382c35372c32392c3231302c3234332c312c3234302c3135392c3131302c33372c3134392c31322c3134332c3133362c3230312c35302c34352c3137362c3234312c3134372c3135372c3234302c3138302c35302c3130342c3131302c3131302c3133325d2c2273657175656e6365223a307d" + }, + { + "nodeId": "a96e72ed93322ff2b4bb348b42ab2b5a46c84da8588a140d8f542b866d851481", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3234322c36302c3235322c3135302c3138342c3135382c3233322c3235302c3139342c322c3130312c32342c3133342c3234322c38362c3235332c342c3130302c32362c3138352c3133372c36332c3131372c3230322c3136342c3235302c38302c35322c3134392c3234362c39352c34365d2c226279746573223a5b39375d7d" + }, + { + "nodeId": "c65b13f2a7dbb5ef48790bda4dfa19d462c9d270808a5eefedfe1cab3c2dd076", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3133372c3135302c3230362c37342c3231342c3133312c3230352c3135372c33352c3230302c3135312c33342c39342c3135352c32332c3130312c3232392c3231302c3233372c3233352c33392c36382c3139342c3233382c3133382c362c3233392c3139322c3133322c3233342c3235352c31325d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3131312c3133372c36392c3133332c3135352c3233382c3139372c36372c3134312c37362c38312c352c33362c33372c38302c35362c3134382c3233352c33392c32302c3138362c3235352c38342c3139322c36342c3132342c32332c38352c3134362c33302c342c31355d2c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3131312c3133372c36392c3133332c3135352c3233382c3139372c36372c3134312c37362c38312c352c33362c33372c38302c35362c3134382c3233352c33392c32302c3138362c3235352c38342c3139322c36342c3132342c32332c38352c3134362c33302c342c31355d2c2273657175656e6365223a307d" + }, + { + "nodeId": "f1379d5f30391dd2f301f09f6e25950c8f88c9322db0f1939df0b432686e6e84", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3136392c3131302c3131342c3233372c3134372c35302c34372c3234322c3138302c3138372c35322c3133392c36362c3137312c34332c39302c37302c3230302c37372c3136382c38382c3133382c32302c31332c3134332c38342c34332c3133342c3130392c3133332c32302c3132395d2c22627974655f7374617274223a302c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "8996ce4ad683cd9d23c897225e9b1765e5d2edeb2744c2ee8a06efc084eaff0c", + "basisHeadId": "c65b13f2a7dbb5ef48790bda4dfa19d462c9d270808a5eefedfe1cab3c2dd076", + "startByte": 0, + "endByte": 1, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2238393936636534616436383363643964323363383937323235653962313736356535643265646562323734346332656538613036656663303834656166663063222c226261736973486561644964223a2263363562313366326137646262356566343837393062646134646661313964343632633964323730383038613565656665646665316361623363326464303736222c22737461727442797465223a302c22656e6442797465223a312c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "arithmetic-overflow", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "leaf range end overflow", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "rope-node-end-overflow", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "4d197711c188115df4eb1268a70574a93f16a2127a178a4e3cd1c99a76c5f043", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b37302c3131302c39362c3234382c39382c3135302c35362c37372c31302c34392c3233342c3232342c33372c3139322c34322c34362c36362c3130342c33332c3231362c32342c3135352c34362c302c3130322c3137382c3231392c3230392c3234362c31332c38372c34315d2c226279746573223a5b39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39375d7d" + }, + { + "nodeId": "693ac326fba0d42f23410300d78cc689b68a672ab416d42f77a774ed9653551b", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3132312c37332c3133322c39352c3134392c31332c3138332c3136362c37332c39312c36302c3139382c3134322c3131322c3137302c3231392c3139302c3230322c3232312c3139352c32392c3136332c3137362c3134382c3233382c31342c352c3131322c3234342c3134392c3234352c31345d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3234382c3235322c3131342c31322c3131312c38302c33332c31302c3234382c3138302c3130312c35362c39362c3138352c3233312c3137352c3230312c35312c3136342c36372c32342c3137342c37322c3131342c3231312c35302c3136322c3130362c3138372c3135332c3232382c38325d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3234382c3235322c3131342c31322c3131312c38302c33332c31302c3234382c3138302c3130312c35362c39362c3138352c3233312c3137352c3230312c35312c3136342c36372c32342c3137342c37322c3131342c3231312c35302c3136322c3130362c3138372c3135332c3232382c38325d2c2273657175656e6365223a307d" + }, + { + "nodeId": "7949845f950db7a6495b3cc68e70aadbbecaddc31da3b094ee0e0570f495f50e", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a22726f70652d6e6f64652d656e642d6f766572666c6f77222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3130352c35382c3139352c33382c3235312c3136302c3231322c34372c33352c36352c332c302c3231352c3134302c3139382c3133372c3138322c3133382c3130332c34322c3138302c32322c3231322c34372c3131392c3136372c3131362c3233372c3135302c38332c38352c32375d2c2276657273696f6e223a307d" + }, + { + "nodeId": "82476c884c06397d5f00983caebb98952b275fcbee46d6619ce04753d540543a", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3132312c37332c3133322c39352c3134392c31332c3138332c3136362c37332c39312c36302c3139382c3134322c3131322c3137302c3231392c3139302c3230322c3232312c3139352c32392c3136332c3137362c3134382c3233382c31342c352c3131322c3234342c3134392c3234352c31345d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3230332c35362c3233362c3139322c382c3137362c362c38312c3230332c3233372c3133372c35392c3132322c38342c38362c3134362c3137322c3136392c32382c3132342c3136352c37362c3136362c37382c3233352c3133392c36362c3132392c3132342c38372c3132302c33345d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3230332c35362c3233362c3139322c382c3137362c362c38312c3230332c3233372c3133372c35392c3132322c38342c38362c3134362c3137322c3136392c32382c3132342c3136352c37362c3136362c37382c3233352c3133392c36362c3132392c3132342c38372c3132302c33345d2c2273657175656e6365223a307d" + }, + { + "nodeId": "87bc414f79ec6ff8431cb551c434f17f9ea1959d63892ed83cc018341b497617", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3232372c3232332c31372c37332c35382c3138382c3137362c38392c35362c32362c3230332c3133372c37312c3138312c31382c3235342c3232322c34322c3136392c39352c3139312c3137372c312c3137372c3230392c39382c3134302c3133372c3230302c32332c3235312c3132395d2c226279746573223a5b39385d7d" + }, + { + "nodeId": "89d138e87e58cce6c0c8362e4924c259f45dd8811bc03fda8625e96244cf6e83", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b37372c32352c3131392c31372c3139332c3133362c31372c39332c3234342c3233352c31382c3130342c3136372c352c3131362c3136392c36332c32322c3136322c31382c3132322c32332c3133382c37382c36302c3230392c3230312c3135342c3131382c3139372c3234302c36375d2c22627974655f7374617274223a302c22627974655f6c656e677468223a343039362c2275746631365f6c656e677468223a343039362c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "8da3c1b53b66fea09ac5151a6f37310e71f930d0300fecb092718df6df700475", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3133352c3138382c36352c37392c3132312c3233362c3131312c3234382c36372c32382c3138312c38312c3139362c35322c3234312c3132372c3135382c3136312c3134392c3135372c39392c3133372c34362c3231362c36302c3139322c32342c35322c32372c37332c3131382c32335d2c22627974655f7374617274223a302c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "cb38ecc008b00651cbed893b7a545692aca91c7ca54ca64eeb8b42817c577822", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3133372c3230392c35362c3233322c3132362c38382c3230342c3233302c3139322c3230302c35342c34362c37332c33362c3139342c38392c3234342c39332c3231362c3132392c32372c3139322c36332c3231382c3133342c33372c3233332c39382c36382c3230372c3131302c3133315d2c227269676874223a5b3134312c3136332c3139332c3138312c35392c3130322c3235342c3136302c3135342c3139372c32312c32362c3131312c35352c34392c31342c3131332c3234392c34382c3230382c34382c31352c3233362c3137362c3134362c3131332c3134312c3234362c3232332c3131322c342c3131375d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f627265616b73223a302c22686569676874223a327d" + }, + { + "nodeId": "f0186a0aed3263063e94052787baaac5c5bf267e7eaf563f0819fe9347422c40", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b37372c32352c3131392c31372c3139332c3133362c31372c39332c3234342c3233352c31382c3130342c3136372c352c3131362c3136392c36332c32322c3136322c31382c3132322c32332c3133382c37382c36302c3230392c3230312c3135342c3131382c3139372c3234302c36375d2c22627974655f7374617274223a302c22627974655f6c656e677468223a31383434363734343037333730393535313631352c2275746631365f6c656e677468223a343039362c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "f8fc720c6f50210af8b4653860b9e7afc933a44318ae4872d332a26abb99e452", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3234302c32342c3130362c31302c3233372c35302c39392c362c36322c3134382c352c33392c3133352c3138362c3137302c3139372c3139372c3139312c33382c3132362c3132362c3137352c38362c36332c382c32352c3235342c3134372c37312c36362c34342c36345d2c227269676874223a5b3134312c3136332c3139332c3138312c35392c3130322c3235342c3136302c3135342c3139372c32312c32362c3131312c35352c34392c31342c3131332c3234392c34382c3230382c34382c31352c3233362c3137362c3134362c3131332c3134312c3234362c3232332c3131322c342c3131375d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f627265616b73223a302c22686569676874223a327d" + } + ], + "invocation": { + "bufferId": "7949845f950db7a6495b3cc68e70aadbbecaddc31da3b094ee0e0570f495f50e", + "basisHeadId": "693ac326fba0d42f23410300d78cc689b68a672ab416d42f77a774ed9653551b", + "startByte": 0, + "endByte": 1, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2237393439383435663935306462376136343935623363633638653730616164626265636164646333316461336230393465653065303537306634393566353065222c226261736973486561644964223a2236393361633332366662613064343266323334313033303064373863633638396236386136373261623431366434326637376137373465643936353335353162222c22737461727442797465223a302c22656e6442797465223a312c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "arithmetic-overflow", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "rope node end overflow", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "leaf-extent-u64-max-at-zero", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "360abcfce538994e9b680371726ca04c18234f462f2452c84a1b2cdb4fec10a7", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3133392c32322c3131352c3137312c3131372c3231332c3137302c3230362c31362c33392c3133332c38302c3231362c32372c3132312c34312c3234362c3230322c31322c3232382c3235342c3133382c3137382c3132332c3233322c3234312c3138362c3232312c3136332c312c3139322c3138335d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3234372c3139302c3133372c3136352c33312c3139322c302c3138312c37342c3130332c3230312c3230312c3133372c3132372c3137312c3131332c322c3131352c3131302c3135332c39302c3135312c3234332c37332c33372c3130312c352c3132352c3232372c3136382c3135302c3232315d2c22627974655f6c656e677468223a31383434363734343037333730393535313631352c2275746631365f6c656e677468223a312c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3234372c3139302c3133372c3136352c33312c3139322c302c3138312c37342c3130332c3230312c3230312c3133372c3132372c3137312c3131332c322c3131352c3131302c3135332c39302c3135312c3234332c37332c33372c3130312c352c3132352c3232372c3136382c3135302c3232315d2c2273657175656e6365223a307d" + }, + { + "nodeId": "8b1673ab75d5aace10278550d81b7929f6ca0ce4fe8ab27be8f1badda301c0b7", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226c6561662d657874656e742d7536342d6d61782d61742d7a65726f222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b35342c31302c3138382c3235322c3232392c35362c3135332c37382c3135352c3130342c332c3131332c3131342c3130382c3136302c37362c32342c33352c37392c37302c34372c33362c38322c3230302c37342c32372c34342c3231392c37392c3233362c31362c3136375d2c2276657273696f6e223a307d" + }, + { + "nodeId": "a96e72ed93322ff2b4bb348b42ab2b5a46c84da8588a140d8f542b866d851481", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3234322c36302c3235322c3135302c3138342c3135382c3233322c3235302c3139342c322c3130312c32342c3133342c3234322c38362c3235332c342c3130302c32362c3138352c3133372c36332c3131372c3230322c3136342c3235302c38302c35322c3134392c3234362c39352c34365d2c226279746573223a5b39375d7d" + }, + { + "nodeId": "ddbf110b911498dc607475604e721268032f53905a8caf067d3e94691163e44f", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3133392c32322c3131352c3137312c3131372c3231332c3137302c3230362c31362c33392c3133332c38302c3231362c32372c3132312c34312c3234362c3230322c31322c3232382c3235342c3133382c3137382c3132332c3233322c3234312c3138362c3232312c3136332c312c3139322c3138335d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3234312c35352c3135372c39352c34382c35372c32392c3231302c3234332c312c3234302c3135392c3131302c33372c3134392c31322c3134332c3133362c3230312c35302c34352c3137362c3234312c3134372c3135372c3234302c3138302c35302c3130342c3131302c3131302c3133325d2c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3234312c35352c3135372c39352c34382c35372c32392c3231302c3234332c312c3234302c3135392c3131302c33372c3134392c31322c3134332c3133362c3230312c35302c34352c3137362c3234312c3134372c3135372c3234302c3138302c35302c3130342c3131302c3131302c3133325d2c2273657175656e6365223a307d" + }, + { + "nodeId": "f1379d5f30391dd2f301f09f6e25950c8f88c9322db0f1939df0b432686e6e84", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3136392c3131302c3131342c3233372c3134372c35302c34372c3234322c3138302c3138372c35322c3133392c36362c3137312c34332c39302c37302c3230302c37372c3136382c38382c3133382c32302c31332c3134332c38342c34332c3133342c3130392c3133332c32302c3132395d2c22627974655f7374617274223a302c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "f7be89a51fc000b54a67c9c9897fab7102736e995a97f3492565057de3a896dd", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3136392c3131302c3131342c3233372c3134372c35302c34372c3234322c3138302c3138372c35322c3133392c36362c3137312c34332c39302c37302c3230302c37372c3136382c38382c3133382c32302c31332c3134332c38342c34332c3133342c3130392c3133332c32302c3132395d2c22627974655f7374617274223a302c22627974655f6c656e677468223a31383434363734343037333730393535313631352c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "8b1673ab75d5aace10278550d81b7929f6ca0ce4fe8ab27be8f1badda301c0b7", + "basisHeadId": "360abcfce538994e9b680371726ca04c18234f462f2452c84a1b2cdb4fec10a7", + "startByte": 0, + "endByte": 0, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2238623136373361623735643561616365313032373835353064383162373932396636636130636534666538616232376265386631626164646133303163306237222c226261736973486561644964223a2233363061626366636535333839393465396236383033373137323663613034633138323334663436326632343532633834613162326364623466656331306137222c22737461727442797465223a302c22656e6442797465223a302c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "fact-malformed", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "leaf a96e72ed93322ff2b4bb348b42ab2b5a46c84da8588a140d8f542b866d851481 exceeds blob bounds", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "rope-utf16-length-overflow", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "23178518ebd0f3cc19c0379fb231c873ffb3ba1590a49f4210297241c89ee736", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b39392c3132312c3133342c3137342c3234322c36302c3233302c3137362c39312c3134302c32362c3137332c3131362c3137362c3132372c3139382c3134302c3230372c35312c39392c3136332c32332c36312c3230392c34302c3234342c32382c3130322c31302c3136322c322c3134375d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b38372c3136362c3139352c3230382c37312c33312c3133312c3139322c31322c3133352c3230352c3231392c3139322c32352c35312c3137342c3130382c33342c3134392c3230372c3134312c362c3230352c3233352c3234382c37392c31312c3230382c3234302c3139342c3232362c3231315d2c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b38372c3136362c3139352c3230382c37312c33312c3133312c3139322c31322c3133352c3230352c3231392c3139322c32352c35312c3137342c3130382c33342c3134392c3230372c3134312c362c3230352c3233352c3234382c37392c31312c3230382c3234302c3139342c3232362c3231315d2c2273657175656e6365223a307d" + }, + { + "nodeId": "57a6c3d0471f83c00c87cddbc01933ae6c2295cf8d06cdebf84f0bd0f0c2e2d3", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3136392c3131302c3131342c3233372c3134372c35302c34372c3234322c3138302c3138372c35322c3133392c36362c3137312c34332c39302c37302c3230302c37372c3136382c38382c3133382c32302c31332c3134332c38342c34332c3133342c3130392c3133332c32302c3132395d2c22627974655f7374617274223a302c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a31383434363734343037333730393535313631352c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "637986aef23ce6b05b8c1aad74b07fc68ccf3363a3173dd128f41c660aa20293", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a22726f70652d75746631362d6c656e6774682d6f766572666c6f77222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b33352c32332c3133332c32342c3233352c3230382c3234332c3230342c32352c3139322c35352c3135392c3137382c34392c3230302c3131352c3235352c3137392c3138362c32312c3134342c3136342c3135392c36362c31362c34312c3131342c36352c3230302c3135382c3233312c35345d2c2276657273696f6e223a307d" + }, + { + "nodeId": "9b3aea333b91abc30e907f586eed140670e9ab5bc0ea9b74e7fa0d6947f06e2b", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b39392c3132312c3133342c3137342c3234322c36302c3233302c3137362c39312c3134302c32362c3137332c3131362c3137362c3132372c3139382c3134302c3230372c35312c39392c3136332c32332c36312c3230392c34302c3234342c32382c3130322c31302c3136322c322c3134375d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3234312c35352c3135372c39352c34382c35372c32392c3231302c3234332c312c3234302c3135392c3131302c33372c3134392c31322c3134332c3133362c3230312c35302c34352c3137362c3234312c3134372c3135372c3234302c3138302c35302c3130342c3131302c3131302c3133325d2c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3234312c35352c3135372c39352c34382c35372c32392c3231302c3234332c312c3234302c3135392c3131302c33372c3134392c31322c3134332c3133362c3230312c35302c34352c3137362c3234312c3134372c3135372c3234302c3138302c35302c3130342c3131302c3131302c3133325d2c2273657175656e6365223a307d" + }, + { + "nodeId": "a96e72ed93322ff2b4bb348b42ab2b5a46c84da8588a140d8f542b866d851481", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3234322c36302c3235322c3135302c3138342c3135382c3233322c3235302c3139342c322c3130312c32342c3133342c3234322c38362c3235332c342c3130302c32362c3138352c3133372c36332c3131372c3230322c3136342c3235302c38302c35322c3134392c3234362c39352c34365d2c226279746573223a5b39375d7d" + }, + { + "nodeId": "f1379d5f30391dd2f301f09f6e25950c8f88c9322db0f1939df0b432686e6e84", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3136392c3131302c3131342c3233372c3134372c35302c34372c3234322c3138302c3138372c35322c3133392c36362c3137312c34332c39302c37302c3230302c37372c3136382c38382c3133382c32302c31332c3134332c38342c34332c3133342c3130392c3133332c32302c3132395d2c22627974655f7374617274223a302c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "637986aef23ce6b05b8c1aad74b07fc68ccf3363a3173dd128f41c660aa20293", + "basisHeadId": "23178518ebd0f3cc19c0379fb231c873ffb3ba1590a49f4210297241c89ee736", + "startByte": 0, + "endByte": 0, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2236333739383661656632336365366230356238633161616437346230376663363863636633333633613331373364643132386634316336363061613230323933222c226261736973486561644964223a2232333137383531386562643066336363313963303337396662323331633837336666623362613135393061343966343231303239373234316338396565373336222c22737461727442797465223a302c22656e6442797465223a302c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "arithmetic-overflow", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "rope UTF-16 length overflow", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "rope-line-break-count-overflow", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "4c4fa5c3a463f6b3ecd465915c0c1b0fe92d46b0cc8f8c34adad892ddffa9df4", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a22726f70652d6c696e652d627265616b2d636f756e742d6f766572666c6f77222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3138352c3234332c3139312c37382c3133332c3130362c35312c3139332c38352c37332c3130302c3130302c3136332c3130342c3136392c3130332c3134392c3231382c37392c3136362c3231352c3234372c3234312c3131332c3132372c33382c3139302c3133382c3233332c3234382c3137312c3130395d2c2276657273696f6e223a307d" + }, + { + "nodeId": "986fef2ab43313a6f9c3e65ea6108840eb6e4bbf3c09fc9c8a4c186ee05c2e4b", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3136392c3131302c3131342c3233372c3134372c35302c34372c3234322c3138302c3138372c35322c3133392c36362c3137312c34332c39302c37302c3230302c37372c3136382c38382c3133382c32302c31332c3134332c38342c34332c3133342c3130392c3133332c32302c3132395d2c22627974655f7374617274223a302c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a31383434363734343037333730393535313631357d" + }, + { + "nodeId": "a96e72ed93322ff2b4bb348b42ab2b5a46c84da8588a140d8f542b866d851481", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3234322c36302c3235322c3135302c3138342c3135382c3233322c3235302c3139342c322c3130312c32342c3133342c3234322c38362c3235332c342c3130302c32362c3138352c3133372c36332c3131372c3230322c3136342c3235302c38302c35322c3134392c3234362c39352c34365d2c226279746573223a5b39375d7d" + }, + { + "nodeId": "b9f3bf4e856a33c155496464a368a96795da4fa6d7f7f1717f26be8ae9f8ab6d", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b37362c37392c3136352c3139352c3136342c39392c3234362c3137392c3233362c3231322c3130312c3134352c39322c31322c32372c31352c3233332c34352c37302c3137362c3230342c3134332c3134302c35322c3137332c3137332c3133372c34352c3232332c3235302c3135372c3234345d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3135322c3131312c3233392c34322c3138302c35312c31392c3136362c3234392c3139352c3233302c39342c3136362c31362c3133362c36342c3233352c3131302c37352c3139312c36302c392c3235322c3135362c3133382c37362c32342c3131302c3232342c39322c34362c37355d2c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3135322c3131312c3233392c34322c3138302c35312c31392c3136362c3234392c3139352c3233302c39342c3136362c31362c3133362c36342c3233352c3131302c37352c3139312c36302c392c3235322c3135362c3133382c37362c32342c3131302c3232342c39322c34362c37355d2c2273657175656e6365223a307d" + }, + { + "nodeId": "ec03f615037ebed20ce0056c34346f97f1cda0614be6cfc379b59fca72faa4be", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b37362c37392c3136352c3139352c3136342c39392c3234362c3137392c3233362c3231322c3130312c3134352c39322c31322c32372c31352c3233332c34352c37302c3137362c3230342c3134332c3134302c35322c3137332c3137332c3133372c34352c3232332c3235302c3135372c3234345d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3234312c35352c3135372c39352c34382c35372c32392c3231302c3234332c312c3234302c3135392c3131302c33372c3134392c31322c3134332c3133362c3230312c35302c34352c3137362c3234312c3134372c3135372c3234302c3138302c35302c3130342c3131302c3131302c3133325d2c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3234312c35352c3135372c39352c34382c35372c32392c3231302c3234332c312c3234302c3135392c3131302c33372c3134392c31322c3134332c3133362c3230312c35302c34352c3137362c3234312c3134372c3135372c3234302c3138302c35302c3130342c3131302c3131302c3133325d2c2273657175656e6365223a307d" + }, + { + "nodeId": "f1379d5f30391dd2f301f09f6e25950c8f88c9322db0f1939df0b432686e6e84", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3136392c3131302c3131342c3233372c3134372c35302c34372c3234322c3138302c3138372c35322c3133392c36362c3137312c34332c39302c37302c3230302c37372c3136382c38382c3133382c32302c31332c3134332c38342c34332c3133342c3130392c3133332c32302c3132395d2c22627974655f7374617274223a302c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "4c4fa5c3a463f6b3ecd465915c0c1b0fe92d46b0cc8f8c34adad892ddffa9df4", + "basisHeadId": "b9f3bf4e856a33c155496464a368a96795da4fa6d7f7f1717f26be8ae9f8ab6d", + "startByte": 0, + "endByte": 0, + "replacementUtf8Hex": "0a" + }, + "invocationBytesHex": "7b226275666665724964223a2234633466613563336134363366366233656364343635393135633063316230666539326434366230636338663863333461646164383932646466666139646634222c226261736973486561644964223a2262396633626634653835366133336331353534393634363461333638613936373935646134666136643766376631373137663236626538616539663861623664222c22737461727442797465223a302c22656e6442797465223a302c227265706c6163656d656e7455746638486578223a223061227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "arithmetic-overflow", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "rope line break count overflow", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "branch-height-u32-max-at-zero", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "29323513c3847cc99bd24c3100948ef825b5bcd52604bbebbe585d951e823025", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3133362c3231392c3231332c3232382c36362c3139332c33312c3136372c33342c3231302c392c3234372c35352c3136362c3232312c38332c3131332c36362c3234372c3134302c32332c38332c3132372c352c3234302c3130332c3130372c3131342c37322c3138322c3230372c34305d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3230332c35362c3233362c3139322c382c3137362c362c38312c3230332c3233372c3133372c35392c3132322c38342c38362c3134362c3137322c3136392c32382c3132342c3136352c37362c3136362c37382c3233352c3133392c36362c3132392c3132342c38372c3132302c33345d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3230332c35362c3233362c3139322c382c3137362c362c38312c3230332c3233372c3133372c35392c3132322c38342c38362c3134362c3137322c3136392c32382c3132342c3136352c37362c3136362c37382c3233352c3133392c36362c3132392c3132342c38372c3132302c33345d2c2273657175656e6365223a307d" + }, + { + "nodeId": "4d197711c188115df4eb1268a70574a93f16a2127a178a4e3cd1c99a76c5f043", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b37302c3131302c39362c3234382c39382c3135302c35362c37372c31302c34392c3233342c3232342c33372c3139322c34322c34362c36362c3130342c33332c3231362c32342c3135352c34362c302c3130322c3137382c3231392c3230392c3234362c31332c38372c34315d2c226279746573223a5b39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39372c39375d7d" + }, + { + "nodeId": "52af77a8f6eed32b29ff0759d46c5d4cf0de8037ab83f66708f07bc2c9df0a25", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b3133362c3231392c3231332c3232382c36362c3139332c33312c3136372c33342c3231302c392c3234372c35352c3136362c3232312c38332c3131332c36362c3234372c3134302c32332c38332c3132372c352c3234302c3130332c3130372c3131342c37322c3138322c3230372c34305d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3137312c3134362c39342c3136332c3138352c32352c3132382c3134302c392c3136392c3132332c3231392c3136302c3134342c32342c3232352c3133352c3137342c37332c3131322c34352c3235332c3131302c3130302c39342c3233382c3231302c3138312c3137342c3134332c3136332c3135305d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3137312c3134362c39342c3136332c3138352c32352c3132382c3134302c392c3136392c3132332c3231392c3136302c3134342c32342c3232352c3133352c3137342c37332c3131322c34352c3235332c3131302c3130302c39342c3233382c3231302c3138312c3137342c3134332c3136332c3135305d2c2273657175656e6365223a307d" + }, + { + "nodeId": "87bc414f79ec6ff8431cb551c434f17f9ea1959d63892ed83cc018341b497617", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3232372c3232332c31372c37332c35382c3138382c3137362c38392c35362c32362c3230332c3133372c37312c3138312c31382c3235342c3232322c34322c3136392c39352c3139312c3137372c312c3137372c3230392c39382c3134302c3133372c3230302c32332c3235312c3132395d2c226279746573223a5b39385d7d" + }, + { + "nodeId": "88dbd5e442c11fa722d209f737a6dd537142f78c17537f05f0676b7248b6cf28", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a226272616e63682d6865696768742d7533322d6d61782d61742d7a65726f222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b38322c3137352c3131392c3136382c3234362c3233382c3231312c34332c34312c3235352c372c38392c3231322c3130382c39332c37362c3234302c3232322c3132382c35352c3137312c3133312c3234362c3130332c382c3234302c3132332c3139342c3230312c3232332c31302c33375d2c2276657273696f6e223a307d" + }, + { + "nodeId": "89d138e87e58cce6c0c8362e4924c259f45dd8811bc03fda8625e96244cf6e83", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b37372c32352c3131392c31372c3139332c3133362c31372c39332c3234342c3233352c31382c3130342c3136372c352c3131362c3136392c36332c32322c3136322c31382c3132322c32332c3133382c37382c36302c3230392c3230312c3135342c3131382c3139372c3234302c36375d2c22627974655f7374617274223a302c22627974655f6c656e677468223a343039362c2275746631365f6c656e677468223a343039362c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "8da3c1b53b66fea09ac5151a6f37310e71f930d0300fecb092718df6df700475", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3133352c3138382c36352c37392c3132312c3233362c3131312c3234382c36372c32382c3138312c38312c3139362c35322c3234312c3132372c3135382c3136312c3134392c3135372c39392c3133372c34362c3231362c36302c3139322c32342c35322c32372c37332c3131382c32335d2c22627974655f7374617274223a302c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a307d" + }, + { + "nodeId": "ab925ea3b919808c09a97bdba09018e187ae49702dfd6e645eeed2b5ae8fa396", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3133372c3230392c35362c3233322c3132362c38382c3230342c3233302c3139322c3230302c35342c34362c37332c33362c3139342c38392c3234342c39332c3231362c3132392c32372c3139322c36332c3231382c3133342c33372c3233332c39382c36382c3230372c3131302c3133315d2c227269676874223a5b3134312c3136332c3139332c3138312c35392c3130322c3235342c3136302c3135342c3139372c32312c32362c3131312c35352c34392c31342c3131332c3234392c34382c3230382c34382c31352c3233362c3137362c3134362c3131332c3134312c3234362c3232332c3131322c342c3131375d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f627265616b73223a302c22686569676874223a343239343936373239357d" + }, + { + "nodeId": "cb38ecc008b00651cbed893b7a545692aca91c7ca54ca64eeb8b42817c577822", + "typeId": "013a193bce05cad9da1c765bbe2c057c27f79aefdb980470a00c621f3d03b8f1", + "attachmentBytesHex": "7b226c656674223a5b3133372c3230392c35362c3233322c3132362c38382c3230342c3233302c3139322c3230302c35342c34362c37332c33362c3139342c38392c3234342c39332c3231362c3132392c32372c3139322c36332c3231382c3133342c33372c3233332c39382c36382c3230372c3131302c3133315d2c227269676874223a5b3134312c3136332c3139332c3138312c35392c3130322c3235342c3136302c3135342c3139372c32312c32362c3131312c35352c34392c31342c3131332c3234392c34382c3230382c34382c31352c3233362c3137362c3134362c3131332c3134312c3234362c3232332c3131322c342c3131375d2c22627974655f6c656e677468223a343039372c2275746631365f6c656e677468223a343039372c226c696e655f627265616b73223a302c22686569676874223a327d" + } + ], + "invocation": { + "bufferId": "88dbd5e442c11fa722d209f737a6dd537142f78c17537f05f0676b7248b6cf28", + "basisHeadId": "52af77a8f6eed32b29ff0759d46c5d4cf0de8037ab83f66708f07bc2c9df0a25", + "startByte": 0, + "endByte": 0, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2238386462643565343432633131666137323264323039663733376136646435333731343266373863313735333766303566303637366237323438623663663238222c226261736973486561644964223a2235326166373761386636656564333262323966663037353964343663356434636630646538303337616238336636363730386630376263326339646630613235222c22737461727442797465223a302c22656e6442797465223a302c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "fact-malformed", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "branch height does not match children at ab925ea3b919808c09a97bdba09018e187ae49702dfd6e645eeed2b5ae8fa396", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + }, + { + "id": "head-line-count-overflow", + "purpose": "typed no-plan ReplaceRange obstruction witness", + "basisFacts": [ + { + "nodeId": "3834267a48794a5184d11f15956f3ee7813f5a6c1f73e82d16b07ea7785cb2bc", + "typeId": "82c8f7ee9cfef2e1333ec0a4429cd75ae9e1a2e3fada99d82192851a9ddbcf1e", + "attachmentBytesHex": "7b226275666665725f6b6579223a22686561642d6c696e652d636f756e742d6f766572666c6f77222c2270726f6a656374696f6e5f70617468223a6e756c6c2c2263616e6f6e6963616c5f686561645f6964223a5b3135332c38302c38372c35322c36392c31372c35392c3130382c3137392c3130322c37352c37382c35392c3232322c3136302c39312c3234302c34392c3135352c3138372c3230322c3231332c34322c32372c34342c3136302c38352c3130372c36302c3233302c3133362c3138315d2c2276657273696f6e223a307d" + }, + { + "nodeId": "986fef2ab43313a6f9c3e65ea6108840eb6e4bbf3c09fc9c8a4c186ee05c2e4b", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3136392c3131302c3131342c3233372c3134372c35302c34372c3234322c3138302c3138372c35322c3133392c36362c3137312c34332c39302c37302c3230302c37372c3136382c38382c3133382c32302c31332c3134332c38342c34332c3133342c3130392c3133332c32302c3132395d2c22627974655f7374617274223a302c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a31383434363734343037333730393535313631357d" + }, + { + "nodeId": "9950573445113b6cb3664b4e3bdea05bf0319bbbcad52a1b2ca0556b3ce688b5", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b35362c35322c33382c3132322c37322c3132312c37342c38312c3133322c3230392c33312c32312c3134392c3131312c36322c3233312c3132392c36332c39302c3130382c33312c3131352c3233322c34352c32322c3137362c3132362c3136372c3132302c39322c3137382c3138385d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3135322c3131312c3233392c34322c3138302c35312c31392c3136362c3234392c3139352c3233302c39342c3136362c31362c3133362c36342c3233352c3131302c37352c3139312c36302c392c3235322c3135362c3133382c37362c32342c3131302c3232342c39322c34362c37355d2c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3135322c3131312c3233392c34322c3138302c35312c31392c3136362c3234392c3139352c3233302c39342c3136362c31362c3133362c36342c3233352c3131302c37352c3139312c36302c392c3235322c3135362c3133382c37362c32342c3131302c3232342c39322c34362c37355d2c2273657175656e6365223a307d" + }, + { + "nodeId": "a96e72ed93322ff2b4bb348b42ab2b5a46c84da8588a140d8f542b866d851481", + "typeId": "84d7b45a63c4bde2e3cbafc7c47df22f665bdaff0ab966daf4e1d453d9dccfd9", + "attachmentBytesHex": "7b22636f6e74656e745f68617368223a5b3234322c36302c3235322c3135302c3138342c3135382c3233322c3235302c3139342c322c3130312c32342c3133342c3234322c38362c3235332c342c3130302c32362c3138352c3133372c36332c3131372c3230322c3136342c3235302c38302c35322c3134392c3234362c39352c34365d2c226279746573223a5b39375d7d" + }, + { + "nodeId": "c0aad3a0e7023201dfa17be744492874130357ae068cd75225813f4da56679b9", + "typeId": "cbead59065296fb541ea52b3a9b7e19c40ae063150636e6d50eb9bcb4735314e", + "attachmentBytesHex": "7b226275666665725f6964223a5b35362c35322c33382c3132322c37322c3132312c37342c38312c3133322c3230392c33312c32312c3134392c3131312c36322c3233312c3132392c36332c39302c3130382c33312c3131352c3233322c34352c32322c3137362c3132362c3136372c3132302c39322c3137382c3138385d2c2262617369735f686561645f6964223a6e756c6c2c22726f6f745f6e6f64655f6964223a5b3234312c35352c3135372c39352c34382c35372c32392c3231302c3234332c312c3234302c3135392c3131302c33372c3134392c31322c3134332c3133362c3230312c35302c34352c3137362c3234312c3134372c3135372c3234302c3138302c35302c3130342c3131302c3131302c3133325d2c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f636f756e74223a312c22726f6f745f646967657374223a5b3234312c35352c3135372c39352c34382c35372c32392c3231302c3234332c312c3234302c3135392c3131302c33372c3134392c31322c3134332c3133362c3230312c35302c34352c3137362c3234312c3134372c3135372c3234302c3138302c35302c3130342c3131302c3131302c3133325d2c2273657175656e6365223a307d" + }, + { + "nodeId": "f1379d5f30391dd2f301f09f6e25950c8f88c9322db0f1939df0b432686e6e84", + "typeId": "910a3066b739ebd0a1bbab7d3c13acec9189e47340a02b5b018ee251d06ea5b4", + "attachmentBytesHex": "7b22626c6f625f6964223a5b3136392c3131302c3131342c3233372c3134372c35302c34372c3234322c3138302c3138372c35322c3133392c36362c3137312c34332c39302c37302c3230302c37372c3136382c38382c3133382c32302c31332c3134332c38342c34332c3133342c3130392c3133332c32302c3132395d2c22627974655f7374617274223a302c22627974655f6c656e677468223a312c2275746631365f6c656e677468223a312c226c696e655f627265616b73223a307d" + } + ], + "invocation": { + "bufferId": "3834267a48794a5184d11f15956f3ee7813f5a6c1f73e82d16b07ea7785cb2bc", + "basisHeadId": "9950573445113b6cb3664b4e3bdea05bf0319bbbcad52a1b2ca0556b3ce688b5", + "startByte": 1, + "endByte": 1, + "replacementUtf8Hex": "78" + }, + "invocationBytesHex": "7b226275666665724964223a2233383334323637613438373934613531383464313166313539353666336565373831336635613663316637336538326431366230376561373738356362326263222c226261736973486561644964223a2239393530353733343435313133623663623336363462346533626465613035626630333139626262636164353261316232636130353536623363653638386235222c22737461727442797465223a312c22656e6442797465223a312c227265706c6163656d656e7455746638486578223a223738227d", + "terminal": { + "posture": "obstructed", + "semanticCode": "arithmetic-overflow", + "legacyErrorClass": "malformed-fact", + "legacyMessage": "head line count overflow", + "parentGraphUnchanged": true, + "patchPosture": "no-mutation-plan" + } + } + ] +} diff --git a/contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.sha256 b/contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.sha256 new file mode 100644 index 00000000..381eeb90 --- /dev/null +++ b/contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.sha256 @@ -0,0 +1 @@ +b9b4707dd5e07897cbe7af36d88928401887e6af5d167d1a88a8d6181b4dbb0e diff --git a/contracts/jedit/lawpacks/replace-range-v1/text-schema-v1.json b/contracts/jedit/lawpacks/replace-range-v1/text-schema-v1.json new file mode 100644 index 00000000..56d3480b --- /dev/null +++ b/contracts/jedit/lawpacks/replace-range-v1/text-schema-v1.json @@ -0,0 +1,494 @@ +{ + "coordinate": "jedit.text.schema@1", + "excludedPropositions": [ + "jedit.text.RopeStructuralMaintenance", + "jedit.text.RopeCheckpoint", + "jedit.text.RopeCheckpointAnchored", + "receipt-attribution-fields", + "structural-echo-edges", + "typed-diff-spans" + ], + "factCodec": { + "byteOrderMark": "forbidden", + "byteString": "array-u8", + "encoding": "utf-8", + "forbiddenValues": [ + "map-valued-fields", + "floats", + "signed-integers", + "duplicate-members", + "unknown-members" + ], + "identifier": "array-32-u8", + "insignificantWhitespace": "forbidden", + "objectMemberOrder": "declared-field-order", + "optionalIdentifier": "null-or-array-32-u8", + "profile": "jedit.compact-serde-json.v1", + "stringEscaping": { + "goldenVector": { + "jsonStringUtf8Hex": "225c75303030305c75303030315c75303030325c75303030335c75303030345c75303030355c75303030365c75303030375c625c745c6e5c75303030625c665c725c75303030655c75303030665c75303031305c75303031315c75303031325c75303031335c75303031345c75303031355c75303031365c75303031375c75303031385c75303031395c75303031615c75303031625c75303031635c75303031645c75303031655c75303031665c225c5c2fe78cabe280a8e280a9f48fbfbf22", + "sourceUtf8Hex": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f225c2fe78cabe280a8e280a9f48fbfbf" + }, + "otherU0000ThroughU001f": "backslash-u00xx-lowercase-hex", + "otherU0020ThroughU10ffff": "literal-utf8-unicode-scalars", + "quotationMark": "backslash-quotation-mark", + "reverseSolidus": "backslash-reverse-solidus", + "shortEscapes": { + "u0008": "backslash-b", + "u0009": "backslash-t", + "u000a": "backslash-n", + "u000c": "backslash-f", + "u000d": "backslash-r" + }, + "solidus": "literal", + "surrogateEscapes": "forbidden" + }, + "unsignedInteger": "decimal-no-leading-zeroes" + }, + "facts": [ + { + "fields": [ + { + "name": "buffer_key", + "type": "utf8-string" + }, + { + "name": "projection_path", + "type": "optional-utf8-string" + }, + { + "name": "canonical_head_id", + "type": "node-id-32" + }, + { + "name": "version", + "type": "u64" + } + ], + "identity": { + "domainHex": "6a656469742e746578742e6275666665722d6b65792e763100", + "kind": "keyed", + "material": "buffer_key utf8" + }, + "name": "Buffer", + "typeLabel": "jedit.text.BufferWorldline.v1" + }, + { + "fields": [ + { + "name": "content_hash", + "type": "digest-32" + }, + { + "name": "bytes", + "type": "bytes" + } + ], + "identity": { + "algorithm": "blake3-256", + "domainHex": "6a656469742e746578742e626c6f622e763100", + "kind": "content-addressed", + "material": "domain || canonical-fact-bytes" + }, + "name": "Blob", + "typeLabel": "jedit.text.TextBlob.v1" + }, + { + "fields": [ + { + "name": "blob_id", + "type": "node-id-32" + }, + { + "name": "byte_start", + "type": "u64" + }, + { + "name": "byte_length", + "type": "u64" + }, + { + "name": "utf16_length", + "type": "u64" + }, + { + "name": "line_breaks", + "type": "u64" + } + ], + "identity": { + "algorithm": "blake3-256", + "domainHex": "6a656469742e746578742e6c6561662e763100", + "kind": "content-addressed", + "material": "domain || canonical-fact-bytes" + }, + "name": "Leaf", + "typeLabel": "jedit.text.RopeLeaf.v1" + }, + { + "fields": [ + { + "name": "left", + "type": "node-id-32" + }, + { + "name": "right", + "type": "node-id-32" + }, + { + "name": "byte_length", + "type": "u64" + }, + { + "name": "utf16_length", + "type": "u64" + }, + { + "name": "line_breaks", + "type": "u64" + }, + { + "name": "height", + "type": "u32" + } + ], + "identity": { + "algorithm": "blake3-256", + "domainHex": "6a656469742e746578742e6272616e63682e763100", + "kind": "content-addressed", + "material": "domain || canonical-fact-bytes" + }, + "name": "Branch", + "typeLabel": "jedit.text.RopeBranch.v1" + }, + { + "fields": [ + { + "name": "buffer_id", + "type": "node-id-32" + }, + { + "name": "basis_head_id", + "type": "optional-node-id-32" + }, + { + "name": "root_node_id", + "type": "optional-node-id-32" + }, + { + "name": "byte_length", + "type": "u64" + }, + { + "name": "utf16_length", + "type": "u64" + }, + { + "name": "line_count", + "type": "u64" + }, + { + "name": "root_digest", + "type": "digest-32" + }, + { + "name": "sequence", + "type": "u64" + } + ], + "identity": { + "algorithm": "blake3-256", + "domainHex": "6a656469742e746578742e686561642e763100", + "kind": "content-addressed", + "material": "domain || canonical-fact-bytes" + }, + "name": "Head", + "typeLabel": "jedit.text.RopeHead.v1" + }, + { + "fields": [ + { + "name": "buffer_id", + "type": "node-id-32" + }, + { + "name": "basis_head_id", + "type": "node-id-32" + }, + { + "name": "next_head_id", + "type": "node-id-32" + }, + { + "name": "start_byte", + "type": "u64" + }, + { + "name": "end_byte", + "type": "u64" + }, + { + "name": "inserted_byte_length", + "type": "u64" + } + ], + "identity": { + "algorithm": "blake3-256", + "domainHex": "6a656469742e746578742e726577726974652e763100", + "kind": "content-addressed", + "material": "domain || canonical-fact-bytes" + }, + "name": "Rewrite", + "typeLabel": "jedit.text.RopeRewrite.v1" + }, + { + "fields": [ + { + "name": "rewrite_id", + "type": "node-id-32" + }, + { + "name": "basis_head_id", + "type": "node-id-32" + }, + { + "name": "next_head_id", + "type": "node-id-32" + }, + { + "name": "start_byte", + "type": "u64" + }, + { + "name": "end_byte", + "type": "u64" + }, + { + "name": "inserted_byte_length", + "type": "u64" + }, + { + "name": "deleted_byte_length", + "type": "u64" + } + ], + "identity": { + "algorithm": "blake3-256", + "domainHex": "6a656469742e746578742e646966662e763100", + "kind": "content-addressed", + "material": "domain || canonical-fact-bytes" + }, + "name": "Diff", + "typeLabel": "jedit.text.RopeDiff.v1" + } + ], + "graphEncoding": { + "attachment": { + "atomType": "node-type", + "key": "node-alpha", + "payload": "canonical-fact-bytes", + "value": "atom" + }, + "edges": "none", + "node": "typed-node" + }, + "identityLaws": { + "blobContent": { + "algorithm": "blake3-256", + "domainHex": "6a656469742e746578742e626c6f622d636f6e74656e742e763100", + "material": "blob-bytes" + }, + "bufferNode": { + "algorithm": "blake3-256", + "domainHex": "6a656469742e746578742e6275666665722d6b65792e763100", + "material": "buffer-key-utf8" + }, + "contentFact": { + "algorithm": "blake3-256", + "material": "fact-domain || canonical-fact-bytes" + }, + "emptyRootDigest": { + "algorithm": "blake3-256", + "domainHex": "6a656469742e746578742e656d7074792d726f6f742e763100", + "material": "empty-bytes" + }, + "typeId": { + "algorithm": "blake3-256", + "domainHex": "747970653a", + "material": "type-label-utf8" + } + }, + "migrationPosture": { + "codecOrStructuralChange": "new-schema-coordinate-and-admitted-migration", + "nativeJsonV1": "authoritative", + "typescriptGraphRope": "not-an-alternate-encoding" + }, + "oracleCorpus": { + "basisFactMemberOrder": [ + "nodeId", + "typeId", + "attachmentBytesHex" + ], + "caseMemberOrder": [ + "id", + "purpose", + "basisFacts", + "invocation", + "invocationBytesHex", + "terminal" + ], + "coordinate": "jedit.text.ReplaceRange.oracle@1", + "encoding": "pretty-utf8-json-final-newline", + "footprintMemberOrder": [ + "nodeReads", + "nodeWrites", + "attachmentReads", + "attachmentWrites", + "edgeReads", + "edgeWrites" + ], + "historicalPlannerCheckpointRole": "provenance-only", + "localIdentifierQualification": "every footprint and patch identifier is qualified by top-level warpId", + "objectMemberOrder": [ + "schemaVersion", + "coordinate", + "applicationSchemaCoordinate", + "invocationSchemaCoordinate", + "historicalPlannerCheckpointCommit", + "sourceSet", + "evidenceGrade", + "independenceLimit", + "warpId", + "cases" + ], + "patchVariants": [ + { + "kind": "upsert-node", + "memberOrder": [ + "kind", + "nodeId", + "typeId" + ] + }, + { + "kind": "set-node-alpha", + "memberOrder": [ + "kind", + "nodeId", + "typeId", + "attachmentBytesHex" + ] + } + ], + "resultMemberOrder": [ + "bufferId", + "headId", + "rootNodeId", + "rootDigest", + "rewriteId", + "diffId", + "byteLength", + "utf16Length", + "lineCount", + "sequence", + "version", + "materializedTextUtf8Hex" + ], + "sourceSetMemberOrder": [ + "algorithm", + "domainHex", + "framing", + "paths", + "digestHex" + ], + "terminal": { + "committableMemberOrder": [ + "posture", + "footprint", + "patch", + "createdNodeIds", + "updatedNodeIds", + "untouchedBasisNodeIds", + "result" + ], + "discriminant": "posture", + "obstructedMemberOrder": [ + "posture", + "semanticCode", + "legacyErrorClass", + "legacyMessage", + "parentGraphUnchanged", + "patchPosture" + ], + "obstructedPatchPosture": "no-mutation-plan", + "semanticCodes": [ + "range-order-invalid", + "range-out-of-bounds", + "utf8-boundary-invalid", + "no-op", + "basis-not-canonical", + "arithmetic-overflow", + "fact-missing", + "fact-malformed", + "content-identity-mismatch", + "malformed-rope" + ] + }, + "unknownMembers": "forbidden" + }, + "oracleInvocation": { + "canonicalBytesField": "invocationBytesHex", + "coordinate": "jedit.text.ReplaceRange.oracle-invocation@1", + "encoding": "compact-utf8-json", + "fields": [ + { + "name": "bufferId", + "type": "lowercase-hex-node-id-32" + }, + { + "name": "basisHeadId", + "type": "lowercase-hex-node-id-32" + }, + { + "name": "startByte", + "type": "u64-json-decimal" + }, + { + "name": "endByte", + "type": "u64-json-decimal" + }, + { + "name": "replacementUtf8Hex", + "type": "lowercase-hex-utf8-bytes" + } + ], + "objectMemberOrder": [ + "bufferId", + "basisHeadId", + "startByte", + "endByte", + "replacementUtf8Hex" + ], + "posture": "finite-corpus-input-not-runtime-abi" + }, + "ropeLaw": { + "aggregateValidation": { + "retainedSubtreeMetrics": "residual-trust-may-propagate-incorrect-utf16-length-and-line-breaks", + "scope": "descended-paths-only" + }, + "coordinateType": "u64", + "emittedOperations": [ + "upsert-node", + "set-node-alpha" + ], + "leafChunkBoundary": "largest-utf8-boundary-at-or-before-limit", + "leafSlices": "may-share-blob-with-nonzero-byte-start", + "lineCount": "line-breaks-plus-one-including-empty", + "maxLeafBytes": 4096, + "nonemptyRootDigest": "root-node-id", + "persistence": "path-copy-no-delete", + "range": "half-open-utf8-byte", + "replacement": "utf8-bytes" + }, + "schemaVersion": 1 +} diff --git a/contracts/jedit/lawpacks/replace-range-v1/text-schema-v1.sha256 b/contracts/jedit/lawpacks/replace-range-v1/text-schema-v1.sha256 new file mode 100644 index 00000000..4649b712 --- /dev/null +++ b/contracts/jedit/lawpacks/replace-range-v1/text-schema-v1.sha256 @@ -0,0 +1 @@ +f49b0ff6c9c7010d3a72b46734d47832853f496739a083edc41dddec3431bac7 diff --git a/docs/design/0158-replace-range-canonical-fact-law.md b/docs/design/0158-replace-range-canonical-fact-law.md new file mode 100644 index 00000000..9c7a8a3f --- /dev/null +++ b/docs/design/0158-replace-range-canonical-fact-law.md @@ -0,0 +1,638 @@ +--- +title: "DL-0158 - ReplaceRange Canonical Fact Law And Oracle" +legend: "DL" +lane: "design" +issue: "https://github.com/flyingrobots/jedit/issues/292" +status: "active" +owners: + - "@flyingrobots" +created: "2026-07-19" +updated: "2026-07-20" +--- + +# DL-0158 - ReplaceRange Canonical Fact Law And Oracle + +## Linked Issue + +- [#292 Freeze the ReplaceRange text-fact law and differential oracle](https://github.com/flyingrobots/jedit/issues/292) + +## Decision Summary + +Jedit will publish one machine-readable `jedit.text.schema@1` declaration for +the native text facts used by production `ReplaceRange`, together with a +committed differential corpus regenerated from the current handwritten rope +planner. Version 1 preserves the existing compact, field-ordered UTF-8 JSON +fact bytes, node-alpha atom storage, domain-separated BLAKE3 identities, and +edge-free native graph representation. The richer TypeScript graph-rope model +is not silently merged into this surface: propositions absent from the native +runtime are explicitly excluded, and any future structural-edge or codec +migration must be a separately admitted operation. + +## Sponsored Human + +A Jim maintainer wants the first Edict-authored `ReplaceRange` operation to +preserve existing production text and history exactly, without discovering +during cutover that Edict and Echo compiled against a different rope model. + +## Sponsored Agent + +An Echo or Edict agent needs exact, digest-locked fact, codec, identity, and +finite-corpus resources so it can implement and verify the target operation +without importing Jedit's handwritten planner or inferring semantics from +TypeScript types. + +## Hill + +By the end of this cycle, a clean Jedit checkout can regenerate the canonical +text-schema declaration and every `ReplaceRange` oracle case from the current +planner, compare exact bytes and identities with committed resources, and fail +when the production fact law or finite semantic corpus drifts. + +## Current Truth + +The merge target is +[`c70e12d73b4b00bc92412bab67e1761f7dd22f82`](https://github.com/flyingrobots/jedit/commit/c70e12d73b4b00bc92412bab67e1761f7dd22f82). + +- The production host defines eight native text fact types. `ReplaceRange` + reads or writes seven of them: Buffer, Blob, Leaf, Branch, Head, Rewrite, + and Diff. + [`native/jedit-echo-host/src/records.rs#L7@c70e12d73b4b00bc92412bab67e1761f7dd22f82`](https://github.com/flyingrobots/jedit/blob/c70e12d73b4b00bc92412bab67e1761f7dd22f82/native/jedit-echo-host/src/records.rs#L7) +- Native fact bytes are produced by `serde_json::to_vec`; content-addressed + fact identifiers hash an exact per-fact domain followed by those bytes. + [`native/jedit-echo-host/src/records.rs#L150@c70e12d73b4b00bc92412bab67e1761f7dd22f82`](https://github.com/flyingrobots/jedit/blob/c70e12d73b4b00bc92412bab67e1761f7dd22f82/native/jedit-echo-host/src/records.rs#L150) + [`native/jedit-echo-host/src/identity.rs#L6@c70e12d73b4b00bc92412bab67e1761f7dd22f82`](https://github.com/flyingrobots/jedit/blob/c70e12d73b4b00bc92412bab67e1761f7dd22f82/native/jedit-echo-host/src/identity.rs#L6) +- The planner stores each fact as one typed node plus one node-alpha atom + attachment. It emits no Echo edges and deletes no retained nodes. + [`native/jedit-echo-host/src/rope.rs#L217@c70e12d73b4b00bc92412bab67e1761f7dd22f82`](https://github.com/flyingrobots/jedit/blob/c70e12d73b4b00bc92412bab67e1761f7dd22f82/native/jedit-echo-host/src/rope.rs#L217) +- `plan_replace` enforces the canonical-head basis, half-open UTF-8 byte + range, exact no-op refusal, checked sequence/version increments, persistent + split/build/join, immutable Head/Rewrite/Diff creation, and Buffer advance. + [`native/jedit-echo-host/src/rope.rs#L385@c70e12d73b4b00bc92412bab67e1761f7dd22f82`](https://github.com/flyingrobots/jedit/blob/c70e12d73b4b00bc92412bab67e1761f7dd22f82/native/jedit-echo-host/src/rope.rs#L385) +- Rope construction caps leaves at 4,096 UTF-8 bytes, path-copies slices, + and deterministically height-balances joins. + [`native/jedit-echo-host/src/rope/tree.rs#L9@c70e12d73b4b00bc92412bab67e1761f7dd22f82`](https://github.com/flyingrobots/jedit/blob/c70e12d73b4b00bc92412bab67e1761f7dd22f82/native/jedit-echo-host/src/rope/tree.rs#L9) + [`native/jedit-echo-host/src/rope/tree.rs#L69@c70e12d73b4b00bc92412bab67e1761f7dd22f82`](https://github.com/flyingrobots/jedit/blob/c70e12d73b4b00bc92412bab67e1761f7dd22f82/native/jedit-echo-host/src/rope/tree.rs#L69) + [`native/jedit-echo-host/src/rope/tree.rs#L148@c70e12d73b4b00bc92412bab67e1761f7dd22f82`](https://github.com/flyingrobots/jedit/blob/c70e12d73b4b00bc92412bab67e1761f7dd22f82/native/jedit-echo-host/src/rope/tree.rs#L148) +- The TypeScript graph-rope model contains propositions and fields that are + not equivalent to the native retained representation. It is therefore not + an alternate serialization of the same version-1 schema. + [`src/domain/graph-rope-types.ts#L85@c70e12d73b4b00bc92412bab67e1761f7dd22f82`](https://github.com/flyingrobots/jedit/blob/c70e12d73b4b00bc92412bab67e1761f7dd22f82/src/domain/graph-rope-types.ts#L85) + +Echo ADR 0023 assigns the fact schemas, codec/identity law, operation +semantics, and differential corpus to Jedit. This cycle earns those Jedit-owned +inputs; it does not claim that Echo can execute them yet. + +## Problem + +The production behavior is deterministic, but its cross-repository contract +is implicit in Rust struct order, serde behavior, private planner state, and +hash-domain constants. Edict cannot bind an exact Jedit lawpack and Echo cannot +validate or interpret one without choosing a schema and codec. Choosing the +richer TypeScript model would silently migrate production history; choosing +the native model without a published declaration would leave package closure +dependent on source-code interpretation. + +The current tests cover useful behavior, but they do not publish the exact +initial fact graph, invocation bytes, ordered writes, actual read/write +support, resulting facts, and obstruction posture needed for a separately +implemented Echo evaluator comparison. + +## Scope + +This cycle includes: + +- one versioned, machine-readable canonical text-schema declaration; +- the seven native fact shapes used by `ReplaceRange`; +- exact compact JSON codec, attachment, type-label, and identity laws; +- a type-level split between ordinary typed facts and content-addressed facts, + so the mutable keyed Buffer fact cannot accidentally receive a second + content-derived identity; +- explicit fixed-width ranges and UTF-8 requirements; +- a corpus-only `u64` invocation schema plus exact compact invocation bytes; +- an explicit no-edge posture for version 1; +- explicit exclusion and migration posture for TypeScript-only propositions; +- deterministic success cases for insertion, deletion, Unicode replacement, + cross-leaf replacement, and replacement larger than one leaf; +- deterministic obstruction cases for stale basis, malformed/out-of-bounds + range, invalid UTF-8 boundary, no-op, and arithmetic overflow; +- an exhaustive semantic-obstruction enum plus strict machine-readable corpus, + terminal, footprint, patch, and result shapes; +- exact committed initial graph, invocation, read/write support, ordered patch, + result, and obstruction evidence for each case; +- fail-closed basis Head content-address and target-Buffer relationship checks + in both production planning and the structurally separate consequence gate; +- byte-for-byte regeneration tests and checked SHA-256 resource digests. + +## Non-Goals + +This cycle does not include: + +- an Echo operation-program or production invocation ABI or evaluator; +- an Edict target lowerer, package, or generated client; +- production command routing, fact-byte encodings, or identity algorithms; +- an application callback, native rope intrinsic, or caller-supplied patch; +- unifying the TypeScript and native graph-rope models; +- migrating existing JSON facts to CBOR or structural Echo edges; +- checkpoint, `TextWindow`, save/export, causal diff, or authorization work; +- Cyber Kitten runtime machinery, child lanes, wormholes, or Continuum. + +## User Experience / Product Shape + +Not applicable. This cycle freezes a machine contract and conformance corpus; +it changes no editor command, rendering, input behavior, or user-visible text. + +### Accessibility Considerations + +Not applicable. The resources are structured UTF-8 JSON consumable without a +visual interface. Hex-encoded bytes always have adjacent semantic field names. + +## Runtime / API Contract + +The declaration coordinate is `jedit.text.schema@1`. Its exact bytes receive a +SHA-256 digest for Edict resource binding. That digest is substitution +evidence only; it does not confer an operation coordinate, invocability, or +Echo authority. + +Version 1 declares: + +| Fact | Type label | Identity posture | +| --- | --- | --- | +| Buffer | `jedit.text.BufferWorldline.v1` | Stable buffer-key node identifier only; canonical bytes may change at that node. | +| Blob | `jedit.text.TextBlob.v1` | Content-addressed from canonical fact bytes. | +| Leaf | `jedit.text.RopeLeaf.v1` | Content-addressed from canonical fact bytes. | +| Branch | `jedit.text.RopeBranch.v1` | Content-addressed from canonical fact bytes. | +| Head | `jedit.text.RopeHead.v1` | Content-addressed from canonical fact bytes. | +| Rewrite | `jedit.text.RopeRewrite.v1` | Content-addressed from canonical fact bytes. | +| Diff | `jedit.text.RopeDiff.v1` | Content-addressed from canonical fact bytes. | + +Each graph fact is represented by one typed Echo node and one node-alpha atom +whose atom type equals the node type and whose payload is the canonical fact +bytes. Version 1 has no structural edge propositions. Relationships such as +Head-to-root and Branch-to-child are exact 32-byte identifiers in canonical +record fields. + +Before `ReplaceRange` interprets fields from the Buffer-selected basis Head, the +retained Head bytes must reproduce that exact content-addressed node ID; the +authenticated Head must then name the same target Buffer. The structurally +separate retained-consequence gate checks those two propositions again before it +accepts committable evidence. + +Canonical fact JSON is: + +- UTF-8 with no byte-order mark or insignificant whitespace; +- one object whose fields occur in declaration order; +- decimal unsigned integers with no leading zeroes; +- exact `null` for absent optional identifiers; +- 32-byte identifiers and digests encoded as arrays of 32 decimal octets; +- byte strings encoded as arrays of decimal octets; +- JSON strings encoded by the exact `jedit.compact-serde-json.v1` law below; +- no maps, floats, signed integers, duplicate members, or unknown members. + +The string law emits quotation mark and reverse solidus as `\"` and `\\`. +U+0008, U+0009, U+000A, U+000C, and U+000D use `\b`, `\t`, `\n`, `\f`, and +`\r`. Every other scalar from U+0000 through U+001F uses six bytes +`\u00xx`, with lowercase hexadecimal. Solidus is never escaped. Every other +Unicode scalar from U+0020 through U+10FFFF is emitted as its literal UTF-8 +bytes; surrogate escapes are forbidden. These rules apply to member names and +string values. Maps are forbidden as canonical fact fields at every nesting +depth, even if an implementation uses a map internally. The schema's golden +vector covers every control scalar plus quotation mark, reverse solidus, +solidus, non-ASCII text, U+2028, U+2029, and the maximum scalar U+10FFFF. + +This is a writer and identity law. The generic legacy `serde_json` reader +accepts some noncanonical spellings, and not every retained-content consumer +recomputes node identifiers from attachment bytes. Production `ReplaceRange` +now routes its selected basis Head through the strict reader described above; +other compatibility readers do not yet enforce the complete version-1 +contract. Future package validation and Echo evaluation must reject every +noncanonical or misaddressed fact. + +Content-addressed identifiers are BLAKE3-256 over the exact declared domain +bytes followed by canonical fact bytes. Buffer identifiers, Blob content +hashes, and empty-root digests use their separately declared BLAKE3 domains. +The generic content-fact constructor does not accept Buffer facts. This removes +the currently representable but unused `BufferFact` content identity while +preserving every production byte and authoritative keyed Buffer identifier. + +Rope aggregate validation is path-local. The planner validates branches on the +descended endpoint paths, but it does not recursively revalidate every retained +subtree. A retained subtree's declared `utf16_length` and `line_breaks` can +therefore propagate into a new Head as residual trust. The published schema +records that boundary explicitly; this PR does not claim whole-tree aggregate +verification. + +The normative identity domains are: + +| Identity | Exact UTF-8 domain | Lowercase hexadecimal domain | Material | +| --- | --- | --- | --- | +| Type ID | `type:` | `747970653a` | type-label UTF-8 | +| Buffer node | `jedit.text.buffer-key.v1\0` | `6a656469742e746578742e6275666665722d6b65792e763100` | buffer-key UTF-8 | +| Blob fact | `jedit.text.blob.v1\0` | `6a656469742e746578742e626c6f622e763100` | canonical Blob bytes | +| Leaf fact | `jedit.text.leaf.v1\0` | `6a656469742e746578742e6c6561662e763100` | canonical Leaf bytes | +| Branch fact | `jedit.text.branch.v1\0` | `6a656469742e746578742e6272616e63682e763100` | canonical Branch bytes | +| Head fact | `jedit.text.head.v1\0` | `6a656469742e746578742e686561642e763100` | canonical Head bytes | +| Rewrite fact | `jedit.text.rewrite.v1\0` | `6a656469742e746578742e726577726974652e763100` | canonical Rewrite bytes | +| Diff fact | `jedit.text.diff.v1\0` | `6a656469742e746578742e646966662e763100` | canonical Diff bytes | +| Blob content | `jedit.text.blob-content.v1\0` | `6a656469742e746578742e626c6f622d636f6e74656e742e763100` | blob bytes | +| Empty-root digest | `jedit.text.empty-root.v1\0` | `6a656469742e746578742e656d7074792d726f6f742e763100` | empty bytes | + +Every row hashes raw `domain || material`, with no inserted delimiter or length +prefix. The terminal NUL shown in most domains is itself the final domain byte. + +The finite corpus uses +`jedit.text.ReplaceRange.oracle-invocation@1`, a compact UTF-8 JSON object with +ordered members `bufferId`, `basisHeadId`, `startByte`, `endByte`, and +`replacementUtf8Hex`. Identifiers are 64 lowercase hexadecimal characters; +coordinates are JSON decimal `u64`; replacement bytes are lowercase +hexadecimal and must decode as UTF-8. Every case carries the exact compact +object bytes in `invocationBytesHex`. This schema is a conformance input, not a +runtime authority or a prematurely frozen Echo ABI. Strict corpus conformance +rejects uppercase, nonhexadecimal, short, or long identifiers; odd-length or +nonhexadecimal replacement bytes; replacement bytes that are not UTF-8; and +coordinates that are not JSON `u64` values. + +The native planner and retained fact coordinates are `u64`, and the future +Edict-authored operation must preserve that domain. Current production still +routes `ReplaceRangeAsTickInput` through the Wesley/GraphQL compatibility ABI, +where `startByte` and `endByte` are `i32` and `bounded_i32` rejects values above +`i32::MAX`. The above-GraphQL-range oracle intentionally bypasses that legacy +ABI and proves only the planner and future-operation coordinate law. This cycle +therefore preserves current production behavior while leaving #285 open until +the Edict cutover removes the narrowing boundary. + +The oracle resource is finite conformance evidence. It does not prove semantic +equivalence for every possible `ReplaceRange` input. Its legacy planner path +must not invoke, link, or share an evaluator implementation with the future +Echo operation program. Sharing the published fact schema and comparison codec +is disclosed and expected. + +The declaration's `oracleCorpus` section freezes the exact envelope, case, +basis-fact, terminal, footprint, patch, and result member sets. Its obstruction +domain is an exhaustive generated Rust enum whose ten kebab-case values are +also enumerated in the machine declaration. A structurally separate +conformance validator rejects unknown members, terminal and patch variants, +and semantic obstruction codes before an external consumer compares evidence. +Every flattened local identifier in footprint or patch evidence is qualified by +the corpus's top-level `warpId`; generation and local application reject a key +whose WARP differs before discarding that redundant qualifier. + +Before a committable case is serialized, the oracle separately decodes the +post-patch Buffer, Head, Rewrite, and Diff facts through a structurally separate +gate using Jedit's production codec. That gate checks their identities, basis, +range, next head, version, sequence, lengths, root digest, and cross-links +against one another and the planner summary. Result evidence is derived from +those validated retained facts and materialized text, not from an unchecked mix +of planner summaries and discovered type labels. + +## Lower Modes + +The contract is entirely headless. `cargo test` recomputes and compares the +resources. `npm run lawpack:replace-range:update` deliberately replaces all +three resources and their SHA-256 sidecars, then reruns check mode. Each +resource and sidecar replacement is an atomic same-directory rename; CI never +sets either update variable. Any present update variable other than exact `1` +fails. Malformed resources fail with ordinary test errors; there is no fallback +to source-code inference. + +## Data / State Model + +| Category | Description | +| --- | --- | +| Source of truth | Current Jedit-owned native fact and `plan_replace` law, bound by exact source-set bytes and published resource digests. | +| Derived state | Machine-readable schema and finite golden corpus. | +| Invalid states | Noncanonical fact bytes, wrong domains or identities, schema drift, corpus drift, or ambiguous native/TypeScript ownership. | +| Reset behavior | Fixtures regenerate from a clean synthetic graph; no production WAL or user data is read. | +| Serialization | Digest-locked JSON resources containing exact fact bytes as lowercase hexadecimal. | +| Deterministic assumptions | Ordered Rust structs, no map-valued fact fields, exact domain bytes, explicit UTF-8 inputs, no clock/randomness/host paths. | + +## Accessibility Posture + +| Concern | Posture | +| --- | --- | +| Semantic labels or facts | Every identifier and byte vector is labeled by role and fact type. | +| Focus order or ownership | Not applicable. | +| Hidden or visual-only information | None. | +| Keyboard behavior | Not applicable. | +| Secret or redaction behavior | Fixtures contain only synthetic text. | + +## Localization / Directionality Posture + +| Concern | Posture | +| --- | --- | +| User-visible strings | None. | +| Catalog keys | None. | +| Supported locales updated | No. | +| Directionality assumptions | JSON member order is semantic to the codec; human language direction is irrelevant. | +| Validation command | Native Rust tests plus `npm run check`. | + +## Agent Inspectability / Explainability Posture + +Agents can inspect one declaration and one corpus manifest without executing +the product or scraping Rust debug output. Successful cases name exact basis, +input, support, patch, retained facts, and result. Obstructed cases name exact +basis, input, typed obstruction, no-plan posture, and unchanged-parent evidence. +Every case also names its semantic purpose and terminal posture. The +`historicalPlannerCheckpointCommit` records historical provenance only: the +immutable merge target inspected when the cycle began. It neither claims the +current law existed there nor proves cross-commit equivalence. The `sourceSet` +digest binds the exact declared current generator and planner source bytes; +each resource sidecar binds the exact published JSON bytes. These identities +provide substitution and provenance evidence, not Echo authority. The evidence +grade prevents a consumer from mistaking finite-corpus agreement for formal +equivalence. + +## Linked Invariants + +- Jedit owns product semantics and canonical application schemas. +- Echo owns runtime admission, execution, commitment, receipts, and recovery. +- Edict artifacts do not prove that Echo executed them. +- A resource digest supplies substitution evidence, not authority. +- Native facts and the future operation use `u64`; the current compatibility + ABI remains an explicitly documented `i32` limitation. +- A failed plan produces no parent-visible patch. +- Existing native fact bytes remain stable in version 1. +- Tests are executable specification. + +## Design Alternatives Considered + +### Adopt the richer TypeScript graph-rope model now + +Rejected. It has different propositions and identity material from the native +production graph. Selecting it would make this prerequisite a data migration +and would invalidate the very oracle intended to protect the cutover. + +### Migrate version 1 to canonical CBOR or structural edges + +Rejected for this cycle. Either change may be desirable, but both alter +retained fact bytes and content identities. They require an explicit migration +operation and compatibility proof rather than being hidden in package work. + +### Publish prose plus example snapshots + +Rejected. Prose does not constrain field order, exact bytes, hash domains, or +corpus drift. The declaration and corpus must be regenerated and checked by +the implementation that currently owns the law. + +## Decision + +Freeze native JSON version 1 and a finite differential corpus. This preserves +current production history and gives the next Echo slice exact inputs and +outputs. It is intentionally conservative: structural graph schema evolution +can proceed later under a new coordinate and explicit migration. + +## Implementation Slices + +- [x] Slice 1: land this decision record and freeze the executable witnesses. +- [x] Slice 2: publish and byte-lock `jedit.text.schema@1`. +- [x] Slice 3: publish and regenerate the `ReplaceRange` differential corpus. +- [x] Slice 4: close schema/corpus review gaps and complete cycle evidence. + +## Tests To Write First + +- [x] Schema resource test: regenerate exact bytes, verify the checked SHA-256 + digest, and reject drift from native fact labels, field order, domains, + attachment posture, and excluded propositions. +- [x] Type-law test: prove Buffer has no generic content-addressed constructor + while every immutable ReplaceRange fact retains its existing identifier. +- [x] Schema/writer conformance test: compare every declared field sequence with + the order observed directly from native canonical fact bytes. +- [x] Success corpus test: regenerate each initial graph and replacement plan, + then compare exact reads, writes, patch order, fact bytes, identities, + result metrics, and preserved facts. +- [x] Obstruction corpus test: regenerate each failure, compare its Jedit-owned + semantic category and legacy evidence, and prove no write plan exists. +- [x] Determinism test: regenerate the complete resources twice from fresh + synthetic graphs and compare exact bytes. +- [x] Fixed-width test: retain `u64` values above GraphQL/i32 range in the + corpus invocation and its exact compact bytes without narrowing. + +## Acceptance Criteria + +The work is done when: + +- [x] Issue #292 remains the live cycle ledger. +- [x] The declaration selects the native production model unambiguously. +- [x] All seven ReplaceRange fact shapes and identity domains are explicit. +- [x] TypeScript-only propositions and migration posture are explicit. +- [x] Schema and corpus resource digests are checked from exact bytes. +- [x] The corpus covers representative persistent-rope successes and typed + obstructions. +- [x] Valid-input production consequences, fact bytes, authoritative identities, + Echo dependency, and user-visible behavior remain unchanged; malformed, + noncanonical, or misaddressed selected basis Heads now fail closed before + a `MutationPlan` is constructed. +- [x] Focused Rust tests and `npm run check` pass. +- [x] The retrospective records evidence limits and the exact next Echo RED. + +## Validation Plan + +```bash +npm ci +npm run lawpack:replace-range:update +cargo test --locked --manifest-path native/jedit-echo-host/Cargo.toml \ + --test replace_range_schema +cargo test --locked --manifest-path native/jedit-echo-host/Cargo.toml \ + --test replace_range_schema_conformance +cargo test --locked --manifest-path native/jedit-echo-host/Cargo.toml \ + --test replace_range_oracle +cargo clippy --locked --manifest-path native/jedit-echo-host/Cargo.toml \ + --all-targets -- -D warnings +npm run check +node scripts/jedit-production-cutover-guard.mjs +npm run witness:echo +``` + +The complete native crate passes +`cargo fmt --manifest-path native/jedit-echo-host/Cargo.toml --all -- --check`. +This branch includes the mechanical `src/contract.rs` assertion formatting +that closes the inherited baseline difference; it changes no checkpoint reason +semantics. + +## Playback / Witness + +Run `npm run lawpack:replace-range:update` from a clean checkout. It rebuilds +the declaration, codec vectors, corpus, and all sidecars, then proves check mode +is clean. Inspect +`contracts/jedit/lawpacks/replace-range-v1/text-schema-v1.json` for the exact +fact, string, identity, rope, and corpus-invocation laws. Inspect +`replace-range-v1.oracle.json` for 40 self-contained cases: six committable +consequences and 34 typed no-patch obstructions, each with basis facts, exact +invocation bytes, support, and its applicable ordered patch or obstruction +evidence. No editor, terminal rendering, external service, or sibling checkout +is required. + +## Risks + +Known risks: + +- The corpus is finite and does not prove all-input semantic equivalence. +- The legacy reader accepts noncanonical JSON that the writer never emits. +- The current Wesley/GraphQL invocation remains limited to `i32` coordinates. +- A source change outside the declared oracle source set could still affect + behavior through a dependency selected by the bound Cargo manifest and + lockfile. + +Mitigations: + +- Evidence is graded deterministic self-validation until Jedit supplies real + `ReplaceRange.edict` source, Edict compiles it through the public application + build, and Echo executes the accepted compiler-produced generic program for a + separately implemented finite-corpus comparison. +- The declaration makes canonical writer bytes and corpus shapes normative and + requires the new evaluator to reject noncanonical or misaddressed facts. +- Jedit #285 remains open for the production cutover; this PR does not claim the + compatibility ABI has changed. +- The corpus binds the exact native Cargo manifest and lockfile together with + the Jedit planner, record, identity, error, window, case generator, basis + builder, and source-set framing bytes. CI preserves the bound dependency + selection while separately compiled Echo evidence remains the independence + boundary. + +## Follow-On Debt + +- Jedit must author `ReplaceRange.edict` against this exact schema and lawpack + closure, then build it through Edict's public application-build boundary. +- [Echo #684](https://github.com/flyingrobots/echo/issues/684) may add only the + generic bounded-program capability exposed as missing by that real compiler + output; its conformance harness may consume these + exact resources in its first RED. +- [Jedit #285](https://github.com/flyingrobots/jedit/issues/285) remains open + until production `ReplaceRange` leaves the GraphQL `Int` compatibility ABI. + +## Retrospective + +What changed from the design: + +- **Native schema corpus.** Native oracle generation runs the same case set + twice, requires byte-identical output, compares those bytes with the + committed oracle resource, and checks its SHA-256 sidecar. + [`native/jedit-echo-host/tests/replace_range_oracle.rs#L22@9ffc0e4aa9313eba3774be970adbc1b976e5888a`](https://github.com/flyingrobots/jedit/blob/9ffc0e4aa9313eba3774be970adbc1b976e5888a/native/jedit-echo-host/tests/replace_range_oracle.rs#L22) + [`native/jedit-echo-host/tests/replace_range_oracle.rs#L23@9ffc0e4aa9313eba3774be970adbc1b976e5888a`](https://github.com/flyingrobots/jedit/blob/9ffc0e4aa9313eba3774be970adbc1b976e5888a/native/jedit-echo-host/tests/replace_range_oracle.rs#L23) + [`native/jedit-echo-host/tests/replace_range_oracle.rs#L24@9ffc0e4aa9313eba3774be970adbc1b976e5888a`](https://github.com/flyingrobots/jedit/blob/9ffc0e4aa9313eba3774be970adbc1b976e5888a/native/jedit-echo-host/tests/replace_range_oracle.rs#L24) + [`native/jedit-echo-host/tests/replace_range_oracle.rs#L30@9ffc0e4aa9313eba3774be970adbc1b976e5888a`](https://github.com/flyingrobots/jedit/blob/9ffc0e4aa9313eba3774be970adbc1b976e5888a/native/jedit-echo-host/tests/replace_range_oracle.rs#L30) + [`native/jedit-echo-host/tests/replace_range_oracle.rs#L31@9ffc0e4aa9313eba3774be970adbc1b976e5888a`](https://github.com/flyingrobots/jedit/blob/9ffc0e4aa9313eba3774be970adbc1b976e5888a/native/jedit-echo-host/tests/replace_range_oracle.rs#L31) + [`native/jedit-echo-host/tests/replace_range_oracle.rs#L35@9ffc0e4aa9313eba3774be970adbc1b976e5888a`](https://github.com/flyingrobots/jedit/blob/9ffc0e4aa9313eba3774be970adbc1b976e5888a/native/jedit-echo-host/tests/replace_range_oracle.rs#L35) +- **Retained stale-basis relationship.** The stale fixture retains the invoked + historical Head and checks its relationship to the current canonical Head. + [`native/jedit-echo-host/tests/support/replace_range_basis_witness.rs#L59@d57e0d239c005898839a15041807580ed2dfe595`](https://github.com/flyingrobots/jedit/blob/d57e0d239c005898839a15041807580ed2dfe595/native/jedit-echo-host/tests/support/replace_range_basis_witness.rs#L59) +- **Retained foreign-basis relationship.** The foreign fixture retains another + Buffer and checks that it canonically names the invoked foreign Head. + [`native/jedit-echo-host/tests/support/replace_range_basis_witness.rs#L68@d57e0d239c005898839a15041807580ed2dfe595`](https://github.com/flyingrobots/jedit/blob/d57e0d239c005898839a15041807580ed2dfe595/native/jedit-echo-host/tests/support/replace_range_basis_witness.rs#L68) +- **Schema and source-set contract.** Schema conformance mechanically compares + every declared fact-member order with canonical native-writer bytes. The + source-set implementation embeds an ordered path/byte list and hashes it + with domain-separated, length-framed SHA-256. + [`native/jedit-echo-host/tests/replace_range_schema_conformance.rs#L86@9ffc0e4aa9313eba3774be970adbc1b976e5888a`](https://github.com/flyingrobots/jedit/blob/9ffc0e4aa9313eba3774be970adbc1b976e5888a/native/jedit-echo-host/tests/replace_range_schema_conformance.rs#L86) + [`native/jedit-echo-host/tests/support/replace_range_source_set.rs#L5@9ffc0e4aa9313eba3774be970adbc1b976e5888a`](https://github.com/flyingrobots/jedit/blob/9ffc0e4aa9313eba3774be970adbc1b976e5888a/native/jedit-echo-host/tests/support/replace_range_source_set.rs#L5) + [`native/jedit-echo-host/tests/support/replace_range_source_set.rs#L70@9ffc0e4aa9313eba3774be970adbc1b976e5888a`](https://github.com/flyingrobots/jedit/blob/9ffc0e4aa9313eba3774be970adbc1b976e5888a/native/jedit-echo-host/tests/support/replace_range_source_set.rs#L70) +- **Obstruction schema.** Oracle support declares a closed ten-variant serde + obstruction enum and matching `ALL` list. Schema conformance freezes the same + ten wire values, while negative witnesses reject an unknown top-level member + and an invented semantic code. + [`native/jedit-echo-host/tests/support/replace_range_contract.rs#L3@9ffc0e4aa9313eba3774be970adbc1b976e5888a`](https://github.com/flyingrobots/jedit/blob/9ffc0e4aa9313eba3774be970adbc1b976e5888a/native/jedit-echo-host/tests/support/replace_range_contract.rs#L3) + [`native/jedit-echo-host/tests/support/replace_range_contract.rs#L20@9ffc0e4aa9313eba3774be970adbc1b976e5888a`](https://github.com/flyingrobots/jedit/blob/9ffc0e4aa9313eba3774be970adbc1b976e5888a/native/jedit-echo-host/tests/support/replace_range_contract.rs#L20) + [`native/jedit-echo-host/tests/replace_range_schema_conformance.rs#L336@9ffc0e4aa9313eba3774be970adbc1b976e5888a`](https://github.com/flyingrobots/jedit/blob/9ffc0e4aa9313eba3774be970adbc1b976e5888a/native/jedit-echo-host/tests/replace_range_schema_conformance.rs#L336) + [`native/jedit-echo-host/tests/replace_range_schema_conformance.rs#L362@9ffc0e4aa9313eba3774be970adbc1b976e5888a`](https://github.com/flyingrobots/jedit/blob/9ffc0e4aa9313eba3774be970adbc1b976e5888a/native/jedit-echo-host/tests/replace_range_schema_conformance.rs#L362) +- **Artifact digest ledger.** The published SHA-256 digests are + `f49b0ff6c9c7010d3a72b46734d47832853f496739a083edc41dddec3431bac7` + for the schema, + `1ac26477e1d6c08df49446627ad002e40bd214235ce93b563d62bb50e40dc14c` + for codec vectors, and + `b9b4707dd5e07897cbe7af36d88928401887e6af5d167d1a88a8d6181b4dbb0e` + for the oracle. The oracle source-set digest is + `2adf83f798205f52636ad64ca45178f33a8e1cc663874f8a6113484c945e3052`. + The ledger derives all four values from the committed artifacts. + [`tests/replace-range-law-cycle.spec.mjs#L76@95f63d2c31847c3a4cc4bbea9152900470843d3a`](https://github.com/flyingrobots/jedit/blob/95f63d2c31847c3a4cc4bbea9152900470843d3a/tests/replace-range-law-cycle.spec.mjs#L76) +- **Serialized resource updates.** The deliberate resource-update command runs + each exact writer serially + before the complete locked reader and conformance pass. + [`package.json#L10@13b16f2e7195458138865460c5948744ea8615ed`](https://github.com/flyingrobots/jedit/blob/13b16f2e7195458138865460c5948744ea8615ed/package.json#L10) +- **Exact audit locations.** The earlier audit gate declared nine evidence + class/full-commit/path/line tuples and required each corresponding GitHub + blob URL to occur somewhere in the retrospective. + [`tests/replace-range-law-cycle.spec.mjs#L32@a8cabbd8d68c5345cdea5cba0bb59b956ec7be63`](https://github.com/flyingrobots/jedit/blob/a8cabbd8d68c5345cdea5cba0bb59b956ec7be63/tests/replace-range-law-cycle.spec.mjs#L32) + [`tests/replace-range-law-cycle.spec.mjs#L110@a8cabbd8d68c5345cdea5cba0bb59b956ec7be63`](https://github.com/flyingrobots/jedit/blob/a8cabbd8d68c5345cdea5cba0bb59b956ec7be63/tests/replace-range-law-cycle.spec.mjs#L110) + +What the tests proved: + +- **Native serialization.** Native Rust reconstructs the schema and + codec-vector resources, requires byte-for-byte equality with both committed + resources, checks their SHA-256 sidecars, and compares every declared + fact-member order with canonical native-writer bytes. + [`native/jedit-echo-host/tests/replace_range_schema.rs#L89@9ffc0e4aa9313eba3774be970adbc1b976e5888a`](https://github.com/flyingrobots/jedit/blob/9ffc0e4aa9313eba3774be970adbc1b976e5888a/native/jedit-echo-host/tests/replace_range_schema.rs#L89) + [`native/jedit-echo-host/tests/replace_range_schema_conformance.rs#L86@9ffc0e4aa9313eba3774be970adbc1b976e5888a`](https://github.com/flyingrobots/jedit/blob/9ffc0e4aa9313eba3774be970adbc1b976e5888a/native/jedit-echo-host/tests/replace_range_schema_conformance.rs#L86) +- **Supplementary Unicode scalar.** The golden vector requires U+10FFFF to + remain literal four-byte UTF-8 and rejects surrogate-style canonical output. + [`native/jedit-echo-host/tests/replace_range_schema_conformance.rs#L290@79a3b788d102c0b04fb47c1d3ce972dbab32a1cc`](https://github.com/flyingrobots/jedit/blob/79a3b788d102c0b04fb47c1d3ce972dbab32a1cc/native/jedit-echo-host/tests/replace_range_schema_conformance.rs#L290) +- **Type-ID domain binding.** Conformance recomputes every declared fact type ID + from the published domain and compares it with pinned `warp-core` behavior. + [`native/jedit-echo-host/tests/replace_range_schema_conformance.rs#L308@f5482c4e7797e043c006adf1de293d4dfe85e13a`](https://github.com/flyingrobots/jedit/blob/f5482c4e7797e043c006adf1de293d4dfe85e13a/native/jedit-echo-host/tests/replace_range_schema_conformance.rs#L308) +- **Strict typed corpus validation.** Strict conformance rejects drift in the + envelope identity and ordered source-set claim. + [`native/jedit-echo-host/tests/replace_range_corpus_conformance.rs#L120@9a309641edd4b809c37f5d055790de311e5d61f9`](https://github.com/flyingrobots/jedit/blob/9a309641edd4b809c37f5d055790de311e5d61f9/native/jedit-echo-host/tests/replace_range_corpus_conformance.rs#L120) +- **Canonical oracle bytes.** Raw-byte validation separately freezes canonical + object order, whitespace, framing, and terminal newline. + [`native/jedit-echo-host/tests/replace_range_corpus_conformance.rs#L70@8112752b85862d065811fbe133fdfe8f9e8021c1`](https://github.com/flyingrobots/jedit/blob/8112752b85862d065811fbe133fdfe8f9e8021c1/native/jedit-echo-host/tests/replace_range_corpus_conformance.rs#L70) +- **WARP-qualified identifiers.** Footprint and patch projections refuse a + foreign WARP instead of flattening its local IDs into the corpus WARP. + [`native/jedit-echo-host/tests/support/replace_range_oracle.rs#L393@edd41a35058fea354d46a38421641b0c173e3faa`](https://github.com/flyingrobots/jedit/blob/edd41a35058fea354d46a38421641b0c173e3faa/native/jedit-echo-host/tests/support/replace_range_oracle.rs#L393) +- **Invocation lexical validation.** Corpus invocation conformance rejects + identifiers and replacement bytes that + violate their exact lowercase hexadecimal, width, or UTF-8 lexical laws. + [`native/jedit-echo-host/tests/replace_range_schema_conformance.rs#L396@c0214b2fe52ef3a3cb2d09e24af9cd4a3258ca0c`](https://github.com/flyingrobots/jedit/blob/c0214b2fe52ef3a3cb2d09e24af9cd4a3258ca0c/native/jedit-echo-host/tests/replace_range_schema_conformance.rs#L396) +- **Typed planner obstructions.** Production owns the closed operation reason, + exhaustively maps structural rope faults into it, and returns typed failures + from the detailed planner. The compatibility wrapper retains the legacy + `HostError`, and corpus parity re-runs that wrapper to compare legacy class, + message, and display. + [`native/jedit-echo-host/src/rope/replace.rs#L14@b4606ce74ab37f8cc54d184a17c8eaeea2dff092`](https://github.com/flyingrobots/jedit/blob/b4606ce74ab37f8cc54d184a17c8eaeea2dff092/native/jedit-echo-host/src/rope/replace.rs#L14) + [`native/jedit-echo-host/src/rope/replace.rs#L72@b4606ce74ab37f8cc54d184a17c8eaeea2dff092`](https://github.com/flyingrobots/jedit/blob/b4606ce74ab37f8cc54d184a17c8eaeea2dff092/native/jedit-echo-host/src/rope/replace.rs#L72) + [`native/jedit-echo-host/src/rope/replace.rs#L99@b4606ce74ab37f8cc54d184a17c8eaeea2dff092`](https://github.com/flyingrobots/jedit/blob/b4606ce74ab37f8cc54d184a17c8eaeea2dff092/native/jedit-echo-host/src/rope/replace.rs#L99) + [`native/jedit-echo-host/src/rope/replace.rs#L118@b4606ce74ab37f8cc54d184a17c8eaeea2dff092`](https://github.com/flyingrobots/jedit/blob/b4606ce74ab37f8cc54d184a17c8eaeea2dff092/native/jedit-echo-host/src/rope/replace.rs#L118) + [`native/jedit-echo-host/tests/support/replace_range_legacy.rs#L15@b4606ce74ab37f8cc54d184a17c8eaeea2dff092`](https://github.com/flyingrobots/jedit/blob/b4606ce74ab37f8cc54d184a17c8eaeea2dff092/native/jedit-echo-host/tests/support/replace_range_legacy.rs#L15) +- **Retained arithmetic refusal.** Checked helpers turn overflow into the typed + structural arithmetic fault. Named retained-rope fixtures exercise the path, + and corpus evaluation compares each observed reason with its expectation + while asserting that planning leaves the basis-store projection unchanged. + [`native/jedit-echo-host/src/rope/fault.rs#L59@9930d04bed048d69f54ef08d5f25f5c211efa199`](https://github.com/flyingrobots/jedit/blob/9930d04bed048d69f54ef08d5f25f5c211efa199/native/jedit-echo-host/src/rope/fault.rs#L59) + [`native/jedit-echo-host/src/rope/fault.rs#L66@9930d04bed048d69f54ef08d5f25f5c211efa199`](https://github.com/flyingrobots/jedit/blob/9930d04bed048d69f54ef08d5f25f5c211efa199/native/jedit-echo-host/src/rope/fault.rs#L66) + [`native/jedit-echo-host/tests/replace_range_oracle.rs#L310@9930d04bed048d69f54ef08d5f25f5c211efa199`](https://github.com/flyingrobots/jedit/blob/9930d04bed048d69f54ef08d5f25f5c211efa199/native/jedit-echo-host/tests/replace_range_oracle.rs#L310) + [`native/jedit-echo-host/tests/replace_range_oracle.rs#L387@9930d04bed048d69f54ef08d5f25f5c211efa199`](https://github.com/flyingrobots/jedit/blob/9930d04bed048d69f54ef08d5f25f5c211efa199/native/jedit-echo-host/tests/replace_range_oracle.rs#L387) + [`native/jedit-echo-host/tests/support/replace_range_oracle.rs#L214@9930d04bed048d69f54ef08d5f25f5c211efa199`](https://github.com/flyingrobots/jedit/blob/9930d04bed048d69f54ef08d5f25f5c211efa199/native/jedit-echo-host/tests/support/replace_range_oracle.rs#L214) + [`native/jedit-echo-host/tests/support/replace_range_oracle.rs#L223@9930d04bed048d69f54ef08d5f25f5c211efa199`](https://github.com/flyingrobots/jedit/blob/9930d04bed048d69f54ef08d5f25f5c211efa199/native/jedit-echo-host/tests/support/replace_range_oracle.rs#L223) + [`native/jedit-echo-host/tests/support/replace_range_oracle.rs#L246@9930d04bed048d69f54ef08d5f25f5c211efa199`](https://github.com/flyingrobots/jedit/blob/9930d04bed048d69f54ef08d5f25f5c211efa199/native/jedit-echo-host/tests/support/replace_range_oracle.rs#L246) +- **Declared-text consequence.** Successful projection independently derives + basis prefix plus replacement plus suffix and rejects an internally + consistent retained rope that does not realize that declared edit. + [`native/jedit-echo-host/tests/support/replace_range_oracle.rs#L316@afd06f652aad7d6e8f389efec49e1ea1469eef88`](https://github.com/flyingrobots/jedit/blob/afd06f652aad7d6e8f389efec49e1ea1469eef88/native/jedit-echo-host/tests/support/replace_range_oracle.rs#L316) +- **Keyed Buffer identity.** Retained-consequence validation recomputes the + keyed Buffer address from `buffer_key` in both basis and result graphs. + [`native/jedit-echo-host/tests/support/replace_range_consequence.rs#L42@751ea54360f2633ee04f472bb18ad07c47cef61f`](https://github.com/flyingrobots/jedit/blob/751ea54360f2633ee04f472bb18ad07c47cef61f/native/jedit-echo-host/tests/support/replace_range_consequence.rs#L42) +- **Current-patch consequence selection.** Rewrite and Diff evidence is selected + from the current patch and cross-linked before a committable result enters the + corpus. + [`native/jedit-echo-host/tests/support/replace_range_consequence.rs#L113@475b6dcc0eae9edbf228221069ab3aab975be868`](https://github.com/flyingrobots/jedit/blob/475b6dcc0eae9edbf228221069ab3aab975be868/native/jedit-echo-host/tests/support/replace_range_consequence.rs#L113) +- **Retained node-record typing.** Every retained fact requires agreement + between the graph node record and atom attachment type before decoding. + [`native/jedit-echo-host/tests/support/replace_range_consequence.rs#L242@6c20d93ff94a8b0e24e6d3fc05492f99f27a56e8`](https://github.com/flyingrobots/jedit/blob/6c20d93ff94a8b0e24e6d3fc05492f99f27a56e8/native/jedit-echo-host/tests/support/replace_range_consequence.rs#L242) +- **Evidence-grade boundary.** The corpus explicitly calls itself deterministic + self-validation. It is not an independent verifier, all-input equivalence + proof, Echo admission witness, runtime receipt, WAL, or recovery witness. + [`native/jedit-echo-host/tests/support/replace_range_oracle.rs#L177@d87e7a1891cbefb6cf478bbc9b6a9ed87121b242`](https://github.com/flyingrobots/jedit/blob/d87e7a1891cbefb6cf478bbc9b6a9ed87121b242/native/jedit-echo-host/tests/support/replace_range_oracle.rs#L177) + +What remains open: + +- The exact next RED begins in Jedit: author `ReplaceRange.edict` against this + exact schema and complete lawpack closure, then invoke Edict's public + application-build boundary. That compiler or provider failure determines + whether the missing generic capability belongs to Edict or Echo. Echo must + consume the resulting accepted compiler-produced package, never infer a + program from this schema or oracle and never use a Jedit planner callback, + native rope intrinsic, or caller-supplied patch. +- Edict binding, Echo execution/receipt/recovery, Jim invocation, legacy + `ReplaceRange` cutover, and full `u64` production support remain later + campaigns. + +PR: + +- https://github.com/flyingrobots/jedit/pull/293 diff --git a/native/jedit-echo-host/Cargo.lock b/native/jedit-echo-host/Cargo.lock index 004fae27..cc731a24 100644 --- a/native/jedit-echo-host/Cargo.lock +++ b/native/jedit-echo-host/Cargo.lock @@ -43,7 +43,16 @@ dependencies = [ "cc", "cfg-if", "constant_time_eq", - "cpufeatures", + "cpufeatures 0.3.0", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", ] [[package]] @@ -121,6 +130,15 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + [[package]] name = "cpufeatures" version = "0.3.0" @@ -136,6 +154,26 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + [[package]] name = "echo-registry-api" version = "0.1.0" @@ -182,6 +220,16 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + [[package]] name = "getrandom" version = "0.4.3" @@ -228,6 +276,8 @@ dependencies = [ "hex", "serde", "serde_json", + "sha2", + "static_assertions", "tempfile", "thiserror 2.0.18", "warp-core", @@ -377,12 +427,29 @@ dependencies = [ "zmij", ] +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest", +] + [[package]] name = "shlex" version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "syn" version = "2.0.119" @@ -447,12 +514,24 @@ dependencies = [ "syn", ] +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + [[package]] name = "warp-core" version = "0.1.1" diff --git a/native/jedit-echo-host/Cargo.toml b/native/jedit-echo-host/Cargo.toml index ec617e4a..cff590b7 100644 --- a/native/jedit-echo-host/Cargo.toml +++ b/native/jedit-echo-host/Cargo.toml @@ -19,4 +19,6 @@ thiserror = "2" warp-core = { git = "https://github.com/flyingrobots/echo", rev = "90f63ae27c673fb7d398aba12c98cfbcf1ef24c3", features = ["native_rule_bootstrap", "trusted_runtime"] } [dev-dependencies] +sha2 = "0.10" +static_assertions = "1" tempfile = "3" diff --git a/native/jedit-echo-host/src/contract.rs b/native/jedit-echo-host/src/contract.rs index cd9c3471..a1fefd1d 100644 --- a/native/jedit-echo-host/src/contract.rs +++ b/native/jedit-echo-host/src/contract.rs @@ -254,7 +254,10 @@ mod tests { ]; for (encoded, reason) in supported { - assert_eq!(checkpoint_reason(encoded).expect("reason should decode"), reason); + assert_eq!( + checkpoint_reason(encoded).expect("reason should decode"), + reason + ); assert_eq!(generated_checkpoint_reason(reason), encoded); } diff --git a/native/jedit-echo-host/src/records.rs b/native/jedit-echo-host/src/records.rs index dab30b38..876748c0 100644 --- a/native/jedit-echo-host/src/records.rs +++ b/native/jedit-echo-host/src/records.rs @@ -13,7 +13,6 @@ pub const REWRITE_FACT_TYPE: &str = "jedit.text.RopeRewrite.v1"; pub const DIFF_FACT_TYPE: &str = "jedit.text.RopeDiff.v1"; pub const CHECKPOINT_FACT_TYPE: &str = "jedit.text.RopeCheckpoint.v1"; -const BUFFER_ID_DOMAIN: &[u8] = b"jedit.text.buffer-worldline.v1\0"; const BLOB_ID_DOMAIN: &[u8] = b"jedit.text.blob.v1\0"; const LEAF_ID_DOMAIN: &[u8] = b"jedit.text.leaf.v1\0"; const BRANCH_ID_DOMAIN: &[u8] = b"jedit.text.branch.v1\0"; @@ -22,6 +21,10 @@ const REWRITE_ID_DOMAIN: &[u8] = b"jedit.text.rewrite.v1\0"; const DIFF_ID_DOMAIN: &[u8] = b"jedit.text.diff.v1\0"; const CHECKPOINT_ID_DOMAIN: &[u8] = b"jedit.text.checkpoint.v1\0"; +pub const BUFFER_NODE_ID_DOMAIN: &[u8] = b"jedit.text.buffer-key.v1\0"; +pub const BLOB_CONTENT_HASH_DOMAIN: &[u8] = b"jedit.text.blob-content.v1\0"; +pub const EMPTY_ROOT_DIGEST_DOMAIN: &[u8] = b"jedit.text.empty-root.v1\0"; + #[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)] pub struct BufferFact { pub buffer_key: String, @@ -122,26 +125,44 @@ impl From for NodeId { pub trait TypedFact: DeserializeOwned + Serialize { const TYPE_LABEL: &'static str; +} + +pub trait ContentAddressedFact: TypedFact { const ID_DOMAIN: &'static [u8]; } macro_rules! typed_fact { - ($fact:ty, $label:expr, $domain:expr) => { + ($fact:ty, $label:expr) => { impl TypedFact for $fact { const TYPE_LABEL: &'static str = $label; + } + }; +} + +macro_rules! content_addressed_fact { + ($fact:ty, $domain:expr) => { + impl ContentAddressedFact for $fact { const ID_DOMAIN: &'static [u8] = $domain; } }; } -typed_fact!(BufferFact, BUFFER_FACT_TYPE, BUFFER_ID_DOMAIN); -typed_fact!(BlobFact, BLOB_FACT_TYPE, BLOB_ID_DOMAIN); -typed_fact!(LeafFact, LEAF_FACT_TYPE, LEAF_ID_DOMAIN); -typed_fact!(BranchFact, BRANCH_FACT_TYPE, BRANCH_ID_DOMAIN); -typed_fact!(HeadFact, HEAD_FACT_TYPE, HEAD_ID_DOMAIN); -typed_fact!(RewriteFact, REWRITE_FACT_TYPE, REWRITE_ID_DOMAIN); -typed_fact!(DiffFact, DIFF_FACT_TYPE, DIFF_ID_DOMAIN); -typed_fact!(CheckpointFact, CHECKPOINT_FACT_TYPE, CHECKPOINT_ID_DOMAIN); +typed_fact!(BufferFact, BUFFER_FACT_TYPE); +typed_fact!(BlobFact, BLOB_FACT_TYPE); +typed_fact!(LeafFact, LEAF_FACT_TYPE); +typed_fact!(BranchFact, BRANCH_FACT_TYPE); +typed_fact!(HeadFact, HEAD_FACT_TYPE); +typed_fact!(RewriteFact, REWRITE_FACT_TYPE); +typed_fact!(DiffFact, DIFF_FACT_TYPE); +typed_fact!(CheckpointFact, CHECKPOINT_FACT_TYPE); + +content_addressed_fact!(BlobFact, BLOB_ID_DOMAIN); +content_addressed_fact!(LeafFact, LEAF_ID_DOMAIN); +content_addressed_fact!(BranchFact, BRANCH_ID_DOMAIN); +content_addressed_fact!(HeadFact, HEAD_ID_DOMAIN); +content_addressed_fact!(RewriteFact, REWRITE_ID_DOMAIN); +content_addressed_fact!(DiffFact, DIFF_ID_DOMAIN); +content_addressed_fact!(CheckpointFact, CHECKPOINT_ID_DOMAIN); pub fn fact_type_id() -> TypeId { make_type_id(T::TYPE_LABEL) @@ -152,10 +173,15 @@ pub fn fact_bytes(fact: &T) -> HostResult> { .map_err(|error| HostError::MalformedFact(format!("encode {}: {error}", T::TYPE_LABEL))) } -pub fn fact_id(fact: &T) -> HostResult { +pub fn fact_id(fact: &T) -> HostResult { Ok(content_node_id(T::ID_DOMAIN, &fact_bytes(fact)?)) } +pub(crate) fn decode_fact_bytes(bytes: &[u8]) -> HostResult { + serde_json::from_slice(bytes) + .map_err(|error| HostError::MalformedFact(format!("decode {}: {error}", T::TYPE_LABEL))) +} + pub fn decode_fact(attachment: &AttachmentValue) -> HostResult { let AttachmentValue::Atom(payload) = attachment else { return Err(HostError::MalformedFact(format!( @@ -169,6 +195,5 @@ pub fn decode_fact(attachment: &AttachmentValue) -> HostResult T::TYPE_LABEL ))); } - serde_json::from_slice(payload.bytes.as_ref()) - .map_err(|error| HostError::MalformedFact(format!("decode {}: {error}", T::TYPE_LABEL))) + decode_fact_bytes(payload.bytes.as_ref()) } diff --git a/native/jedit-echo-host/src/rope.rs b/native/jedit-echo-host/src/rope.rs index 968cd499..1c66e7ff 100644 --- a/native/jedit-echo-host/src/rope.rs +++ b/native/jedit-echo-host/src/rope.rs @@ -1,9 +1,11 @@ +mod fact_read; +mod fault; +mod replace; mod tree; mod window; use std::collections::{BTreeMap, BTreeSet}; -use serde::de::DeserializeOwned; use warp_core::{ AttachmentKey, AttachmentValue, Footprint, GraphStore, GraphView, NodeId, NodeKey, NodeRecord, TickDelta, TypeId, WarpId, WarpOp, @@ -12,15 +14,18 @@ use warp_core::{ use crate::error::{HostError, HostResult}; use crate::identity::{hash_bytes, node_id_hex}; use crate::records::{ - decode_fact, fact_bytes, fact_id, fact_type_id, BlobFact, BranchFact, BufferFact, - CheckpointFact, CheckpointReason, DiffFact, HeadFact, LeafFact, NodeIdBytes, RewriteFact, - TypedFact, + decode_fact, decode_fact_bytes, fact_bytes, fact_id, fact_type_id, BlobFact, BranchFact, + BufferFact, CheckpointFact, CheckpointReason, ContentAddressedFact, HeadFact, LeafFact, + NodeIdBytes, TypedFact, BLOB_CONTENT_HASH_DOMAIN, BUFFER_NODE_ID_DOMAIN, }; -use tree::{build_text, join, root_digest, root_metrics, split}; -use window::read_range_bytes; +use fault::{RopeFault, RopeResult}; +pub use replace::{ + plan_replace, plan_replace_with_reason, ReplaceRangeFailure, ReplaceRangeObstructionCode, +}; +use tree::{build_text, root_digest, root_metrics}; pub use window::{read_window, WindowLine, WindowProjection, WindowSupport}; -const BUFFER_NODE_DOMAIN: &[u8] = b"jedit.text.buffer-key.v1\0"; +pub const MAX_LEAF_BYTES: usize = 4096; pub trait GraphFacts { fn warp_id(&self) -> WarpId; @@ -101,7 +106,7 @@ impl<'a, T: GraphFacts> PlanContext<'a, T> { F::TYPE_LABEL ))); } - return decode_pending::(pending); + return decode_fact_bytes::(&pending.bytes); } self.reads.insert(id); let attachment = self.source.attachment(&id).ok_or_else(|| { @@ -121,7 +126,7 @@ impl<'a, T: GraphFacts> PlanContext<'a, T> { Ok(()) } - fn write_content_fact(&mut self, fact: &F) -> HostResult { + fn write_content_fact(&mut self, fact: &F) -> HostResult { let id = fact_id(fact)?; self.write_fact_at(id, fact)?; Ok(id) @@ -164,9 +169,16 @@ impl<'a, T: GraphFacts> PlanContext<'a, T> { } fn verified_blob(&mut self, id: NodeId) -> HostResult { - let blob: BlobFact = self.read_fact(id)?; - if hash_bytes(b"jedit.text.blob-content.v1\0", &blob.bytes) != blob.content_hash { - return Err(HostError::MalformedFact(format!( + self.verified_blob_fault(id) + .map_err(RopeFault::into_host_error) + } + + fn verified_blob_fault(&mut self, id: NodeId) -> RopeResult { + let blob: BlobFact = self + .read_fact(id) + .map_err(RopeFault::structural_dependency)?; + if hash_bytes(BLOB_CONTENT_HASH_DOMAIN, &blob.bytes) != blob.content_hash { + return Err(RopeFault::content_identity(format!( "blob {} content hash does not match", node_id_hex(id) ))); @@ -179,11 +191,6 @@ impl<'a, T: GraphFacts> PlanContext<'a, T> { } } -fn decode_pending(pending: &PendingFact) -> HostResult { - serde_json::from_slice(&pending.bytes) - .map_err(|error| HostError::MalformedFact(format!("decode {}: {error}", F::TYPE_LABEL))) -} - #[derive(Debug)] pub struct MutationPlan { warp_id: WarpId, @@ -256,7 +263,7 @@ impl CheckpointPlan { } pub fn buffer_node_id(buffer_key: &str) -> NodeId { - crate::identity::content_node_id(BUFFER_NODE_DOMAIN, buffer_key.as_bytes()) + crate::identity::content_node_id(BUFFER_NODE_ID_DOMAIN, buffer_key.as_bytes()) } pub fn existing_buffer( @@ -357,15 +364,20 @@ pub fn plan_create( "buffer {buffer_key} already exists" ))); } - let root = build_text(&mut context, initial_text.as_bytes())?; + let root = + build_text(&mut context, initial_text.as_bytes()).map_err(RopeFault::into_host_error)?; let metrics = root_metrics(&mut context, root)?; + let line_count = metrics + .line_breaks + .checked_add(1) + .ok_or_else(|| HostError::MalformedFact("head line count overflow".to_owned()))?; let head = HeadFact { buffer_id: buffer_id.into(), basis_head_id: None, root_node_id: root.map(NodeIdBytes::from), byte_length: metrics.byte_length, utf16_length: metrics.utf16_length, - line_count: metrics.line_breaks + 1, + line_count, root_digest: root_digest(root), sequence: 0, }; @@ -382,98 +394,6 @@ pub fn plan_create( Ok(finish_plan(context, buffer_id, head_id, &head, 0)) } -pub fn plan_replace( - source: &T, - buffer_id: NodeId, - expected_basis_head_id: NodeId, - start_byte: u64, - end_byte: u64, - insert_text: &str, -) -> HostResult { - let mut context = PlanContext::new(source); - let buffer: BufferFact = context.read_fact(buffer_id)?; - let basis_head_id = NodeId::from(buffer.canonical_head_id); - if basis_head_id != expected_basis_head_id { - return Err(HostError::InvalidRequest(format!( - "stale replace basis {}; canonical head is {}", - node_id_hex(expected_basis_head_id), - node_id_hex(basis_head_id) - ))); - } - let basis_head: HeadFact = context.read_fact(basis_head_id)?; - if start_byte > end_byte || end_byte > basis_head.byte_length { - return Err(HostError::InvalidRequest(format!( - "replace range {start_byte}..{end_byte} exceeds {} bytes", - basis_head.byte_length - ))); - } - let basis_root = basis_head.root_node_id.map(NodeId::from); - let current_bytes = read_range_bytes(&mut context, basis_root, start_byte, end_byte)?; - if current_bytes == insert_text.as_bytes() { - return Err(HostError::InvalidRequest( - "replace range is a no-op".to_owned(), - )); - } - let next_sequence = basis_head - .sequence - .checked_add(1) - .ok_or_else(|| HostError::MalformedFact("head sequence overflow".to_owned()))?; - let next_version = buffer - .version - .checked_add(1) - .ok_or_else(|| HostError::MalformedFact("buffer version overflow".to_owned()))?; - let (left, suffix) = split(&mut context, basis_root, start_byte)?; - let (_, right) = split(&mut context, suffix, end_byte - start_byte)?; - let inserted = build_text(&mut context, insert_text.as_bytes())?; - let left_with_insert = join(&mut context, left, inserted)?; - let root = join(&mut context, left_with_insert, right)?; - let metrics = root_metrics(&mut context, root)?; - let head = HeadFact { - buffer_id: buffer_id.into(), - basis_head_id: Some(basis_head_id.into()), - root_node_id: root.map(NodeIdBytes::from), - byte_length: metrics.byte_length, - utf16_length: metrics.utf16_length, - line_count: metrics.line_breaks + 1, - root_digest: root_digest(root), - sequence: next_sequence, - }; - let head_id = context.write_content_fact(&head)?; - let rewrite = RewriteFact { - buffer_id: buffer_id.into(), - basis_head_id: basis_head_id.into(), - next_head_id: head_id.into(), - start_byte, - end_byte, - inserted_byte_length: insert_text.len() as u64, - }; - let rewrite_id = context.write_content_fact(&rewrite)?; - context.write_content_fact(&DiffFact { - rewrite_id: rewrite_id.into(), - basis_head_id: basis_head_id.into(), - next_head_id: head_id.into(), - start_byte, - end_byte, - inserted_byte_length: insert_text.len() as u64, - deleted_byte_length: end_byte - start_byte, - })?; - context.write_fact_at( - buffer_id, - &BufferFact { - canonical_head_id: head_id.into(), - version: next_version, - ..buffer - }, - )?; - Ok(finish_plan( - context, - buffer_id, - head_id, - &head, - next_version, - )) -} - fn finish_plan( context: PlanContext<'_, T>, buffer_id: NodeId, diff --git a/native/jedit-echo-host/src/rope/fact_read.rs b/native/jedit-echo-host/src/rope/fact_read.rs new file mode 100644 index 00000000..a4fea5c6 --- /dev/null +++ b/native/jedit-echo-host/src/rope/fact_read.rs @@ -0,0 +1,83 @@ +use warp_core::{AttachmentValue, NodeId, TypeId}; + +use crate::error::HostError; +use crate::identity::{content_node_id, node_id_hex}; +use crate::records::{ + decode_fact_bytes, fact_bytes, fact_type_id, ContentAddressedFact, TypedFact, +}; + +use super::fault::{RopeFault, RopeResult}; +use super::{GraphFacts, PlanContext}; + +impl<'a, T: GraphFacts> PlanContext<'a, T> { + pub(super) fn read_content_fact( + &mut self, + id: NodeId, + ) -> RopeResult { + let bytes = self.content_fact_bytes::(id)?; + if content_node_id(F::ID_DOMAIN, &bytes) != id { + return Err(RopeFault::content_identity(format!( + "{} {} retained-byte content identity does not match", + F::TYPE_LABEL, + node_id_hex(id) + ))); + } + let fact = decode_fact_bytes::(&bytes).map_err(RopeFault::structural_dependency)?; + let canonical_bytes = fact_bytes(&fact).map_err(RopeFault::structural_dependency)?; + if canonical_bytes != bytes { + return Err(RopeFault::fact_malformed(format!( + "{} {} retained bytes are not canonical", + F::TYPE_LABEL, + node_id_hex(id) + ))); + } + Ok(fact) + } + + fn content_fact_bytes(&mut self, id: NodeId) -> RopeResult> { + if let Some(pending) = self.pending.get(&id) { + require_fact_type::(id, pending.type_id)?; + return Ok(pending.bytes.clone()); + } + self.reads.insert(id); + let record = self.source.node(&id).ok_or_else(|| { + RopeFault::structural_dependency(HostError::MissingFact(format!( + "{} at {}", + F::TYPE_LABEL, + node_id_hex(id) + ))) + })?; + require_fact_type::(id, record.ty)?; + let attachment = self.source.attachment(&id).ok_or_else(|| { + RopeFault::structural_dependency(HostError::MissingFact(format!( + "{} at {}", + F::TYPE_LABEL, + node_id_hex(id) + ))) + })?; + atom_fact_bytes::(id, attachment) + } +} + +fn require_fact_type(id: NodeId, actual: TypeId) -> RopeResult<()> { + if actual != fact_type_id::() { + return Err(RopeFault::fact_malformed(format!( + "node {} is not {}", + node_id_hex(id), + F::TYPE_LABEL + ))); + } + Ok(()) +} + +fn atom_fact_bytes(id: NodeId, attachment: &AttachmentValue) -> RopeResult> { + let AttachmentValue::Atom(payload) = attachment else { + return Err(RopeFault::fact_malformed(format!( + "{} at {} uses a descended attachment", + F::TYPE_LABEL, + node_id_hex(id) + ))); + }; + require_fact_type::(id, payload.type_id)?; + Ok(payload.bytes.as_ref().to_vec()) +} diff --git a/native/jedit-echo-host/src/rope/fault.rs b/native/jedit-echo-host/src/rope/fault.rs new file mode 100644 index 00000000..d97d3b5d --- /dev/null +++ b/native/jedit-echo-host/src/rope/fault.rs @@ -0,0 +1,144 @@ +use crate::error::HostError; + +#[derive(Clone, Copy, Debug, Eq, PartialEq)] +pub(super) enum RopeFaultKind { + FactMissing, + FactMalformed, + ContentIdentityMismatch, + InvalidUtf8Slice, + DeclaredRopeInconsistent, + ArithmeticOverflow, +} + +#[derive(Debug)] +pub(super) struct RopeFault { + kind: RopeFaultKind, + legacy: HostError, +} + +pub(super) type RopeResult = Result; + +impl RopeFault { + pub(super) fn structural_dependency(legacy: HostError) -> Self { + let kind = Self::structural_dependency_kind(&legacy).unwrap_or_else(|| { + panic!("non-structural host error cannot acquire rope semantics: {legacy}") + }); + Self { kind, legacy } + } + + fn structural_dependency_kind(legacy: &HostError) -> Option { + match legacy { + HostError::MissingFact(_) => Some(RopeFaultKind::FactMissing), + HostError::MalformedFact(_) => Some(RopeFaultKind::FactMalformed), + HostError::InvalidRequest(_) => Some(RopeFaultKind::DeclaredRopeInconsistent), + HostError::Echo(_) + | HostError::IntentNotApplied(_) + | HostError::GeneratedOperationUnavailable(_) + | HostError::Observation(_) + | HostError::Protocol(_) => None, + } + } + + pub(super) fn fact_malformed(message: String) -> Self { + Self { + kind: RopeFaultKind::FactMalformed, + legacy: HostError::MalformedFact(message), + } + } + + pub(super) fn content_identity(message: String) -> Self { + Self { + kind: RopeFaultKind::ContentIdentityMismatch, + legacy: HostError::MalformedFact(message), + } + } + + pub(super) fn invalid_utf8_slice(message: String) -> Self { + Self { + kind: RopeFaultKind::InvalidUtf8Slice, + legacy: HostError::InvalidRequest(message), + } + } + + pub(super) fn declared_rope_inconsistent(message: String) -> Self { + Self { + kind: RopeFaultKind::DeclaredRopeInconsistent, + legacy: HostError::InvalidRequest(message), + } + } + + pub(super) fn arithmetic_overflow(message: &'static str) -> Self { + Self { + kind: RopeFaultKind::ArithmeticOverflow, + legacy: HostError::MalformedFact(message.to_owned()), + } + } + + pub(super) fn checked_add_u64(left: u64, right: u64, message: &'static str) -> RopeResult { + left.checked_add(right) + .ok_or_else(|| Self::arithmetic_overflow(message)) + } + + pub(super) fn checked_add_u32(left: u32, right: u32, message: &'static str) -> RopeResult { + left.checked_add(right) + .ok_or_else(|| Self::arithmetic_overflow(message)) + } + + pub(super) fn into_parts(self) -> (RopeFaultKind, HostError) { + (self.kind, self.legacy) + } + + pub(super) fn into_host_error(self) -> HostError { + self.legacy + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn infrastructure_errors() -> [HostError; 5] { + [ + HostError::Echo("echo".to_owned()), + HostError::IntentNotApplied("outcome".to_owned()), + HostError::GeneratedOperationUnavailable("operation".to_owned()), + HostError::Observation("observation".to_owned()), + HostError::Protocol("protocol".to_owned()), + ] + } + + #[test] + fn structural_dependency_classifies_only_structural_errors() { + for (error, expected) in [ + ( + HostError::MissingFact("missing".to_owned()), + RopeFaultKind::FactMissing, + ), + ( + HostError::MalformedFact("malformed".to_owned()), + RopeFaultKind::FactMalformed, + ), + ( + HostError::InvalidRequest("invalid".to_owned()), + RopeFaultKind::DeclaredRopeInconsistent, + ), + ] { + assert_eq!( + RopeFault::structural_dependency_kind(&error), + Some(expected) + ); + } + for error in infrastructure_errors() { + assert_eq!(RopeFault::structural_dependency_kind(&error), None); + } + } + + #[test] + fn structural_dependency_refuses_infrastructure_errors() { + for error in infrastructure_errors() { + assert!( + std::panic::catch_unwind(move || RopeFault::structural_dependency(error)).is_err() + ); + } + } +} diff --git a/native/jedit-echo-host/src/rope/replace.rs b/native/jedit-echo-host/src/rope/replace.rs new file mode 100644 index 00000000..a66adf3f --- /dev/null +++ b/native/jedit-echo-host/src/rope/replace.rs @@ -0,0 +1,321 @@ +use serde::{Deserialize, Serialize}; +use thiserror::Error; +use warp_core::NodeId; + +use crate::error::{HostError, HostResult}; +use crate::identity::node_id_hex; +use crate::records::{BufferFact, DiffFact, HeadFact, NodeIdBytes, RewriteFact}; + +use super::fault::{RopeFault, RopeFaultKind, RopeResult}; +use super::tree::{build_text, join, root_digest, root_metrics, split}; +use super::window::read_range_bytes; +use super::{finish_plan, GraphFacts, MutationPlan, PlanContext}; + +#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "kebab-case")] +pub enum ReplaceRangeObstructionCode { + RangeOrderInvalid, + RangeOutOfBounds, + Utf8BoundaryInvalid, + NoOp, + BasisNotCanonical, + ArithmeticOverflow, + FactMissing, + FactMalformed, + ContentIdentityMismatch, + MalformedRope, +} + +impl ReplaceRangeObstructionCode { + pub const ALL: [Self; 10] = [ + Self::RangeOrderInvalid, + Self::RangeOutOfBounds, + Self::Utf8BoundaryInvalid, + Self::NoOp, + Self::BasisNotCanonical, + Self::ArithmeticOverflow, + Self::FactMissing, + Self::FactMalformed, + Self::ContentIdentityMismatch, + Self::MalformedRope, + ]; + + pub const fn as_str(self) -> &'static str { + match self { + Self::RangeOrderInvalid => "range-order-invalid", + Self::RangeOutOfBounds => "range-out-of-bounds", + Self::Utf8BoundaryInvalid => "utf8-boundary-invalid", + Self::NoOp => "no-op", + Self::BasisNotCanonical => "basis-not-canonical", + Self::ArithmeticOverflow => "arithmetic-overflow", + Self::FactMissing => "fact-missing", + Self::FactMalformed => "fact-malformed", + Self::ContentIdentityMismatch => "content-identity-mismatch", + Self::MalformedRope => "malformed-rope", + } + } +} + +#[derive(Debug, Error)] +#[error("{legacy}")] +pub struct ReplaceRangeFailure { + reason: ReplaceRangeObstructionCode, + #[source] + legacy: HostError, +} + +impl ReplaceRangeFailure { + fn new(reason: ReplaceRangeObstructionCode, legacy: HostError) -> Self { + Self { reason, legacy } + } + + fn from_rope_fault(fault: RopeFault) -> Self { + let (kind, legacy) = fault.into_parts(); + let reason = match kind { + RopeFaultKind::FactMissing => ReplaceRangeObstructionCode::FactMissing, + RopeFaultKind::FactMalformed => ReplaceRangeObstructionCode::FactMalformed, + RopeFaultKind::ContentIdentityMismatch => { + ReplaceRangeObstructionCode::ContentIdentityMismatch + } + RopeFaultKind::InvalidUtf8Slice => ReplaceRangeObstructionCode::Utf8BoundaryInvalid, + RopeFaultKind::DeclaredRopeInconsistent => ReplaceRangeObstructionCode::MalformedRope, + RopeFaultKind::ArithmeticOverflow => ReplaceRangeObstructionCode::ArithmeticOverflow, + }; + Self::new(reason, legacy) + } + + pub fn reason(&self) -> ReplaceRangeObstructionCode { + self.reason + } + + pub fn host_error(&self) -> &HostError { + &self.legacy + } + + pub fn into_host_error(self) -> HostError { + self.legacy + } +} + +pub fn plan_replace( + source: &T, + buffer_id: NodeId, + expected_basis_head_id: NodeId, + start_byte: u64, + end_byte: u64, + insert_text: &str, +) -> HostResult { + plan_replace_with_reason( + source, + buffer_id, + expected_basis_head_id, + start_byte, + end_byte, + insert_text, + ) + .map_err(ReplaceRangeFailure::into_host_error) +} + +pub fn plan_replace_with_reason( + source: &T, + buffer_id: NodeId, + expected_basis_head_id: NodeId, + start_byte: u64, + end_byte: u64, + insert_text: &str, +) -> Result { + let mut context = PlanContext::new(source); + let buffer: BufferFact = context + .read_fact(buffer_id) + .map_err(RopeFault::structural_dependency) + .map_err(ReplaceRangeFailure::from_rope_fault)?; + let basis_head_id = NodeId::from(buffer.canonical_head_id); + if basis_head_id != expected_basis_head_id { + return Err(ReplaceRangeFailure::new( + ReplaceRangeObstructionCode::BasisNotCanonical, + HostError::InvalidRequest(format!( + "stale replace basis {}; canonical head is {}", + node_id_hex(expected_basis_head_id), + node_id_hex(basis_head_id) + )), + )); + } + let basis_head: HeadFact = context + .read_content_fact(basis_head_id) + .map_err(ReplaceRangeFailure::from_rope_fault)?; + validate_basis_head_buffer(buffer_id, basis_head_id, &basis_head) + .map_err(ReplaceRangeFailure::from_rope_fault)?; + if start_byte > end_byte { + return Err(range_order_failure(start_byte, end_byte)); + } + if end_byte > basis_head.byte_length { + return Err(range_out_of_bounds_failure( + start_byte, + end_byte, + basis_head.byte_length, + )); + } + let deleted_byte_length = end_byte + .checked_sub(start_byte) + .ok_or_else(|| range_order_failure(start_byte, end_byte))?; + let basis_root = basis_head.root_node_id.map(NodeId::from); + let basis_root_metrics = root_metrics(&mut context, basis_root) + .map_err(RopeFault::structural_dependency) + .map_err(ReplaceRangeFailure::from_rope_fault)?; + if basis_root_metrics.byte_length != basis_head.byte_length { + return Err(ReplaceRangeFailure::from_rope_fault( + RopeFault::declared_rope_inconsistent( + "basis head byte length does not match root".to_owned(), + ), + )); + } + if start_byte == end_byte { + split(&mut context, basis_root, start_byte) + .map_err(ReplaceRangeFailure::from_rope_fault)?; + } + let current_bytes = read_range_bytes(&mut context, basis_root, start_byte, end_byte) + .map_err(ReplaceRangeFailure::from_rope_fault)?; + let materialized_byte_length = u64::try_from(current_bytes.len()).map_err(|_| { + ReplaceRangeFailure::from_rope_fault(RopeFault::arithmetic_overflow( + "materialized range byte length overflow", + )) + })?; + if materialized_byte_length != deleted_byte_length { + return Err(ReplaceRangeFailure::from_rope_fault( + RopeFault::declared_rope_inconsistent( + "replace range did not materialize the declared byte length".to_owned(), + ), + )); + } + if current_bytes == insert_text.as_bytes() { + return Err(ReplaceRangeFailure::new( + ReplaceRangeObstructionCode::NoOp, + HostError::InvalidRequest("replace range is a no-op".to_owned()), + )); + } + let next_sequence = basis_head.sequence.checked_add(1).ok_or_else(|| { + ReplaceRangeFailure::new( + ReplaceRangeObstructionCode::ArithmeticOverflow, + HostError::MalformedFact("head sequence overflow".to_owned()), + ) + })?; + let next_version = buffer.version.checked_add(1).ok_or_else(|| { + ReplaceRangeFailure::new( + ReplaceRangeObstructionCode::ArithmeticOverflow, + HostError::MalformedFact("buffer version overflow".to_owned()), + ) + })?; + let (left, suffix) = split(&mut context, basis_root, start_byte) + .map_err(ReplaceRangeFailure::from_rope_fault)?; + let (_, right) = split(&mut context, suffix, deleted_byte_length) + .map_err(ReplaceRangeFailure::from_rope_fault)?; + let inserted = build_text(&mut context, insert_text.as_bytes()) + .map_err(ReplaceRangeFailure::from_rope_fault)?; + let left_with_insert = + join(&mut context, left, inserted).map_err(ReplaceRangeFailure::from_rope_fault)?; + let root = join(&mut context, left_with_insert, right) + .map_err(ReplaceRangeFailure::from_rope_fault)?; + let metrics = root_metrics(&mut context, root) + .map_err(RopeFault::structural_dependency) + .map_err(ReplaceRangeFailure::from_rope_fault)?; + let line_count = RopeFault::checked_add_u64(metrics.line_breaks, 1, "head line count overflow") + .map_err(ReplaceRangeFailure::from_rope_fault)?; + let inserted_byte_length = u64::try_from(insert_text.len()).map_err(|_| { + ReplaceRangeFailure::from_rope_fault(RopeFault::arithmetic_overflow( + "inserted byte length overflow", + )) + })?; + let head = HeadFact { + buffer_id: buffer_id.into(), + basis_head_id: Some(basis_head_id.into()), + root_node_id: root.map(NodeIdBytes::from), + byte_length: metrics.byte_length, + utf16_length: metrics.utf16_length, + line_count, + root_digest: root_digest(root), + sequence: next_sequence, + }; + let head_id = context + .write_content_fact(&head) + .map_err(RopeFault::structural_dependency) + .map_err(ReplaceRangeFailure::from_rope_fault)?; + let rewrite = RewriteFact { + buffer_id: buffer_id.into(), + basis_head_id: basis_head_id.into(), + next_head_id: head_id.into(), + start_byte, + end_byte, + inserted_byte_length, + }; + let rewrite_id = context + .write_content_fact(&rewrite) + .map_err(RopeFault::structural_dependency) + .map_err(ReplaceRangeFailure::from_rope_fault)?; + context + .write_content_fact(&DiffFact { + rewrite_id: rewrite_id.into(), + basis_head_id: basis_head_id.into(), + next_head_id: head_id.into(), + start_byte, + end_byte, + inserted_byte_length, + deleted_byte_length, + }) + .map_err(RopeFault::structural_dependency) + .map_err(ReplaceRangeFailure::from_rope_fault)?; + context + .write_fact_at( + buffer_id, + &BufferFact { + canonical_head_id: head_id.into(), + version: next_version, + ..buffer + }, + ) + .map_err(RopeFault::structural_dependency) + .map_err(ReplaceRangeFailure::from_rope_fault)?; + Ok(finish_plan( + context, + buffer_id, + head_id, + &head, + next_version, + )) +} + +fn validate_basis_head_buffer( + buffer_id: NodeId, + basis_head_id: NodeId, + basis_head: &HeadFact, +) -> RopeResult<()> { + if NodeId::from(basis_head.buffer_id) != buffer_id { + return Err(RopeFault::fact_malformed(format!( + "basis head {} does not belong to buffer {}", + node_id_hex(basis_head_id), + node_id_hex(buffer_id) + ))); + } + Ok(()) +} + +fn range_order_failure(start_byte: u64, end_byte: u64) -> ReplaceRangeFailure { + ReplaceRangeFailure::new( + ReplaceRangeObstructionCode::RangeOrderInvalid, + HostError::InvalidRequest(format!( + "replace range start must not exceed end: {start_byte} > {end_byte}" + )), + ) +} + +fn range_out_of_bounds_failure( + start_byte: u64, + end_byte: u64, + basis_length: u64, +) -> ReplaceRangeFailure { + ReplaceRangeFailure::new( + ReplaceRangeObstructionCode::RangeOutOfBounds, + HostError::InvalidRequest(format!( + "replace range {start_byte}..{end_byte} exceeds {basis_length} bytes" + )), + ) +} diff --git a/native/jedit-echo-host/src/rope/tree.rs b/native/jedit-echo-host/src/rope/tree.rs index 103a261f..d39bd0f8 100644 --- a/native/jedit-echo-host/src/rope/tree.rs +++ b/native/jedit-echo-host/src/rope/tree.rs @@ -1,34 +1,38 @@ +use std::collections::BTreeSet; + use warp_core::NodeId; use crate::error::{HostError, HostResult}; use crate::identity::{hash_bytes, node_id_hex}; -use crate::records::{BlobFact, BranchFact, LeafFact}; - -use super::{GraphFacts, NodeMetrics, PlanContext, RopeNode}; - -const MAX_LEAF_BYTES: usize = 4096; -const EMPTY_ROOT_DIGEST_DOMAIN: &[u8] = b"jedit.text.empty-root.v1\0"; +use crate::records::{ + BlobFact, BranchFact, LeafFact, BLOB_CONTENT_HASH_DOMAIN, EMPTY_ROOT_DIGEST_DOMAIN, +}; +use super::fault::{RopeFault, RopeResult}; +use super::{GraphFacts, NodeMetrics, PlanContext, RopeNode, MAX_LEAF_BYTES}; pub(super) fn build_text( context: &mut PlanContext<'_, T>, bytes: &[u8], -) -> HostResult> { - let text = std::str::from_utf8(bytes) - .map_err(|error| HostError::InvalidRequest(format!("text is not UTF-8: {error}")))?; +) -> RopeResult> { + let text = std::str::from_utf8(bytes).map_err(|error| { + RopeFault::structural_dependency(HostError::InvalidRequest(format!( + "text is not UTF-8: {error}" + ))) + })?; if text.is_empty() { return Ok(None); } let mut roots = Vec::new(); let mut start = 0; while start < text.len() { - let mut end = (start + MAX_LEAF_BYTES).min(text.len()); + let mut end = start.saturating_add(MAX_LEAF_BYTES).min(text.len()); while end > start && !text.is_char_boundary(end) { end -= 1; } if end == start { - return Err(HostError::InvalidRequest( + return Err(RopeFault::structural_dependency(HostError::InvalidRequest( "unable to split UTF-8 leaf".to_owned(), - )); + ))); } roots.push(make_blob_leaf( context, @@ -46,23 +50,78 @@ pub(super) fn build_text( fn make_blob_leaf( context: &mut PlanContext<'_, T>, bytes: Vec, -) -> HostResult { - let text = std::str::from_utf8(&bytes) - .map_err(|error| HostError::InvalidRequest(format!("leaf is not UTF-8: {error}")))?; - let utf16_length = text.encode_utf16().count() as u64; - let line_breaks = bytes.iter().filter(|byte| **byte == b'\n').count() as u64; +) -> RopeResult { + let text = std::str::from_utf8(&bytes).map_err(|error| { + RopeFault::structural_dependency(HostError::InvalidRequest(format!( + "leaf is not UTF-8: {error}" + ))) + })?; + let utf16_length = u64::try_from(text.encode_utf16().count()) + .map_err(|_| RopeFault::arithmetic_overflow("leaf UTF-16 length overflow"))?; + let line_breaks = u64::try_from(bytes.iter().filter(|byte| **byte == b'\n').count()) + .map_err(|_| RopeFault::arithmetic_overflow("leaf line break count overflow"))?; let blob = BlobFact { - content_hash: hash_bytes(b"jedit.text.blob-content.v1\0", &bytes), + content_hash: hash_bytes(BLOB_CONTENT_HASH_DOMAIN, &bytes), bytes, }; - let byte_length = blob.bytes.len() as u64; - let blob_id = context.write_content_fact(&blob)?; - context.write_content_fact(&LeafFact { - blob_id: blob_id.into(), - byte_start: 0, - byte_length, - utf16_length, - line_breaks, + let byte_length = u64::try_from(blob.bytes.len()) + .map_err(|_| RopeFault::arithmetic_overflow("leaf byte length overflow"))?; + let blob_id = context + .write_content_fact(&blob) + .map_err(RopeFault::structural_dependency)?; + context + .write_content_fact(&LeafFact { + blob_id: blob_id.into(), + byte_start: 0, + byte_length, + utf16_length, + line_breaks, + }) + .map_err(RopeFault::structural_dependency) +} + +struct LocatedLeafSlice { + blob: BlobFact, + absolute_start: u64, + start: usize, + end: usize, +} + +impl LocatedLeafSlice { + fn bytes(&self) -> &[u8] { + &self.blob.bytes[self.start..self.end] + } +} + +fn locate_leaf_slice( + context: &mut PlanContext<'_, T>, + leaf: &LeafFact, + relative_start: u64, + byte_length: u64, +) -> RopeResult { + let blob_id = NodeId::from(leaf.blob_id); + let blob = context.verified_blob_fault(blob_id)?; + let absolute_start = + RopeFault::checked_add_u64(leaf.byte_start, relative_start, "leaf range start overflow")?; + let absolute_end = + RopeFault::checked_add_u64(absolute_start, byte_length, "leaf range end overflow")?; + let start = usize::try_from(absolute_start).map_err(|_| { + RopeFault::declared_rope_inconsistent("leaf offset exceeds addressable memory".to_owned()) + })?; + let end = usize::try_from(absolute_end).map_err(|_| { + RopeFault::declared_rope_inconsistent("leaf end exceeds addressable memory".to_owned()) + })?; + if blob.bytes.get(start..end).is_none() { + return Err(RopeFault::fact_malformed(format!( + "leaf {} exceeds blob bounds", + node_id_hex(blob_id) + ))); + } + Ok(LocatedLeafSlice { + blob, + absolute_start, + start, + end, }) } @@ -71,74 +130,200 @@ fn make_leaf_slice( leaf: &LeafFact, relative_start: u64, byte_length: u64, -) -> HostResult> { +) -> RopeResult> { if byte_length == 0 { return Ok(None); } - let blob_id = NodeId::from(leaf.blob_id); - let bytes = context.blob_bytes(blob_id)?; - let start = usize::try_from(leaf.byte_start + relative_start).map_err(|_| { - HostError::InvalidRequest("leaf offset exceeds addressable memory".to_owned()) - })?; - let end = usize::try_from(leaf.byte_start + relative_start + byte_length) - .map_err(|_| HostError::InvalidRequest("leaf end exceeds addressable memory".to_owned()))?; - let slice = bytes.get(start..end).ok_or_else(|| { - HostError::MalformedFact(format!("leaf {} exceeds blob bounds", node_id_hex(blob_id))) - })?; + let located = locate_leaf_slice(context, leaf, relative_start, byte_length)?; + let slice = located.bytes(); let text = std::str::from_utf8(slice).map_err(|_| { - HostError::InvalidRequest("replace offset splits a UTF-8 code point".to_owned()) + RopeFault::invalid_utf8_slice("replace offset splits a UTF-8 code point".to_owned()) })?; let fact = LeafFact { blob_id: leaf.blob_id, - byte_start: leaf.byte_start + relative_start, + byte_start: located.absolute_start, byte_length, - utf16_length: text.encode_utf16().count() as u64, - line_breaks: slice.iter().filter(|byte| **byte == b'\n').count() as u64, + utf16_length: u64::try_from(text.encode_utf16().count()) + .map_err(|_| RopeFault::arithmetic_overflow("leaf UTF-16 length overflow"))?, + line_breaks: u64::try_from(slice.iter().filter(|byte| **byte == b'\n').count()) + .map_err(|_| RopeFault::arithmetic_overflow("leaf line break count overflow"))?, }; - context.write_content_fact(&fact).map(Some) + context + .write_content_fact(&fact) + .map(Some) + .map_err(RopeFault::structural_dependency) +} + +#[derive(Clone, Copy, Eq, PartialEq)] +enum EndpointSide { + Left, + Right, +} + +fn validate_endpoint( + context: &mut PlanContext<'_, T>, + mut node_id: NodeId, + side: EndpointSide, +) -> RopeResult<()> { + let mut visited = BTreeSet::new(); + let mut branches = Vec::new(); + loop { + if !visited.insert(node_id) { + return Err(RopeFault::fact_malformed(format!( + "rope node cycle at {}", + node_id_hex(node_id) + ))); + } + match context + .rope_node(node_id) + .map_err(RopeFault::structural_dependency)? + { + RopeNode::Leaf(leaf) => { + let located = locate_leaf_slice(context, &leaf, 0, leaf.byte_length)?; + std::str::from_utf8(located.bytes()).map_err(|_| { + RopeFault::invalid_utf8_slice( + "replace offset splits a UTF-8 code point".to_owned(), + ) + })?; + break; + } + RopeNode::Branch(branch) => { + let next = match side { + EndpointSide::Left => NodeId::from(branch.left), + EndpointSide::Right => NodeId::from(branch.right), + }; + branches.push((node_id, branch)); + node_id = next; + } + } + } + for (branch_id, branch) in branches.into_iter().rev() { + validate_branch_aggregates(context, branch_id, &branch)?; + } + Ok(()) +} + +fn validate_branch_aggregates( + context: &mut PlanContext<'_, T>, + branch_id: NodeId, + branch: &BranchFact, +) -> RopeResult<()> { + let left = context + .node_metrics(NodeId::from(branch.left)) + .map_err(RopeFault::structural_dependency)?; + let right = context + .node_metrics(NodeId::from(branch.right)) + .map_err(RopeFault::structural_dependency)?; + let expected_byte_length = RopeFault::checked_add_u64( + left.byte_length, + right.byte_length, + "rope byte length overflow", + )?; + if branch.byte_length != expected_byte_length { + return Err(RopeFault::fact_malformed(format!( + "branch byte length does not match children at {}", + node_id_hex(branch_id) + ))); + } + let expected_utf16_length = RopeFault::checked_add_u64( + left.utf16_length, + right.utf16_length, + "rope UTF-16 length overflow", + )?; + if branch.utf16_length != expected_utf16_length { + return Err(RopeFault::fact_malformed(format!( + "branch UTF-16 length does not match children at {}", + node_id_hex(branch_id) + ))); + } + let expected_line_breaks = RopeFault::checked_add_u64( + left.line_breaks, + right.line_breaks, + "rope line break count overflow", + )?; + if branch.line_breaks != expected_line_breaks { + return Err(RopeFault::fact_malformed(format!( + "branch line break count does not match children at {}", + node_id_hex(branch_id) + ))); + } + let expected_height = + RopeFault::checked_add_u32(left.height.max(right.height), 1, "rope height overflow")?; + if branch.height != expected_height { + return Err(RopeFault::fact_malformed(format!( + "branch height does not match children at {}", + node_id_hex(branch_id) + ))); + } + Ok(()) } pub(super) fn split( context: &mut PlanContext<'_, T>, root: Option, offset: u64, -) -> HostResult<(Option, Option)> { +) -> RopeResult<(Option, Option)> { let Some(root_id) = root else { if offset == 0 { return Ok((None, None)); } - return Err(HostError::InvalidRequest( + return Err(RopeFault::declared_rope_inconsistent( "split exceeds empty rope".to_owned(), )); }; - let metrics = context.node_metrics(root_id)?; + let metrics = context + .node_metrics(root_id) + .map_err(RopeFault::structural_dependency)?; if offset > metrics.byte_length { - return Err(HostError::InvalidRequest( + return Err(RopeFault::declared_rope_inconsistent( "split exceeds rope length".to_owned(), )); } if offset == 0 { + validate_endpoint(context, root_id, EndpointSide::Left)?; return Ok((None, Some(root_id))); } if offset == metrics.byte_length { + validate_endpoint(context, root_id, EndpointSide::Right)?; return Ok((Some(root_id), None)); } - match context.rope_node(root_id)? { - RopeNode::Leaf(leaf) => Ok(( - make_leaf_slice(context, &leaf, 0, offset)?, - make_leaf_slice(context, &leaf, offset, leaf.byte_length - offset)?, - )), + match context + .rope_node(root_id) + .map_err(RopeFault::structural_dependency)? + { + RopeNode::Leaf(leaf) => { + let suffix_length = leaf.byte_length.checked_sub(offset).ok_or_else(|| { + RopeFault::declared_rope_inconsistent( + "leaf split exceeds declared length".to_owned(), + ) + })?; + Ok(( + make_leaf_slice(context, &leaf, 0, offset)?, + make_leaf_slice(context, &leaf, offset, suffix_length)?, + )) + } RopeNode::Branch(branch) => { let left = NodeId::from(branch.left); let right = NodeId::from(branch.right); - let left_length = context.node_metrics(left)?.byte_length; + let left_length = context + .node_metrics(left) + .map_err(RopeFault::structural_dependency)? + .byte_length; if offset < left_length { let (prefix, middle) = split(context, Some(left), offset)?; Ok((prefix, join(context, middle, Some(right))?)) } else if offset == left_length { + validate_branch_aggregates(context, root_id, &branch)?; + validate_endpoint(context, left, EndpointSide::Right)?; + validate_endpoint(context, right, EndpointSide::Left)?; Ok((Some(left), Some(right))) } else { - let (middle, suffix) = split(context, Some(right), offset - left_length)?; + let right_offset = offset.checked_sub(left_length).ok_or_else(|| { + RopeFault::declared_rope_inconsistent( + "branch split offset underflow".to_owned(), + ) + })?; + let (middle, suffix) = split(context, Some(right), right_offset)?; Ok((join(context, Some(left), middle)?, suffix)) } } @@ -149,15 +334,24 @@ pub(super) fn join( context: &mut PlanContext<'_, T>, left: Option, right: Option, -) -> HostResult> { +) -> RopeResult> { let (Some(left_id), Some(right_id)) = (left, right) else { return Ok(left.or(right)); }; - let left_metrics = context.node_metrics(left_id)?; - let right_metrics = context.node_metrics(right_id)?; - if left_metrics.height > right_metrics.height + 1 { - let RopeNode::Branch(left_branch) = context.rope_node(left_id)? else { - return Err(HostError::MalformedFact( + let left_metrics = context + .node_metrics(left_id) + .map_err(RopeFault::structural_dependency)?; + let right_metrics = context + .node_metrics(right_id) + .map_err(RopeFault::structural_dependency)?; + let right_height_limit = + RopeFault::checked_add_u32(right_metrics.height, 1, "right rope height overflow")?; + if left_metrics.height > right_height_limit { + let RopeNode::Branch(left_branch) = context + .rope_node(left_id) + .map_err(RopeFault::structural_dependency)? + else { + return Err(RopeFault::fact_malformed( "unbalanced leaf height".to_owned(), )); }; @@ -168,9 +362,14 @@ pub(super) fn join( )?; return join(context, Some(NodeId::from(left_branch.left)), joined); } - if right_metrics.height > left_metrics.height + 1 { - let RopeNode::Branch(right_branch) = context.rope_node(right_id)? else { - return Err(HostError::MalformedFact( + let left_height_limit = + RopeFault::checked_add_u32(left_metrics.height, 1, "left rope height overflow")?; + if right_metrics.height > left_height_limit { + let RopeNode::Branch(right_branch) = context + .rope_node(right_id) + .map_err(RopeFault::structural_dependency)? + else { + return Err(RopeFault::fact_malformed( "unbalanced leaf height".to_owned(), )); }; @@ -184,12 +383,31 @@ pub(super) fn join( let branch = BranchFact { left: left_id.into(), right: right_id.into(), - byte_length: left_metrics.byte_length + right_metrics.byte_length, - utf16_length: left_metrics.utf16_length + right_metrics.utf16_length, - line_breaks: left_metrics.line_breaks + right_metrics.line_breaks, - height: left_metrics.height.max(right_metrics.height) + 1, + byte_length: RopeFault::checked_add_u64( + left_metrics.byte_length, + right_metrics.byte_length, + "rope byte length overflow", + )?, + utf16_length: RopeFault::checked_add_u64( + left_metrics.utf16_length, + right_metrics.utf16_length, + "rope UTF-16 length overflow", + )?, + line_breaks: RopeFault::checked_add_u64( + left_metrics.line_breaks, + right_metrics.line_breaks, + "rope line break count overflow", + )?, + height: RopeFault::checked_add_u32( + left_metrics.height.max(right_metrics.height), + 1, + "rope height overflow", + )?, }; - context.write_content_fact(&branch).map(Some) + context + .write_content_fact(&branch) + .map(Some) + .map_err(RopeFault::structural_dependency) } pub(super) fn root_metrics( @@ -213,3 +431,47 @@ pub(super) fn root_digest(root: Option) -> [u8; 32] { |id| *id.as_bytes(), ) } + +#[cfg(test)] +mod tests { + use warp_core::{make_warp_id, GraphStore}; + + use super::*; + use crate::records::NodeIdBytes; + + #[test] + fn join_refuses_left_height_overflow_with_structural_provenance() { + let store = GraphStore::new(make_warp_id("left-height-overflow")); + let mut context = PlanContext::new(&store); + let child = NodeIdBytes([0xA5; 32]); + let left = context + .write_content_fact(&BranchFact { + left: child, + right: child, + byte_length: 0, + utf16_length: 0, + line_breaks: 0, + height: u32::MAX, + }) + .expect("left fixture should identify"); + let right = context + .write_content_fact(&BranchFact { + left: child, + right: child, + byte_length: 0, + utf16_length: 0, + line_breaks: 0, + height: u32::MAX - 1, + }) + .expect("right fixture should identify"); + + let error = join(&mut context, Some(left), Some(right)) + .expect_err("left height overflow must obstruct joining"); + let (kind, legacy) = error.into_parts(); + assert_eq!(kind, super::super::fault::RopeFaultKind::ArithmeticOverflow); + assert!(matches!( + legacy, + HostError::MalformedFact(message) if message == "left rope height overflow" + )); + } +} diff --git a/native/jedit-echo-host/src/rope/window.rs b/native/jedit-echo-host/src/rope/window.rs index b37de044..2f0bb4ca 100644 --- a/native/jedit-echo-host/src/rope/window.rs +++ b/native/jedit-echo-host/src/rope/window.rs @@ -4,6 +4,7 @@ use crate::error::{HostError, HostResult}; use crate::identity::node_id_hex; use crate::records::{BufferFact, HeadFact}; +use super::fault::{RopeFault, RopeResult}; use super::{GraphFacts, PlanContext, RopeNode}; #[derive(Clone, Debug, serde::Deserialize, serde::Serialize)] @@ -74,7 +75,8 @@ pub fn read_window( bounded_end, &mut bytes, &mut support, - )?; + ) + .map_err(RopeFault::into_host_error)?; } let (text, actual_end) = complete_utf8_prefix(bytes, start_byte, bounded_end)?; support.retain(|item| item.start_byte < actual_end); @@ -86,7 +88,7 @@ pub fn read_window( } else { 0 }; - let lines = window_lines(&text, first_line, start_byte); + let lines = window_lines(&text, first_line, start_byte)?; Ok(WindowProjection { buffer_id: node_id_hex(buffer_id), basis_head_id: node_id_hex(basis_head_id), @@ -118,10 +120,15 @@ fn complete_utf8_prefix( let valid_length = utf8_error.valid_up_to(); let mut prefix = error.into_bytes(); prefix.truncate(valid_length); - let text = String::from_utf8(prefix).map_err(|_| { - HostError::InvalidRequest("window range is not UTF-8".to_owned()) + let text = String::from_utf8(prefix) + .map_err(|_| HostError::InvalidRequest("window range is not UTF-8".to_owned()))?; + let valid_length = u64::try_from(valid_length).map_err(|_| { + HostError::InvalidRequest("window UTF-8 prefix length overflow".to_owned()) })?; - Ok((text, start_byte + valid_length as u64)) + let actual_end = start_byte + .checked_add(valid_length) + .ok_or_else(|| HostError::InvalidRequest("window UTF-8 end overflow".to_owned()))?; + Ok((text, actual_end)) } } } @@ -131,7 +138,7 @@ pub(super) fn read_range_bytes( root: Option, start_byte: u64, end_byte: u64, -) -> HostResult> { +) -> RopeResult> { let mut bytes = Vec::new(); let mut support = Vec::new(); if let Some(root_id) = root { @@ -157,16 +164,25 @@ fn collect_range( range_end: u64, output: &mut Vec, support: &mut Vec, -) -> HostResult<()> { - let metrics = context.node_metrics(node_id)?; - let node_end = node_start + metrics.byte_length; +) -> RopeResult<()> { + let metrics = context + .node_metrics(node_id) + .map_err(RopeFault::structural_dependency)?; + let node_end = + RopeFault::checked_add_u64(node_start, metrics.byte_length, "rope node end overflow")?; if range_end <= node_start || range_start >= node_end { return Ok(()); } - match context.rope_node(node_id)? { + match context + .rope_node(node_id) + .map_err(RopeFault::structural_dependency)? + { RopeNode::Branch(branch) => { let left = NodeId::from(branch.left); - let left_length = context.node_metrics(left)?.byte_length; + let left_length = context + .node_metrics(left) + .map_err(RopeFault::structural_dependency)? + .byte_length; collect_range( context, left, @@ -176,10 +192,12 @@ fn collect_range( output, support, )?; + let right_start = + RopeFault::checked_add_u64(node_start, left_length, "rope child start overflow")?; collect_range( context, NodeId::from(branch.right), - node_start + left_length, + right_start, range_start, range_end, output, @@ -190,18 +208,38 @@ fn collect_range( let overlap_start = range_start.max(node_start); let overlap_end = range_end.min(node_end); let blob_id = NodeId::from(leaf.blob_id); - let blob = context.verified_blob(blob_id)?; - let relative_start = usize::try_from(leaf.byte_start + overlap_start - node_start) - .map_err(|_| { - HostError::InvalidRequest("window offset exceeds memory".to_owned()) - })?; - let relative_end = usize::try_from(leaf.byte_start + overlap_end - node_start) - .map_err(|_| HostError::InvalidRequest("window end exceeds memory".to_owned()))?; + let blob = context.verified_blob_fault(blob_id)?; + let overlap_start_offset = overlap_start.checked_sub(node_start).ok_or_else(|| { + RopeFault::declared_rope_inconsistent( + "window overlap starts before its rope node".to_owned(), + ) + })?; + let overlap_end_offset = overlap_end.checked_sub(node_start).ok_or_else(|| { + RopeFault::declared_rope_inconsistent( + "window overlap ends before its rope node".to_owned(), + ) + })?; + let relative_start = RopeFault::checked_add_u64( + leaf.byte_start, + overlap_start_offset, + "leaf range start overflow", + )?; + let relative_end = RopeFault::checked_add_u64( + leaf.byte_start, + overlap_end_offset, + "leaf range end overflow", + )?; + let relative_start = usize::try_from(relative_start).map_err(|_| { + RopeFault::declared_rope_inconsistent("window offset exceeds memory".to_owned()) + })?; + let relative_end = usize::try_from(relative_end).map_err(|_| { + RopeFault::declared_rope_inconsistent("window end exceeds memory".to_owned()) + })?; let slice = blob .bytes .get(relative_start..relative_end) .ok_or_else(|| { - HostError::MalformedFact(format!("leaf {} exceeds blob", node_id_hex(node_id))) + RopeFault::fact_malformed(format!("leaf {} exceeds blob", node_id_hex(node_id))) })?; output.extend_from_slice(slice); support.push(WindowSupport { @@ -231,50 +269,89 @@ fn count_breaks_before( if offset <= left_metrics.byte_length { count_breaks_before(context, left, offset) } else { - Ok(left_metrics.line_breaks - + count_breaks_before( - context, - NodeId::from(branch.right), - offset - left_metrics.byte_length, - )?) + let right_offset = + offset + .checked_sub(left_metrics.byte_length) + .ok_or_else(|| { + HostError::MalformedFact("window branch offset underflow".to_owned()) + })?; + let right_breaks = + count_breaks_before(context, NodeId::from(branch.right), right_offset)?; + left_metrics + .line_breaks + .checked_add(right_breaks) + .ok_or_else(|| { + HostError::MalformedFact("window line count overflow".to_owned()) + }) } } RopeNode::Leaf(leaf) => { let blob = context.blob_bytes(NodeId::from(leaf.blob_id))?; let start = usize::try_from(leaf.byte_start) .map_err(|_| HostError::InvalidRequest("leaf start exceeds memory".to_owned()))?; - let end = usize::try_from(leaf.byte_start + offset) + let absolute_end = leaf.byte_start.checked_add(offset).ok_or_else(|| { + HostError::MalformedFact("window leaf offset overflow".to_owned()) + })?; + let end = usize::try_from(absolute_end) .map_err(|_| HostError::InvalidRequest("leaf offset exceeds memory".to_owned()))?; let bytes = blob.get(start..end).ok_or_else(|| { HostError::MalformedFact("line prefix exceeds leaf blob".to_owned()) })?; - Ok(bytes.iter().filter(|byte| **byte == b'\n').count() as u64) + u64::try_from(bytes.iter().filter(|byte| **byte == b'\n').count()) + .map_err(|_| HostError::MalformedFact("window line count overflow".to_owned())) } } } -fn window_lines(text: &str, first_line: u64, start_byte: u64) -> Vec { +fn window_lines(text: &str, first_line: u64, start_byte: u64) -> HostResult> { let mut lines = Vec::new(); let mut relative_start = 0usize; for (index, segment) in text.split_inclusive('\n').enumerate() { let content = segment.strip_suffix('\n').unwrap_or(segment); let content = content.strip_suffix('\r').unwrap_or(content); - let relative_end = relative_start + content.len(); + let relative_end = relative_start.checked_add(content.len()).ok_or_else(|| { + HostError::MalformedFact("window line byte length overflow".to_owned()) + })?; + let line_offset = u64::try_from(index) + .map_err(|_| HostError::MalformedFact("window line index overflow".to_owned()))?; + let line_number = first_line + .checked_add(line_offset) + .ok_or_else(|| HostError::MalformedFact("window line number overflow".to_owned()))?; + let relative_start_u64 = u64::try_from(relative_start) + .map_err(|_| HostError::MalformedFact("window line start overflow".to_owned()))?; + let relative_end_u64 = u64::try_from(relative_end) + .map_err(|_| HostError::MalformedFact("window line end overflow".to_owned()))?; lines.push(WindowLine { - line_number: first_line + index as u64, - start_byte: start_byte + relative_start as u64, - end_byte: start_byte + relative_end as u64, + line_number, + start_byte: start_byte.checked_add(relative_start_u64).ok_or_else(|| { + HostError::MalformedFact("window absolute line start overflow".to_owned()) + })?, + end_byte: start_byte.checked_add(relative_end_u64).ok_or_else(|| { + HostError::MalformedFact("window absolute line end overflow".to_owned()) + })?, text: content.to_owned(), }); - relative_start += segment.len(); + relative_start = relative_start + .checked_add(segment.len()) + .ok_or_else(|| HostError::MalformedFact("window segment length overflow".to_owned()))?; } if text.is_empty() || text.ends_with('\n') { + let line_offset = u64::try_from(lines.len()) + .map_err(|_| HostError::MalformedFact("window line index overflow".to_owned()))?; + let text_length = u64::try_from(text.len()) + .map_err(|_| HostError::MalformedFact("window text length overflow".to_owned()))?; + let line_number = first_line + .checked_add(line_offset) + .ok_or_else(|| HostError::MalformedFact("window line number overflow".to_owned()))?; + let end_byte = start_byte.checked_add(text_length).ok_or_else(|| { + HostError::MalformedFact("window absolute text end overflow".to_owned()) + })?; lines.push(WindowLine { - line_number: first_line + lines.len() as u64, - start_byte: start_byte + text.len() as u64, - end_byte: start_byte + text.len() as u64, + line_number, + start_byte: end_byte, + end_byte, text: String::new(), }); } - lines + Ok(lines) } diff --git a/native/jedit-echo-host/tests/replace_range_corpus_conformance.rs b/native/jedit-echo-host/tests/replace_range_corpus_conformance.rs new file mode 100644 index 00000000..e7a213fb --- /dev/null +++ b/native/jedit-echo-host/tests/replace_range_corpus_conformance.rs @@ -0,0 +1,387 @@ +#[path = "support/replace_range_contract.rs"] +mod contract; +#[path = "support/replace_range_corpus_contract.rs"] +mod corpus_contract; +#[path = "support/replace_range_corpus_fact_chain_tests.rs"] +mod fact_chain_tests; +#[path = "support/replace_range_corpus_lexemes.rs"] +mod lexemes; +#[path = "support/replace_range_patch_fact_contract.rs"] +mod patch_fact_contract; +#[path = "support/replace_range_corpus_patch_tests.rs"] +mod patch_tests; +#[path = "support/replace_range_source_set.rs"] +mod source_set; + +use serde_json::Value; + +use corpus_contract::{validate_oracle_contract, NONCANONICAL_CORPUS_BYTES}; + +const ORACLE_BYTES: &[u8] = include_bytes!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.json" +)); +const CORPUS_CONTRACT_SOURCE: &str = include_str!("support/replace_range_corpus_contract.rs"); + +fn corpus() -> Value { + serde_json::from_slice(ORACLE_BYTES).expect("oracle corpus should decode") +} + +fn bytes(value: &Value) -> Vec { + let mut bytes = serde_json::to_vec_pretty(value).expect("mutated corpus should encode"); + bytes.push(b'\n'); + bytes +} + +fn mutation_error(label: &str, mutate: impl FnOnce(&mut Value)) -> String { + let mut corpus = corpus(); + mutate(&mut corpus); + let error = validate_oracle_contract(&bytes(&corpus)) + .expect_err("mutated corpus should violate its contract"); + assert!(!error.is_empty(), "{label} returned an empty error"); + assert_ne!( + error, NONCANONICAL_CORPUS_BYTES, + "{label} did not reach its intended semantic validator" + ); + error +} + +fn assert_invalid(label: &str, mutate: impl FnOnce(&mut Value)) { + drop(mutation_error(label, mutate)); +} + +fn assert_pointer_invalid(pointer: &str, value: Value) { + assert_invalid(pointer, |corpus| { + *corpus + .pointer_mut(pointer) + .unwrap_or_else(|| panic!("{pointer} should exist")) = value; + }); +} + +fn committable(corpus: &mut Value) -> &mut Value { + corpus["cases"] + .as_array_mut() + .expect("cases should be an array") + .iter_mut() + .find(|case| case["terminal"]["posture"] == "committable") + .expect("a committable case should exist") +} + +fn obstruction(corpus: &mut Value) -> &mut Value { + corpus["cases"] + .as_array_mut() + .expect("cases should be an array") + .iter_mut() + .find(|case| case["terminal"]["posture"] == "obstructed") + .expect("an obstruction should exist") +} + +#[test] +fn committed_oracle_satisfies_the_strict_corpus_contract() { + validate_oracle_contract(ORACLE_BYTES).expect("oracle corpus should satisfy its contract"); +} + +#[test] +fn strict_corpus_rejects_noncanonical_member_order_and_framing() { + let canonical = std::str::from_utf8(ORACLE_BYTES).expect("oracle should be UTF-8"); + let ordered = concat!( + " \"schemaVersion\": 1,\n", + " \"coordinate\": \"jedit.text.ReplaceRange.oracle@1\"," + ); + let reordered = concat!( + " \"coordinate\": \"jedit.text.ReplaceRange.oracle@1\",\n", + " \"schemaVersion\": 1," + ); + assert_eq!(canonical.matches(ordered).count(), 1); + let reordered = canonical.replacen(ordered, reordered, 1); + serde_json::from_str::(&reordered).expect("reordered corpus remains valid JSON"); + assert!(validate_oracle_contract(reordered.as_bytes()).is_err()); + + let without_final_newline = ORACLE_BYTES + .strip_suffix(b"\n") + .expect("canonical corpus should end in one newline"); + assert!(validate_oracle_contract(without_final_newline).is_err()); +} + +#[test] +fn corpus_validator_does_not_duplicate_the_obstruction_domain() { + assert!(!CORPUS_CONTRACT_SOURCE.contains("const CODES")); +} + +#[test] +fn strict_corpus_rejects_invalid_typed_and_invariant_values() { + let mut wrong_version = corpus(); + wrong_version["schemaVersion"] = Value::from(2); + assert!(validate_oracle_contract(&bytes(&wrong_version)).is_err()); + + let mut wrong_algorithm = corpus(); + wrong_algorithm["sourceSet"]["algorithm"] = Value::String("blake3".to_owned()); + assert!(validate_oracle_contract(&bytes(&wrong_algorithm)).is_err()); + + let mut unsafe_obstruction = corpus(); + let obstruction = unsafe_obstruction["cases"] + .as_array_mut() + .expect("cases should be an array") + .iter_mut() + .find(|case| case["terminal"]["posture"] == "obstructed") + .expect("an obstruction should exist"); + obstruction["terminal"]["parentGraphUnchanged"] = Value::Bool(false); + assert!(validate_oracle_contract(&bytes(&unsafe_obstruction)).is_err()); + + let mut malformed_result = corpus(); + let committable = malformed_result["cases"] + .as_array_mut() + .expect("cases should be an array") + .iter_mut() + .find(|case| case["terminal"]["posture"] == "committable") + .expect("a committable case should exist"); + committable["terminal"]["result"]["headId"] = Value::String("aa".to_owned()); + assert!(validate_oracle_contract(&bytes(&malformed_result)).is_err()); + + let mut malformed_footprint = corpus(); + let committable = malformed_footprint["cases"] + .as_array_mut() + .expect("cases should be an array") + .iter_mut() + .find(|case| case["terminal"]["posture"] == "committable") + .expect("a committable case should exist"); + committable["terminal"]["footprint"]["nodeReads"] = Value::String("not-an-array".to_owned()); + assert!(validate_oracle_contract(&bytes(&malformed_footprint)).is_err()); + + let mut unbound_invocation = corpus(); + unbound_invocation["cases"][0]["invocationBytesHex"] = Value::String("7b7d".to_owned()); + assert!(validate_oracle_contract(&bytes(&unbound_invocation)).is_err()); +} + +#[test] +fn strict_corpus_binds_envelope_and_source_identity() { + for (pointer, value) in [ + ("/schemaVersion", Value::from(2)), + ("/coordinate", Value::String("other.operation@1".to_owned())), + ( + "/applicationSchemaCoordinate", + Value::String("other.schema@1".to_owned()), + ), + ( + "/invocationSchemaCoordinate", + Value::String("other.invocation@1".to_owned()), + ), + ( + "/historicalPlannerCheckpointCommit", + Value::String("00".repeat(20)), + ), + ( + "/evidenceGrade", + Value::String("independent-verification".to_owned()), + ), + ("/independenceLimit", Value::String("none".to_owned())), + ("/warpId", Value::String("AA".repeat(32))), + ("/sourceSet/algorithm", Value::String("blake3".to_owned())), + ("/sourceSet/domainHex", Value::String("00".to_owned())), + ( + "/sourceSet/framing", + Value::String("unframed-concatenation".to_owned()), + ), + ("/sourceSet/digestHex", Value::String("00".repeat(32))), + ] { + assert_pointer_invalid(pointer, value); + } + + assert_invalid("foreign source-set path", |corpus| { + corpus["sourceSet"]["paths"][0] = Value::String("foreign/source.rs".to_owned()); + }); + assert_invalid("reordered source-set paths", |corpus| { + corpus["sourceSet"]["paths"] + .as_array_mut() + .expect("source-set paths should be an array") + .swap(0, 1); + }); + assert_invalid("obsolete semantic baseline member", |corpus| { + let envelope = corpus.as_object_mut().expect("corpus should be an object"); + let checkpoint = envelope + .remove("historicalPlannerCheckpointCommit") + .expect("historical checkpoint should exist"); + envelope.insert("semanticBaselineCommit".to_owned(), checkpoint); + }); +} + +#[test] +fn strict_corpus_validates_leaf_lexemes_and_numeric_domains() { + for (pointer, value) in [ + ( + "/cases/0/basisFacts/0/nodeId", + Value::String("AA".repeat(32)), + ), + ( + "/cases/0/basisFacts/0/typeId", + Value::String("aa".repeat(31)), + ), + ( + "/cases/0/basisFacts/0/attachmentBytesHex", + Value::String("0".to_owned()), + ), + ( + "/cases/0/terminal/footprint/nodeReads/0", + Value::String("gg".repeat(32)), + ), + ( + "/cases/0/terminal/patch/0/nodeId", + Value::String("aa".repeat(31)), + ), + ( + "/cases/0/terminal/patch/0/typeId", + Value::String("AA".repeat(32)), + ), + ( + "/cases/0/terminal/createdNodeIds/0", + Value::String("0".to_owned()), + ), + ( + "/cases/0/terminal/result/headId", + Value::String("aa".repeat(31)), + ), + ( + "/cases/0/terminal/result/rootDigest", + Value::String("zz".repeat(32)), + ), + ( + "/cases/0/terminal/result/byteLength", + Value::String("4".to_owned()), + ), + ( + "/cases/0/terminal/result/materializedTextUtf8Hex", + Value::String("ff".to_owned()), + ), + ] { + assert_pointer_invalid(pointer, value); + } + + assert_invalid("set-node-alpha attachment", |corpus| { + let operation = committable(corpus)["terminal"]["patch"] + .as_array_mut() + .expect("patch should be an array") + .iter_mut() + .find(|operation| operation["kind"] == "set-node-alpha") + .expect("set-node-alpha should exist"); + operation["attachmentBytesHex"] = Value::String("xyz".to_owned()); + }); +} + +#[test] +fn strict_corpus_enforces_terminal_and_partition_invariants() { + assert_invalid("false unchanged-parent evidence", |corpus| { + obstruction(corpus)["terminal"]["parentGraphUnchanged"] = Value::Bool(false); + }); + assert_invalid("wrong obstruction patch posture", |corpus| { + obstruction(corpus)["terminal"]["patchPosture"] = Value::String("mutation-plan".to_owned()); + }); + assert_invalid("duplicate case identity", |corpus| { + let cases = corpus["cases"] + .as_array_mut() + .expect("cases should be an array"); + cases[1]["id"] = cases[0]["id"].clone(); + }); + assert_invalid("empty case purpose", |corpus| { + corpus["cases"][0]["purpose"] = Value::String(String::new()); + }); + assert_invalid("duplicate created node", |corpus| { + let created = committable(corpus)["terminal"]["createdNodeIds"] + .as_array_mut() + .expect("created nodes should be an array"); + created.push(created[0].clone()); + }); + assert_invalid("patch node and atom type disagreement", |corpus| { + let operation = committable(corpus)["terminal"]["patch"] + .as_array_mut() + .expect("patch should be an array") + .iter_mut() + .find(|operation| operation["kind"] == "set-node-alpha") + .expect("set-node-alpha should exist"); + operation["typeId"] = Value::String("00".repeat(32)); + }); + assert_invalid("result metric mismatch", |corpus| { + committable(corpus)["terminal"]["result"]["byteLength"] = Value::from(999); + }); +} + +#[test] +fn strict_corpus_requires_declared_reads_to_exist_in_the_basis() { + assert_invalid("foreign footprint read", |corpus| { + let footprint = &mut committable(corpus)["terminal"]["footprint"]; + let foreign_id = Value::String("ab".repeat(32)); + footprint["nodeReads"] + .as_array_mut() + .expect("node reads should be an array") + .push(foreign_id.clone()); + footprint["attachmentReads"] + .as_array_mut() + .expect("attachment reads should be an array") + .push(foreign_id); + }); +} + +#[test] +fn strict_corpus_preserves_fixed_width_and_empty_root_witnesses() { + validate_oracle_contract(ORACLE_BYTES).expect("committed edge cases should remain lawful"); + let corpus = corpus(); + let above_i32 = corpus["cases"] + .as_array() + .expect("cases should be an array") + .iter() + .find(|case| case["id"] == "coordinate-above-graphql-int") + .expect("fixed-width case should exist"); + assert_eq!( + above_i32["invocation"]["startByte"], + i64::from(i32::MAX) + 1 + ); + let deletion = corpus["cases"] + .as_array() + .expect("cases should be an array") + .iter() + .find(|case| case["id"] == "whole-buffer-delete") + .expect("whole-buffer deletion should exist"); + assert!(deletion["terminal"]["result"]["rootNodeId"].is_null()); + assert_eq!( + deletion["terminal"]["result"]["materializedTextUtf8Hex"], + "" + ); +} + +#[test] +fn strict_corpus_rejects_unknown_members_codes_and_invocation_lexemes() { + let mut unknown_member = corpus(); + unknown_member + .as_object_mut() + .expect("corpus should be an object") + .insert("ambientAuthority".to_owned(), Value::Bool(true)); + assert!(validate_oracle_contract(&bytes(&unknown_member)).is_err()); + + let mut unknown_code = corpus(); + let terminal = unknown_code["cases"] + .as_array_mut() + .expect("cases should be an array") + .iter_mut() + .find_map(|case| { + let terminal = case.get_mut("terminal")?; + (terminal["posture"] == "obstructed").then_some(terminal) + }) + .expect("an obstruction should exist"); + terminal["semanticCode"] = Value::String("invented-obstruction".to_owned()); + assert!(validate_oracle_contract(&bytes(&unknown_code)).is_err()); + + for (field, invalid) in [ + ("bufferId", "AA".repeat(32)), + ("bufferId", "aa".repeat(31)), + ("basisHeadId", "gg".repeat(32)), + ("replacementUtf8Hex", "0".to_owned()), + ("replacementUtf8Hex", "zz".to_owned()), + ("replacementUtf8Hex", "ff".to_owned()), + ] { + let mut corpus = corpus(); + corpus["cases"][0]["invocation"][field] = Value::String(invalid); + assert!( + validate_oracle_contract(&bytes(&corpus)).is_err(), + "{field} accepted a noncanonical lexeme" + ); + } +} diff --git a/native/jedit-echo-host/tests/replace_range_oracle.rs b/native/jedit-echo-host/tests/replace_range_oracle.rs new file mode 100644 index 00000000..e494c02e --- /dev/null +++ b/native/jedit-echo-host/tests/replace_range_oracle.rs @@ -0,0 +1,580 @@ +#[path = "support/replace_range_basis_witness.rs"] +mod basis_witness; +#[path = "support/replace_range_oracle.rs"] +mod oracle_support; +#[path = "support/resource_fixture.rs"] +mod resource_fixture; + +use std::path::PathBuf; + +use basis_witness::{ + assert_retained_basis, corrupt_foreign_canonical_head, corrupt_stale_ancestry, +}; +use oracle_support::{ + canonical_corpus_bytes, generate_corpus, BasisSetup, CaseSpec, ExpectedPosture, + SemanticObstructionCode, +}; +use resource_fixture::{checked_sha256, sha256_hex, update_resource_pair}; + +const UPDATE_ENV: &str = "JEDIT_UPDATE_REPLACE_RANGE_ORACLE"; +const EXPECTED_CORPUS_SHA256: &str = include_str!( + "../../../contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.sha256" +); + +#[test] +fn replace_range_oracle_matches_the_committed_corpus() { + let first = canonical_corpus_bytes(&generate_corpus(cases())); + let second = canonical_corpus_bytes(&generate_corpus(cases())); + assert_eq!(first, second, "fresh oracle generation must be byte-stable"); + + let path = corpus_path(); + if update_resource_pair(UPDATE_ENV, &path, &corpus_digest_path(), &first) { + return; + } + let committed = std::fs::read(&path).expect("committed oracle corpus should exist"); + assert_eq!( + first, committed, + "run with {UPDATE_ENV}=1 to update intentionally" + ); + assert_eq!( + sha256_hex(&committed), + checked_sha256(EXPECTED_CORPUS_SHA256), + "oracle resource digest must be updated deliberately" + ); +} + +#[test] +fn basis_obstructions_name_real_retained_heads() { + let corpus: serde_json::Value = serde_json::from_slice( + &std::fs::read(corpus_path()).expect("committed oracle corpus should exist"), + ) + .expect("committed oracle corpus should decode"); + let cases = corpus["cases"] + .as_array() + .expect("oracle cases should be an array"); + + assert_retained_basis(cases, "stale-basis", true); + assert_retained_basis(cases, "foreign-basis", false); +} + +#[test] +fn basis_witness_rejects_false_stale_and_foreign_relationships() { + let corpus: serde_json::Value = serde_json::from_slice( + &std::fs::read(corpus_path()).expect("committed oracle corpus should exist"), + ) + .expect("committed oracle corpus should decode"); + + let mut stale_cases = corpus["cases"] + .as_array() + .expect("oracle cases should be an array") + .clone(); + corrupt_stale_ancestry(&mut stale_cases); + assert!( + std::panic::catch_unwind(|| assert_retained_basis(&stale_cases, "stale-basis", true)) + .is_err(), + "stale witness accepted a current Head without stale ancestry" + ); + + let mut foreign_cases = corpus["cases"] + .as_array() + .expect("oracle cases should be an array") + .clone(); + corrupt_foreign_canonical_head(&mut foreign_cases); + assert!( + std::panic::catch_unwind(|| { + assert_retained_basis(&foreign_cases, "foreign-basis", false); + }) + .is_err(), + "foreign witness accepted a Buffer that did not name the invocation Head" + ); +} + +#[test] +fn source_set_binds_native_dependency_selection() { + let corpus: serde_json::Value = serde_json::from_slice( + &std::fs::read(corpus_path()).expect("committed oracle corpus should exist"), + ) + .expect("committed oracle corpus should decode"); + let paths = corpus["sourceSet"]["paths"] + .as_array() + .expect("source-set paths should be an array"); + for required in [ + "native/jedit-echo-host/Cargo.toml", + "native/jedit-echo-host/Cargo.lock", + "native/jedit-echo-host/src/rope/fact_read.rs", + ] { + assert!( + paths.iter().any(|path| path == required), + "source set must bind {required}" + ); + } +} + +fn corpus_path() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("../../contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.json") +} + +fn corpus_digest_path() -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("../../contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.sha256") +} + +fn cases() -> Vec { + vec![ + success("empty-unicode-insert", "", BasisSetup::Empty, 0, 0, "猫\n"), + success("middle-ascii-insert", "abcd", BasisSetup::Plain, 2, 2, "XY"), + success("whole-buffer-delete", "abc", BasisSetup::Plain, 0, 3, ""), + success( + "unicode-replacement", + "A😀é\nB", + BasisSetup::Plain, + 1, + 5, + "λ\n", + ), + success( + "cross-leaf-rebalance", + &format!( + "{}{}{}", + "a".repeat(4096), + "b".repeat(4096), + "c".repeat(4096) + ), + BasisSetup::Plain, + 4094, + 8194, + "β\nZ", + ), + success( + "replacement-larger-than-leaf", + "edges", + BasisSetup::Plain, + 0, + 5, + &format!("{}\n", "猫".repeat(1400)), + ), + obstruction( + "reversed-range", + "abc", + BasisSetup::Plain, + 2, + 1, + "x", + SemanticObstructionCode::RangeOrderInvalid, + "invalid-request", + "start must not exceed end", + ), + obstruction( + "out-of-bounds-range", + "abc", + BasisSetup::Plain, + 0, + 4, + "x", + SemanticObstructionCode::RangeOutOfBounds, + "invalid-request", + "exceeds", + ), + obstruction( + "start-inside-codepoint", + "A😀B", + BasisSetup::Plain, + 2, + 5, + "x", + SemanticObstructionCode::Utf8BoundaryInvalid, + "invalid-request", + "splits a UTF-8 code point", + ), + obstruction( + "end-inside-codepoint", + "A😀B", + BasisSetup::Plain, + 1, + 4, + "x", + SemanticObstructionCode::Utf8BoundaryInvalid, + "invalid-request", + "splits a UTF-8 code point", + ), + obstruction( + "empty-range-inside-codepoint", + "A😀B", + BasisSetup::Plain, + 2, + 2, + "", + SemanticObstructionCode::Utf8BoundaryInvalid, + "invalid-request", + "splits a UTF-8 code point", + ), + obstruction( + "empty-no-op", + "abc", + BasisSetup::Plain, + 1, + 1, + "", + SemanticObstructionCode::NoOp, + "invalid-request", + "no-op", + ), + obstruction( + "identical-no-op", + "abc", + BasisSetup::Plain, + 0, + 3, + "abc", + SemanticObstructionCode::NoOp, + "invalid-request", + "no-op", + ), + obstruction( + "stale-basis", + "abc", + BasisSetup::StaleHead, + 0, + 1, + "x", + SemanticObstructionCode::BasisNotCanonical, + "invalid-request", + "stale replace basis", + ), + obstruction( + "foreign-basis", + "abc", + BasisSetup::ForeignHead, + 0, + 1, + "x", + SemanticObstructionCode::BasisNotCanonical, + "invalid-request", + "stale replace basis", + ), + obstruction( + "head-sequence-overflow", + "abc", + BasisSetup::SequenceOverflow, + 0, + 1, + "x", + SemanticObstructionCode::ArithmeticOverflow, + "malformed-fact", + "head sequence overflow", + ), + obstruction( + "buffer-version-overflow", + "abc", + BasisSetup::VersionOverflow, + 0, + 1, + "x", + SemanticObstructionCode::ArithmeticOverflow, + "malformed-fact", + "buffer version overflow", + ), + obstruction( + "missing-buffer", + "", + BasisSetup::MissingBuffer, + 0, + 0, + "x", + SemanticObstructionCode::FactMissing, + "missing-fact", + "BufferWorldline", + ), + obstruction( + "malformed-buffer", + "abc", + BasisSetup::MalformedBuffer, + 0, + 1, + "x", + SemanticObstructionCode::FactMalformed, + "malformed-fact", + "decode", + ), + obstruction( + "bad-blob-content-hash", + "abc", + BasisSetup::BadBlobContentHash, + 0, + 1, + "x", + SemanticObstructionCode::ContentIdentityMismatch, + "malformed-fact", + "content hash does not match", + ), + obstruction( + "branch-extent-mismatch-at-zero", + &format!("{}b", "a".repeat(4096)), + BasisSetup::BranchExtentMismatch, + 0, + 0, + "x", + SemanticObstructionCode::FactMalformed, + "malformed-fact", + "branch byte length does not match children", + ), + obstruction( + "branch-extent-mismatch-at-exact-end", + &format!("{}b", "a".repeat(4096)), + BasisSetup::BranchExtentMismatch, + 4098, + 4098, + "x", + SemanticObstructionCode::FactMalformed, + "malformed-fact", + "branch byte length does not match children", + ), + obstruction( + "branch-extent-mismatch-at-internal-boundary", + &format!("{}b", "a".repeat(4096)), + BasisSetup::BranchExtentMismatch, + 4096, + 4096, + "x", + SemanticObstructionCode::FactMalformed, + "malformed-fact", + "branch byte length does not match children", + ), + obstruction( + "branch-truncated-no-op-mask", + &format!("{}b", "a".repeat(4096)), + BasisSetup::BranchExtentMismatch, + 0, + 4098, + &format!("{}b", "a".repeat(4096)), + SemanticObstructionCode::MalformedRope, + "invalid-request", + "did not materialize the declared byte length", + ), + obstruction( + "cyclic-right-endpoint", + "abc", + BasisSetup::CyclicRightEndpoint, + 3, + 3, + "x", + SemanticObstructionCode::FactMalformed, + "malformed-fact", + "rope node cycle", + ), + obstruction( + "empty-root-nonzero-length-no-op-mask", + "", + BasisSetup::EmptyRootWithNonzeroLength, + 0, + 1, + "", + SemanticObstructionCode::MalformedRope, + "invalid-request", + "basis head byte length does not match root", + ), + obstruction( + "empty-root-nonzero-length-zero-insert", + "", + BasisSetup::EmptyRootWithNonzeroLength, + 0, + 0, + "x", + SemanticObstructionCode::MalformedRope, + "invalid-request", + "basis head byte length does not match root", + ), + obstruction( + "leaf-ends-inside-codepoint-at-exact-end", + "é", + BasisSetup::LeafEndsInsideCodepointAtExactEnd, + 1, + 1, + "x", + SemanticObstructionCode::Utf8BoundaryInvalid, + "invalid-request", + "splits a UTF-8 code point", + ), + obstruction( + "leaf-exceeds-blob-at-zero", + "abc", + BasisSetup::LeafExceedsBlobAtExactEnd, + 0, + 0, + "x", + SemanticObstructionCode::FactMalformed, + "malformed-fact", + "exceeds blob bounds", + ), + obstruction( + "leaf-exceeds-blob-at-exact-end", + "abc", + BasisSetup::LeafExceedsBlobAtExactEnd, + 4, + 4, + "x", + SemanticObstructionCode::FactMalformed, + "malformed-fact", + "exceeds blob bounds", + ), + obstruction( + "leaf-exceeds-blob-at-internal-boundary", + &format!("{}b", "a".repeat(4096)), + BasisSetup::LeafExceedsBlobAtInternalBoundary, + 4096, + 4096, + "x", + SemanticObstructionCode::FactMalformed, + "malformed-fact", + "exceeds blob bounds", + ), + obstruction( + "coordinate-above-graphql-int", + "", + BasisSetup::AboveGraphqlIntRange, + i32::MAX as u64 + 1, + i32::MAX as u64 + 1, + "x", + SemanticObstructionCode::MalformedRope, + "invalid-request", + "basis head byte length does not match root", + ), + obstruction( + "leaf-range-start-overflow", + "ab", + BasisSetup::LeafRangeStartOverflow, + 1, + 2, + "x", + SemanticObstructionCode::ArithmeticOverflow, + "malformed-fact", + "leaf range start overflow", + ), + obstruction( + "leaf-range-end-overflow", + "a", + BasisSetup::LeafRangeEndOverflow, + 0, + 1, + "x", + SemanticObstructionCode::ArithmeticOverflow, + "malformed-fact", + "leaf range end overflow", + ), + obstruction( + "rope-node-end-overflow", + &format!("{}b", "a".repeat(4096)), + BasisSetup::RopeNodeEndOverflow, + 0, + 1, + "x", + SemanticObstructionCode::ArithmeticOverflow, + "malformed-fact", + "rope node end overflow", + ), + obstruction( + "leaf-extent-u64-max-at-zero", + "a", + BasisSetup::LeafExtentU64MaxAtZero, + 0, + 0, + "x", + SemanticObstructionCode::FactMalformed, + "malformed-fact", + "exceeds blob bounds", + ), + obstruction( + "rope-utf16-length-overflow", + "a", + BasisSetup::RopeUtf16LengthOverflow, + 0, + 0, + "x", + SemanticObstructionCode::ArithmeticOverflow, + "malformed-fact", + "rope UTF-16 length overflow", + ), + obstruction( + "rope-line-break-count-overflow", + "a", + BasisSetup::RopeLineBreakCountOverflow, + 0, + 0, + "\n", + SemanticObstructionCode::ArithmeticOverflow, + "malformed-fact", + "rope line break count overflow", + ), + obstruction( + "branch-height-u32-max-at-zero", + &format!("{}b", "a".repeat(4096)), + BasisSetup::BranchHeightU32MaxAtZero, + 0, + 0, + "x", + SemanticObstructionCode::FactMalformed, + "malformed-fact", + "branch height does not match children", + ), + obstruction( + "head-line-count-overflow", + "a", + BasisSetup::HeadLineCountOverflow, + 1, + 1, + "x", + SemanticObstructionCode::ArithmeticOverflow, + "malformed-fact", + "head line count overflow", + ), + ] +} + +fn success( + id: &'static str, + initial_text: &str, + setup: BasisSetup, + start_byte: u64, + end_byte: u64, + replacement: &str, +) -> CaseSpec { + CaseSpec { + id, + purpose: "finite persistent-rope ReplaceRange conformance witness", + initial_text: initial_text.to_owned(), + setup, + start_byte, + end_byte, + replacement: replacement.to_owned(), + expected: ExpectedPosture::Success, + } +} + +#[allow(clippy::too_many_arguments)] +fn obstruction( + id: &'static str, + initial_text: &str, + setup: BasisSetup, + start_byte: u64, + end_byte: u64, + replacement: &str, + semantic_code: SemanticObstructionCode, + error_class: &'static str, + message_fragment: &'static str, +) -> CaseSpec { + CaseSpec { + id, + purpose: "typed no-plan ReplaceRange obstruction witness", + initial_text: initial_text.to_owned(), + setup, + start_byte, + end_byte, + replacement: replacement.to_owned(), + expected: ExpectedPosture::Obstruction { + semantic_code, + error_class, + message_fragment, + }, + } +} diff --git a/native/jedit-echo-host/tests/replace_range_schema.rs b/native/jedit-echo-host/tests/replace_range_schema.rs new file mode 100644 index 00000000..9b0569a3 --- /dev/null +++ b/native/jedit-echo-host/tests/replace_range_schema.rs @@ -0,0 +1,311 @@ +use std::fmt::Debug; +use std::path::PathBuf; + +#[path = "support/resource_fixture.rs"] +mod resource_fixture; +#[path = "support/replace_range_schema.rs"] +mod schema_support; + +use jedit_echo_host::identity::hash_bytes; +use jedit_echo_host::records::{ + fact_bytes, fact_id, fact_type_id, BlobFact, BranchFact, BufferFact, ContentAddressedFact, + DiffFact, HeadFact, LeafFact, NodeIdBytes, RewriteFact, TypedFact, BLOB_CONTENT_HASH_DOMAIN, +}; +use jedit_echo_host::rope::buffer_node_id; +use serde::{de::DeserializeOwned, Deserialize, Serialize}; +use serde_json::Value; +use static_assertions::{assert_impl_all, assert_not_impl_any}; + +use resource_fixture::{checked_sha256, sha256_hex, update_resource_pair}; +use schema_support::{expected_schema, SCHEMA_COORDINATE, STRING_ESCAPE_VECTOR}; + +const SCHEMA_BYTES: &[u8] = include_bytes!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../contracts/jedit/lawpacks/replace-range-v1/text-schema-v1.json" +)); +const SCHEMA_SHA256: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../contracts/jedit/lawpacks/replace-range-v1/text-schema-v1.sha256" +)); +const CODEC_VECTOR_BYTES: &[u8] = include_bytes!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../contracts/jedit/lawpacks/replace-range-v1/codec-vectors-v1.json" +)); +const CODEC_VECTOR_SHA256: &str = include_str!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../contracts/jedit/lawpacks/replace-range-v1/codec-vectors-v1.sha256" +)); + +const UPDATE_ENV: &str = "JEDIT_UPDATE_REPLACE_RANGE_SCHEMA"; + +assert_not_impl_any!(BufferFact: ContentAddressedFact); +assert_impl_all!(BlobFact: ContentAddressedFact); +assert_impl_all!(LeafFact: ContentAddressedFact); +assert_impl_all!(BranchFact: ContentAddressedFact); +assert_impl_all!(HeadFact: ContentAddressedFact); +assert_impl_all!(RewriteFact: ContentAddressedFact); +assert_impl_all!(DiffFact: ContentAddressedFact); + +#[derive(Debug, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +struct CodecResource { + format_version: u32, + schema_coordinate: String, + vectors: Vec, +} + +#[derive(Debug, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +struct CodecVector { + fact: String, + type_label: String, + type_id_hex: String, + identity: IdentityVector, + value: Value, + canonical_bytes_hex: String, +} + +#[derive(Debug, Deserialize, Eq, PartialEq, Serialize)] +#[serde( + rename_all = "camelCase", + rename_all_fields = "camelCase", + tag = "kind", + deny_unknown_fields +)] +enum IdentityVector { + #[serde(rename = "keyed")] + Keyed { + buffer_key: String, + node_id_hex: String, + }, + #[serde(rename = "content-addressed")] + ContentAddressed { + domain_hex: String, + node_id_hex: String, + }, +} + +#[test] +fn published_schema_and_codec_vectors_regenerate_byte_for_byte() { + let schema_bytes = pretty_json_bytes(&expected_schema()); + let codec_bytes = pretty_json_bytes(&expected_codec_resource()); + let schema_updated = update_resource_pair( + UPDATE_ENV, + &lawpack_path("text-schema-v1.json"), + &lawpack_path("text-schema-v1.sha256"), + &schema_bytes, + ); + let codec_updated = update_resource_pair( + UPDATE_ENV, + &lawpack_path("codec-vectors-v1.json"), + &lawpack_path("codec-vectors-v1.sha256"), + &codec_bytes, + ); + assert_eq!(schema_updated, codec_updated); + if schema_updated { + return; + } + assert_eq!(SCHEMA_BYTES, schema_bytes); + assert_eq!(CODEC_VECTOR_BYTES, codec_bytes); + assert_eq!(sha256_hex(SCHEMA_BYTES), checked_sha256(SCHEMA_SHA256)); + assert_eq!( + sha256_hex(CODEC_VECTOR_BYTES), + checked_sha256(CODEC_VECTOR_SHA256) + ); +} + +#[test] +fn schema_declares_the_native_fact_and_attachment_law() { + let schema: Value = serde_json::from_slice(SCHEMA_BYTES).expect("schema JSON should decode"); + assert_eq!(schema, expected_schema()); +} + +#[test] +fn codec_vectors_match_native_bytes_types_and_identity_domains() { + let resource: CodecResource = + serde_json::from_slice(CODEC_VECTOR_BYTES).expect("codec vectors should decode"); + assert_eq!(resource, expected_codec_resource()); + assert_eq!(resource.schema_coordinate, SCHEMA_COORDINATE); + let [buffer, blob, leaf, branch, head, rewrite, diff] = resource.vectors.as_slice() else { + panic!("codec resource should contain exactly seven ordered fact vectors"); + }; + + check_keyed::(buffer, "Buffer"); + check_content::(blob, "Blob"); + check_content::(leaf, "Leaf"); + check_content::(branch, "Branch"); + check_content::(head, "Head"); + check_content::(rewrite, "Rewrite"); + check_content::(diff, "Diff"); +} + +fn expected_codec_resource() -> CodecResource { + let buffer_key = STRING_ESCAPE_VECTOR; + let buffer_id = buffer_node_id(buffer_key); + let blob_bytes = "A😀\n".as_bytes().to_vec(); + let blob = BlobFact { + content_hash: hash_bytes(BLOB_CONTENT_HASH_DOMAIN, &blob_bytes), + bytes: blob_bytes, + }; + let blob_id = fact_id(&blob).unwrap(); + let leaf = LeafFact { + blob_id: blob_id.into(), + byte_start: 0, + byte_length: 6, + utf16_length: 4, + line_breaks: 1, + }; + let leaf_id = fact_id(&leaf).unwrap(); + let branch = BranchFact { + left: leaf_id.into(), + right: NodeIdBytes([0x22; 32]), + byte_length: 12, + utf16_length: 8, + line_breaks: 2, + height: 2, + }; + let head = HeadFact { + buffer_id: buffer_id.into(), + basis_head_id: Some(NodeIdBytes([0x33; 32])), + root_node_id: Some(leaf_id.into()), + byte_length: 6, + utf16_length: 4, + line_count: 2, + root_digest: *leaf_id.as_bytes(), + sequence: i32::MAX as u64 + 1, + }; + let head_id = fact_id(&head).unwrap(); + let buffer = BufferFact { + buffer_key: buffer_key.to_owned(), + projection_path: None, + canonical_head_id: head_id.into(), + version: i32::MAX as u64 + 1, + }; + let rewrite = RewriteFact { + buffer_id: buffer_id.into(), + basis_head_id: NodeIdBytes([0x33; 32]), + next_head_id: head_id.into(), + start_byte: i32::MAX as u64 + 1, + end_byte: i32::MAX as u64 + 5, + inserted_byte_length: 6, + }; + let rewrite_id = fact_id(&rewrite).unwrap(); + let diff = DiffFact { + rewrite_id: rewrite_id.into(), + basis_head_id: NodeIdBytes([0x33; 32]), + next_head_id: head_id.into(), + start_byte: i32::MAX as u64 + 1, + end_byte: i32::MAX as u64 + 5, + inserted_byte_length: 6, + deleted_byte_length: u64::MAX, + }; + + CodecResource { + format_version: 1, + schema_coordinate: SCHEMA_COORDINATE.to_owned(), + vectors: vec![ + keyed_vector("Buffer", buffer_key, &buffer), + content_vector("Blob", &blob), + content_vector("Leaf", &leaf), + content_vector("Branch", &branch), + content_vector("Head", &head), + content_vector("Rewrite", &rewrite), + content_vector("Diff", &diff), + ], + } +} + +fn keyed_vector(fact_name: &str, buffer_key: &str, fact: &T) -> CodecVector { + CodecVector { + fact: fact_name.to_owned(), + type_label: T::TYPE_LABEL.to_owned(), + type_id_hex: hex::encode(fact_type_id::().as_bytes()), + identity: IdentityVector::Keyed { + buffer_key: buffer_key.to_owned(), + node_id_hex: hex::encode(buffer_node_id(buffer_key).as_bytes()), + }, + value: serde_json::to_value(fact).unwrap(), + canonical_bytes_hex: hex::encode(fact_bytes(fact).unwrap()), + } +} + +fn content_vector(fact_name: &str, fact: &T) -> CodecVector { + CodecVector { + fact: fact_name.to_owned(), + type_label: T::TYPE_LABEL.to_owned(), + type_id_hex: hex::encode(fact_type_id::().as_bytes()), + identity: IdentityVector::ContentAddressed { + domain_hex: hex::encode(T::ID_DOMAIN), + node_id_hex: hex::encode(fact_id(fact).unwrap().as_bytes()), + }, + value: serde_json::to_value(fact).unwrap(), + canonical_bytes_hex: hex::encode(fact_bytes(fact).unwrap()), + } +} + +fn check_keyed(vector: &CodecVector, expected_name: &str) +where + T: TypedFact + DeserializeOwned + Debug, +{ + check_codec::(vector, expected_name); + let IdentityVector::Keyed { + buffer_key, + node_id_hex, + } = &vector.identity + else { + panic!("{expected_name} should have keyed identity"); + }; + assert_eq!( + hex::encode(buffer_node_id(buffer_key).as_bytes()), + *node_id_hex + ); +} + +fn check_content(vector: &CodecVector, expected_name: &str) +where + T: ContentAddressedFact + DeserializeOwned + Debug, +{ + let fact = check_codec::(vector, expected_name); + let IdentityVector::ContentAddressed { + domain_hex, + node_id_hex, + } = &vector.identity + else { + panic!("{expected_name} should have content-addressed identity"); + }; + assert_eq!(hex::encode(T::ID_DOMAIN), *domain_hex); + assert_eq!( + hex::encode(fact_id(&fact).unwrap().as_bytes()), + *node_id_hex + ); +} + +fn check_codec(vector: &CodecVector, expected_name: &str) -> T +where + T: TypedFact + DeserializeOwned + Debug, +{ + assert_eq!(vector.fact, expected_name); + assert_eq!(vector.type_label, T::TYPE_LABEL); + assert_eq!( + vector.type_id_hex, + hex::encode(fact_type_id::().as_bytes()) + ); + let fact: T = serde_json::from_value(vector.value.clone()).unwrap(); + assert_eq!( + hex::encode(fact_bytes(&fact).unwrap()), + vector.canonical_bytes_hex + ); + fact +} + +fn pretty_json_bytes(value: &T) -> Vec { + let mut bytes = serde_json::to_vec_pretty(value).unwrap(); + bytes.push(b'\n'); + bytes +} + +fn lawpack_path(file_name: &str) -> PathBuf { + PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .join("../../contracts/jedit/lawpacks/replace-range-v1") + .join(file_name) +} diff --git a/native/jedit-echo-host/tests/replace_range_schema_conformance.rs b/native/jedit-echo-host/tests/replace_range_schema_conformance.rs new file mode 100644 index 00000000..59210fba --- /dev/null +++ b/native/jedit-echo-host/tests/replace_range_schema_conformance.rs @@ -0,0 +1,396 @@ +use std::fmt; + +#[path = "support/replace_range_contract.rs"] +mod contract; + +use jedit_echo_host::records::{ + fact_type_id, BlobFact, BranchFact, BufferFact, DiffFact, HeadFact, LeafFact, NodeIdBytes, + RewriteFact, TypedFact, +}; +use serde::de::{IgnoredAny, MapAccess, Visitor}; +use serde::{Deserialize, Deserializer, Serialize}; +use serde_json::Value; + +use contract::SemanticObstructionCode; + +const SCHEMA_BYTES: &[u8] = include_bytes!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../contracts/jedit/lawpacks/replace-range-v1/text-schema-v1.json" +)); +const CODEC_VECTOR_BYTES: &[u8] = include_bytes!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../contracts/jedit/lawpacks/replace-range-v1/codec-vectors-v1.json" +)); +const ORACLE_BYTES: &[u8] = include_bytes!(concat!( + env!("CARGO_MANIFEST_DIR"), + "/../../contracts/jedit/lawpacks/replace-range-v1/replace-range-v1.oracle.json" +)); + +#[derive(Deserialize)] +struct CorpusProjection { + cases: Vec, +} + +#[derive(Deserialize)] +struct CaseProjection { + id: String, + invocation: InvocationProjection, + #[serde(rename = "invocationBytesHex")] + invocation_bytes_hex: String, +} + +#[derive(Deserialize, Serialize)] +#[serde(rename_all = "camelCase")] +struct InvocationProjection { + buffer_id: String, + basis_head_id: String, + start_byte: u64, + end_byte: u64, + replacement_utf8_hex: String, +} + +#[derive(Debug, Eq, PartialEq)] +struct OrderedMemberNames(Vec); + +impl<'de> Deserialize<'de> for OrderedMemberNames { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + deserializer.deserialize_map(MemberNameVisitor) + } +} + +struct MemberNameVisitor; + +impl<'de> Visitor<'de> for MemberNameVisitor { + type Value = OrderedMemberNames; + + fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + formatter.write_str("a canonical fact object") + } + + fn visit_map(self, mut map: A) -> Result + where + A: MapAccess<'de>, + { + let mut names = Vec::new(); + while let Some(name) = map.next_key::()? { + names.push(name); + map.next_value::()?; + } + Ok(OrderedMemberNames(names)) + } +} + +#[test] +fn schema_field_order_matches_the_native_writer_for_every_fact() { + let schema: Value = serde_json::from_slice(SCHEMA_BYTES).expect("schema should decode"); + let vectors: Value = + serde_json::from_slice(CODEC_VECTOR_BYTES).expect("codec vectors should decode"); + let declarations = schema["facts"] + .as_array() + .expect("facts should be an array"); + let vectors = vectors["vectors"] + .as_array() + .expect("vectors should be an array"); + + for declaration in declarations { + let fact_name = declaration["name"] + .as_str() + .expect("fact should have a name"); + let declared_names = declaration["fields"] + .as_array() + .expect("fields should be an array") + .iter() + .map(|field| field["name"].as_str().expect("field should have a name")) + .collect::>(); + let vector = vectors + .iter() + .find(|vector| vector["fact"] == fact_name) + .expect("every declared fact should have a codec vector"); + let bytes = hex::decode( + vector["canonicalBytesHex"] + .as_str() + .expect("vector should contain canonical bytes"), + ) + .expect("canonical bytes should be hexadecimal"); + let actual = serde_json::from_slice::(&bytes) + .expect("canonical fact should decode as an object"); + assert_eq!(actual.0, declared_names, "{fact_name} member-order drift"); + } +} + +#[test] +fn schema_field_types_match_the_native_fact_types() { + let schema: Value = serde_json::from_slice(SCHEMA_BYTES).expect("schema should decode"); + + let _: for<'a> fn(&'a BufferFact) -> &'a String = |fact| &fact.buffer_key; + let _: for<'a> fn(&'a BufferFact) -> &'a Option = |fact| &fact.projection_path; + let _: fn(&BufferFact) -> NodeIdBytes = |fact| fact.canonical_head_id; + let _: fn(&BufferFact) -> u64 = |fact| fact.version; + assert_declared_types( + &schema, + "Buffer", + &[ + ("buffer_key", "utf8-string"), + ("projection_path", "optional-utf8-string"), + ("canonical_head_id", "node-id-32"), + ("version", "u64"), + ], + ); + + let _: fn(&BlobFact) -> [u8; 32] = |fact| fact.content_hash; + let _: for<'a> fn(&'a BlobFact) -> &'a Vec = |fact| &fact.bytes; + assert_declared_types( + &schema, + "Blob", + &[("content_hash", "digest-32"), ("bytes", "bytes")], + ); + + let _: fn(&LeafFact) -> NodeIdBytes = |fact| fact.blob_id; + let _: fn(&LeafFact) -> u64 = |fact| fact.byte_start; + let _: fn(&LeafFact) -> u64 = |fact| fact.byte_length; + let _: fn(&LeafFact) -> u64 = |fact| fact.utf16_length; + let _: fn(&LeafFact) -> u64 = |fact| fact.line_breaks; + assert_declared_types( + &schema, + "Leaf", + &[ + ("blob_id", "node-id-32"), + ("byte_start", "u64"), + ("byte_length", "u64"), + ("utf16_length", "u64"), + ("line_breaks", "u64"), + ], + ); + + let _: fn(&BranchFact) -> NodeIdBytes = |fact| fact.left; + let _: fn(&BranchFact) -> NodeIdBytes = |fact| fact.right; + let _: fn(&BranchFact) -> u64 = |fact| fact.byte_length; + let _: fn(&BranchFact) -> u64 = |fact| fact.utf16_length; + let _: fn(&BranchFact) -> u64 = |fact| fact.line_breaks; + let _: fn(&BranchFact) -> u32 = |fact| fact.height; + assert_declared_types( + &schema, + "Branch", + &[ + ("left", "node-id-32"), + ("right", "node-id-32"), + ("byte_length", "u64"), + ("utf16_length", "u64"), + ("line_breaks", "u64"), + ("height", "u32"), + ], + ); + + let _: fn(&HeadFact) -> NodeIdBytes = |fact| fact.buffer_id; + let _: fn(&HeadFact) -> Option = |fact| fact.basis_head_id; + let _: fn(&HeadFact) -> Option = |fact| fact.root_node_id; + let _: fn(&HeadFact) -> u64 = |fact| fact.byte_length; + let _: fn(&HeadFact) -> u64 = |fact| fact.utf16_length; + let _: fn(&HeadFact) -> u64 = |fact| fact.line_count; + let _: fn(&HeadFact) -> [u8; 32] = |fact| fact.root_digest; + let _: fn(&HeadFact) -> u64 = |fact| fact.sequence; + assert_declared_types( + &schema, + "Head", + &[ + ("buffer_id", "node-id-32"), + ("basis_head_id", "optional-node-id-32"), + ("root_node_id", "optional-node-id-32"), + ("byte_length", "u64"), + ("utf16_length", "u64"), + ("line_count", "u64"), + ("root_digest", "digest-32"), + ("sequence", "u64"), + ], + ); + + let _: fn(&RewriteFact) -> NodeIdBytes = |fact| fact.buffer_id; + let _: fn(&RewriteFact) -> NodeIdBytes = |fact| fact.basis_head_id; + let _: fn(&RewriteFact) -> NodeIdBytes = |fact| fact.next_head_id; + let _: fn(&RewriteFact) -> u64 = |fact| fact.start_byte; + let _: fn(&RewriteFact) -> u64 = |fact| fact.end_byte; + let _: fn(&RewriteFact) -> u64 = |fact| fact.inserted_byte_length; + assert_declared_types( + &schema, + "Rewrite", + &[ + ("buffer_id", "node-id-32"), + ("basis_head_id", "node-id-32"), + ("next_head_id", "node-id-32"), + ("start_byte", "u64"), + ("end_byte", "u64"), + ("inserted_byte_length", "u64"), + ], + ); + + let _: fn(&DiffFact) -> NodeIdBytes = |fact| fact.rewrite_id; + let _: fn(&DiffFact) -> NodeIdBytes = |fact| fact.basis_head_id; + let _: fn(&DiffFact) -> NodeIdBytes = |fact| fact.next_head_id; + let _: fn(&DiffFact) -> u64 = |fact| fact.start_byte; + let _: fn(&DiffFact) -> u64 = |fact| fact.end_byte; + let _: fn(&DiffFact) -> u64 = |fact| fact.inserted_byte_length; + let _: fn(&DiffFact) -> u64 = |fact| fact.deleted_byte_length; + assert_declared_types( + &schema, + "Diff", + &[ + ("rewrite_id", "node-id-32"), + ("basis_head_id", "node-id-32"), + ("next_head_id", "node-id-32"), + ("start_byte", "u64"), + ("end_byte", "u64"), + ("inserted_byte_length", "u64"), + ("deleted_byte_length", "u64"), + ], + ); +} + +fn assert_declared_types(schema: &Value, fact_name: &str, expected: &[(&str, &str)]) { + let declaration = schema["facts"] + .as_array() + .expect("facts should be an array") + .iter() + .find(|declaration| declaration["name"] == fact_name) + .expect("declared fact should exist"); + let actual = declaration["fields"] + .as_array() + .expect("fields should be an array") + .iter() + .map(|field| { + ( + field["name"].as_str().expect("field should have a name"), + field["type"].as_str().expect("field should have a type"), + ) + }) + .collect::>(); + assert_eq!(actual, expected, "{fact_name} field-type drift"); +} + +#[test] +fn string_escape_golden_vector_matches_the_native_writer() { + let schema: Value = serde_json::from_slice(SCHEMA_BYTES).expect("schema should decode"); + let vectors: Value = + serde_json::from_slice(CODEC_VECTOR_BYTES).expect("codec vectors should decode"); + let golden = &schema["factCodec"]["stringEscaping"]["goldenVector"]; + let source_bytes = hex::decode( + golden["sourceUtf8Hex"] + .as_str() + .expect("golden source should be hexadecimal"), + ) + .expect("golden source should decode"); + let source = std::str::from_utf8(&source_bytes).expect("golden source should be UTF-8"); + let expected_json = hex::decode( + golden["jsonStringUtf8Hex"] + .as_str() + .expect("golden JSON should be hexadecimal"), + ) + .expect("golden JSON should decode"); + let supplementary_scalar = '\u{10ffff}'; + let supplementary_utf8 = supplementary_scalar.to_string(); + assert!( + source.contains(supplementary_scalar), + "golden source must cover the maximum supplementary Unicode scalar" + ); + assert!( + expected_json + .windows(supplementary_utf8.len()) + .any(|window| window == supplementary_utf8.as_bytes()), + "U+10FFFF must remain literal UTF-8 in canonical JSON" + ); + assert_eq!(serde_json::to_vec(source).unwrap(), expected_json); + assert_eq!(vectors["vectors"][0]["value"]["buffer_key"], source); +} + +#[test] +fn schema_type_id_domain_matches_the_pinned_runtime() { + let schema: Value = serde_json::from_slice(SCHEMA_BYTES).expect("schema should decode"); + let domain = hex::decode( + schema["identityLaws"]["typeId"]["domainHex"] + .as_str() + .expect("type-ID domain should be hexadecimal"), + ) + .expect("type-ID domain should decode"); + + assert_type_id_domain::(&domain); + assert_type_id_domain::(&domain); + assert_type_id_domain::(&domain); + assert_type_id_domain::(&domain); + assert_type_id_domain::(&domain); + assert_type_id_domain::(&domain); + assert_type_id_domain::(&domain); +} + +fn assert_type_id_domain(domain: &[u8]) { + let mut digest = blake3::Hasher::new(); + digest.update(domain); + digest.update(T::TYPE_LABEL.as_bytes()); + assert_eq!( + digest.finalize().as_bytes(), + fact_type_id::().as_bytes(), + "{} type-ID domain drifted from pinned warp-core", + T::TYPE_LABEL + ); +} + +#[test] +fn oracle_invocation_bytes_follow_the_published_u64_codec() { + let schema: Value = serde_json::from_slice(SCHEMA_BYTES).expect("schema should decode"); + let schema_order = schema["oracleInvocation"]["objectMemberOrder"] + .as_array() + .expect("invocation member order should be an array") + .iter() + .map(|name| { + name.as_str() + .expect("member name should be a string") + .to_owned() + }) + .collect::>(); + let corpus: CorpusProjection = + serde_json::from_slice(ORACLE_BYTES).expect("oracle corpus should decode"); + for case in &corpus.cases { + let bytes = hex::decode(&case.invocation_bytes_hex) + .expect("invocation bytes should be hexadecimal"); + let actual_order = serde_json::from_slice::(&bytes) + .expect("invocation bytes should decode as an object"); + assert_eq!( + actual_order.0, schema_order, + "{} member-order drift", + case.id + ); + assert_eq!( + hex::encode(serde_json::to_vec(&case.invocation).unwrap()), + case.invocation_bytes_hex, + "{} invocation bytes drifted", + case.id + ); + } + let above_i32 = corpus + .cases + .iter() + .find(|case| case.id == "coordinate-above-graphql-int") + .expect("fixed-width witness should exist"); + assert_eq!(above_i32.invocation.start_byte, i32::MAX as u64 + 1); + assert_eq!(above_i32.invocation.end_byte, i32::MAX as u64 + 1); +} + +#[test] +fn schema_declares_the_exhaustive_oracle_obstruction_domain() { + let schema: Value = serde_json::from_slice(SCHEMA_BYTES).expect("schema should decode"); + let expected = SemanticObstructionCode::ALL.map(SemanticObstructionCode::as_str); + assert_eq!( + schema["oracleCorpus"]["terminal"]["semanticCodes"], + serde_json::json!(expected) + ); +} + +#[test] +fn schema_qualifies_local_oracle_identifiers_by_the_top_level_warp() { + let schema: Value = serde_json::from_slice(SCHEMA_BYTES).expect("schema should decode"); + assert_eq!( + schema["oracleCorpus"]["localIdentifierQualification"], + "every footprint and patch identifier is qualified by top-level warpId" + ); +} diff --git a/native/jedit-echo-host/tests/support/replace_range_basis.rs b/native/jedit-echo-host/tests/support/replace_range_basis.rs new file mode 100644 index 00000000..ed9f2fa4 --- /dev/null +++ b/native/jedit-echo-host/tests/support/replace_range_basis.rs @@ -0,0 +1,482 @@ +use jedit_echo_host::identity::content_node_id; +use jedit_echo_host::records::{ + decode_fact, fact_bytes, fact_id, fact_type_id, BlobFact, BranchFact, BufferFact, + ContentAddressedFact, HeadFact, LeafFact, NodeIdBytes, TypedFact, +}; +use jedit_echo_host::rope::{plan_create, plan_replace}; +use warp_core::{AttachmentValue, GraphStore, NodeId, NodeRecord, TickDelta, WarpOp}; + +#[derive(Clone, Copy)] +pub enum BasisSetup { + Plain, + Empty, + SequenceOverflow, + VersionOverflow, + MissingBuffer, + MalformedBuffer, + BadBlobContentHash, + BranchExtentMismatch, + CyclicRightEndpoint, + EmptyRootWithNonzeroLength, + LeafEndsInsideCodepointAtExactEnd, + LeafExceedsBlobAtExactEnd, + LeafExceedsBlobAtInternalBoundary, + LeafRangeStartOverflow, + LeafRangeEndOverflow, + RopeNodeEndOverflow, + LeafExtentU64MaxAtZero, + RopeUtf16LengthOverflow, + RopeLineBreakCountOverflow, + BranchHeightU32MaxAtZero, + HeadLineCountOverflow, + AboveGraphqlIntRange, + StaleHead, + ForeignHead, +} + +pub fn make_basis( + warp_id: warp_core::WarpId, + id: &str, + initial_text: &str, + setup: BasisSetup, +) -> (GraphStore, NodeId, NodeId, Option) { + if matches!(setup, BasisSetup::MissingBuffer) { + return ( + GraphStore::new(warp_id), + NodeId([0x11; 32]), + NodeId([0x22; 32]), + None, + ); + } + let basis_text = if matches!(setup, BasisSetup::Empty) { + "" + } else { + initial_text + }; + let mut store = GraphStore::new(warp_id); + let create = plan_create(&store, id, basis_text, None).expect("oracle basis should be created"); + let mut delta = TickDelta::new(); + create.emit(&mut delta); + apply_ops(&mut store, &delta.finalize()); + let mut head_id = create.head_id; + let mut invocation_basis_id = None; + match setup { + BasisSetup::Plain | BasisSetup::Empty => {} + BasisSetup::SequenceOverflow => { + head_id = replace_head(&mut store, create.buffer_id, head_id, |head| { + head.sequence = u64::MAX; + }); + } + BasisSetup::VersionOverflow => { + replace_buffer(&mut store, create.buffer_id, |buffer| { + buffer.version = u64::MAX; + }); + } + BasisSetup::MalformedBuffer => { + store.set_node_attachment( + create.buffer_id, + Some(AttachmentValue::Atom(warp_core::AtomPayload::new( + fact_type_id::(), + bytes::Bytes::from_static(b"{"), + ))), + ); + } + BasisSetup::BadBlobContentHash => corrupt_blob_hash(&mut store, head_id), + BasisSetup::BranchExtentMismatch => { + let root_id = root_node_id(&store, head_id); + let mut branch: BranchFact = decode_fact( + store + .node_attachment(&root_id) + .expect("branch attachment should exist"), + ) + .expect("root should decode as a branch"); + branch.byte_length += 1; + let next_root_id = insert_content_fact(&mut store, &branch); + head_id = replace_head(&mut store, create.buffer_id, head_id, |head| { + head.root_node_id = Some(next_root_id.into()); + head.root_digest = *next_root_id.as_bytes(); + head.byte_length += 1; + }); + } + BasisSetup::CyclicRightEndpoint => { + let root_id = root_node_id(&store, head_id); + let cyclic_id = NodeId([0xCC; 32]); + store.insert_node( + cyclic_id, + NodeRecord { + ty: fact_type_id::(), + }, + ); + set_fact_attachment( + &mut store, + cyclic_id, + &BranchFact { + left: root_id.into(), + right: cyclic_id.into(), + byte_length: 3, + utf16_length: 3, + line_breaks: 0, + height: 2, + }, + ); + head_id = replace_head_root(&mut store, create.buffer_id, head_id, cyclic_id); + } + BasisSetup::EmptyRootWithNonzeroLength => { + head_id = replace_head(&mut store, create.buffer_id, head_id, |head| { + head.byte_length = 1; + }); + } + BasisSetup::LeafEndsInsideCodepointAtExactEnd => { + let root_id = root_node_id(&store, head_id); + let next_root_id = replace_leaf(&mut store, root_id, |leaf| { + leaf.byte_length = 1; + }); + head_id = replace_head(&mut store, create.buffer_id, head_id, |head| { + head.root_node_id = Some(next_root_id.into()); + head.root_digest = *next_root_id.as_bytes(); + head.byte_length = 1; + }); + } + BasisSetup::LeafExceedsBlobAtExactEnd => { + let root_id = root_node_id(&store, head_id); + let next_root_id = replace_leaf(&mut store, root_id, |leaf| { + leaf.byte_length = 4; + }); + head_id = replace_head(&mut store, create.buffer_id, head_id, |head| { + head.root_node_id = Some(next_root_id.into()); + head.root_digest = *next_root_id.as_bytes(); + head.byte_length = 4; + }); + } + BasisSetup::LeafExceedsBlobAtInternalBoundary => { + head_id = replace_root_left_leaf(&mut store, create.buffer_id, head_id, |leaf| { + leaf.byte_start = 1; + }); + } + BasisSetup::LeafRangeStartOverflow => { + head_id = replace_root_leaf(&mut store, create.buffer_id, head_id, |leaf| { + leaf.byte_start = u64::MAX; + leaf.byte_length = 2; + }); + } + BasisSetup::LeafRangeEndOverflow => { + head_id = replace_root_leaf(&mut store, create.buffer_id, head_id, |leaf| { + leaf.byte_start = u64::MAX; + leaf.byte_length = 1; + }); + } + BasisSetup::RopeNodeEndOverflow => { + head_id = replace_root_left_leaf(&mut store, create.buffer_id, head_id, |leaf| { + leaf.byte_length = u64::MAX; + }); + } + BasisSetup::LeafExtentU64MaxAtZero => { + let root_id = root_node_id(&store, head_id); + let next_root_id = replace_leaf(&mut store, root_id, |leaf| { + leaf.byte_length = u64::MAX; + }); + head_id = replace_head(&mut store, create.buffer_id, head_id, |head| { + head.root_node_id = Some(next_root_id.into()); + head.root_digest = *next_root_id.as_bytes(); + head.byte_length = u64::MAX; + }); + } + BasisSetup::RopeUtf16LengthOverflow => { + head_id = replace_root_leaf(&mut store, create.buffer_id, head_id, |leaf| { + leaf.utf16_length = u64::MAX; + }); + } + BasisSetup::RopeLineBreakCountOverflow | BasisSetup::HeadLineCountOverflow => { + head_id = replace_root_leaf(&mut store, create.buffer_id, head_id, |leaf| { + leaf.line_breaks = u64::MAX; + }); + } + BasisSetup::BranchHeightU32MaxAtZero => { + head_id = replace_root_branch(&mut store, create.buffer_id, head_id, |branch| { + branch.height = u32::MAX; + }); + } + BasisSetup::AboveGraphqlIntRange => { + head_id = replace_head(&mut store, create.buffer_id, head_id, |head| { + head.byte_length = i32::MAX as u64 + 1; + }); + } + BasisSetup::StaleHead => { + invocation_basis_id = Some(head_id); + let replacement = plan_replace(&store, create.buffer_id, head_id, 0, 0, "fresh-") + .expect("stale-basis setup should advance the canonical head"); + let mut delta = TickDelta::new(); + replacement.emit(&mut delta); + apply_ops(&mut store, &delta.finalize()); + head_id = replacement.head_id; + } + BasisSetup::ForeignHead => { + let foreign = plan_create(&store, &format!("{id}-foreign"), "foreign", None) + .expect("foreign-basis setup should create another buffer"); + let mut delta = TickDelta::new(); + foreign.emit(&mut delta); + apply_ops(&mut store, &delta.finalize()); + invocation_basis_id = Some(foreign.head_id); + } + BasisSetup::MissingBuffer => unreachable!(), + } + (store, create.buffer_id, head_id, invocation_basis_id) +} + +pub fn apply_ops(store: &mut GraphStore, ops: &[WarpOp]) { + for op in ops { + match op { + WarpOp::UpsertNode { node, record } => { + assert_eq!(node.warp_id, store.warp_id()); + store.insert_node(node.local_id, record.clone()); + } + WarpOp::SetAttachment { key, value } => { + let warp_core::AttachmentOwner::Node(node) = key.owner else { + panic!("oracle patch must not contain edge attachments") + }; + assert_eq!( + node.warp_id, + store.warp_id(), + "oracle patch WARP must match its local store" + ); + store.set_node_attachment(node.local_id, value.clone()); + } + _ => panic!("oracle patch contains an unsupported graph operation"), + } + } +} + +fn replace_head( + store: &mut GraphStore, + buffer_id: NodeId, + head_id: NodeId, + mutate: impl FnOnce(&mut HeadFact), +) -> NodeId { + let mut head: HeadFact = decode_fact( + store + .node_attachment(&head_id) + .expect("head attachment should exist"), + ) + .expect("head should decode"); + mutate(&mut head); + let next_head_id = fact_id(&head).expect("mutated head should identify"); + store.insert_node( + next_head_id, + NodeRecord { + ty: fact_type_id::(), + }, + ); + store.set_node_attachment( + next_head_id, + Some(AttachmentValue::Atom(warp_core::AtomPayload::new( + fact_type_id::(), + fact_bytes(&head).expect("head should encode").into(), + ))), + ); + replace_buffer(store, buffer_id, |buffer| { + buffer.canonical_head_id = NodeIdBytes::from(next_head_id); + }); + next_head_id +} + +fn replace_buffer(store: &mut GraphStore, buffer_id: NodeId, mutate: impl FnOnce(&mut BufferFact)) { + let mut buffer: BufferFact = decode_fact( + store + .node_attachment(&buffer_id) + .expect("buffer attachment should exist"), + ) + .expect("buffer should decode"); + mutate(&mut buffer); + store.set_node_attachment( + buffer_id, + Some(AttachmentValue::Atom(warp_core::AtomPayload::new( + fact_type_id::(), + fact_bytes(&buffer).expect("buffer should encode").into(), + ))), + ); +} + +fn corrupt_blob_hash(store: &mut GraphStore, head_id: NodeId) { + let head: HeadFact = decode_fact( + store + .node_attachment(&head_id) + .expect("head attachment should exist"), + ) + .expect("head should decode"); + let root_id = NodeId::from(head.root_node_id.expect("fixture should have a leaf root")); + let leaf: LeafFact = decode_fact( + store + .node_attachment(&root_id) + .expect("leaf attachment should exist"), + ) + .expect("leaf should decode"); + let blob_id = NodeId::from(leaf.blob_id); + let mut blob: BlobFact = decode_fact( + store + .node_attachment(&blob_id) + .expect("blob attachment should exist"), + ) + .expect("blob should decode"); + blob.content_hash = [0; 32]; + store.set_node_attachment( + blob_id, + Some(AttachmentValue::Atom(warp_core::AtomPayload::new( + fact_type_id::(), + fact_bytes(&blob).expect("blob should encode").into(), + ))), + ); +} + +fn replace_root_leaf( + store: &mut GraphStore, + buffer_id: NodeId, + head_id: NodeId, + mutate: impl FnOnce(&mut LeafFact), +) -> NodeId { + let root_id = root_node_id(store, head_id); + let next_root_id = replace_leaf(store, root_id, mutate); + replace_head_root(store, buffer_id, head_id, next_root_id) +} + +fn replace_root_left_leaf( + store: &mut GraphStore, + buffer_id: NodeId, + head_id: NodeId, + mutate: impl FnOnce(&mut LeafFact), +) -> NodeId { + let root_id = root_node_id(store, head_id); + let mut branch: BranchFact = decode_fact( + store + .node_attachment(&root_id) + .expect("branch attachment should exist"), + ) + .expect("root should decode as a branch"); + let next_left_id = replace_leaf(store, NodeId::from(branch.left), mutate); + branch.left = next_left_id.into(); + let next_root_id = insert_content_fact(store, &branch); + replace_head_root(store, buffer_id, head_id, next_root_id) +} + +fn replace_root_branch( + store: &mut GraphStore, + buffer_id: NodeId, + head_id: NodeId, + mutate: impl FnOnce(&mut BranchFact), +) -> NodeId { + let root_id = root_node_id(store, head_id); + let mut branch: BranchFact = decode_fact( + store + .node_attachment(&root_id) + .expect("branch attachment should exist"), + ) + .expect("root should decode as a branch"); + mutate(&mut branch); + let next_root_id = insert_content_fact(store, &branch); + replace_head_root(store, buffer_id, head_id, next_root_id) +} + +fn root_node_id(store: &GraphStore, head_id: NodeId) -> NodeId { + let head: HeadFact = decode_fact( + store + .node_attachment(&head_id) + .expect("head attachment should exist"), + ) + .expect("head should decode"); + NodeId::from(head.root_node_id.expect("fixture should have a rope root")) +} + +fn replace_leaf( + store: &mut GraphStore, + leaf_id: NodeId, + mutate: impl FnOnce(&mut LeafFact), +) -> NodeId { + let mut leaf: LeafFact = decode_fact( + store + .node_attachment(&leaf_id) + .expect("leaf attachment should exist"), + ) + .expect("leaf should decode"); + mutate(&mut leaf); + insert_content_fact(store, &leaf) +} + +fn replace_head_root( + store: &mut GraphStore, + buffer_id: NodeId, + head_id: NodeId, + root_id: NodeId, +) -> NodeId { + replace_head(store, buffer_id, head_id, |head| { + head.root_node_id = Some(root_id.into()); + head.root_digest = *root_id.as_bytes(); + }) +} + +fn insert_content_fact(store: &mut GraphStore, fact: &T) -> NodeId { + let node_id = fact_id(fact).expect("fixture fact should identify"); + store.insert_node( + node_id, + NodeRecord { + ty: fact_type_id::(), + }, + ); + set_fact_attachment(store, node_id, fact); + node_id +} + +pub(super) fn insert_raw_content_fact( + store: &mut GraphStore, + bytes: Vec, +) -> NodeId { + let node_id = content_node_id(T::ID_DOMAIN, &bytes); + store.insert_node( + node_id, + NodeRecord { + ty: fact_type_id::(), + }, + ); + set_raw_fact_attachment::(store, node_id, bytes); + node_id +} + +pub(super) fn set_fact_attachment(store: &mut GraphStore, node_id: NodeId, fact: &T) { + set_raw_fact_attachment::( + store, + node_id, + fact_bytes(fact).expect("fixture fact should encode"), + ); +} + +pub(super) fn set_raw_fact_attachment( + store: &mut GraphStore, + node_id: NodeId, + bytes: Vec, +) { + store.set_node_attachment( + node_id, + Some(AttachmentValue::Atom(warp_core::AtomPayload::new( + fact_type_id::(), + bytes.into(), + ))), + ); +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + #[should_panic(expected = "oracle patch WARP must match its local store")] + fn local_patch_applier_rejects_a_foreign_warp_attachment() { + let mut store = GraphStore::new(warp_core::make_warp_id("oracle-local")); + let operation = WarpOp::SetAttachment { + key: warp_core::AttachmentKey::node_alpha(warp_core::NodeKey { + warp_id: warp_core::make_warp_id("oracle-foreign"), + local_id: NodeId([0xA5; 32]), + }), + value: None, + }; + + apply_ops(&mut store, &[operation]); + } +} diff --git a/native/jedit-echo-host/tests/support/replace_range_basis_witness.rs b/native/jedit-echo-host/tests/support/replace_range_basis_witness.rs new file mode 100644 index 00000000..04992a71 --- /dev/null +++ b/native/jedit-echo-host/tests/support/replace_range_basis_witness.rs @@ -0,0 +1,156 @@ +use jedit_echo_host::records::{fact_type_id, BufferFact, HeadFact}; + +pub fn assert_retained_basis(cases: &[serde_json::Value], case_id: &str, same_buffer: bool) { + let case = cases + .iter() + .find(|case| case["id"] == case_id) + .unwrap_or_else(|| panic!("{case_id} should exist")); + let invocation_buffer_id = case["invocation"]["bufferId"] + .as_str() + .expect("invocation buffer should be a string"); + let invocation_basis_id = case["invocation"]["basisHeadId"] + .as_str() + .expect("invocation basis should be a string"); + let facts = case["basisFacts"] + .as_array() + .expect("basis facts should be an array"); + let head_type_id = hex::encode(fact_type_id::().as_bytes()); + let retained_head = projected_fact( + facts, + invocation_basis_id, + &head_type_id, + "invocation basis Head", + ); + let head: HeadFact = decode_projected_fact(retained_head); + let head_buffer_id = hex::encode(head.buffer_id.0); + assert_eq!( + head_buffer_id == invocation_buffer_id, + same_buffer, + "{case_id} buffer relationship drifted" + ); + + let buffer_type_id = hex::encode(fact_type_id::().as_bytes()); + let retained_buffer = projected_fact( + facts, + invocation_buffer_id, + &buffer_type_id, + "target Buffer", + ); + let buffer: BufferFact = decode_projected_fact(retained_buffer); + let canonical_head_id = hex::encode(buffer.canonical_head_id.0); + assert_ne!( + invocation_basis_id, canonical_head_id, + "{case_id} must not use the current canonical head" + ); + + if same_buffer { + let current_head = projected_fact( + facts, + &canonical_head_id, + &head_type_id, + "current canonical Head", + ); + let current_head: HeadFact = decode_projected_fact(current_head); + assert_eq!( + hex::encode(current_head.buffer_id.0), + invocation_buffer_id, + "stale current Head must belong to the target Buffer" + ); + assert_eq!( + current_head.basis_head_id.map(|id| hex::encode(id.0)), + Some(invocation_basis_id.to_owned()), + "stale current Head must directly descend from the invocation basis" + ); + } else { + let foreign_buffer = + projected_fact(facts, &head_buffer_id, &buffer_type_id, "foreign Buffer"); + let foreign_buffer: BufferFact = decode_projected_fact(foreign_buffer); + assert_eq!( + hex::encode(foreign_buffer.canonical_head_id.0), + invocation_basis_id, + "foreign Buffer must canonically name the invocation basis Head" + ); + } +} + +pub fn corrupt_stale_ancestry(cases: &mut [serde_json::Value]) { + let case = cases + .iter_mut() + .find(|case| case["id"] == "stale-basis") + .expect("stale case should exist"); + let target_buffer_id = case["invocation"]["bufferId"] + .as_str() + .expect("target Buffer ID should be a string") + .to_owned(); + let facts = case["basisFacts"] + .as_array_mut() + .expect("basis facts should be an array"); + let buffer: BufferFact = decode_projected_fact( + facts + .iter() + .find(|fact| fact["nodeId"] == target_buffer_id) + .expect("target Buffer should be retained"), + ); + let current_head_id = hex::encode(buffer.canonical_head_id.0); + let current_head = facts + .iter_mut() + .find(|fact| fact["nodeId"] == current_head_id) + .expect("current Head should be retained"); + let mut head: HeadFact = decode_projected_fact(current_head); + head.basis_head_id = None; + current_head["attachmentBytesHex"] = + serde_json::Value::String(hex::encode(serde_json::to_vec(&head).unwrap())); +} + +pub fn corrupt_foreign_canonical_head(cases: &mut [serde_json::Value]) { + let case = cases + .iter_mut() + .find(|case| case["id"] == "foreign-basis") + .expect("foreign case should exist"); + let invocation_basis_id = case["invocation"]["basisHeadId"] + .as_str() + .expect("foreign Head ID should be a string") + .to_owned(); + let facts = case["basisFacts"] + .as_array_mut() + .expect("basis facts should be an array"); + let foreign_head: HeadFact = decode_projected_fact( + facts + .iter() + .find(|fact| fact["nodeId"] == invocation_basis_id) + .expect("foreign Head should be retained"), + ); + let foreign_buffer_id = hex::encode(foreign_head.buffer_id.0); + let foreign_buffer = facts + .iter_mut() + .find(|fact| fact["nodeId"] == foreign_buffer_id) + .expect("foreign Buffer should be retained"); + let mut buffer: BufferFact = decode_projected_fact(foreign_buffer); + buffer.canonical_head_id.0 = [0xA5; 32]; + foreign_buffer["attachmentBytesHex"] = + serde_json::Value::String(hex::encode(serde_json::to_vec(&buffer).unwrap())); +} + +fn projected_fact<'a>( + facts: &'a [serde_json::Value], + node_id: &str, + type_id: &str, + label: &str, +) -> &'a serde_json::Value { + facts + .iter() + .find(|fact| fact["nodeId"] == node_id && fact["typeId"] == type_id) + .unwrap_or_else(|| panic!("{label} should be retained")) +} + +fn decode_projected_fact(fact: &serde_json::Value) -> T { + serde_json::from_slice( + &hex::decode( + fact["attachmentBytesHex"] + .as_str() + .expect("fact bytes should be hexadecimal"), + ) + .expect("fact bytes should decode"), + ) + .expect("projected fact should decode") +} diff --git a/native/jedit-echo-host/tests/support/replace_range_consequence.rs b/native/jedit-echo-host/tests/support/replace_range_consequence.rs new file mode 100644 index 00000000..1fbaeb3f --- /dev/null +++ b/native/jedit-echo-host/tests/support/replace_range_consequence.rs @@ -0,0 +1,346 @@ +use std::collections::BTreeSet; + +use jedit_echo_host::error::HostError; +use jedit_echo_host::identity::{content_node_id, hash_bytes}; +use jedit_echo_host::records::{ + decode_fact, fact_bytes, fact_id, fact_type_id, BufferFact, ContentAddressedFact, DiffFact, + HeadFact, RewriteFact, EMPTY_ROOT_DIGEST_DOMAIN, +}; +use jedit_echo_host::rope::{buffer_node_id, read_window, MutationPlan}; +use warp_core::{AttachmentValue, GraphStore, NodeId, TypeId, WarpId, WarpOp}; + +#[derive(Debug)] +pub(super) struct ValidatedConsequence { + pub(super) buffer: BufferFact, + pub(super) head: HeadFact, + pub(super) rewrite_id: NodeId, + pub(super) diff_id: NodeId, + pub(super) materialized_text: String, +} + +#[derive(Clone, Copy)] +pub(super) struct ReplaceExpectation<'a> { + pub(super) basis_head_id: NodeId, + pub(super) start_byte: u64, + pub(super) end_byte: u64, + pub(super) replacement: &'a str, +} + +pub(super) fn validate_consequence( + basis: &GraphStore, + next: &GraphStore, + plan: &MutationPlan, + patch: &[WarpOp], + expectation: ReplaceExpectation<'_>, +) -> Result { + let ReplaceExpectation { + basis_head_id, + start_byte, + end_byte, + replacement, + } = expectation; + let (basis_buffer, basis_head) = validate_basis(basis, plan.buffer_id, basis_head_id)?; + let buffer: BufferFact = read_fact(next, plan.buffer_id)?; + require_equal( + "result Buffer keyed identity", + buffer_node_id(&buffer.buffer_key), + plan.buffer_id, + )?; + require_equal( + "result Buffer canonical head", + NodeId::from(buffer.canonical_head_id), + plan.head_id, + )?; + require_equal( + "result Buffer key", + &buffer.buffer_key, + &basis_buffer.buffer_key, + )?; + require_equal( + "result Buffer projection path", + &buffer.projection_path, + &basis_buffer.projection_path, + )?; + let expected_version = basis_buffer + .version + .checked_add(1) + .ok_or_else(|| "basis Buffer version overflowed during validation".to_owned())?; + require_equal("result Buffer version", buffer.version, expected_version)?; + require_equal("plan Buffer version", plan.version, buffer.version)?; + + let head: HeadFact = read_fact(next, plan.head_id)?; + require_equal( + "result Head identity", + fact_id(&head).map_err(host_error)?, + plan.head_id, + )?; + require_equal( + "result Head buffer", + NodeId::from(head.buffer_id), + plan.buffer_id, + )?; + require_equal( + "result Head basis", + head.basis_head_id.map(NodeId::from), + Some(basis_head_id), + )?; + require_equal( + "result Head byte length", + head.byte_length, + plan.byte_length, + )?; + require_equal("result Head line count", head.line_count, plan.line_count)?; + let expected_sequence = basis_head + .sequence + .checked_add(1) + .ok_or_else(|| "basis Head sequence overflowed during validation".to_owned())?; + require_equal("result Head sequence", head.sequence, expected_sequence)?; + let expected_root_digest = head + .root_node_id + .map_or_else(|| hash_bytes(EMPTY_ROOT_DIGEST_DOMAIN, &[]), |id| id.0); + require_equal( + "result Head root digest", + head.root_digest, + expected_root_digest, + )?; + + let inserted_byte_length = u64::try_from(replacement.len()) + .map_err(|_| "replacement length exceeds u64".to_owned())?; + let deleted_byte_length = end_byte + .checked_sub(start_byte) + .ok_or_else(|| "validated range is reversed".to_owned())?; + let rewrite_id = patch_node_with_type(patch, basis.warp_id(), fact_type_id::())?; + let rewrite: RewriteFact = read_fact(next, rewrite_id)?; + require_equal( + "Rewrite identity", + fact_id(&rewrite).map_err(host_error)?, + rewrite_id, + )?; + require_equal( + "Rewrite buffer", + NodeId::from(rewrite.buffer_id), + plan.buffer_id, + )?; + require_equal( + "Rewrite basis", + NodeId::from(rewrite.basis_head_id), + basis_head_id, + )?; + require_equal( + "Rewrite next head", + NodeId::from(rewrite.next_head_id), + plan.head_id, + )?; + require_equal("Rewrite start", rewrite.start_byte, start_byte)?; + require_equal("Rewrite end", rewrite.end_byte, end_byte)?; + require_equal( + "Rewrite inserted length", + rewrite.inserted_byte_length, + inserted_byte_length, + )?; + + let diff_id = patch_node_with_type(patch, basis.warp_id(), fact_type_id::())?; + let diff: DiffFact = read_fact(next, diff_id)?; + require_equal( + "Diff identity", + fact_id(&diff).map_err(host_error)?, + diff_id, + )?; + require_equal("Diff rewrite", NodeId::from(diff.rewrite_id), rewrite_id)?; + require_equal( + "Diff basis", + NodeId::from(diff.basis_head_id), + basis_head_id, + )?; + require_equal( + "Diff next head", + NodeId::from(diff.next_head_id), + plan.head_id, + )?; + require_equal("Diff start", diff.start_byte, start_byte)?; + require_equal("Diff end", diff.end_byte, end_byte)?; + require_equal( + "Diff inserted length", + diff.inserted_byte_length, + inserted_byte_length, + )?; + require_equal( + "Diff deleted length", + diff.deleted_byte_length, + deleted_byte_length, + )?; + + let window = read_window( + next, + plan.buffer_id, + plan.head_id, + 0, + head.byte_length, + head.byte_length, + ) + .map_err(host_error)?; + let materialized_text = window.text; + require_equal( + "result Head UTF-16 length", + head.utf16_length, + materialized_text.encode_utf16().count() as u64, + )?; + require_equal( + "result Head materialized line count", + head.line_count, + materialized_text + .bytes() + .filter(|byte| *byte == b'\n') + .count() as u64 + + 1, + )?; + + Ok(ValidatedConsequence { + buffer, + head, + rewrite_id, + diff_id, + materialized_text, + }) +} + +fn validate_basis( + basis: &GraphStore, + buffer_id: NodeId, + basis_head_id: NodeId, +) -> Result<(BufferFact, HeadFact), String> { + let basis_buffer: BufferFact = read_fact(basis, buffer_id)?; + require_equal( + "basis Buffer keyed identity", + buffer_node_id(&basis_buffer.buffer_key), + buffer_id, + )?; + require_equal( + "basis Buffer canonical head", + NodeId::from(basis_buffer.canonical_head_id), + basis_head_id, + )?; + let basis_head: HeadFact = read_content_fact(basis, basis_head_id, "basis Head")?; + require_equal( + "basis Head buffer", + NodeId::from(basis_head.buffer_id), + buffer_id, + )?; + Ok((basis_buffer, basis_head)) +} + +fn patch_node_with_type( + patch: &[WarpOp], + warp_id: WarpId, + type_id: TypeId, +) -> Result { + let mut matches = BTreeSet::new(); + for operation in patch { + let WarpOp::UpsertNode { node, record } = operation else { + continue; + }; + if record.ty != type_id { + continue; + } + if node.warp_id != warp_id { + return Err(format!( + "patch fact type {} belongs to foreign WARP {}", + hex::encode(type_id.as_bytes()), + hex::encode(node.warp_id.as_bytes()) + )); + } + matches.insert(node.local_id); + } + if matches.len() != 1 { + return Err(format!( + "expected exactly one patch fact of type {}, received {}", + hex::encode(type_id.as_bytes()), + matches.len() + )); + } + Ok(*matches + .first() + .expect("one patch fact must exist after the length check")) +} + +fn read_content_fact( + store: &GraphStore, + node_id: NodeId, + label: &str, +) -> Result { + let record = store + .node(&node_id) + .ok_or_else(|| format!("missing retained node {}", hex::encode(node_id.as_bytes())))?; + require_equal( + &format!("{label} node type"), + record.ty, + fact_type_id::(), + )?; + let attachment = store + .node_attachment(&node_id) + .ok_or_else(|| format!("missing retained fact {}", hex::encode(node_id.as_bytes())))?; + let AttachmentValue::Atom(payload) = attachment else { + return Err(format!("{label} uses a descended attachment")); + }; + require_equal( + &format!("{label} attachment type"), + payload.type_id, + fact_type_id::(), + )?; + require_equal( + &format!("{label} identity"), + content_node_id(F::ID_DOMAIN, payload.bytes.as_ref()), + node_id, + )?; + let fact = decode_fact(attachment).map_err(host_error)?; + require_equal( + &format!("{label} canonical bytes"), + fact_bytes(&fact).map_err(host_error)?.as_slice(), + payload.bytes.as_ref(), + )?; + Ok(fact) +} + +fn read_fact( + store: &GraphStore, + node_id: NodeId, +) -> Result { + let record = store + .node(&node_id) + .ok_or_else(|| format!("missing retained node {}", hex::encode(node_id.as_bytes())))?; + let expected_type = fact_type_id::(); + if record.ty != expected_type { + return Err(format!( + "{} node {} declares type {}, expected {}", + F::TYPE_LABEL, + hex::encode(node_id.as_bytes()), + hex::encode(record.ty.as_bytes()), + hex::encode(expected_type.as_bytes()) + )); + } + let attachment = store + .node_attachment(&node_id) + .ok_or_else(|| format!("missing retained fact {}", hex::encode(node_id.as_bytes())))?; + decode_fact(attachment).map_err(host_error) +} + +fn require_equal( + label: &str, + actual: T, + expected: T, +) -> Result<(), String> { + if actual != expected { + return Err(format!( + "{label} differs: expected {expected:?}, received {actual:?}" + )); + } + Ok(()) +} + +fn host_error(error: HostError) -> String { + error.to_string() +} + +#[cfg(test)] +#[path = "replace_range_consequence_tests.rs"] +mod tests; diff --git a/native/jedit-echo-host/tests/support/replace_range_consequence_tests.rs b/native/jedit-echo-host/tests/support/replace_range_consequence_tests.rs new file mode 100644 index 00000000..25887efa --- /dev/null +++ b/native/jedit-echo-host/tests/support/replace_range_consequence_tests.rs @@ -0,0 +1,426 @@ +use super::super::{ + apply_ops, insert_raw_content_fact, make_basis, set_fact_attachment, set_raw_fact_attachment, + BasisSetup, +}; +use super::*; +use jedit_echo_host::records::{fact_bytes, fact_type_id, BufferFact, HeadFact, RewriteFact}; +use jedit_echo_host::rope::plan_replace; +use warp_core::{make_type_id, AttachmentValue, NodeRecord, TickDelta, WarpOp}; + +#[test] +fn retained_consequence_is_internally_consistent() { + let warp_id = warp_core::make_warp_id("oracle-consistency"); + let (basis, buffer_id, basis_head_id, _) = + make_basis(warp_id, "consistent", "abc", BasisSetup::Plain); + let plan = plan_replace(&basis, buffer_id, basis_head_id, 1, 2, "XY") + .expect("replacement should plan"); + let mut delta = TickDelta::new(); + plan.emit(&mut delta); + let mut next = basis.clone(); + let patch = delta.finalize(); + apply_ops(&mut next, &patch); + + validate_consequence( + &basis, + &next, + &plan, + &patch, + ReplaceExpectation { + basis_head_id, + start_byte: 1, + end_byte: 2, + replacement: "XY", + }, + ) + .expect("retained consequence should be internally consistent"); +} + +#[test] +fn retained_consequence_rejects_node_and_atom_type_disagreement() { + let warp_id = warp_core::make_warp_id("oracle-node-type"); + let (basis, buffer_id, basis_head_id, _) = + make_basis(warp_id, "node-type", "abc", BasisSetup::Plain); + let plan = plan_replace(&basis, buffer_id, basis_head_id, 1, 2, "XY") + .expect("replacement should plan"); + let mut delta = TickDelta::new(); + plan.emit(&mut delta); + let patch = delta.finalize(); + let expectation = ReplaceExpectation { + basis_head_id, + start_byte: 1, + end_byte: 2, + replacement: "XY", + }; + let mut next = basis.clone(); + apply_ops(&mut next, &patch); + + for (node_id, label) in [(buffer_id, "Buffer"), (plan.head_id, "Head")] { + let mut corrupted = next.clone(); + corrupted.insert_node( + node_id, + NodeRecord { + ty: make_type_id("jedit.text.DeliberatelyWrong.v1"), + }, + ); + + let error = validate_consequence(&basis, &corrupted, &plan, &patch, expectation) + .expect_err("node and atom type disagreement must fail"); + assert!(error.contains(label), "{label} error was {error:?}"); + } +} + +#[test] +fn retained_consequence_rejects_a_misaddressed_buffer_key() { + let warp_id = warp_core::make_warp_id("oracle-buffer-key"); + let (basis, buffer_id, basis_head_id, _) = + make_basis(warp_id, "buffer-key", "abc", BasisSetup::Plain); + let plan = plan_replace(&basis, buffer_id, basis_head_id, 1, 2, "XY") + .expect("replacement should plan"); + let mut delta = TickDelta::new(); + plan.emit(&mut delta); + let patch = delta.finalize(); + let mut next = basis.clone(); + apply_ops(&mut next, &patch); + + let mut misaddressed_basis = basis.clone(); + corrupt_buffer_key(&mut misaddressed_basis, buffer_id); + corrupt_buffer_key(&mut next, buffer_id); + + let error = validate_consequence( + &misaddressed_basis, + &next, + &plan, + &patch, + ReplaceExpectation { + basis_head_id, + start_byte: 1, + end_byte: 2, + replacement: "XY", + }, + ) + .expect_err("a Buffer retained under the wrong keyed identity must fail"); + assert!( + error.contains("Buffer keyed identity"), + "error was {error:?}" + ); +} + +#[test] +fn retained_consequence_rejects_a_basis_head_owned_by_another_buffer() { + let warp_id = warp_core::make_warp_id("oracle-basis-head-buffer"); + let (mut basis, buffer_id, _, foreign_head_id) = + make_basis(warp_id, "basis-head-buffer", "abc", BasisSetup::ForeignHead); + let foreign_head_id = foreign_head_id.expect("foreign Head should exist"); + let mut buffer: BufferFact = read_fact(&basis, buffer_id).expect("Buffer should decode"); + buffer.canonical_head_id = foreign_head_id.into(); + set_fact_attachment(&mut basis, buffer_id, &buffer); + + let error = validate_basis(&basis, buffer_id, foreign_head_id) + .expect_err("a basis Head owned by another Buffer must fail validation"); + + assert!(error.contains("basis Head buffer"), "error was {error:?}"); +} + +#[test] +fn retained_consequence_rejects_a_misaddressed_basis_head() { + let warp_id = warp_core::make_warp_id("oracle-basis-head-identity"); + let (mut basis, buffer_id, basis_head_id, _) = + make_basis(warp_id, "basis-head-identity", "abc", BasisSetup::Plain); + let mut head: HeadFact = read_fact(&basis, basis_head_id).expect("Head should decode"); + head.root_digest[0] ^= 0xFF; + set_fact_attachment(&mut basis, basis_head_id, &head); + + let error = validate_basis(&basis, buffer_id, basis_head_id) + .expect_err("a misaddressed basis Head must fail validation"); + + assert!(error.contains("basis Head identity"), "error was {error:?}"); +} + +#[test] +fn retained_consequence_authenticates_a_basis_head_before_its_fields() { + let warp_id = warp_core::make_warp_id("oracle-basis-head-validation-order"); + let (mut basis, buffer_id, basis_head_id, _) = make_basis( + warp_id, + "basis-head-validation-order", + "abc", + BasisSetup::Plain, + ); + let mut head: HeadFact = read_fact(&basis, basis_head_id).expect("Head should decode"); + head.root_digest[0] ^= 0xFF; + head.buffer_id = NodeId([0xA5; 32]).into(); + set_fact_attachment(&mut basis, basis_head_id, &head); + + let error = validate_basis(&basis, buffer_id, basis_head_id) + .expect_err("a misaddressed basis Head must fail before field interpretation"); + + assert!(error.contains("basis Head identity"), "error was {error:?}"); +} + +#[test] +fn retained_consequence_rejects_whitespace_prefixed_basis_head_bytes() { + let warp_id = warp_core::make_warp_id("oracle-basis-head-whitespace"); + let (mut basis, buffer_id, basis_head_id, _) = + make_basis(warp_id, "basis-head-whitespace", "abc", BasisSetup::Plain); + let basis_head: HeadFact = read_fact(&basis, basis_head_id).expect("Head should decode"); + let mut noncanonical_bytes = vec![b' ']; + noncanonical_bytes.extend(fact_bytes(&basis_head).expect("Head should encode")); + set_raw_fact_attachment::(&mut basis, basis_head_id, noncanonical_bytes); + + let error = validate_basis(&basis, buffer_id, basis_head_id) + .expect_err("whitespace-prefixed basis Head bytes must fail validation"); + + assert!(error.contains("basis Head identity"), "error was {error:?}"); +} + +#[test] +fn retained_consequence_rejects_an_unknown_basis_head_member() { + let warp_id = warp_core::make_warp_id("oracle-basis-head-unknown-member"); + let (mut basis, buffer_id, basis_head_id, _) = make_basis( + warp_id, + "basis-head-unknown-member", + "abc", + BasisSetup::Plain, + ); + let basis_head: HeadFact = read_fact(&basis, basis_head_id).expect("Head should decode"); + let mut noncanonical_bytes = fact_bytes(&basis_head).expect("Head should encode"); + assert_eq!(noncanonical_bytes.pop(), Some(b'}')); + noncanonical_bytes.extend(br#","unexpected":true}"#); + set_raw_fact_attachment::(&mut basis, basis_head_id, noncanonical_bytes); + + let error = validate_basis(&basis, buffer_id, basis_head_id) + .expect_err("an unknown basis Head member must fail validation"); + + assert!(error.contains("basis Head identity"), "error was {error:?}"); +} + +#[test] +fn retained_consequence_authenticates_invalid_basis_head_bytes_before_decoding() { + let warp_id = warp_core::make_warp_id("oracle-basis-head-invalid-json"); + let (mut basis, buffer_id, basis_head_id, _) = + make_basis(warp_id, "basis-head-invalid-json", "abc", BasisSetup::Plain); + set_raw_fact_attachment::(&mut basis, basis_head_id, b"{".to_vec()); + + let error = validate_basis(&basis, buffer_id, basis_head_id) + .expect_err("invalid basis Head bytes must not be decoded before authentication"); + + assert!(error.contains("basis Head identity"), "error was {error:?}"); +} + +#[test] +fn retained_consequence_rejects_content_addressed_noncanonical_basis_head_bytes() { + let warp_id = warp_core::make_warp_id("oracle-basis-head-addressed-noncanonical"); + let (mut basis, buffer_id, basis_head_id, _) = make_basis( + warp_id, + "basis-head-addressed-noncanonical", + "abc", + BasisSetup::Plain, + ); + let basis_head: HeadFact = read_fact(&basis, basis_head_id).expect("Head should decode"); + let mut noncanonical_bytes = fact_bytes(&basis_head).expect("Head should encode"); + assert_eq!(noncanonical_bytes.pop(), Some(b'}')); + noncanonical_bytes.extend(br#","unexpected":true}"#); + let noncanonical_head_id = insert_raw_content_fact::(&mut basis, noncanonical_bytes); + let mut buffer: BufferFact = read_fact(&basis, buffer_id).expect("Buffer should decode"); + buffer.canonical_head_id = noncanonical_head_id.into(); + set_fact_attachment(&mut basis, buffer_id, &buffer); + + let error = validate_basis(&basis, buffer_id, noncanonical_head_id) + .expect_err("content-addressed noncanonical basis Head bytes must fail validation"); + + assert!( + error.contains("basis Head canonical bytes"), + "error was {error:?}" + ); +} + +#[test] +fn retained_consequence_rejects_a_basis_head_with_the_wrong_node_type() { + let warp_id = warp_core::make_warp_id("oracle-basis-head-node-type"); + let (mut basis, buffer_id, basis_head_id, _) = + make_basis(warp_id, "basis-head-node-type", "abc", BasisSetup::Plain); + basis.insert_node( + basis_head_id, + NodeRecord { + ty: make_type_id("jedit.text.DeliberatelyWrong.v1"), + }, + ); + + assert_basis_validation_fails(&basis, buffer_id, basis_head_id, "basis Head node type"); +} + +#[test] +fn retained_consequence_rejects_a_basis_head_with_the_wrong_atom_type() { + let warp_id = warp_core::make_warp_id("oracle-basis-head-atom-type"); + let (mut basis, buffer_id, basis_head_id, _) = + make_basis(warp_id, "basis-head-atom-type", "abc", BasisSetup::Plain); + let basis_head: HeadFact = read_fact(&basis, basis_head_id).expect("Head should decode"); + basis.set_node_attachment( + basis_head_id, + Some(AttachmentValue::Atom(warp_core::AtomPayload::new( + make_type_id("jedit.text.DeliberatelyWrong.v1"), + fact_bytes(&basis_head).expect("Head should encode").into(), + ))), + ); + + assert_basis_validation_fails( + &basis, + buffer_id, + basis_head_id, + "basis Head attachment type", + ); +} + +#[test] +fn retained_consequence_rejects_a_descended_basis_head_attachment() { + let warp_id = warp_core::make_warp_id("oracle-basis-head-descended"); + let (mut basis, buffer_id, basis_head_id, _) = + make_basis(warp_id, "basis-head-descended", "abc", BasisSetup::Plain); + basis.set_node_attachment( + basis_head_id, + Some(AttachmentValue::Descend(warp_core::make_warp_id( + "oracle-basis-head-child", + ))), + ); + + assert_basis_validation_fails( + &basis, + buffer_id, + basis_head_id, + "basis Head uses a descended attachment", + ); +} + +fn assert_basis_validation_fails( + basis: &GraphStore, + buffer_id: NodeId, + basis_head_id: NodeId, + message: &str, +) { + let error = validate_basis(basis, buffer_id, basis_head_id) + .expect_err("a structurally malformed basis Head must fail validation"); + + assert!(error.contains(message), "error was {error:?}"); +} + +#[test] +fn retained_consequence_selects_facts_from_the_current_edit() { + let warp_id = warp_core::make_warp_id("oracle-retained-history"); + let (basis, buffer_id, basis_head_id, _) = + make_basis(warp_id, "retained-history", "abc", BasisSetup::Plain); + let first_plan = plan_replace(&basis, buffer_id, basis_head_id, 1, 2, "XY") + .expect("first replacement should plan"); + let mut first_delta = TickDelta::new(); + first_plan.emit(&mut first_delta); + let mut after_first = basis.clone(); + apply_ops(&mut after_first, &first_delta.finalize()); + + let second_plan = plan_replace(&after_first, buffer_id, first_plan.head_id, 0, 1, "Z") + .expect("second replacement should plan"); + let mut second_delta = TickDelta::new(); + second_plan.emit(&mut second_delta); + let mut after_second = after_first.clone(); + let second_patch = second_delta.finalize(); + apply_ops(&mut after_second, &second_patch); + + validate_consequence( + &after_first, + &after_second, + &second_plan, + &second_patch, + ReplaceExpectation { + basis_head_id: first_plan.head_id, + start_byte: 0, + end_byte: 1, + replacement: "Z", + }, + ) + .expect("current consequence should tolerate prior retained history"); +} + +#[test] +fn retained_consequence_requires_one_current_rewrite_candidate() { + let warp_id = warp_core::make_warp_id("oracle-current-candidate"); + let (basis, buffer_id, basis_head_id, _) = + make_basis(warp_id, "current-candidate", "abc", BasisSetup::Plain); + let plan = plan_replace(&basis, buffer_id, basis_head_id, 1, 2, "XY") + .expect("replacement should plan"); + let mut delta = TickDelta::new(); + plan.emit(&mut delta); + let mut next = basis.clone(); + let patch = delta.finalize(); + apply_ops(&mut next, &patch); + let expectation = ReplaceExpectation { + basis_head_id, + start_byte: 1, + end_byte: 2, + replacement: "XY", + }; + + let missing = validate_consequence(&basis, &next, &plan, &[], expectation) + .expect_err("a patch without a Rewrite candidate must fail"); + assert!(missing.contains("received 0")); + + let mut ambiguous = patch.clone(); + ambiguous.push(WarpOp::UpsertNode { + node: warp_core::NodeKey { + warp_id, + local_id: warp_core::NodeId([0xA5; 32]), + }, + record: warp_core::NodeRecord { + ty: fact_type_id::(), + }, + }); + let ambiguity = validate_consequence(&basis, &next, &plan, &ambiguous, expectation) + .expect_err("multiple Rewrite candidates must fail"); + assert!(ambiguity.contains("received 2")); +} + +#[test] +fn retained_consequence_rejects_a_buffer_head_mismatch() { + let warp_id = warp_core::make_warp_id("oracle-inconsistent"); + let (basis, buffer_id, basis_head_id, _) = + make_basis(warp_id, "inconsistent", "abc", BasisSetup::Plain); + let plan = plan_replace(&basis, buffer_id, basis_head_id, 1, 2, "XY") + .expect("replacement should plan"); + let mut delta = TickDelta::new(); + plan.emit(&mut delta); + let mut next = basis.clone(); + let patch = delta.finalize(); + apply_ops(&mut next, &patch); + let mut buffer: BufferFact = read_fact(&next, buffer_id).expect("Buffer should decode"); + buffer.canonical_head_id = basis_head_id.into(); + next.set_node_attachment( + buffer_id, + Some(AttachmentValue::Atom(warp_core::AtomPayload::new( + fact_type_id::(), + fact_bytes(&buffer).expect("Buffer should encode").into(), + ))), + ); + + let error = validate_consequence( + &basis, + &next, + &plan, + &patch, + ReplaceExpectation { + basis_head_id, + start_byte: 1, + end_byte: 2, + replacement: "XY", + }, + ) + .expect_err("inconsistent retained consequence should fail"); + assert!(error.contains("result Buffer canonical head")); +} + +fn corrupt_buffer_key(store: &mut GraphStore, buffer_id: NodeId) { + let mut buffer: BufferFact = read_fact(store, buffer_id).expect("Buffer should decode"); + buffer.buffer_key = "deliberately-misaddressed".to_owned(); + store.set_node_attachment( + buffer_id, + Some(AttachmentValue::Atom(warp_core::AtomPayload::new( + fact_type_id::(), + fact_bytes(&buffer).expect("Buffer should encode").into(), + ))), + ); +} diff --git a/native/jedit-echo-host/tests/support/replace_range_contract.rs b/native/jedit-echo-host/tests/support/replace_range_contract.rs new file mode 100644 index 00000000..936e720d --- /dev/null +++ b/native/jedit-echo-host/tests/support/replace_range_contract.rs @@ -0,0 +1,53 @@ +pub use jedit_echo_host::rope::ReplaceRangeObstructionCode as SemanticObstructionCode; + +pub const ORACLE_SCHEMA_VERSION: u32 = 1; +pub const ORACLE_COORDINATE: &str = "jedit.text.ReplaceRange.oracle@1"; +pub const APPLICATION_SCHEMA_COORDINATE: &str = "jedit.text.schema@1"; +pub const INVOCATION_SCHEMA_COORDINATE: &str = "jedit.text.ReplaceRange.oracle-invocation@1"; +pub const HISTORICAL_PLANNER_CHECKPOINT_COMMIT: &str = "c70e12d73b4b00bc92412bab67e1761f7dd22f82"; +pub const HISTORICAL_PLANNER_CHECKPOINT_ROLE: &str = "provenance-only"; +pub const EVIDENCE_GRADE: &str = "deterministic-self-validation"; +pub const INDEPENDENCE_LIMIT: &str = "independent finite-corpus evidence begins only when a separately implemented Echo evaluator agrees"; +pub const ORACLE_WARP_LABEL: &str = "jedit.replace-range.oracle.v1"; +pub const OBSTRUCTED_PATCH_POSTURE: &str = "no-mutation-plan"; + +#[cfg(test)] +mod tests { + use std::collections::BTreeSet; + + use super::*; + + #[test] + fn operation_contract_constants_are_frozen() { + assert_eq!(ORACLE_SCHEMA_VERSION, 1); + assert_eq!(ORACLE_COORDINATE, "jedit.text.ReplaceRange.oracle@1"); + assert_eq!(APPLICATION_SCHEMA_COORDINATE, "jedit.text.schema@1"); + assert_eq!( + INVOCATION_SCHEMA_COORDINATE, + "jedit.text.ReplaceRange.oracle-invocation@1" + ); + assert_eq!(HISTORICAL_PLANNER_CHECKPOINT_COMMIT.len(), 40); + assert_eq!(HISTORICAL_PLANNER_CHECKPOINT_ROLE, "provenance-only"); + assert_eq!(EVIDENCE_GRADE, "deterministic-self-validation"); + assert!(INDEPENDENCE_LIMIT.contains("separately implemented Echo evaluator")); + assert_eq!(ORACLE_WARP_LABEL, "jedit.replace-range.oracle.v1"); + assert_eq!(OBSTRUCTED_PATCH_POSTURE, "no-mutation-plan"); + } + + #[test] + fn semantic_obstruction_wire_values_are_bijective() { + let mut wire_values = BTreeSet::new(); + for code in SemanticObstructionCode::ALL { + let encoded = serde_json::to_string(&code).expect("obstruction code should encode"); + assert_eq!(encoded, format!("\"{}\"", code.as_str())); + assert_eq!( + serde_json::from_str::(&encoded) + .expect("obstruction code should decode"), + code + ); + assert!(wire_values.insert(code.as_str())); + } + assert_eq!(wire_values.len(), SemanticObstructionCode::ALL.len()); + assert!(serde_json::from_str::("\"unknown\"").is_err()); + } +} diff --git a/native/jedit-echo-host/tests/support/replace_range_corpus_contract.rs b/native/jedit-echo-host/tests/support/replace_range_corpus_contract.rs new file mode 100644 index 00000000..9d3bf718 --- /dev/null +++ b/native/jedit-echo-host/tests/support/replace_range_corpus_contract.rs @@ -0,0 +1,437 @@ +use std::collections::BTreeSet; + +use jedit_echo_host::identity::hash_bytes; +use jedit_echo_host::records::EMPTY_ROOT_DIGEST_DOMAIN; +use serde::{Deserialize, Serialize}; + +use super::contract::{ + SemanticObstructionCode, APPLICATION_SCHEMA_COORDINATE, EVIDENCE_GRADE, + HISTORICAL_PLANNER_CHECKPOINT_COMMIT, INDEPENDENCE_LIMIT, INVOCATION_SCHEMA_COORDINATE, + OBSTRUCTED_PATCH_POSTURE, ORACLE_COORDINATE, ORACLE_SCHEMA_VERSION, ORACLE_WARP_LABEL, +}; +use super::lexemes::{CommitSha, Hex32, HexBytes, Utf8Hex}; +use super::patch_fact_contract::{validate_patch, PatchOperation}; +use super::source_set::source_set; + +#[path = "replace_range_corpus_result_contract.rs"] +mod result_contract; + +pub(super) const NONCANONICAL_CORPUS_BYTES: &str = "oracle corpus bytes are not canonical"; + +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +struct CorpusEnvelope { + schema_version: u32, + coordinate: String, + application_schema_coordinate: String, + invocation_schema_coordinate: String, + historical_planner_checkpoint_commit: CommitSha, + source_set: SourceSetEnvelope, + evidence_grade: String, + independence_limit: String, + warp_id: Hex32, + cases: Vec, +} + +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +struct SourceSetEnvelope { + algorithm: String, + domain_hex: HexBytes, + framing: String, + paths: Vec, + digest_hex: Hex32, +} + +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +struct CorpusCase { + id: String, + purpose: String, + basis_facts: Vec, + invocation: Invocation, + invocation_bytes_hex: HexBytes, + terminal: Terminal, +} + +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +struct BasisFact { + node_id: Hex32, + type_id: Hex32, + attachment_bytes_hex: HexBytes, +} + +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +struct Invocation { + buffer_id: Hex32, + basis_head_id: Hex32, + start_byte: u64, + end_byte: u64, + replacement_utf8_hex: Utf8Hex, +} + +#[derive(Debug, Deserialize, Serialize)] +#[serde( + tag = "posture", + rename_all = "kebab-case", + rename_all_fields = "camelCase", + deny_unknown_fields +)] +enum Terminal { + Committable { + footprint: Footprint, + patch: Vec, + created_node_ids: Vec, + updated_node_ids: Vec, + untouched_basis_node_ids: Vec, + result: Box, + }, + Obstructed { + semantic_code: SemanticObstructionCode, + legacy_error_class: String, + legacy_message: String, + parent_graph_unchanged: bool, + patch_posture: String, + }, +} + +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +struct Footprint { + node_reads: Vec, + node_writes: Vec, + attachment_reads: Vec, + attachment_writes: Vec, + edge_reads: Vec, + edge_writes: Vec, +} + +#[derive(Debug, Deserialize, Serialize)] +#[serde(rename_all = "camelCase", deny_unknown_fields)] +struct ResultEvidence { + buffer_id: Hex32, + head_id: Hex32, + root_node_id: Option, + root_digest: Hex32, + rewrite_id: Hex32, + diff_id: Hex32, + byte_length: u64, + utf16_length: u64, + line_count: u64, + sequence: u64, + version: u64, + materialized_text_utf8_hex: Utf8Hex, +} + +struct CommittableEvidence<'a> { + footprint: &'a Footprint, + patch: &'a [PatchOperation], + created: &'a [Hex32], + updated: &'a [Hex32], + untouched: &'a [Hex32], + result: &'a ResultEvidence, +} + +pub fn validate_oracle_contract(bytes: &[u8]) -> Result<(), String> { + let corpus: CorpusEnvelope = serde_json::from_slice(bytes) + .map_err(|error| format!("oracle corpus transport is invalid: {error}"))?; + validate_envelope(&corpus)?; + let mut canonical = serde_json::to_vec_pretty(&corpus) + .map_err(|error| format!("oracle corpus canonicalization failed: {error}"))?; + canonical.push(b'\n'); + if canonical != bytes { + return Err(NONCANONICAL_CORPUS_BYTES.to_owned()); + } + Ok(()) +} + +fn validate_envelope(corpus: &CorpusEnvelope) -> Result<(), String> { + require_equal( + "schemaVersion", + corpus.schema_version, + ORACLE_SCHEMA_VERSION, + )?; + require_equal("coordinate", corpus.coordinate.as_str(), ORACLE_COORDINATE)?; + require_equal( + "applicationSchemaCoordinate", + corpus.application_schema_coordinate.as_str(), + APPLICATION_SCHEMA_COORDINATE, + )?; + require_equal( + "invocationSchemaCoordinate", + corpus.invocation_schema_coordinate.as_str(), + INVOCATION_SCHEMA_COORDINATE, + )?; + require_equal( + "historicalPlannerCheckpointCommit", + corpus.historical_planner_checkpoint_commit.as_str(), + HISTORICAL_PLANNER_CHECKPOINT_COMMIT, + )?; + require_equal( + "evidenceGrade", + corpus.evidence_grade.as_str(), + EVIDENCE_GRADE, + )?; + require_equal( + "independenceLimit", + corpus.independence_limit.as_str(), + INDEPENDENCE_LIMIT, + )?; + let expected_warp_id = hex::encode(warp_core::make_warp_id(ORACLE_WARP_LABEL).as_bytes()); + require_equal("warpId", corpus.warp_id.as_str(), expected_warp_id.as_str())?; + validate_source_set(&corpus.source_set)?; + if corpus.cases.is_empty() { + return Err("cases must not be empty".to_owned()); + } + let mut case_ids = BTreeSet::new(); + for case in &corpus.cases { + if case.id.is_empty() || case.purpose.is_empty() { + return Err("case id and purpose must not be empty".to_owned()); + } + if !case_ids.insert(case.id.as_str()) { + return Err(format!("duplicate case id {}", case.id)); + } + validate_case(case)?; + } + Ok(()) +} + +fn validate_source_set(claimed: &SourceSetEnvelope) -> Result<(), String> { + let expected = source_set(); + require_equal( + "sourceSet.algorithm", + claimed.algorithm.as_str(), + expected.algorithm, + )?; + require_equal( + "sourceSet.domainHex", + claimed.domain_hex.as_str(), + expected.domain_hex.as_str(), + )?; + require_equal( + "sourceSet.framing", + claimed.framing.as_str(), + expected.framing, + )?; + if claimed + .paths + .iter() + .map(String::as_str) + .ne(expected.paths.iter().copied()) + { + return Err("sourceSet.paths differ from the generator source set".to_owned()); + } + require_equal( + "sourceSet.digestHex", + claimed.digest_hex.as_str(), + expected.digest_hex.as_str(), + ) +} + +fn validate_case(case: &CorpusCase) -> Result<(), String> { + unique_ids( + "basisFacts.nodeId", + case.basis_facts.iter().map(|fact| fact.node_id.as_str()), + )?; + let expected_invocation = serde_json::to_vec(&case.invocation) + .map_err(|error| format!("invocation encoding failed: {error}"))?; + require_equal( + "invocationBytesHex", + case.invocation_bytes_hex.bytes(), + expected_invocation, + )?; + match &case.terminal { + Terminal::Committable { + footprint, + patch, + created_node_ids, + updated_node_ids, + untouched_basis_node_ids, + result, + } => validate_committable( + case, + CommittableEvidence { + footprint, + patch, + created: created_node_ids, + updated: updated_node_ids, + untouched: untouched_basis_node_ids, + result, + }, + ), + Terminal::Obstructed { + semantic_code: _, + legacy_error_class, + legacy_message, + parent_graph_unchanged, + patch_posture, + } => { + if legacy_error_class.is_empty() || legacy_message.is_empty() { + return Err("obstruction legacy evidence must not be empty".to_owned()); + } + require_equal("parentGraphUnchanged", *parent_graph_unchanged, true)?; + require_equal( + "patchPosture", + patch_posture.as_str(), + OBSTRUCTED_PATCH_POSTURE, + ) + } + } +} + +fn validate_committable( + case: &CorpusCase, + evidence: CommittableEvidence<'_>, +) -> Result<(), String> { + let CommittableEvidence { + footprint, + patch, + created, + updated, + untouched, + result, + } = evidence; + let basis = unique_ids( + "basisFacts.nodeId", + case.basis_facts.iter().map(|fact| fact.node_id.as_str()), + )?; + let reads = unique_ids("footprint.nodeReads", ids(&footprint.node_reads))?; + let writes = unique_ids("footprint.nodeWrites", ids(&footprint.node_writes))?; + if !reads.is_subset(&basis) { + return Err("footprint reads must identify retained basis facts".to_owned()); + } + require_equal( + "attachmentReads", + unique_ids( + "footprint.attachmentReads", + ids(&footprint.attachment_reads), + )?, + reads, + )?; + require_equal( + "attachmentWrites", + unique_ids( + "footprint.attachmentWrites", + ids(&footprint.attachment_writes), + )?, + writes.clone(), + )?; + if !footprint.edge_reads.is_empty() || !footprint.edge_writes.is_empty() { + return Err("ReplaceRange footprint must not contain edges".to_owned()); + } + let created = unique_ids("createdNodeIds", ids(created))?; + let updated = unique_ids("updatedNodeIds", ids(updated))?; + let untouched = unique_ids("untouchedBasisNodeIds", ids(untouched))?; + if !created.is_disjoint(&updated) + || !created.is_disjoint(&untouched) + || !updated.is_disjoint(&untouched) + { + return Err("created, updated, and untouched node sets must be disjoint".to_owned()); + } + require_equal( + "nodeWrites partition", + created.union(&updated).copied().collect::>(), + writes.clone(), + )?; + require_equal( + "basis partition", + updated.union(&untouched).copied().collect::>(), + basis, + )?; + let patch = validate_patch(patch, &writes)?; + validate_result(case, result, &writes, &updated)?; + result_contract::validate_result_chain(case, result, &patch) +} + +fn validate_result( + case: &CorpusCase, + result: &ResultEvidence, + writes: &BTreeSet<&str>, + updated: &BTreeSet<&str>, +) -> Result<(), String> { + require_equal( + "result.bufferId", + result.buffer_id.as_str(), + case.invocation.buffer_id.as_str(), + )?; + if !updated.contains(result.buffer_id.as_str()) { + return Err("result Buffer must be an updated basis node".to_owned()); + } + for (label, id) in [ + ("headId", &result.head_id), + ("rewriteId", &result.rewrite_id), + ("diffId", &result.diff_id), + ] { + if !writes.contains(id.as_str()) { + return Err(format!("result {label} must be in the declared writes")); + } + } + match &result.root_node_id { + Some(root) => require_equal( + "nonempty root digest", + result.root_digest.as_str(), + root.as_str(), + )?, + None => require_equal( + "empty root digest", + result.root_digest.as_str(), + hex::encode(hash_bytes(EMPTY_ROOT_DIGEST_DOMAIN, &[])).as_str(), + )?, + } + let text_bytes = result.materialized_text_utf8_hex.bytes(); + let text = + std::str::from_utf8(&text_bytes).expect("Utf8Hex guarantees valid materialized UTF-8"); + require_equal( + "result.byteLength", + result.byte_length, + u64::try_from(text_bytes.len()).map_err(|_| "materialized text exceeds u64")?, + )?; + require_equal( + "result.utf16Length", + result.utf16_length, + u64::try_from(text.encode_utf16().count()).map_err(|_| "UTF-16 length exceeds u64")?, + )?; + require_equal( + "result.lineCount", + result.line_count, + u64::try_from(text.bytes().filter(|byte| *byte == b'\n').count()) + .map_err(|_| "line count exceeds u64")? + + 1, + )?; + if result.sequence == 0 || result.version == 0 { + return Err("committable result sequence and version must advance".to_owned()); + } + Ok(()) +} + +fn ids(values: &[Hex32]) -> impl Iterator { + values.iter().map(Hex32::as_str) +} + +fn unique_ids<'a>( + label: &str, + values: impl IntoIterator, +) -> Result, String> { + let mut unique = BTreeSet::new(); + for value in values { + if !unique.insert(value) { + return Err(format!("{label} contains duplicate {value}")); + } + } + Ok(unique) +} + +fn require_equal( + label: &str, + actual: T, + expected: T, +) -> Result<(), String> { + if actual != expected { + return Err(format!( + "{label} differs: expected {expected:?}, received {actual:?}" + )); + } + Ok(()) +} diff --git a/native/jedit-echo-host/tests/support/replace_range_corpus_fact_chain_tests.rs b/native/jedit-echo-host/tests/support/replace_range_corpus_fact_chain_tests.rs new file mode 100644 index 00000000..6fc9ea43 --- /dev/null +++ b/native/jedit-echo-host/tests/support/replace_range_corpus_fact_chain_tests.rs @@ -0,0 +1,334 @@ +use jedit_echo_host::records::{ + fact_bytes, fact_id, BufferFact, ContentAddressedFact, DiffFact, HeadFact, NodeIdBytes, + RewriteFact, +}; +use serde::de::DeserializeOwned; +use serde_json::Value; + +use super::{committable, mutation_error}; + +fn assert_chain_invalid(label: &str, expected_error: &str, mutate: impl FnOnce(&mut Value)) { + let error = mutation_error(label, mutate); + assert!(error.contains(expected_error), "{label} returned {error:?}"); +} + +fn mutate_result_buffer(corpus: &mut Value, mutate: impl FnOnce(&mut BufferFact)) -> BufferFact { + let case = committable(corpus); + let buffer_id = case["terminal"]["result"]["bufferId"] + .as_str() + .expect("result Buffer identifier should be a string") + .to_owned(); + let operation = case["terminal"]["patch"] + .as_array_mut() + .expect("patch should be an array") + .iter_mut() + .find(|operation| operation["kind"] == "set-node-alpha" && operation["nodeId"] == buffer_id) + .expect("result Buffer attachment should exist"); + let bytes = hex::decode( + operation["attachmentBytesHex"] + .as_str() + .expect("attachment bytes should be hexadecimal"), + ) + .expect("attachment hexadecimal should decode"); + let mut buffer: BufferFact = + serde_json::from_slice(&bytes).expect("Buffer attachment should decode"); + mutate(&mut buffer); + operation["attachmentBytesHex"] = Value::String(hex::encode( + fact_bytes(&buffer).expect("mutated Buffer should encode"), + )); + buffer +} + +fn mutate_basis_buffer(corpus: &mut Value, mutate: impl FnOnce(&mut BufferFact)) { + let case = committable(corpus); + let buffer_id = case["invocation"]["bufferId"] + .as_str() + .expect("invocation Buffer identifier should be a string") + .to_owned(); + let fact = case["basisFacts"] + .as_array_mut() + .expect("basis facts should be an array") + .iter_mut() + .find(|fact| fact["nodeId"] == buffer_id) + .expect("basis Buffer fact should exist"); + let bytes = hex::decode( + fact["attachmentBytesHex"] + .as_str() + .expect("basis attachment bytes should be hexadecimal"), + ) + .expect("basis attachment hexadecimal should decode"); + let mut buffer: BufferFact = + serde_json::from_slice(&bytes).expect("basis Buffer should decode"); + mutate(&mut buffer); + fact["attachmentBytesHex"] = Value::String(hex::encode( + fact_bytes(&buffer).expect("mutated basis Buffer should encode"), + )); +} + +fn mutate_result_fact(corpus: &mut Value, result_field: &str, mutate: impl FnOnce(&mut F)) -> F +where + F: ContentAddressedFact + DeserializeOwned, +{ + let case = committable(corpus); + let original_id = case["terminal"]["result"][result_field] + .as_str() + .expect("result fact identifier should be a string") + .to_owned(); + let operation = case["terminal"]["patch"] + .as_array_mut() + .expect("patch should be an array") + .iter_mut() + .find(|operation| { + operation["kind"] == "set-node-alpha" && operation["nodeId"] == original_id + }) + .expect("result fact attachment should exist"); + let bytes = hex::decode( + operation["attachmentBytesHex"] + .as_str() + .expect("attachment bytes should be hexadecimal"), + ) + .expect("attachment hexadecimal should decode"); + let mut fact: F = serde_json::from_slice(&bytes).expect("result fact should decode"); + mutate(&mut fact); + operation["attachmentBytesHex"] = Value::String(hex::encode( + fact_bytes(&fact).expect("mutated result fact should encode"), + )); + let replacement_id = hex::encode( + fact_id(&fact) + .expect("mutated result fact should have an identity") + .as_bytes(), + ); + replace_string(case, &original_id, &replacement_id); + canonicalize_patch_order(case); + fact +} + +fn replace_string(value: &mut Value, original: &str, replacement: &str) { + match value { + Value::Array(values) => { + for value in values { + replace_string(value, original, replacement); + } + } + Value::Object(values) => { + for value in values.values_mut() { + replace_string(value, original, replacement); + } + } + Value::String(value) if value == original => *value = replacement.to_owned(), + _ => {} + } +} + +fn canonicalize_patch_order(case: &mut Value) { + case["terminal"]["patch"] + .as_array_mut() + .expect("patch should be an array") + .sort_by(|left, right| { + let left_phase = (left["kind"] != "upsert-node") as u8; + let right_phase = (right["kind"] != "upsert-node") as u8; + (left_phase, left["nodeId"].as_str()).cmp(&(right_phase, right["nodeId"].as_str())) + }); +} + +fn committable_with_extended_basis(corpus: &mut Value) -> &mut Value { + corpus["cases"] + .as_array_mut() + .expect("cases should be an array") + .iter_mut() + .find(|case| { + case["terminal"]["posture"] == "committable" + && case["basisFacts"] + .as_array() + .is_some_and(|facts| facts.len() > 2) + }) + .expect("a committable case with rope basis facts should exist") +} + +#[test] +fn strict_corpus_cross_checks_result_fact_roles() { + assert_chain_invalid( + "swapped Rewrite and Diff roles", + "result Rewrite fact", + |corpus| { + let result = &mut committable(corpus)["terminal"]["result"]; + let rewrite_id = result["rewriteId"].clone(); + result["rewriteId"] = result["diffId"].clone(); + result["diffId"] = rewrite_id; + }, + ); +} + +#[test] +fn strict_corpus_cross_checks_buffer_version() { + assert_chain_invalid("result Buffer version", "result Buffer version", |corpus| { + let version = committable(corpus)["terminal"]["result"]["version"] + .as_u64() + .expect("result version should be u64"); + committable(corpus)["terminal"]["result"]["version"] = Value::from(version + 1); + }); +} + +#[test] +fn strict_corpus_cross_checks_head_sequence() { + assert_chain_invalid("result Head sequence", "result Head sequence", |corpus| { + let sequence = committable(corpus)["terminal"]["result"]["sequence"] + .as_u64() + .expect("result sequence should be u64"); + committable(corpus)["terminal"]["result"]["sequence"] = Value::from(sequence + 1); + }); +} + +#[test] +fn strict_corpus_cross_checks_head_root() { + assert_chain_invalid("result Head root", "result Head root", |corpus| { + let result = &mut committable(corpus)["terminal"]["result"]; + let substitute = result["rewriteId"].clone(); + result["rootNodeId"] = substitute.clone(); + result["rootDigest"] = substitute; + }); +} + +#[test] +fn strict_corpus_cross_checks_buffer_head_link() { + assert_chain_invalid( + "result Buffer canonical Head", + "result Buffer canonical Head", + |corpus| { + let rewrite_id = committable(corpus)["terminal"]["result"]["rewriteId"] + .as_str() + .expect("Rewrite identifier should be a string"); + let bytes = hex::decode(rewrite_id).expect("Rewrite identifier should decode"); + let wrong_head = + <[u8; 32]>::try_from(bytes).expect("Rewrite identifier should contain 32 bytes"); + mutate_result_buffer(corpus, |buffer| { + buffer.canonical_head_id = NodeIdBytes(wrong_head); + }); + }, + ); +} + +#[test] +fn strict_corpus_cross_checks_buffer_version_advancement() { + assert_chain_invalid( + "result Buffer version advancement", + "result Buffer version advancement", + |corpus| { + let buffer = mutate_result_buffer(corpus, |buffer| { + buffer.version += 1; + }); + committable(corpus)["terminal"]["result"]["version"] = Value::from(buffer.version); + }, + ); +} + +#[test] +fn strict_corpus_cross_checks_head_sequence_advancement() { + assert_chain_invalid( + "result Head sequence advancement", + "result Head sequence advancement", + |corpus| { + let head = mutate_result_fact::(corpus, "headId", |head| { + head.sequence += 1; + }); + let head_id = fact_id(&head).expect("mutated Head should have an identity"); + mutate_result_buffer(corpus, |buffer| { + buffer.canonical_head_id = NodeIdBytes(*head_id.as_bytes()); + }); + committable(corpus)["terminal"]["result"]["sequence"] = Value::from(head.sequence); + }, + ); +} + +#[test] +fn strict_corpus_cross_checks_head_root_digest() { + assert_chain_invalid( + "result Head root digest", + "nonempty root digest differs", + |corpus| { + committable(corpus)["terminal"]["result"]["rootDigest"] = + Value::String("00".repeat(32)); + }, + ); +} + +#[test] +fn strict_corpus_authenticates_every_committable_basis_fact() { + assert_chain_invalid("malformed unselected basis fact", "basis fact", |corpus| { + let case = committable_with_extended_basis(corpus); + let buffer_id = case["invocation"]["bufferId"].clone(); + let head_id = case["invocation"]["basisHeadId"].clone(); + let fact = case["basisFacts"] + .as_array_mut() + .expect("basis facts should be an array") + .iter_mut() + .find(|fact| fact["nodeId"] != buffer_id && fact["nodeId"] != head_id) + .expect("an unselected basis fact should exist"); + fact["attachmentBytesHex"] = Value::String("00".to_owned()); + }); +} + +#[test] +fn strict_corpus_cross_checks_basis_buffer_head_link() { + assert_chain_invalid( + "basis Buffer canonical Head", + "basis Buffer canonical Head", + |corpus| { + let buffer_id = committable(corpus)["invocation"]["bufferId"] + .as_str() + .expect("Buffer identifier should be a string"); + let bytes = hex::decode(buffer_id).expect("Buffer identifier should decode"); + let wrong_head = + <[u8; 32]>::try_from(bytes).expect("Buffer identifier should contain 32 bytes"); + mutate_basis_buffer(corpus, |buffer| { + buffer.canonical_head_id = NodeIdBytes(wrong_head); + }); + }, + ); +} + +#[test] +fn strict_corpus_labels_unsupported_committable_basis_types() { + assert_chain_invalid( + "unsupported committable basis fact type", + "basis fact", + |corpus| { + let case = committable_with_extended_basis(corpus); + let buffer_id = case["invocation"]["bufferId"].clone(); + let head_id = case["invocation"]["basisHeadId"].clone(); + let fact = case["basisFacts"] + .as_array_mut() + .expect("basis facts should be an array") + .iter_mut() + .find(|fact| fact["nodeId"] != buffer_id && fact["nodeId"] != head_id) + .expect("an unselected basis fact should exist"); + fact["typeId"] = Value::String("00".repeat(32)); + }, + ); +} + +#[test] +fn strict_corpus_cross_checks_rewrite_fields() { + assert_chain_invalid( + "Rewrite inserted byte length", + "Rewrite inserted byte length", + |corpus| { + mutate_result_fact::(corpus, "rewriteId", |rewrite| { + rewrite.inserted_byte_length += 1; + }); + }, + ); +} + +#[test] +fn strict_corpus_cross_checks_diff_fields() { + assert_chain_invalid( + "Diff deleted byte length", + "Diff deleted byte length", + |corpus| { + mutate_result_fact::(corpus, "diffId", |diff| { + diff.deleted_byte_length += 1; + }); + }, + ); +} diff --git a/native/jedit-echo-host/tests/support/replace_range_corpus_lexemes.rs b/native/jedit-echo-host/tests/support/replace_range_corpus_lexemes.rs new file mode 100644 index 00000000..8c30fc57 --- /dev/null +++ b/native/jedit-echo-host/tests/support/replace_range_corpus_lexemes.rs @@ -0,0 +1,115 @@ +use serde::de::Error as _; +use serde::{Deserialize, Deserializer, Serialize}; + +#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd, Serialize)] +#[serde(transparent)] +pub(super) struct Hex32(String); + +impl Hex32 { + pub(super) fn as_str(&self) -> &str { + &self.0 + } +} + +impl<'de> Deserialize<'de> for Hex32 { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let value = String::deserialize(deserializer)?; + let bytes = + decode_lowercase_hex(&value, "32-byte hexadecimal value").map_err(D::Error::custom)?; + if bytes.len() != 32 { + return Err(D::Error::custom( + "32-byte hexadecimal value must encode exactly 32 bytes", + )); + } + Ok(Self(value)) + } +} + +#[derive(Clone, Debug, Eq, PartialEq, Serialize)] +#[serde(transparent)] +pub(super) struct CommitSha(String); + +impl CommitSha { + pub(super) fn as_str(&self) -> &str { + &self.0 + } +} + +impl<'de> Deserialize<'de> for CommitSha { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let value = String::deserialize(deserializer)?; + let bytes = decode_lowercase_hex(&value, "commit SHA").map_err(D::Error::custom)?; + if bytes.len() != 20 { + return Err(D::Error::custom("commit SHA must encode exactly 20 bytes")); + } + Ok(Self(value)) + } +} + +#[derive(Clone, Debug, Eq, PartialEq, Serialize)] +#[serde(transparent)] +pub(super) struct HexBytes(String); + +impl HexBytes { + pub(super) fn as_str(&self) -> &str { + &self.0 + } + + pub(super) fn bytes(&self) -> Vec { + hex::decode(&self.0).expect("validated hexadecimal bytes must decode") + } +} + +impl<'de> Deserialize<'de> for HexBytes { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let value = String::deserialize(deserializer)?; + decode_lowercase_hex(&value, "hexadecimal bytes").map_err(D::Error::custom)?; + Ok(Self(value)) + } +} + +#[derive(Clone, Debug, Eq, PartialEq, Serialize)] +#[serde(transparent)] +pub(super) struct Utf8Hex(String); + +impl Utf8Hex { + pub(super) fn bytes(&self) -> Vec { + hex::decode(&self.0).expect("validated UTF-8 hexadecimal bytes must decode") + } +} + +impl<'de> Deserialize<'de> for Utf8Hex { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let value = String::deserialize(deserializer)?; + let bytes = + decode_lowercase_hex(&value, "UTF-8 hexadecimal bytes").map_err(D::Error::custom)?; + std::str::from_utf8(&bytes) + .map_err(|_| D::Error::custom("UTF-8 hexadecimal bytes must encode valid UTF-8"))?; + Ok(Self(value)) + } +} + +fn decode_lowercase_hex(value: &str, label: &str) -> Result, String> { + if !value.len().is_multiple_of(2) { + return Err(format!("{label} must contain an even number of digits")); + } + if !value + .bytes() + .all(|byte| byte.is_ascii_digit() || (b'a'..=b'f').contains(&byte)) + { + return Err(format!("{label} must contain lowercase hexadecimal only")); + } + hex::decode(value).map_err(|error| format!("{label} must decode: {error}")) +} diff --git a/native/jedit-echo-host/tests/support/replace_range_corpus_patch_tests.rs b/native/jedit-echo-host/tests/support/replace_range_corpus_patch_tests.rs new file mode 100644 index 00000000..e88573c5 --- /dev/null +++ b/native/jedit-echo-host/tests/support/replace_range_corpus_patch_tests.rs @@ -0,0 +1,178 @@ +use serde_json::Value; + +use super::{committable, mutation_error}; + +fn committable_case(corpus: &Value, index: usize) -> &Value { + corpus["cases"] + .as_array() + .expect("cases should be an array") + .iter() + .filter(|case| case["terminal"]["posture"] == "committable") + .nth(index) + .expect("requested committable case should exist") +} + +fn committable_case_mut(corpus: &mut Value, index: usize) -> &mut Value { + corpus["cases"] + .as_array_mut() + .expect("cases should be an array") + .iter_mut() + .filter(|case| case["terminal"]["posture"] == "committable") + .nth(index) + .expect("requested committable case should exist") +} + +fn patch_attachment_for_result<'a>(case: &'a Value, result_field: &str) -> &'a Value { + let node_id = case["terminal"]["result"][result_field] + .as_str() + .expect("result identifier should be a string"); + case["terminal"]["patch"] + .as_array() + .expect("patch should be an array") + .iter() + .find(|operation| operation["kind"] == "set-node-alpha" && operation["nodeId"] == node_id) + .expect("result attachment should exist in the patch") +} + +fn patch_attachment_for_result_mut<'a>(case: &'a mut Value, result_field: &str) -> &'a mut Value { + let node_id = case["terminal"]["result"][result_field] + .as_str() + .expect("result identifier should be a string") + .to_owned(); + case["terminal"]["patch"] + .as_array_mut() + .expect("patch should be an array") + .iter_mut() + .find(|operation| operation["kind"] == "set-node-alpha" && operation["nodeId"] == node_id) + .expect("result attachment should exist in the patch") +} + +#[test] +fn strict_corpus_authenticates_patch_attachment_semantics() { + super::assert_invalid("content-addressed Head attachment", |corpus| { + let target_head = committable_case(corpus, 0)["terminal"]["result"]["headId"].clone(); + let donor = patch_attachment_for_result(committable_case(corpus, 1), "headId"); + assert_ne!(donor["nodeId"], target_head); + let donor_bytes = donor["attachmentBytesHex"].clone(); + patch_attachment_for_result_mut(committable_case_mut(corpus, 0), "headId") + ["attachmentBytesHex"] = donor_bytes; + }); + + super::assert_invalid("keyed Buffer attachment", |corpus| { + let target_buffer = committable_case(corpus, 0)["terminal"]["result"]["bufferId"].clone(); + let donor = patch_attachment_for_result(committable_case(corpus, 1), "bufferId"); + assert_ne!(donor["nodeId"], target_buffer); + let donor_bytes = donor["attachmentBytesHex"].clone(); + patch_attachment_for_result_mut(committable_case_mut(corpus, 0), "bufferId") + ["attachmentBytesHex"] = donor_bytes; + }); + + super::assert_invalid("noncanonical Buffer attachment", |corpus| { + let operation = + patch_attachment_for_result_mut(committable_case_mut(corpus, 0), "bufferId"); + let bytes = operation["attachmentBytesHex"] + .as_str() + .expect("attachment bytes should be hexadecimal"); + operation["attachmentBytesHex"] = Value::String(format!("20{bytes}")); + }); + + super::assert_invalid("undecodable patch attachment", |corpus| { + patch_attachment_for_result_mut(committable_case_mut(corpus, 0), "headId") + ["attachmentBytesHex"] = Value::String("00".to_owned()); + }); + + super::assert_invalid("unsupported patch fact type", |corpus| { + let case = committable_case_mut(corpus, 0); + let node_id = case["terminal"]["result"]["headId"].clone(); + let unknown_type = Value::String("00".repeat(32)); + let mut changed = 0; + for operation in case["terminal"]["patch"] + .as_array_mut() + .expect("patch should be an array") + { + if operation["nodeId"] == node_id { + operation["typeId"] = unknown_type.clone(); + changed += 1; + } + } + assert_eq!(changed, 2, "one node and atom operation should change"); + }); +} + +#[test] +fn strict_corpus_authenticates_patch_operation_order() { + super::assert_invalid("attachment before node upsert", |corpus| { + let patch = committable(corpus)["terminal"]["patch"] + .as_array_mut() + .expect("patch should be an array"); + let attachment = patch + .iter() + .position(|operation| operation["kind"] == "set-node-alpha") + .expect("patch should contain an attachment phase"); + assert!(attachment > 0, "node upserts should precede attachments"); + assert_eq!(patch[attachment - 1]["kind"], "upsert-node"); + patch.swap(attachment - 1, attachment); + }); + + super::assert_invalid("descending node-upsert phase", |corpus| { + let patch = committable(corpus)["terminal"]["patch"] + .as_array_mut() + .expect("patch should be an array"); + assert_eq!(patch[0]["kind"], "upsert-node"); + assert_eq!(patch[1]["kind"], "upsert-node"); + let first = patch[0]["nodeId"] + .as_str() + .expect("node identifier should be a string"); + let second = patch[1]["nodeId"] + .as_str() + .expect("node identifier should be a string"); + assert!(first < second, "native node upserts should be ascending"); + patch.swap(0, 1); + }); + + super::assert_invalid("descending attachment phase", |corpus| { + let patch = committable(corpus)["terminal"]["patch"] + .as_array_mut() + .expect("patch should be an array"); + let attachment = patch + .iter() + .position(|operation| operation["kind"] == "set-node-alpha") + .expect("patch should contain an attachment phase"); + assert_eq!(patch[attachment + 1]["kind"], "set-node-alpha"); + let first = patch[attachment]["nodeId"] + .as_str() + .expect("node identifier should be a string"); + let second = patch[attachment + 1]["nodeId"] + .as_str() + .expect("node identifier should be a string"); + assert!(first < second, "native attachments should be ascending"); + patch.swap(attachment, attachment + 1); + }); +} + +fn assert_duplicate_rejected(kind: &str) { + let error = mutation_error(&format!("duplicate {kind}"), |corpus| { + let patch = committable(corpus)["terminal"]["patch"] + .as_array_mut() + .expect("patch should be an array"); + let index = patch + .iter() + .position(|operation| operation["kind"] == kind) + .expect("requested operation kind should exist"); + patch.insert(index, patch[index].clone()); + }); + assert!( + error.contains("duplicate patch operation"), + "duplicate {kind} returned {error:?}" + ); +} + +#[test] +fn strict_corpus_rejects_duplicate_node_upsert() { + assert_duplicate_rejected("upsert-node"); +} + +#[test] +fn strict_corpus_rejects_duplicate_node_attachment() { + assert_duplicate_rejected("set-node-alpha"); +} diff --git a/native/jedit-echo-host/tests/support/replace_range_corpus_result_contract.rs b/native/jedit-echo-host/tests/support/replace_range_corpus_result_contract.rs new file mode 100644 index 00000000..65cb2000 --- /dev/null +++ b/native/jedit-echo-host/tests/support/replace_range_corpus_result_contract.rs @@ -0,0 +1,314 @@ +use jedit_echo_host::records::{BufferFact, DiffFact, HeadFact, NodeIdBytes, RewriteFact}; + +use super::super::lexemes::Hex32; +use super::super::patch_fact_contract::{ + decode_buffer_fact, decode_content_fact, validate_fact, ValidatedPatch, +}; +use super::{require_equal, BasisFact, CorpusCase, ResultEvidence}; + +pub(super) fn validate_result_chain( + case: &CorpusCase, + result: &ResultEvidence, + patch: &ValidatedPatch<'_>, +) -> Result<(), String> { + require_result_roles(patch)?; + validate_basis_facts(case)?; + let basis_buffer = basis_buffer(case)?; + let basis_head = basis_head(case)?; + validate_basis(case, &basis_buffer, &basis_head)?; + + let buffer = patch.buffer("result Buffer fact", &result.buffer_id)?; + let head = patch.content::("result Head fact", &result.head_id)?; + let rewrite = patch.content::("result Rewrite fact", &result.rewrite_id)?; + let diff = patch.content::("result Diff fact", &result.diff_id)?; + validate_buffer(result, &basis_buffer, &buffer)?; + validate_head(case, result, &basis_head, &head)?; + validate_rewrite(case, result, &rewrite)?; + validate_diff(case, result, &diff)?; + validate_byte_length(case, result, &basis_head) +} + +fn validate_basis_facts(case: &CorpusCase) -> Result<(), String> { + for fact in &case.basis_facts { + validate_fact( + &format!("basis fact {}", fact.node_id.as_str()), + fact.node_id.as_str(), + fact.type_id.as_str(), + &fact.attachment_bytes_hex, + )?; + } + Ok(()) +} + +fn require_result_roles(patch: &ValidatedPatch<'_>) -> Result<(), String> { + patch.require_singleton::("result Buffer fact")?; + patch.require_singleton::("result Head fact")?; + patch.require_singleton::("result Rewrite fact")?; + patch.require_singleton::("result Diff fact") +} + +fn basis_buffer(case: &CorpusCase) -> Result { + let fact = basis_fact(case, "basis Buffer fact", &case.invocation.buffer_id)?; + decode_buffer_fact( + "basis Buffer fact", + fact.node_id.as_str(), + fact.type_id.as_str(), + &fact.attachment_bytes_hex, + ) +} + +fn basis_head(case: &CorpusCase) -> Result { + let fact = basis_fact(case, "basis Head fact", &case.invocation.basis_head_id)?; + decode_content_fact::( + "basis Head fact", + fact.node_id.as_str(), + fact.type_id.as_str(), + &fact.attachment_bytes_hex, + ) +} + +fn basis_fact<'a>( + case: &'a CorpusCase, + label: &str, + node_id: &Hex32, +) -> Result<&'a BasisFact, String> { + case.basis_facts + .iter() + .find(|fact| fact.node_id == *node_id) + .ok_or_else(|| format!("{label} is absent from basisFacts")) +} + +fn validate_basis(case: &CorpusCase, buffer: &BufferFact, head: &HeadFact) -> Result<(), String> { + require_id( + "basis Buffer canonical Head", + buffer.canonical_head_id, + &case.invocation.basis_head_id, + )?; + require_id( + "basis Head Buffer", + head.buffer_id, + &case.invocation.buffer_id, + ) +} + +fn validate_buffer( + result: &ResultEvidence, + basis: &BufferFact, + current: &BufferFact, +) -> Result<(), String> { + require_equal( + "result Buffer key", + current.buffer_key.as_str(), + basis.buffer_key.as_str(), + )?; + require_equal( + "result Buffer projection path", + ¤t.projection_path, + &basis.projection_path, + )?; + require_id( + "result Buffer canonical Head", + current.canonical_head_id, + &result.head_id, + )?; + require_equal("result Buffer version", current.version, result.version)?; + let expected = basis + .version + .checked_add(1) + .ok_or_else(|| "basis Buffer version overflows u64".to_owned())?; + require_equal( + "result Buffer version advancement", + current.version, + expected, + ) +} + +fn validate_head( + case: &CorpusCase, + result: &ResultEvidence, + basis: &HeadFact, + current: &HeadFact, +) -> Result<(), String> { + require_id("result Head Buffer", current.buffer_id, &result.buffer_id)?; + require_optional_id( + "result Head basis", + current.basis_head_id, + Some(&case.invocation.basis_head_id), + )?; + require_optional_id( + "result Head root node", + current.root_node_id, + result.root_node_id.as_ref(), + )?; + require_equal( + "result Head root digest", + hex::encode(current.root_digest), + result.root_digest.as_str().to_owned(), + )?; + for (label, actual, expected) in [ + ( + "result Head byte length", + current.byte_length, + result.byte_length, + ), + ( + "result Head UTF-16 length", + current.utf16_length, + result.utf16_length, + ), + ( + "result Head line count", + current.line_count, + result.line_count, + ), + ("result Head sequence", current.sequence, result.sequence), + ] { + require_equal(label, actual, expected)?; + } + let expected = basis + .sequence + .checked_add(1) + .ok_or_else(|| "basis Head sequence overflows u64".to_owned())?; + require_equal( + "result Head sequence advancement", + current.sequence, + expected, + ) +} + +fn validate_rewrite( + case: &CorpusCase, + result: &ResultEvidence, + rewrite: &RewriteFact, +) -> Result<(), String> { + require_id("Rewrite Buffer", rewrite.buffer_id, &result.buffer_id)?; + require_id( + "Rewrite basis Head", + rewrite.basis_head_id, + &case.invocation.basis_head_id, + )?; + require_id("Rewrite next Head", rewrite.next_head_id, &result.head_id)?; + require_equal( + "Rewrite start byte", + rewrite.start_byte, + case.invocation.start_byte, + )?; + require_equal( + "Rewrite end byte", + rewrite.end_byte, + case.invocation.end_byte, + )?; + require_equal( + "Rewrite inserted byte length", + rewrite.inserted_byte_length, + replacement_byte_length(case)?, + ) +} + +fn validate_diff( + case: &CorpusCase, + result: &ResultEvidence, + diff: &DiffFact, +) -> Result<(), String> { + require_id("Diff Rewrite", diff.rewrite_id, &result.rewrite_id)?; + require_id( + "Diff basis Head", + diff.basis_head_id, + &case.invocation.basis_head_id, + )?; + require_id("Diff next Head", diff.next_head_id, &result.head_id)?; + require_equal( + "Diff start byte", + diff.start_byte, + case.invocation.start_byte, + )?; + require_equal("Diff end byte", diff.end_byte, case.invocation.end_byte)?; + require_equal( + "Diff inserted byte length", + diff.inserted_byte_length, + replacement_byte_length(case)?, + )?; + require_equal( + "Diff deleted byte length", + diff.deleted_byte_length, + deleted_byte_length(case)?, + ) +} + +fn validate_byte_length( + case: &CorpusCase, + result: &ResultEvidence, + basis: &HeadFact, +) -> Result<(), String> { + let expected = checked_result_byte_length( + basis.byte_length, + case.invocation.start_byte, + case.invocation.end_byte, + replacement_byte_length(case)?, + )?; + require_equal( + "result byte length transition", + result.byte_length, + expected, + ) +} + +fn checked_result_byte_length( + basis_byte_length: u64, + start_byte: u64, + end_byte: u64, + replacement_byte_length: u64, +) -> Result { + let deleted_byte_length = end_byte + .checked_sub(start_byte) + .ok_or_else(|| "invocation range is reversed".to_owned())?; + if end_byte > basis_byte_length { + return Err("invocation range exceeds basis Head byte length".to_owned()); + } + let after_delete = basis_byte_length + .checked_sub(deleted_byte_length) + .ok_or_else(|| "invocation range exceeds basis Head byte length".to_owned())?; + after_delete + .checked_add(replacement_byte_length) + .ok_or_else(|| "result byte length overflows u64".to_owned()) +} + +fn replacement_byte_length(case: &CorpusCase) -> Result { + u64::try_from(case.invocation.replacement_utf8_hex.bytes().len()) + .map_err(|_| "replacement byte length exceeds u64".to_owned()) +} + +fn deleted_byte_length(case: &CorpusCase) -> Result { + case.invocation + .end_byte + .checked_sub(case.invocation.start_byte) + .ok_or_else(|| "invocation range is reversed".to_owned()) +} + +fn require_id(label: &str, actual: NodeIdBytes, expected: &Hex32) -> Result<(), String> { + require_equal(label, hex::encode(actual.0), expected.as_str().to_owned()) +} + +fn require_optional_id( + label: &str, + actual: Option, + expected: Option<&Hex32>, +) -> Result<(), String> { + require_equal( + label, + actual.map(|id| hex::encode(id.0)), + expected.map(|id| id.as_str().to_owned()), + ) +} + +#[cfg(test)] +mod tests { + use super::checked_result_byte_length; + + #[test] + fn byte_length_transition_rejects_a_range_beyond_the_basis() { + let error = checked_result_byte_length(4, 10, 11, 0) + .expect_err("a range beyond the basis must be refused"); + assert_eq!(error, "invocation range exceeds basis Head byte length"); + } +} diff --git a/native/jedit-echo-host/tests/support/replace_range_legacy.rs b/native/jedit-echo-host/tests/support/replace_range_legacy.rs new file mode 100644 index 00000000..144631f0 --- /dev/null +++ b/native/jedit-echo-host/tests/support/replace_range_legacy.rs @@ -0,0 +1,44 @@ +use jedit_echo_host::error::HostError; +use jedit_echo_host::rope::{plan_replace, ReplaceRangeFailure}; +use warp_core::{GraphStore, NodeId}; + +pub(super) fn error_projection(error: &HostError) -> (&'static str, String) { + match error { + HostError::MissingFact(message) => ("missing-fact", message.clone()), + HostError::MalformedFact(message) => ("malformed-fact", message.clone()), + HostError::InvalidRequest(message) => ("invalid-request", message.clone()), + other => panic!("oracle received unexpected host error: {other}"), + } +} + +#[allow(clippy::too_many_arguments)] +pub(super) fn assert_error_parity( + store: &GraphStore, + buffer_id: NodeId, + basis_head_id: NodeId, + start_byte: u64, + end_byte: u64, + replacement: &str, + case_id: &str, + typed: &ReplaceRangeFailure, +) { + let legacy = plan_replace( + store, + buffer_id, + basis_head_id, + start_byte, + end_byte, + replacement, + ) + .expect_err("typed obstruction must remain a legacy obstruction"); + assert_eq!( + error_projection(typed.host_error()), + error_projection(&legacy), + "{case_id} typed and legacy error projections diverged" + ); + assert_eq!( + typed.host_error().to_string(), + legacy.to_string(), + "{case_id} typed and legacy diagnostics diverged" + ); +} diff --git a/native/jedit-echo-host/tests/support/replace_range_oracle.rs b/native/jedit-echo-host/tests/support/replace_range_oracle.rs new file mode 100644 index 00000000..83ed39c6 --- /dev/null +++ b/native/jedit-echo-host/tests/support/replace_range_oracle.rs @@ -0,0 +1,488 @@ +use std::collections::BTreeSet; + +use jedit_echo_host::records::{decode_fact, BufferFact}; +use jedit_echo_host::rope::{plan_replace, plan_replace_with_reason, MutationPlan}; +use serde::Serialize; +use warp_core::{ + make_warp_id, AttachmentOwner, AttachmentPlane, AttachmentValue, Footprint, GraphStore, NodeId, + TickDelta, WarpOp, +}; + +#[path = "replace_range_basis.rs"] +mod basis; +#[path = "replace_range_consequence.rs"] +mod consequence; +#[path = "replace_range_contract.rs"] +mod contract; +#[path = "replace_range_legacy.rs"] +mod legacy; +#[path = "replace_range_source_set.rs"] +mod source_set; +#[cfg(test)] +#[path = "replace_range_oracle_tests.rs"] +mod tests; + +pub use basis::BasisSetup; +use basis::{ + apply_ops, insert_raw_content_fact, make_basis, set_fact_attachment, set_raw_fact_attachment, +}; +use consequence::{validate_consequence, ReplaceExpectation}; +pub use contract::SemanticObstructionCode; +use contract::{ + APPLICATION_SCHEMA_COORDINATE, EVIDENCE_GRADE, HISTORICAL_PLANNER_CHECKPOINT_COMMIT, + INDEPENDENCE_LIMIT, INVOCATION_SCHEMA_COORDINATE, OBSTRUCTED_PATCH_POSTURE, ORACLE_COORDINATE, + ORACLE_SCHEMA_VERSION, ORACLE_WARP_LABEL, +}; +use legacy::{assert_error_parity, error_projection}; +use source_set::{source_set, SourceSet}; + +#[derive(Clone, Copy)] +pub enum ExpectedPosture { + Success, + Obstruction { + semantic_code: SemanticObstructionCode, + error_class: &'static str, + message_fragment: &'static str, + }, +} + +pub struct CaseSpec { + pub id: &'static str, + pub purpose: &'static str, + pub initial_text: String, + pub setup: BasisSetup, + pub start_byte: u64, + pub end_byte: u64, + pub replacement: String, + pub expected: ExpectedPosture, +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +pub struct OracleCorpus { + schema_version: u32, + coordinate: &'static str, + application_schema_coordinate: &'static str, + invocation_schema_coordinate: &'static str, + historical_planner_checkpoint_commit: &'static str, + source_set: SourceSet, + evidence_grade: &'static str, + independence_limit: &'static str, + warp_id: String, + cases: Vec, +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +struct OracleCase { + id: &'static str, + purpose: &'static str, + basis_facts: Vec, + invocation: InvocationProjection, + invocation_bytes_hex: String, + terminal: TerminalProjection, +} + +#[derive(Clone, Debug, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +struct FactProjection { + node_id: String, + type_id: String, + attachment_bytes_hex: String, +} + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +struct InvocationProjection { + buffer_id: String, + basis_head_id: String, + start_byte: u64, + end_byte: u64, + replacement_utf8_hex: String, +} + +#[derive(Clone, Debug, Eq, PartialEq, Serialize)] +#[serde( + tag = "posture", + rename_all = "kebab-case", + rename_all_fields = "camelCase" +)] +enum TerminalProjection { + Committable { + footprint: FootprintProjection, + patch: Vec, + created_node_ids: Vec, + updated_node_ids: Vec, + untouched_basis_node_ids: Vec, + result: Box, + }, + Obstructed { + semantic_code: SemanticObstructionCode, + legacy_error_class: &'static str, + legacy_message: String, + parent_graph_unchanged: bool, + patch_posture: &'static str, + }, +} + +#[derive(Clone, Debug, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +struct FootprintProjection { + node_reads: Vec, + node_writes: Vec, + attachment_reads: Vec, + attachment_writes: Vec, + edge_reads: Vec, + edge_writes: Vec, +} + +#[derive(Clone, Debug, Eq, PartialEq, Serialize)] +#[serde( + tag = "kind", + rename_all = "kebab-case", + rename_all_fields = "camelCase" +)] +enum PatchOpProjection { + UpsertNode { + node_id: String, + type_id: String, + }, + SetNodeAlpha { + node_id: String, + type_id: String, + attachment_bytes_hex: String, + }, +} + +#[derive(Clone, Debug, Eq, PartialEq, Serialize)] +#[serde(rename_all = "camelCase")] +struct ResultProjection { + buffer_id: String, + head_id: String, + root_node_id: Option, + root_digest: String, + rewrite_id: String, + diff_id: String, + byte_length: u64, + utf16_length: u64, + line_count: u64, + sequence: u64, + version: u64, + materialized_text_utf8_hex: String, +} + +pub fn generate_corpus(specs: Vec) -> OracleCorpus { + let warp_id = make_warp_id(ORACLE_WARP_LABEL); + let cases = specs + .into_iter() + .map(|spec| evaluate_case(warp_id, spec)) + .collect(); + OracleCorpus { + schema_version: ORACLE_SCHEMA_VERSION, + coordinate: ORACLE_COORDINATE, + application_schema_coordinate: APPLICATION_SCHEMA_COORDINATE, + invocation_schema_coordinate: INVOCATION_SCHEMA_COORDINATE, + historical_planner_checkpoint_commit: HISTORICAL_PLANNER_CHECKPOINT_COMMIT, + source_set: source_set(), + evidence_grade: EVIDENCE_GRADE, + independence_limit: INDEPENDENCE_LIMIT, + warp_id: hex::encode(warp_id.as_bytes()), + cases, + } +} + +pub fn canonical_corpus_bytes(corpus: &OracleCorpus) -> Vec { + let mut bytes = serde_json::to_vec_pretty(corpus).expect("oracle corpus should encode"); + bytes.push(b'\n'); + bytes +} + +fn evaluate_case(warp_id: warp_core::WarpId, spec: CaseSpec) -> OracleCase { + let (store, buffer_id, canonical_head_id, invocation_basis_id) = + make_basis(warp_id, spec.id, &spec.initial_text, spec.setup); + let basis_facts = project_store(&store); + let basis_head_id = invocation_basis_id.unwrap_or(canonical_head_id); + let invocation = InvocationProjection { + buffer_id: hex::encode(buffer_id.as_bytes()), + basis_head_id: hex::encode(basis_head_id.as_bytes()), + start_byte: spec.start_byte, + end_byte: spec.end_byte, + replacement_utf8_hex: hex::encode(spec.replacement.as_bytes()), + }; + let invocation_bytes_hex = hex::encode( + serde_json::to_vec(&invocation).expect("oracle invocation should encode canonically"), + ); + let before = project_store(&store); + let first = plan_replace_with_reason( + &store, + buffer_id, + basis_head_id, + spec.start_byte, + spec.end_byte, + &spec.replacement, + ); + let after_evaluation = project_store(&store); + assert_eq!(before, after_evaluation, "{} mutated its basis", spec.id); + let terminal = match (first, spec.expected) { + (Ok(plan), ExpectedPosture::Success) => success_projection(&store, &plan, &spec), + ( + Err(error), + ExpectedPosture::Obstruction { + semantic_code, + error_class, + message_fragment, + }, + ) => { + let (actual_class, actual_message) = error_projection(error.host_error()); + let actual_semantic_code = error.reason(); + assert_error_parity( + &store, + buffer_id, + basis_head_id, + spec.start_byte, + spec.end_byte, + &spec.replacement, + spec.id, + &error, + ); + assert_eq!( + actual_semantic_code, semantic_code, + "{} semantic obstruction", + spec.id + ); + assert_eq!(actual_class, error_class, "{} error class", spec.id); + assert!( + actual_message.contains(message_fragment), + "{} error message {actual_message:?} did not contain {message_fragment:?}", + spec.id + ); + TerminalProjection::Obstructed { + semantic_code: actual_semantic_code, + legacy_error_class: error_class, + legacy_message: actual_message, + parent_graph_unchanged: before == project_store(&store), + patch_posture: OBSTRUCTED_PATCH_POSTURE, + } + } + (Ok(_), ExpectedPosture::Obstruction { .. }) => { + panic!("{} unexpectedly produced a mutation plan", spec.id) + } + (Err(error), ExpectedPosture::Success) => { + panic!("{} unexpectedly obstructed: {error}", spec.id) + } + }; + OracleCase { + id: spec.id, + purpose: spec.purpose, + basis_facts, + invocation, + invocation_bytes_hex, + terminal, + } +} + +fn success_projection( + store: &GraphStore, + plan: &MutationPlan, + spec: &CaseSpec, +) -> TerminalProjection { + let buffer: BufferFact = decode_fact( + store + .node_attachment(&plan.buffer_id) + .expect("buffer attachment should exist"), + ) + .expect("buffer should decode"); + let second = plan_replace( + store, + plan.buffer_id, + NodeId::from(buffer.canonical_head_id), + spec.start_byte, + spec.end_byte, + &spec.replacement, + ) + .expect("deterministic rerun should plan"); + let first_plan = project_plan(plan, store.warp_id()); + let second_plan = project_plan(&second, store.warp_id()); + assert_eq!(first_plan, second_plan, "{} rerun drifted", spec.id); + + let basis_ids: BTreeSet<_> = store + .iter_nodes() + .map(|(id, _)| hex::encode(id.as_bytes())) + .collect(); + let mut next = store.clone(); + apply_ops(&mut next, &first_plan.1); + let retained = validate_consequence( + store, + &next, + plan, + &first_plan.1, + ReplaceExpectation { + basis_head_id: NodeId::from(buffer.canonical_head_id), + start_byte: spec.start_byte, + end_byte: spec.end_byte, + replacement: &spec.replacement, + }, + ) + .unwrap_or_else(|error| panic!("{} retained consequence: {error}", spec.id)); + let expected_text = expected_materialized_text(spec); + assert_eq!( + retained.materialized_text, expected_text, + "{} materialized consequence violated the declared edit", + spec.id + ); + let write_ids: BTreeSet<_> = first_plan.0.node_writes.iter().cloned().collect(); + let created_node_ids = write_ids.difference(&basis_ids).cloned().collect(); + let updated_node_ids = write_ids.intersection(&basis_ids).cloned().collect(); + let untouched_basis_node_ids = basis_ids.difference(&write_ids).cloned().collect(); + TerminalProjection::Committable { + footprint: first_plan.0, + patch: first_plan + .1 + .iter() + .map(|operation| project_op(operation, store.warp_id())) + .collect::>(), + created_node_ids, + updated_node_ids, + untouched_basis_node_ids, + result: Box::new(ResultProjection { + buffer_id: hex::encode(plan.buffer_id.as_bytes()), + head_id: hex::encode(plan.head_id.as_bytes()), + root_node_id: retained.head.root_node_id.map(|id| hex::encode(id.0)), + root_digest: hex::encode(retained.head.root_digest), + rewrite_id: hex::encode(retained.rewrite_id.as_bytes()), + diff_id: hex::encode(retained.diff_id.as_bytes()), + byte_length: retained.head.byte_length, + utf16_length: retained.head.utf16_length, + line_count: retained.head.line_count, + sequence: retained.head.sequence, + version: retained.buffer.version, + materialized_text_utf8_hex: hex::encode(retained.materialized_text.as_bytes()), + }), + } +} + +fn expected_materialized_text(spec: &CaseSpec) -> String { + let start = usize::try_from(spec.start_byte).expect("successful start should fit memory"); + let end = usize::try_from(spec.end_byte).expect("successful end should fit memory"); + assert!( + spec.initial_text.is_char_boundary(start) && spec.initial_text.is_char_boundary(end), + "successful oracle range must use UTF-8 boundaries" + ); + [ + &spec.initial_text[..start], + spec.replacement.as_str(), + &spec.initial_text[end..], + ] + .concat() +} + +fn project_plan( + plan: &MutationPlan, + warp_id: warp_core::WarpId, +) -> (FootprintProjection, Vec) { + let mut footprint = Footprint::default(); + plan.extend_footprint(&mut footprint); + let mut delta = TickDelta::new(); + plan.emit(&mut delta); + (project_footprint(&footprint, warp_id), delta.finalize()) +} + +fn project_footprint(footprint: &Footprint, warp_id: warp_core::WarpId) -> FootprintProjection { + FootprintProjection { + node_reads: footprint + .n_read + .iter() + .map(|key| node_hex(key, warp_id)) + .collect(), + node_writes: footprint + .n_write + .iter() + .map(|key| node_hex(key, warp_id)) + .collect(), + attachment_reads: footprint + .a_read + .iter() + .map(|key| attachment_node_hex(key, warp_id)) + .collect(), + attachment_writes: footprint + .a_write + .iter() + .map(|key| attachment_node_hex(key, warp_id)) + .collect(), + edge_reads: footprint + .e_read + .iter() + .map(|key| edge_hex(key, warp_id)) + .collect(), + edge_writes: footprint + .e_write + .iter() + .map(|key| edge_hex(key, warp_id)) + .collect(), + } +} + +fn node_hex(key: &warp_core::NodeKey, warp_id: warp_core::WarpId) -> String { + assert_eq!( + key.warp_id, warp_id, + "oracle footprint WARP must match the corpus WARP" + ); + hex::encode(key.local_id.as_bytes()) +} + +fn edge_hex(key: &warp_core::EdgeKey, warp_id: warp_core::WarpId) -> String { + assert_eq!( + key.warp_id, warp_id, + "oracle footprint WARP must match the corpus WARP" + ); + hex::encode(key.local_id.as_bytes()) +} + +fn attachment_node_hex(key: &warp_core::AttachmentKey, warp_id: warp_core::WarpId) -> String { + assert_eq!(key.plane, AttachmentPlane::Alpha); + let AttachmentOwner::Node(node) = key.owner else { + panic!("ReplaceRange footprint must not contain edge attachments") + }; + node_hex(&node, warp_id) +} + +fn project_store(store: &GraphStore) -> Vec { + store + .iter_nodes() + .map(|(node_id, record)| { + let AttachmentValue::Atom(atom) = store + .node_attachment(node_id) + .expect("every oracle fact should have an atom attachment") + else { + panic!("oracle facts must not use descended attachments") + }; + assert_eq!(record.ty, atom.type_id); + FactProjection { + node_id: hex::encode(node_id.as_bytes()), + type_id: hex::encode(record.ty.as_bytes()), + attachment_bytes_hex: hex::encode(&atom.bytes), + } + }) + .collect() +} + +fn project_op(op: &WarpOp, warp_id: warp_core::WarpId) -> PatchOpProjection { + match op { + WarpOp::UpsertNode { node, record } => PatchOpProjection::UpsertNode { + node_id: node_hex(node, warp_id), + type_id: hex::encode(record.ty.as_bytes()), + }, + WarpOp::SetAttachment { key, value } => { + let node_id = attachment_node_hex(key, warp_id); + let Some(AttachmentValue::Atom(atom)) = value else { + panic!("ReplaceRange must set atom attachments") + }; + PatchOpProjection::SetNodeAlpha { + node_id, + type_id: hex::encode(atom.type_id.as_bytes()), + attachment_bytes_hex: hex::encode(&atom.bytes), + } + } + _ => panic!("ReplaceRange emitted an unsupported graph operation"), + } +} diff --git a/native/jedit-echo-host/tests/support/replace_range_oracle_tests.rs b/native/jedit-echo-host/tests/support/replace_range_oracle_tests.rs new file mode 100644 index 00000000..7d9e7741 --- /dev/null +++ b/native/jedit-echo-host/tests/support/replace_range_oracle_tests.rs @@ -0,0 +1,391 @@ +use super::*; +use std::cell::Cell; + +use jedit_echo_host::error::HostError; +use jedit_echo_host::records::{fact_bytes, HeadFact}; +use jedit_echo_host::rope::GraphFacts; +use warp_core::{make_type_id, NodeRecord}; + +struct ReadBudgetGraphFacts<'a> { + store: &'a GraphStore, + remaining_node_reads: Cell, +} + +impl GraphFacts for ReadBudgetGraphFacts<'_> { + fn warp_id(&self) -> warp_core::WarpId { + self.store.warp_id() + } + + fn node(&self, id: &NodeId) -> Option<&NodeRecord> { + let remaining = self.remaining_node_reads.get(); + assert!( + remaining > 0, + "cyclic retained rope exceeded the deterministic read budget" + ); + self.remaining_node_reads.set(remaining - 1); + self.store.node(id) + } + + fn attachment(&self, id: &NodeId) -> Option<&AttachmentValue> { + self.store.node_attachment(id) + } +} + +#[test] +fn planner_refuses_a_cyclic_right_endpoint_before_exhausting_its_read_budget() { + let warp_id = make_warp_id("oracle-cyclic-right-endpoint"); + let (store, buffer_id, basis_head_id, _) = make_basis( + warp_id, + "cyclic-right-endpoint", + "abc", + BasisSetup::CyclicRightEndpoint, + ); + let bounded = ReadBudgetGraphFacts { + store: &store, + remaining_node_reads: Cell::new(32), + }; + + let failure = plan_replace_with_reason(&bounded, buffer_id, basis_head_id, 3, 3, "x") + .expect_err("a cyclic retained rope must not produce a MutationPlan"); + + assert_eq!(failure.reason(), SemanticObstructionCode::FactMalformed); + assert!(matches!(failure.host_error(), HostError::MalformedFact(_))); +} + +#[test] +#[should_panic(expected = "oracle footprint WARP must match the corpus WARP")] +fn footprint_projection_rejects_a_foreign_node_read() { + let expected = make_warp_id("oracle-local"); + let mut footprint = Footprint::default(); + footprint + .n_read + .insert_with_warp(make_warp_id("oracle-foreign"), NodeId([0xA5; 32])); + + project_footprint(&footprint, expected); +} + +#[test] +#[should_panic(expected = "oracle footprint WARP must match the corpus WARP")] +fn footprint_projection_rejects_a_foreign_attachment_write() { + let expected = make_warp_id("oracle-local"); + let mut footprint = Footprint::default(); + footprint + .a_write + .insert(warp_core::AttachmentKey::node_alpha(warp_core::NodeKey { + warp_id: make_warp_id("oracle-foreign"), + local_id: NodeId([0xA5; 32]), + })); + + project_footprint(&footprint, expected); +} + +#[test] +#[should_panic(expected = "oracle footprint WARP must match the corpus WARP")] +fn patch_projection_rejects_a_foreign_node_write() { + let expected = make_warp_id("oracle-local"); + let operation = WarpOp::UpsertNode { + node: warp_core::NodeKey { + warp_id: make_warp_id("oracle-foreign"), + local_id: NodeId([0xA5; 32]), + }, + record: warp_core::NodeRecord { + ty: warp_core::make_type_id("oracle.foreign"), + }, + }; + + project_op(&operation, expected); +} + +#[test] +fn obstruction_semantics_come_from_the_typed_planner_reason() { + let warp_id = make_warp_id("oracle-typed-obstruction"); + let (store, buffer_id, basis_head_id, _) = + make_basis(warp_id, "typed-obstruction", "abc", BasisSetup::Plain); + let failure = plan_replace_with_reason(&store, buffer_id, basis_head_id, 2, 1, "x") + .expect_err("reversed range must obstruct"); + + assert_eq!(failure.reason(), SemanticObstructionCode::RangeOrderInvalid); +} + +#[test] +fn planner_rejects_a_basis_head_owned_by_another_buffer() { + let warp_id = make_warp_id("oracle-basis-head-buffer"); + let (mut store, buffer_id, _, foreign_head_id) = + make_basis(warp_id, "basis-head-buffer", "abc", BasisSetup::ForeignHead); + let foreign_head_id = foreign_head_id.expect("foreign Head should exist"); + let mut buffer: BufferFact = decode_fact( + store + .node_attachment(&buffer_id) + .expect("target Buffer should exist"), + ) + .expect("target Buffer should decode"); + buffer.canonical_head_id = foreign_head_id.into(); + set_fact_attachment(&mut store, buffer_id, &buffer); + + let failure = plan_replace_with_reason(&store, buffer_id, foreign_head_id, 0, 0, "x") + .expect_err("a Head owned by another Buffer must not produce a MutationPlan"); + + assert_eq!(failure.reason(), SemanticObstructionCode::FactMalformed); + assert!(matches!(failure.host_error(), HostError::MalformedFact(_))); +} + +#[test] +fn planner_rejects_a_basis_head_with_mismatched_content_identity() { + let warp_id = make_warp_id("oracle-basis-head-identity"); + let (mut store, buffer_id, basis_head_id, _) = + make_basis(warp_id, "basis-head-identity", "abc", BasisSetup::Plain); + let mut basis_head: HeadFact = decode_fact( + store + .node_attachment(&basis_head_id) + .expect("basis Head should exist"), + ) + .expect("basis Head should decode"); + basis_head.root_digest[0] ^= 0xFF; + set_fact_attachment(&mut store, basis_head_id, &basis_head); + + let failure = plan_replace_with_reason(&store, buffer_id, basis_head_id, 0, 0, "x") + .expect_err("misaddressed basis Head bytes must not produce a MutationPlan"); + + assert_eq!( + failure.reason(), + SemanticObstructionCode::ContentIdentityMismatch + ); + assert!(matches!(failure.host_error(), HostError::MalformedFact(_))); +} + +#[test] +fn planner_rejects_whitespace_prefixed_basis_head_bytes() { + let warp_id = make_warp_id("oracle-basis-head-whitespace"); + let (mut store, buffer_id, basis_head_id, _) = + make_basis(warp_id, "basis-head-whitespace", "abc", BasisSetup::Plain); + let basis_head: HeadFact = decode_fact( + store + .node_attachment(&basis_head_id) + .expect("basis Head should exist"), + ) + .expect("basis Head should decode"); + let mut noncanonical_bytes = vec![b' ']; + noncanonical_bytes.extend(fact_bytes(&basis_head).expect("basis Head should encode")); + set_raw_fact_attachment::(&mut store, basis_head_id, noncanonical_bytes); + + let failure = plan_replace_with_reason(&store, buffer_id, basis_head_id, 0, 0, "x") + .expect_err("whitespace-prefixed basis Head bytes must not produce a MutationPlan"); + + assert_eq!( + failure.reason(), + SemanticObstructionCode::ContentIdentityMismatch + ); + assert!(matches!(failure.host_error(), HostError::MalformedFact(_))); +} + +#[test] +fn planner_rejects_an_unknown_basis_head_member() { + let warp_id = make_warp_id("oracle-basis-head-unknown-member"); + let (mut store, buffer_id, basis_head_id, _) = make_basis( + warp_id, + "basis-head-unknown-member", + "abc", + BasisSetup::Plain, + ); + let basis_head: HeadFact = decode_fact( + store + .node_attachment(&basis_head_id) + .expect("basis Head should exist"), + ) + .expect("basis Head should decode"); + let mut noncanonical_bytes = fact_bytes(&basis_head).expect("basis Head should encode"); + assert_eq!(noncanonical_bytes.pop(), Some(b'}')); + noncanonical_bytes.extend(br#","unexpected":true}"#); + set_raw_fact_attachment::(&mut store, basis_head_id, noncanonical_bytes); + + let failure = plan_replace_with_reason(&store, buffer_id, basis_head_id, 0, 0, "x") + .expect_err("an unknown basis Head member must not produce a MutationPlan"); + + assert_eq!( + failure.reason(), + SemanticObstructionCode::ContentIdentityMismatch + ); + assert!(matches!(failure.host_error(), HostError::MalformedFact(_))); +} + +#[test] +fn planner_authenticates_invalid_basis_head_bytes_before_decoding() { + let warp_id = make_warp_id("oracle-basis-head-invalid-json"); + let (mut store, buffer_id, basis_head_id, _) = + make_basis(warp_id, "basis-head-invalid-json", "abc", BasisSetup::Plain); + set_raw_fact_attachment::(&mut store, basis_head_id, b"{".to_vec()); + + let failure = plan_replace_with_reason(&store, buffer_id, basis_head_id, 0, 0, "x") + .expect_err("invalid basis Head bytes must not be decoded before authentication"); + + assert_eq!( + failure.reason(), + SemanticObstructionCode::ContentIdentityMismatch + ); + assert!(matches!(failure.host_error(), HostError::MalformedFact(_))); +} + +#[test] +fn planner_rejects_content_addressed_noncanonical_basis_head_bytes() { + let warp_id = make_warp_id("oracle-basis-head-addressed-noncanonical"); + let (mut store, buffer_id, basis_head_id, _) = make_basis( + warp_id, + "basis-head-addressed-noncanonical", + "abc", + BasisSetup::Plain, + ); + let basis_head: HeadFact = decode_fact( + store + .node_attachment(&basis_head_id) + .expect("basis Head should exist"), + ) + .expect("basis Head should decode"); + let mut noncanonical_bytes = fact_bytes(&basis_head).expect("basis Head should encode"); + assert_eq!(noncanonical_bytes.pop(), Some(b'}')); + noncanonical_bytes.extend(br#","unexpected":true}"#); + let noncanonical_head_id = insert_raw_content_fact::(&mut store, noncanonical_bytes); + let mut buffer: BufferFact = decode_fact( + store + .node_attachment(&buffer_id) + .expect("target Buffer should exist"), + ) + .expect("target Buffer should decode"); + buffer.canonical_head_id = noncanonical_head_id.into(); + set_fact_attachment(&mut store, buffer_id, &buffer); + + let failure = plan_replace_with_reason(&store, buffer_id, noncanonical_head_id, 0, 0, "x") + .expect_err("content-addressed noncanonical Head bytes must not produce a plan"); + + assert_eq!(failure.reason(), SemanticObstructionCode::FactMalformed); + assert!(matches!(failure.host_error(), HostError::MalformedFact(_))); +} + +#[test] +fn planner_rejects_a_basis_head_with_the_wrong_node_type() { + let warp_id = make_warp_id("oracle-basis-head-node-type"); + let (mut store, buffer_id, basis_head_id, _) = + make_basis(warp_id, "basis-head-node-type", "abc", BasisSetup::Plain); + store.insert_node( + basis_head_id, + NodeRecord { + ty: make_type_id("jedit.text.DeliberatelyWrong.v1"), + }, + ); + + assert_planner_fact_malformed(&store, buffer_id, basis_head_id); +} + +#[test] +fn planner_rejects_a_basis_head_with_the_wrong_atom_type() { + let warp_id = make_warp_id("oracle-basis-head-atom-type"); + let (mut store, buffer_id, basis_head_id, _) = + make_basis(warp_id, "basis-head-atom-type", "abc", BasisSetup::Plain); + let basis_head: HeadFact = decode_fact( + store + .node_attachment(&basis_head_id) + .expect("basis Head should exist"), + ) + .expect("basis Head should decode"); + store.set_node_attachment( + basis_head_id, + Some(AttachmentValue::Atom(warp_core::AtomPayload::new( + make_type_id("jedit.text.DeliberatelyWrong.v1"), + fact_bytes(&basis_head) + .expect("basis Head should encode") + .into(), + ))), + ); + + assert_planner_fact_malformed(&store, buffer_id, basis_head_id); +} + +#[test] +fn planner_rejects_a_descended_basis_head_attachment() { + let warp_id = make_warp_id("oracle-basis-head-descended"); + let (mut store, buffer_id, basis_head_id, _) = + make_basis(warp_id, "basis-head-descended", "abc", BasisSetup::Plain); + store.set_node_attachment( + basis_head_id, + Some(AttachmentValue::Descend(make_warp_id( + "oracle-basis-head-child", + ))), + ); + + assert_planner_fact_malformed(&store, buffer_id, basis_head_id); +} + +fn assert_planner_fact_malformed(store: &GraphStore, buffer_id: NodeId, basis_head_id: NodeId) { + let failure = plan_replace_with_reason(store, buffer_id, basis_head_id, 0, 0, "x") + .expect_err("a structurally malformed basis Head must not produce a MutationPlan"); + + assert_eq!(failure.reason(), SemanticObstructionCode::FactMalformed); + assert!(matches!(failure.host_error(), HostError::MalformedFact(_))); +} + +#[test] +fn oracle_support_contains_no_diagnostic_semantic_classifier() { + let sources = [ + include_str!("replace_range_oracle.rs"), + include_str!("replace_range_legacy.rs"), + include_str!("replace_range_contract.rs"), + ]; + for forbidden in [ + "fn semantic_obstruction(", + "starts_with(\"replace range \")", + "starts_with(\"stale replace basis \")", + "contains(\"content hash does not match\")", + "start_byte > end_byte", + ] { + assert!( + sources.iter().all(|source| !source.contains(forbidden)), + "oracle support reintroduced diagnostic semantic classifier {forbidden:?}" + ); + } +} + +#[test] +fn obstruction_projection_rejects_a_false_expected_semantic_code() { + let spec = CaseSpec { + id: "false-semantic-code", + purpose: "negative semantic-obstruction witness", + initial_text: "abc".to_owned(), + setup: BasisSetup::Plain, + start_byte: 2, + end_byte: 1, + replacement: "x".to_owned(), + expected: ExpectedPosture::Obstruction { + semantic_code: SemanticObstructionCode::RangeOutOfBounds, + error_class: "invalid-request", + message_fragment: "exceeds", + }, + }; + + assert!( + std::panic::catch_unwind(|| evaluate_case(make_warp_id("oracle-semantic"), spec)).is_err(), + "oracle accepted a semantic code that did not describe the observed failure" + ); +} + +#[test] +fn success_projection_rejects_a_consequence_that_violates_the_declared_edit() { + let warp_id = make_warp_id("oracle-expected-text"); + let (store, buffer_id, basis_head_id, _) = + make_basis(warp_id, "expected-text", "abc", BasisSetup::Plain); + let plan = plan_replace(&store, buffer_id, basis_head_id, 1, 2, "XY") + .expect("replacement should plan"); + let mismatched_spec = CaseSpec { + id: "false-materialized-text", + purpose: "negative materialized-consequence witness", + initial_text: "uvw".to_owned(), + setup: BasisSetup::Plain, + start_byte: 1, + end_byte: 2, + replacement: "XY".to_owned(), + expected: ExpectedPosture::Success, + }; + + assert!( + std::panic::catch_unwind(|| success_projection(&store, &plan, &mismatched_spec)).is_err(), + "oracle accepted a consequence that violated the declared text edit" + ); +} diff --git a/native/jedit-echo-host/tests/support/replace_range_patch_fact_contract.rs b/native/jedit-echo-host/tests/support/replace_range_patch_fact_contract.rs new file mode 100644 index 00000000..205ac898 --- /dev/null +++ b/native/jedit-echo-host/tests/support/replace_range_patch_fact_contract.rs @@ -0,0 +1,301 @@ +use std::collections::{BTreeMap, BTreeSet}; + +use jedit_echo_host::identity::{content_node_id, parse_node_id}; +use jedit_echo_host::records::{ + fact_bytes, fact_type_id, BlobFact, BranchFact, BufferFact, ContentAddressedFact, DiffFact, + HeadFact, LeafFact, RewriteFact, TypedFact, +}; +use jedit_echo_host::rope::buffer_node_id; +use serde::{Deserialize, Serialize}; +use warp_core::NodeId; + +use super::lexemes::{Hex32, HexBytes}; + +#[derive(Debug, Deserialize, Serialize)] +#[serde( + tag = "kind", + rename_all = "kebab-case", + rename_all_fields = "camelCase", + deny_unknown_fields +)] +pub(super) enum PatchOperation { + UpsertNode { + node_id: Hex32, + type_id: Hex32, + }, + SetNodeAlpha { + node_id: Hex32, + type_id: Hex32, + attachment_bytes_hex: HexBytes, + }, +} + +pub(super) struct ValidatedPatch<'a> { + attachments: BTreeMap<&'a str, (&'a str, &'a HexBytes)>, +} + +impl ValidatedPatch<'_> { + pub(super) fn buffer(&self, label: &str, node_id: &Hex32) -> Result { + let (type_id, bytes) = self.entry(label, node_id)?; + decode_buffer_fact(label, node_id.as_str(), type_id, bytes) + } + + pub(super) fn content( + &self, + label: &str, + node_id: &Hex32, + ) -> Result { + let (type_id, bytes) = self.entry(label, node_id)?; + decode_content_fact::(label, node_id.as_str(), type_id, bytes) + } + + pub(super) fn require_singleton(&self, label: &str) -> Result<(), String> { + let expected_type = type_id_hex::(); + let count = self + .attachments + .values() + .filter(|(type_id, _)| *type_id == expected_type) + .count(); + if count != 1 { + return Err(format!( + "patch must contain exactly one {label}; found {count}" + )); + } + Ok(()) + } + + fn entry(&self, label: &str, node_id: &Hex32) -> Result<(&str, &HexBytes), String> { + self.attachments + .get(node_id.as_str()) + .copied() + .ok_or_else(|| format!("{label} is absent from the patch")) + } +} + +pub(super) fn validate_patch<'a>( + patch: &'a [PatchOperation], + writes: &BTreeSet<&str>, +) -> Result, String> { + let mut upserts = BTreeMap::new(); + let mut attachments = BTreeMap::new(); + for operation in patch { + match operation { + PatchOperation::UpsertNode { node_id, type_id } => { + insert_unique(&mut upserts, node_id.as_str(), type_id.as_str())?; + } + PatchOperation::SetNodeAlpha { + node_id, + type_id, + attachment_bytes_hex, + } => { + insert_unique( + &mut attachments, + node_id.as_str(), + (type_id.as_str(), attachment_bytes_hex), + )?; + } + } + } + require_targets("patch upsert targets", upserts.keys(), writes)?; + require_targets("patch attachment targets", attachments.keys(), writes)?; + validate_patch_order(patch)?; + for (node_id, upsert_type) in upserts { + let (atom_type, attachment_bytes) = attachments + .get(node_id) + .copied() + .expect("attachment target equality was already checked"); + if upsert_type != atom_type { + return Err(format!( + "patch node and atom type differ for {node_id}: {upsert_type} != {atom_type}" + )); + } + validate_fact( + &format!("patch fact {node_id}"), + node_id, + upsert_type, + attachment_bytes, + )?; + } + Ok(ValidatedPatch { attachments }) +} + +fn validate_patch_order(patch: &[PatchOperation]) -> Result<(), String> { + let mut attachment_phase = false; + let mut previous_upsert = None; + let mut previous_attachment = None; + for operation in patch { + match operation { + PatchOperation::UpsertNode { node_id, .. } => { + if attachment_phase { + return Err("patch node upsert follows an attachment".to_owned()); + } + require_ascending("node upsert", &mut previous_upsert, node_id.as_str())?; + } + PatchOperation::SetNodeAlpha { node_id, .. } => { + attachment_phase = true; + require_ascending("attachment", &mut previous_attachment, node_id.as_str())?; + } + } + } + Ok(()) +} + +pub(super) fn validate_fact( + label: &str, + node_id: &str, + type_id: &str, + attachment_bytes: &HexBytes, +) -> Result<(), String> { + if type_id == type_id_hex::() { + return decode_buffer_fact(label, node_id, type_id, attachment_bytes).map(drop); + } + if type_id == type_id_hex::() { + return decode_content_fact::(label, node_id, type_id, attachment_bytes) + .map(drop); + } + if type_id == type_id_hex::() { + return decode_content_fact::(label, node_id, type_id, attachment_bytes) + .map(drop); + } + if type_id == type_id_hex::() { + return decode_content_fact::(label, node_id, type_id, attachment_bytes) + .map(drop); + } + if type_id == type_id_hex::() { + return decode_content_fact::(label, node_id, type_id, attachment_bytes) + .map(drop); + } + if type_id == type_id_hex::() { + return decode_content_fact::(label, node_id, type_id, attachment_bytes) + .map(drop); + } + if type_id == type_id_hex::() { + return decode_content_fact::(label, node_id, type_id, attachment_bytes) + .map(drop); + } + Err(format!( + "{label} has unsupported ReplaceRange fact type {type_id}" + )) +} + +pub(super) fn decode_buffer_fact( + label: &str, + node_id: &str, + type_id: &str, + attachment_bytes: &HexBytes, +) -> Result { + require_declared_type::(label, type_id)?; + let fact: BufferFact = decode_canonical(label, attachment_bytes)?; + require_node_id(label, node_id, buffer_node_id(&fact.buffer_key))?; + Ok(fact) +} + +pub(super) fn decode_content_fact( + label: &str, + node_id: &str, + type_id: &str, + attachment_bytes: &HexBytes, +) -> Result { + require_declared_type::(label, type_id)?; + let expected = content_node_id(F::ID_DOMAIN, &attachment_bytes.bytes()); + require_node_id(label, node_id, expected)?; + let fact: F = decode_canonical(label, attachment_bytes)?; + Ok(fact) +} + +fn decode_canonical(label: &str, attachment_bytes: &HexBytes) -> Result { + let bytes = attachment_bytes.bytes(); + let fact: F = serde_json::from_slice(&bytes) + .map_err(|error| format!("{label} attachment cannot decode: {error}"))?; + let canonical = fact_bytes(&fact).map_err(|error| error.to_string())?; + if canonical != bytes { + return Err(format!("{label} attachment bytes are not canonical")); + } + Ok(fact) +} + +fn require_node_id(label: &str, claimed: &str, expected: NodeId) -> Result<(), String> { + let claimed = parse_node_id(claimed).map_err(|error| error.to_string())?; + if claimed != expected { + return Err(format!( + "{label} attachment identity does not match its node" + )); + } + Ok(()) +} + +fn require_declared_type(label: &str, actual: &str) -> Result<(), String> { + if actual != type_id_hex::() { + return Err(format!( + "{label} does not identify the declared {}", + F::TYPE_LABEL + )); + } + Ok(()) +} + +fn require_ascending<'a>( + label: &str, + previous: &mut Option<&'a str>, + current: &'a str, +) -> Result<(), String> { + if previous.is_some_and(|value| value >= current) { + return Err(format!( + "patch {label} targets are not in ascending node identity order" + )); + } + *previous = Some(current); + Ok(()) +} + +fn type_id_hex() -> String { + hex::encode(fact_type_id::().as_bytes()) +} + +fn insert_unique<'a, T>( + values: &mut BTreeMap<&'a str, T>, + node_id: &'a str, + value: T, +) -> Result<(), String> { + if values.insert(node_id, value).is_some() { + return Err(format!("duplicate patch operation for {node_id}")); + } + Ok(()) +} + +fn require_targets<'a>( + label: &str, + actual: impl Iterator, + expected: &BTreeSet<&'a str>, +) -> Result<(), String> { + let actual = actual.copied().collect::>(); + if actual != *expected { + return Err(format!( + "{label} differ: expected {expected:?}, received {actual:?}" + )); + } + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::{decode_content_fact, type_id_hex, HeadFact, HexBytes}; + + #[test] + fn content_fact_authenticates_raw_bytes_before_decoding() { + let malformed: HexBytes = + serde_json::from_str("\"00\"").expect("one byte is valid hexadecimal input"); + let error = decode_content_fact::( + "result Head fact", + &"00".repeat(32), + &type_id_hex::(), + &malformed, + ) + .expect_err("misaddressed malformed bytes must fail closed"); + + assert_eq!( + error, + "result Head fact attachment identity does not match its node" + ); + } +} diff --git a/native/jedit-echo-host/tests/support/replace_range_schema.rs b/native/jedit-echo-host/tests/support/replace_range_schema.rs new file mode 100644 index 00000000..fa736b4f --- /dev/null +++ b/native/jedit-echo-host/tests/support/replace_range_schema.rs @@ -0,0 +1,366 @@ +use jedit_echo_host::records::{ + BlobFact, BranchFact, BufferFact, ContentAddressedFact, DiffFact, HeadFact, LeafFact, + RewriteFact, TypedFact, BLOB_CONTENT_HASH_DOMAIN, BUFFER_NODE_ID_DOMAIN, + EMPTY_ROOT_DIGEST_DOMAIN, +}; +use jedit_echo_host::rope::MAX_LEAF_BYTES; +use serde_json::{json, Value}; + +#[path = "replace_range_contract.rs"] +mod contract; + +use contract::{ + SemanticObstructionCode, APPLICATION_SCHEMA_COORDINATE, HISTORICAL_PLANNER_CHECKPOINT_ROLE, + INVOCATION_SCHEMA_COORDINATE, OBSTRUCTED_PATCH_POSTURE, ORACLE_COORDINATE, +}; + +pub const SCHEMA_COORDINATE: &str = APPLICATION_SCHEMA_COORDINATE; +pub const PUBLISHED_TYPE_ID_DOMAIN: &[u8] = b"type:"; +pub const STRING_ESCAPE_VECTOR: &str = concat!( + "\u{0000}\u{0001}\u{0002}\u{0003}\u{0004}\u{0005}\u{0006}\u{0007}", + "\u{0008}\u{0009}\u{000a}\u{000b}\u{000c}\u{000d}\u{000e}\u{000f}", + "\u{0010}\u{0011}\u{0012}\u{0013}\u{0014}\u{0015}\u{0016}\u{0017}", + "\u{0018}\u{0019}\u{001a}\u{001b}\u{001c}\u{001d}\u{001e}\u{001f}", + "\"\\/猫\u{2028}\u{2029}\u{10ffff}" +); +const STRING_ESCAPE_VECTOR_JSON_HEX: &str = concat!( + "225c75303030305c75303030315c75303030325c75303030335c7530303034", + "5c75303030355c75303030365c75303030375c625c745c6e5c7530303062", + "5c665c725c75303030655c75303030665c75303031305c75303031315c7530", + "3031325c75303031335c75303031345c75303031355c75303031365c753030", + "31375c75303031385c75303031395c75303031615c75303031625c75303031", + "635c75303031645c75303031655c75303031665c225c5c2fe78cabe280a8e2", + "80a9f48fbfbf22" +); + +pub fn expected_schema() -> Value { + json!({ + "schemaVersion": 1, + "coordinate": SCHEMA_COORDINATE, + "factCodec": { + "profile": "jedit.compact-serde-json.v1", + "encoding": "utf-8", + "byteOrderMark": "forbidden", + "insignificantWhitespace": "forbidden", + "objectMemberOrder": "declared-field-order", + "unsignedInteger": "decimal-no-leading-zeroes", + "optionalIdentifier": "null-or-array-32-u8", + "identifier": "array-32-u8", + "byteString": "array-u8", + "stringEscaping": { + "quotationMark": "backslash-quotation-mark", + "reverseSolidus": "backslash-reverse-solidus", + "shortEscapes": { + "u0008": "backslash-b", + "u0009": "backslash-t", + "u000a": "backslash-n", + "u000c": "backslash-f", + "u000d": "backslash-r" + }, + "otherU0000ThroughU001f": "backslash-u00xx-lowercase-hex", + "solidus": "literal", + "otherU0020ThroughU10ffff": "literal-utf8-unicode-scalars", + "surrogateEscapes": "forbidden", + "goldenVector": { + "sourceUtf8Hex": hex::encode(STRING_ESCAPE_VECTOR.as_bytes()), + "jsonStringUtf8Hex": STRING_ESCAPE_VECTOR_JSON_HEX + } + }, + "forbiddenValues": [ + "map-valued-fields", + "floats", + "signed-integers", + "duplicate-members", + "unknown-members" + ] + }, + "graphEncoding": { + "node": "typed-node", + "attachment": { + "key": "node-alpha", + "value": "atom", + "atomType": "node-type", + "payload": "canonical-fact-bytes" + }, + "edges": "none" + }, + "identityLaws": { + "typeId": { + "algorithm": "blake3-256", + "domainHex": hex::encode(PUBLISHED_TYPE_ID_DOMAIN), + "material": "type-label-utf8" + }, + "bufferNode": { + "algorithm": "blake3-256", + "domainHex": hex::encode(BUFFER_NODE_ID_DOMAIN), + "material": "buffer-key-utf8" + }, + "contentFact": { + "algorithm": "blake3-256", + "material": "fact-domain || canonical-fact-bytes" + }, + "blobContent": { + "algorithm": "blake3-256", + "domainHex": hex::encode(BLOB_CONTENT_HASH_DOMAIN), + "material": "blob-bytes" + }, + "emptyRootDigest": { + "algorithm": "blake3-256", + "domainHex": hex::encode(EMPTY_ROOT_DIGEST_DOMAIN), + "material": "empty-bytes" + } + }, + "ropeLaw": { + "aggregateValidation": { + "scope": "descended-paths-only", + "retainedSubtreeMetrics": "residual-trust-may-propagate-incorrect-utf16-length-and-line-breaks" + }, + "coordinateType": "u64", + "range": "half-open-utf8-byte", + "replacement": "utf8-bytes", + "maxLeafBytes": MAX_LEAF_BYTES, + "leafChunkBoundary": "largest-utf8-boundary-at-or-before-limit", + "leafSlices": "may-share-blob-with-nonzero-byte-start", + "lineCount": "line-breaks-plus-one-including-empty", + "nonemptyRootDigest": "root-node-id", + "persistence": "path-copy-no-delete", + "emittedOperations": ["upsert-node", "set-node-alpha"] + }, + "oracleInvocation": { + "coordinate": INVOCATION_SCHEMA_COORDINATE, + "posture": "finite-corpus-input-not-runtime-abi", + "encoding": "compact-utf8-json", + "objectMemberOrder": [ + "bufferId", + "basisHeadId", + "startByte", + "endByte", + "replacementUtf8Hex" + ], + "fields": [ + {"name": "bufferId", "type": "lowercase-hex-node-id-32"}, + {"name": "basisHeadId", "type": "lowercase-hex-node-id-32"}, + {"name": "startByte", "type": "u64-json-decimal"}, + {"name": "endByte", "type": "u64-json-decimal"}, + {"name": "replacementUtf8Hex", "type": "lowercase-hex-utf8-bytes"} + ], + "canonicalBytesField": "invocationBytesHex" + }, + "oracleCorpus": { + "coordinate": ORACLE_COORDINATE, + "encoding": "pretty-utf8-json-final-newline", + "unknownMembers": "forbidden", + "localIdentifierQualification": "every footprint and patch identifier is qualified by top-level warpId", + "objectMemberOrder": [ + "schemaVersion", + "coordinate", + "applicationSchemaCoordinate", + "invocationSchemaCoordinate", + "historicalPlannerCheckpointCommit", + "sourceSet", + "evidenceGrade", + "independenceLimit", + "warpId", + "cases" + ], + "historicalPlannerCheckpointRole": HISTORICAL_PLANNER_CHECKPOINT_ROLE, + "sourceSetMemberOrder": [ + "algorithm", + "domainHex", + "framing", + "paths", + "digestHex" + ], + "caseMemberOrder": [ + "id", + "purpose", + "basisFacts", + "invocation", + "invocationBytesHex", + "terminal" + ], + "basisFactMemberOrder": [ + "nodeId", + "typeId", + "attachmentBytesHex" + ], + "terminal": { + "discriminant": "posture", + "committableMemberOrder": [ + "posture", + "footprint", + "patch", + "createdNodeIds", + "updatedNodeIds", + "untouchedBasisNodeIds", + "result" + ], + "obstructedMemberOrder": [ + "posture", + "semanticCode", + "legacyErrorClass", + "legacyMessage", + "parentGraphUnchanged", + "patchPosture" + ], + "semanticCodes": SemanticObstructionCode::ALL + .iter() + .map(|code| code.as_str()) + .collect::>(), + "obstructedPatchPosture": OBSTRUCTED_PATCH_POSTURE + }, + "footprintMemberOrder": [ + "nodeReads", + "nodeWrites", + "attachmentReads", + "attachmentWrites", + "edgeReads", + "edgeWrites" + ], + "patchVariants": [ + { + "kind": "upsert-node", + "memberOrder": ["kind", "nodeId", "typeId"] + }, + { + "kind": "set-node-alpha", + "memberOrder": [ + "kind", + "nodeId", + "typeId", + "attachmentBytesHex" + ] + } + ], + "resultMemberOrder": [ + "bufferId", + "headId", + "rootNodeId", + "rootDigest", + "rewriteId", + "diffId", + "byteLength", + "utf16Length", + "lineCount", + "sequence", + "version", + "materializedTextUtf8Hex" + ] + }, + "facts": [ + fact_declaration::( + "Buffer", + json!({ + "kind": "keyed", + "domainHex": hex::encode(BUFFER_NODE_ID_DOMAIN), + "material": "buffer_key utf8" + }), + &[ + ("buffer_key", "utf8-string"), + ("projection_path", "optional-utf8-string"), + ("canonical_head_id", "node-id-32"), + ("version", "u64") + ] + ), + content_fact_declaration::( + "Blob", + &[("content_hash", "digest-32"), ("bytes", "bytes")] + ), + content_fact_declaration::( + "Leaf", + &[ + ("blob_id", "node-id-32"), + ("byte_start", "u64"), + ("byte_length", "u64"), + ("utf16_length", "u64"), + ("line_breaks", "u64") + ] + ), + content_fact_declaration::( + "Branch", + &[ + ("left", "node-id-32"), + ("right", "node-id-32"), + ("byte_length", "u64"), + ("utf16_length", "u64"), + ("line_breaks", "u64"), + ("height", "u32") + ] + ), + content_fact_declaration::( + "Head", + &[ + ("buffer_id", "node-id-32"), + ("basis_head_id", "optional-node-id-32"), + ("root_node_id", "optional-node-id-32"), + ("byte_length", "u64"), + ("utf16_length", "u64"), + ("line_count", "u64"), + ("root_digest", "digest-32"), + ("sequence", "u64") + ] + ), + content_fact_declaration::( + "Rewrite", + &[ + ("buffer_id", "node-id-32"), + ("basis_head_id", "node-id-32"), + ("next_head_id", "node-id-32"), + ("start_byte", "u64"), + ("end_byte", "u64"), + ("inserted_byte_length", "u64") + ] + ), + content_fact_declaration::( + "Diff", + &[ + ("rewrite_id", "node-id-32"), + ("basis_head_id", "node-id-32"), + ("next_head_id", "node-id-32"), + ("start_byte", "u64"), + ("end_byte", "u64"), + ("inserted_byte_length", "u64"), + ("deleted_byte_length", "u64") + ] + ) + ], + "excludedPropositions": [ + "jedit.text.RopeStructuralMaintenance", + "jedit.text.RopeCheckpoint", + "jedit.text.RopeCheckpointAnchored", + "receipt-attribution-fields", + "structural-echo-edges", + "typed-diff-spans" + ], + "migrationPosture": { + "nativeJsonV1": "authoritative", + "typescriptGraphRope": "not-an-alternate-encoding", + "codecOrStructuralChange": "new-schema-coordinate-and-admitted-migration" + } + }) +} + +fn fact_declaration(name: &str, identity: Value, fields: &[(&str, &str)]) -> Value { + json!({ + "name": name, + "typeLabel": T::TYPE_LABEL, + "identity": identity, + "fields": fields + .iter() + .map(|(field, kind)| json!({"name": field, "type": kind})) + .collect::>() + }) +} + +fn content_fact_declaration(name: &str, fields: &[(&str, &str)]) -> Value { + fact_declaration::( + name, + json!({ + "kind": "content-addressed", + "algorithm": "blake3-256", + "domainHex": hex::encode(T::ID_DOMAIN), + "material": "domain || canonical-fact-bytes" + }), + fields, + ) +} diff --git a/native/jedit-echo-host/tests/support/replace_range_source_set.rs b/native/jedit-echo-host/tests/support/replace_range_source_set.rs new file mode 100644 index 00000000..e12fa60b --- /dev/null +++ b/native/jedit-echo-host/tests/support/replace_range_source_set.rs @@ -0,0 +1,129 @@ +use serde::Serialize; +use sha2::{Digest, Sha256}; + +pub const SOURCE_SET_ALGORITHM: &str = "sha256"; +pub const SOURCE_SET_DOMAIN: &[u8] = b"jedit.replace-range.oracle-source.v1\0"; +pub const SOURCE_SET_FRAMING: &str = + "domain || repeated(u32be-path-length || path-utf8 || u64be-byte-length || bytes)"; +const SOURCE_SET_FILES: &[(&str, &[u8])] = &[ + ( + "native/jedit-echo-host/Cargo.toml", + include_bytes!("../../Cargo.toml"), + ), + ( + "native/jedit-echo-host/Cargo.lock", + include_bytes!("../../Cargo.lock"), + ), + ( + "native/jedit-echo-host/src/error.rs", + include_bytes!("../../src/error.rs"), + ), + ( + "native/jedit-echo-host/src/identity.rs", + include_bytes!("../../src/identity.rs"), + ), + ( + "native/jedit-echo-host/src/records.rs", + include_bytes!("../../src/records.rs"), + ), + ( + "native/jedit-echo-host/src/rope.rs", + include_bytes!("../../src/rope.rs"), + ), + ( + "native/jedit-echo-host/src/rope/fact_read.rs", + include_bytes!("../../src/rope/fact_read.rs"), + ), + ( + "native/jedit-echo-host/src/rope/fault.rs", + include_bytes!("../../src/rope/fault.rs"), + ), + ( + "native/jedit-echo-host/src/rope/replace.rs", + include_bytes!("../../src/rope/replace.rs"), + ), + ( + "native/jedit-echo-host/src/rope/tree.rs", + include_bytes!("../../src/rope/tree.rs"), + ), + ( + "native/jedit-echo-host/src/rope/window.rs", + include_bytes!("../../src/rope/window.rs"), + ), + ( + "native/jedit-echo-host/tests/replace_range_oracle.rs", + include_bytes!("../replace_range_oracle.rs"), + ), + ( + "native/jedit-echo-host/tests/support/replace_range_basis.rs", + include_bytes!("replace_range_basis.rs"), + ), + ( + "native/jedit-echo-host/tests/support/replace_range_basis_witness.rs", + include_bytes!("replace_range_basis_witness.rs"), + ), + ( + "native/jedit-echo-host/tests/support/replace_range_contract.rs", + include_bytes!("replace_range_contract.rs"), + ), + ( + "native/jedit-echo-host/tests/support/replace_range_consequence.rs", + include_bytes!("replace_range_consequence.rs"), + ), + ( + "native/jedit-echo-host/tests/support/replace_range_consequence_tests.rs", + include_bytes!("replace_range_consequence_tests.rs"), + ), + ( + "native/jedit-echo-host/tests/support/replace_range_legacy.rs", + include_bytes!("replace_range_legacy.rs"), + ), + ( + "native/jedit-echo-host/tests/support/replace_range_oracle.rs", + include_bytes!("replace_range_oracle.rs"), + ), + ( + "native/jedit-echo-host/tests/support/replace_range_oracle_tests.rs", + include_bytes!("replace_range_oracle_tests.rs"), + ), + ( + "native/jedit-echo-host/tests/support/replace_range_source_set.rs", + include_bytes!("replace_range_source_set.rs"), + ), +]; + +#[derive(Serialize)] +#[serde(rename_all = "camelCase")] +pub struct SourceSet { + pub algorithm: &'static str, + pub domain_hex: String, + pub framing: &'static str, + pub paths: Vec<&'static str>, + pub digest_hex: String, +} + +pub fn source_set() -> SourceSet { + SourceSet { + algorithm: SOURCE_SET_ALGORITHM, + domain_hex: hex::encode(SOURCE_SET_DOMAIN), + framing: SOURCE_SET_FRAMING, + paths: expected_source_paths(), + digest_hex: expected_source_digest_hex(), + } +} + +pub fn expected_source_paths() -> Vec<&'static str> { + SOURCE_SET_FILES.iter().map(|(path, _)| *path).collect() +} + +pub fn expected_source_digest_hex() -> String { + let mut digest = Sha256::new(); + digest.update(SOURCE_SET_DOMAIN); + for (path, bytes) in SOURCE_SET_FILES { + digest.update((path.len() as u32).to_be_bytes()); + digest.update(path.as_bytes()); + digest.update((bytes.len() as u64).to_be_bytes()); + digest.update(bytes); + } + hex::encode(digest.finalize()) +} diff --git a/native/jedit-echo-host/tests/support/resource_fixture.rs b/native/jedit-echo-host/tests/support/resource_fixture.rs new file mode 100644 index 00000000..2b7cb7fb --- /dev/null +++ b/native/jedit-echo-host/tests/support/resource_fixture.rs @@ -0,0 +1,53 @@ +use std::ffi::OsStr; +use std::fs; +use std::path::Path; + +use sha2::{Digest, Sha256}; + +pub fn checked_sha256(value: &str) -> &str { + let digest = value + .strip_suffix('\n') + .expect("digest resource should end with exactly one newline"); + assert_eq!(digest.len(), 64, "digest should contain 64 characters"); + assert!( + digest + .bytes() + .all(|byte| byte.is_ascii_digit() || (b'a'..=b'f').contains(&byte)), + "digest should contain lowercase hexadecimal only" + ); + digest +} + +pub fn sha256_hex(bytes: &[u8]) -> String { + hex::encode(Sha256::digest(bytes)) +} + +pub fn update_resource_pair( + env_name: &str, + resource_path: &Path, + digest_path: &Path, + bytes: &[u8], +) -> bool { + match std::env::var_os(env_name) { + None => false, + Some(value) if value == OsStr::new("1") => { + write_atomically(resource_path, bytes); + let digest = format!("{}\n", sha256_hex(bytes)); + write_atomically(digest_path, digest.as_bytes()); + true + } + Some(value) => { + panic!("{env_name} must be exactly 1 to update fixtures, received {value:?}") + } + } +} + +fn write_atomically(path: &Path, bytes: &[u8]) { + let file_name = path + .file_name() + .and_then(OsStr::to_str) + .expect("resource path should have a UTF-8 file name"); + let temporary = path.with_file_name(format!(".{file_name}.{}.tmp", std::process::id())); + fs::write(&temporary, bytes).expect("temporary resource should write"); + fs::rename(&temporary, path).expect("temporary resource should replace destination"); +} diff --git a/package.json b/package.json index ab7efe28..d0490ecb 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,8 @@ "scripts": { "echo:build": "cargo build --manifest-path native/jedit-echo-host/Cargo.toml", "echo:test": "cargo test --manifest-path native/jedit-echo-host/Cargo.toml", + "lawpack:replace-range:check": "cargo test --locked --manifest-path native/jedit-echo-host/Cargo.toml --test replace_range_schema && cargo test --locked --manifest-path native/jedit-echo-host/Cargo.toml --test replace_range_oracle && cargo test --locked --manifest-path native/jedit-echo-host/Cargo.toml --test replace_range_schema_conformance && cargo test --locked --manifest-path native/jedit-echo-host/Cargo.toml --test replace_range_corpus_conformance", + "lawpack:replace-range:update": "JEDIT_UPDATE_REPLACE_RANGE_SCHEMA=1 cargo test --locked --manifest-path native/jedit-echo-host/Cargo.toml --test replace_range_schema published_schema_and_codec_vectors_regenerate_byte_for_byte -- --exact --test-threads=1 && JEDIT_UPDATE_REPLACE_RANGE_ORACLE=1 cargo test --locked --manifest-path native/jedit-echo-host/Cargo.toml --test replace_range_oracle replace_range_oracle_matches_the_committed_corpus -- --exact --test-threads=1 && npm run lawpack:replace-range:check", "dev": "npm run echo:build && tsx src/main.ts", "clean": "node scripts/clean-dist.mjs", "build": "npm run echo:build && npm run clean && tsc -p tsconfig.json && node scripts/copy-assets.mjs", diff --git a/tests/replace-range-law-cycle.spec.mjs b/tests/replace-range-law-cycle.spec.mjs new file mode 100644 index 00000000..5ce7b30a --- /dev/null +++ b/tests/replace-range-law-cycle.spec.mjs @@ -0,0 +1,538 @@ +import assert from "node:assert/strict"; +import crypto from "node:crypto"; +import fs from "node:fs"; +import path from "node:path"; +import test from "node:test"; + +import { + CHANGED_SECTION, + FINAL_AUDIT_EVIDENCE_LOCATIONS, + PROVED_SECTION, +} from "./support/replace-range-audit-ledger.mjs"; + +const DESIGN_PATH = path.join( + process.cwd(), + "docs", + "design", + "0158-replace-range-canonical-fact-law.md", +); +const ORACLE_SUPPORT_PATH = path.join( + process.cwd(), + "native", + "jedit-echo-host", + "tests", + "support", +); +const RECORDS_PATH = path.join( + process.cwd(), + "native", + "jedit-echo-host", + "src", + "records.rs", +); +const ROPE_FACADE_PATH = path.join( + process.cwd(), + "native", + "jedit-echo-host", + "src", + "rope.rs", +); +const RETAINED_FACT_READER_PATH = path.join( + process.cwd(), + "native", + "jedit-echo-host", + "src", + "rope", + "fact_read.rs", +); +const LAWPACK_PATH = path.join( + process.cwd(), + "contracts", + "jedit", + "lawpacks", + "replace-range-v1", +); +const PUBLISHED_ARTIFACTS = [ + "text-schema-v1.json", + "codec-vectors-v1.json", + "replace-range-v1.oracle.json", +]; + +function readDesign() { + return fs.readFileSync(DESIGN_PATH, "utf8"); +} + +function currentTruth(design = readDesign()) { + const parts = design.split("## Current Truth"); + assert.equal(parts.length, 2, "expected one Current Truth section"); + return parts[1].split("## Problem")[0]; +} + +function artifactDigestClaim(design) { + const retrospective = design.split("## Retrospective")[1]; + const marker = "- **Artifact digest ledger.** "; + const parts = retrospective.split(marker); + assert.equal(parts.length, 2, "expected one artifact digest ledger claim"); + return parts[1].split("\n- **")[0].replaceAll(/\s+/g, " ").trim(); +} + +function assertArtifactDigestLedger(design = readDesign()) { + const actualDigests = new Map(); + let oracleBytes; + + for (const fileName of PUBLISHED_ARTIFACTS) { + const artifactPath = path.join(LAWPACK_PATH, fileName); + const artifactBytes = fs.readFileSync(artifactPath); + const actualDigest = crypto + .createHash("sha256") + .update(artifactBytes) + .digest("hex"); + const sidecarPath = artifactPath.replace(/\.json$/, ".sha256"); + const publishedDigest = fs.readFileSync(sidecarPath, "utf8").trim(); + + assert.equal(publishedDigest, actualDigest, `${fileName} sidecar drifted`); + actualDigests.set(fileName, actualDigest); + if (fileName === "replace-range-v1.oracle.json") { + oracleBytes = artifactBytes; + } + } + + assert.ok( + oracleBytes, + "oracle artifact must be present in the published set", + ); + const sourceSetDigest = JSON.parse(oracleBytes).sourceSet.digestHex; + const mapping = + /^The published SHA-256 digests are `(?[a-f0-9]{64})` for the schema, `(?[a-f0-9]{64})` for codec vectors, and `(?[a-f0-9]{64})` for the oracle\. The oracle source-set digest is `(?[a-f0-9]{64})`\./.exec( + artifactDigestClaim(design), + ); + assert.ok(mapping, "artifact digest ledger drift"); + assert.deepEqual( + [ + mapping.groups.schema, + mapping.groups.codec, + mapping.groups.oracle, + mapping.groups.sourceSet, + ], + [ + actualDigests.get("text-schema-v1.json"), + actualDigests.get("codec-vectors-v1.json"), + actualDigests.get("replace-range-v1.oracle.json"), + sourceSetDigest, + ], + "artifact digest ledger drift", + ); +} + +function retrospectiveClaims(design = readDesign()) { + const retrospectiveParts = design.split("## Retrospective"); + assert.equal(retrospectiveParts.length, 2, "expected one Retrospective"); + const changedParts = retrospectiveParts[1].split( + "What changed from the design:", + ); + assert.equal(changedParts.length, 2, "expected one changed-design marker"); + const openParts = changedParts[1].split("What remains open:"); + assert.equal(openParts.length, 2, "expected one remaining-work marker"); + + const claims = []; + let currentClaim; + let currentSection = CHANGED_SECTION; + let testsProvedMarkers = 0; + for (const line of openParts[0].split(/\r?\n/)) { + if (line === "") { + currentClaim = undefined; + continue; + } + if (line === "What the tests proved:") { + testsProvedMarkers += 1; + currentSection = PROVED_SECTION; + currentClaim = undefined; + continue; + } + if (line.startsWith("- ")) { + const match = + /^- \*\*(?[^*]+)\.\*\* (?\S.*)$/.exec(line); + assert.ok(match, `unlabeled retrospective claim: ${line}`); + assertPlainEvidenceProse(match.groups.claimText); + currentClaim = { + citations: [], + evidenceClass: match.groups.evidenceClass, + section: currentSection, + }; + claims.push(currentClaim); + continue; + } + + assert.ok(currentClaim, `unsupported retrospective syntax: ${line}`); + assert.doesNotMatch( + line, + /^\s*(?:#{1,6}\s|[-+*]\s|\d+[.)]\s|>|```|~~~|\||=+\s*$|(?:(?:\*\s*){3,}|(?:_\s*){3,}|(?:-\s*){3,})$)/, + `unsupported retrospective syntax: ${line}`, + ); + assert.match(line, /^ \S/, `unsupported retrospective syntax: ${line}`); + const citation = parseEvidenceCitation(line); + if (citation) { + currentClaim.citations.push(citation); + } + } + assert.equal(testsProvedMarkers, 1, "expected one tests-proved marker"); + return claims; +} + +function evidenceCitation([commit, sourcePath, line]) { + return { + label: `${sourcePath}#L${line}@${commit}`, + url: `https://github.com/flyingrobots/jedit/blob/${commit}/${sourcePath}#L${line}`, + }; +} + +function parseEvidenceCitation(line) { + const match = + /^ \[`(?