githolon 0.108.4 → 0.108.7
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/dist/compile_mountability_entry.js +72 -8
- package/dist/dev-server.mjs +643 -134
- package/dist/framework/bootstrap.law.usdz +0 -0
- package/dist/framework/nomos.law.usdz +0 -0
- package/dist/full-cli.mjs +557 -143
- package/package.json +2 -2
package/dist/full-cli.mjs
CHANGED
|
@@ -408,9 +408,8 @@ var init_fields = __esm({
|
|
|
408
408
|
{ timestamp: true }
|
|
409
409
|
);
|
|
410
410
|
},
|
|
411
|
-
/** A boolean flag (Lww).
|
|
412
|
-
*
|
|
413
|
-
* same string form. (Not encryptable — only Lww-class scalars are, and bool already is.) */
|
|
411
|
+
/** A first-class USDA boolean flag (Lww). It remains a boolean through authored law, kernel state,
|
|
412
|
+
* canonical custody and generated reads; it is never lowered through a string or JSON value. */
|
|
414
413
|
bool() {
|
|
415
414
|
return makeField("bool", z2.boolean(), FirstWriterWins);
|
|
416
415
|
},
|
|
@@ -1606,7 +1605,11 @@ function payloadIdSelector(selector) {
|
|
|
1606
1605
|
};
|
|
1607
1606
|
}
|
|
1608
1607
|
if (Array.isArray(selector)) {
|
|
1609
|
-
const readId = {
|
|
1608
|
+
const readId = {
|
|
1609
|
+
source: "template",
|
|
1610
|
+
parts: [...selector],
|
|
1611
|
+
optional: false
|
|
1612
|
+
};
|
|
1610
1613
|
return {
|
|
1611
1614
|
field: (payload) => resolveInvariantReadId(readId, payload) ?? "",
|
|
1612
1615
|
readId
|
|
@@ -1614,9 +1617,17 @@ function payloadIdSelector(selector) {
|
|
|
1614
1617
|
}
|
|
1615
1618
|
if (typeof selector === "object" && selector !== null && "source" in selector) {
|
|
1616
1619
|
if (selector.source === "item") {
|
|
1617
|
-
throw new Error(
|
|
1620
|
+
throw new Error(
|
|
1621
|
+
"directive precondition ids cannot use item-relative read parts"
|
|
1622
|
+
);
|
|
1618
1623
|
}
|
|
1619
|
-
const readId = selector.source === "literal" ? selector : selector.transform === "none" ? {
|
|
1624
|
+
const readId = selector.source === "literal" ? selector : selector.transform === "none" ? {
|
|
1625
|
+
source: "payload",
|
|
1626
|
+
path: selector.path,
|
|
1627
|
+
prefix: "",
|
|
1628
|
+
suffix: "",
|
|
1629
|
+
optional: false
|
|
1630
|
+
} : { source: "template", parts: [selector], optional: false };
|
|
1620
1631
|
return {
|
|
1621
1632
|
field: (payload) => resolveInvariantReadId(readId, payload) ?? "",
|
|
1622
1633
|
...readId.source === "payload" ? { path: readId.path } : {},
|
|
@@ -1653,7 +1664,10 @@ function makeRequirable(base) {
|
|
|
1653
1664
|
)
|
|
1654
1665
|
});
|
|
1655
1666
|
}
|
|
1656
|
-
return makeRequirable({
|
|
1667
|
+
return makeRequirable({
|
|
1668
|
+
...base,
|
|
1669
|
+
secondaryOutputs: [...base.secondaryOutputs ?? [], next]
|
|
1670
|
+
});
|
|
1657
1671
|
};
|
|
1658
1672
|
return {
|
|
1659
1673
|
...base,
|
|
@@ -1664,15 +1678,18 @@ function makeRequirable(base) {
|
|
|
1664
1678
|
return makeRequirable({ ...base, payloadExample: payload });
|
|
1665
1679
|
}
|
|
1666
1680
|
const parsed = base.payloadSchema.safeParse(payload);
|
|
1667
|
-
if (!parsed.success)
|
|
1668
|
-
|
|
1669
|
-
|
|
1681
|
+
if (!parsed.success)
|
|
1682
|
+
throw new Error(
|
|
1683
|
+
`directive('${base.id}').example(...) must satisfy its payload schema: ${parsed.error.message}`
|
|
1684
|
+
);
|
|
1670
1685
|
return makeRequirable({ ...base, payloadExample: parsed.data });
|
|
1671
1686
|
},
|
|
1672
1687
|
fromCurrentPrincipal(field) {
|
|
1673
1688
|
const name = field.trim();
|
|
1674
1689
|
if (name.length === 0) {
|
|
1675
|
-
throw new Error(
|
|
1690
|
+
throw new Error(
|
|
1691
|
+
"directive.fromCurrentPrincipal(field): field must be a non-empty payload field name"
|
|
1692
|
+
);
|
|
1676
1693
|
}
|
|
1677
1694
|
if (zodKind2(base.payloadSchema) !== "object") {
|
|
1678
1695
|
throw new Error(
|
|
@@ -1703,7 +1720,9 @@ function makeRequirable(base) {
|
|
|
1703
1720
|
},
|
|
1704
1721
|
fromRecord(field, opts) {
|
|
1705
1722
|
if (typeof field !== "string" || field.length === 0) {
|
|
1706
|
-
throw new Error(
|
|
1723
|
+
throw new Error(
|
|
1724
|
+
"directive.fromRecord(field): field must be a non-empty payload field name"
|
|
1725
|
+
);
|
|
1707
1726
|
}
|
|
1708
1727
|
const prior = base.businessRecordInputs ?? [];
|
|
1709
1728
|
const next = {
|
|
@@ -1712,7 +1731,10 @@ function makeRequirable(base) {
|
|
|
1712
1731
|
};
|
|
1713
1732
|
return makeRequirable({
|
|
1714
1733
|
...base,
|
|
1715
|
-
businessRecordInputs: [
|
|
1734
|
+
businessRecordInputs: [
|
|
1735
|
+
...prior.filter((candidate) => candidate.field !== field),
|
|
1736
|
+
next
|
|
1737
|
+
]
|
|
1716
1738
|
});
|
|
1717
1739
|
},
|
|
1718
1740
|
trustsSource(opts) {
|
|
@@ -1741,6 +1763,11 @@ function makeRequirable(base) {
|
|
|
1741
1763
|
`directive('${base.id}').trustsSource(...): the trust directive must be wrapped in nomosImplementationDetail(...) so tenant code cannot call it`
|
|
1742
1764
|
);
|
|
1743
1765
|
}
|
|
1766
|
+
if (opts.satisfiedBy === void 0 !== (opts.satisfiedByArgs === void 0)) {
|
|
1767
|
+
throw new Error(
|
|
1768
|
+
`directive('${base.id}').trustsSource(...): satisfiedBy and satisfiedByArgs must be declared together`
|
|
1769
|
+
);
|
|
1770
|
+
}
|
|
1744
1771
|
return makeRequirable({
|
|
1745
1772
|
...base,
|
|
1746
1773
|
businessSourceTrust: {
|
|
@@ -1750,7 +1777,11 @@ function makeRequirable(base) {
|
|
|
1750
1777
|
queryArgs: { ...opts.queryArgs },
|
|
1751
1778
|
copy: { ...opts.copy ?? {} },
|
|
1752
1779
|
genesisField: opts.genesisField ?? "sourceGenesis",
|
|
1753
|
-
keyHashesField: opts.keyHashesField ?? "sourceKeyHashes"
|
|
1780
|
+
keyHashesField: opts.keyHashesField ?? "sourceKeyHashes",
|
|
1781
|
+
...opts.satisfiedBy === void 0 ? {} : {
|
|
1782
|
+
satisfiedByQueryId: opts.satisfiedBy.id,
|
|
1783
|
+
satisfiedByQueryArgs: { ...opts.satisfiedByArgs ?? {} }
|
|
1784
|
+
}
|
|
1754
1785
|
}
|
|
1755
1786
|
});
|
|
1756
1787
|
},
|
|
@@ -1815,7 +1846,9 @@ function makeRequirable(base) {
|
|
|
1815
1846
|
delegatedFrom(parent) {
|
|
1816
1847
|
const g = base.delegatedRoleGate;
|
|
1817
1848
|
if (g === void 0) {
|
|
1818
|
-
throw new Error(
|
|
1849
|
+
throw new Error(
|
|
1850
|
+
"directive.delegatedFrom(): call .delegatedRole(relation) before .delegatedFrom(parent)"
|
|
1851
|
+
);
|
|
1819
1852
|
}
|
|
1820
1853
|
return makeRequirable({
|
|
1821
1854
|
...base,
|
|
@@ -1846,12 +1879,22 @@ function makeRequirable(base) {
|
|
|
1846
1879
|
},
|
|
1847
1880
|
reads(...reads) {
|
|
1848
1881
|
const refTypes = reads.filter((r) => typeof r === "string");
|
|
1849
|
-
const queryDecls = reads.filter(
|
|
1882
|
+
const queryDecls = reads.filter(
|
|
1883
|
+
(r) => typeof r !== "string"
|
|
1884
|
+
);
|
|
1850
1885
|
const merged = [.../* @__PURE__ */ new Set([...base.declaredReads, ...refTypes])].sort();
|
|
1851
|
-
const byId = new Map(
|
|
1886
|
+
const byId = new Map(
|
|
1887
|
+
(base.declaredQueryReads ?? []).map((q) => [q.id, q])
|
|
1888
|
+
);
|
|
1852
1889
|
for (const q of queryDecls) byId.set(q.id, q);
|
|
1853
|
-
const mergedQueries = [...byId.values()].sort(
|
|
1854
|
-
|
|
1890
|
+
const mergedQueries = [...byId.values()].sort(
|
|
1891
|
+
(a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0
|
|
1892
|
+
);
|
|
1893
|
+
return makeRequirable({
|
|
1894
|
+
...base,
|
|
1895
|
+
declaredReads: merged,
|
|
1896
|
+
declaredQueryReads: mergedQueries
|
|
1897
|
+
});
|
|
1855
1898
|
},
|
|
1856
1899
|
readsFrom(source, query3, opts) {
|
|
1857
1900
|
let entry;
|
|
@@ -1867,20 +1910,33 @@ function makeRequirable(base) {
|
|
|
1867
1910
|
`readsFrom(fromPayload('${source.payloadField}'), '${query3.id}'): { policy } must be a trustPolicy(...) declaration.`
|
|
1868
1911
|
);
|
|
1869
1912
|
}
|
|
1870
|
-
entry = {
|
|
1913
|
+
entry = {
|
|
1914
|
+
queryId: query3.id,
|
|
1915
|
+
policy: policy.policyId,
|
|
1916
|
+
fromPayload: source.payloadField
|
|
1917
|
+
};
|
|
1871
1918
|
if (policy.monotone === true) __registerMonotoneForeignQuery(query3.id);
|
|
1872
1919
|
} else {
|
|
1873
1920
|
entry = { queryId: query3.id, from: source };
|
|
1874
1921
|
}
|
|
1875
1922
|
const canon = (e) => "from" in e ? `0\\0${e.from}\\0${e.queryId}` : `1\\0${e.policy}\\0${e.fromPayload}\\0${e.queryId}`;
|
|
1876
1923
|
const prior = base.declaredForeignReads ?? [];
|
|
1877
|
-
const byKey = new Map(
|
|
1924
|
+
const byKey = new Map(
|
|
1925
|
+
prior.map((e) => [canon(e), e])
|
|
1926
|
+
);
|
|
1878
1927
|
byKey.set(canon(entry), entry);
|
|
1879
|
-
const merged = [...byKey.values()].sort(
|
|
1880
|
-
|
|
1928
|
+
const merged = [...byKey.values()].sort(
|
|
1929
|
+
(a, b) => canon(a) < canon(b) ? -1 : canon(a) > canon(b) ? 1 : 0
|
|
1930
|
+
);
|
|
1931
|
+
return makeRequirable({
|
|
1932
|
+
...base,
|
|
1933
|
+
declaredForeignReads: merged
|
|
1934
|
+
}).alsoEnsures(NomosSourceFrontier);
|
|
1881
1935
|
},
|
|
1882
1936
|
emits(eventType, opts) {
|
|
1883
|
-
const merged = {
|
|
1937
|
+
const merged = {
|
|
1938
|
+
...base.declaredEmits
|
|
1939
|
+
};
|
|
1884
1940
|
merged[eventType] = opts?.max !== void 0 ? { max: opts.max } : {};
|
|
1885
1941
|
return makeRequirable({ ...base, declaredEmits: merged });
|
|
1886
1942
|
},
|
|
@@ -1892,20 +1948,41 @@ function makeRequirable(base) {
|
|
|
1892
1948
|
...base.marker === "creates" ? [base.aggregateId] : [],
|
|
1893
1949
|
...(base.secondaryOutputs ?? []).filter((o) => o.marker === "creates").map((o) => o.aggregateId)
|
|
1894
1950
|
];
|
|
1895
|
-
return makeRequirable({
|
|
1951
|
+
return makeRequirable({
|
|
1952
|
+
...base,
|
|
1953
|
+
activityDescriptor: normalizeActivity(
|
|
1954
|
+
base.id,
|
|
1955
|
+
input,
|
|
1956
|
+
base.payloadSchema,
|
|
1957
|
+
createdIds
|
|
1958
|
+
)
|
|
1959
|
+
});
|
|
1896
1960
|
},
|
|
1897
1961
|
declaresRelation(rel) {
|
|
1898
|
-
return makeRequirable({
|
|
1962
|
+
return makeRequirable({
|
|
1963
|
+
...base,
|
|
1964
|
+
declaredRelations: [...base.declaredRelations, rel]
|
|
1965
|
+
});
|
|
1899
1966
|
},
|
|
1900
1967
|
requiresHostCapability(...portIds) {
|
|
1901
|
-
const merged = [
|
|
1968
|
+
const merged = [
|
|
1969
|
+
.../* @__PURE__ */ new Set([...base.declaredHostCapabilities, ...portIds])
|
|
1970
|
+
].sort();
|
|
1902
1971
|
return makeRequirable({ ...base, declaredHostCapabilities: merged });
|
|
1903
1972
|
},
|
|
1904
1973
|
births() {
|
|
1905
|
-
const byId = new Map(
|
|
1974
|
+
const byId = new Map(
|
|
1975
|
+
(base.declaredQueryReads ?? []).map((q) => [q.id, q])
|
|
1976
|
+
);
|
|
1906
1977
|
for (const q of BIRTH_METER_QUERIES) byId.set(q.id, q);
|
|
1907
|
-
const mergedQueries = [...byId.values()].sort(
|
|
1908
|
-
|
|
1978
|
+
const mergedQueries = [...byId.values()].sort(
|
|
1979
|
+
(a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0
|
|
1980
|
+
);
|
|
1981
|
+
return makeRequirable({
|
|
1982
|
+
...base,
|
|
1983
|
+
birthsChild: true,
|
|
1984
|
+
declaredQueryReads: mergedQueries
|
|
1985
|
+
});
|
|
1909
1986
|
},
|
|
1910
1987
|
resolves(field) {
|
|
1911
1988
|
if (typeof field !== "string" || field.length === 0) {
|
|
@@ -1921,7 +1998,9 @@ function makeRequirable(base) {
|
|
|
1921
1998
|
return makeRequirable({ ...base, resolvesField: field });
|
|
1922
1999
|
},
|
|
1923
2000
|
grants(relation) {
|
|
1924
|
-
const merged = [
|
|
2001
|
+
const merged = [
|
|
2002
|
+
.../* @__PURE__ */ new Set([...base.grantsRelation ?? [], relation])
|
|
2003
|
+
].sort();
|
|
1925
2004
|
return makeRequirable({ ...base, grantsRelation: merged });
|
|
1926
2005
|
}
|
|
1927
2006
|
};
|
|
@@ -2017,7 +2096,9 @@ var init_directive = __esm({
|
|
|
2017
2096
|
const actual = schema === void 0 ? void 0 : idOfMetaOf(schema);
|
|
2018
2097
|
if (actual !== this.aggregate.id) {
|
|
2019
2098
|
throw new Error(
|
|
2020
|
-
`directive('${this.id}').target('${field}') must name an idOf(${shortName(
|
|
2099
|
+
`directive('${this.id}').target('${field}') must name an idOf(${shortName(
|
|
2100
|
+
this.aggregate.id
|
|
2101
|
+
)}) payload field`
|
|
2021
2102
|
);
|
|
2022
2103
|
}
|
|
2023
2104
|
return new _DirectivePlanStep(
|
|
@@ -2164,10 +2245,7 @@ var init_directive = __esm({
|
|
|
2164
2245
|
this.aggregate,
|
|
2165
2246
|
this.payloadSchema,
|
|
2166
2247
|
this.createOnceIdField,
|
|
2167
|
-
[
|
|
2168
|
-
...this.preconditions.slice(0, -1),
|
|
2169
|
-
{ ...last, declassify: trimmed }
|
|
2170
|
-
],
|
|
2248
|
+
[...this.preconditions.slice(0, -1), { ...last, declassify: trimmed }],
|
|
2171
2249
|
this.targetField
|
|
2172
2250
|
);
|
|
2173
2251
|
}
|
|
@@ -2179,7 +2257,9 @@ var init_directive = __esm({
|
|
|
2179
2257
|
const field = this.targetField ?? (candidates.length === 1 ? candidates[0] : void 0);
|
|
2180
2258
|
if (this.targetField === void 0 && candidates.length > 1) {
|
|
2181
2259
|
throw new Error(
|
|
2182
|
-
`directive('${this.id}') has several idOf(${shortName(
|
|
2260
|
+
`directive('${this.id}') has several idOf(${shortName(
|
|
2261
|
+
this.aggregate.id
|
|
2262
|
+
)}) payload fields; select the mutation target with .target('field') before .plan(...)`
|
|
2183
2263
|
);
|
|
2184
2264
|
}
|
|
2185
2265
|
if (field !== void 0) {
|
|
@@ -4167,7 +4247,8 @@ function nmsInternalEncodeTypedProviderCall(operation, requestPrefix = "browser"
|
|
|
4167
4247
|
}));
|
|
4168
4248
|
const query3 = operation.case === "query" ? operation.value.query : void 0;
|
|
4169
4249
|
const custody = operation.case === "custody" ? operation.value.operation : void 0;
|
|
4170
|
-
const
|
|
4250
|
+
const offeredIntent = operation.case === "offer" ? operation.value.intent.case : void 0;
|
|
4251
|
+
const detail = query3?.case === "named" ? `query:named:${String(query3.value.operation)}` : query3?.case ? `query:${query3.case}` : custody?.case ? `custody:${custody.case}` : offeredIntent ? `offer:${offeredIntent}` : operation.case || "empty";
|
|
4171
4252
|
return { requestId, mode: operation.case || "empty", detail, bytes, encodeMs: monotonicMs() - started };
|
|
4172
4253
|
}
|
|
4173
4254
|
function nmsInternalDecodeTypedProviderResponse(bytes, requestId) {
|
|
@@ -4589,8 +4670,13 @@ function createWasmEnginePlane({ span } = {}) {
|
|
|
4589
4670
|
wsContents.set(name, new File(bytes));
|
|
4590
4671
|
},
|
|
4591
4672
|
readWsFile(name) {
|
|
4592
|
-
const
|
|
4593
|
-
|
|
4673
|
+
const parts = String(name).split("/").filter(Boolean);
|
|
4674
|
+
let node = wsDirNode ?? void 0;
|
|
4675
|
+
for (const part of parts) {
|
|
4676
|
+
if (!(node instanceof Directory)) return null;
|
|
4677
|
+
node = node.contents.get(part);
|
|
4678
|
+
}
|
|
4679
|
+
return node instanceof File ? node.data : null;
|
|
4594
4680
|
},
|
|
4595
4681
|
memBytes() {
|
|
4596
4682
|
return ex ? ex.memory.buffer.byteLength : 0;
|
|
@@ -4676,6 +4762,11 @@ function createWasmEnginePlane({ span } = {}) {
|
|
|
4676
4762
|
}
|
|
4677
4763
|
})
|
|
4678
4764
|
});
|
|
4765
|
+
if (response.outcome.case === "failure") {
|
|
4766
|
+
throw new Error(
|
|
4767
|
+
`${response.outcome.value.code}: ${response.outcome.value.message}`
|
|
4768
|
+
);
|
|
4769
|
+
}
|
|
4679
4770
|
if (response.outcome.case !== "custody" || response.outcome.value.operation.case !== "packDelta") return null;
|
|
4680
4771
|
const pack = response.outcome.value.operation.value.pack;
|
|
4681
4772
|
return pack.length ? pack : null;
|
|
@@ -5205,6 +5296,7 @@ function createModelLifecycleOfferRequest(target, args) {
|
|
|
5205
5296
|
rng: args.capturedPorts.rng,
|
|
5206
5297
|
deferProjection: args.deferProjection === true,
|
|
5207
5298
|
spans: args.spans === true,
|
|
5299
|
+
prepareOnly: args.prepareOnly === true,
|
|
5208
5300
|
sequence: BigInt(args.sequence),
|
|
5209
5301
|
clock: create2(CapturedClockSchema, {
|
|
5210
5302
|
physicalMillis: BigInt(args.capturedPorts.clock.physical),
|
|
@@ -6384,19 +6476,19 @@ var init_runtime_pb = __esm({
|
|
|
6384
6476
|
"use strict";
|
|
6385
6477
|
init_kernel_pb();
|
|
6386
6478
|
init_progress_pb();
|
|
6387
|
-
file_nomos_runtime_v2_runtime = /* @__PURE__ */ fileDesc4("Ch5ub21vcy9ydW50aW1lL3YyL3J1bnRpbWUucHJvdG8SEG5vbW9zLnJ1bnRpbWUudjIioAkKDlJ1bnRpbWVSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoBBIyCgV0cmFjZRgDIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuVHJhY2VDb250ZXh0SAGIAQESOgoLa2VybmVsX2NhbGwYCiABKAsyIy5ub21vcy5ydW50aW1lLnYyLktlcm5lbENhbGxSZXF1ZXN0SAASMwoHY29ubmVjdBgLIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuQ29ubmVjdFJlcXVlc3RIABJCCg9saXN0X3dvcmtzcGFjZXMYDCABKAsyJy5ub21vcy5ydW50aW1lLnYyLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdEgAEkgKEnNuYXBzaG90X3dvcmtzcGFjZRgNIAEoCzIqLm5vbW9zLnJ1bnRpbWUudjIuU25hcHNob3RXb3Jrc3BhY2VSZXF1ZXN0SAASQAoOc3luY193b3Jrc3BhY2UYDiABKAsyJi5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXF1ZXN0SAASQQoPc3RhcnRfYXV0b19zeW5jGA8gASgLMiYubm9tb3MucnVudGltZS52Mi5TdGFydEF1dG9TeW5jUmVxdWVzdEgAEj8KDnN0b3BfYXV0b19zeW5jGBAgASgLMiUubm9tb3MucnVudGltZS52Mi5TdG9wQXV0b1N5bmNSZXF1ZXN0SAASLwoFd2F0Y2gYESABKAsyHi5ub21vcy5ydW50aW1lLnYyLldhdGNoUmVxdWVzdEgAEjMKB3Vud2F0Y2gYEiABKAsyIC5ub21vcy5ydW50aW1lLnYyLlVud2F0Y2hSZXF1ZXN0SAASQAoOcHJlcGFyZV9kb21haW4YEyABKAsyJi5ub21vcy5ydW50aW1lLnYyLlByZXBhcmVEb21haW5SZXF1ZXN0SAASTQoVcmVzb2x2ZV9jdXN0b2R5X2JyZWFrGBQgASgLMiwubm9tb3MucnVudGltZS52Mi5SZXNvbHZlQ3VzdG9keUJyZWFrUmVxdWVzdEgAEjoKC2Nsb3NlX3JlYWxtGBUgASgLMiMubm9tb3MucnVudGltZS52Mi5DbG9zZVJlYWxtUmVxdWVzdEgAEjoKC2RlYWRfbGV0dGVyGBYgASgLMiMubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmVxdWVzdEgAEkAKDmhpc3RvcmljX3F1ZXJ5GBcgASgLMiYubm9tb3MucnVudGltZS52Mi5IaXN0b3JpY1F1ZXJ5UmVxdWVzdEgAEkIKD21vZGVsX2xpZmVjeWNsZRgYIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxMaWZlY3ljbGVSZXF1ZXN0SAASXQodZXN0YWJsaXNoX2FwcGxpY2F0aW9uX2N1c3RvZHkYGSABKAsyNC5ub21vcy5ydW50aW1lLnYyLkVzdGFibGlzaEFwcGxpY2F0aW9uQ3VzdG9keVJlcXVlc3RIAEIJCgdjb21tYW5kQggKBl90cmFjZSJTChFLZXJuZWxDYWxsUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEi0KB3JlcXVlc3QYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuQ2FsbFJlcXVlc3Qi8QIKIkVzdGFibGlzaEFwcGxpY2F0aW9uQ3VzdG9keVJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIOCgZwYXJlbnQYAiABKAkSEQoJcHJpbmNpcGFsGAMgASgJEg8KB3N1YmplY3QYBCABKAkSFQoNZGV2aWNlX3NlY3JldBgFIAEoDBIVCg1kZXZpY2VfcHVibGljGAYgASgMEhIKCmF1dGhfdG9rZW4YByABKAkSEAoIaWRfdG9rZW4YCCABKAkSFAoMdmVyaWZpZWRfdmlhGAkgASgJEg8KB2Jvcm5fYXQYCiABKAkSOwoTZW5yb2xsX2ZpcnN0X2RldmljZRgLIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5EaXJlY3RpdmVDYWxsEj0KFWJpcnRoX3JlY2VpdmluZ19ncm91cBgMIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5EaXJlY3RpdmVDYWxsEg8KB2NvbmZpcm0YDSABKAginwEKHUFwcGxpY2F0aW9uQ3VzdG9keUVzdGFibGlzaGVkEgwKBGhvbWUYASABKAkSFwoKY2hpbGRfaGVhZBgCIAEoCUgAiAEBEhAKCHZlcmlmaWVkGAMgASgIEh8KEnZlcmlmaWNhdGlvbl9lcnJvchgEIAEoCUgBiAEBQg0KC19jaGlsZF9oZWFkQhUKE192ZXJpZmljYXRpb25fZXJyb3IiZQoUSGlzdG9yaWNRdWVyeVJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIOCgZtb21lbnQYAiABKAkSLAoFcXVlcnkYAyABKAsyHS5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXF1ZXN0IrUJCg9SdW50aW1lUmVzcG9uc2USGAoQcHJvdG9jb2xfdmVyc2lvbhgBIAEoDRISCgpyZXF1ZXN0X2lkGAIgASgEEjMKB2ZhaWx1cmUYCiABKAsyIC5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVGYWlsdXJlSAASNAoLa2VybmVsX2NhbGwYCyABKAsyHS5ub21vcy5rZXJuZWwudjEuQ2FsbFJlc3BvbnNlSAASMAoJY29ubmVjdGVkGAwgASgLMhsubm9tb3MucnVudGltZS52Mi5Db25uZWN0ZWRIABI5Cg53b3Jrc3BhY2VfbGlzdBgNIAEoCzIfLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlTGlzdEgAEkEKEndvcmtzcGFjZV9zbmFwc2hvdBgOIAEoCzIjLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlU25hcHNob3RIABJBCg5zeW5jX3dvcmtzcGFjZRgPIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuU3luY1dvcmtzcGFjZVJlc3BvbnNlSAASPgoRYXV0b19zeW5jX3N0YXJ0ZWQYECABKAsyIS5ub21vcy5ydW50aW1lLnYyLkF1dG9TeW5jU3RhcnRlZEgAEj4KEWF1dG9fc3luY19zdG9wcGVkGBEgASgLMiEubm9tb3MucnVudGltZS52Mi5BdXRvU3luY1N0b3BwZWRIABI3Cg13YXRjaF9zdGFydGVkGBIgASgLMh4ubm9tb3MucnVudGltZS52Mi5XYXRjaFN0YXJ0ZWRIABI3Cg13YXRjaF9zdG9wcGVkGBMgASgLMh4ubm9tb3MucnVudGltZS52Mi5XYXRjaFN0b3BwZWRIABI7Cg9kb21haW5fcHJlcGFyZWQYFCABKAsyIC5ub21vcy5ydW50aW1lLnYyLkRvbWFpblByZXBhcmVkSAASSAoWY3VzdG9keV9icmVha19yZXNvbHZlZBgVIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrUmVzb2x2ZWRIABI1CgxyZWFsbV9jbG9zZWQYFiABKAsyHS5ub21vcy5ydW50aW1lLnYyLlJlYWxtQ2xvc2VkSAASMwoHYmxvY2tlZBgXIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUJsb2NrZWRIABJIChZyZW1vdGVfb2ZmZXJfYWRtaXNzaW9uGBggASgLMiYubm9tb3MucnVudGltZS52Mi5SZW1vdGVPZmZlckFkbWlzc2lvbkgAEjsKC2RlYWRfbGV0dGVyGBkgASgLMiQubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmVzcG9uc2VIABJDCg9tb2RlbF9saWZlY3ljbGUYGiABKAsyKC5ub21vcy5ydW50aW1lLnYyLk1vZGVsTGlmZWN5Y2xlUmVzcG9uc2VIABJaCh9hcHBsaWNhdGlvbl9jdXN0b2R5X2VzdGFibGlzaGVkGBsgASgLMi8ubm9tb3MucnVudGltZS52Mi5BcHBsaWNhdGlvbkN1c3RvZHlFc3RhYmxpc2hlZEgAQgkKB291dGNvbWUinwEKDlJ1bnRpbWVCbG9ja2VkEkEKCXdvcmtzcGFjZRgBIAEoCzIsLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlUmVzaWRlbmN5UmVxdWlyZWRIABJACghzaWJsaW5ncxgCIAEoCzIsLm5vbW9zLnJ1bnRpbWUudjIuU2libGluZ1Jlc2lkZW5jaWVzUmVxdWlyZWRIAEIICgZyZWFzb24iLwoaV29ya3NwYWNlUmVzaWRlbmN5UmVxdWlyZWQSEQoJd29ya3NwYWNlGAEgASgJIlUKGFNpYmxpbmdSZXNpZGVuY3lSZXF1aXJlZBIRCgl3b3Jrc3BhY2UYASABKAkSEwoLc291cmNlX2hlYWQYAiABKAkSEQoJZm9sZF9yb290GAMgASgJIl0KGlNpYmxpbmdSZXNpZGVuY2llc1JlcXVpcmVkEj8KC3Jlc2lkZW5jaWVzGAEgAygLMioubm9tb3MucnVudGltZS52Mi5TaWJsaW5nUmVzaWRlbmN5UmVxdWlyZWQihgIKFFJlbW90ZU9mZmVyQWRtaXNzaW9uEhEKCXdvcmtzcGFjZRgBIAEoCRIMCgRtYWluGAIgASgJEhgKC3NlYWxlZF9tYWluGAMgASgJSACIAQESLwoHdmVyZGljdBgEIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5PZmZlclJlc3BvbnNlEjMKDGJvcm5fY3VzdG9keRgFIAMoCzIdLm5vbW9zLnJ1bnRpbWUudjIuQm9ybkN1c3RvZHkSEwoLcmVzdWx0X3BhY2sYBiABKAwSGAoLcmVzdWx0X2Jhc2UYByABKAlIAYgBAUIOCgxfc2VhbGVkX21haW5CDgoMX3Jlc3VsdF9iYXNlIkoKC0Jvcm5DdXN0b2R5Ei0KBWNoaWxkGAEgASgLMh4ubm9tb3Mua2VybmVsLnYxLkJvcm5Xb3Jrc3BhY2USDAoEcGFjaxgCIAEoDCL5AQoYQ3VzdG9keU9mZmVyQmF0Y2hSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoCRI3CgZpbmxpbmUYAyABKAsyJS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbmxpbmVPZmZlcnNIABJGChFzZXNzaW9uX2NhbmRpZGF0ZRgEIAEoCzIpLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keVNlc3Npb25DYW5kaWRhdGVIABIWCgliYXNlX2hlYWQYBSABKAlIAYgBAUIICgZzb3VyY2VCDAoKX2Jhc2VfaGVhZCJOChJDdXN0b2R5SW50ZW50T2ZmZXISDwoHc2Vzc2lvbhgBIAEoCRISCgpjb21taXRfb2lkGAIgASgJEhMKC2NoYW5nZV91c2RhGAMgASgMIksKE0N1c3RvZHlJbmxpbmVPZmZlcnMSNAoGb2ZmZXJzGAEgAygLMiQubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW50ZW50T2ZmZXIiLAoXQ3VzdG9keVNlc3Npb25DYW5kaWRhdGUSEQoJcmVmZXJlbmNlGAEgASgJIvcBChlDdXN0b2R5T2ZmZXJCYXRjaFJlc3BvbnNlEhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoCRI3CglhZG1pc3Npb24YCiABKAsyIi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlBZG1pc3Npb25IABIzCgdmYWlsdXJlGAsgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAEjMKB2Jsb2NrZWQYDCABKAsyIC5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVCbG9ja2VkSABCCQoHb3V0Y29tZSLuAgoQQ3VzdG9keUFkbWlzc2lvbhIMCgRtYWluGAEgASgJEhgKC3NlYWxlZF9tYWluGAIgASgJSACIAQESOwoIc2Vzc2lvbnMYAyADKAsyKS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlTZXNzaW9uQWRtaXNzaW9uEjUKDmJpcnRoX291dGNvbWVzGAQgAygLMh0ubm9tb3Mua2VybmVsLnYxLkJpcnRoT3V0Y29tZRIzCgxib3JuX2N1c3RvZHkYBSADKAsyHS5ub21vcy5ydW50aW1lLnYyLkJvcm5DdXN0b2R5EhMKC3Jlc3VsdF9wYWNrGAYgASgMEhgKC3Jlc3VsdF9iYXNlGAcgASgJSAGIAQESOgoHdGltaW5ncxgIIAEoCzIpLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUFkbWlzc2lvblRpbWluZ3NCDgoMX3NlYWxlZF9tYWluQg4KDF9yZXN1bHRfYmFzZSJlChdDdXN0b2R5U2Vzc2lvbkFkbWlzc2lvbhIPCgdzZXNzaW9uGAEgASgJEjkKB2ludGVudHMYAiADKAsyKC5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbnRlbnRBZG1pc3Npb24ikAIKFkN1c3RvZHlJbnRlbnRBZG1pc3Npb24SEgoKY29tbWl0X29pZBgBIAEoCRIWCglpbnRlbnRfaWQYAiABKAlIAYgBARI7CghhZG1pdHRlZBgKIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudEFkbWl0dGVkSAASOQoHc2tpcHBlZBgLIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudFNraXBwZWRIABI5CgdyZWZ1c2VkGAwgASgLMiYubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW50ZW50UmVmdXNlZEgAQgkKB291dGNvbWVCDAoKX2ludGVudF9pZCKQAQoVQ3VzdG9keUludGVudEFkbWl0dGVkEgwKBGhlYWQYASABKAkSMwoHY3JlYXRlZBgCIAMoCzIiLm5vbW9zLmtlcm5lbC52MS5PZmZlckFnZ3JlZ2F0ZVJlZhI0CghhZmZlY3RlZBgDIAMoCzIiLm5vbW9zLmtlcm5lbC52MS5PZmZlckFnZ3JlZ2F0ZVJlZiIvChRDdXN0b2R5SW50ZW50U2tpcHBlZBIXCg9hbHJlYWR5X29uX21haW4YASABKAgiWgoUQ3VzdG9keUludGVudFJlZnVzZWQSDwoHbWVzc2FnZRgBIAEoCRIVCg1kZWFkX2xldHRlcmVkGAIgASgIEhEKBGhpbnQYAyABKAlIAIgBAUIHCgVfaGludCLtAQoXQ3VzdG9keUFkbWlzc2lvblRpbWluZ3MSFAoMdG90YWxfbWlsbGlzGAEgASgBEhMKC3NjYW5fbWlsbGlzGAIgASgBEhQKDGZldGNoX21pbGxpcxgDIAEoARITCgtzZWFsX21pbGxpcxgEIAEoARIYChBnYXRlX2ZvbGRfbWlsbGlzGAUgASgBEhQKDGludGVudF9jb3VudBgGIAEoDRIVCg1zZXNzaW9uX2NvdW50GAcgASgNEjUKBXNwYW5zGAggAygLMiYubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QWRtaXNzaW9uU3BhbiKXAQoUQ3VzdG9keUFkbWlzc2lvblNwYW4SCgoCaWQYASABKAkSDQoFdHJhY2sYAiABKAkSDAoEbmFtZRgDIAEoCRIMCgRraW5kGAQgASgJEg0KBWRlcHRoGAUgASgNEhsKE3N0YXJ0ZWRfdW5peF9taWxsaXMYBiABKAESHAoUZmluaXNoZWRfdW5peF9taWxsaXMYByABKAEiQgoMVHJhY2VDb250ZXh0EhAKCHRyYWNlX2lkGAEgASgMEg8KB3NwYW5faWQYAiABKAwSDwoHc2FtcGxlZBgDIAEoCCLpAQoOUnVudGltZUZhaWx1cmUSDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEhEKCWNvbXBvbmVudBgDIAEoCRIWCgl3b3Jrc3BhY2UYBCABKAlIAIgBARITCgZkb21haW4YBSABKAlIAYgBARIWCglkaXJlY3RpdmUYBiABKAlIAogBARI5CgphdHRyaWJ1dGVzGAcgAygLMiUubm9tb3MucnVudGltZS52Mi5EaWFnbm9zdGljQXR0cmlidXRlQgwKCl93b3Jrc3BhY2VCCQoHX2RvbWFpbkIMCgpfZGlyZWN0aXZlIqUBChNEaWFnbm9zdGljQXR0cmlidXRlEgwKBG5hbWUYASABKAkSFgoMc3RyaW5nX3ZhbHVlGAIgASgJSAASFwoNaW50ZWdlcl92YWx1ZRgDIAEoEkgAEhYKDGRvdWJsZV92YWx1ZRgEIAEoAUgAEhcKDWJvb2xlYW5fdmFsdWUYBSABKAhIABIVCgtieXRlc192YWx1ZRgGIAEoDEgAQgcKBXZhbHVlIs0CCg5Db25uZWN0UmVxdWVzdBIRCgl3b3Jrc3BhY2UYASABKAkSEQoJY2xpZW50X2lkGAIgASgJEhQKB3Nlc3Npb24YAyABKAlIAIgBARISCgVjbG91ZBgEIAEoCUgBiAEBEhIKCmF1dGhfdG9rZW4YBSABKAwSFQoNYXV0aG9yX3NlY3JldBgGIAEoDBIiChptYXhpbXVtX21vdW50ZWRfd29ya3NwYWNlcxgHIAEoDRIUCgxhbGxvd191bmJvcm4YCCABKAgSDwoHcmVjb3ZlchgJIAEoCBJCChRjdXN0b2R5X2JyZWFrX3BvbGljeRgKIAEoDjIkLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrUG9saWN5EhsKE2hhc19yZXN0b3JlX2N1c3RvZHkYCyABKAhCCgoIX3Nlc3Npb25CCAoGX2Nsb3VkIosBCglDb25uZWN0ZWQSEQoJd29ya3NwYWNlGAEgASgJEg8KB3Nlc3Npb24YAiABKAkSEwoLY2xvdWRfYm91bmQYAyABKAgSOAoIcmVjb3ZlcnkYBCABKAsyIS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlSZWNvdmVyeUgAiAEBQgsKCV9yZWNvdmVyeSJbCg9DdXN0b2R5UmVjb3ZlcnkSFQoNcHJldmlvdXNfaGVhZBgBIAEoCRIWCg5yZWNvdmVyZWRfaGVhZBgCIAEoCRIZChFyZWNvdmVyZWRfaW50ZW50cxgDIAEoBCIXChVMaXN0V29ya3NwYWNlc1JlcXVlc3QirQEKEFdvcmtzcGFjZVN1bW1hcnkSDwoHc2Vzc2lvbhgBIAEoCRIRCgl3b3Jrc3BhY2UYAiABKAkSNwoJcmVzaWRlbmN5GAMgASgOMiQubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VSZXNpZGVuY3kSPAoMc3luY19wb3N0dXJlGAQgASgOMiYubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTeW5jUG9zdHVyZSJHCg1Xb3Jrc3BhY2VMaXN0EjYKCndvcmtzcGFjZXMYASADKAsyIi5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZVN1bW1hcnkiTQoYU25hcHNob3RXb3Jrc3BhY2VSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSFAoHaWZfaGVhZBgCIAEoCUgAiAEBQgoKCF9pZl9oZWFkIlwKEVdvcmtzcGFjZVNuYXBzaG90EhEKCXdvcmtzcGFjZRgBIAEoCRIMCgRoZWFkGAIgASgJEhEKCXVuY2hhbmdlZBgDIAEoCBITCgtoYXNfY3VzdG9keRgEIAEoCCI2ChRTeW5jV29ya3NwYWNlUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEg0KBWFkbWl0GAIgASgIIrwFChVTeW5jV29ya3NwYWNlUmVzcG9uc2USEQoJd29ya3NwYWNlGAEgASgJEhoKDXByZXZpb3VzX2hlYWQYAiABKAlIAIgBARIZCgxjdXJyZW50X2hlYWQYAyABKAlIAYgBARIQCghhZG1pdHRlZBgEIAEoBBIPCgdyZWZ1c2VkGAUgASgEEhAKCGRlZmVycmVkGAYgASgEEhIKCmxvY2FsX29ubHkYByABKAgSDgoGcHVsbGVkGAggASgIEhAKCGRpdmVyZ2VkGAkgASgIEhoKEnJlY29ubmVjdF9yZXF1aXJlZBgKIAEoCBITCgtzdGlsbF9haGVhZBgLIAEoCBIPCgdvZmZsaW5lGAwgASgIEhMKC3B1c2hfZmFpbGVkGA0gASgIEh0KFWRpcmVjdF9vZmZlcl9kZWZlcnJlZBgOIAEoCBI1Cg5iaXJ0aF9vdXRjb21lcxgPIAMoCzIdLm5vbW9zLmtlcm5lbC52MS5CaXJ0aE91dGNvbWUSGwoTYWRtaXR0ZWRfaW50ZW50X2lkcxgQIAMoCRIcChRjb252ZXJnZWRfaW50ZW50X2lkcxgRIAMoCRJCCgpwdXNoX2Vycm9yGBIgASgLMikubm9tb3MucnVudGltZS52Mi5SdW50aW1lVHJhbnNwb3J0RmFpbHVyZUgCiAEBEkcKD2Rpc2NvdmVyeV9lcnJvchgTIAEoCzIpLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVRyYW5zcG9ydEZhaWx1cmVIA4gBARIzCgd0aW1pbmdzGBQgASgLMiIubm9tb3MucnVudGltZS52Mi5TeW5jUGhhc2VUaW1pbmdzQhAKDl9wcmV2aW91c19oZWFkQg8KDV9jdXJyZW50X2hlYWRCDQoLX3B1c2hfZXJyb3JCEgoQX2Rpc2NvdmVyeV9lcnJvciJdChdSdW50aW1lVHJhbnNwb3J0RmFpbHVyZRIQCghlbmRwb2ludBgBIAEoCRIOCgZzdGF0dXMYAiABKBESDwoHcmVmdXNlZBgDIAEoCBIPCgdtZXNzYWdlGAQgASgJIrEBChBTeW5jUGhhc2VUaW1pbmdzEhMKC3B1c2hfbWlsbGlzGAEgASgBEhQKDGFkbWl0X21pbGxpcxgCIAEoARIXCg9wcmVmZXRjaF9taWxsaXMYAyABKAESFwoPY29udmVyZ2VfbWlsbGlzGAQgASgBEhIKCnB1c2hfYnl0ZXMYBSABKAQSFQoNc2VydmVyX21pbGxpcxgGIAEoARIVCg1vZmZlcl9pbl9wdXNoGAcgASgIIt8BChRTdGFydEF1dG9TeW5jUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEhwKD2RlYm91bmNlX21pbGxpcxgCIAEoDUgAiAEBEhwKD2ZhbGxiYWNrX21pbGxpcxgDIAEoDUgBiAEBEhoKDXNpZ25hbF9taWxsaXMYBCABKA1IAogBARIWCglzaWduYWxfaWQYBSABKAlIA4gBAUISChBfZGVib3VuY2VfbWlsbGlzQhIKEF9mYWxsYmFja19taWxsaXNCEAoOX3NpZ25hbF9taWxsaXNCDAoKX3NpZ25hbF9pZCIiCg9BdXRvU3luY1N0YXJ0ZWQSDwoHc2Vzc2lvbhgBIAEoCSImChNTdG9wQXV0b1N5bmNSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkiIgoPQXV0b1N5bmNTdG9wcGVkEg8KB3Nlc3Npb24YASABKAkiqgEKDFdhdGNoUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEhcKD3N1YnNjcmlwdGlvbl9pZBgCIAEoCRIpCgRraW5kGAMgASgOMhsubm9tb3MucnVudGltZS52Mi5XYXRjaEtpbmQSLAoFcXVlcnkYBCABKAsyHS5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXF1ZXN0EhcKD2ludGVydmFsX21pbGxpcxgFIAEoDSInCgxXYXRjaFN0YXJ0ZWQSFwoPc3Vic2NyaXB0aW9uX2lkGAEgASgJIikKDlVud2F0Y2hSZXF1ZXN0EhcKD3N1YnNjcmlwdGlvbl9pZBgBIAEoCSInCgxXYXRjaFN0b3BwZWQSFwoPc3Vic2NyaXB0aW9uX2lkGAEgASgJInUKFFByZXBhcmVEb21haW5SZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDgoGZG9tYWluGAIgASgJEhYKDnBhY2thZ2Vfc2hhMjU2GAMgASgJEhYKCWRpcmVjdGl2ZRgEIAEoCUgAiAEBQgwKCl9kaXJlY3RpdmUiUgoORG9tYWluUHJlcGFyZWQSDgoGZG9tYWluGAEgASgJEhYKDnBhY2thZ2Vfc2hhMjU2GAIgASgJEhgKEGFscmVhZHlfcmVzaWRlbnQYAyABKAgi9gEKFU1vZGVsTGlmZWN5Y2xlUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEj0KBXN0YWdlGAogASgLMiwubm9tb3MucnVudGltZS52Mi5TdGFnZUdlbmVyYXRlZE1vZGVsUmVxdWVzdEgAEj0KBWFkb3B0GAsgASgLMiwubm9tb3MucnVudGltZS52Mi5BZG9wdEdlbmVyYXRlZE1vZGVsUmVxdWVzdEgAEkEKB3Jlc3RvcmUYDCABKAsyLi5ub21vcy5ydW50aW1lLnYyLlJlc3RvcmVHZW5lcmF0ZWRNb2RlbFJlcXVlc3RIAEILCglvcGVyYXRpb24ihgEKGlN0YWdlR2VuZXJhdGVkTW9kZWxSZXF1ZXN0Eg4KBmRvbWFpbhgBIAEoCRIWCg5jYW5kaWRhdGVfaGFzaBgCIAEoCRIQCghsYXdfdXNkehgDIAEoDBIbCg5zb3VyY2Vfc2Vzc2lvbhgEIAEoCUgAiAEBQhEKD19zb3VyY2Vfc2Vzc2lvbiJ6ChpBZG9wdEdlbmVyYXRlZE1vZGVsUmVxdWVzdBIOCgZkb21haW4YASABKAkSFgoOY2FuZGlkYXRlX2hhc2gYAiABKAkSHgoRYWNjZXB0YW5jZV9yZWFzb24YAyABKAlIAIgBAUIUChJfYWNjZXB0YW5jZV9yZWFzb24iegocUmVzdG9yZUdlbmVyYXRlZE1vZGVsUmVxdWVzdBIOCgZkb21haW4YASABKAkSFAoMY3VycmVudF9oYXNoGAIgASgJEh4KEWFjY2VwdGFuY2VfcmVhc29uGAMgASgJSACIAQFCFAoSX2FjY2VwdGFuY2VfcmVhc29uIpMBCg9Nb2RlbERpZmZlcmVuY2USMwoEa2luZBgBIAEoDjIlLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxEaWZmZXJlbmNlS2luZBIRCgRhcmVhGAIgASgJSACIAQESEwoGYWN0aW9uGAMgASgJSAGIAQESDwoHc3VtbWFyeRgEIAEoCUIHCgVfYXJlYUIJCgdfYWN0aW9uIqUBCgtNb2RlbFJldmlldxIXCg9jaGVja2VkX2FjdGlvbnMYASABKAQSGQoRY2FuZGlkYXRlX2FjdGlvbnMYAiABKAQSGQoMc2FtZV9vdXRjb21lGAMgASgISACIAQESNgoLZGlmZmVyZW5jZXMYBCADKAsyIS5ub21vcy5ydW50aW1lLnYyLk1vZGVsRGlmZmVyZW5jZUIPCg1fc2FtZV9vdXRjb21lIoUCChZNb2RlbExpZmVjeWNsZVJlc3BvbnNlEhAKCGFjY2VwdGVkGAEgASgIEjQKBXN0YWdlGAIgASgOMiUubm9tb3MucnVudGltZS52Mi5Nb2RlbExpZmVjeWNsZVN0YWdlEhQKB21lc3NhZ2UYAyABKAlIAIgBARIRCgRoZWFkGAQgASgJSAGIAQESFwoKcmVjZWlwdF9pZBgFIAEoCUgCiAEBEjIKBnJldmlldxgGIAEoCzIdLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxSZXZpZXdIA4gBAUIKCghfbWVzc2FnZUIHCgVfaGVhZEINCgtfcmVjZWlwdF9pZEIJCgdfcmV2aWV3ImcKGlJlc29sdmVDdXN0b2R5QnJlYWtSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSOAoIZGVjaXNpb24YAiABKA4yJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha0RlY2lzaW9uImEKFEN1c3RvZHlCcmVha1Jlc29sdmVkEg8KB3Nlc3Npb24YASABKAkSOAoIZGVjaXNpb24YAiABKA4yJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha0RlY2lzaW9uIhMKEUNsb3NlUmVhbG1SZXF1ZXN0Ig0KC1JlYWxtQ2xvc2VkIuUBChFEZWFkTGV0dGVyUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEjgKBGxpc3QYCiABKAsyKC5ub21vcy5ydW50aW1lLnYyLkxpc3REZWFkTGV0dGVyc1JlcXVlc3RIABI5CgVyZXRyeRgLIAEoCzIoLm5vbW9zLnJ1bnRpbWUudjIuUmV0cnlEZWFkTGV0dGVyUmVxdWVzdEgAEj0KB2Rpc2NhcmQYDCABKAsyKi5ub21vcy5ydW50aW1lLnYyLkRpc2NhcmREZWFkTGV0dGVyUmVxdWVzdEgAQgsKCW9wZXJhdGlvbiIYChZMaXN0RGVhZExldHRlcnNSZXF1ZXN0IisKFlJldHJ5RGVhZExldHRlclJlcXVlc3QSEQoJaW50ZW50X2lkGAEgASgJIi0KGERpc2NhcmREZWFkTGV0dGVyUmVxdWVzdBIRCglpbnRlbnRfaWQYASABKAkivQEKEkRlYWRMZXR0ZXJSZXNwb25zZRIwCgRsaXN0GAogASgLMiAubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyTGlzdEgAEjIKBXJldHJ5GAsgASgLMiEubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmV0cnlIABI2CgdkaXNjYXJkGAwgASgLMiMubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyRGlzY2FyZEgAQgkKB291dGNvbWUiRAoORGVhZExldHRlckxpc3QSMgoHZW50cmllcxgBIAMoCzIhLm5vbW9zLnJ1bnRpbWUudjIuRGVhZExldHRlckVudHJ5IrkBCg9EZWFkTGV0dGVyRW50cnkSDwoCaWQYASABKAlIAIgBARISCgpjb21taXRfb2lkGAIgASgJEg4KBnNvdXJjZRgDIAEoCRIPCgdtZXNzYWdlGAQgASgJEhMKBmRvbWFpbhgFIAEoCUgBiAEBEhYKCWRpcmVjdGl2ZRgGIAEoCUgCiAEBEhMKC3JlY29yZGVkX2F0GAcgASgJQgUKA19pZEIJCgdfZG9tYWluQgwKCl9kaXJlY3RpdmUieQoPRGVhZExldHRlclJldHJ5Eg8KB3JldHJpZWQYASABKAgSEQoEaGVhZBgCIAEoCUgAiAEBEhcKD2FscmVhZHlfb25fbWFpbhgDIAEoCBIUCgdtZXNzYWdlGAQgASgJSAGIAQFCBwoFX2hlYWRCCgoIX21lc3NhZ2UiJAoRRGVhZExldHRlckRpc2NhcmQSDwoHcmVtb3ZlZBgBIAEoBCLNBQoMUnVudGltZUV2ZW50EhAKCHNlcXVlbmNlGAEgASgEEhQKB3Nlc3Npb24YAiABKAlIAYgBARIvCgVyZWFkeRgKIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVJlYWR5SAASNwoNd2F0Y2hfY2hhbmdlZBgLIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuV2F0Y2hDaGFuZ2VkSAASOQoOc3luY19jb21wbGV0ZWQYDCABKAsyHy5ub21vcy5ydW50aW1lLnYyLlN5bmNDb21wbGV0ZWRIABI1CgxsaW5rX2NoYW5nZWQYDSABKAsyHS5ub21vcy5ydW50aW1lLnYyLkxpbmtDaGFuZ2VkSAASOQoOc2lnbmFsX2NoYW5nZWQYDiABKAsyHy5ub21vcy5ydW50aW1lLnYyLlNpZ25hbENoYW5nZWRIABI7Cg9jdXN0b2R5X2NoYW5nZWQYDyABKAsyIC5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlDaGFuZ2VkSAASQgoTbG9jYWxfd29ya19yZWplY3RlZBgQIAEoCzIjLm5vbW9zLnJ1bnRpbWUudjIuTG9jYWxXb3JrUmVqZWN0ZWRIABIzCgtsYXdfY2hhbmdlZBgRIAEoCzIcLm5vbW9zLnJ1bnRpbWUudjIuTGF3Q2hhbmdlZEgAEkMKD2tlcm5lbF9wcm9ncmVzcxgSIAEoCzIoLm5vbW9zLnJ1bnRpbWUudjIuS2VybmVsUHJvZ3Jlc3NPYnNlcnZlZEgAEi0KBHNwYW4YEyABKAsyHS5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVTcGFuSAASPwoRdHJhbnNmZXJfcHJvZ3Jlc3MYFCABKAsyIi5ub21vcy5ydW50aW1lLnYyLlRyYW5zZmVyUHJvZ3Jlc3NIAEIHCgVldmVudEIKCghfc2Vzc2lvbiI+CgxSdW50aW1lUmVhZHkSFwoPcnVudGltZV92ZXJzaW9uGAEgASgJEhUKDWtlcm5lbF9zaGEyNTYYAiABKAwigAEKDFdhdGNoQ2hhbmdlZBIXCg9zdWJzY3JpcHRpb25faWQYASABKAkSEwoLcmVzdWx0X3VzZGEYAiABKAwSNgoHZmFpbHVyZRgDIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUZhaWx1cmVIAIgBAUIKCghfZmFpbHVyZSKcAQoNU3luY0NvbXBsZXRlZBIOCgZyZWFzb24YASABKAkSNwoGcmVzdWx0GAIgASgLMicubm9tb3MucnVudGltZS52Mi5TeW5jV29ya3NwYWNlUmVzcG9uc2USNgoHZmFpbHVyZRgDIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUZhaWx1cmVIAIgBAUIKCghfZmFpbHVyZSI7CgtMaW5rQ2hhbmdlZBIsCgZzdGF0dXMYASABKA4yHC5ub21vcy5ydW50aW1lLnYyLkxpbmtTdGF0dXMiOAoNU2lnbmFsQ2hhbmdlZBIOCgZkb21haW4YASABKAkSFwoPcHJvamVjdGlvbl91c2RhGAIgASgMIvQBCg5DdXN0b2R5Q2hhbmdlZBIxCgRraW5kGAEgASgOMiMubm9tb3MucnVudGltZS52Mi5DdXN0b2R5Q2hhbmdlS2luZBI1Cg1jdXN0b2R5X2JyZWFrGAIgASgLMh4ubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QnJlYWsSFgoJb3BlcmF0aW9uGAMgASgJSACIAQESFQoIcmVjbG9uZWQYBCABKAhIAYgBARIbCg5wYXJrZWRfaW50ZW50cxgFIAEoBEgCiAEBQgwKCl9vcGVyYXRpb25CCwoJX3JlY2xvbmVkQhEKD19wYXJrZWRfaW50ZW50cyLhAQoRTG9jYWxXb3JrUmVqZWN0ZWQSEQoJd29ya3NwYWNlGAEgASgJEjYKB3JlZnVzZWQYAiADKAsyJS5ub21vcy5ydW50aW1lLnYyLlJlamVjdGVkTG9jYWxJbnRlbnQSDgoGcGFya2VkGAMgASgIEhUKCHJlc2V0X3RvGAQgASgJSACIAQESEQoJcmV0cnlhYmxlGAUgASgIEjoKBnNvdXJjZRgGIAEoDjIqLm5vbW9zLnJ1bnRpbWUudjIuTG9jYWxXb3JrUmVqZWN0aW9uU291cmNlQgsKCV9yZXNldF90byJjChNDdXN0b2R5U3VwZXJzZXNzaW9uEhoKDXN1cGVyc2VkZWRfYXQYASABKAlIAIgBARITCgZyZWFzb24YAiABKAlIAYgBAUIQCg5fc3VwZXJzZWRlZF9hdEIJCgdfcmVhc29uIrgCCgxDdXN0b2R5QnJlYWsSMAoEa2luZBgBIAEoDjIiLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrS2luZBIVCg1sb2NhbF9nZW5lc2lzGAIgASgJEhYKDnJlbW90ZV9nZW5lc2lzGAMgASgJEhoKEnJlbW90ZV9pbmNhcm5hdGlvbhgEIAEoCRJACgxzdXBlcnNlc3Npb24YBSABKAsyJS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlTdXBlcnNlc3Npb25IAIgBARIaChJsb2NhbF9vbmx5X2ludGVudHMYBiABKAQSIgoVbGFzdF9zeW5jZWRfYXRfbWlsbGlzGAcgASgESAGIAQFCDwoNX3N1cGVyc2Vzc2lvbkIYChZfbGFzdF9zeW5jZWRfYXRfbWlsbGlzIs0BChNSZWplY3RlZExvY2FsSW50ZW50EhYKCWludGVudF9pZBgBIAEoCUgAiAEBEhcKCmNvbW1pdF9vaWQYAiABKAlIAYgBARITCgZkb21haW4YAyABKAlIAogBARIWCglkaXJlY3RpdmUYBCABKAlIA4gBARIPCgdtZXNzYWdlGAUgASgJEhEKCXJldHJ5YWJsZRgGIAEoCEIMCgpfaW50ZW50X2lkQg0KC19jb21taXRfb2lkQgkKB19kb21haW5CDAoKX2RpcmVjdGl2ZSJQCgpMYXdDaGFuZ2VkEg4KBmRvbWFpbhgBIAEoCRIWCg5wYWNrYWdlX3NoYTI1NhgCIAEoCRIaChJjb21wYXRpYmlsaXR5X3VzZGEYAyABKAwi3QEKC1J1bnRpbWVTcGFuEhAKCHRyYWNlX2lkGAEgASgMEg8KB3NwYW5faWQYAiABKAwSGwoOcGFyZW50X3NwYW5faWQYAyABKAxIAIgBARIMCgRuYW1lGAQgASgJEhoKEnN0YXJ0ZWRfdW5peF9uYW5vcxgFIAEoBBIWCg5kdXJhdGlvbl9uYW5vcxgGIAEoBBI5CgphdHRyaWJ1dGVzGAcgAygLMiUubm9tb3MucnVudGltZS52Mi5EaWFnbm9zdGljQXR0cmlidXRlQhEKD19wYXJlbnRfc3Bhbl9pZCLqAQoWS2VybmVsUHJvZ3Jlc3NPYnNlcnZlZBI5CghzbmFwc2hvdBgBIAEoCzInLm5vbW9zLmtlcm5lbC52MS5LZXJuZWxQcm9ncmVzc1NuYXBzaG90EiQKHGhvc3Rfb2JzZXJ2ZWRfZWxhcHNlZF9taWNyb3MYAiABKAQSKgoiaG9zdF9vYnNlcnZlZF9waGFzZV9lbGFwc2VkX21pY3JvcxgDIAEoBBIeChZwcm9jZXNzX3Jlc2lkZW50X2J5dGVzGAQgASgEEiMKG3Byb2Nlc3NfcGVha19yZXNpZGVudF9ieXRlcxgFIAEoBCKCAQoQVHJhbnNmZXJQcm9ncmVzcxIWCg5yZWNlaXZlZF9ieXRlcxgBIAEoBBIYCgt0b3RhbF9ieXRlcxgCIAEoBEgAiAEBEiwKBGtpbmQYAyABKA4yHi5ub21vcy5ydW50aW1lLnYyLlRyYW5zZmVyS2luZEIOCgxfdG90YWxfYnl0ZXMqmQEKEkN1c3RvZHlCcmVha1BvbGljeRIkCiBDVVNUT0RZX0JSRUFLX1BPTElDWV9VTlNQRUNJRklFRBAAEhwKGENVU1RPRFlfQlJFQUtfUE9MSUNZX0FTSxABEh4KGkNVU1RPRFlfQlJFQUtfUE9MSUNZX0FET1BUEAISHwobQ1VTVE9EWV9CUkVBS19QT0xJQ1lfUkVKRUNUEAMqoAEKEldvcmtzcGFjZVJlc2lkZW5jeRIjCh9XT1JLU1BBQ0VfUkVTSURFTkNZX1VOU1BFQ0lGSUVEEAASHwobV09SS1NQQUNFX1JFU0lERU5DWV9NT1VOVEVEEAESHgoaV09SS1NQQUNFX1JFU0lERU5DWV9QQVJLRUQQAhIkCiBXT1JLU1BBQ0VfUkVTSURFTkNZX0NVU1RPRFlfT05MWRADKo0BChRXb3Jrc3BhY2VTeW5jUG9zdHVyZRImCiJXT1JLU1BBQ0VfU1lOQ19QT1NUVVJFX1VOU1BFQ0lGSUVEEAASJQohV09SS1NQQUNFX1NZTkNfUE9TVFVSRV9MT0NBTF9PTkxZEAESJgoiV09SS1NQQUNFX1NZTkNfUE9TVFVSRV9DTE9VRF9CT1VORBACKqgBCglXYXRjaEtpbmQSGgoWV0FUQ0hfS0lORF9VTlNQRUNJRklFRBAAEhQKEFdBVENIX0tJTkRfUVVFUlkQARIUChBXQVRDSF9LSU5EX0JZX0lEEAISFgoSV0FUQ0hfS0lORF9TUEFUSUFMEAMSFwoTV0FUQ0hfS0lORF9BQ1RJVklUWRAEIgQIBRAFKhxXQVRDSF9LSU5EX1BFTkRJTkdfQ09ORkxJQ1RTKqQDChNNb2RlbExpZmVjeWNsZVN0YWdlEiUKIU1PREVMX0xJRkVDWUNMRV9TVEFHRV9VTlNQRUNJRklFRBAAEisKJ01PREVMX0xJRkVDWUNMRV9TVEFHRV9JREVOVElUWV9SRVFVSVJFRBABEioKJk1PREVMX0xJRkVDWUNMRV9TVEFHRV9TVEFHSU5HX1JFUVVJUkVEEAISIwofTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1BSRUZMSUdIVBADEi0KKU1PREVMX0xJRkVDWUNMRV9TVEFHRV9BQ0NFUFRBTkNFX1JFUVVJUkVEEAQSIwofTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0FETUlTU0lPThAFEiEKHU1PREVMX0xJRkVDWUNMRV9TVEFHRV9QRU5ESU5HEAYSIgoeTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1BST01PVEVEEAcSIgoeTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1JFU1RPUkVEEAgSKQolTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0FMUkVBRFlfQ1VSUkVOVBAJKqQBChNNb2RlbERpZmZlcmVuY2VLaW5kEiUKIU1PREVMX0RJRkZFUkVOQ0VfS0lORF9VTlNQRUNJRklFRBAAEh8KG01PREVMX0RJRkZFUkVOQ0VfS0lORF9SVUxFUxABEiEKHU1PREVMX0RJRkZFUkVOQ0VfS0lORF9PVVRDT01FEAISIgoeTU9ERUxfRElGRkVSRU5DRV9LSU5EX0VWSURFTkNFEAMqgwEKFEN1c3RvZHlCcmVha0RlY2lzaW9uEiYKIkNVU1RPRFlfQlJFQUtfREVDSVNJT05fVU5TUEVDSUZJRUQQABIgChxDVVNUT0RZX0JSRUFLX0RFQ0lTSU9OX0FET1BUEAESIQodQ1VTVE9EWV9CUkVBS19ERUNJU0lPTl9SRUpFQ1QQAipXCgpMaW5rU3RhdHVzEhsKF0xJTktfU1RBVFVTX1VOU1BFQ0lGSUVEEAASFAoQTElOS19TVEFUVVNfT1BFThABEhYKEkxJTktfU1RBVFVTX0NMT1NFRBACKuIBChFDdXN0b2R5Q2hhbmdlS2luZBIjCh9DVVNUT0RZX0NIQU5HRV9LSU5EX1VOU1BFQ0lGSUVEEAASIAocQ1VTVE9EWV9DSEFOR0VfS0lORF9ERVRFQ1RFRBABEiAKHENVU1RPRFlfQ0hBTkdFX0tJTkRfUkVKRUNURUQQAhIgChxDVVNUT0RZX0NIQU5HRV9LSU5EX0FET1BUSU5HEAMSJQohQ1VTVE9EWV9DSEFOR0VfS0lORF9BRE9QVF9SRUZVU0VEEAQSGwoXQ1VTVE9EWV9DSEFOR0VfS0lORF9BU0sQBSp6ChBDdXN0b2R5QnJlYWtLaW5kEiIKHkNVU1RPRFlfQlJFQUtfS0lORF9VTlNQRUNJRklFRBAAEiEKHUNVU1RPRFlfQlJFQUtfS0lORF9TVVBFUlNFREVEEAESHwobQ1VTVE9EWV9CUkVBS19LSU5EX0RJVkVSR0VEEAIqmAEKGExvY2FsV29ya1JlamVjdGlvblNvdXJjZRIrCidMT0NBTF9XT1JLX1JFSkVDVElPTl9TT1VSQ0VfVU5TUEVDSUZJRUQQABIpCiVMT0NBTF9XT1JLX1JFSkVDVElPTl9TT1VSQ0VfQURNSVNTSU9OEAESJAogTE9DQUxfV09SS19SRUpFQ1RJT05fU09VUkNFX1NZTkMQAip2CgxUcmFuc2ZlcktpbmQSHQoZVFJBTlNGRVJfS0lORF9VTlNQRUNJRklFRBAAEhcKE1RSQU5TRkVSX0tJTkRfREVMVEEQARIWChJUUkFOU0ZFUl9LSU5EX0ZVTEwQAhIWChJUUkFOU0ZFUl9LSU5EX1BVU0gQAzJkChNOb21vc1J1bnRpbWVTZXJ2aWNlEk0KBkludm9rZRIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVJlcXVlc3QaIS5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVSZXNwb25zZWIGcHJvdG8z", [file_nomos_kernel_v1_kernel, file_nomos_kernel_v1_progress]);
|
|
6479
|
+
file_nomos_runtime_v2_runtime = /* @__PURE__ */ fileDesc4("Ch5ub21vcy9ydW50aW1lL3YyL3J1bnRpbWUucHJvdG8SEG5vbW9zLnJ1bnRpbWUudjIitwoKDlJ1bnRpbWVSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoBBIyCgV0cmFjZRgDIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuVHJhY2VDb250ZXh0SAGIAQESOgoLa2VybmVsX2NhbGwYCiABKAsyIy5ub21vcy5ydW50aW1lLnYyLktlcm5lbENhbGxSZXF1ZXN0SAASMwoHY29ubmVjdBgLIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuQ29ubmVjdFJlcXVlc3RIABJCCg9saXN0X3dvcmtzcGFjZXMYDCABKAsyJy5ub21vcy5ydW50aW1lLnYyLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdEgAEkgKEnNuYXBzaG90X3dvcmtzcGFjZRgNIAEoCzIqLm5vbW9zLnJ1bnRpbWUudjIuU25hcHNob3RXb3Jrc3BhY2VSZXF1ZXN0SAASQAoOc3luY193b3Jrc3BhY2UYDiABKAsyJi5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXF1ZXN0SAASQQoPc3RhcnRfYXV0b19zeW5jGA8gASgLMiYubm9tb3MucnVudGltZS52Mi5TdGFydEF1dG9TeW5jUmVxdWVzdEgAEj8KDnN0b3BfYXV0b19zeW5jGBAgASgLMiUubm9tb3MucnVudGltZS52Mi5TdG9wQXV0b1N5bmNSZXF1ZXN0SAASLwoFd2F0Y2gYESABKAsyHi5ub21vcy5ydW50aW1lLnYyLldhdGNoUmVxdWVzdEgAEjMKB3Vud2F0Y2gYEiABKAsyIC5ub21vcy5ydW50aW1lLnYyLlVud2F0Y2hSZXF1ZXN0SAASQAoOcHJlcGFyZV9kb21haW4YEyABKAsyJi5ub21vcy5ydW50aW1lLnYyLlByZXBhcmVEb21haW5SZXF1ZXN0SAASTQoVcmVzb2x2ZV9jdXN0b2R5X2JyZWFrGBQgASgLMiwubm9tb3MucnVudGltZS52Mi5SZXNvbHZlQ3VzdG9keUJyZWFrUmVxdWVzdEgAEjoKC2Nsb3NlX3JlYWxtGBUgASgLMiMubm9tb3MucnVudGltZS52Mi5DbG9zZVJlYWxtUmVxdWVzdEgAEjoKC2RlYWRfbGV0dGVyGBYgASgLMiMubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmVxdWVzdEgAEkAKDmhpc3RvcmljX3F1ZXJ5GBcgASgLMiYubm9tb3MucnVudGltZS52Mi5IaXN0b3JpY1F1ZXJ5UmVxdWVzdEgAEkIKD21vZGVsX2xpZmVjeWNsZRgYIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxMaWZlY3ljbGVSZXF1ZXN0SAASXQodZXN0YWJsaXNoX2FwcGxpY2F0aW9uX2N1c3RvZHkYGSABKAsyNC5ub21vcy5ydW50aW1lLnYyLkVzdGFibGlzaEFwcGxpY2F0aW9uQ3VzdG9keVJlcXVlc3RIABJEChB3b3Jrc3BhY2Vfc3RhdHVzGBogASgLMigubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTdGF0dXNSZXF1ZXN0SAASTwoWcmVtb3RlX2dlbmVyYXRlZF9vZmZlchgbIAEoCzItLm5vbW9zLnJ1bnRpbWUudjIuUmVtb3RlR2VuZXJhdGVkT2ZmZXJSZXF1ZXN0SABCCQoHY29tbWFuZEIICgZfdHJhY2UiUwoRS2VybmVsQ2FsbFJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRItCgdyZXF1ZXN0GAIgASgLMhwubm9tb3Mua2VybmVsLnYxLkNhbGxSZXF1ZXN0IvECCiJFc3RhYmxpc2hBcHBsaWNhdGlvbkN1c3RvZHlSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDgoGcGFyZW50GAIgASgJEhEKCXByaW5jaXBhbBgDIAEoCRIPCgdzdWJqZWN0GAQgASgJEhUKDWRldmljZV9zZWNyZXQYBSABKAwSFQoNZGV2aWNlX3B1YmxpYxgGIAEoDBISCgphdXRoX3Rva2VuGAcgASgJEhAKCGlkX3Rva2VuGAggASgJEhQKDHZlcmlmaWVkX3ZpYRgJIAEoCRIPCgdib3JuX2F0GAogASgJEjsKE2Vucm9sbF9maXJzdF9kZXZpY2UYCyABKAsyHi5ub21vcy5rZXJuZWwudjEuRGlyZWN0aXZlQ2FsbBI9ChViaXJ0aF9yZWNlaXZpbmdfZ3JvdXAYDCABKAsyHi5ub21vcy5rZXJuZWwudjEuRGlyZWN0aXZlQ2FsbBIPCgdjb25maXJtGA0gASgIIp8BCh1BcHBsaWNhdGlvbkN1c3RvZHlFc3RhYmxpc2hlZBIMCgRob21lGAEgASgJEhcKCmNoaWxkX2hlYWQYAiABKAlIAIgBARIQCgh2ZXJpZmllZBgDIAEoCBIfChJ2ZXJpZmljYXRpb25fZXJyb3IYBCABKAlIAYgBAUINCgtfY2hpbGRfaGVhZEIVChNfdmVyaWZpY2F0aW9uX2Vycm9yImUKFEhpc3RvcmljUXVlcnlSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDgoGbW9tZW50GAIgASgJEiwKBXF1ZXJ5GAMgASgLMh0ubm9tb3Mua2VybmVsLnYxLlF1ZXJ5UmVxdWVzdCLGCgoPUnVudGltZVJlc3BvbnNlEhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoBBIzCgdmYWlsdXJlGAogASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAEjQKC2tlcm5lbF9jYWxsGAsgASgLMh0ubm9tb3Mua2VybmVsLnYxLkNhbGxSZXNwb25zZUgAEjAKCWNvbm5lY3RlZBgMIAEoCzIbLm5vbW9zLnJ1bnRpbWUudjIuQ29ubmVjdGVkSAASOQoOd29ya3NwYWNlX2xpc3QYDSABKAsyHy5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZUxpc3RIABJBChJ3b3Jrc3BhY2Vfc25hcHNob3QYDiABKAsyIy5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZVNuYXBzaG90SAASQQoOc3luY193b3Jrc3BhY2UYDyABKAsyJy5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXNwb25zZUgAEj4KEWF1dG9fc3luY19zdGFydGVkGBAgASgLMiEubm9tb3MucnVudGltZS52Mi5BdXRvU3luY1N0YXJ0ZWRIABI+ChFhdXRvX3N5bmNfc3RvcHBlZBgRIAEoCzIhLm5vbW9zLnJ1bnRpbWUudjIuQXV0b1N5bmNTdG9wcGVkSAASNwoNd2F0Y2hfc3RhcnRlZBgSIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuV2F0Y2hTdGFydGVkSAASNwoNd2F0Y2hfc3RvcHBlZBgTIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuV2F0Y2hTdG9wcGVkSAASOwoPZG9tYWluX3ByZXBhcmVkGBQgASgLMiAubm9tb3MucnVudGltZS52Mi5Eb21haW5QcmVwYXJlZEgAEkgKFmN1c3RvZHlfYnJlYWtfcmVzb2x2ZWQYFSABKAsyJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha1Jlc29sdmVkSAASNQoMcmVhbG1fY2xvc2VkGBYgASgLMh0ubm9tb3MucnVudGltZS52Mi5SZWFsbUNsb3NlZEgAEjMKB2Jsb2NrZWQYFyABKAsyIC5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVCbG9ja2VkSAASSAoWcmVtb3RlX29mZmVyX2FkbWlzc2lvbhgYIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuUmVtb3RlT2ZmZXJBZG1pc3Npb25IABI7CgtkZWFkX2xldHRlchgZIAEoCzIkLm5vbW9zLnJ1bnRpbWUudjIuRGVhZExldHRlclJlc3BvbnNlSAASQwoPbW9kZWxfbGlmZWN5Y2xlGBogASgLMigubm9tb3MucnVudGltZS52Mi5Nb2RlbExpZmVjeWNsZVJlc3BvbnNlSAASWgofYXBwbGljYXRpb25fY3VzdG9keV9lc3RhYmxpc2hlZBgbIAEoCzIvLm5vbW9zLnJ1bnRpbWUudjIuQXBwbGljYXRpb25DdXN0b2R5RXN0YWJsaXNoZWRIABI9ChB3b3Jrc3BhY2Vfc3RhdHVzGBwgASgLMiEubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTdGF0dXNIABJQChZyZW1vdGVfZ2VuZXJhdGVkX29mZmVyGB0gASgLMi4ubm9tb3MucnVudGltZS52Mi5SZW1vdGVHZW5lcmF0ZWRPZmZlckFjY2VwdGVkSABCCQoHb3V0Y29tZSK3AQobUmVtb3RlR2VuZXJhdGVkT2ZmZXJSZXF1ZXN0EhYKDnNvdXJjZV9zZXNzaW9uGAEgASgJEhgKEHRhcmdldF93b3Jrc3BhY2UYAiABKAkSDQoFYWN0b3IYAyABKAkSFQoNYXV0aG9yX3NlY3JldBgEIAEoDBISCgphdXRoX3Rva2VuGAUgASgMEiwKBGNhbGwYBiABKAsyHi5ub21vcy5rZXJuZWwudjEuRGlyZWN0aXZlQ2FsbCI/ChxSZW1vdGVHZW5lcmF0ZWRPZmZlckFjY2VwdGVkEhEKCXdvcmtzcGFjZRgBIAEoCRIMCgRoZWFkGAIgASgJIp8BCg5SdW50aW1lQmxvY2tlZBJBCgl3b3Jrc3BhY2UYASABKAsyLC5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZVJlc2lkZW5jeVJlcXVpcmVkSAASQAoIc2libGluZ3MYAiABKAsyLC5ub21vcy5ydW50aW1lLnYyLlNpYmxpbmdSZXNpZGVuY2llc1JlcXVpcmVkSABCCAoGcmVhc29uIi8KGldvcmtzcGFjZVJlc2lkZW5jeVJlcXVpcmVkEhEKCXdvcmtzcGFjZRgBIAEoCSJVChhTaWJsaW5nUmVzaWRlbmN5UmVxdWlyZWQSEQoJd29ya3NwYWNlGAEgASgJEhMKC3NvdXJjZV9oZWFkGAIgASgJEhEKCWZvbGRfcm9vdBgDIAEoCSJdChpTaWJsaW5nUmVzaWRlbmNpZXNSZXF1aXJlZBI/CgtyZXNpZGVuY2llcxgBIAMoCzIqLm5vbW9zLnJ1bnRpbWUudjIuU2libGluZ1Jlc2lkZW5jeVJlcXVpcmVkIoYCChRSZW1vdGVPZmZlckFkbWlzc2lvbhIRCgl3b3Jrc3BhY2UYASABKAkSDAoEbWFpbhgCIAEoCRIYCgtzZWFsZWRfbWFpbhgDIAEoCUgAiAEBEi8KB3ZlcmRpY3QYBCABKAsyHi5ub21vcy5rZXJuZWwudjEuT2ZmZXJSZXNwb25zZRIzCgxib3JuX2N1c3RvZHkYBSADKAsyHS5ub21vcy5ydW50aW1lLnYyLkJvcm5DdXN0b2R5EhMKC3Jlc3VsdF9wYWNrGAYgASgMEhgKC3Jlc3VsdF9iYXNlGAcgASgJSAGIAQFCDgoMX3NlYWxlZF9tYWluQg4KDF9yZXN1bHRfYmFzZSJKCgtCb3JuQ3VzdG9keRItCgVjaGlsZBgBIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5Cb3JuV29ya3NwYWNlEgwKBHBhY2sYAiABKAwi+QEKGEN1c3RvZHlPZmZlckJhdGNoUmVxdWVzdBIYChBwcm90b2NvbF92ZXJzaW9uGAEgASgNEhIKCnJlcXVlc3RfaWQYAiABKAkSNwoGaW5saW5lGAMgASgLMiUubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW5saW5lT2ZmZXJzSAASRgoRc2Vzc2lvbl9jYW5kaWRhdGUYBCABKAsyKS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlTZXNzaW9uQ2FuZGlkYXRlSAASFgoJYmFzZV9oZWFkGAUgASgJSAGIAQFCCAoGc291cmNlQgwKCl9iYXNlX2hlYWQiTgoSQ3VzdG9keUludGVudE9mZmVyEg8KB3Nlc3Npb24YASABKAkSEgoKY29tbWl0X29pZBgCIAEoCRITCgtjaGFuZ2VfdXNkYRgDIAEoDCJLChNDdXN0b2R5SW5saW5lT2ZmZXJzEjQKBm9mZmVycxgBIAMoCzIkLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudE9mZmVyIiwKF0N1c3RvZHlTZXNzaW9uQ2FuZGlkYXRlEhEKCXJlZmVyZW5jZRgBIAEoCSL3AQoZQ3VzdG9keU9mZmVyQmF0Y2hSZXNwb25zZRIYChBwcm90b2NvbF92ZXJzaW9uGAEgASgNEhIKCnJlcXVlc3RfaWQYAiABKAkSNwoJYWRtaXNzaW9uGAogASgLMiIubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QWRtaXNzaW9uSAASMwoHZmFpbHVyZRgLIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUZhaWx1cmVIABIzCgdibG9ja2VkGAwgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lQmxvY2tlZEgAQgkKB291dGNvbWUi7gIKEEN1c3RvZHlBZG1pc3Npb24SDAoEbWFpbhgBIAEoCRIYCgtzZWFsZWRfbWFpbhgCIAEoCUgAiAEBEjsKCHNlc3Npb25zGAMgAygLMikubm9tb3MucnVudGltZS52Mi5DdXN0b2R5U2Vzc2lvbkFkbWlzc2lvbhI1Cg5iaXJ0aF9vdXRjb21lcxgEIAMoCzIdLm5vbW9zLmtlcm5lbC52MS5CaXJ0aE91dGNvbWUSMwoMYm9ybl9jdXN0b2R5GAUgAygLMh0ubm9tb3MucnVudGltZS52Mi5Cb3JuQ3VzdG9keRITCgtyZXN1bHRfcGFjaxgGIAEoDBIYCgtyZXN1bHRfYmFzZRgHIAEoCUgBiAEBEjoKB3RpbWluZ3MYCCABKAsyKS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlBZG1pc3Npb25UaW1pbmdzQg4KDF9zZWFsZWRfbWFpbkIOCgxfcmVzdWx0X2Jhc2UiZQoXQ3VzdG9keVNlc3Npb25BZG1pc3Npb24SDwoHc2Vzc2lvbhgBIAEoCRI5CgdpbnRlbnRzGAIgAygLMigubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW50ZW50QWRtaXNzaW9uIpACChZDdXN0b2R5SW50ZW50QWRtaXNzaW9uEhIKCmNvbW1pdF9vaWQYASABKAkSFgoJaW50ZW50X2lkGAIgASgJSAGIAQESOwoIYWRtaXR0ZWQYCiABKAsyJy5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbnRlbnRBZG1pdHRlZEgAEjkKB3NraXBwZWQYCyABKAsyJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbnRlbnRTa2lwcGVkSAASOQoHcmVmdXNlZBgMIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudFJlZnVzZWRIAEIJCgdvdXRjb21lQgwKCl9pbnRlbnRfaWQikAEKFUN1c3RvZHlJbnRlbnRBZG1pdHRlZBIMCgRoZWFkGAEgASgJEjMKB2NyZWF0ZWQYAiADKAsyIi5ub21vcy5rZXJuZWwudjEuT2ZmZXJBZ2dyZWdhdGVSZWYSNAoIYWZmZWN0ZWQYAyADKAsyIi5ub21vcy5rZXJuZWwudjEuT2ZmZXJBZ2dyZWdhdGVSZWYiLwoUQ3VzdG9keUludGVudFNraXBwZWQSFwoPYWxyZWFkeV9vbl9tYWluGAEgASgIIloKFEN1c3RvZHlJbnRlbnRSZWZ1c2VkEg8KB21lc3NhZ2UYASABKAkSFQoNZGVhZF9sZXR0ZXJlZBgCIAEoCBIRCgRoaW50GAMgASgJSACIAQFCBwoFX2hpbnQi7QEKF0N1c3RvZHlBZG1pc3Npb25UaW1pbmdzEhQKDHRvdGFsX21pbGxpcxgBIAEoARITCgtzY2FuX21pbGxpcxgCIAEoARIUCgxmZXRjaF9taWxsaXMYAyABKAESEwoLc2VhbF9taWxsaXMYBCABKAESGAoQZ2F0ZV9mb2xkX21pbGxpcxgFIAEoARIUCgxpbnRlbnRfY291bnQYBiABKA0SFQoNc2Vzc2lvbl9jb3VudBgHIAEoDRI1CgVzcGFucxgIIAMoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUFkbWlzc2lvblNwYW4ilwEKFEN1c3RvZHlBZG1pc3Npb25TcGFuEgoKAmlkGAEgASgJEg0KBXRyYWNrGAIgASgJEgwKBG5hbWUYAyABKAkSDAoEa2luZBgEIAEoCRINCgVkZXB0aBgFIAEoDRIbChNzdGFydGVkX3VuaXhfbWlsbGlzGAYgASgBEhwKFGZpbmlzaGVkX3VuaXhfbWlsbGlzGAcgASgBIkIKDFRyYWNlQ29udGV4dBIQCgh0cmFjZV9pZBgBIAEoDBIPCgdzcGFuX2lkGAIgASgMEg8KB3NhbXBsZWQYAyABKAgi6QEKDlJ1bnRpbWVGYWlsdXJlEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCRIRCgljb21wb25lbnQYAyABKAkSFgoJd29ya3NwYWNlGAQgASgJSACIAQESEwoGZG9tYWluGAUgASgJSAGIAQESFgoJZGlyZWN0aXZlGAYgASgJSAKIAQESOQoKYXR0cmlidXRlcxgHIAMoCzIlLm5vbW9zLnJ1bnRpbWUudjIuRGlhZ25vc3RpY0F0dHJpYnV0ZUIMCgpfd29ya3NwYWNlQgkKB19kb21haW5CDAoKX2RpcmVjdGl2ZSKlAQoTRGlhZ25vc3RpY0F0dHJpYnV0ZRIMCgRuYW1lGAEgASgJEhYKDHN0cmluZ192YWx1ZRgCIAEoCUgAEhcKDWludGVnZXJfdmFsdWUYAyABKBJIABIWCgxkb3VibGVfdmFsdWUYBCABKAFIABIXCg1ib29sZWFuX3ZhbHVlGAUgASgISAASFQoLYnl0ZXNfdmFsdWUYBiABKAxIAEIHCgV2YWx1ZSLNAgoOQ29ubmVjdFJlcXVlc3QSEQoJd29ya3NwYWNlGAEgASgJEhEKCWNsaWVudF9pZBgCIAEoCRIUCgdzZXNzaW9uGAMgASgJSACIAQESEgoFY2xvdWQYBCABKAlIAYgBARISCgphdXRoX3Rva2VuGAUgASgMEhUKDWF1dGhvcl9zZWNyZXQYBiABKAwSIgoabWF4aW11bV9tb3VudGVkX3dvcmtzcGFjZXMYByABKA0SFAoMYWxsb3dfdW5ib3JuGAggASgIEg8KB3JlY292ZXIYCSABKAgSQgoUY3VzdG9keV9icmVha19wb2xpY3kYCiABKA4yJC5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha1BvbGljeRIbChNoYXNfcmVzdG9yZV9jdXN0b2R5GAsgASgIQgoKCF9zZXNzaW9uQggKBl9jbG91ZCKLAQoJQ29ubmVjdGVkEhEKCXdvcmtzcGFjZRgBIAEoCRIPCgdzZXNzaW9uGAIgASgJEhMKC2Nsb3VkX2JvdW5kGAMgASgIEjgKCHJlY292ZXJ5GAQgASgLMiEubm9tb3MucnVudGltZS52Mi5DdXN0b2R5UmVjb3ZlcnlIAIgBAUILCglfcmVjb3ZlcnkiWwoPQ3VzdG9keVJlY292ZXJ5EhUKDXByZXZpb3VzX2hlYWQYASABKAkSFgoOcmVjb3ZlcmVkX2hlYWQYAiABKAkSGQoRcmVjb3ZlcmVkX2ludGVudHMYAyABKAQiFwoVTGlzdFdvcmtzcGFjZXNSZXF1ZXN0Iq0BChBXb3Jrc3BhY2VTdW1tYXJ5Eg8KB3Nlc3Npb24YASABKAkSEQoJd29ya3NwYWNlGAIgASgJEjcKCXJlc2lkZW5jeRgDIAEoDjIkLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlUmVzaWRlbmN5EjwKDHN5bmNfcG9zdHVyZRgEIAEoDjImLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlU3luY1Bvc3R1cmUiRwoNV29ya3NwYWNlTGlzdBI2Cgp3b3Jrc3BhY2VzGAEgAygLMiIubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTdW1tYXJ5IikKFldvcmtzcGFjZVN0YXR1c1JlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCSJACg9Xb3Jrc3BhY2VTdGF0dXMSEQoJd29ya3NwYWNlGAEgASgJEhEKBGhlYWQYAiABKAlIAIgBAUIHCgVfaGVhZCJNChhTbmFwc2hvdFdvcmtzcGFjZVJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIUCgdpZl9oZWFkGAIgASgJSACIAQFCCgoIX2lmX2hlYWQiXAoRV29ya3NwYWNlU25hcHNob3QSEQoJd29ya3NwYWNlGAEgASgJEgwKBGhlYWQYAiABKAkSEQoJdW5jaGFuZ2VkGAMgASgIEhMKC2hhc19jdXN0b2R5GAQgASgIIjYKFFN5bmNXb3Jrc3BhY2VSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDQoFYWRtaXQYAiABKAgivAUKFVN5bmNXb3Jrc3BhY2VSZXNwb25zZRIRCgl3b3Jrc3BhY2UYASABKAkSGgoNcHJldmlvdXNfaGVhZBgCIAEoCUgAiAEBEhkKDGN1cnJlbnRfaGVhZBgDIAEoCUgBiAEBEhAKCGFkbWl0dGVkGAQgASgEEg8KB3JlZnVzZWQYBSABKAQSEAoIZGVmZXJyZWQYBiABKAQSEgoKbG9jYWxfb25seRgHIAEoCBIOCgZwdWxsZWQYCCABKAgSEAoIZGl2ZXJnZWQYCSABKAgSGgoScmVjb25uZWN0X3JlcXVpcmVkGAogASgIEhMKC3N0aWxsX2FoZWFkGAsgASgIEg8KB29mZmxpbmUYDCABKAgSEwoLcHVzaF9mYWlsZWQYDSABKAgSHQoVZGlyZWN0X29mZmVyX2RlZmVycmVkGA4gASgIEjUKDmJpcnRoX291dGNvbWVzGA8gAygLMh0ubm9tb3Mua2VybmVsLnYxLkJpcnRoT3V0Y29tZRIbChNhZG1pdHRlZF9pbnRlbnRfaWRzGBAgAygJEhwKFGNvbnZlcmdlZF9pbnRlbnRfaWRzGBEgAygJEkIKCnB1c2hfZXJyb3IYEiABKAsyKS5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVUcmFuc3BvcnRGYWlsdXJlSAKIAQESRwoPZGlzY292ZXJ5X2Vycm9yGBMgASgLMikubm9tb3MucnVudGltZS52Mi5SdW50aW1lVHJhbnNwb3J0RmFpbHVyZUgDiAEBEjMKB3RpbWluZ3MYFCABKAsyIi5ub21vcy5ydW50aW1lLnYyLlN5bmNQaGFzZVRpbWluZ3NCEAoOX3ByZXZpb3VzX2hlYWRCDwoNX2N1cnJlbnRfaGVhZEINCgtfcHVzaF9lcnJvckISChBfZGlzY292ZXJ5X2Vycm9yIl0KF1J1bnRpbWVUcmFuc3BvcnRGYWlsdXJlEhAKCGVuZHBvaW50GAEgASgJEg4KBnN0YXR1cxgCIAEoERIPCgdyZWZ1c2VkGAMgASgIEg8KB21lc3NhZ2UYBCABKAkisQEKEFN5bmNQaGFzZVRpbWluZ3MSEwoLcHVzaF9taWxsaXMYASABKAESFAoMYWRtaXRfbWlsbGlzGAIgASgBEhcKD3ByZWZldGNoX21pbGxpcxgDIAEoARIXCg9jb252ZXJnZV9taWxsaXMYBCABKAESEgoKcHVzaF9ieXRlcxgFIAEoBBIVCg1zZXJ2ZXJfbWlsbGlzGAYgASgBEhUKDW9mZmVyX2luX3B1c2gYByABKAgi3wEKFFN0YXJ0QXV0b1N5bmNSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSHAoPZGVib3VuY2VfbWlsbGlzGAIgASgNSACIAQESHAoPZmFsbGJhY2tfbWlsbGlzGAMgASgNSAGIAQESGgoNc2lnbmFsX21pbGxpcxgEIAEoDUgCiAEBEhYKCXNpZ25hbF9pZBgFIAEoCUgDiAEBQhIKEF9kZWJvdW5jZV9taWxsaXNCEgoQX2ZhbGxiYWNrX21pbGxpc0IQCg5fc2lnbmFsX21pbGxpc0IMCgpfc2lnbmFsX2lkIiIKD0F1dG9TeW5jU3RhcnRlZBIPCgdzZXNzaW9uGAEgASgJIiYKE1N0b3BBdXRvU3luY1JlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCSIiCg9BdXRvU3luY1N0b3BwZWQSDwoHc2Vzc2lvbhgBIAEoCSKqAQoMV2F0Y2hSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSFwoPc3Vic2NyaXB0aW9uX2lkGAIgASgJEikKBGtpbmQYAyABKA4yGy5ub21vcy5ydW50aW1lLnYyLldhdGNoS2luZBIsCgVxdWVyeRgEIAEoCzIdLm5vbW9zLmtlcm5lbC52MS5RdWVyeVJlcXVlc3QSFwoPaW50ZXJ2YWxfbWlsbGlzGAUgASgNIicKDFdhdGNoU3RhcnRlZBIXCg9zdWJzY3JpcHRpb25faWQYASABKAkiKQoOVW53YXRjaFJlcXVlc3QSFwoPc3Vic2NyaXB0aW9uX2lkGAEgASgJIicKDFdhdGNoU3RvcHBlZBIXCg9zdWJzY3JpcHRpb25faWQYASABKAkidQoUUHJlcGFyZURvbWFpblJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIOCgZkb21haW4YAiABKAkSFgoOcGFja2FnZV9zaGEyNTYYAyABKAkSFgoJZGlyZWN0aXZlGAQgASgJSACIAQFCDAoKX2RpcmVjdGl2ZSJSCg5Eb21haW5QcmVwYXJlZBIOCgZkb21haW4YASABKAkSFgoOcGFja2FnZV9zaGEyNTYYAiABKAkSGAoQYWxyZWFkeV9yZXNpZGVudBgDIAEoCCL2AQoVTW9kZWxMaWZlY3ljbGVSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSPQoFc3RhZ2UYCiABKAsyLC5ub21vcy5ydW50aW1lLnYyLlN0YWdlR2VuZXJhdGVkTW9kZWxSZXF1ZXN0SAASPQoFYWRvcHQYCyABKAsyLC5ub21vcy5ydW50aW1lLnYyLkFkb3B0R2VuZXJhdGVkTW9kZWxSZXF1ZXN0SAASQQoHcmVzdG9yZRgMIAEoCzIuLm5vbW9zLnJ1bnRpbWUudjIuUmVzdG9yZUdlbmVyYXRlZE1vZGVsUmVxdWVzdEgAQgsKCW9wZXJhdGlvbiKGAQoaU3RhZ2VHZW5lcmF0ZWRNb2RlbFJlcXVlc3QSDgoGZG9tYWluGAEgASgJEhYKDmNhbmRpZGF0ZV9oYXNoGAIgASgJEhAKCGxhd191c2R6GAMgASgMEhsKDnNvdXJjZV9zZXNzaW9uGAQgASgJSACIAQFCEQoPX3NvdXJjZV9zZXNzaW9uInoKGkFkb3B0R2VuZXJhdGVkTW9kZWxSZXF1ZXN0Eg4KBmRvbWFpbhgBIAEoCRIWCg5jYW5kaWRhdGVfaGFzaBgCIAEoCRIeChFhY2NlcHRhbmNlX3JlYXNvbhgDIAEoCUgAiAEBQhQKEl9hY2NlcHRhbmNlX3JlYXNvbiJ6ChxSZXN0b3JlR2VuZXJhdGVkTW9kZWxSZXF1ZXN0Eg4KBmRvbWFpbhgBIAEoCRIUCgxjdXJyZW50X2hhc2gYAiABKAkSHgoRYWNjZXB0YW5jZV9yZWFzb24YAyABKAlIAIgBAUIUChJfYWNjZXB0YW5jZV9yZWFzb24ikwEKD01vZGVsRGlmZmVyZW5jZRIzCgRraW5kGAEgASgOMiUubm9tb3MucnVudGltZS52Mi5Nb2RlbERpZmZlcmVuY2VLaW5kEhEKBGFyZWEYAiABKAlIAIgBARITCgZhY3Rpb24YAyABKAlIAYgBARIPCgdzdW1tYXJ5GAQgASgJQgcKBV9hcmVhQgkKB19hY3Rpb24ipQEKC01vZGVsUmV2aWV3EhcKD2NoZWNrZWRfYWN0aW9ucxgBIAEoBBIZChFjYW5kaWRhdGVfYWN0aW9ucxgCIAEoBBIZCgxzYW1lX291dGNvbWUYAyABKAhIAIgBARI2CgtkaWZmZXJlbmNlcxgEIAMoCzIhLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxEaWZmZXJlbmNlQg8KDV9zYW1lX291dGNvbWUihQIKFk1vZGVsTGlmZWN5Y2xlUmVzcG9uc2USEAoIYWNjZXB0ZWQYASABKAgSNAoFc3RhZ2UYAiABKA4yJS5ub21vcy5ydW50aW1lLnYyLk1vZGVsTGlmZWN5Y2xlU3RhZ2USFAoHbWVzc2FnZRgDIAEoCUgAiAEBEhEKBGhlYWQYBCABKAlIAYgBARIXCgpyZWNlaXB0X2lkGAUgASgJSAKIAQESMgoGcmV2aWV3GAYgASgLMh0ubm9tb3MucnVudGltZS52Mi5Nb2RlbFJldmlld0gDiAEBQgoKCF9tZXNzYWdlQgcKBV9oZWFkQg0KC19yZWNlaXB0X2lkQgkKB19yZXZpZXciZwoaUmVzb2x2ZUN1c3RvZHlCcmVha1JlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRI4CghkZWNpc2lvbhgCIAEoDjImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrRGVjaXNpb24iYQoUQ3VzdG9keUJyZWFrUmVzb2x2ZWQSDwoHc2Vzc2lvbhgBIAEoCRI4CghkZWNpc2lvbhgCIAEoDjImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrRGVjaXNpb24iEwoRQ2xvc2VSZWFsbVJlcXVlc3QiDQoLUmVhbG1DbG9zZWQi5QEKEURlYWRMZXR0ZXJSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSOAoEbGlzdBgKIAEoCzIoLm5vbW9zLnJ1bnRpbWUudjIuTGlzdERlYWRMZXR0ZXJzUmVxdWVzdEgAEjkKBXJldHJ5GAsgASgLMigubm9tb3MucnVudGltZS52Mi5SZXRyeURlYWRMZXR0ZXJSZXF1ZXN0SAASPQoHZGlzY2FyZBgMIAEoCzIqLm5vbW9zLnJ1bnRpbWUudjIuRGlzY2FyZERlYWRMZXR0ZXJSZXF1ZXN0SABCCwoJb3BlcmF0aW9uIhgKFkxpc3REZWFkTGV0dGVyc1JlcXVlc3QiKwoWUmV0cnlEZWFkTGV0dGVyUmVxdWVzdBIRCglpbnRlbnRfaWQYASABKAkiLQoYRGlzY2FyZERlYWRMZXR0ZXJSZXF1ZXN0EhEKCWludGVudF9pZBgBIAEoCSK9AQoSRGVhZExldHRlclJlc3BvbnNlEjAKBGxpc3QYCiABKAsyIC5ub21vcy5ydW50aW1lLnYyLkRlYWRMZXR0ZXJMaXN0SAASMgoFcmV0cnkYCyABKAsyIS5ub21vcy5ydW50aW1lLnYyLkRlYWRMZXR0ZXJSZXRyeUgAEjYKB2Rpc2NhcmQYDCABKAsyIy5ub21vcy5ydW50aW1lLnYyLkRlYWRMZXR0ZXJEaXNjYXJkSABCCQoHb3V0Y29tZSJECg5EZWFkTGV0dGVyTGlzdBIyCgdlbnRyaWVzGAEgAygLMiEubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyRW50cnkiuQEKD0RlYWRMZXR0ZXJFbnRyeRIPCgJpZBgBIAEoCUgAiAEBEhIKCmNvbW1pdF9vaWQYAiABKAkSDgoGc291cmNlGAMgASgJEg8KB21lc3NhZ2UYBCABKAkSEwoGZG9tYWluGAUgASgJSAGIAQESFgoJZGlyZWN0aXZlGAYgASgJSAKIAQESEwoLcmVjb3JkZWRfYXQYByABKAlCBQoDX2lkQgkKB19kb21haW5CDAoKX2RpcmVjdGl2ZSJ5Cg9EZWFkTGV0dGVyUmV0cnkSDwoHcmV0cmllZBgBIAEoCBIRCgRoZWFkGAIgASgJSACIAQESFwoPYWxyZWFkeV9vbl9tYWluGAMgASgIEhQKB21lc3NhZ2UYBCABKAlIAYgBAUIHCgVfaGVhZEIKCghfbWVzc2FnZSIkChFEZWFkTGV0dGVyRGlzY2FyZBIPCgdyZW1vdmVkGAEgASgEIs0FCgxSdW50aW1lRXZlbnQSEAoIc2VxdWVuY2UYASABKAQSFAoHc2Vzc2lvbhgCIAEoCUgBiAEBEi8KBXJlYWR5GAogASgLMh4ubm9tb3MucnVudGltZS52Mi5SdW50aW1lUmVhZHlIABI3Cg13YXRjaF9jaGFuZ2VkGAsgASgLMh4ubm9tb3MucnVudGltZS52Mi5XYXRjaENoYW5nZWRIABI5Cg5zeW5jX2NvbXBsZXRlZBgMIAEoCzIfLm5vbW9zLnJ1bnRpbWUudjIuU3luY0NvbXBsZXRlZEgAEjUKDGxpbmtfY2hhbmdlZBgNIAEoCzIdLm5vbW9zLnJ1bnRpbWUudjIuTGlua0NoYW5nZWRIABI5Cg5zaWduYWxfY2hhbmdlZBgOIAEoCzIfLm5vbW9zLnJ1bnRpbWUudjIuU2lnbmFsQ2hhbmdlZEgAEjsKD2N1c3RvZHlfY2hhbmdlZBgPIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUNoYW5nZWRIABJCChNsb2NhbF93b3JrX3JlamVjdGVkGBAgASgLMiMubm9tb3MucnVudGltZS52Mi5Mb2NhbFdvcmtSZWplY3RlZEgAEjMKC2xhd19jaGFuZ2VkGBEgASgLMhwubm9tb3MucnVudGltZS52Mi5MYXdDaGFuZ2VkSAASQwoPa2VybmVsX3Byb2dyZXNzGBIgASgLMigubm9tb3MucnVudGltZS52Mi5LZXJuZWxQcm9ncmVzc09ic2VydmVkSAASLQoEc3BhbhgTIAEoCzIdLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVNwYW5IABI/ChF0cmFuc2Zlcl9wcm9ncmVzcxgUIAEoCzIiLm5vbW9zLnJ1bnRpbWUudjIuVHJhbnNmZXJQcm9ncmVzc0gAQgcKBWV2ZW50QgoKCF9zZXNzaW9uIj4KDFJ1bnRpbWVSZWFkeRIXCg9ydW50aW1lX3ZlcnNpb24YASABKAkSFQoNa2VybmVsX3NoYTI1NhgCIAEoDCKAAQoMV2F0Y2hDaGFuZ2VkEhcKD3N1YnNjcmlwdGlvbl9pZBgBIAEoCRITCgtyZXN1bHRfdXNkYRgCIAEoDBI2CgdmYWlsdXJlGAMgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAiAEBQgoKCF9mYWlsdXJlIpwBCg1TeW5jQ29tcGxldGVkEg4KBnJlYXNvbhgBIAEoCRI3CgZyZXN1bHQYAiABKAsyJy5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXNwb25zZRI2CgdmYWlsdXJlGAMgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAiAEBQgoKCF9mYWlsdXJlIjsKC0xpbmtDaGFuZ2VkEiwKBnN0YXR1cxgBIAEoDjIcLm5vbW9zLnJ1bnRpbWUudjIuTGlua1N0YXR1cyI4Cg1TaWduYWxDaGFuZ2VkEg4KBmRvbWFpbhgBIAEoCRIXCg9wcm9qZWN0aW9uX3VzZGEYAiABKAwi9AEKDkN1c3RvZHlDaGFuZ2VkEjEKBGtpbmQYASABKA4yIy5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlDaGFuZ2VLaW5kEjUKDWN1c3RvZHlfYnJlYWsYAiABKAsyHi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVhaxIWCglvcGVyYXRpb24YAyABKAlIAIgBARIVCghyZWNsb25lZBgEIAEoCEgBiAEBEhsKDnBhcmtlZF9pbnRlbnRzGAUgASgESAKIAQFCDAoKX29wZXJhdGlvbkILCglfcmVjbG9uZWRCEQoPX3BhcmtlZF9pbnRlbnRzIuEBChFMb2NhbFdvcmtSZWplY3RlZBIRCgl3b3Jrc3BhY2UYASABKAkSNgoHcmVmdXNlZBgCIAMoCzIlLm5vbW9zLnJ1bnRpbWUudjIuUmVqZWN0ZWRMb2NhbEludGVudBIOCgZwYXJrZWQYAyABKAgSFQoIcmVzZXRfdG8YBCABKAlIAIgBARIRCglyZXRyeWFibGUYBSABKAgSOgoGc291cmNlGAYgASgOMioubm9tb3MucnVudGltZS52Mi5Mb2NhbFdvcmtSZWplY3Rpb25Tb3VyY2VCCwoJX3Jlc2V0X3RvImMKE0N1c3RvZHlTdXBlcnNlc3Npb24SGgoNc3VwZXJzZWRlZF9hdBgBIAEoCUgAiAEBEhMKBnJlYXNvbhgCIAEoCUgBiAEBQhAKDl9zdXBlcnNlZGVkX2F0QgkKB19yZWFzb24iuAIKDEN1c3RvZHlCcmVhaxIwCgRraW5kGAEgASgOMiIubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QnJlYWtLaW5kEhUKDWxvY2FsX2dlbmVzaXMYAiABKAkSFgoOcmVtb3RlX2dlbmVzaXMYAyABKAkSGgoScmVtb3RlX2luY2FybmF0aW9uGAQgASgJEkAKDHN1cGVyc2Vzc2lvbhgFIAEoCzIlLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keVN1cGVyc2Vzc2lvbkgAiAEBEhoKEmxvY2FsX29ubHlfaW50ZW50cxgGIAEoBBIiChVsYXN0X3N5bmNlZF9hdF9taWxsaXMYByABKARIAYgBAUIPCg1fc3VwZXJzZXNzaW9uQhgKFl9sYXN0X3N5bmNlZF9hdF9taWxsaXMizQEKE1JlamVjdGVkTG9jYWxJbnRlbnQSFgoJaW50ZW50X2lkGAEgASgJSACIAQESFwoKY29tbWl0X29pZBgCIAEoCUgBiAEBEhMKBmRvbWFpbhgDIAEoCUgCiAEBEhYKCWRpcmVjdGl2ZRgEIAEoCUgDiAEBEg8KB21lc3NhZ2UYBSABKAkSEQoJcmV0cnlhYmxlGAYgASgIQgwKCl9pbnRlbnRfaWRCDQoLX2NvbW1pdF9vaWRCCQoHX2RvbWFpbkIMCgpfZGlyZWN0aXZlIlAKCkxhd0NoYW5nZWQSDgoGZG9tYWluGAEgASgJEhYKDnBhY2thZ2Vfc2hhMjU2GAIgASgJEhoKEmNvbXBhdGliaWxpdHlfdXNkYRgDIAEoDCLdAQoLUnVudGltZVNwYW4SEAoIdHJhY2VfaWQYASABKAwSDwoHc3Bhbl9pZBgCIAEoDBIbCg5wYXJlbnRfc3Bhbl9pZBgDIAEoDEgAiAEBEgwKBG5hbWUYBCABKAkSGgoSc3RhcnRlZF91bml4X25hbm9zGAUgASgEEhYKDmR1cmF0aW9uX25hbm9zGAYgASgEEjkKCmF0dHJpYnV0ZXMYByADKAsyJS5ub21vcy5ydW50aW1lLnYyLkRpYWdub3N0aWNBdHRyaWJ1dGVCEQoPX3BhcmVudF9zcGFuX2lkIuoBChZLZXJuZWxQcm9ncmVzc09ic2VydmVkEjkKCHNuYXBzaG90GAEgASgLMicubm9tb3Mua2VybmVsLnYxLktlcm5lbFByb2dyZXNzU25hcHNob3QSJAocaG9zdF9vYnNlcnZlZF9lbGFwc2VkX21pY3JvcxgCIAEoBBIqCiJob3N0X29ic2VydmVkX3BoYXNlX2VsYXBzZWRfbWljcm9zGAMgASgEEh4KFnByb2Nlc3NfcmVzaWRlbnRfYnl0ZXMYBCABKAQSIwobcHJvY2Vzc19wZWFrX3Jlc2lkZW50X2J5dGVzGAUgASgEIoIBChBUcmFuc2ZlclByb2dyZXNzEhYKDnJlY2VpdmVkX2J5dGVzGAEgASgEEhgKC3RvdGFsX2J5dGVzGAIgASgESACIAQESLAoEa2luZBgDIAEoDjIeLm5vbW9zLnJ1bnRpbWUudjIuVHJhbnNmZXJLaW5kQg4KDF90b3RhbF9ieXRlcyqZAQoSQ3VzdG9keUJyZWFrUG9saWN5EiQKIENVU1RPRFlfQlJFQUtfUE9MSUNZX1VOU1BFQ0lGSUVEEAASHAoYQ1VTVE9EWV9CUkVBS19QT0xJQ1lfQVNLEAESHgoaQ1VTVE9EWV9CUkVBS19QT0xJQ1lfQURPUFQQAhIfChtDVVNUT0RZX0JSRUFLX1BPTElDWV9SRUpFQ1QQAyqgAQoSV29ya3NwYWNlUmVzaWRlbmN5EiMKH1dPUktTUEFDRV9SRVNJREVOQ1lfVU5TUEVDSUZJRUQQABIfChtXT1JLU1BBQ0VfUkVTSURFTkNZX01PVU5URUQQARIeChpXT1JLU1BBQ0VfUkVTSURFTkNZX1BBUktFRBACEiQKIFdPUktTUEFDRV9SRVNJREVOQ1lfQ1VTVE9EWV9PTkxZEAMqjQEKFFdvcmtzcGFjZVN5bmNQb3N0dXJlEiYKIldPUktTUEFDRV9TWU5DX1BPU1RVUkVfVU5TUEVDSUZJRUQQABIlCiFXT1JLU1BBQ0VfU1lOQ19QT1NUVVJFX0xPQ0FMX09OTFkQARImCiJXT1JLU1BBQ0VfU1lOQ19QT1NUVVJFX0NMT1VEX0JPVU5EEAIqqAEKCVdhdGNoS2luZBIaChZXQVRDSF9LSU5EX1VOU1BFQ0lGSUVEEAASFAoQV0FUQ0hfS0lORF9RVUVSWRABEhQKEFdBVENIX0tJTkRfQllfSUQQAhIWChJXQVRDSF9LSU5EX1NQQVRJQUwQAxIXChNXQVRDSF9LSU5EX0FDVElWSVRZEAQiBAgFEAUqHFdBVENIX0tJTkRfUEVORElOR19DT05GTElDVFMqpAMKE01vZGVsTGlmZWN5Y2xlU3RhZ2USJQohTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1VOU1BFQ0lGSUVEEAASKwonTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0lERU5USVRZX1JFUVVJUkVEEAESKgomTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1NUQUdJTkdfUkVRVUlSRUQQAhIjCh9NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfUFJFRkxJR0hUEAMSLQopTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0FDQ0VQVEFOQ0VfUkVRVUlSRUQQBBIjCh9NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfQURNSVNTSU9OEAUSIQodTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1BFTkRJTkcQBhIiCh5NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfUFJPTU9URUQQBxIiCh5NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfUkVTVE9SRUQQCBIpCiVNT0RFTF9MSUZFQ1lDTEVfU1RBR0VfQUxSRUFEWV9DVVJSRU5UEAkqpAEKE01vZGVsRGlmZmVyZW5jZUtpbmQSJQohTU9ERUxfRElGRkVSRU5DRV9LSU5EX1VOU1BFQ0lGSUVEEAASHwobTU9ERUxfRElGRkVSRU5DRV9LSU5EX1JVTEVTEAESIQodTU9ERUxfRElGRkVSRU5DRV9LSU5EX09VVENPTUUQAhIiCh5NT0RFTF9ESUZGRVJFTkNFX0tJTkRfRVZJREVOQ0UQAyqDAQoUQ3VzdG9keUJyZWFrRGVjaXNpb24SJgoiQ1VTVE9EWV9CUkVBS19ERUNJU0lPTl9VTlNQRUNJRklFRBAAEiAKHENVU1RPRFlfQlJFQUtfREVDSVNJT05fQURPUFQQARIhCh1DVVNUT0RZX0JSRUFLX0RFQ0lTSU9OX1JFSkVDVBACKlcKCkxpbmtTdGF0dXMSGwoXTElOS19TVEFUVVNfVU5TUEVDSUZJRUQQABIUChBMSU5LX1NUQVRVU19PUEVOEAESFgoSTElOS19TVEFUVVNfQ0xPU0VEEAIq4gEKEUN1c3RvZHlDaGFuZ2VLaW5kEiMKH0NVU1RPRFlfQ0hBTkdFX0tJTkRfVU5TUEVDSUZJRUQQABIgChxDVVNUT0RZX0NIQU5HRV9LSU5EX0RFVEVDVEVEEAESIAocQ1VTVE9EWV9DSEFOR0VfS0lORF9SRUpFQ1RFRBACEiAKHENVU1RPRFlfQ0hBTkdFX0tJTkRfQURPUFRJTkcQAxIlCiFDVVNUT0RZX0NIQU5HRV9LSU5EX0FET1BUX1JFRlVTRUQQBBIbChdDVVNUT0RZX0NIQU5HRV9LSU5EX0FTSxAFKnoKEEN1c3RvZHlCcmVha0tpbmQSIgoeQ1VTVE9EWV9CUkVBS19LSU5EX1VOU1BFQ0lGSUVEEAASIQodQ1VTVE9EWV9CUkVBS19LSU5EX1NVUEVSU0VERUQQARIfChtDVVNUT0RZX0JSRUFLX0tJTkRfRElWRVJHRUQQAiqYAQoYTG9jYWxXb3JrUmVqZWN0aW9uU291cmNlEisKJ0xPQ0FMX1dPUktfUkVKRUNUSU9OX1NPVVJDRV9VTlNQRUNJRklFRBAAEikKJUxPQ0FMX1dPUktfUkVKRUNUSU9OX1NPVVJDRV9BRE1JU1NJT04QARIkCiBMT0NBTF9XT1JLX1JFSkVDVElPTl9TT1VSQ0VfU1lOQxACKnYKDFRyYW5zZmVyS2luZBIdChlUUkFOU0ZFUl9LSU5EX1VOU1BFQ0lGSUVEEAASFwoTVFJBTlNGRVJfS0lORF9ERUxUQRABEhYKElRSQU5TRkVSX0tJTkRfRlVMTBACEhYKElRSQU5TRkVSX0tJTkRfUFVTSBADMmQKE05vbW9zUnVudGltZVNlcnZpY2USTQoGSW52b2tlEiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lUmVxdWVzdBohLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVJlc3BvbnNlYgZwcm90bzM", [file_nomos_kernel_v1_kernel, file_nomos_kernel_v1_progress]);
|
|
6388
6480
|
RuntimeRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 0);
|
|
6389
6481
|
KernelCallRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 1);
|
|
6390
6482
|
RuntimeResponseSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 5);
|
|
6391
|
-
CustodyOfferBatchRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime,
|
|
6392
|
-
CustodyIntentOfferSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime,
|
|
6393
|
-
CustodyInlineOffersSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime,
|
|
6394
|
-
CustodySessionCandidateSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime,
|
|
6395
|
-
CustodyOfferBatchResponseSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime,
|
|
6396
|
-
DeadLetterRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime,
|
|
6397
|
-
ListDeadLettersRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime,
|
|
6398
|
-
RetryDeadLetterRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime,
|
|
6399
|
-
DiscardDeadLetterRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime,
|
|
6483
|
+
CustodyOfferBatchRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 14);
|
|
6484
|
+
CustodyIntentOfferSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 15);
|
|
6485
|
+
CustodyInlineOffersSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 16);
|
|
6486
|
+
CustodySessionCandidateSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 17);
|
|
6487
|
+
CustodyOfferBatchResponseSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 18);
|
|
6488
|
+
DeadLetterRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 65);
|
|
6489
|
+
ListDeadLettersRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 66);
|
|
6490
|
+
RetryDeadLetterRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 67);
|
|
6491
|
+
DiscardDeadLetterRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 68);
|
|
6400
6492
|
}
|
|
6401
6493
|
});
|
|
6402
6494
|
|
|
@@ -6446,7 +6538,7 @@ function presentCanonicalCustodyConvergence(convergence, context) {
|
|
|
6446
6538
|
endpoint: `/v2/workspaces/${context.workspace}`,
|
|
6447
6539
|
status: 0,
|
|
6448
6540
|
refused: false,
|
|
6449
|
-
error: String(convergence.error instanceof Error ? convergence.error.message : convergence.error).slice(0,
|
|
6541
|
+
error: String(convergence.error instanceof Error ? convergence.error.message : convergence.error).slice(0, 1200)
|
|
6450
6542
|
};
|
|
6451
6543
|
return {
|
|
6452
6544
|
result: {
|
|
@@ -6524,7 +6616,10 @@ async function convergeCanonicalCustody(options) {
|
|
|
6524
6616
|
return { kind: "custodyBreak", custodyBreak: converged.custodyBreak };
|
|
6525
6617
|
}
|
|
6526
6618
|
pulled = converged.upToDate !== true;
|
|
6527
|
-
} catch {
|
|
6619
|
+
} catch (error) {
|
|
6620
|
+
console.error(
|
|
6621
|
+
`[nomos-sync-convergence] remote=${remoteHead} base=${syncedBase ?? "none"}: ` + (error instanceof Error ? error.message : String(error))
|
|
6622
|
+
);
|
|
6528
6623
|
diverged = true;
|
|
6529
6624
|
}
|
|
6530
6625
|
}
|
|
@@ -6984,6 +7079,16 @@ function prepareManagedPromotion(report, candidateHash, domain, opts = {}) {
|
|
|
6984
7079
|
error: `the package-wide report does not cover the generated business area '${domain}'`
|
|
6985
7080
|
};
|
|
6986
7081
|
}
|
|
7082
|
+
const dispositions2 = report.dispositions;
|
|
7083
|
+
const changesStableIdentity = dispositions2 !== void 0 && (dispositions2.retired.length > 0 || Object.keys(dispositions2.retyped).length > 0 || Object.keys(dispositions2.rebinds).length > 0);
|
|
7084
|
+
if (changesStableIdentity && !acceptanceReason) {
|
|
7085
|
+
return {
|
|
7086
|
+
ok: false,
|
|
7087
|
+
stage: "acceptance",
|
|
7088
|
+
report,
|
|
7089
|
+
error: "the current-frontier transition changes stable business identities and needs an attributed acceptance reason"
|
|
7090
|
+
};
|
|
7091
|
+
}
|
|
6987
7092
|
const preflight = {
|
|
6988
7093
|
candidateHash,
|
|
6989
7094
|
// A package may be reached through any one of its generated domain clients. The
|
|
@@ -7855,7 +7960,7 @@ function jwtClaimOf(token, claim) {
|
|
|
7855
7960
|
}
|
|
7856
7961
|
}
|
|
7857
7962
|
function createGovernanceOffers(ctx) {
|
|
7858
|
-
const { offerDirective, offerCall, offerModelLifecycle, serialize, queryById, queryRows, attestationSignKernel, _fetch, base, workspace, deviceSecret, authHeaders, receivingGroupNameOf: receivingGroupNameOf2, sha256hexBytes: sha256hexBytes2, bytesUnb64: bytesUnb642, birthCertificateLawPayload: birthCertificateLawPayload2, actorForShareQuote: actorForShareQuote2, installedInterfaceInner, mintKeylessDelegation: mintKeylessDelegation2, signWorkspaceOffer, resolveFrameworkRoute } = ctx;
|
|
7963
|
+
const { offerDirective, offerCall, offerModelLifecycle, serialize, queryById, queryRows, attestationSignKernel, _fetch, base, workspace, deviceSecret, authHeaders, connectionAuthToken, connectionFrameworkCalls, receivingGroupNameOf: receivingGroupNameOf2, sha256hexBytes: sha256hexBytes2, bytesUnb64: bytesUnb642, birthCertificateLawPayload: birthCertificateLawPayload2, actorForShareQuote: actorForShareQuote2, installedInterfaceInner, mintKeylessDelegation: mintKeylessDelegation2, signWorkspaceOffer, resolveFrameworkRoute } = ctx;
|
|
7859
7964
|
const g = {
|
|
7860
7965
|
/**
|
|
7861
7966
|
* AUTHOR a SIGNED governance/framework intent locally and return the sealed offer bytes (base64) ready to
|
|
@@ -7960,6 +8065,54 @@ function createGovernanceOffers(ctx) {
|
|
|
7960
8065
|
});
|
|
7961
8066
|
return g.postGovernanceOffer({ directiveId: call.directive, intentBytes: sealed.intentBytes, ws: parent, authToken, domain: call.domain });
|
|
7962
8067
|
},
|
|
8068
|
+
/**
|
|
8069
|
+
* Offer one exact compiler-generated call to another workspace without
|
|
8070
|
+
* mounting or replaying that target locally. The source holon's kernel
|
|
8071
|
+
* signs only the target-kernel-prepared USDA; the host receives neither a
|
|
8072
|
+
* tenant object nor authority to invent an operation.
|
|
8073
|
+
*/
|
|
8074
|
+
offerRemoteGeneratedCall: async ({
|
|
8075
|
+
call,
|
|
8076
|
+
target,
|
|
8077
|
+
actor,
|
|
8078
|
+
authorSecret,
|
|
8079
|
+
authToken
|
|
8080
|
+
}) => {
|
|
8081
|
+
const signingSecret = authorSecret || deviceSecret;
|
|
8082
|
+
if (!target) throw new TypeError("a remote generated offer requires its target workspace");
|
|
8083
|
+
if (!actor) throw new TypeError("a remote generated offer requires its attributable actor");
|
|
8084
|
+
if (!signingSecret) throw new TypeError("a remote generated offer requires an enrolled device key");
|
|
8085
|
+
const sealed = await signWorkspaceOffer({
|
|
8086
|
+
target,
|
|
8087
|
+
call,
|
|
8088
|
+
actor,
|
|
8089
|
+
authorSecret: signingSecret,
|
|
8090
|
+
authToken
|
|
8091
|
+
});
|
|
8092
|
+
const verdict = await g.postGovernanceOffer({
|
|
8093
|
+
directiveId: call.directive,
|
|
8094
|
+
intentBytes: sealed.intentBytes,
|
|
8095
|
+
ws: target,
|
|
8096
|
+
authToken,
|
|
8097
|
+
domain: call.domain
|
|
8098
|
+
});
|
|
8099
|
+
if (!verdict.ok || verdict.body && typeof verdict.body === "object" && (verdict.body.ok === false || verdict.body.refused)) {
|
|
8100
|
+
const detail = typeof verdict.body === "string" ? verdict.body : JSON.stringify(verdict.body ?? "remote offer refused");
|
|
8101
|
+
throw new NomosClientError(
|
|
8102
|
+
`Remote generated call '${call.domain}/${call.directive}' was refused by '${target}': ${detail.slice(0, 500)}`,
|
|
8103
|
+
{
|
|
8104
|
+
code: "nomos.offer.remote_refused",
|
|
8105
|
+
workspace: target,
|
|
8106
|
+
operation: call.directive,
|
|
8107
|
+
recommendedAction: NomosRecommendedAction.retry,
|
|
8108
|
+
info: verdict.errorInfo
|
|
8109
|
+
}
|
|
8110
|
+
);
|
|
8111
|
+
}
|
|
8112
|
+
const body = verdict.body && typeof verdict.body === "object" ? verdict.body : void 0;
|
|
8113
|
+
const head = verdict.head ?? (typeof body?.head === "string" ? body.head : "");
|
|
8114
|
+
return { workspace: target, head };
|
|
8115
|
+
},
|
|
7963
8116
|
/**
|
|
7964
8117
|
* Derive the device key's base64 PUBLIC half from its base64 SECRET seed, IN the local wasm (the
|
|
7965
8118
|
* kernel `attestation_sign` op returns the public half; the secret never leaves this process).
|
|
@@ -8146,7 +8299,10 @@ function createGovernanceOffers(ctx) {
|
|
|
8146
8299
|
*/
|
|
8147
8300
|
ensureParentSignerEnrollment: async (args = {}) => {
|
|
8148
8301
|
const { parent, device, domain, grantedAt, authToken, idToken, signIn, verifiedVia, validFromEpoch = 0, frameworkCalls } = args;
|
|
8149
|
-
const
|
|
8302
|
+
const effectiveAuthToken = authToken || connectionAuthToken();
|
|
8303
|
+
const effectiveIdToken = idToken || effectiveAuthToken;
|
|
8304
|
+
const effectiveFrameworkCalls = frameworkCalls ?? connectionFrameworkCalls;
|
|
8305
|
+
const keyless = !!(effectiveIdToken || typeof signIn === "function");
|
|
8150
8306
|
const directiveId = args.directiveId || (keyless ? "enrollFirstDevice" : "enrollSigner");
|
|
8151
8307
|
const principal = canonicalPrincipal(args.principal);
|
|
8152
8308
|
let publicKey = device && device.public || args.publicKey;
|
|
@@ -8156,13 +8312,13 @@ function createGovernanceOffers(ctx) {
|
|
|
8156
8312
|
if (!publicKey && authorSecret) publicKey = await g.devicePublicOf(authorSecret);
|
|
8157
8313
|
if (!publicKey) throw new Error("ensureParentSignerEnrollment requires the device `publicKey` (pass `device`/`publicKey`, or a secret it can be derived from)");
|
|
8158
8314
|
const keyHash = await sha256hexBytes2(bytesUnb642(publicKey));
|
|
8159
|
-
const posture = await g.parentSignerEnrollment({ parent, principal, keyHash, authToken });
|
|
8315
|
+
const posture = await g.parentSignerEnrollment({ parent, principal, keyHash, authToken: effectiveAuthToken });
|
|
8160
8316
|
if (posture.enrolled) return { parent, principal, keyHash, enrolled: true, repaired: false, checkedAt: posture.checkedAt };
|
|
8161
8317
|
if (posture.revoked) {
|
|
8162
8318
|
throw new Error(`ensureParentSignerEnrollment: key ${keyHash.slice(0, 16)}\u2026 was REVOKED on ${parent} (${signerObjectOf(principal)}#signer is remove-wins) \u2014 mint a new device key and enroll it; a revoked key cannot be lawfully re-enrolled [nomos.authz.signer_revoked]`);
|
|
8163
8319
|
}
|
|
8164
8320
|
if (!authorSecret) throw new Error("ensureParentSignerEnrollment: the signer tuple is absent on the parent and no `authorSecret`/`device.secret` was supplied to lawfully re-enroll it");
|
|
8165
|
-
const token = keyless ? typeof signIn === "function" ? await signIn(keyHash) :
|
|
8321
|
+
const token = keyless ? typeof signIn === "function" ? await signIn(keyHash) : effectiveIdToken : null;
|
|
8166
8322
|
let resolved = domain ? { domain, directiveId } : null;
|
|
8167
8323
|
let enrollmentRoute;
|
|
8168
8324
|
if (!resolved && parent === workspace && typeof installedInterfaceInner === "function") {
|
|
@@ -8187,7 +8343,7 @@ function createGovernanceOffers(ctx) {
|
|
|
8187
8343
|
}
|
|
8188
8344
|
resolved = { domain: enrollmentRoute.domain, directiveId };
|
|
8189
8345
|
}
|
|
8190
|
-
if (!resolved) resolved = await g.discoverDirectiveDomain({ ws: parent, directiveId, authToken });
|
|
8346
|
+
if (!resolved) resolved = await g.discoverDirectiveDomain({ ws: parent, directiveId, authToken: effectiveAuthToken });
|
|
8191
8347
|
let delegationPayload;
|
|
8192
8348
|
if (keyless) {
|
|
8193
8349
|
if (typeof mintKeylessDelegation2 !== "function") throw new Error("ensureParentSignerEnrollment: the keyless lane needs a signing holon (mintKeylessDelegation) to build the delegation cert \u2014 open the holon with a device key");
|
|
@@ -8209,12 +8365,29 @@ function createGovernanceOffers(ctx) {
|
|
|
8209
8365
|
}
|
|
8210
8366
|
const issuerClaim = verifiedVia || (token ? jwtClaimOf(token, "iss") : void 0);
|
|
8211
8367
|
const payload = keyless ? { keyHash, verifiedVia: issuerClaim, validFromEpoch, grantedAt: (/* @__PURE__ */ new Date()).toISOString(), idpToken: token, ...delegationPayload ?? {} } : { keyHash, grantedBy: principal, grantedAt: typeof grantedAt === "number" ? grantedAt : Date.now() };
|
|
8212
|
-
if (
|
|
8213
|
-
|
|
8368
|
+
if (effectiveFrameworkCalls === void 0) {
|
|
8369
|
+
const message = "The installed client cannot author the typed enrollFirstDevice call required to seat this device";
|
|
8370
|
+
throw new NomosClientError(message, {
|
|
8371
|
+
code: "nomos.application.contract_missing",
|
|
8372
|
+
workspace: parent,
|
|
8373
|
+
operation: "enrollFirstDevice",
|
|
8374
|
+
recommendedAction: NomosRecommendedAction.redeployLaw,
|
|
8375
|
+
info: {
|
|
8376
|
+
code: "nomos.application.contract_missing",
|
|
8377
|
+
message,
|
|
8378
|
+
component: "nomos.application",
|
|
8379
|
+
workspace: parent,
|
|
8380
|
+
operation: "enrollFirstDevice",
|
|
8381
|
+
attributes: {
|
|
8382
|
+
"nomos.application.missing_contract": "generatedFrameworkCalls.identity.enrollFirstDevice",
|
|
8383
|
+
"nomos.recovery.action": "request-parent-authorized-device-recovery"
|
|
8384
|
+
}
|
|
8385
|
+
}
|
|
8386
|
+
});
|
|
8214
8387
|
}
|
|
8215
8388
|
const call = keyless ? (() => {
|
|
8216
8389
|
if (typeof issuerClaim !== "string" || !issuerClaim || !token) throw new Error("verified first-device enrollment needs its typed issuer and identity proof");
|
|
8217
|
-
return
|
|
8390
|
+
return effectiveFrameworkCalls.identity.enrollFirstDevice({
|
|
8218
8391
|
domain: resolved.domain,
|
|
8219
8392
|
workspace: parent,
|
|
8220
8393
|
keyHash,
|
|
@@ -8224,7 +8397,7 @@ function createGovernanceOffers(ctx) {
|
|
|
8224
8397
|
idpToken: token,
|
|
8225
8398
|
...delegationPayload ?? {}
|
|
8226
8399
|
});
|
|
8227
|
-
})() :
|
|
8400
|
+
})() : effectiveFrameworkCalls.identity.enrollSigner({
|
|
8228
8401
|
domain: resolved.domain,
|
|
8229
8402
|
workspace: parent,
|
|
8230
8403
|
keyHash,
|
|
@@ -8236,7 +8409,7 @@ function createGovernanceOffers(ctx) {
|
|
|
8236
8409
|
const res = await offerCall(call, { actor: principal, signWith: authorSecret });
|
|
8237
8410
|
verdict = { ok: true, status: 200, body: res };
|
|
8238
8411
|
} else {
|
|
8239
|
-
const bearer =
|
|
8412
|
+
const bearer = effectiveAuthToken || token;
|
|
8240
8413
|
const sealed = await signWorkspaceOffer({
|
|
8241
8414
|
target: parent,
|
|
8242
8415
|
call,
|
|
@@ -8608,23 +8781,46 @@ function connectRemote(opts) {
|
|
|
8608
8781
|
}
|
|
8609
8782
|
const entropy = new Uint32Array(16);
|
|
8610
8783
|
crypto.getRandomValues(entropy);
|
|
8611
|
-
const
|
|
8612
|
-
|
|
8613
|
-
{
|
|
8614
|
-
|
|
8615
|
-
|
|
8616
|
-
|
|
8617
|
-
|
|
8618
|
-
|
|
8619
|
-
|
|
8620
|
-
|
|
8784
|
+
const target = { repo: `/work/ws/${workspace}`, workspace, branch: "main" };
|
|
8785
|
+
const capturedPorts = {
|
|
8786
|
+
clock: { physical: Date.now(), logical: 0, replica: entropy[0] ?? 0 },
|
|
8787
|
+
rng: [...entropy].map((value) => value / 4294967296)
|
|
8788
|
+
};
|
|
8789
|
+
const actor = o?.actor ?? principal ?? "";
|
|
8790
|
+
const preparedRequest = o?.modelLifecycle === void 0 ? createDirectiveOfferRequest(target, {
|
|
8791
|
+
domain,
|
|
8792
|
+
directiveId,
|
|
8793
|
+
payload: callUsda,
|
|
8794
|
+
capturedPorts,
|
|
8795
|
+
sequence: requestSequence + 1n,
|
|
8796
|
+
actor,
|
|
8797
|
+
authToken: opts.authToken && !opts.authorSecret ? opts.authToken : void 0,
|
|
8798
|
+
spans: true,
|
|
8799
|
+
prepareOnly: true,
|
|
8800
|
+
lawUsdz: o?.lawUsdz,
|
|
8801
|
+
domainHash: o?.domainHash
|
|
8802
|
+
}) : createModelLifecycleOfferRequest(
|
|
8803
|
+
target,
|
|
8804
|
+
o.modelLifecycle.operation === "stage" ? {
|
|
8805
|
+
operation: ModelLifecycleOperation.STAGE,
|
|
8806
|
+
installedBy: o.modelLifecycle.installedBy,
|
|
8807
|
+
supersedes: o.modelLifecycle.supersedes,
|
|
8808
|
+
lawUsdz: o.lawUsdz ?? new Uint8Array(),
|
|
8809
|
+
capturedPorts,
|
|
8621
8810
|
sequence: requestSequence + 1n,
|
|
8622
|
-
actor
|
|
8623
|
-
authToken: opts.authToken && !opts.authorSecret ? opts.authToken : void 0,
|
|
8811
|
+
actor,
|
|
8624
8812
|
spans: true,
|
|
8625
|
-
prepareOnly: true
|
|
8626
|
-
|
|
8627
|
-
|
|
8813
|
+
prepareOnly: true
|
|
8814
|
+
} : {
|
|
8815
|
+
operation: ModelLifecycleOperation.PROMOTE,
|
|
8816
|
+
transition: o.modelLifecycle.transition,
|
|
8817
|
+
replaces: o.modelLifecycle.replaces,
|
|
8818
|
+
acceptanceReason: o.modelLifecycle.acceptanceReason,
|
|
8819
|
+
capturedPorts,
|
|
8820
|
+
sequence: requestSequence + 1n,
|
|
8821
|
+
actor,
|
|
8822
|
+
spans: true,
|
|
8823
|
+
prepareOnly: true
|
|
8628
8824
|
}
|
|
8629
8825
|
);
|
|
8630
8826
|
const offerRequest2 = toBinary4(OfferRequestSchema, preparedRequest);
|
|
@@ -8781,6 +8977,39 @@ function connectRemote(opts) {
|
|
|
8781
8977
|
const call = requireGeneratedCall(value, "remote offerCall");
|
|
8782
8978
|
return offerDirective(call.domain, call.directive, call.canonicalUsda, o);
|
|
8783
8979
|
}
|
|
8980
|
+
const offerModelLifecycle = (lifecycle) => offerDirective("nomos", "", new Uint8Array(), {
|
|
8981
|
+
actor: lifecycle.actor,
|
|
8982
|
+
lawUsdz: lifecycle.operation === "stage" ? lifecycle.lawUsdz : void 0,
|
|
8983
|
+
modelLifecycle: lifecycle
|
|
8984
|
+
});
|
|
8985
|
+
const frontierTransition2 = async (request) => {
|
|
8986
|
+
const response = await kernelRuntime({
|
|
8987
|
+
case: "query",
|
|
8988
|
+
value: create5(QueryRequestSchema, {
|
|
8989
|
+
target: create5(WorkspaceTargetSchema, {
|
|
8990
|
+
repo: `/work/ws/${workspace}`,
|
|
8991
|
+
workspace,
|
|
8992
|
+
branch: "main"
|
|
8993
|
+
}),
|
|
8994
|
+
query: {
|
|
8995
|
+
case: "frontierTransition",
|
|
8996
|
+
value: create5(FrontierTransitionRequestSchema, {
|
|
8997
|
+
domain: request.domain,
|
|
8998
|
+
candidateHash: request.candidateHash,
|
|
8999
|
+
atHash: request.atHash,
|
|
9000
|
+
acknowledgementPrincipal: request.acknowledgementPrincipal ?? principal ?? "",
|
|
9001
|
+
restorePreviousOf: request.restorePreviousOf
|
|
9002
|
+
})
|
|
9003
|
+
}
|
|
9004
|
+
})
|
|
9005
|
+
});
|
|
9006
|
+
if (response.outcome.case !== "query" || response.outcome.value.result.case !== "frontierTransition") {
|
|
9007
|
+
throw new Error(
|
|
9008
|
+
`kernel returned '${response.outcome.case || "empty"}' for frontier transition`
|
|
9009
|
+
);
|
|
9010
|
+
}
|
|
9011
|
+
return response.outcome.value.result.value;
|
|
9012
|
+
};
|
|
8784
9013
|
const query3 = async (queryId, params) => {
|
|
8785
9014
|
const response = await kernelRuntime({
|
|
8786
9015
|
case: "query",
|
|
@@ -9114,6 +9343,8 @@ function connectRemote(opts) {
|
|
|
9114
9343
|
cloud: base,
|
|
9115
9344
|
principal,
|
|
9116
9345
|
offerCall,
|
|
9346
|
+
__nomosOfferModelLifecycle: offerModelLifecycle,
|
|
9347
|
+
__nomosFrontierTransition: frontierTransition2,
|
|
9117
9348
|
head,
|
|
9118
9349
|
query: query3,
|
|
9119
9350
|
queryById,
|
|
@@ -9384,13 +9615,17 @@ function installedLawOfRows(rows) {
|
|
|
9384
9615
|
}
|
|
9385
9616
|
return out15;
|
|
9386
9617
|
}
|
|
9387
|
-
function lawStatusOf(installed, clientHash) {
|
|
9618
|
+
function lawStatusOf(installed, clientHash, current) {
|
|
9388
9619
|
const known = Array.isArray(installed);
|
|
9389
9620
|
const list = known ? installed : [];
|
|
9621
|
+
const currentSupplied = current !== void 0;
|
|
9622
|
+
const currentKnown = currentSupplied ? Array.isArray(current) : known;
|
|
9623
|
+
const serving = currentSupplied ? Array.isArray(current) ? current : [] : list;
|
|
9390
9624
|
return {
|
|
9391
9625
|
installed: list,
|
|
9392
9626
|
...clientHash !== void 0 ? { clientHash } : {},
|
|
9393
|
-
|
|
9627
|
+
...currentSupplied ? { current } : {},
|
|
9628
|
+
drifted: !!(clientHash !== void 0 && currentKnown && !serving.includes(clientHash))
|
|
9394
9629
|
};
|
|
9395
9630
|
}
|
|
9396
9631
|
function lawDriftMessage({
|
|
@@ -9679,6 +9914,25 @@ ${String(commit).toLowerCase()}`;
|
|
|
9679
9914
|
}
|
|
9680
9915
|
};
|
|
9681
9916
|
};
|
|
9917
|
+
if (!restoreFrom && !mountInPlace && !localOnly && !salvageOnly && !recover) {
|
|
9918
|
+
const _coldSnapshot = span(
|
|
9919
|
+
"receive",
|
|
9920
|
+
"boot: fetch checkpointed custody snapshot",
|
|
9921
|
+
"cfetch"
|
|
9922
|
+
);
|
|
9923
|
+
try {
|
|
9924
|
+
const response = await _fetch(
|
|
9925
|
+
`${base}/v2/workspaces/${workspace}/snapshot`,
|
|
9926
|
+
{ headers: authHeaders }
|
|
9927
|
+
);
|
|
9928
|
+
if (response.ok && response.headers.get("x-nomos-layout") === "local-custody-v3") {
|
|
9929
|
+
restoreFrom = new Uint8Array(await response.arrayBuffer());
|
|
9930
|
+
}
|
|
9931
|
+
} catch {
|
|
9932
|
+
} finally {
|
|
9933
|
+
_coldSnapshot.end({ restored: !!restoreFrom });
|
|
9934
|
+
}
|
|
9935
|
+
}
|
|
9682
9936
|
const repoArg = `/work/ws/${workspace}`;
|
|
9683
9937
|
const provider = kernelProvider || createWasmKernelProvider({ span });
|
|
9684
9938
|
const readRemoteInfo = async () => ({
|
|
@@ -9948,10 +10202,12 @@ ${String(commit).toLowerCase()}`;
|
|
|
9948
10202
|
const watchStops = /* @__PURE__ */ new Set();
|
|
9949
10203
|
let installedLawRowsCache;
|
|
9950
10204
|
let installedLawCurrentCache;
|
|
10205
|
+
let installedLawCurrentError = "";
|
|
9951
10206
|
let installedInterfaceCache;
|
|
9952
10207
|
const invalidateInstalledLawMetadata = () => {
|
|
9953
10208
|
installedLawRowsCache = void 0;
|
|
9954
10209
|
installedLawCurrentCache = void 0;
|
|
10210
|
+
installedLawCurrentError = "";
|
|
9955
10211
|
installedInterfaceCache = void 0;
|
|
9956
10212
|
};
|
|
9957
10213
|
let _disposed = false;
|
|
@@ -9998,17 +10254,19 @@ ${String(commit).toLowerCase()}`;
|
|
|
9998
10254
|
scheduleMaintenanceSoon();
|
|
9999
10255
|
};
|
|
10000
10256
|
const prepareDomainReady = async (domain, packageHash, directiveId) => {
|
|
10001
|
-
|
|
10257
|
+
const currentPackage = currentLawInner()?.[domain];
|
|
10258
|
+
const servingPackage = typeof currentPackage === "string" && currentPackage.length > 0 ? currentPackage : packageHash;
|
|
10259
|
+
requestDomainMaintenance(domain, servingPackage, directiveId);
|
|
10002
10260
|
const readiness2 = await prepareDomainUntilReady({
|
|
10003
10261
|
domain,
|
|
10004
|
-
packageHash,
|
|
10262
|
+
packageHash: servingPackage,
|
|
10005
10263
|
directiveId,
|
|
10006
10264
|
warm: () => serialize(
|
|
10007
10265
|
async () => namedQueryTyped(QueryOperation.WARM, {
|
|
10008
10266
|
interactiveOnly: true,
|
|
10009
10267
|
requestedDomain: domain,
|
|
10010
10268
|
...directiveId ? { requestedDirective: directiveId } : {},
|
|
10011
|
-
requestedPackage:
|
|
10269
|
+
requestedPackage: servingPackage
|
|
10012
10270
|
}),
|
|
10013
10271
|
"prepare generated domain",
|
|
10014
10272
|
false
|
|
@@ -10021,7 +10279,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
10021
10279
|
});
|
|
10022
10280
|
if (readiness2.prepared) {
|
|
10023
10281
|
const index = _maintenanceTargets.findIndex(
|
|
10024
|
-
(target) => target.domain === domain && target.packageHash ===
|
|
10282
|
+
(target) => target.domain === domain && target.packageHash === servingPackage && target.directiveId === directiveId
|
|
10025
10283
|
);
|
|
10026
10284
|
if (index >= 0) _maintenanceTargets.splice(index, 1);
|
|
10027
10285
|
}
|
|
@@ -10696,7 +10954,9 @@ ${String(commit).toLowerCase()}`;
|
|
|
10696
10954
|
const answer = namedQueryTyped(QueryOperation.INSTALLED_LAW);
|
|
10697
10955
|
if (Array.isArray(answer?.domains)) {
|
|
10698
10956
|
const currentLaw2 = answer?.currentLaw;
|
|
10699
|
-
|
|
10957
|
+
if (currentLaw2 && typeof currentLaw2 === "object" && !Array.isArray(currentLaw2)) {
|
|
10958
|
+
installedLawCurrentCache = currentLaw2;
|
|
10959
|
+
}
|
|
10700
10960
|
installedLawRowsCache = answer.domains.map(
|
|
10701
10961
|
(domain) => ({
|
|
10702
10962
|
id: domain.installationId,
|
|
@@ -10740,21 +11000,36 @@ ${String(commit).toLowerCase()}`;
|
|
|
10740
11000
|
return installedLawRowsCache;
|
|
10741
11001
|
};
|
|
10742
11002
|
const currentLawInner = () => {
|
|
10743
|
-
installRowsInner();
|
|
10744
11003
|
if (installedLawCurrentCache !== void 0) return installedLawCurrentCache;
|
|
10745
11004
|
try {
|
|
10746
11005
|
const answer = namedQueryTyped(QueryOperation.CURRENT_LAW);
|
|
10747
11006
|
const current = answer?.keyMap ?? answer?.currentLaw ?? answer;
|
|
10748
|
-
|
|
10749
|
-
|
|
10750
|
-
|
|
11007
|
+
if (current && typeof current === "object" && !Array.isArray(current)) {
|
|
11008
|
+
installedLawCurrentError = "";
|
|
11009
|
+
installedLawCurrentCache = current;
|
|
11010
|
+
return installedLawCurrentCache;
|
|
11011
|
+
}
|
|
11012
|
+
installedLawCurrentError = "kernel current-law read returned no typed domain map";
|
|
11013
|
+
} catch (error) {
|
|
11014
|
+
installedLawCurrentError = String(
|
|
11015
|
+
error?.message || error || "kernel current-law read failed"
|
|
11016
|
+
);
|
|
10751
11017
|
}
|
|
10752
|
-
return
|
|
11018
|
+
return null;
|
|
10753
11019
|
};
|
|
10754
11020
|
const installedLawInner = () => {
|
|
10755
11021
|
const rows = installRowsInner();
|
|
10756
11022
|
return rows === null ? null : installedLawOfRows(rows);
|
|
10757
11023
|
};
|
|
11024
|
+
const currentLawHashesInner = () => {
|
|
11025
|
+
const current = currentLawInner();
|
|
11026
|
+
if (current === null) return null;
|
|
11027
|
+
return [...new Set(
|
|
11028
|
+
Object.values(current).filter(
|
|
11029
|
+
(identity) => typeof identity === "string" && identity.length > 0
|
|
11030
|
+
)
|
|
11031
|
+
)];
|
|
11032
|
+
};
|
|
10758
11033
|
const recomputeCompat = ({ silent = false } = {}) => {
|
|
10759
11034
|
if (!compatState) return null;
|
|
10760
11035
|
const installRows = installRowsInner();
|
|
@@ -10908,16 +11183,28 @@ ${String(commit).toLowerCase()}`;
|
|
|
10908
11183
|
);
|
|
10909
11184
|
}
|
|
10910
11185
|
let pack = null;
|
|
11186
|
+
const packErrors = [];
|
|
10911
11187
|
for (const base2 of bases) {
|
|
10912
11188
|
try {
|
|
10913
11189
|
pack = provider.packDelta(base2, head);
|
|
10914
|
-
} catch {
|
|
11190
|
+
} catch (error) {
|
|
11191
|
+
packErrors.push(`${base2 ?? "<full>"}: ${String(error)}`);
|
|
10915
11192
|
pack = null;
|
|
10916
11193
|
}
|
|
10917
11194
|
if (pack) break;
|
|
10918
11195
|
}
|
|
10919
|
-
if (!pack)
|
|
10920
|
-
|
|
11196
|
+
if (!pack) {
|
|
11197
|
+
const missingOid = packErrors.join(" ").match(/(?:object with id|find commit) ([0-9a-f]{40})/i)?.[1];
|
|
11198
|
+
const objectBytes = (oid) => ["nomos.git/objects", "objects", ".git/objects"].map((root) => {
|
|
11199
|
+
const bytes = provider.readWsFile(
|
|
11200
|
+
`${root}/${oid.slice(0, 2)}/${oid.slice(2)}`
|
|
11201
|
+
);
|
|
11202
|
+
return `${root}=${bytes?.byteLength ?? 0}B`;
|
|
11203
|
+
}).join(",");
|
|
11204
|
+
throw new Error(
|
|
11205
|
+
`the kernel could not build the candidate custody pack${packErrors.length === 0 ? "" : ` (${packErrors[0]})`}; head[${objectBytes(head)}]${missingOid ? `; missing[${objectBytes(missingOid)}]` : ""}`
|
|
11206
|
+
);
|
|
11207
|
+
}
|
|
10921
11208
|
await pushPack(
|
|
10922
11209
|
remote,
|
|
10923
11210
|
authHeaders,
|
|
@@ -12065,6 +12352,10 @@ ${String(commit).toLowerCase()}`;
|
|
|
12065
12352
|
error: "the generated model identity is missing"
|
|
12066
12353
|
};
|
|
12067
12354
|
}
|
|
12355
|
+
const currentHash = String(currentLawInner()?.[domain] ?? "");
|
|
12356
|
+
if (currentHash === candidateHash) {
|
|
12357
|
+
return { ok: true, stage: "already-current" };
|
|
12358
|
+
}
|
|
12068
12359
|
const candidateInstallation = (installRowsInner() ?? []).find(
|
|
12069
12360
|
(row) => row?.id === `domain-installation:${candidateHash}`
|
|
12070
12361
|
);
|
|
@@ -12078,23 +12369,8 @@ ${String(commit).toLowerCase()}`;
|
|
|
12078
12369
|
error: candidatePhase.length === 0 ? `model '${candidateHash}' is not staged in this workspace; deploy the generated USDA package before opening this application` : `model '${candidateHash}' is '${candidatePhase}', so it cannot become current`
|
|
12079
12370
|
};
|
|
12080
12371
|
}
|
|
12081
|
-
const currentHash = String(currentLawInner()?.[domain] ?? "");
|
|
12082
12372
|
if (candidatePhase === "Active") {
|
|
12083
|
-
|
|
12084
|
-
const readiness2 = await prepareDomainReady(domain, candidateHash);
|
|
12085
|
-
if (readiness2.prepared !== true) {
|
|
12086
|
-
throw new Error(
|
|
12087
|
-
`the admitted model '${candidateHash}' authenticated '${domain}' USDA slice did not become ready (${readiness2.reason} after ${readiness2.quanta} maintenance quanta)`
|
|
12088
|
-
);
|
|
12089
|
-
}
|
|
12090
|
-
return { ok: true, stage: "already-current" };
|
|
12091
|
-
} catch (error) {
|
|
12092
|
-
return {
|
|
12093
|
-
ok: false,
|
|
12094
|
-
stage: "preflight",
|
|
12095
|
-
error: String(error?.message || error)
|
|
12096
|
-
};
|
|
12097
|
-
}
|
|
12373
|
+
return { ok: true, stage: "already-current" };
|
|
12098
12374
|
}
|
|
12099
12375
|
let report;
|
|
12100
12376
|
let transition;
|
|
@@ -12233,12 +12509,13 @@ ${String(commit).toLowerCase()}`;
|
|
|
12233
12509
|
);
|
|
12234
12510
|
const data = row?.data;
|
|
12235
12511
|
const domainKeys = Array.isArray(data?.["spec.domainKeys"]) ? data["spec.domainKeys"].map(String) : [];
|
|
12236
|
-
|
|
12512
|
+
const exactSingleDomain = String(data?.["spec.domainHash"] ?? "") === candidateHash && String(currentLawInner()?.[domain] ?? "") === candidateHash && domainKeys.length === 0;
|
|
12513
|
+
if (!data || !domainKeys.includes(domain) && !exactSingleDomain) return null;
|
|
12237
12514
|
return {
|
|
12238
12515
|
hash: candidateHash,
|
|
12239
12516
|
phase: String(data["status.phase"] ?? ""),
|
|
12240
12517
|
dependencies: Array.isArray(data["spec.dependencies"]) ? data["spec.dependencies"].map(String) : [],
|
|
12241
|
-
domainKeys
|
|
12518
|
+
domainKeys: exactSingleDomain ? [domain] : domainKeys
|
|
12242
12519
|
};
|
|
12243
12520
|
};
|
|
12244
12521
|
const _nomosStageGeneratedModel = async (domain, candidateHash, lawUsdz, dependencies) => {
|
|
@@ -12262,14 +12539,10 @@ ${String(commit).toLowerCase()}`;
|
|
|
12262
12539
|
`generated model '${candidateHash}' has no USDZ transport asset`
|
|
12263
12540
|
);
|
|
12264
12541
|
}
|
|
12265
|
-
const
|
|
12266
|
-
const data = entry?.data;
|
|
12267
|
-
return String(data?.["status.phase"] ?? "") === "Active" && Array.isArray(data?.["spec.domainKeys"]) && data["spec.domainKeys"].map(String).includes(domain);
|
|
12268
|
-
});
|
|
12269
|
-
const priorHash = String(predecessor?.data?.["spec.domainHash"] ?? "");
|
|
12542
|
+
const priorHash = String(currentLawInner()?.[domain] ?? "");
|
|
12270
12543
|
if (!priorHash) {
|
|
12271
12544
|
throw new Error(
|
|
12272
|
-
`generated application cannot identify the active '${domain}' model it would supersede`
|
|
12545
|
+
`generated application cannot identify the active '${domain}' model it would supersede` + (installedLawCurrentError ? `: ${installedLawCurrentError}` : "")
|
|
12273
12546
|
);
|
|
12274
12547
|
}
|
|
12275
12548
|
const head = await offerDirective(
|
|
@@ -13960,6 +14233,8 @@ ${String(commit).toLowerCase()}`;
|
|
|
13960
14233
|
workspace,
|
|
13961
14234
|
deviceSecret,
|
|
13962
14235
|
authHeaders,
|
|
14236
|
+
connectionAuthToken: () => activeAuthToken,
|
|
14237
|
+
connectionFrameworkCalls: frameworkCalls,
|
|
13963
14238
|
receivingGroupNameOf,
|
|
13964
14239
|
sha256hexBytes,
|
|
13965
14240
|
bytesUnb64,
|
|
@@ -15363,6 +15638,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
15363
15638
|
"application-open"
|
|
15364
15639
|
);
|
|
15365
15640
|
let requiredParentCustodyHead;
|
|
15641
|
+
let requiredDelegationKeyHash;
|
|
15366
15642
|
try {
|
|
15367
15643
|
if (spec.idToken || typeof spec.signIn === "function") {
|
|
15368
15644
|
const enrollment = await api.enrollFirstDevice({
|
|
@@ -15379,6 +15655,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
15379
15655
|
enrollFirstDeviceCall: spec.enrollFirstDeviceCall
|
|
15380
15656
|
});
|
|
15381
15657
|
requiredParentCustodyHead = enrollment.verdict?.head;
|
|
15658
|
+
requiredDelegationKeyHash = enrollment.keyHash;
|
|
15382
15659
|
if (!requiredParentCustodyHead || !OID40_RE.test(requiredParentCustodyHead)) {
|
|
15383
15660
|
throw new Error(
|
|
15384
15661
|
`enrollFirstDevice at '${parent}' admitted without an exact custody head; refusing to prepare birth against an unbound resident frontier`
|
|
@@ -15429,9 +15706,16 @@ ${String(commit).toLowerCase()}`;
|
|
|
15429
15706
|
}
|
|
15430
15707
|
);
|
|
15431
15708
|
if (dq.ok) {
|
|
15432
|
-
const
|
|
15433
|
-
const
|
|
15434
|
-
|
|
15709
|
+
const response = await dq.json().catch(() => null);
|
|
15710
|
+
const rows = Array.isArray(response) ? response : response && Array.isArray(response.rows) ? response.rows : [];
|
|
15711
|
+
const hasExactDeviceDelegation = rows.some((row) => {
|
|
15712
|
+
if (!row || typeof row !== "object") return false;
|
|
15713
|
+
const data = row.data;
|
|
15714
|
+
if (!data || typeof data !== "object") return false;
|
|
15715
|
+
const fields = data;
|
|
15716
|
+
return fields.certificateParentKey === device.public && (requiredDelegationKeyHash === void 0 || fields.deviceKey === `key:${requiredDelegationKeyHash}`);
|
|
15717
|
+
});
|
|
15718
|
+
if (hasExactDeviceDelegation) {
|
|
15435
15719
|
sawDelegation = true;
|
|
15436
15720
|
break;
|
|
15437
15721
|
}
|
|
@@ -15442,7 +15726,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
15442
15726
|
}
|
|
15443
15727
|
if (!sawDelegation) {
|
|
15444
15728
|
const err15 = new Error(
|
|
15445
|
-
`receiving-group setup: parent '${parent}' still holds NO SignerDelegation for '${owner}' after ${pollTimeoutMs}ms. enrollFirstDevice seated the device SIGNER, but the home cert chain's links[1] (the platform-signed delegation) never surfaced \u2014 the birth would
|
|
15729
|
+
`receiving-group setup: parent '${parent}' still holds NO SignerDelegation for '${owner}' after ${pollTimeoutMs}ms. enrollFirstDevice seated the device SIGNER, but the home cert chain's links[1] (the platform-signed delegation for device '${String(requiredDelegationKeyHash ?? "unknown").slice(0, 12)}\u2026') never surfaced \u2014 the birth would combine different device generations and fail its certificate chain. The enroll must record the keyless delegation (enrollFirstDevice.delegationCert) BEFORE birth. [ParentSignerDelegationMissing]`
|
|
15446
15730
|
);
|
|
15447
15731
|
err15.code = "ParentSignerDelegationMissing";
|
|
15448
15732
|
throw err15;
|
|
@@ -15656,7 +15940,22 @@ ${String(commit).toLowerCase()}`;
|
|
|
15656
15940
|
* lifecycle view: active = served now; superseded/retired = replayable, not served.
|
|
15657
15941
|
* `drifted` is true ONLY on the word of a successful read.
|
|
15658
15942
|
*/
|
|
15659
|
-
lawStatus: () => serialize(async () =>
|
|
15943
|
+
lawStatus: () => serialize(async () => {
|
|
15944
|
+
const currentLaw2 = currentLawInner();
|
|
15945
|
+
const current = currentLawHashesInner();
|
|
15946
|
+
const status2 = lawStatusOf(
|
|
15947
|
+
installedLawRowsCache === void 0 ? null : installedLawInner(),
|
|
15948
|
+
clientLawHash,
|
|
15949
|
+
current
|
|
15950
|
+
);
|
|
15951
|
+
console.error(
|
|
15952
|
+
`[nomos-law-status] workspace=${workspace} client=${status2.clientHash ?? "unregistered"} current=${status2.current?.join(",") ?? "unknown"} installed=${status2.installed.join(",")} drifted=${status2.drifted}`
|
|
15953
|
+
);
|
|
15954
|
+
return {
|
|
15955
|
+
...status2,
|
|
15956
|
+
currentDomains: currentLaw2 === null ? null : Object.keys(currentLaw2).sort()
|
|
15957
|
+
};
|
|
15958
|
+
}),
|
|
15660
15959
|
/**
|
|
15661
15960
|
* Register the BAKED law hash this client was generated under — the soft-warn lane:
|
|
15662
15961
|
* if the workspace's installed law doesn't carry it, ONE console.warn names the drift
|
|
@@ -15670,7 +15969,16 @@ ${String(commit).toLowerCase()}`;
|
|
|
15670
15969
|
"registerLawHash(hash) requires the generated client's baked law hash (the 64-hex sha256 of its package)"
|
|
15671
15970
|
);
|
|
15672
15971
|
clientLawHash = hash;
|
|
15673
|
-
const
|
|
15972
|
+
const currentLaw2 = currentLawInner();
|
|
15973
|
+
const current = currentLawHashesInner();
|
|
15974
|
+
const status2 = lawStatusOf(
|
|
15975
|
+
installedLawRowsCache === void 0 ? null : installedLawInner(),
|
|
15976
|
+
clientLawHash,
|
|
15977
|
+
current
|
|
15978
|
+
);
|
|
15979
|
+
console.error(
|
|
15980
|
+
`[nomos-law-status] workspace=${workspace} client=${status2.clientHash ?? "unregistered"} current=${status2.current?.join(",") ?? "unknown"} installed=${status2.installed.join(",")} drifted=${status2.drifted}`
|
|
15981
|
+
);
|
|
15674
15982
|
if (status2.drifted && !warnedDrift) {
|
|
15675
15983
|
warnedDrift = true;
|
|
15676
15984
|
console.warn(
|
|
@@ -15678,11 +15986,14 @@ ${String(commit).toLowerCase()}`;
|
|
|
15678
15986
|
what: "connect",
|
|
15679
15987
|
workspace,
|
|
15680
15988
|
clientHash: hash,
|
|
15681
|
-
installed: status2.installed
|
|
15989
|
+
installed: status2.current ?? status2.installed
|
|
15682
15990
|
})
|
|
15683
15991
|
);
|
|
15684
15992
|
}
|
|
15685
|
-
return
|
|
15993
|
+
return {
|
|
15994
|
+
...status2,
|
|
15995
|
+
currentDomains: currentLaw2 === null ? null : Object.keys(currentLaw2).sort()
|
|
15996
|
+
};
|
|
15686
15997
|
}),
|
|
15687
15998
|
/**
|
|
15688
15999
|
* THE COMPAT SUPERPOWER (#72b): the generated client factory hands over its baked `nomosCompat`
|
|
@@ -16261,7 +16572,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
16261
16572
|
if (result?.offline === true || result?.pushFailed === true || result?.reconnectRequired === true)
|
|
16262
16573
|
return result;
|
|
16263
16574
|
const localHead = await serialize(async () => resolveBranchHead());
|
|
16264
|
-
if (localHead === syncedBase) return result;
|
|
16575
|
+
if (localHead === syncedBase && !discoverRemote) return result;
|
|
16265
16576
|
return api.sync({ admit, discoverRemote });
|
|
16266
16577
|
});
|
|
16267
16578
|
}
|
|
@@ -17509,6 +17820,33 @@ async function openRealm(opts = {}) {
|
|
|
17509
17820
|
rebindWatches(name, holon);
|
|
17510
17821
|
return holon;
|
|
17511
17822
|
}
|
|
17823
|
+
async function deviceIdentity(secret) {
|
|
17824
|
+
const scratch = `nomos-device-${realmClientId}`;
|
|
17825
|
+
const holon = await mount(scratch, {
|
|
17826
|
+
allowUnborn: true,
|
|
17827
|
+
authToken: "",
|
|
17828
|
+
principal: "",
|
|
17829
|
+
clientId: `${realmClientId}:device-identity`
|
|
17830
|
+
}, { evict: false });
|
|
17831
|
+
try {
|
|
17832
|
+
if (typeof secret === "string" && secret.length > 0) {
|
|
17833
|
+
return { secret, public: await holon.devicePublicOf(secret) };
|
|
17834
|
+
}
|
|
17835
|
+
const created = await holon.authorKeygen();
|
|
17836
|
+
if (!created?.ok || !created.secret || !created.public) {
|
|
17837
|
+
throw new Error("the kernel did not return a complete device identity");
|
|
17838
|
+
}
|
|
17839
|
+
return { secret: created.secret, public: created.public };
|
|
17840
|
+
} finally {
|
|
17841
|
+
try {
|
|
17842
|
+
holon._dispose();
|
|
17843
|
+
} catch {
|
|
17844
|
+
}
|
|
17845
|
+
mounted.delete(scratch);
|
|
17846
|
+
parked.delete(scratch);
|
|
17847
|
+
plane.drop(scratch);
|
|
17848
|
+
}
|
|
17849
|
+
}
|
|
17512
17850
|
return {
|
|
17513
17851
|
/** The realm's stable client id (each workspace gets `${clientId}:${name}` unless overridden). */
|
|
17514
17852
|
clientId: realmClientId,
|
|
@@ -17516,6 +17854,8 @@ async function openRealm(opts = {}) {
|
|
|
17516
17854
|
plane,
|
|
17517
17855
|
/** Open (or mount-on-demand) a holon bound to `name` IN this plane. Same surface as `connect()` returns. */
|
|
17518
17856
|
workspace: (name, wsOpts = {}) => withGate(() => mount(name, wsOpts)),
|
|
17857
|
+
/** Kernel-owned device identity, prepared without reading or creating remote custody. */
|
|
17858
|
+
deviceIdentity: (secret) => withGate(() => deviceIdentity(secret)),
|
|
17519
17859
|
/** The realm's workspaces + their posture (mounted / parked / has-custody). */
|
|
17520
17860
|
list: () => {
|
|
17521
17861
|
const names = /* @__PURE__ */ new Set([
|
|
@@ -18167,6 +18507,16 @@ function prepareManagedPromotion2(report, candidateHash, domain, opts = {}) {
|
|
|
18167
18507
|
error: `the package-wide report does not cover the generated business area '${domain}'`
|
|
18168
18508
|
};
|
|
18169
18509
|
}
|
|
18510
|
+
const dispositions2 = report.dispositions;
|
|
18511
|
+
const changesStableIdentity = dispositions2 !== void 0 && (dispositions2.retired.length > 0 || Object.keys(dispositions2.retyped).length > 0 || Object.keys(dispositions2.rebinds).length > 0);
|
|
18512
|
+
if (changesStableIdentity && !acceptanceReason) {
|
|
18513
|
+
return {
|
|
18514
|
+
ok: false,
|
|
18515
|
+
stage: "acceptance",
|
|
18516
|
+
report,
|
|
18517
|
+
error: "the current-frontier transition changes stable business identities and needs an attributed acceptance reason"
|
|
18518
|
+
};
|
|
18519
|
+
}
|
|
18170
18520
|
const preflight = {
|
|
18171
18521
|
candidateHash,
|
|
18172
18522
|
// A package may be reached through any one of its generated domain clients. The
|
|
@@ -18698,6 +19048,17 @@ var init_offer_result2 = __esm({
|
|
|
18698
19048
|
}
|
|
18699
19049
|
});
|
|
18700
19050
|
|
|
19051
|
+
// vendor/engine/proto/nomos/custody/v1/snapshot_pb.js
|
|
19052
|
+
import { fileDesc as fileDesc6, messageDesc as messageDesc6 } from "@bufbuild/protobuf/codegenv2";
|
|
19053
|
+
var file_nomos_custody_v1_snapshot2, LocalCustodySnapshotSchema2;
|
|
19054
|
+
var init_snapshot_pb2 = __esm({
|
|
19055
|
+
"vendor/engine/proto/nomos/custody/v1/snapshot_pb.js"() {
|
|
19056
|
+
"use strict";
|
|
19057
|
+
file_nomos_custody_v1_snapshot2 = /* @__PURE__ */ fileDesc6("Ch9ub21vcy9jdXN0b2R5L3YxL3NuYXBzaG90LnByb3RvEhBub21vcy5jdXN0b2R5LnYxIqACChRMb2NhbEN1c3RvZHlTbmFwc2hvdBIWCg5mb3JtYXRfdmVyc2lvbhgBIAEoDRIWCgl3b3Jrc3BhY2UYAiABKAlIAIgBARIMCgR0cmVlGAMgASgMEhcKCmNoZWNrcG9pbnQYBCABKAxIAYgBARIVCghmcm9udGllchgFIAEoDEgCiAEBEhMKBmN1cnNvchgGIAEoCUgDiAEBEhcKCnN0YXRlX3Jvb3QYByABKAlIBIgBARIYCgtzeW5jZWRfYmFzZRgIIAEoCUgFiAEBQgwKCl93b3Jrc3BhY2VCDQoLX2NoZWNrcG9pbnRCCwoJX2Zyb250aWVyQgkKB19jdXJzb3JCDQoLX3N0YXRlX3Jvb3RCDgoMX3N5bmNlZF9iYXNlYgZwcm90bzM");
|
|
19058
|
+
LocalCustodySnapshotSchema2 = /* @__PURE__ */ messageDesc6(file_nomos_custody_v1_snapshot2, 0);
|
|
19059
|
+
}
|
|
19060
|
+
});
|
|
19061
|
+
|
|
18701
19062
|
// vendor/engine/engine.ts
|
|
18702
19063
|
var engine_exports = {};
|
|
18703
19064
|
__export(engine_exports, {
|
|
@@ -18787,6 +19148,7 @@ __export(engine_exports, {
|
|
|
18787
19148
|
lawParity: () => lawParity,
|
|
18788
19149
|
ledgerStats: () => ledgerStats,
|
|
18789
19150
|
listRefusedRefs: () => listRefusedRefs,
|
|
19151
|
+
localCustodySnapshot: () => localCustodySnapshot,
|
|
18790
19152
|
materializeRefused: () => materializeRefused,
|
|
18791
19153
|
memoryDropProbe: () => memoryDropProbe,
|
|
18792
19154
|
migrateHomes: () => migrateHomes,
|
|
@@ -20361,8 +20723,11 @@ async function reconcileRequiredCustodyHead(eng, ws, ledger, requiredCustodyHead
|
|
|
20361
20723
|
if (!/^[0-9a-f]{40}$/.test(requiredCustodyHead)) {
|
|
20362
20724
|
throw new Error("required custody head must be a lowercase 40-hex git object id");
|
|
20363
20725
|
}
|
|
20364
|
-
const
|
|
20365
|
-
|
|
20726
|
+
const resident = eng.mounted.get(ws);
|
|
20727
|
+
const current = resident ? kgit.resolveRef(eng, gitdirOf(ws), BRANCH2) : "";
|
|
20728
|
+
if (current === requiredCustodyHead && resident?.remoteMain === requiredCustodyHead && !resident.restoreError) {
|
|
20729
|
+
return resident;
|
|
20730
|
+
}
|
|
20366
20731
|
if (current && isDirty(eng, ws)) {
|
|
20367
20732
|
throw new Error(
|
|
20368
20733
|
`workspace '${ws}' has verified but unsealed resident work; refusing to discard it while reconciling custody`
|
|
@@ -20375,6 +20740,12 @@ async function reconcileRequiredCustodyHead(eng, ws, ledger, requiredCustodyHead
|
|
|
20375
20740
|
`workspace '${ws}' could not reconcile required custody ${requiredCustodyHead}: ${mounted.restoreError || "custody has no verified main"}`
|
|
20376
20741
|
);
|
|
20377
20742
|
}
|
|
20743
|
+
const reconciled = kgit.resolveRef(eng, gitdirOf(ws), BRANCH2);
|
|
20744
|
+
if (reconciled !== requiredCustodyHead || mounted.remoteMain !== requiredCustodyHead) {
|
|
20745
|
+
throw new Error(
|
|
20746
|
+
`workspace '${ws}' restored custody ${mounted.remoteMain || reconciled || "none"}, not required custody ${requiredCustodyHead}`
|
|
20747
|
+
);
|
|
20748
|
+
}
|
|
20378
20749
|
return mounted;
|
|
20379
20750
|
}
|
|
20380
20751
|
function assertAuthored(res, what) {
|
|
@@ -20512,7 +20883,10 @@ async function applyWorkspaceEffect(eng, ws, ledger, requestBytes, admissionChec
|
|
|
20512
20883
|
const result = response.outcome.value.result;
|
|
20513
20884
|
if (!result || result.outcome.case !== "admitted") {
|
|
20514
20885
|
const outcome = result?.outcome.case || "empty";
|
|
20515
|
-
|
|
20886
|
+
const detail = result?.outcome.case === "refused" ? result.outcome.value.refusal?.message : void 0;
|
|
20887
|
+
throw new Error(
|
|
20888
|
+
`target kernel ${outcome} the workspace effect${detail ? `: ${detail}` : ""}`
|
|
20889
|
+
);
|
|
20516
20890
|
}
|
|
20517
20891
|
await custodyPush(eng, ws, ledger, { remoteRef: "refs/heads/main", ffOnly: true });
|
|
20518
20892
|
return toBinary6(ApplyWorkspaceEffectResponseSchema, response.outcome.value);
|
|
@@ -20623,8 +20997,8 @@ function prepareRemoteOffer(eng, ws, requestBytes) {
|
|
|
20623
20997
|
if (authoring.authorSecret.byteLength !== 0) {
|
|
20624
20998
|
throw new Error("remote offer preparation refuses client signing secrets");
|
|
20625
20999
|
}
|
|
20626
|
-
if (request.intent.case !== "call") {
|
|
20627
|
-
throw new Error("remote offer preparation requires a typed directive call");
|
|
21000
|
+
if (request.intent.case !== "call" && request.intent.case !== "modelLifecycle") {
|
|
21001
|
+
throw new Error("remote offer preparation requires a typed directive or model-lifecycle call");
|
|
20628
21002
|
}
|
|
20629
21003
|
const response = callProto(eng.ex, {
|
|
20630
21004
|
case: "prepareRemoteOffer",
|
|
@@ -21090,7 +21464,13 @@ function packDelta(eng, ws, base, head) {
|
|
|
21090
21464
|
case: "packDelta",
|
|
21091
21465
|
value: create7(PackDeltaRequestSchema2, { repo: repoArgOf(ws), base: base || void 0, head })
|
|
21092
21466
|
}, "packDelta").pack;
|
|
21093
|
-
} catch {
|
|
21467
|
+
} catch (error) {
|
|
21468
|
+
console.error("[nomos-custody-pack] packDelta refused", {
|
|
21469
|
+
workspace: ws,
|
|
21470
|
+
base: base || "<full>",
|
|
21471
|
+
head,
|
|
21472
|
+
error: String(error)
|
|
21473
|
+
});
|
|
21094
21474
|
return null;
|
|
21095
21475
|
}
|
|
21096
21476
|
}
|
|
@@ -22267,7 +22647,10 @@ async function emitOutbox(eng, ws, ledger, workspaceEffectBase = "", admissionCh
|
|
|
22267
22647
|
const targetResult = response.result;
|
|
22268
22648
|
if (!targetResult || targetResult.outcome.case !== "admitted") {
|
|
22269
22649
|
const outcome = targetResult?.outcome.case || "empty";
|
|
22270
|
-
|
|
22650
|
+
const detail = targetResult?.outcome.case === "refused" ? targetResult.outcome.value.refusal?.message : void 0;
|
|
22651
|
+
throw new Error(
|
|
22652
|
+
`target kernel ${outcome} the workspace effect${detail ? `: ${detail}` : ""}`
|
|
22653
|
+
);
|
|
22271
22654
|
}
|
|
22272
22655
|
break;
|
|
22273
22656
|
}
|
|
@@ -22299,7 +22682,7 @@ async function emitOutbox(eng, ws, ledger, workspaceEffectBase = "", admissionCh
|
|
|
22299
22682
|
} catch (e) {
|
|
22300
22683
|
errors++;
|
|
22301
22684
|
const destination = offer.route.case === "httpsRoute" ? offer.route.value.url : offer.route.case === "workspaceRoute" ? offer.route.value.workspace : offer.destination;
|
|
22302
|
-
log("outbox-deliver-failed", { ws, offerId: offer.id, destination, error: String(e).slice(0,
|
|
22685
|
+
log("outbox-deliver-failed", { ws, offerId: offer.id, destination, error: String(e).slice(0, 2e3) });
|
|
22303
22686
|
}
|
|
22304
22687
|
}
|
|
22305
22688
|
if (delivered.length || errors) log("outbox", { ws, delivered: delivered.length, errors });
|
|
@@ -22330,6 +22713,26 @@ function snapshot(eng, ws) {
|
|
|
22330
22713
|
const wsDir = dirOf(eng.preopen.dir.contents.get("ws")).contents.get(ws);
|
|
22331
22714
|
return serializeTree2(wsDir);
|
|
22332
22715
|
}
|
|
22716
|
+
function localCustodySnapshot(eng, ws) {
|
|
22717
|
+
const checkpoint = exportCheckpoint(eng, ws);
|
|
22718
|
+
const tree = snapshot(eng, ws);
|
|
22719
|
+
const head = headOf(eng, ws);
|
|
22720
|
+
const body = toBinary6(LocalCustodySnapshotSchema2, create7(LocalCustodySnapshotSchema2, {
|
|
22721
|
+
formatVersion: 3,
|
|
22722
|
+
workspace: ws,
|
|
22723
|
+
tree,
|
|
22724
|
+
checkpoint: checkpoint.blob ? bytesFromB64(checkpoint.blob) : void 0,
|
|
22725
|
+
frontier: checkpoint.frontier ? bytesFromB64(checkpoint.frontier) : void 0,
|
|
22726
|
+
cursor: checkpoint.cursor === void 0 ? void 0 : String(checkpoint.cursor),
|
|
22727
|
+
stateRoot: checkpoint.stateRoot,
|
|
22728
|
+
syncedBase: head || void 0
|
|
22729
|
+
}));
|
|
22730
|
+
const prefix = enc7.encode("NOMOS-CUSTODY-PB3\n");
|
|
22731
|
+
const framed = new Uint8Array(prefix.byteLength + body.byteLength);
|
|
22732
|
+
framed.set(prefix);
|
|
22733
|
+
framed.set(body, prefix.byteLength);
|
|
22734
|
+
return framed;
|
|
22735
|
+
}
|
|
22333
22736
|
function stats(eng) {
|
|
22334
22737
|
return {
|
|
22335
22738
|
mounted: eng.mounted.size,
|
|
@@ -22406,6 +22809,7 @@ var init_engine = __esm({
|
|
|
22406
22809
|
init_lifecycle_calls2();
|
|
22407
22810
|
init_offer_result2();
|
|
22408
22811
|
init_kernel_pb2();
|
|
22812
|
+
init_snapshot_pb2();
|
|
22409
22813
|
enc7 = new TextEncoder();
|
|
22410
22814
|
dec7 = new TextDecoder();
|
|
22411
22815
|
BRANCH2 = "main";
|
|
@@ -23438,6 +23842,14 @@ __export(governance_exports, {
|
|
|
23438
23842
|
import { createHash, createPrivateKey, createPublicKey } from "node:crypto";
|
|
23439
23843
|
import { mkdirSync as mkdirSync3, readFileSync as readFileSync3, writeFileSync as writeFileSync4 } from "node:fs";
|
|
23440
23844
|
import { dirname as dirname3, join as join4 } from "node:path";
|
|
23845
|
+
function custodyAdmissionAccepted(admission) {
|
|
23846
|
+
if (admission === null || admission === void 0 || admission.ok === false) return false;
|
|
23847
|
+
const refused = (admission.sessions ?? []).some(
|
|
23848
|
+
(session) => (session.rejected?.length ?? 0) > 0 || (session.intents ?? []).some((intent) => intent.outcome?.case !== "admitted")
|
|
23849
|
+
);
|
|
23850
|
+
if (refused) return false;
|
|
23851
|
+
return admission.ok === true || /^[0-9a-f]{40}$/i.test(String(admission.main ?? ""));
|
|
23852
|
+
}
|
|
23441
23853
|
async function clientConnect() {
|
|
23442
23854
|
const mod = await Promise.resolve().then(() => (init_src2(), src_exports));
|
|
23443
23855
|
return mod.connect;
|
|
@@ -23576,8 +23988,7 @@ async function adoptRootModelLifecycle(candidateHash, opts, acceptance) {
|
|
|
23576
23988
|
}
|
|
23577
23989
|
const sync = await holon.sync({ admit: true, discoverRemote: true });
|
|
23578
23990
|
const admission = sync.admission;
|
|
23579
|
-
const
|
|
23580
|
-
const ok = sync.pushFailed !== true && sync.offline !== true && admission?.ok === true && rejected.length === 0;
|
|
23991
|
+
const ok = sync.pushFailed !== true && sync.offline !== true && custodyAdmissionAccepted(admission);
|
|
23581
23992
|
return { ok, adoption, sync };
|
|
23582
23993
|
}
|
|
23583
23994
|
async function adoptWorkspaceModel(workspace, domain, candidateHash, opts, acceptance) {
|
|
@@ -23612,8 +24023,7 @@ async function adoptWorkspaceModel(workspace, domain, candidateHash, opts, accep
|
|
|
23612
24023
|
}
|
|
23613
24024
|
const sync = await holon.sync({ admit: true, discoverRemote: true });
|
|
23614
24025
|
const admission = sync.admission;
|
|
23615
|
-
const
|
|
23616
|
-
const ok = sync.pushFailed !== true && sync.offline !== true && admission?.ok === true && rejected.length === 0;
|
|
24026
|
+
const ok = sync.pushFailed !== true && sync.offline !== true && custodyAdmissionAccepted(admission);
|
|
23617
24027
|
return { ok, adoption, sync };
|
|
23618
24028
|
} finally {
|
|
23619
24029
|
holon._dispose?.();
|
|
@@ -23662,11 +24072,11 @@ async function signAndPostPreparedOffer(ws, domain, prepare, opts, authorMode =
|
|
|
23662
24072
|
}
|
|
23663
24073
|
const sync = await holon.sync({ admit: true, discoverRemote: true });
|
|
23664
24074
|
const admission = sync.admission;
|
|
23665
|
-
const
|
|
23666
|
-
const failed = sync.pushFailed === true || sync.offline === true ||
|
|
24075
|
+
const accepted = custodyAdmissionAccepted(admission);
|
|
24076
|
+
const failed = sync.pushFailed === true || sync.offline === true || !accepted;
|
|
23667
24077
|
return {
|
|
23668
|
-
ok: !failed
|
|
23669
|
-
status: !failed
|
|
24078
|
+
ok: !failed,
|
|
24079
|
+
status: !failed ? 200 : admission !== null && admission !== void 0 ? 422 : 502,
|
|
23670
24080
|
body: sync.pushError ?? admission ?? sync,
|
|
23671
24081
|
principal,
|
|
23672
24082
|
actor,
|
|
@@ -28525,10 +28935,14 @@ function domainInventory(value) {
|
|
|
28525
28935
|
const domains = row.domains.map((candidate) => {
|
|
28526
28936
|
if (typeof candidate !== "object" || candidate === null) throw new Error("domain inventory contains a non-record installation");
|
|
28527
28937
|
const install = candidate;
|
|
28528
|
-
if (typeof install.domainHash !== "string" || typeof install.phase !== "string" || !Array.isArray(install.domainKeys) || !install.domainKeys.every((key2) => typeof key2 === "string")) {
|
|
28938
|
+
if (typeof install.domainHash !== "string" || typeof install.phase !== "string" || install.domainKeys !== void 0 && (!Array.isArray(install.domainKeys) || !install.domainKeys.every((key2) => typeof key2 === "string"))) {
|
|
28529
28939
|
throw new Error("domain inventory contains an invalid installation record");
|
|
28530
28940
|
}
|
|
28531
|
-
return {
|
|
28941
|
+
return {
|
|
28942
|
+
domainHash: install.domainHash,
|
|
28943
|
+
phase: install.phase,
|
|
28944
|
+
domainKeys: install.domainKeys ?? []
|
|
28945
|
+
};
|
|
28532
28946
|
});
|
|
28533
28947
|
const currentLaw2 = Object.fromEntries(Object.entries(row.currentLaw).map(([key2, hash]) => {
|
|
28534
28948
|
if (typeof hash !== "string") throw new Error(`domain inventory has a non-string current law for '${key2}'`);
|