githolon 0.108.3 → 0.108.6

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/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). Stored as the kernel scalar `"true"`/`"false"` and decoded back to a real
412
- * JSON boolean on read — so a flag is `t.bool()`, not a 2-value `t.enum`. Counts/filters key on the
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 = { source: "template", parts: [...selector], optional: false };
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("directive precondition ids cannot use item-relative read parts");
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" ? { source: "payload", path: selector.path, prefix: "", suffix: "", optional: false } : { source: "template", parts: [selector], optional: false };
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({ ...base, secondaryOutputs: [...base.secondaryOutputs ?? [], next] });
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) throw new Error(
1668
- `directive('${base.id}').example(...) must satisfy its payload schema: ${parsed.error.message}`
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("directive.fromCurrentPrincipal(field): field must be a non-empty payload field name");
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("directive.fromRecord(field): field must be a non-empty payload field name");
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: [...prior.filter((candidate) => candidate.field !== field), next]
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("directive.delegatedFrom(): call .delegatedRole(relation) before .delegatedFrom(parent)");
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((r) => typeof r !== "string");
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((base.declaredQueryReads ?? []).map((q) => [q.id, q]));
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((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
1854
- return makeRequirable({ ...base, declaredReads: merged, declaredQueryReads: mergedQueries });
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 = { queryId: query3.id, policy: policy.policyId, fromPayload: source.payloadField };
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(prior.map((e) => [canon(e), e]));
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((a, b) => canon(a) < canon(b) ? -1 : canon(a) > canon(b) ? 1 : 0);
1880
- return makeRequirable({ ...base, declaredForeignReads: merged }).alsoEnsures(NomosSourceFrontier);
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 = { ...base.declaredEmits };
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({ ...base, activityDescriptor: normalizeActivity(base.id, input, base.payloadSchema, createdIds) });
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({ ...base, declaredRelations: [...base.declaredRelations, rel] });
1962
+ return makeRequirable({
1963
+ ...base,
1964
+ declaredRelations: [...base.declaredRelations, rel]
1965
+ });
1899
1966
  },
1900
1967
  requiresHostCapability(...portIds) {
1901
- const merged = [.../* @__PURE__ */ new Set([...base.declaredHostCapabilities, ...portIds])].sort();
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((base.declaredQueryReads ?? []).map((q) => [q.id, q]));
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((a, b) => a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
1908
- return makeRequirable({ ...base, birthsChild: true, declaredQueryReads: mergedQueries });
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 = [.../* @__PURE__ */ new Set([...base.grantsRelation ?? [], relation])].sort();
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(this.aggregate.id)}) payload field`
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(this.aggregate.id)}) payload fields; select the mutation target with .target('field') before .plan(...)`
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 detail = query3?.case === "named" ? `query:named:${String(query3.value.operation)}` : query3?.case ? `query:${query3.case}` : custody?.case ? `custody:${custody.case}` : operation.case || "empty";
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 f = wsContents.get(name);
4593
- return f ? f.data : null;
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, 12);
6392
- CustodyIntentOfferSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 13);
6393
- CustodyInlineOffersSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 14);
6394
- CustodySessionCandidateSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 15);
6395
- CustodyOfferBatchResponseSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 16);
6396
- DeadLetterRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 61);
6397
- ListDeadLettersRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 62);
6398
- RetryDeadLetterRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 63);
6399
- DiscardDeadLetterRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 64);
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, 300)
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
@@ -7821,8 +7926,24 @@ function firstDeviceDelegationPayload(route, certificate, typedPayload) {
7821
7926
  if (declared.has("delegationCertificate")) {
7822
7927
  return { delegationCertificate: typedPayload };
7823
7928
  }
7824
- throw new Error(
7825
- `Nomos application route '${route.domain}${route.path}' does not declare the typed 'delegationCertificate' contract [nomos.application.contract_missing]`
7929
+ throw new NomosClientError(
7930
+ `Nomos application route '${route.domain}${route.path}' does not declare the typed 'delegationCertificate' contract`,
7931
+ {
7932
+ code: "nomos.application.contract_missing",
7933
+ operation: "enrollFirstDevice",
7934
+ recommendedAction: NomosRecommendedAction.redeployLaw,
7935
+ info: {
7936
+ code: "nomos.application.contract_missing",
7937
+ message: `Nomos application route '${route.domain}${route.path}' does not declare the typed 'delegationCertificate' contract`,
7938
+ component: "nomos.application",
7939
+ domain: route.domain,
7940
+ operation: "enrollFirstDevice",
7941
+ attributes: {
7942
+ "nomos.application.missing_contract": "delegationCertificate",
7943
+ "nomos.recovery.action": "repeat-parent-authorized-birth"
7944
+ }
7945
+ }
7946
+ }
7826
7947
  );
7827
7948
  }
7828
7949
  function jwtClaimOf(token, claim) {
@@ -7839,7 +7960,7 @@ function jwtClaimOf(token, claim) {
7839
7960
  }
7840
7961
  }
7841
7962
  function createGovernanceOffers(ctx) {
7842
- 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;
7843
7964
  const g = {
7844
7965
  /**
7845
7966
  * AUTHOR a SIGNED governance/framework intent locally and return the sealed offer bytes (base64) ready to
@@ -7944,6 +8065,54 @@ function createGovernanceOffers(ctx) {
7944
8065
  });
7945
8066
  return g.postGovernanceOffer({ directiveId: call.directive, intentBytes: sealed.intentBytes, ws: parent, authToken, domain: call.domain });
7946
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
+ },
7947
8116
  /**
7948
8117
  * Derive the device key's base64 PUBLIC half from its base64 SECRET seed, IN the local wasm (the
7949
8118
  * kernel `attestation_sign` op returns the public half; the secret never leaves this process).
@@ -8130,7 +8299,10 @@ function createGovernanceOffers(ctx) {
8130
8299
  */
8131
8300
  ensureParentSignerEnrollment: async (args = {}) => {
8132
8301
  const { parent, device, domain, grantedAt, authToken, idToken, signIn, verifiedVia, validFromEpoch = 0, frameworkCalls } = args;
8133
- const keyless = !!(idToken || typeof signIn === "function");
8302
+ const effectiveAuthToken = authToken || connectionAuthToken();
8303
+ const effectiveIdToken = idToken || effectiveAuthToken;
8304
+ const effectiveFrameworkCalls = frameworkCalls ?? connectionFrameworkCalls;
8305
+ const keyless = !!(effectiveIdToken || typeof signIn === "function");
8134
8306
  const directiveId = args.directiveId || (keyless ? "enrollFirstDevice" : "enrollSigner");
8135
8307
  const principal = canonicalPrincipal(args.principal);
8136
8308
  let publicKey = device && device.public || args.publicKey;
@@ -8140,13 +8312,13 @@ function createGovernanceOffers(ctx) {
8140
8312
  if (!publicKey && authorSecret) publicKey = await g.devicePublicOf(authorSecret);
8141
8313
  if (!publicKey) throw new Error("ensureParentSignerEnrollment requires the device `publicKey` (pass `device`/`publicKey`, or a secret it can be derived from)");
8142
8314
  const keyHash = await sha256hexBytes2(bytesUnb642(publicKey));
8143
- const posture = await g.parentSignerEnrollment({ parent, principal, keyHash, authToken });
8315
+ const posture = await g.parentSignerEnrollment({ parent, principal, keyHash, authToken: effectiveAuthToken });
8144
8316
  if (posture.enrolled) return { parent, principal, keyHash, enrolled: true, repaired: false, checkedAt: posture.checkedAt };
8145
8317
  if (posture.revoked) {
8146
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]`);
8147
8319
  }
8148
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");
8149
- const token = keyless ? typeof signIn === "function" ? await signIn(keyHash) : idToken : null;
8321
+ const token = keyless ? typeof signIn === "function" ? await signIn(keyHash) : effectiveIdToken : null;
8150
8322
  let resolved = domain ? { domain, directiveId } : null;
8151
8323
  let enrollmentRoute;
8152
8324
  if (!resolved && parent === workspace && typeof installedInterfaceInner === "function") {
@@ -8171,7 +8343,7 @@ function createGovernanceOffers(ctx) {
8171
8343
  }
8172
8344
  resolved = { domain: enrollmentRoute.domain, directiveId };
8173
8345
  }
8174
- if (!resolved) resolved = await g.discoverDirectiveDomain({ ws: parent, directiveId, authToken });
8346
+ if (!resolved) resolved = await g.discoverDirectiveDomain({ ws: parent, directiveId, authToken: effectiveAuthToken });
8175
8347
  let delegationPayload;
8176
8348
  if (keyless) {
8177
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");
@@ -8193,12 +8365,29 @@ function createGovernanceOffers(ctx) {
8193
8365
  }
8194
8366
  const issuerClaim = verifiedVia || (token ? jwtClaimOf(token, "iss") : void 0);
8195
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() };
8196
- if (frameworkCalls === void 0) {
8197
- throw new TypeError("ensureParentSignerEnrollment requires compiler-generated framework calls");
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
+ });
8198
8387
  }
8199
8388
  const call = keyless ? (() => {
8200
8389
  if (typeof issuerClaim !== "string" || !issuerClaim || !token) throw new Error("verified first-device enrollment needs its typed issuer and identity proof");
8201
- return frameworkCalls.identity.enrollFirstDevice({
8390
+ return effectiveFrameworkCalls.identity.enrollFirstDevice({
8202
8391
  domain: resolved.domain,
8203
8392
  workspace: parent,
8204
8393
  keyHash,
@@ -8208,7 +8397,7 @@ function createGovernanceOffers(ctx) {
8208
8397
  idpToken: token,
8209
8398
  ...delegationPayload ?? {}
8210
8399
  });
8211
- })() : frameworkCalls.identity.enrollSigner({
8400
+ })() : effectiveFrameworkCalls.identity.enrollSigner({
8212
8401
  domain: resolved.domain,
8213
8402
  workspace: parent,
8214
8403
  keyHash,
@@ -8220,7 +8409,7 @@ function createGovernanceOffers(ctx) {
8220
8409
  const res = await offerCall(call, { actor: principal, signWith: authorSecret });
8221
8410
  verdict = { ok: true, status: 200, body: res };
8222
8411
  } else {
8223
- const bearer = authToken || token;
8412
+ const bearer = effectiveAuthToken || token;
8224
8413
  const sealed = await signWorkspaceOffer({
8225
8414
  target: parent,
8226
8415
  call,
@@ -8592,23 +8781,46 @@ function connectRemote(opts) {
8592
8781
  }
8593
8782
  const entropy = new Uint32Array(16);
8594
8783
  crypto.getRandomValues(entropy);
8595
- const preparedRequest = createDirectiveOfferRequest(
8596
- { repo: `/work/ws/${workspace}`, workspace, branch: "main" },
8597
- {
8598
- domain,
8599
- directiveId,
8600
- payload: callUsda,
8601
- capturedPorts: {
8602
- clock: { physical: Date.now(), logical: 0, replica: entropy[0] ?? 0 },
8603
- rng: [...entropy].map((value) => value / 4294967296)
8604
- },
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,
8605
8810
  sequence: requestSequence + 1n,
8606
- actor: o?.actor ?? principal ?? "",
8607
- authToken: opts.authToken && !opts.authorSecret ? opts.authToken : void 0,
8811
+ actor,
8608
8812
  spans: true,
8609
- prepareOnly: true,
8610
- lawUsdz: o?.lawUsdz,
8611
- domainHash: o?.domainHash
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
8612
8824
  }
8613
8825
  );
8614
8826
  const offerRequest2 = toBinary4(OfferRequestSchema, preparedRequest);
@@ -8765,6 +8977,39 @@ function connectRemote(opts) {
8765
8977
  const call = requireGeneratedCall(value, "remote offerCall");
8766
8978
  return offerDirective(call.domain, call.directive, call.canonicalUsda, o);
8767
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
+ };
8768
9013
  const query3 = async (queryId, params) => {
8769
9014
  const response = await kernelRuntime({
8770
9015
  case: "query",
@@ -9098,6 +9343,8 @@ function connectRemote(opts) {
9098
9343
  cloud: base,
9099
9344
  principal,
9100
9345
  offerCall,
9346
+ __nomosOfferModelLifecycle: offerModelLifecycle,
9347
+ __nomosFrontierTransition: frontierTransition2,
9101
9348
  head,
9102
9349
  query: query3,
9103
9350
  queryById,
@@ -9368,13 +9615,17 @@ function installedLawOfRows(rows) {
9368
9615
  }
9369
9616
  return out15;
9370
9617
  }
9371
- function lawStatusOf(installed, clientHash) {
9618
+ function lawStatusOf(installed, clientHash, current) {
9372
9619
  const known = Array.isArray(installed);
9373
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;
9374
9624
  return {
9375
9625
  installed: list,
9376
9626
  ...clientHash !== void 0 ? { clientHash } : {},
9377
- drifted: !!(clientHash !== void 0 && known && !list.includes(clientHash))
9627
+ ...currentSupplied ? { current } : {},
9628
+ drifted: !!(clientHash !== void 0 && currentKnown && !serving.includes(clientHash))
9378
9629
  };
9379
9630
  }
9380
9631
  function lawDriftMessage({
@@ -9663,6 +9914,25 @@ ${String(commit).toLowerCase()}`;
9663
9914
  }
9664
9915
  };
9665
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
+ }
9666
9936
  const repoArg = `/work/ws/${workspace}`;
9667
9937
  const provider = kernelProvider || createWasmKernelProvider({ span });
9668
9938
  const readRemoteInfo = async () => ({
@@ -9932,10 +10202,12 @@ ${String(commit).toLowerCase()}`;
9932
10202
  const watchStops = /* @__PURE__ */ new Set();
9933
10203
  let installedLawRowsCache;
9934
10204
  let installedLawCurrentCache;
10205
+ let installedLawCurrentError = "";
9935
10206
  let installedInterfaceCache;
9936
10207
  const invalidateInstalledLawMetadata = () => {
9937
10208
  installedLawRowsCache = void 0;
9938
10209
  installedLawCurrentCache = void 0;
10210
+ installedLawCurrentError = "";
9939
10211
  installedInterfaceCache = void 0;
9940
10212
  };
9941
10213
  let _disposed = false;
@@ -9982,17 +10254,19 @@ ${String(commit).toLowerCase()}`;
9982
10254
  scheduleMaintenanceSoon();
9983
10255
  };
9984
10256
  const prepareDomainReady = async (domain, packageHash, directiveId) => {
9985
- requestDomainMaintenance(domain, packageHash, directiveId);
10257
+ const currentPackage = currentLawInner()?.[domain];
10258
+ const servingPackage = typeof currentPackage === "string" && currentPackage.length > 0 ? currentPackage : packageHash;
10259
+ requestDomainMaintenance(domain, servingPackage, directiveId);
9986
10260
  const readiness2 = await prepareDomainUntilReady({
9987
10261
  domain,
9988
- packageHash,
10262
+ packageHash: servingPackage,
9989
10263
  directiveId,
9990
10264
  warm: () => serialize(
9991
10265
  async () => namedQueryTyped(QueryOperation.WARM, {
9992
10266
  interactiveOnly: true,
9993
10267
  requestedDomain: domain,
9994
10268
  ...directiveId ? { requestedDirective: directiveId } : {},
9995
- requestedPackage: packageHash
10269
+ requestedPackage: servingPackage
9996
10270
  }),
9997
10271
  "prepare generated domain",
9998
10272
  false
@@ -10005,7 +10279,7 @@ ${String(commit).toLowerCase()}`;
10005
10279
  });
10006
10280
  if (readiness2.prepared) {
10007
10281
  const index = _maintenanceTargets.findIndex(
10008
- (target) => target.domain === domain && target.packageHash === packageHash && target.directiveId === directiveId
10282
+ (target) => target.domain === domain && target.packageHash === servingPackage && target.directiveId === directiveId
10009
10283
  );
10010
10284
  if (index >= 0) _maintenanceTargets.splice(index, 1);
10011
10285
  }
@@ -10680,7 +10954,9 @@ ${String(commit).toLowerCase()}`;
10680
10954
  const answer = namedQueryTyped(QueryOperation.INSTALLED_LAW);
10681
10955
  if (Array.isArray(answer?.domains)) {
10682
10956
  const currentLaw2 = answer?.currentLaw;
10683
- installedLawCurrentCache = currentLaw2 && typeof currentLaw2 === "object" && !Array.isArray(currentLaw2) ? currentLaw2 : null;
10957
+ if (currentLaw2 && typeof currentLaw2 === "object" && !Array.isArray(currentLaw2)) {
10958
+ installedLawCurrentCache = currentLaw2;
10959
+ }
10684
10960
  installedLawRowsCache = answer.domains.map(
10685
10961
  (domain) => ({
10686
10962
  id: domain.installationId,
@@ -10724,21 +11000,36 @@ ${String(commit).toLowerCase()}`;
10724
11000
  return installedLawRowsCache;
10725
11001
  };
10726
11002
  const currentLawInner = () => {
10727
- installRowsInner();
10728
11003
  if (installedLawCurrentCache !== void 0) return installedLawCurrentCache;
10729
11004
  try {
10730
11005
  const answer = namedQueryTyped(QueryOperation.CURRENT_LAW);
10731
11006
  const current = answer?.keyMap ?? answer?.currentLaw ?? answer;
10732
- installedLawCurrentCache = current && typeof current === "object" && !Array.isArray(current) ? current : null;
10733
- } catch {
10734
- installedLawCurrentCache = null;
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
+ );
10735
11017
  }
10736
- return installedLawCurrentCache;
11018
+ return null;
10737
11019
  };
10738
11020
  const installedLawInner = () => {
10739
11021
  const rows = installRowsInner();
10740
11022
  return rows === null ? null : installedLawOfRows(rows);
10741
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
+ };
10742
11033
  const recomputeCompat = ({ silent = false } = {}) => {
10743
11034
  if (!compatState) return null;
10744
11035
  const installRows = installRowsInner();
@@ -10892,16 +11183,28 @@ ${String(commit).toLowerCase()}`;
10892
11183
  );
10893
11184
  }
10894
11185
  let pack = null;
11186
+ const packErrors = [];
10895
11187
  for (const base2 of bases) {
10896
11188
  try {
10897
11189
  pack = provider.packDelta(base2, head);
10898
- } catch {
11190
+ } catch (error) {
11191
+ packErrors.push(`${base2 ?? "<full>"}: ${String(error)}`);
10899
11192
  pack = null;
10900
11193
  }
10901
11194
  if (pack) break;
10902
11195
  }
10903
- if (!pack)
10904
- throw new Error("the kernel could not build the candidate custody pack");
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
+ }
10905
11208
  await pushPack(
10906
11209
  remote,
10907
11210
  authHeaders,
@@ -12049,6 +12352,10 @@ ${String(commit).toLowerCase()}`;
12049
12352
  error: "the generated model identity is missing"
12050
12353
  };
12051
12354
  }
12355
+ const currentHash = String(currentLawInner()?.[domain] ?? "");
12356
+ if (currentHash === candidateHash) {
12357
+ return { ok: true, stage: "already-current" };
12358
+ }
12052
12359
  const candidateInstallation = (installRowsInner() ?? []).find(
12053
12360
  (row) => row?.id === `domain-installation:${candidateHash}`
12054
12361
  );
@@ -12062,23 +12369,8 @@ ${String(commit).toLowerCase()}`;
12062
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`
12063
12370
  };
12064
12371
  }
12065
- const currentHash = String(currentLawInner()?.[domain] ?? "");
12066
12372
  if (candidatePhase === "Active") {
12067
- try {
12068
- const readiness2 = await prepareDomainReady(domain, candidateHash);
12069
- if (readiness2.prepared !== true) {
12070
- throw new Error(
12071
- `the admitted model '${candidateHash}' authenticated '${domain}' USDA slice did not become ready (${readiness2.reason} after ${readiness2.quanta} maintenance quanta)`
12072
- );
12073
- }
12074
- return { ok: true, stage: "already-current" };
12075
- } catch (error) {
12076
- return {
12077
- ok: false,
12078
- stage: "preflight",
12079
- error: String(error?.message || error)
12080
- };
12081
- }
12373
+ return { ok: true, stage: "already-current" };
12082
12374
  }
12083
12375
  let report;
12084
12376
  let transition;
@@ -12217,12 +12509,13 @@ ${String(commit).toLowerCase()}`;
12217
12509
  );
12218
12510
  const data = row?.data;
12219
12511
  const domainKeys = Array.isArray(data?.["spec.domainKeys"]) ? data["spec.domainKeys"].map(String) : [];
12220
- if (!data || !domainKeys.includes(domain)) return null;
12512
+ const exactSingleDomain = String(data?.["spec.domainHash"] ?? "") === candidateHash && String(currentLawInner()?.[domain] ?? "") === candidateHash && domainKeys.length === 0;
12513
+ if (!data || !domainKeys.includes(domain) && !exactSingleDomain) return null;
12221
12514
  return {
12222
12515
  hash: candidateHash,
12223
12516
  phase: String(data["status.phase"] ?? ""),
12224
12517
  dependencies: Array.isArray(data["spec.dependencies"]) ? data["spec.dependencies"].map(String) : [],
12225
- domainKeys
12518
+ domainKeys: exactSingleDomain ? [domain] : domainKeys
12226
12519
  };
12227
12520
  };
12228
12521
  const _nomosStageGeneratedModel = async (domain, candidateHash, lawUsdz, dependencies) => {
@@ -12246,14 +12539,10 @@ ${String(commit).toLowerCase()}`;
12246
12539
  `generated model '${candidateHash}' has no USDZ transport asset`
12247
12540
  );
12248
12541
  }
12249
- const predecessor = rows.find((entry) => {
12250
- const data = entry?.data;
12251
- return String(data?.["status.phase"] ?? "") === "Active" && Array.isArray(data?.["spec.domainKeys"]) && data["spec.domainKeys"].map(String).includes(domain);
12252
- });
12253
- const priorHash = String(predecessor?.data?.["spec.domainHash"] ?? "");
12542
+ const priorHash = String(currentLawInner()?.[domain] ?? "");
12254
12543
  if (!priorHash) {
12255
12544
  throw new Error(
12256
- `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}` : "")
12257
12546
  );
12258
12547
  }
12259
12548
  const head = await offerDirective(
@@ -13944,6 +14233,8 @@ ${String(commit).toLowerCase()}`;
13944
14233
  workspace,
13945
14234
  deviceSecret,
13946
14235
  authHeaders,
14236
+ connectionAuthToken: () => activeAuthToken,
14237
+ connectionFrameworkCalls: frameworkCalls,
13947
14238
  receivingGroupNameOf,
13948
14239
  sha256hexBytes,
13949
14240
  bytesUnb64,
@@ -15347,6 +15638,7 @@ ${String(commit).toLowerCase()}`;
15347
15638
  "application-open"
15348
15639
  );
15349
15640
  let requiredParentCustodyHead;
15641
+ let requiredDelegationKeyHash;
15350
15642
  try {
15351
15643
  if (spec.idToken || typeof spec.signIn === "function") {
15352
15644
  const enrollment = await api.enrollFirstDevice({
@@ -15363,6 +15655,7 @@ ${String(commit).toLowerCase()}`;
15363
15655
  enrollFirstDeviceCall: spec.enrollFirstDeviceCall
15364
15656
  });
15365
15657
  requiredParentCustodyHead = enrollment.verdict?.head;
15658
+ requiredDelegationKeyHash = enrollment.keyHash;
15366
15659
  if (!requiredParentCustodyHead || !OID40_RE.test(requiredParentCustodyHead)) {
15367
15660
  throw new Error(
15368
15661
  `enrollFirstDevice at '${parent}' admitted without an exact custody head; refusing to prepare birth against an unbound resident frontier`
@@ -15413,9 +15706,16 @@ ${String(commit).toLowerCase()}`;
15413
15706
  }
15414
15707
  );
15415
15708
  if (dq.ok) {
15416
- const rows = await dq.json().catch(() => null);
15417
- const has = Array.isArray(rows) ? rows.length > 0 : rows && Array.isArray(rows.rows) ? rows.rows.length > 0 : false;
15418
- if (has) {
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) {
15419
15719
  sawDelegation = true;
15420
15720
  break;
15421
15721
  }
@@ -15426,7 +15726,7 @@ ${String(commit).toLowerCase()}`;
15426
15726
  }
15427
15727
  if (!sawDelegation) {
15428
15728
  const err15 = new Error(
15429
- `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 come up UNWARRANTED/headless (birth-cert-not-seeded). The enroll must record the keyless delegation (enrollFirstDevice.delegationCert) BEFORE birth. [ParentSignerDelegationMissing]`
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]`
15430
15730
  );
15431
15731
  err15.code = "ParentSignerDelegationMissing";
15432
15732
  throw err15;
@@ -15640,7 +15940,22 @@ ${String(commit).toLowerCase()}`;
15640
15940
  * lifecycle view: active = served now; superseded/retired = replayable, not served.
15641
15941
  * `drifted` is true ONLY on the word of a successful read.
15642
15942
  */
15643
- lawStatus: () => serialize(async () => lawStatusOf(installedLawInner(), clientLawHash)),
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
+ }),
15644
15959
  /**
15645
15960
  * Register the BAKED law hash this client was generated under — the soft-warn lane:
15646
15961
  * if the workspace's installed law doesn't carry it, ONE console.warn names the drift
@@ -15654,7 +15969,16 @@ ${String(commit).toLowerCase()}`;
15654
15969
  "registerLawHash(hash) requires the generated client's baked law hash (the 64-hex sha256 of its package)"
15655
15970
  );
15656
15971
  clientLawHash = hash;
15657
- const status2 = lawStatusOf(installedLawInner(), clientLawHash);
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
+ );
15658
15982
  if (status2.drifted && !warnedDrift) {
15659
15983
  warnedDrift = true;
15660
15984
  console.warn(
@@ -15662,11 +15986,14 @@ ${String(commit).toLowerCase()}`;
15662
15986
  what: "connect",
15663
15987
  workspace,
15664
15988
  clientHash: hash,
15665
- installed: status2.installed
15989
+ installed: status2.current ?? status2.installed
15666
15990
  })
15667
15991
  );
15668
15992
  }
15669
- return status2;
15993
+ return {
15994
+ ...status2,
15995
+ currentDomains: currentLaw2 === null ? null : Object.keys(currentLaw2).sort()
15996
+ };
15670
15997
  }),
15671
15998
  /**
15672
15999
  * THE COMPAT SUPERPOWER (#72b): the generated client factory hands over its baked `nomosCompat`
@@ -16245,7 +16572,7 @@ ${String(commit).toLowerCase()}`;
16245
16572
  if (result?.offline === true || result?.pushFailed === true || result?.reconnectRequired === true)
16246
16573
  return result;
16247
16574
  const localHead = await serialize(async () => resolveBranchHead());
16248
- if (localHead === syncedBase) return result;
16575
+ if (localHead === syncedBase && !discoverRemote) return result;
16249
16576
  return api.sync({ admit, discoverRemote });
16250
16577
  });
16251
16578
  }
@@ -17493,6 +17820,33 @@ async function openRealm(opts = {}) {
17493
17820
  rebindWatches(name, holon);
17494
17821
  return holon;
17495
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
+ }
17496
17850
  return {
17497
17851
  /** The realm's stable client id (each workspace gets `${clientId}:${name}` unless overridden). */
17498
17852
  clientId: realmClientId,
@@ -17500,6 +17854,8 @@ async function openRealm(opts = {}) {
17500
17854
  plane,
17501
17855
  /** Open (or mount-on-demand) a holon bound to `name` IN this plane. Same surface as `connect()` returns. */
17502
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)),
17503
17859
  /** The realm's workspaces + their posture (mounted / parked / has-custody). */
17504
17860
  list: () => {
17505
17861
  const names = /* @__PURE__ */ new Set([
@@ -18151,6 +18507,16 @@ function prepareManagedPromotion2(report, candidateHash, domain, opts = {}) {
18151
18507
  error: `the package-wide report does not cover the generated business area '${domain}'`
18152
18508
  };
18153
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
+ }
18154
18520
  const preflight = {
18155
18521
  candidateHash,
18156
18522
  // A package may be reached through any one of its generated domain clients. The
@@ -18511,7 +18877,7 @@ var init_lifecycle_calls2 = __esm({
18511
18877
 
18512
18878
  // vendor/engine/proto/nomos/kernel/v1/kernel_pb.js
18513
18879
  import { enumDesc as enumDesc4, fileDesc as fileDesc5, messageDesc as messageDesc5, serviceDesc as serviceDesc3, tsEnum as tsEnum4 } from "@bufbuild/protobuf/codegenv2";
18514
- var file_nomos_kernel_v1_kernel2, CallRequestSchema2, CallResponseSchema2, PrepareRemoteOfferRequestSchema2, PrepareRemoteOfferResponseSchema2, ApplyWorkspaceEffectRequestSchema, ApplyWorkspaceEffectResponseSchema, WorkspaceTargetSchema2, InitializeWorkspaceRequestSchema, DirectiveCallSchema3, AuthoringOptionsSchema3, CapturedClockSchema3, BirthCertificateSchema3, SignBirthCertificateRequestSchema2, OfferRequestSchema3, QueryRequestSchema3, QueryAuthoritySchema3, InjectedKeySchema2, RowsQuerySchema3, PageQuerySchema3, ByIdQuerySchema3, ByTypeQuerySchema2, TallyQuerySchema3, SpatialQuerySchema3, PendingConflictsQuerySchema2, PendingConflictSummaryQuerySchema2, NamedQuerySchema3, FrontierTransitionRequestSchema2, AuthorizationObjectSchema3, AuthorizationSubjectSchema3, AuthorizationConsistencySchema3, AuthorizationCheckRequestSchema3, AuthorizationExpandRequestSchema, OutboxRequestSchema, SyncRequestSchema3, TestRequestSchema3, SetTestRootRequestSchema3, CustodyRequestSchema2, ResidentFootprintRequestSchema, PackDeltaRequestSchema2, ApplyPackRequestSchema2, RepoStatsRequestSchema2, IntentsAboveRequestSchema3, InspectChangeRequestSchema, RefusalVerdictSchema, EncodeRefusalVerdictRequestSchema, InspectRefusalVerdictRequestSchema, ProveCompactionEquivalenceRequestSchema, ReadBlobRequestSchema, ResolveRefRequestSchema2, ListRefsRequestSchema, WriteRefRequestSchema3, DeleteRefRequestSchema3, WriteMetaCommitRequestSchema, LawClosureInfoRequestSchema2, CheckpointExportRequestSchema2, VerifiedFrontierReceiptSchema, StoredCheckpointManifestSchema, CheckpointImportRequestSchema3, CapacityReserveRequestSchema2, RestoreMainRequestSchema2, ResolveStatePositionRequestSchema, NomosValueSchema2, NomosStructSchema2, BirthOutcomeStatusSchema2, BirthOutcomeStatus2, QueryResultFormatSchema2, QueryResultFormat2, QueryOperationSchema2, QueryOperation3, KernelLawCapabilitySchema2, KernelLawCapability2, CheckpointCompressionSchema, CheckpointCompression, CheckpointVerificationPolicySchema, CheckpointVerificationPolicy, CheckpointAssuranceSchema, CheckpointAssurance, IntentTransportRequirementSchema2, IntentTransportRequirement3, LifecycleInstallPhaseSchema, LifecycleInstallPhase;
18880
+ var file_nomos_kernel_v1_kernel2, CallRequestSchema2, CallResponseSchema2, PrepareRemoteOfferRequestSchema2, PrepareRemoteOfferResponseSchema2, ApplyWorkspaceEffectRequestSchema, ApplyWorkspaceEffectResponseSchema, WorkspaceTargetSchema2, InitializeWorkspaceRequestSchema, DirectiveCallSchema3, AuthoringOptionsSchema3, CapturedClockSchema3, BirthCertificateSchema3, SignBirthCertificateRequestSchema2, ModelLifecycleIntentSchema2, OfferRequestSchema3, QueryRequestSchema3, QueryAuthoritySchema3, InjectedKeySchema2, RowsQuerySchema3, PageQuerySchema3, ByIdQuerySchema3, ByTypeQuerySchema2, TallyQuerySchema3, SpatialQuerySchema3, PendingConflictsQuerySchema2, PendingConflictSummaryQuerySchema2, NamedQuerySchema3, FrontierTransitionRequestSchema2, FrontierTransitionDispositionMapEntrySchema, FrontierTransitionDispositionsSchema, FrontierTransitionViolationSchema, FrontierTransitionResponseSchema, AuthorizationObjectSchema3, AuthorizationSubjectSchema3, AuthorizationConsistencySchema3, AuthorizationCheckRequestSchema3, AuthorizationExpandRequestSchema, OutboxRequestSchema, SyncRequestSchema3, TestRequestSchema3, SetTestRootRequestSchema3, CustodyRequestSchema2, ResidentFootprintRequestSchema, PackDeltaRequestSchema2, ApplyPackRequestSchema2, RepoStatsRequestSchema2, IntentsAboveRequestSchema3, InspectChangeRequestSchema, RefusalVerdictSchema, EncodeRefusalVerdictRequestSchema, InspectRefusalVerdictRequestSchema, ProveCompactionEquivalenceRequestSchema, ReadBlobRequestSchema, ResolveRefRequestSchema2, ListRefsRequestSchema, WriteRefRequestSchema3, DeleteRefRequestSchema3, WriteMetaCommitRequestSchema, LawClosureInfoRequestSchema2, CheckpointExportRequestSchema2, VerifiedFrontierReceiptSchema, StoredCheckpointManifestSchema, CheckpointImportRequestSchema3, CapacityReserveRequestSchema2, RestoreMainRequestSchema2, ResolveStatePositionRequestSchema, NomosValueSchema2, NomosStructSchema2, BirthOutcomeStatusSchema2, BirthOutcomeStatus2, ModelLifecycleOperationSchema2, ModelLifecycleOperation3, QueryResultFormatSchema2, QueryResultFormat2, QueryOperationSchema2, QueryOperation3, KernelLawCapabilitySchema2, KernelLawCapability2, CheckpointCompressionSchema, CheckpointCompression, CheckpointVerificationPolicySchema, CheckpointVerificationPolicy, CheckpointAssuranceSchema, CheckpointAssurance, IntentTransportRequirementSchema2, IntentTransportRequirement3, LifecycleInstallPhaseSchema, LifecycleInstallPhase;
18515
18881
  var init_kernel_pb2 = __esm({
18516
18882
  "vendor/engine/proto/nomos/kernel/v1/kernel_pb.js"() {
18517
18883
  "use strict";
@@ -18529,6 +18895,7 @@ var init_kernel_pb2 = __esm({
18529
18895
  CapturedClockSchema3 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 49);
18530
18896
  BirthCertificateSchema3 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 50);
18531
18897
  SignBirthCertificateRequestSchema2 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 51);
18898
+ ModelLifecycleIntentSchema2 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 53);
18532
18899
  OfferRequestSchema3 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 54);
18533
18900
  QueryRequestSchema3 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 57);
18534
18901
  QueryAuthoritySchema3 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 64);
@@ -18543,6 +18910,10 @@ var init_kernel_pb2 = __esm({
18543
18910
  PendingConflictSummaryQuerySchema2 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 77);
18544
18911
  NamedQuerySchema3 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 78);
18545
18912
  FrontierTransitionRequestSchema2 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 79);
18913
+ FrontierTransitionDispositionMapEntrySchema = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 80);
18914
+ FrontierTransitionDispositionsSchema = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 81);
18915
+ FrontierTransitionViolationSchema = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 82);
18916
+ FrontierTransitionResponseSchema = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 83);
18546
18917
  AuthorizationObjectSchema3 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 84);
18547
18918
  AuthorizationSubjectSchema3 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 85);
