@veraanchor/verifier 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/CONTRIBUTING.md +33 -0
- package/LICENSE +21 -0
- package/NOTICE +4 -0
- package/README.md +263 -2
- package/SECURITY.md +21 -0
- package/dist/cli/commandV1.d.ts +5 -0
- package/dist/cli/commandV1.d.ts.map +1 -0
- package/dist/cli/commandV1.js +440 -0
- package/dist/cli/commandV1.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +5 -0
- package/dist/cli.js.map +1 -0
- package/dist/contracts/verification.d.ts +77 -0
- package/dist/contracts/verification.d.ts.map +1 -0
- package/dist/contracts/verification.js +6 -0
- package/dist/contracts/verification.js.map +1 -0
- package/dist/crypto/sha3.d.ts +15 -0
- package/dist/crypto/sha3.d.ts.map +1 -0
- package/dist/crypto/sha3.js +27 -0
- package/dist/crypto/sha3.js.map +1 -0
- package/dist/crypto/streamSha3.d.ts +26 -0
- package/dist/crypto/streamSha3.d.ts.map +1 -0
- package/dist/crypto/streamSha3.js +52 -0
- package/dist/crypto/streamSha3.js.map +1 -0
- package/dist/hf/hashContractV1.d.ts +48 -0
- package/dist/hf/hashContractV1.d.ts.map +1 -0
- package/dist/hf/hashContractV1.js +185 -0
- package/dist/hf/hashContractV1.js.map +1 -0
- package/dist/index.d.ts +80 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/merkle/membership.d.ts +30 -0
- package/dist/merkle/membership.d.ts.map +1 -0
- package/dist/merkle/membership.js +105 -0
- package/dist/merkle/membership.js.map +1 -0
- package/dist/policy/contractV1.d.ts +37 -0
- package/dist/policy/contractV1.d.ts.map +1 -0
- package/dist/policy/contractV1.js +2 -0
- package/dist/policy/contractV1.js.map +1 -0
- package/dist/policy/evaluateV1.d.ts +24 -0
- package/dist/policy/evaluateV1.d.ts.map +1 -0
- package/dist/policy/evaluateV1.js +320 -0
- package/dist/policy/evaluateV1.js.map +1 -0
- package/dist/profiles/dataset/sourceV1.d.ts +22 -0
- package/dist/profiles/dataset/sourceV1.d.ts.map +1 -0
- package/dist/profiles/dataset/sourceV1.js +73 -0
- package/dist/profiles/dataset/sourceV1.js.map +1 -0
- package/dist/profiles/dataset/v1.d.ts +39 -0
- package/dist/profiles/dataset/v1.d.ts.map +1 -0
- package/dist/profiles/dataset/v1.js +362 -0
- package/dist/profiles/dataset/v1.js.map +1 -0
- package/dist/profiles/execution/contractV1.d.ts +279 -0
- package/dist/profiles/execution/contractV1.d.ts.map +1 -0
- package/dist/profiles/execution/contractV1.js +364 -0
- package/dist/profiles/execution/contractV1.js.map +1 -0
- package/dist/profiles/execution/independentStandardsV1.d.ts +44 -0
- package/dist/profiles/execution/independentStandardsV1.d.ts.map +1 -0
- package/dist/profiles/execution/independentStandardsV1.js +336 -0
- package/dist/profiles/execution/independentStandardsV1.js.map +1 -0
- package/dist/profiles/execution/reasonCodesV1.d.ts +30 -0
- package/dist/profiles/execution/reasonCodesV1.d.ts.map +1 -0
- package/dist/profiles/execution/reasonCodesV1.js +20 -0
- package/dist/profiles/execution/reasonCodesV1.js.map +1 -0
- package/dist/profiles/execution/recomputationV1.d.ts +11 -0
- package/dist/profiles/execution/recomputationV1.d.ts.map +1 -0
- package/dist/profiles/execution/recomputationV1.js +144 -0
- package/dist/profiles/execution/recomputationV1.js.map +1 -0
- package/dist/profiles/execution/rulesV1.d.ts +6 -0
- package/dist/profiles/execution/rulesV1.d.ts.map +1 -0
- package/dist/profiles/execution/rulesV1.js +855 -0
- package/dist/profiles/execution/rulesV1.js.map +1 -0
- package/dist/profiles/execution/standardsPlanV1.d.ts +18 -0
- package/dist/profiles/execution/standardsPlanV1.d.ts.map +1 -0
- package/dist/profiles/execution/standardsPlanV1.js +16 -0
- package/dist/profiles/execution/standardsPlanV1.js.map +1 -0
- package/dist/profiles/execution/verificationV1.d.ts +28 -0
- package/dist/profiles/execution/verificationV1.d.ts.map +1 -0
- package/dist/profiles/execution/verificationV1.js +188 -0
- package/dist/profiles/execution/verificationV1.js.map +1 -0
- package/dist/profiles/ingest/sourceV1.d.ts +36 -0
- package/dist/profiles/ingest/sourceV1.d.ts.map +1 -0
- package/dist/profiles/ingest/sourceV1.js +99 -0
- package/dist/profiles/ingest/sourceV1.js.map +1 -0
- package/dist/profiles/ingest/v1.d.ts +65 -0
- package/dist/profiles/ingest/v1.d.ts.map +1 -0
- package/dist/profiles/ingest/v1.js +477 -0
- package/dist/profiles/ingest/v1.js.map +1 -0
- package/dist/profiles/sourceV1Helpers.d.ts +48 -0
- package/dist/profiles/sourceV1Helpers.d.ts.map +1 -0
- package/dist/profiles/sourceV1Helpers.js +141 -0
- package/dist/profiles/sourceV1Helpers.js.map +1 -0
- package/dist/reports/coreV1.d.ts +7 -0
- package/dist/reports/coreV1.d.ts.map +1 -0
- package/dist/reports/coreV1.js +195 -0
- package/dist/reports/coreV1.js.map +1 -0
- package/dist/reports/portableV1.d.ts +48 -0
- package/dist/reports/portableV1.d.ts.map +1 -0
- package/dist/reports/portableV1.js +279 -0
- package/dist/reports/portableV1.js.map +1 -0
- package/dist/reports/validationV1.d.ts +19 -0
- package/dist/reports/validationV1.d.ts.map +1 -0
- package/dist/reports/validationV1.js +441 -0
- package/dist/reports/validationV1.js.map +1 -0
- package/dist/resolvers/executionMirrorV1.d.ts +15 -0
- package/dist/resolvers/executionMirrorV1.d.ts.map +1 -0
- package/dist/resolvers/executionMirrorV1.js +206 -0
- package/dist/resolvers/executionMirrorV1.js.map +1 -0
- package/dist/resolvers/explorerExecutionV1.d.ts +17 -0
- package/dist/resolvers/explorerExecutionV1.d.ts.map +1 -0
- package/dist/resolvers/explorerExecutionV1.js +61 -0
- package/dist/resolvers/explorerExecutionV1.js.map +1 -0
- package/dist/resolvers/explorerPublicV1.d.ts +37 -0
- package/dist/resolvers/explorerPublicV1.d.ts.map +1 -0
- package/dist/resolvers/explorerPublicV1.js +210 -0
- package/dist/resolvers/explorerPublicV1.js.map +1 -0
- package/dist/resolvers/explorerPublicationV1.d.ts +20 -0
- package/dist/resolvers/explorerPublicationV1.d.ts.map +1 -0
- package/dist/resolvers/explorerPublicationV1.js +195 -0
- package/dist/resolvers/explorerPublicationV1.js.map +1 -0
- package/dist/resolvers/explorerTransportV1.d.ts +17 -0
- package/dist/resolvers/explorerTransportV1.d.ts.map +1 -0
- package/dist/resolvers/explorerTransportV1.js +112 -0
- package/dist/resolvers/explorerTransportV1.js.map +1 -0
- package/dist/resolvers/hcs11MirrorV1.d.ts +49 -0
- package/dist/resolvers/hcs11MirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hcs11MirrorV1.js +293 -0
- package/dist/resolvers/hcs11MirrorV1.js.map +1 -0
- package/dist/resolvers/hcs13MirrorV1.d.ts +35 -0
- package/dist/resolvers/hcs13MirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hcs13MirrorV1.js +72 -0
- package/dist/resolvers/hcs13MirrorV1.js.map +1 -0
- package/dist/resolvers/hcs1MirrorV1.d.ts +28 -0
- package/dist/resolvers/hcs1MirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hcs1MirrorV1.js +220 -0
- package/dist/resolvers/hcs1MirrorV1.js.map +1 -0
- package/dist/resolvers/hcs26MirrorV1.d.ts +67 -0
- package/dist/resolvers/hcs26MirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hcs26MirrorV1.js +218 -0
- package/dist/resolvers/hcs26MirrorV1.js.map +1 -0
- package/dist/resolvers/hcs26RegistryMirrorV1.d.ts +26 -0
- package/dist/resolvers/hcs26RegistryMirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hcs26RegistryMirrorV1.js +200 -0
- package/dist/resolvers/hcs26RegistryMirrorV1.js.map +1 -0
- package/dist/resolvers/hcs2MirrorV1.d.ts +26 -0
- package/dist/resolvers/hcs2MirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hcs2MirrorV1.js +196 -0
- package/dist/resolvers/hcs2MirrorV1.js.map +1 -0
- package/dist/resolvers/hederaMirrorV1.d.ts +22 -0
- package/dist/resolvers/hederaMirrorV1.d.ts.map +1 -0
- package/dist/resolvers/hederaMirrorV1.js +338 -0
- package/dist/resolvers/hederaMirrorV1.js.map +1 -0
- package/dist/standards/hcs/hcs11V1.d.ts +51 -0
- package/dist/standards/hcs/hcs11V1.d.ts.map +1 -0
- package/dist/standards/hcs/hcs11V1.js +289 -0
- package/dist/standards/hcs/hcs11V1.js.map +1 -0
- package/dist/standards/hcs/hcs13V1.d.ts +39 -0
- package/dist/standards/hcs/hcs13V1.d.ts.map +1 -0
- package/dist/standards/hcs/hcs13V1.js +114 -0
- package/dist/standards/hcs/hcs13V1.js.map +1 -0
- package/dist/standards/hcs/hcs14V1.d.ts +35 -0
- package/dist/standards/hcs/hcs14V1.d.ts.map +1 -0
- package/dist/standards/hcs/hcs14V1.js +168 -0
- package/dist/standards/hcs/hcs14V1.js.map +1 -0
- package/dist/standards/hcs/hcs1V1.d.ts +30 -0
- package/dist/standards/hcs/hcs1V1.d.ts.map +1 -0
- package/dist/standards/hcs/hcs1V1.js +140 -0
- package/dist/standards/hcs/hcs1V1.js.map +1 -0
- package/dist/standards/hcs/hcs26V1.d.ts +58 -0
- package/dist/standards/hcs/hcs26V1.d.ts.map +1 -0
- package/dist/standards/hcs/hcs26V1.js +339 -0
- package/dist/standards/hcs/hcs26V1.js.map +1 -0
- package/dist/standards/hcs/hcs2V1.d.ts +36 -0
- package/dist/standards/hcs/hcs2V1.d.ts.map +1 -0
- package/dist/standards/hcs/hcs2V1.js +181 -0
- package/dist/standards/hcs/hcs2V1.js.map +1 -0
- package/dist/standards/hcs/jsonCanonicalV1.d.ts +15 -0
- package/dist/standards/hcs/jsonCanonicalV1.d.ts.map +1 -0
- package/dist/standards/hcs/jsonCanonicalV1.js +160 -0
- package/dist/standards/hcs/jsonCanonicalV1.js.map +1 -0
- package/dist/triangulation/compareV1.d.ts +50 -0
- package/dist/triangulation/compareV1.d.ts.map +1 -0
- package/dist/triangulation/compareV1.js +236 -0
- package/dist/triangulation/compareV1.js.map +1 -0
- package/dist/triangulation/executionPlanV1.d.ts +39 -0
- package/dist/triangulation/executionPlanV1.d.ts.map +1 -0
- package/dist/triangulation/executionPlanV1.js +208 -0
- package/dist/triangulation/executionPlanV1.js.map +1 -0
- package/dist/triangulation/executionPublicV1.d.ts +22 -0
- package/dist/triangulation/executionPublicV1.d.ts.map +1 -0
- package/dist/triangulation/executionPublicV1.js +39 -0
- package/dist/triangulation/executionPublicV1.js.map +1 -0
- package/dist/triangulation/messageObservationV1.d.ts +26 -0
- package/dist/triangulation/messageObservationV1.d.ts.map +1 -0
- package/dist/triangulation/messageObservationV1.js +69 -0
- package/dist/triangulation/messageObservationV1.js.map +1 -0
- package/dist/triangulation/publicV1.d.ts +29 -0
- package/dist/triangulation/publicV1.d.ts.map +1 -0
- package/dist/triangulation/publicV1.js +170 -0
- package/dist/triangulation/publicV1.js.map +1 -0
- package/dist/verification/sourceIntentV1.d.ts +15 -0
- package/dist/verification/sourceIntentV1.d.ts.map +1 -0
- package/dist/verification/sourceIntentV1.js +206 -0
- package/dist/verification/sourceIntentV1.js.map +1 -0
- package/docs/cli-v0.1.md +237 -0
- package/docs/conformance.md +38 -0
- package/docs/threat-model.md +37 -0
- package/docs/verification-semantics.md +65 -0
- package/examples/README.md +35 -0
- package/examples/dataset-offline.mjs +58 -0
- package/examples/dataset-policy.mjs +59 -0
- package/package.json +65 -4
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/** Internal bounded, strict I-JSON/JCS substrate for pinned open HCS schemas/skills.
|
|
2
|
+
* Do not use this as a generic JSON Schema evaluator or as an authenticated source.
|
|
3
|
+
*/
|
|
4
|
+
export class HcsJsonV1Error extends Error {
|
|
5
|
+
code;
|
|
6
|
+
constructor(code) {
|
|
7
|
+
super(code);
|
|
8
|
+
this.code = code;
|
|
9
|
+
this.name = "HcsJsonV1Error";
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
function invalid(code) { throw new HcsJsonV1Error(code); }
|
|
13
|
+
function plain(value) {
|
|
14
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
15
|
+
return false;
|
|
16
|
+
const proto = Object.getPrototypeOf(value);
|
|
17
|
+
return proto === Object.prototype || proto === null;
|
|
18
|
+
}
|
|
19
|
+
function validUnicode(value) {
|
|
20
|
+
return !/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u.test(value);
|
|
21
|
+
}
|
|
22
|
+
/** Canonical JSON ordering uses ECMAScript UTF-16 code-unit order as required by RFC 8785. */
|
|
23
|
+
export function canonicalHcsJsonV1(value, maxBytes) {
|
|
24
|
+
const seen = new Set();
|
|
25
|
+
let visited = 0;
|
|
26
|
+
const walk = (item, depth) => {
|
|
27
|
+
if (++visited > 100_000 || depth > 64)
|
|
28
|
+
return invalid("JSON_TOO_LARGE");
|
|
29
|
+
if (item === null)
|
|
30
|
+
return "null";
|
|
31
|
+
if (typeof item === "string") {
|
|
32
|
+
if (!validUnicode(item))
|
|
33
|
+
return invalid("JSON_INVALID");
|
|
34
|
+
return JSON.stringify(item);
|
|
35
|
+
}
|
|
36
|
+
if (typeof item === "boolean")
|
|
37
|
+
return item ? "true" : "false";
|
|
38
|
+
if (typeof item === "number") {
|
|
39
|
+
if (!Number.isFinite(item))
|
|
40
|
+
return invalid("JSON_INVALID");
|
|
41
|
+
return JSON.stringify(item);
|
|
42
|
+
}
|
|
43
|
+
if (!item || typeof item !== "object" || seen.has(item))
|
|
44
|
+
return invalid("JSON_INVALID");
|
|
45
|
+
if (!Array.isArray(item) && !plain(item))
|
|
46
|
+
return invalid("JSON_INVALID");
|
|
47
|
+
seen.add(item);
|
|
48
|
+
let result;
|
|
49
|
+
if (Array.isArray(item)) {
|
|
50
|
+
result = `[${item.map((child) => walk(child, depth + 1)).join(",")}]`;
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
const object = item;
|
|
54
|
+
result = `{${Object.keys(object).sort().map((key) => `${walk(key, depth + 1)}:${walk(object[key], depth + 1)}`).join(",")}}`;
|
|
55
|
+
}
|
|
56
|
+
seen.delete(item);
|
|
57
|
+
if (Buffer.byteLength(result, "utf8") > maxBytes)
|
|
58
|
+
return invalid("JSON_TOO_LARGE");
|
|
59
|
+
return result;
|
|
60
|
+
};
|
|
61
|
+
return walk(value, 0);
|
|
62
|
+
}
|
|
63
|
+
/** Parse after strict UTF-8 decoding and before any canonicalization.
|
|
64
|
+
* Duplicate property names (including Unicode escape aliases) are rejected.
|
|
65
|
+
*/
|
|
66
|
+
export function parseStrictHcsJsonV1(value, maxBytes) {
|
|
67
|
+
let text;
|
|
68
|
+
try {
|
|
69
|
+
text = typeof value === "string" ? value : new TextDecoder("utf-8", { fatal: true }).decode(value);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return invalid("JSON_INVALID");
|
|
73
|
+
}
|
|
74
|
+
if (Buffer.byteLength(text, "utf8") > maxBytes)
|
|
75
|
+
return invalid("JSON_TOO_LARGE");
|
|
76
|
+
let result;
|
|
77
|
+
try {
|
|
78
|
+
result = JSON.parse(text);
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return invalid("JSON_INVALID");
|
|
82
|
+
}
|
|
83
|
+
// JSON.parse silently retains the last occurrence of duplicate keys. Check the
|
|
84
|
+
// source independently instead of canonically hashing an ambiguous object.
|
|
85
|
+
let index = 0;
|
|
86
|
+
const space = () => { while (index < text.length && /\s/.test(text[index]))
|
|
87
|
+
index++; };
|
|
88
|
+
const quoted = () => {
|
|
89
|
+
const start = index++;
|
|
90
|
+
while (index < text.length) {
|
|
91
|
+
if (text[index] === "\\") {
|
|
92
|
+
index += 2;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (text[index++] === '"')
|
|
96
|
+
return JSON.parse(text.slice(start, index));
|
|
97
|
+
}
|
|
98
|
+
return invalid("JSON_INVALID");
|
|
99
|
+
};
|
|
100
|
+
let nodes = 0;
|
|
101
|
+
const visit = (depth) => {
|
|
102
|
+
if (++nodes > 100_000 || depth > 64)
|
|
103
|
+
return invalid("JSON_TOO_LARGE");
|
|
104
|
+
space();
|
|
105
|
+
if (text[index] === "{") {
|
|
106
|
+
index++;
|
|
107
|
+
space();
|
|
108
|
+
const keys = new Set();
|
|
109
|
+
while (text[index] !== "}") {
|
|
110
|
+
const key = quoted();
|
|
111
|
+
if (keys.has(key))
|
|
112
|
+
return invalid("JSON_AMBIGUOUS");
|
|
113
|
+
keys.add(key);
|
|
114
|
+
space();
|
|
115
|
+
if (text[index++] !== ":")
|
|
116
|
+
return invalid("JSON_INVALID");
|
|
117
|
+
visit(depth + 1);
|
|
118
|
+
space();
|
|
119
|
+
if (text[index] !== ",")
|
|
120
|
+
break;
|
|
121
|
+
index++;
|
|
122
|
+
space();
|
|
123
|
+
}
|
|
124
|
+
if (text[index++] !== "}")
|
|
125
|
+
return invalid("JSON_INVALID");
|
|
126
|
+
}
|
|
127
|
+
else if (text[index] === "[") {
|
|
128
|
+
index++;
|
|
129
|
+
space();
|
|
130
|
+
while (text[index] !== "]") {
|
|
131
|
+
visit(depth + 1);
|
|
132
|
+
space();
|
|
133
|
+
if (text[index] !== ",")
|
|
134
|
+
break;
|
|
135
|
+
index++;
|
|
136
|
+
space();
|
|
137
|
+
}
|
|
138
|
+
if (text[index++] !== "]")
|
|
139
|
+
return invalid("JSON_INVALID");
|
|
140
|
+
}
|
|
141
|
+
else if (text[index] === '"') {
|
|
142
|
+
quoted();
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
while (index < text.length && !/[\s,}\]]/.test(text[index]))
|
|
146
|
+
index++;
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
visit(0);
|
|
150
|
+
space();
|
|
151
|
+
if (index !== text.length)
|
|
152
|
+
return invalid("JSON_INVALID");
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
export function cloneHcsJsonV1(item) {
|
|
156
|
+
// Safe only after successful canonicalization; stringification gives a fresh,
|
|
157
|
+
// JSON-native tree and leaves caller-owned objects and nested arrays untouched.
|
|
158
|
+
return JSON.parse(JSON.stringify(item));
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=jsonCanonicalV1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonCanonicalV1.js","sourceRoot":"","sources":["../../../src/standards/hcs/jsonCanonicalV1.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { EvidenceConsistency, VerificationObservation, VerificationOutcome, VerificationReport } from "../contracts/verification.js";
|
|
2
|
+
/**
|
|
3
|
+
* Pure scalar-consistency comparison for already normalized observations.
|
|
4
|
+
* A matching observation is NOT proof that its provider is authentic or that
|
|
5
|
+
* Explorer-disclosed plaintext is cryptographically bound to HCS ciphertext.
|
|
6
|
+
* Plans must come from a trusted evidence profile, not an untrusted receipt.
|
|
7
|
+
*/
|
|
8
|
+
export type TriangulationRelationshipId = "provided_public_record" | "public_record_hedera" | "provided_hedera";
|
|
9
|
+
export type TriangulationFactPlanV1 = Readonly<{
|
|
10
|
+
key: string;
|
|
11
|
+
left_key: string;
|
|
12
|
+
right_key: string;
|
|
13
|
+
}>;
|
|
14
|
+
export type TriangulationRelationshipPlanV1 = Readonly<{
|
|
15
|
+
id: TriangulationRelationshipId;
|
|
16
|
+
left_observation_id: string;
|
|
17
|
+
right_observation_id: string;
|
|
18
|
+
comparisons: readonly TriangulationFactPlanV1[];
|
|
19
|
+
}>;
|
|
20
|
+
export type TriangulationV1Input = Readonly<{
|
|
21
|
+
/** Produced by an actual offline verifier invocation, not an authenticated attestation. */
|
|
22
|
+
source_report: VerificationReport;
|
|
23
|
+
/** Public/Mirror observations obtained outside this pure function. */
|
|
24
|
+
observations: readonly VerificationObservation[];
|
|
25
|
+
/** Explicit field mappings defined by the verifier's evidence profile. */
|
|
26
|
+
relationships: readonly TriangulationRelationshipPlanV1[];
|
|
27
|
+
}>;
|
|
28
|
+
export type TriangulationFactResultV1 = Readonly<{
|
|
29
|
+
key: string;
|
|
30
|
+
outcome: VerificationOutcome;
|
|
31
|
+
reason_code: string | null;
|
|
32
|
+
}>;
|
|
33
|
+
export type TriangulationRelationshipResultV1 = Readonly<{
|
|
34
|
+
id: TriangulationRelationshipId;
|
|
35
|
+
status: EvidenceConsistency | "not_applicable";
|
|
36
|
+
fact_comparisons: readonly TriangulationFactResultV1[];
|
|
37
|
+
}>;
|
|
38
|
+
export type TriangulationV1Result = Readonly<{
|
|
39
|
+
/** Consistency only, NOT cryptographic ledger authentication or policy approval. */
|
|
40
|
+
consistency: EvidenceConsistency;
|
|
41
|
+
relationships: readonly TriangulationRelationshipResultV1[];
|
|
42
|
+
report: VerificationReport;
|
|
43
|
+
}>;
|
|
44
|
+
/**
|
|
45
|
+
* Compare bounded scalar facts with explicitly mapped, asymmetric field keys.
|
|
46
|
+
* Network/subject checks apply independently of the requested fact comparisons.
|
|
47
|
+
* This does not verify the authenticity of a resolver or of source_report itself.
|
|
48
|
+
*/
|
|
49
|
+
export declare function compareEvidenceTriangulationV1(input: TriangulationV1Input): TriangulationV1Result;
|
|
50
|
+
//# sourceMappingURL=compareV1.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compareV1.d.ts","sourceRoot":"","sources":["../../src/triangulation/compareV1.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EAGnB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAEnB,MAAM,8BAA8B,CAAC;AAEtC;;;;;GAKG;AACH,MAAM,MAAM,2BAA2B,GACnC,wBAAwB,GACxB,sBAAsB,GACtB,iBAAiB,CAAC;AAEtB,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC7C,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AAEH,MAAM,MAAM,+BAA+B,GAAG,QAAQ,CAAC;IACrD,EAAE,EAAE,2BAA2B,CAAC;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,WAAW,EAAE,SAAS,uBAAuB,EAAE,CAAC;CACjD,CAAC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC1C,2FAA2F;IAC3F,aAAa,EAAE,kBAAkB,CAAC;IAClC,sEAAsE;IACtE,YAAY,EAAE,SAAS,uBAAuB,EAAE,CAAC;IACjD,0EAA0E;IAC1E,aAAa,EAAE,SAAS,+BAA+B,EAAE,CAAC;CAC3D,CAAC,CAAC;AAEH,MAAM,MAAM,yBAAyB,GAAG,QAAQ,CAAC;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,mBAAmB,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B,CAAC,CAAC;AAEH,MAAM,MAAM,iCAAiC,GAAG,QAAQ,CAAC;IACvD,EAAE,EAAE,2BAA2B,CAAC;IAChC,MAAM,EAAE,mBAAmB,GAAG,gBAAgB,CAAC;IAC/C,gBAAgB,EAAE,SAAS,yBAAyB,EAAE,CAAC;CACxD,CAAC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC;IAC3C,oFAAoF;IACpF,WAAW,EAAE,mBAAmB,CAAC;IACjC,aAAa,EAAE,SAAS,iCAAiC,EAAE,CAAC;IAC5D,MAAM,EAAE,kBAAkB,CAAC;CAC5B,CAAC,CAAC;AAsJH;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,oBAAoB,GAAG,qBAAqB,CAuGjG"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
const MAX_OBSERVATIONS = 32;
|
|
2
|
+
const MAX_FACTS = 256;
|
|
3
|
+
const MAX_RELATIONSHIPS = 3;
|
|
4
|
+
const MAX_COMPARISONS = 64;
|
|
5
|
+
const MAX_SOURCE_FINDINGS = 256;
|
|
6
|
+
const ID_RE = /^[a-z][a-z0-9._:-]{0,127}$/;
|
|
7
|
+
const FACT_KEY_RE = /^[a-z][a-z0-9._:-]{0,159}$/;
|
|
8
|
+
function checkedId(value, field, pattern) {
|
|
9
|
+
if (typeof value !== "string" || !pattern.test(value)) {
|
|
10
|
+
throw new TypeError(`Invalid ${field}`);
|
|
11
|
+
}
|
|
12
|
+
return value;
|
|
13
|
+
}
|
|
14
|
+
function matchesSubject(actual, expected) {
|
|
15
|
+
return actual.kind === expected.kind && actual.id === expected.id;
|
|
16
|
+
}
|
|
17
|
+
function factsByKey(observation) {
|
|
18
|
+
if (!Array.isArray(observation.facts) || observation.facts.length > MAX_FACTS) {
|
|
19
|
+
throw new TypeError("Triangulation observation exceeds the fact limit");
|
|
20
|
+
}
|
|
21
|
+
const facts = new Map();
|
|
22
|
+
for (const fact of observation.facts) {
|
|
23
|
+
const key = checkedId(fact?.key, "fact key", FACT_KEY_RE);
|
|
24
|
+
if (facts.has(key))
|
|
25
|
+
throw new TypeError(`Duplicate observation fact: ${key}`);
|
|
26
|
+
if (fact.state === "available") {
|
|
27
|
+
if (!Object.hasOwn(fact, "value") ||
|
|
28
|
+
(typeof fact.value === "number" && !Number.isFinite(fact.value)) ||
|
|
29
|
+
(typeof fact.value !== "string" && typeof fact.value !== "number" &&
|
|
30
|
+
typeof fact.value !== "boolean" && fact.value !== null) ||
|
|
31
|
+
(typeof fact.value === "string" && fact.value.length > 4096)) {
|
|
32
|
+
throw new TypeError(`Invalid available fact: ${key}`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else if (fact.state === "unavailable" || fact.state === "not_applicable") {
|
|
36
|
+
if (fact.reason_code !== undefined && fact.reason_code !== null &&
|
|
37
|
+
(typeof fact.reason_code !== "string" || fact.reason_code.length > 160)) {
|
|
38
|
+
throw new TypeError(`Invalid fact reason: ${key}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
throw new TypeError(`Invalid fact state: ${key}`);
|
|
43
|
+
}
|
|
44
|
+
facts.set(key, fact);
|
|
45
|
+
}
|
|
46
|
+
return facts;
|
|
47
|
+
}
|
|
48
|
+
function observationIndex(input) {
|
|
49
|
+
const all = [...input.source_report.observations, ...input.observations];
|
|
50
|
+
if (all.length > MAX_OBSERVATIONS)
|
|
51
|
+
throw new TypeError("Too many triangulation observations");
|
|
52
|
+
const map = new Map();
|
|
53
|
+
for (const entry of all) {
|
|
54
|
+
const id = checkedId(entry?.id, "observation id", ID_RE);
|
|
55
|
+
if (map.has(id))
|
|
56
|
+
throw new TypeError(`Duplicate triangulation observation: ${id}`);
|
|
57
|
+
if (!entry.subject || typeof entry.subject.id !== "string" ||
|
|
58
|
+
typeof entry.subject.kind !== "string") {
|
|
59
|
+
throw new TypeError(`Invalid triangulation observation subject: ${id}`);
|
|
60
|
+
}
|
|
61
|
+
factsByKey(entry);
|
|
62
|
+
map.set(id, entry);
|
|
63
|
+
}
|
|
64
|
+
// An external caller may not replace an offline source observation.
|
|
65
|
+
for (const entry of input.observations) {
|
|
66
|
+
if (entry.source === "local_computation") {
|
|
67
|
+
throw new TypeError("External observations cannot assert local computation");
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return map;
|
|
71
|
+
}
|
|
72
|
+
function roleAllowed(relationship, left, right) {
|
|
73
|
+
if (relationship === "provided_public_record") {
|
|
74
|
+
return (left.source === "provided_evidence" || left.source === "local_computation") &&
|
|
75
|
+
right.source === "public_record";
|
|
76
|
+
}
|
|
77
|
+
if (relationship === "provided_hedera") {
|
|
78
|
+
return (left.source === "provided_evidence" || left.source === "local_computation") &&
|
|
79
|
+
right.source === "hedera_mirror";
|
|
80
|
+
}
|
|
81
|
+
return left.source === "public_record" && right.source === "hedera_mirror";
|
|
82
|
+
}
|
|
83
|
+
function scopeOutcome(actual, expected) {
|
|
84
|
+
if (!matchesSubject(actual.subject, expected)) {
|
|
85
|
+
return { outcome: "fail", reason: "OBSERVATION_SUBJECT_MISMATCH" };
|
|
86
|
+
}
|
|
87
|
+
if (!expected.hedera_network) {
|
|
88
|
+
return { outcome: "indeterminate", reason: "EXPECTED_NETWORK_UNAVAILABLE" };
|
|
89
|
+
}
|
|
90
|
+
if (!actual.subject.hedera_network) {
|
|
91
|
+
return { outcome: "indeterminate", reason: "OBSERVATION_NETWORK_UNAVAILABLE" };
|
|
92
|
+
}
|
|
93
|
+
if (actual.subject.hedera_network !== expected.hedera_network) {
|
|
94
|
+
return { outcome: "fail", reason: "OBSERVATION_NETWORK_MISMATCH" };
|
|
95
|
+
}
|
|
96
|
+
return { outcome: "pass", reason: null };
|
|
97
|
+
}
|
|
98
|
+
function unavailableReason(fact) {
|
|
99
|
+
return fact.state === "available" ? null : fact.reason_code ?? null;
|
|
100
|
+
}
|
|
101
|
+
function compareFacts(left, right) {
|
|
102
|
+
if (!left || !right)
|
|
103
|
+
return { outcome: "indeterminate", reason: "FACT_MISSING" };
|
|
104
|
+
if (left.state === "not_applicable" || right.state === "not_applicable") {
|
|
105
|
+
return { outcome: "skipped", reason: unavailableReason(left) ?? unavailableReason(right) ?? "FACT_NOT_APPLICABLE" };
|
|
106
|
+
}
|
|
107
|
+
if (left.state !== "available" || right.state !== "available") {
|
|
108
|
+
return { outcome: "indeterminate", reason: unavailableReason(left) ?? unavailableReason(right) ?? "FACT_UNAVAILABLE" };
|
|
109
|
+
}
|
|
110
|
+
const matches = Object.is(left.value, right.value);
|
|
111
|
+
return { outcome: matches ? "pass" : "fail", reason: matches ? null : "FACT_MISMATCH" };
|
|
112
|
+
}
|
|
113
|
+
function aggregate(results) {
|
|
114
|
+
if (results.length === 0 || results.every((check) => check.outcome === "skipped"))
|
|
115
|
+
return "not_applicable";
|
|
116
|
+
if (results.some((check) => check.outcome === "fail"))
|
|
117
|
+
return "conflict";
|
|
118
|
+
if (results.some((check) => check.outcome === "indeterminate" || check.outcome === "unsupported"))
|
|
119
|
+
return "incomplete";
|
|
120
|
+
return "consistent";
|
|
121
|
+
}
|
|
122
|
+
function check(id, outcome, reason, observationIds) {
|
|
123
|
+
return Object.freeze({
|
|
124
|
+
check_id: id,
|
|
125
|
+
outcome,
|
|
126
|
+
reason_code: reason,
|
|
127
|
+
observation_ids: Object.freeze([...observationIds]),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Compare bounded scalar facts with explicitly mapped, asymmetric field keys.
|
|
132
|
+
* Network/subject checks apply independently of the requested fact comparisons.
|
|
133
|
+
* This does not verify the authenticity of a resolver or of source_report itself.
|
|
134
|
+
*/
|
|
135
|
+
export function compareEvidenceTriangulationV1(input) {
|
|
136
|
+
if (!input || !input.source_report?.intent?.subject ||
|
|
137
|
+
!Array.isArray(input.source_report.findings) ||
|
|
138
|
+
input.source_report.findings.length > MAX_SOURCE_FINDINGS ||
|
|
139
|
+
!Array.isArray(input.source_report.observations) ||
|
|
140
|
+
!Array.isArray(input.relationships) || input.relationships.length > MAX_RELATIONSHIPS ||
|
|
141
|
+
!Array.isArray(input.observations)) {
|
|
142
|
+
throw new TypeError("Invalid triangulation input");
|
|
143
|
+
}
|
|
144
|
+
const map = observationIndex(input);
|
|
145
|
+
const usedRelationships = new Set();
|
|
146
|
+
const findings = [...input.source_report.findings];
|
|
147
|
+
const usedCheckIds = new Set(findings.map((entry) => entry.check_id));
|
|
148
|
+
const results = [];
|
|
149
|
+
for (const relationship of input.relationships) {
|
|
150
|
+
if (!["provided_public_record", "public_record_hedera", "provided_hedera"].includes(relationship.id) ||
|
|
151
|
+
usedRelationships.has(relationship.id)) {
|
|
152
|
+
throw new TypeError("Unknown or duplicated triangulation relationship");
|
|
153
|
+
}
|
|
154
|
+
usedRelationships.add(relationship.id);
|
|
155
|
+
if (!Array.isArray(relationship.comparisons) || relationship.comparisons.length > MAX_COMPARISONS) {
|
|
156
|
+
throw new TypeError("Too many triangulation fact comparisons");
|
|
157
|
+
}
|
|
158
|
+
const leftId = checkedId(relationship.left_observation_id, "left observation id", ID_RE);
|
|
159
|
+
const rightId = checkedId(relationship.right_observation_id, "right observation id", ID_RE);
|
|
160
|
+
if (leftId === rightId)
|
|
161
|
+
throw new TypeError("Triangulation cannot compare an observation with itself");
|
|
162
|
+
const left = map.get(leftId);
|
|
163
|
+
const right = map.get(rightId);
|
|
164
|
+
if (left && right && !roleAllowed(relationship.id, left, right)) {
|
|
165
|
+
throw new TypeError("Triangulation observation sources do not match their relationship roles");
|
|
166
|
+
}
|
|
167
|
+
const leftFacts = left ? factsByKey(left) : null;
|
|
168
|
+
const rightFacts = right ? factsByKey(right) : null;
|
|
169
|
+
const compared = [];
|
|
170
|
+
const usedKeys = new Set();
|
|
171
|
+
for (const comparison of relationship.comparisons) {
|
|
172
|
+
const key = checkedId(comparison.key, "comparison key", FACT_KEY_RE);
|
|
173
|
+
const leftKey = checkedId(comparison.left_key, "left comparison key", FACT_KEY_RE);
|
|
174
|
+
const rightKey = checkedId(comparison.right_key, "right comparison key", FACT_KEY_RE);
|
|
175
|
+
if (usedKeys.has(key))
|
|
176
|
+
throw new TypeError(`Duplicate triangulation comparison: ${key}`);
|
|
177
|
+
usedKeys.add(key);
|
|
178
|
+
const checkId = `triangulation.${relationship.id}.${key}`;
|
|
179
|
+
if (usedCheckIds.has(checkId))
|
|
180
|
+
throw new TypeError(`Duplicate triangulation check: ${checkId}`);
|
|
181
|
+
usedCheckIds.add(checkId);
|
|
182
|
+
let evaluated;
|
|
183
|
+
if (!left || !right) {
|
|
184
|
+
evaluated = { outcome: "indeterminate", reason: "OBSERVATION_UNAVAILABLE" };
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
const leftScope = scopeOutcome(left, input.source_report.intent.subject);
|
|
188
|
+
const rightScope = scopeOutcome(right, input.source_report.intent.subject);
|
|
189
|
+
if (leftScope.outcome === "fail" || rightScope.outcome === "fail") {
|
|
190
|
+
evaluated = { outcome: "fail", reason: leftScope.outcome === "fail" ? leftScope.reason : rightScope.reason };
|
|
191
|
+
}
|
|
192
|
+
else if ((leftScope.outcome !== "pass" && left.source !== "local_computation") ||
|
|
193
|
+
(rightScope.outcome !== "pass" && right.source !== "local_computation")) {
|
|
194
|
+
evaluated = { outcome: "indeterminate", reason: "NETWORK_SCOPE_UNAVAILABLE" };
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
evaluated = compareFacts(leftFacts?.get(leftKey), rightFacts?.get(rightKey));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
compared.push(Object.freeze({ key, outcome: evaluated.outcome, reason_code: evaluated.reason }));
|
|
201
|
+
findings.push(check(checkId, evaluated.outcome, evaluated.reason, [leftId, rightId].filter((id) => map.has(id))));
|
|
202
|
+
}
|
|
203
|
+
results.push(Object.freeze({
|
|
204
|
+
id: relationship.id,
|
|
205
|
+
status: aggregate(compared),
|
|
206
|
+
fact_comparisons: Object.freeze(compared),
|
|
207
|
+
}));
|
|
208
|
+
}
|
|
209
|
+
// Source verification is a prerequisite, not a fourth independent authority.
|
|
210
|
+
// A supplied report is NOT an authenticated attestation: callers must obtain
|
|
211
|
+
// it through the SDK's own source-verification entry points.
|
|
212
|
+
const requiredSourceChecks = [
|
|
213
|
+
`${input.source_report.intent.subject.kind}.source_binding`,
|
|
214
|
+
`${input.source_report.intent.subject.kind}.bundle_consistency`,
|
|
215
|
+
"intent.subject",
|
|
216
|
+
];
|
|
217
|
+
const requiredResults = requiredSourceChecks.map((id) => input.source_report.findings.find((entry) => entry.check_id === id)?.outcome);
|
|
218
|
+
const consistency = input.source_report.findings.some((entry) => entry.outcome === "fail") ||
|
|
219
|
+
results.some((entry) => entry.status === "conflict")
|
|
220
|
+
? "conflict"
|
|
221
|
+
: requiredResults.some((outcome) => outcome !== "pass") ||
|
|
222
|
+
results.length === 0 || results.some((entry) => entry.status !== "consistent")
|
|
223
|
+
? "incomplete"
|
|
224
|
+
: "consistent";
|
|
225
|
+
const observations = [...input.source_report.observations, ...input.observations];
|
|
226
|
+
return Object.freeze({
|
|
227
|
+
consistency,
|
|
228
|
+
relationships: Object.freeze(results),
|
|
229
|
+
report: Object.freeze({
|
|
230
|
+
intent: input.source_report.intent,
|
|
231
|
+
findings: Object.freeze(findings),
|
|
232
|
+
observations: Object.freeze(observations),
|
|
233
|
+
}),
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=compareV1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compareV1.js","sourceRoot":"","sources":["../../src/triangulation/compareV1.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure execution triangulation preparation.
|
|
3
|
+
* Claimed locations are never treated as independently resolved evidence.
|
|
4
|
+
* Original/private HCS anchors establish provenance identifiers only, not
|
|
5
|
+
* plaintext-publication or application-data-hash integrity.
|
|
6
|
+
*/
|
|
7
|
+
import type { HederaNetwork } from "../contracts/verification.js";
|
|
8
|
+
import type { PublicExecutionStandardsEvidence } from "../profiles/execution/contractV1.js";
|
|
9
|
+
import { type ExecutionV1Input, type ExecutionV1Report } from "../profiles/execution/verificationV1.js";
|
|
10
|
+
import type { TriangulationV1Input } from "./compareV1.js";
|
|
11
|
+
export declare const EXECUTION_HEDERA_OBSERVATION_V1_ID = "execution.hedera";
|
|
12
|
+
type Side = "provided_evidence" | "public_record";
|
|
13
|
+
type Role = "acceptance_anchor" | "result_evidence_anchor";
|
|
14
|
+
export type ExecutionHederaTargetV1 = Readonly<{
|
|
15
|
+
source: Side;
|
|
16
|
+
role: Role;
|
|
17
|
+
network: HederaNetwork;
|
|
18
|
+
transaction_id: string | null;
|
|
19
|
+
topic_id: string | null;
|
|
20
|
+
sequence_number: number | null;
|
|
21
|
+
/** Mirrors must derive facts from actual retrieved bytes/metadata, not from this claim. */
|
|
22
|
+
observation_fact_prefix: string;
|
|
23
|
+
}>;
|
|
24
|
+
export type ExecutionTriangulationPlanV1 = Readonly<{
|
|
25
|
+
stage: "unresolved_authority_plan";
|
|
26
|
+
/** Public input has not yet been acquired or authenticated by an SDK resolver. */
|
|
27
|
+
public_record_acquisition: "not_checked";
|
|
28
|
+
hedera_resolution: "not_checked";
|
|
29
|
+
source_report: ExecutionV1Report;
|
|
30
|
+
triangulation: TriangulationV1Input;
|
|
31
|
+
hedera_targets: readonly ExecutionHederaTargetV1[];
|
|
32
|
+
}>;
|
|
33
|
+
/** Prepare a plan. The returned Mirror observation id is RESERVED, not populated. */
|
|
34
|
+
export declare function prepareExecutionTriangulationV1(input: Readonly<{
|
|
35
|
+
execution: ExecutionV1Input;
|
|
36
|
+
public_evidence: PublicExecutionStandardsEvidence;
|
|
37
|
+
}>): ExecutionTriangulationPlanV1;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=executionPlanV1.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executionPlanV1.d.ts","sourceRoot":"","sources":["../../src/triangulation/executionPlanV1.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,aAAa,EAA6C,MAAM,8BAA8B,CAAC;AAC7G,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,qCAAqC,CAAC;AAC5F,OAAO,EAA+B,KAAK,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AACrI,OAAO,KAAK,EAAE,oBAAoB,EAA4D,MAAM,gBAAgB,CAAC;AASrH,eAAO,MAAM,kCAAkC,qBAAqB,CAAC;AAErE,KAAK,IAAI,GAAG,mBAAmB,GAAG,eAAe,CAAC;AAClD,KAAK,IAAI,GAAG,mBAAmB,GAAG,wBAAwB,CAAC;AAC3D,MAAM,MAAM,uBAAuB,GAAG,QAAQ,CAAC;IAC7C,MAAM,EAAE,IAAI,CAAC;IACb,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,EAAE,aAAa,CAAC;IACvB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,2FAA2F;IAC3F,uBAAuB,EAAE,MAAM,CAAC;CACjC,CAAC,CAAC;AACH,MAAM,MAAM,4BAA4B,GAAG,QAAQ,CAAC;IAClD,KAAK,EAAE,2BAA2B,CAAC;IACnC,kFAAkF;IAClF,yBAAyB,EAAE,aAAa,CAAC;IACzC,iBAAiB,EAAE,aAAa,CAAC;IACjC,aAAa,EAAE,iBAAiB,CAAC;IACjC,aAAa,EAAE,oBAAoB,CAAC;IACpC,cAAc,EAAE,SAAS,uBAAuB,EAAE,CAAC;CACpD,CAAC,CAAC;AA0IH,qFAAqF;AACrF,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,QAAQ,CAAC;IAC9D,SAAS,EAAE,gBAAgB,CAAC;IAC5B,eAAe,EAAE,gCAAgC,CAAC;CACnD,CAAC,GAAG,4BAA4B,CAmDhC"}
|