18548
18919
  AuthorizationConsistencySchema3 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 87);
@@ -18581,6 +18952,8 @@ var init_kernel_pb2 = __esm({
18581
18952
  NomosStructSchema2 = /* @__PURE__ */ messageDesc5(file_nomos_kernel_v1_kernel2, 166);
18582
18953
  BirthOutcomeStatusSchema2 = /* @__PURE__ */ enumDesc4(file_nomos_kernel_v1_kernel2, 0);
18583
18954
  BirthOutcomeStatus2 = /* @__PURE__ */ tsEnum4(BirthOutcomeStatusSchema2);
18955
+ ModelLifecycleOperationSchema2 = /* @__PURE__ */ enumDesc4(file_nomos_kernel_v1_kernel2, 3);
18956
+ ModelLifecycleOperation3 = /* @__PURE__ */ tsEnum4(ModelLifecycleOperationSchema2);
18584
18957
  QueryResultFormatSchema2 = /* @__PURE__ */ enumDesc4(file_nomos_kernel_v1_kernel2, 5);
18585
18958
  QueryResultFormat2 = /* @__PURE__ */ tsEnum4(QueryResultFormatSchema2);
18586
18959
  QueryOperationSchema2 = /* @__PURE__ */ enumDesc4(file_nomos_kernel_v1_kernel2, 6);
@@ -18675,6 +19048,17 @@ var init_offer_result2 = __esm({
18675
19048
  }
18676
19049
  });
18677
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
+
18678
19062
  // vendor/engine/engine.ts
18679
19063
  var engine_exports = {};
18680
19064
  __export(engine_exports, {
@@ -18690,6 +19074,8 @@ __export(engine_exports, {
18690
19074
  author: () => author,
18691
19075
  authorEphemeral: () => authorEphemeral,
18692
19076
  authorKeygen: () => authorKeygen,
19077
+ authorModelLifecyclePromotion: () => authorModelLifecyclePromotion,
19078
+ authorModelLifecycleStage: () => authorModelLifecycleStage,
18693
19079
  authorOn: () => authorOn,
18694
19080
  authorOperatorCall: () => authorOperatorCall,
18695
19081
  backupHead: () => backupHead,
@@ -18762,6 +19148,7 @@ __export(engine_exports, {
18762
19148
  lawParity: () => lawParity,
18763
19149
  ledgerStats: () => ledgerStats,
18764
19150
  listRefusedRefs: () => listRefusedRefs,
19151
+ localCustodySnapshot: () => localCustodySnapshot,
18765
19152
  materializeRefused: () => materializeRefused,
18766
19153
  memoryDropProbe: () => memoryDropProbe,
18767
19154
  migrateHomes: () => migrateHomes,
@@ -19142,6 +19529,100 @@ function workspaceGenesis(eng, ws) {
19142
19529
  function authorOperatorCall(eng, ws, call, controllerHash, opts = {}) {
19143
19530
  return author(eng, ws, call.domain, call.directive, call.canonicalUsda, controllerHash, opts);
19144
19531
  }
19532
+ function authorModelLifecycleStage(eng, ws, lawUsdz, installedBy, supersedes, opts = {}) {
19533
+ const sequence = eng.seq++;
19534
+ const captured = {
19535
+ physical: Date.now(),
19536
+ logical: 0,
19537
+ replica: eng.replica
19538
+ };
19539
+ const response = offerRequestResponse(eng, create7(OfferRequestSchema3, {
19540
+ target: protoTarget2(ws),
19541
+ intent: {
19542
+ case: "modelLifecycle",
19543
+ value: create7(ModelLifecycleIntentSchema2, {
19544
+ operation: ModelLifecycleOperation3.STAGE,
19545
+ installedBy,
19546
+ supersedes
19547
+ })
19548
+ },
19549
+ authoring: create7(AuthoringOptionsSchema3, {
19550
+ actor: opts.actor ?? "",
19551
+ authToken: opts.authToken ? enc7.encode(opts.authToken) : new Uint8Array(),
19552
+ authorSecret: opts.authorSecret ? bytesFromB64(opts.authorSecret) : new Uint8Array(),
19553
+ validFromEpoch: opts.validFromEpoch === void 0 ? void 0 : BigInt(opts.validFromEpoch),
19554
+ rng: osEntropyBuffer2(opts.rngDraws ?? 64),
19555
+ deferProjection: opts.deferProjection !== false,
19556
+ spans: opts.spans ?? false,
19557
+ sequence: BigInt(sequence),
19558
+ clock: create7(CapturedClockSchema3, {
19559
+ physicalMillis: BigInt(captured.physical),
19560
+ logical: captured.logical,
19561
+ replica: BigInt(captured.replica)
19562
+ })
19563
+ }),
19564
+ lawUsdz
19565
+ }));
19566
+ return offerResult(response);
19567
+ }
19568
+ function authorModelLifecyclePromotion(eng, ws, transition, replaces, acceptanceReason, opts = {}) {
19569
+ const sequence = eng.seq++;
19570
+ const captured = {
19571
+ physical: Date.now(),
19572
+ logical: 0,
19573
+ replica: eng.replica
19574
+ };
19575
+ const dispositions2 = transition.dispositions === void 0 ? void 0 : create7(FrontierTransitionDispositionsSchema, {
19576
+ retired: [...transition.dispositions.retired],
19577
+ retyped: Object.entries(transition.dispositions.retyped).map(
19578
+ ([sourceStableId, acknowledgement]) => create7(FrontierTransitionDispositionMapEntrySchema, { sourceStableId, acknowledgement })
19579
+ ),
19580
+ rebinds: Object.entries(transition.dispositions.rebinds).map(
19581
+ ([sourceStableId, acknowledgement]) => create7(FrontierTransitionDispositionMapEntrySchema, { sourceStableId, acknowledgement })
19582
+ ),
19583
+ acknowledgedBy: transition.dispositions.ackBy
19584
+ });
19585
+ const response = offerRequestResponse(eng, create7(OfferRequestSchema3, {
19586
+ target: protoTarget2(ws),
19587
+ intent: {
19588
+ case: "modelLifecycle",
19589
+ value: create7(ModelLifecycleIntentSchema2, {
19590
+ operation: ModelLifecycleOperation3.PROMOTE,
19591
+ replaces,
19592
+ acceptanceReason,
19593
+ transition: create7(FrontierTransitionResponseSchema, {
19594
+ atHash: transition.atHash,
19595
+ currentHash: transition.currentHash,
19596
+ atStateRoot: transition.atStateRoot ?? "",
19597
+ candidateHash: transition.candidateHash,
19598
+ domain: transition.domain,
19599
+ domains: [...transition.domains ?? []],
19600
+ ready: transition.ready,
19601
+ violations: transition.evolve.violations.map(
19602
+ ({ domain, detail }) => create7(FrontierTransitionViolationSchema, { domain, detail })
19603
+ ),
19604
+ dispositions: dispositions2
19605
+ })
19606
+ })
19607
+ },
19608
+ authoring: create7(AuthoringOptionsSchema3, {
19609
+ actor: opts.actor ?? "",
19610
+ authToken: opts.authToken ? enc7.encode(opts.authToken) : new Uint8Array(),
19611
+ authorSecret: opts.authorSecret ? bytesFromB64(opts.authorSecret) : new Uint8Array(),
19612
+ validFromEpoch: opts.validFromEpoch === void 0 ? void 0 : BigInt(opts.validFromEpoch),
19613
+ rng: osEntropyBuffer2(opts.rngDraws ?? 64),
19614
+ deferProjection: opts.deferProjection !== false,
19615
+ spans: opts.spans ?? false,
19616
+ sequence: BigInt(sequence),
19617
+ clock: create7(CapturedClockSchema3, {
19618
+ physicalMillis: BigInt(captured.physical),
19619
+ logical: captured.logical,
19620
+ replica: BigInt(captured.replica)
19621
+ })
19622
+ })
19623
+ }));
19624
+ return offerResult(response);
19625
+ }
19145
19626
  function initializeWorkspace(eng, ws, installedBy = eng.installedBy) {
19146
19627
  const sequence = eng.seq++;
19147
19628
  const captured = {
@@ -20242,8 +20723,11 @@ async function reconcileRequiredCustodyHead(eng, ws, ledger, requiredCustodyHead
20242
20723
  if (!/^[0-9a-f]{40}$/.test(requiredCustodyHead)) {
20243
20724
  throw new Error("required custody head must be a lowercase 40-hex git object id");
20244
20725
  }
20245
- const current = eng.mounted.has(ws) ? kgit.resolveRef(eng, gitdirOf(ws), BRANCH2) : "";
20246
- if (current === requiredCustodyHead) return eng.mounted.get(ws);
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
+ }
20247
20731
  if (current && isDirty(eng, ws)) {
20248
20732
  throw new Error(
20249
20733
  `workspace '${ws}' has verified but unsealed resident work; refusing to discard it while reconciling custody`
@@ -20256,6 +20740,12 @@ async function reconcileRequiredCustodyHead(eng, ws, ledger, requiredCustodyHead
20256
20740
  `workspace '${ws}' could not reconcile required custody ${requiredCustodyHead}: ${mounted.restoreError || "custody has no verified main"}`
20257
20741
  );
20258
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
+ }
20259
20749
  return mounted;
20260
20750
  }
20261
20751
  function assertAuthored(res, what) {
@@ -20393,7 +20883,10 @@ async function applyWorkspaceEffect(eng, ws, ledger, requestBytes, admissionChec
20393
20883
  const result = response.outcome.value.result;
20394
20884
  if (!result || result.outcome.case !== "admitted") {
20395
20885
  const outcome = result?.outcome.case || "empty";
20396
- throw new Error(`target kernel ${outcome} the workspace effect`);
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
+ );
20397
20890
  }
20398
20891
  await custodyPush(eng, ws, ledger, { remoteRef: "refs/heads/main", ffOnly: true });
20399
20892
  return toBinary6(ApplyWorkspaceEffectResponseSchema, response.outcome.value);
@@ -20504,8 +20997,8 @@ function prepareRemoteOffer(eng, ws, requestBytes) {
20504
20997
  if (authoring.authorSecret.byteLength !== 0) {
20505
20998
  throw new Error("remote offer preparation refuses client signing secrets");
20506
20999
  }
20507
- if (request.intent.case !== "call") {
20508
- 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");
20509
21002
  }
20510
21003
  const response = callProto(eng.ex, {
20511
21004
  case: "prepareRemoteOffer",
@@ -20971,7 +21464,13 @@ function packDelta(eng, ws, base, head) {
20971
21464
  case: "packDelta",
20972
21465
  value: create7(PackDeltaRequestSchema2, { repo: repoArgOf(ws), base: base || void 0, head })
20973
21466
  }, "packDelta").pack;
20974
- } 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
+ });
20975
21474
  return null;
20976
21475
  }
20977
21476
  }
@@ -21653,11 +22152,12 @@ function promotePreflighted(eng, ws, domain, candidateHash, opts = {}) {
21653
22152
  acceptanceReason: _acceptance,
21654
22153
  ...authorOpts
21655
22154
  } = opts;
21656
- const result = authorOperatorCall(
22155
+ const result = authorModelLifecyclePromotion(
21657
22156
  eng,
21658
22157
  ws,
21659
- promoteDomainCall(ws, prepared.payload),
21660
- requireCurrentControllerLawHash(eng, ws),
22158
+ report,
22159
+ prepared.payload.replaces,
22160
+ prepared.payload.preflight.acceptanceReason,
21661
22161
  {
21662
22162
  ...authorOpts,
21663
22163
  ...actingPrincipal ? { actor: actingPrincipal } : {}
@@ -22147,7 +22647,10 @@ async function emitOutbox(eng, ws, ledger, workspaceEffectBase = "", admissionCh
22147
22647
  const targetResult = response.result;
22148
22648
  if (!targetResult || targetResult.outcome.case !== "admitted") {
22149
22649
  const outcome = targetResult?.outcome.case || "empty";
22150
- throw new Error(`target kernel ${outcome} the workspace effect`);
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
+ );
22151
22654
  }
22152
22655
  break;
22153
22656
  }
@@ -22179,7 +22682,7 @@ async function emitOutbox(eng, ws, ledger, workspaceEffectBase = "", admissionCh
22179
22682
  } catch (e) {
22180
22683
  errors++;
22181
22684
  const destination = offer.route.case === "httpsRoute" ? offer.route.value.url : offer.route.case === "workspaceRoute" ? offer.route.value.workspace : offer.destination;
22182
- log("outbox-deliver-failed", { ws, offerId: offer.id, destination, error: String(e).slice(0, 200) });
22685
+ log("outbox-deliver-failed", { ws, offerId: offer.id, destination, error: String(e).slice(0, 2e3) });
22183
22686
  }
22184
22687
  }
22185
22688
  if (delivered.length || errors) log("outbox", { ws, delivered: delivered.length, errors });
@@ -22210,6 +22713,26 @@ function snapshot(eng, ws) {
22210
22713
  const wsDir = dirOf(eng.preopen.dir.contents.get("ws")).contents.get(ws);
22211
22714
  return serializeTree2(wsDir);
22212
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
+ }
22213
22736
  function stats(eng) {
22214
22737
  return {
22215
22738
  mounted: eng.mounted.size,
@@ -22286,6 +22809,7 @@ var init_engine = __esm({
22286
22809
  init_lifecycle_calls2();
22287
22810
  init_offer_result2();
22288
22811
  init_kernel_pb2();
22812
+ init_snapshot_pb2();
22289
22813
  enc7 = new TextEncoder();
22290
22814
  dec7 = new TextDecoder();
22291
22815
  BRANCH2 = "main";
@@ -23318,6 +23842,14 @@ __export(governance_exports, {
23318
23842
  import { createHash, createPrivateKey, createPublicKey } from "node:crypto";
23319
23843
  import { mkdirSync as mkdirSync3, readFileSync as readFileSync3, writeFileSync as writeFileSync4 } from "node:fs";
23320
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
+ }
23321
23853
  async function clientConnect() {
23322
23854
  const mod = await Promise.resolve().then(() => (init_src2(), src_exports));
23323
23855
  return mod.connect;
@@ -23456,8 +23988,7 @@ async function adoptRootModelLifecycle(candidateHash, opts, acceptance) {
23456
23988
  }
23457
23989
  const sync = await holon.sync({ admit: true, discoverRemote: true });
23458
23990
  const admission = sync.admission;
23459
- const rejected = (admission?.sessions ?? []).flatMap((session) => session.rejected ?? []);
23460
- 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);
23461
23992
  return { ok, adoption, sync };
23462
23993
  }
23463
23994
  async function adoptWorkspaceModel(workspace, domain, candidateHash, opts, acceptance) {
@@ -23492,8 +24023,7 @@ async function adoptWorkspaceModel(workspace, domain, candidateHash, opts, accep
23492
24023
  }
23493
24024
  const sync = await holon.sync({ admit: true, discoverRemote: true });
23494
24025
  const admission = sync.admission;
23495
- const rejected = (admission?.sessions ?? []).flatMap((session) => session.rejected ?? []);
23496
- 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);
23497
24027
  return { ok, adoption, sync };
23498
24028
  } finally {
23499
24029
  holon._dispose?.();
@@ -23542,11 +24072,11 @@ async function signAndPostPreparedOffer(ws, domain, prepare, opts, authorMode =
23542
24072
  }
23543
24073
  const sync = await holon.sync({ admit: true, discoverRemote: true });
23544
24074
  const admission = sync.admission;
23545
- const rejected = (admission?.sessions ?? []).flatMap((session) => session.rejected ?? []);
23546
- const failed = sync.pushFailed === true || sync.offline === true || admission?.ok === false || rejected.length > 0;
24075
+ const accepted = custodyAdmissionAccepted(admission);
24076
+ const failed = sync.pushFailed === true || sync.offline === true || !accepted;
23547
24077
  return {
23548
- ok: !failed && admission?.ok === true,
23549
- status: !failed && admission?.ok === true ? 200 : rejected.length > 0 ? 422 : 502,
24078
+ ok: !failed,
24079
+ status: !failed ? 200 : admission !== null && admission !== void 0 ? 422 : 502,
23550
24080
  body: sync.pushError ?? admission ?? sync,
23551
24081
  principal,
23552
24082
  actor,
@@ -28405,10 +28935,14 @@ function domainInventory(value) {
28405
28935
  const domains = row.domains.map((candidate) => {
28406
28936
  if (typeof candidate !== "object" || candidate === null) throw new Error("domain inventory contains a non-record installation");
28407
28937
  const install = candidate;
28408
- 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"))) {
28409
28939
  throw new Error("domain inventory contains an invalid installation record");
28410
28940
  }
28411
- return { domainHash: install.domainHash, phase: install.phase, domainKeys: install.domainKeys };
28941
+ return {
28942
+ domainHash: install.domainHash,
28943
+ phase: install.phase,
28944
+ domainKeys: install.domainKeys ?? []
28945
+ };
28412
28946
  });
28413
28947
  const currentLaw2 = Object.fromEntries(Object.entries(row.currentLaw).map(([key2, hash]) => {
28414
28948
  if (typeof hash !== "string") throw new Error(`domain inventory has a non-string current law for '${key2}'`);
@@ -31905,7 +32439,6 @@ async function status(wsArg, opts) {
31905
32439
 
31906
32440
  // src/proof_upgrade.ts
31907
32441
  init_engine();
31908
- init_lifecycle_calls2();
31909
32442
  init_cloud();
31910
32443
  init_governance();
31911
32444
  init_local_holon();
@@ -32033,27 +32566,33 @@ async function mountReadOnlyCopy(eng, source, cloud) {
32033
32566
  function tenantPredecessors(candidateDomains, current, frameworkHashes) {
32034
32567
  return [...new Set(candidateDomains.map((domain) => current[domain]).filter((hash) => typeof hash === "string" && !frameworkHashes.has(hash)))];
32035
32568
  }
32036
- function printDifferences(report) {
32037
- out11(` replayed ${report.replayedIntents} historical intent(s); ${report.candidateIntents} candidate action(s)`);
32038
- for (const difference of report.divergences.slice(0, 12)) {
32039
- const location = [difference.domain, difference.directiveId].filter(Boolean).join(".");
32040
- out11(` changed ${difference.kind}${location ? ` at ${location}` : ""}: ${difference.detail}`);
32569
+ function upgradeControllerLawHash(installed, bundledControllerHash) {
32570
+ const active = installed["nomos"];
32571
+ if (typeof active === "string" && /^[0-9a-f]{64}$/.test(active)) return active;
32572
+ if (/^[0-9a-f]{64}$/.test(bundledControllerHash)) return bundledControllerHash;
32573
+ throw new Error("the copied workspace declares no active Nomos lifecycle controller");
32574
+ }
32575
+ function printFrontier(report) {
32576
+ out11(` frontier ${report.atHash.slice(0, 12)}\u2026 state ${report.atStateRoot?.slice(0, 12) ?? "unknown"}\u2026`);
32577
+ out11(` evolution ${report.ready ? "admissible" : "refused"}`);
32578
+ for (const violation of report.evolve.violations) {
32579
+ out11(` violation ${violation.domain}: ${violation.detail}`);
32041
32580
  }
32042
- if (report.divergences.length > 12) out11(` changed + ${report.divergences.length - 12} more difference(s)`);
32043
32581
  }
32044
32582
  function localAuthorIdentity(explicitPrincipal) {
32045
32583
  const selectedPrincipal = explicitPrincipal ?? activePrincipal() ?? ACTOR;
32046
32584
  const actor = canonicalPrincipal2(selectedPrincipal);
32047
32585
  const bareActor = actor.startsWith("user:") ? actor.slice("user:".length) : actor;
32048
32586
  const device = getDeviceKey(selectedPrincipal) ?? getDeviceKey(actor) ?? getDeviceKey(bareActor);
32049
- if (device?.secret === void 0) {
32587
+ const authorSecret = process.env["NOMOS_AUTHOR_SECRET"]?.trim() || device?.secret;
32588
+ if (authorSecret === void 0) {
32050
32589
  throw new Error(
32051
32590
  `upgrade proof needs an enrolled signing device for '${actor}' \u2014 select one with --as <uid> or import/enroll its key first`
32052
32591
  );
32053
32592
  }
32054
32593
  return {
32055
32594
  actor,
32056
- authorSecret: device.secret
32595
+ authorSecret
32057
32596
  };
32058
32597
  }
32059
32598
  async function runUpgradeProof(sourceArg, lawUsdzPath, opts = {}) {
@@ -32071,7 +32610,11 @@ async function runUpgradeProof(sourceArg, lawUsdzPath, opts = {}) {
32071
32610
  return 1;
32072
32611
  }
32073
32612
  try {
32074
- const identity = localAuthorIdentity(opts.principal);
32613
+ const localIdentity = localAuthorIdentity(opts.principal);
32614
+ const identity = {
32615
+ ...localIdentity,
32616
+ ...process.env["NOMOS_AUTH_TOKEN"] ? { authToken: process.env["NOMOS_AUTH_TOKEN"] } : {}
32617
+ };
32075
32618
  const { eng: sourceEngine, runtime } = await holonEngine(cloud, identity.actor);
32076
32619
  const mounted = await mountReadOnlyCopy(sourceEngine, source, cloud);
32077
32620
  const sourceVerdict = verifyChainLocal(sourceEngine, WORKSPACE);
@@ -32092,10 +32635,11 @@ async function runUpgradeProof(sourceArg, lawUsdzPath, opts = {}) {
32092
32635
  const candidate = inspectLawArchive(eng, lawUsdzPath);
32093
32636
  if (candidate.domainKeys.length === 0) throw new Error("candidate law archive carries no business domains");
32094
32637
  const before = currentLaw(eng, WORKSPACE);
32638
+ const controllerLawHash = upgradeControllerLawHash(before, eng.hashes.nomos);
32095
32639
  const predecessors = tenantPredecessors(
32096
32640
  candidate.domainKeys,
32097
32641
  before,
32098
- /* @__PURE__ */ new Set([eng.hashes.bootstrap, eng.hashes.nomos])
32642
+ /* @__PURE__ */ new Set([eng.hashes.bootstrap, eng.hashes.nomos, controllerLawHash])
32099
32643
  );
32100
32644
  const alreadyCurrent = candidate.domainKeys.every((domain) => before[domain] === candidate.identity);
32101
32645
  if (alreadyCurrent) {
@@ -32113,20 +32657,23 @@ async function runUpgradeProof(sourceArg, lawUsdzPath, opts = {}) {
32113
32657
  );
32114
32658
  }
32115
32659
  const predecessor = predecessors[0];
32116
- const staged = authorOperatorCall(
32660
+ const staged = authorModelLifecycleStage(
32117
32661
  eng,
32118
32662
  WORKSPACE,
32119
- stageDomainCall(
32120
- WORKSPACE,
32121
- closureInstallPayload(candidate.identity, identity.actor, { supersedes: predecessor })
32122
- ),
32123
- eng.hashes.nomos,
32124
- { ...identity, lawUsdz: candidate.lawUsdz }
32663
+ candidate.lawUsdz,
32664
+ identity.actor,
32665
+ predecessor,
32666
+ identity
32125
32667
  );
32126
- if (staged.ok === false) throw new Error(`candidate staging refused: ${staged.error ?? "unknown refusal"}`);
32668
+ if (staged.ok === false) {
32669
+ const authority = /authoriz|not permitted/i.test(staged.error ?? "") ? expand(eng, WORKSPACE, "workspace:self", "installDomain").subjects : [];
32670
+ throw new Error(
32671
+ `candidate staging refused: ${staged.error ?? "unknown refusal"}` + (authority.length > 0 ? `; lifecycle authority is held by ${authority.join(", ")}` : "")
32672
+ );
32673
+ }
32127
32674
  const stagedHead = kgit.resolveRef(eng, gitdirOf(WORKSPACE), "refs/heads/main");
32128
32675
  if (!stagedHead) throw new Error("candidate staging produced no current head");
32129
- const report = historyPreflight(
32676
+ const report = frontierTransition(
32130
32677
  eng,
32131
32678
  WORKSPACE,
32132
32679
  candidate.domainKeys[0],
@@ -32137,21 +32684,13 @@ async function runUpgradeProof(sourceArg, lawUsdzPath, opts = {}) {
32137
32684
  out11(`githolon proof --upgrade \u2014 ${source} (${mounted.location}, never modified)`);
32138
32685
  out11(` current ${predecessor.slice(0, 16)}\u2026`);
32139
32686
  out11(` candidate ${candidate.identity.slice(0, 16)}\u2026 (${candidate.domainKeys.join(", ")})`);
32140
- printDifferences(report);
32141
- if (!report.sourceVerified || !report.complete || !report.evolve.ok) {
32142
- throw new Error(
32143
- !report.sourceVerified ? "the source history did not verify" : !report.complete ? "the candidate could not re-derive every historical premise" : `typed evolution refused: ${report.evolve.violations.map((violation) => violation.detail).join("; ")}`
32144
- );
32145
- }
32146
- if (!report.promotable && !opts.acceptanceReason?.trim()) {
32147
- throw new Error(
32148
- 'the candidate deliberately changes historical business outcomes; review the differences above, then rerun with --acceptance-reason "why this change is correct"'
32149
- );
32687
+ printFrontier(report);
32688
+ if (!report.ready || !report.evolve.ok) {
32689
+ throw new Error(`typed evolution refused: ${report.evolve.violations.map((violation) => violation.detail).join("; ")}`);
32150
32690
  }
32151
32691
  const promoted = promotePreflighted(eng, WORKSPACE, candidate.domainKeys[0], candidate.identity, {
32152
32692
  ...identity,
32153
32693
  replaces: predecessor,
32154
- retireReplaced: true,
32155
32694
  ...opts.acceptanceReason?.trim() ? { acceptanceReason: opts.acceptanceReason.trim() } : {}
32156
32695
  });
32157
32696
  if (!promoted.ok) throw new Error(`disposable promotion refused at ${promoted.stage}: ${promoted.error}`);
@@ -32161,7 +32700,7 @@ async function runUpgradeProof(sourceArg, lawUsdzPath, opts = {}) {
32161
32700
  throw new Error(`promotion completed but ${domain} does not resolve to the candidate model`);
32162
32701
  }
32163
32702
  }
32164
- out11(`\u2713 exact-history promotion admitted in the disposable copy`);
32703
+ out11(`\u2713 current-frontier promotion admitted in the disposable copy`);
32165
32704
  }
32166
32705
  const warmVerdict = verifyChainLocal(eng, WORKSPACE);
32167
32706
  if (warmVerdict.valid !== true) throw new Error(`promoted chain failed verification: ${String(warmVerdict.error ?? "unknown refusal")}`);