githolon 0.108.4 → 0.108.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/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
@@ -7855,7 +7960,7 @@ function jwtClaimOf(token, claim) {
7855
7960
  }
7856
7961
  }
7857
7962
  function createGovernanceOffers(ctx) {
7858
- const { offerDirective, offerCall, offerModelLifecycle, serialize, queryById, queryRows, attestationSignKernel, _fetch, base, workspace, deviceSecret, authHeaders, receivingGroupNameOf: receivingGroupNameOf2, sha256hexBytes: sha256hexBytes2, bytesUnb64: bytesUnb642, birthCertificateLawPayload: birthCertificateLawPayload2, actorForShareQuote: actorForShareQuote2, installedInterfaceInner, mintKeylessDelegation: mintKeylessDelegation2, signWorkspaceOffer, resolveFrameworkRoute } = ctx;
7963
+ const { offerDirective, offerCall, offerModelLifecycle, serialize, queryById, queryRows, attestationSignKernel, _fetch, base, workspace, deviceSecret, authHeaders, connectionAuthToken, connectionFrameworkCalls, receivingGroupNameOf: receivingGroupNameOf2, sha256hexBytes: sha256hexBytes2, bytesUnb64: bytesUnb642, birthCertificateLawPayload: birthCertificateLawPayload2, actorForShareQuote: actorForShareQuote2, installedInterfaceInner, mintKeylessDelegation: mintKeylessDelegation2, signWorkspaceOffer, resolveFrameworkRoute } = ctx;
7859
7964
  const g = {
7860
7965
  /**
7861
7966
  * AUTHOR a SIGNED governance/framework intent locally and return the sealed offer bytes (base64) ready to
@@ -7960,6 +8065,54 @@ function createGovernanceOffers(ctx) {
7960
8065
  });
7961
8066
  return g.postGovernanceOffer({ directiveId: call.directive, intentBytes: sealed.intentBytes, ws: parent, authToken, domain: call.domain });
7962
8067
  },
8068
+ /**
8069
+ * Offer one exact compiler-generated call to another workspace without
8070
+ * mounting or replaying that target locally. The source holon's kernel
8071
+ * signs only the target-kernel-prepared USDA; the host receives neither a
8072
+ * tenant object nor authority to invent an operation.
8073
+ */
8074
+ offerRemoteGeneratedCall: async ({
8075
+ call,
8076
+ target,
8077
+ actor,
8078
+ authorSecret,
8079
+ authToken
8080
+ }) => {
8081
+ const signingSecret = authorSecret || deviceSecret;
8082
+ if (!target) throw new TypeError("a remote generated offer requires its target workspace");
8083
+ if (!actor) throw new TypeError("a remote generated offer requires its attributable actor");
8084
+ if (!signingSecret) throw new TypeError("a remote generated offer requires an enrolled device key");
8085
+ const sealed = await signWorkspaceOffer({
8086
+ target,
8087
+ call,
8088
+ actor,
8089
+ authorSecret: signingSecret,
8090
+ authToken
8091
+ });
8092
+ const verdict = await g.postGovernanceOffer({
8093
+ directiveId: call.directive,
8094
+ intentBytes: sealed.intentBytes,
8095
+ ws: target,
8096
+ authToken,
8097
+ domain: call.domain
8098
+ });
8099
+ if (!verdict.ok || verdict.body && typeof verdict.body === "object" && (verdict.body.ok === false || verdict.body.refused)) {
8100
+ const detail = typeof verdict.body === "string" ? verdict.body : JSON.stringify(verdict.body ?? "remote offer refused");
8101
+ throw new NomosClientError(
8102
+ `Remote generated call '${call.domain}/${call.directive}' was refused by '${target}': ${detail.slice(0, 500)}`,
8103
+ {
8104
+ code: "nomos.offer.remote_refused",
8105
+ workspace: target,
8106
+ operation: call.directive,
8107
+ recommendedAction: NomosRecommendedAction.retry,
8108
+ info: verdict.errorInfo
8109
+ }
8110
+ );
8111
+ }
8112
+ const body = verdict.body && typeof verdict.body === "object" ? verdict.body : void 0;
8113
+ const head = verdict.head ?? (typeof body?.head === "string" ? body.head : "");
8114
+ return { workspace: target, head };
8115
+ },
7963
8116
  /**
7964
8117
  * Derive the device key's base64 PUBLIC half from its base64 SECRET seed, IN the local wasm (the
7965
8118
  * kernel `attestation_sign` op returns the public half; the secret never leaves this process).
@@ -8146,7 +8299,10 @@ function createGovernanceOffers(ctx) {
8146
8299
  */
8147
8300
  ensureParentSignerEnrollment: async (args = {}) => {
8148
8301
  const { parent, device, domain, grantedAt, authToken, idToken, signIn, verifiedVia, validFromEpoch = 0, frameworkCalls } = args;
8149
- const 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");
8150
8306
  const directiveId = args.directiveId || (keyless ? "enrollFirstDevice" : "enrollSigner");
8151
8307
  const principal = canonicalPrincipal(args.principal);
8152
8308
  let publicKey = device && device.public || args.publicKey;
@@ -8156,13 +8312,13 @@ function createGovernanceOffers(ctx) {
8156
8312
  if (!publicKey && authorSecret) publicKey = await g.devicePublicOf(authorSecret);
8157
8313
  if (!publicKey) throw new Error("ensureParentSignerEnrollment requires the device `publicKey` (pass `device`/`publicKey`, or a secret it can be derived from)");
8158
8314
  const keyHash = await sha256hexBytes2(bytesUnb642(publicKey));
8159
- const posture = await g.parentSignerEnrollment({ parent, principal, keyHash, authToken });
8315
+ const posture = await g.parentSignerEnrollment({ parent, principal, keyHash, authToken: effectiveAuthToken });
8160
8316
  if (posture.enrolled) return { parent, principal, keyHash, enrolled: true, repaired: false, checkedAt: posture.checkedAt };
8161
8317
  if (posture.revoked) {
8162
8318
  throw new Error(`ensureParentSignerEnrollment: key ${keyHash.slice(0, 16)}\u2026 was REVOKED on ${parent} (${signerObjectOf(principal)}#signer is remove-wins) \u2014 mint a new device key and enroll it; a revoked key cannot be lawfully re-enrolled [nomos.authz.signer_revoked]`);
8163
8319
  }
8164
8320
  if (!authorSecret) throw new Error("ensureParentSignerEnrollment: the signer tuple is absent on the parent and no `authorSecret`/`device.secret` was supplied to lawfully re-enroll it");
8165
- const token = keyless ? typeof signIn === "function" ? await signIn(keyHash) : idToken : null;
8321
+ const token = keyless ? typeof signIn === "function" ? await signIn(keyHash) : effectiveIdToken : null;
8166
8322
  let resolved = domain ? { domain, directiveId } : null;
8167
8323
  let enrollmentRoute;
8168
8324
  if (!resolved && parent === workspace && typeof installedInterfaceInner === "function") {
@@ -8187,7 +8343,7 @@ function createGovernanceOffers(ctx) {
8187
8343
  }
8188
8344
  resolved = { domain: enrollmentRoute.domain, directiveId };
8189
8345
  }
8190
- if (!resolved) resolved = await g.discoverDirectiveDomain({ ws: parent, directiveId, authToken });
8346
+ if (!resolved) resolved = await g.discoverDirectiveDomain({ ws: parent, directiveId, authToken: effectiveAuthToken });
8191
8347
  let delegationPayload;
8192
8348
  if (keyless) {
8193
8349
  if (typeof mintKeylessDelegation2 !== "function") throw new Error("ensureParentSignerEnrollment: the keyless lane needs a signing holon (mintKeylessDelegation) to build the delegation cert \u2014 open the holon with a device key");
@@ -8209,12 +8365,29 @@ function createGovernanceOffers(ctx) {
8209
8365
  }
8210
8366
  const issuerClaim = verifiedVia || (token ? jwtClaimOf(token, "iss") : void 0);
8211
8367
  const payload = keyless ? { keyHash, verifiedVia: issuerClaim, validFromEpoch, grantedAt: (/* @__PURE__ */ new Date()).toISOString(), idpToken: token, ...delegationPayload ?? {} } : { keyHash, grantedBy: principal, grantedAt: typeof grantedAt === "number" ? grantedAt : Date.now() };
8212
- if (frameworkCalls === void 0) {
8213
- 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
+ });
8214
8387
  }
8215
8388
  const call = keyless ? (() => {
8216
8389
  if (typeof issuerClaim !== "string" || !issuerClaim || !token) throw new Error("verified first-device enrollment needs its typed issuer and identity proof");
8217
- return frameworkCalls.identity.enrollFirstDevice({
8390
+ return effectiveFrameworkCalls.identity.enrollFirstDevice({
8218
8391
  domain: resolved.domain,
8219
8392
  workspace: parent,
8220
8393
  keyHash,
@@ -8224,7 +8397,7 @@ function createGovernanceOffers(ctx) {
8224
8397
  idpToken: token,
8225
8398
  ...delegationPayload ?? {}
8226
8399
  });
8227
- })() : frameworkCalls.identity.enrollSigner({
8400
+ })() : effectiveFrameworkCalls.identity.enrollSigner({
8228
8401
  domain: resolved.domain,
8229
8402
  workspace: parent,
8230
8403
  keyHash,
@@ -8236,7 +8409,7 @@ function createGovernanceOffers(ctx) {
8236
8409
  const res = await offerCall(call, { actor: principal, signWith: authorSecret });
8237
8410
  verdict = { ok: true, status: 200, body: res };
8238
8411
  } else {
8239
- const bearer = authToken || token;
8412
+ const bearer = effectiveAuthToken || token;
8240
8413
  const sealed = await signWorkspaceOffer({
8241
8414
  target: parent,
8242
8415
  call,
@@ -8608,23 +8781,46 @@ function connectRemote(opts) {
8608
8781
  }
8609
8782
  const entropy = new Uint32Array(16);
8610
8783
  crypto.getRandomValues(entropy);
8611
- const preparedRequest = createDirectiveOfferRequest(
8612
- { repo: `/work/ws/${workspace}`, workspace, branch: "main" },
8613
- {
8614
- domain,
8615
- directiveId,
8616
- payload: callUsda,
8617
- capturedPorts: {
8618
- clock: { physical: Date.now(), logical: 0, replica: entropy[0] ?? 0 },
8619
- rng: [...entropy].map((value) => value / 4294967296)
8620
- },
8784
+ const target = { repo: `/work/ws/${workspace}`, workspace, branch: "main" };
8785
+ const capturedPorts = {
8786
+ clock: { physical: Date.now(), logical: 0, replica: entropy[0] ?? 0 },
8787
+ rng: [...entropy].map((value) => value / 4294967296)
8788
+ };
8789
+ const actor = o?.actor ?? principal ?? "";
8790
+ const preparedRequest = o?.modelLifecycle === void 0 ? createDirectiveOfferRequest(target, {
8791
+ domain,
8792
+ directiveId,
8793
+ payload: callUsda,
8794
+ capturedPorts,
8795
+ sequence: requestSequence + 1n,
8796
+ actor,
8797
+ authToken: opts.authToken && !opts.authorSecret ? opts.authToken : void 0,
8798
+ spans: true,
8799
+ prepareOnly: true,
8800
+ lawUsdz: o?.lawUsdz,
8801
+ domainHash: o?.domainHash
8802
+ }) : createModelLifecycleOfferRequest(
8803
+ target,
8804
+ o.modelLifecycle.operation === "stage" ? {
8805
+ operation: ModelLifecycleOperation.STAGE,
8806
+ installedBy: o.modelLifecycle.installedBy,
8807
+ supersedes: o.modelLifecycle.supersedes,
8808
+ lawUsdz: o.lawUsdz ?? new Uint8Array(),
8809
+ capturedPorts,
8621
8810
  sequence: requestSequence + 1n,
8622
- actor: o?.actor ?? principal ?? "",
8623
- authToken: opts.authToken && !opts.authorSecret ? opts.authToken : void 0,
8811
+ actor,
8624
8812
  spans: true,
8625
- prepareOnly: true,
8626
- lawUsdz: o?.lawUsdz,
8627
- 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
8628
8824
  }
8629
8825
  );
8630
8826
  const offerRequest2 = toBinary4(OfferRequestSchema, preparedRequest);
@@ -8781,6 +8977,39 @@ function connectRemote(opts) {
8781
8977
  const call = requireGeneratedCall(value, "remote offerCall");
8782
8978
  return offerDirective(call.domain, call.directive, call.canonicalUsda, o);
8783
8979
  }
8980
+ const offerModelLifecycle = (lifecycle) => offerDirective("nomos", "", new Uint8Array(), {
8981
+ actor: lifecycle.actor,
8982
+ lawUsdz: lifecycle.operation === "stage" ? lifecycle.lawUsdz : void 0,
8983
+ modelLifecycle: lifecycle
8984
+ });
8985
+ const frontierTransition2 = async (request) => {
8986
+ const response = await kernelRuntime({
8987
+ case: "query",
8988
+ value: create5(QueryRequestSchema, {
8989
+ target: create5(WorkspaceTargetSchema, {
8990
+ repo: `/work/ws/${workspace}`,
8991
+ workspace,
8992
+ branch: "main"
8993
+ }),
8994
+ query: {
8995
+ case: "frontierTransition",
8996
+ value: create5(FrontierTransitionRequestSchema, {
8997
+ domain: request.domain,
8998
+ candidateHash: request.candidateHash,
8999
+ atHash: request.atHash,
9000
+ acknowledgementPrincipal: request.acknowledgementPrincipal ?? principal ?? "",
9001
+ restorePreviousOf: request.restorePreviousOf
9002
+ })
9003
+ }
9004
+ })
9005
+ });
9006
+ if (response.outcome.case !== "query" || response.outcome.value.result.case !== "frontierTransition") {
9007
+ throw new Error(
9008
+ `kernel returned '${response.outcome.case || "empty"}' for frontier transition`
9009
+ );
9010
+ }
9011
+ return response.outcome.value.result.value;
9012
+ };
8784
9013
  const query3 = async (queryId, params) => {
8785
9014
  const response = await kernelRuntime({
8786
9015
  case: "query",
@@ -9114,6 +9343,8 @@ function connectRemote(opts) {
9114
9343
  cloud: base,
9115
9344
  principal,
9116
9345
  offerCall,
9346
+ __nomosOfferModelLifecycle: offerModelLifecycle,
9347
+ __nomosFrontierTransition: frontierTransition2,
9117
9348
  head,
9118
9349
  query: query3,
9119
9350
  queryById,
@@ -9384,13 +9615,17 @@ function installedLawOfRows(rows) {
9384
9615
  }
9385
9616
  return out15;
9386
9617
  }
9387
- function lawStatusOf(installed, clientHash) {
9618
+ function lawStatusOf(installed, clientHash, current) {
9388
9619
  const known = Array.isArray(installed);
9389
9620
  const list = known ? installed : [];
9621
+ const currentSupplied = current !== void 0;
9622
+ const currentKnown = currentSupplied ? Array.isArray(current) : known;
9623
+ const serving = currentSupplied ? Array.isArray(current) ? current : [] : list;
9390
9624
  return {
9391
9625
  installed: list,
9392
9626
  ...clientHash !== void 0 ? { clientHash } : {},
9393
- drifted: !!(clientHash !== void 0 && known && !list.includes(clientHash))
9627
+ ...currentSupplied ? { current } : {},
9628
+ drifted: !!(clientHash !== void 0 && currentKnown && !serving.includes(clientHash))
9394
9629
  };
9395
9630
  }
9396
9631
  function lawDriftMessage({
@@ -9679,6 +9914,25 @@ ${String(commit).toLowerCase()}`;
9679
9914
  }
9680
9915
  };
9681
9916
  };
9917
+ if (!restoreFrom && !mountInPlace && !localOnly && !salvageOnly && !recover) {
9918
+ const _coldSnapshot = span(
9919
+ "receive",
9920
+ "boot: fetch checkpointed custody snapshot",
9921
+ "cfetch"
9922
+ );
9923
+ try {
9924
+ const response = await _fetch(
9925
+ `${base}/v2/workspaces/${workspace}/snapshot`,
9926
+ { headers: authHeaders }
9927
+ );
9928
+ if (response.ok && response.headers.get("x-nomos-layout") === "local-custody-v3") {
9929
+ restoreFrom = new Uint8Array(await response.arrayBuffer());
9930
+ }
9931
+ } catch {
9932
+ } finally {
9933
+ _coldSnapshot.end({ restored: !!restoreFrom });
9934
+ }
9935
+ }
9682
9936
  const repoArg = `/work/ws/${workspace}`;
9683
9937
  const provider = kernelProvider || createWasmKernelProvider({ span });
9684
9938
  const readRemoteInfo = async () => ({
@@ -9948,10 +10202,12 @@ ${String(commit).toLowerCase()}`;
9948
10202
  const watchStops = /* @__PURE__ */ new Set();
9949
10203
  let installedLawRowsCache;
9950
10204
  let installedLawCurrentCache;
10205
+ let installedLawCurrentError = "";
9951
10206
  let installedInterfaceCache;
9952
10207
  const invalidateInstalledLawMetadata = () => {
9953
10208
  installedLawRowsCache = void 0;
9954
10209
  installedLawCurrentCache = void 0;
10210
+ installedLawCurrentError = "";
9955
10211
  installedInterfaceCache = void 0;
9956
10212
  };
9957
10213
  let _disposed = false;
@@ -9998,17 +10254,19 @@ ${String(commit).toLowerCase()}`;
9998
10254
  scheduleMaintenanceSoon();
9999
10255
  };
10000
10256
  const prepareDomainReady = async (domain, packageHash, directiveId) => {
10001
- 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);
10002
10260
  const readiness2 = await prepareDomainUntilReady({
10003
10261
  domain,
10004
- packageHash,
10262
+ packageHash: servingPackage,
10005
10263
  directiveId,
10006
10264
  warm: () => serialize(
10007
10265
  async () => namedQueryTyped(QueryOperation.WARM, {
10008
10266
  interactiveOnly: true,
10009
10267
  requestedDomain: domain,
10010
10268
  ...directiveId ? { requestedDirective: directiveId } : {},
10011
- requestedPackage: packageHash
10269
+ requestedPackage: servingPackage
10012
10270
  }),
10013
10271
  "prepare generated domain",
10014
10272
  false
@@ -10021,7 +10279,7 @@ ${String(commit).toLowerCase()}`;
10021
10279
  });
10022
10280
  if (readiness2.prepared) {
10023
10281
  const index = _maintenanceTargets.findIndex(
10024
- (target) => target.domain === domain && target.packageHash === packageHash && target.directiveId === directiveId
10282
+ (target) => target.domain === domain && target.packageHash === servingPackage && target.directiveId === directiveId
10025
10283
  );
10026
10284
  if (index >= 0) _maintenanceTargets.splice(index, 1);
10027
10285
  }
@@ -10696,7 +10954,9 @@ ${String(commit).toLowerCase()}`;
10696
10954
  const answer = namedQueryTyped(QueryOperation.INSTALLED_LAW);
10697
10955
  if (Array.isArray(answer?.domains)) {
10698
10956
  const currentLaw2 = answer?.currentLaw;
10699
- installedLawCurrentCache = currentLaw2 && typeof currentLaw2 === "object" && !Array.isArray(currentLaw2) ? currentLaw2 : null;
10957
+ if (currentLaw2 && typeof currentLaw2 === "object" && !Array.isArray(currentLaw2)) {
10958
+ installedLawCurrentCache = currentLaw2;
10959
+ }
10700
10960
  installedLawRowsCache = answer.domains.map(
10701
10961
  (domain) => ({
10702
10962
  id: domain.installationId,
@@ -10740,21 +11000,36 @@ ${String(commit).toLowerCase()}`;
10740
11000
  return installedLawRowsCache;
10741
11001
  };
10742
11002
  const currentLawInner = () => {
10743
- installRowsInner();
10744
11003
  if (installedLawCurrentCache !== void 0) return installedLawCurrentCache;
10745
11004
  try {
10746
11005
  const answer = namedQueryTyped(QueryOperation.CURRENT_LAW);
10747
11006
  const current = answer?.keyMap ?? answer?.currentLaw ?? answer;
10748
- installedLawCurrentCache = current && typeof current === "object" && !Array.isArray(current) ? current : null;
10749
- } catch {
10750
- 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
+ );
10751
11017
  }
10752
- return installedLawCurrentCache;
11018
+ return null;
10753
11019
  };
10754
11020
  const installedLawInner = () => {
10755
11021
  const rows = installRowsInner();
10756
11022
  return rows === null ? null : installedLawOfRows(rows);
10757
11023
  };
11024
+ const currentLawHashesInner = () => {
11025
+ const current = currentLawInner();
11026
+ if (current === null) return null;
11027
+ return [...new Set(
11028
+ Object.values(current).filter(
11029
+ (identity) => typeof identity === "string" && identity.length > 0
11030
+ )
11031
+ )];
11032
+ };
10758
11033
  const recomputeCompat = ({ silent = false } = {}) => {
10759
11034
  if (!compatState) return null;
10760
11035
  const installRows = installRowsInner();
@@ -10908,16 +11183,28 @@ ${String(commit).toLowerCase()}`;
10908
11183
  );
10909
11184
  }
10910
11185
  let pack = null;
11186
+ const packErrors = [];
10911
11187
  for (const base2 of bases) {
10912
11188
  try {
10913
11189
  pack = provider.packDelta(base2, head);
10914
- } catch {
11190
+ } catch (error) {
11191
+ packErrors.push(`${base2 ?? "<full>"}: ${String(error)}`);
10915
11192
  pack = null;
10916
11193
  }
10917
11194
  if (pack) break;
10918
11195
  }
10919
- if (!pack)
10920
- 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
+ }
10921
11208
  await pushPack(
10922
11209
  remote,
10923
11210
  authHeaders,
@@ -12065,6 +12352,10 @@ ${String(commit).toLowerCase()}`;
12065
12352
  error: "the generated model identity is missing"
12066
12353
  };
12067
12354
  }
12355
+ const currentHash = String(currentLawInner()?.[domain] ?? "");
12356
+ if (currentHash === candidateHash) {
12357
+ return { ok: true, stage: "already-current" };
12358
+ }
12068
12359
  const candidateInstallation = (installRowsInner() ?? []).find(
12069
12360
  (row) => row?.id === `domain-installation:${candidateHash}`
12070
12361
  );
@@ -12078,23 +12369,8 @@ ${String(commit).toLowerCase()}`;
12078
12369
  error: candidatePhase.length === 0 ? `model '${candidateHash}' is not staged in this workspace; deploy the generated USDA package before opening this application` : `model '${candidateHash}' is '${candidatePhase}', so it cannot become current`
12079
12370
  };
12080
12371
  }
12081
- const currentHash = String(currentLawInner()?.[domain] ?? "");
12082
12372
  if (candidatePhase === "Active") {
12083
- try {
12084
- const readiness2 = await prepareDomainReady(domain, candidateHash);
12085
- if (readiness2.prepared !== true) {
12086
- throw new Error(
12087
- `the admitted model '${candidateHash}' authenticated '${domain}' USDA slice did not become ready (${readiness2.reason} after ${readiness2.quanta} maintenance quanta)`
12088
- );
12089
- }
12090
- return { ok: true, stage: "already-current" };
12091
- } catch (error) {
12092
- return {
12093
- ok: false,
12094
- stage: "preflight",
12095
- error: String(error?.message || error)
12096
- };
12097
- }
12373
+ return { ok: true, stage: "already-current" };
12098
12374
  }
12099
12375
  let report;
12100
12376
  let transition;
@@ -12233,12 +12509,13 @@ ${String(commit).toLowerCase()}`;
12233
12509
  );
12234
12510
  const data = row?.data;
12235
12511
  const domainKeys = Array.isArray(data?.["spec.domainKeys"]) ? data["spec.domainKeys"].map(String) : [];
12236
- 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;
12237
12514
  return {
12238
12515
  hash: candidateHash,
12239
12516
  phase: String(data["status.phase"] ?? ""),
12240
12517
  dependencies: Array.isArray(data["spec.dependencies"]) ? data["spec.dependencies"].map(String) : [],
12241
- domainKeys
12518
+ domainKeys: exactSingleDomain ? [domain] : domainKeys
12242
12519
  };
12243
12520
  };
12244
12521
  const _nomosStageGeneratedModel = async (domain, candidateHash, lawUsdz, dependencies) => {
@@ -12262,14 +12539,10 @@ ${String(commit).toLowerCase()}`;
12262
12539
  `generated model '${candidateHash}' has no USDZ transport asset`
12263
12540
  );
12264
12541
  }
12265
- const predecessor = rows.find((entry) => {
12266
- const data = entry?.data;
12267
- return String(data?.["status.phase"] ?? "") === "Active" && Array.isArray(data?.["spec.domainKeys"]) && data["spec.domainKeys"].map(String).includes(domain);
12268
- });
12269
- const priorHash = String(predecessor?.data?.["spec.domainHash"] ?? "");
12542
+ const priorHash = String(currentLawInner()?.[domain] ?? "");
12270
12543
  if (!priorHash) {
12271
12544
  throw new Error(
12272
- `generated application cannot identify the active '${domain}' model it would supersede`
12545
+ `generated application cannot identify the active '${domain}' model it would supersede` + (installedLawCurrentError ? `: ${installedLawCurrentError}` : "")
12273
12546
  );
12274
12547
  }
12275
12548
  const head = await offerDirective(
@@ -13960,6 +14233,8 @@ ${String(commit).toLowerCase()}`;
13960
14233
  workspace,
13961
14234
  deviceSecret,
13962
14235
  authHeaders,
14236
+ connectionAuthToken: () => activeAuthToken,
14237
+ connectionFrameworkCalls: frameworkCalls,
13963
14238
  receivingGroupNameOf,
13964
14239
  sha256hexBytes,
13965
14240
  bytesUnb64,
@@ -15363,6 +15638,7 @@ ${String(commit).toLowerCase()}`;
15363
15638
  "application-open"
15364
15639
  );
15365
15640
  let requiredParentCustodyHead;
15641
+ let requiredDelegationKeyHash;
15366
15642
  try {
15367
15643
  if (spec.idToken || typeof spec.signIn === "function") {
15368
15644
  const enrollment = await api.enrollFirstDevice({
@@ -15379,6 +15655,7 @@ ${String(commit).toLowerCase()}`;
15379
15655
  enrollFirstDeviceCall: spec.enrollFirstDeviceCall
15380
15656
  });
15381
15657
  requiredParentCustodyHead = enrollment.verdict?.head;
15658
+ requiredDelegationKeyHash = enrollment.keyHash;
15382
15659
  if (!requiredParentCustodyHead || !OID40_RE.test(requiredParentCustodyHead)) {
15383
15660
  throw new Error(
15384
15661
  `enrollFirstDevice at '${parent}' admitted without an exact custody head; refusing to prepare birth against an unbound resident frontier`
@@ -15429,9 +15706,16 @@ ${String(commit).toLowerCase()}`;
15429
15706
  }
15430
15707
  );
15431
15708
  if (dq.ok) {
15432
- const rows = await dq.json().catch(() => null);
15433
- const has = Array.isArray(rows) ? rows.length > 0 : rows && Array.isArray(rows.rows) ? rows.rows.length > 0 : false;
15434
- 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) {
15435
15719
  sawDelegation = true;
15436
15720
  break;
15437
15721
  }
@@ -15442,7 +15726,7 @@ ${String(commit).toLowerCase()}`;
15442
15726
  }
15443
15727
  if (!sawDelegation) {
15444
15728
  const err15 = new Error(
15445
- `receiving-group setup: parent '${parent}' still holds NO SignerDelegation for '${owner}' after ${pollTimeoutMs}ms. enrollFirstDevice seated the device SIGNER, but the home cert chain's links[1] (the platform-signed delegation) never surfaced \u2014 the birth would 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]`
15446
15730
  );
15447
15731
  err15.code = "ParentSignerDelegationMissing";
15448
15732
  throw err15;
@@ -15656,7 +15940,22 @@ ${String(commit).toLowerCase()}`;
15656
15940
  * lifecycle view: active = served now; superseded/retired = replayable, not served.
15657
15941
  * `drifted` is true ONLY on the word of a successful read.
15658
15942
  */
15659
- lawStatus: () => serialize(async () => 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
+ }),
15660
15959
  /**
15661
15960
  * Register the BAKED law hash this client was generated under — the soft-warn lane:
15662
15961
  * if the workspace's installed law doesn't carry it, ONE console.warn names the drift
@@ -15670,7 +15969,16 @@ ${String(commit).toLowerCase()}`;
15670
15969
  "registerLawHash(hash) requires the generated client's baked law hash (the 64-hex sha256 of its package)"
15671
15970
  );
15672
15971
  clientLawHash = hash;
15673
- const 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
+ );
15674
15982
  if (status2.drifted && !warnedDrift) {
15675
15983
  warnedDrift = true;
15676
15984
  console.warn(
@@ -15678,11 +15986,14 @@ ${String(commit).toLowerCase()}`;
15678
15986
  what: "connect",
15679
15987
  workspace,
15680
15988
  clientHash: hash,
15681
- installed: status2.installed
15989
+ installed: status2.current ?? status2.installed
15682
15990
  })
15683
15991
  );
15684
15992
  }
15685
- return status2;
15993
+ return {
15994
+ ...status2,
15995
+ currentDomains: currentLaw2 === null ? null : Object.keys(currentLaw2).sort()
15996
+ };
15686
15997
  }),
15687
15998
  /**
15688
15999
  * THE COMPAT SUPERPOWER (#72b): the generated client factory hands over its baked `nomosCompat`
@@ -16261,7 +16572,7 @@ ${String(commit).toLowerCase()}`;
16261
16572
  if (result?.offline === true || result?.pushFailed === true || result?.reconnectRequired === true)
16262
16573
  return result;
16263
16574
  const localHead = await serialize(async () => resolveBranchHead());
16264
- if (localHead === syncedBase) return result;
16575
+ if (localHead === syncedBase && !discoverRemote) return result;
16265
16576
  return api.sync({ admit, discoverRemote });
16266
16577
  });
16267
16578
  }
@@ -17509,6 +17820,33 @@ async function openRealm(opts = {}) {
17509
17820
  rebindWatches(name, holon);
17510
17821
  return holon;
17511
17822
  }
17823
+ async function deviceIdentity(secret) {
17824
+ const scratch = `nomos-device-${realmClientId}`;
17825
+ const holon = await mount(scratch, {
17826
+ allowUnborn: true,
17827
+ authToken: "",
17828
+ principal: "",
17829
+ clientId: `${realmClientId}:device-identity`
17830
+ }, { evict: false });
17831
+ try {
17832
+ if (typeof secret === "string" && secret.length > 0) {
17833
+ return { secret, public: await holon.devicePublicOf(secret) };
17834
+ }
17835
+ const created = await holon.authorKeygen();
17836
+ if (!created?.ok || !created.secret || !created.public) {
17837
+ throw new Error("the kernel did not return a complete device identity");
17838
+ }
17839
+ return { secret: created.secret, public: created.public };
17840
+ } finally {
17841
+ try {
17842
+ holon._dispose();
17843
+ } catch {
17844
+ }
17845
+ mounted.delete(scratch);
17846
+ parked.delete(scratch);
17847
+ plane.drop(scratch);
17848
+ }
17849
+ }
17512
17850
  return {
17513
17851
  /** The realm's stable client id (each workspace gets `${clientId}:${name}` unless overridden). */
17514
17852
  clientId: realmClientId,
@@ -17516,6 +17854,8 @@ async function openRealm(opts = {}) {
17516
17854
  plane,
17517
17855
  /** Open (or mount-on-demand) a holon bound to `name` IN this plane. Same surface as `connect()` returns. */
17518
17856
  workspace: (name, wsOpts = {}) => withGate(() => mount(name, wsOpts)),
17857
+ /** Kernel-owned device identity, prepared without reading or creating remote custody. */
17858
+ deviceIdentity: (secret) => withGate(() => deviceIdentity(secret)),
17519
17859
  /** The realm's workspaces + their posture (mounted / parked / has-custody). */
17520
17860
  list: () => {
17521
17861
  const names = /* @__PURE__ */ new Set([
@@ -18167,6 +18507,16 @@ function prepareManagedPromotion2(report, candidateHash, domain, opts = {}) {
18167
18507
  error: `the package-wide report does not cover the generated business area '${domain}'`
18168
18508
  };
18169
18509
  }
18510
+ const dispositions2 = report.dispositions;
18511
+ const changesStableIdentity = dispositions2 !== void 0 && (dispositions2.retired.length > 0 || Object.keys(dispositions2.retyped).length > 0 || Object.keys(dispositions2.rebinds).length > 0);
18512
+ if (changesStableIdentity && !acceptanceReason) {
18513
+ return {
18514
+ ok: false,
18515
+ stage: "acceptance",
18516
+ report,
18517
+ error: "the current-frontier transition changes stable business identities and needs an attributed acceptance reason"
18518
+ };
18519
+ }
18170
18520
  const preflight = {
18171
18521
  candidateHash,
18172
18522
  // A package may be reached through any one of its generated domain clients. The
@@ -18698,6 +19048,17 @@ var init_offer_result2 = __esm({
18698
19048
  }
18699
19049
  });
18700
19050
 
19051
+ // vendor/engine/proto/nomos/custody/v1/snapshot_pb.js
19052
+ import { fileDesc as fileDesc6, messageDesc as messageDesc6 } from "@bufbuild/protobuf/codegenv2";
19053
+ var file_nomos_custody_v1_snapshot2, LocalCustodySnapshotSchema2;
19054
+ var init_snapshot_pb2 = __esm({
19055
+ "vendor/engine/proto/nomos/custody/v1/snapshot_pb.js"() {
19056
+ "use strict";
19057
+ file_nomos_custody_v1_snapshot2 = /* @__PURE__ */ fileDesc6("Ch9ub21vcy9jdXN0b2R5L3YxL3NuYXBzaG90LnByb3RvEhBub21vcy5jdXN0b2R5LnYxIqACChRMb2NhbEN1c3RvZHlTbmFwc2hvdBIWCg5mb3JtYXRfdmVyc2lvbhgBIAEoDRIWCgl3b3Jrc3BhY2UYAiABKAlIAIgBARIMCgR0cmVlGAMgASgMEhcKCmNoZWNrcG9pbnQYBCABKAxIAYgBARIVCghmcm9udGllchgFIAEoDEgCiAEBEhMKBmN1cnNvchgGIAEoCUgDiAEBEhcKCnN0YXRlX3Jvb3QYByABKAlIBIgBARIYCgtzeW5jZWRfYmFzZRgIIAEoCUgFiAEBQgwKCl93b3Jrc3BhY2VCDQoLX2NoZWNrcG9pbnRCCwoJX2Zyb250aWVyQgkKB19jdXJzb3JCDQoLX3N0YXRlX3Jvb3RCDgoMX3N5bmNlZF9iYXNlYgZwcm90bzM");
19058
+ LocalCustodySnapshotSchema2 = /* @__PURE__ */ messageDesc6(file_nomos_custody_v1_snapshot2, 0);
19059
+ }
19060
+ });
19061
+
18701
19062
  // vendor/engine/engine.ts
18702
19063
  var engine_exports = {};
18703
19064
  __export(engine_exports, {
@@ -18787,6 +19148,7 @@ __export(engine_exports, {
18787
19148
  lawParity: () => lawParity,
18788
19149
  ledgerStats: () => ledgerStats,
18789
19150
  listRefusedRefs: () => listRefusedRefs,
19151
+ localCustodySnapshot: () => localCustodySnapshot,
18790
19152
  materializeRefused: () => materializeRefused,
18791
19153
  memoryDropProbe: () => memoryDropProbe,
18792
19154
  migrateHomes: () => migrateHomes,
@@ -20361,8 +20723,11 @@ async function reconcileRequiredCustodyHead(eng, ws, ledger, requiredCustodyHead
20361
20723
  if (!/^[0-9a-f]{40}$/.test(requiredCustodyHead)) {
20362
20724
  throw new Error("required custody head must be a lowercase 40-hex git object id");
20363
20725
  }
20364
- const current = eng.mounted.has(ws) ? kgit.resolveRef(eng, gitdirOf(ws), BRANCH2) : "";
20365
- 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
+ }
20366
20731
  if (current && isDirty(eng, ws)) {
20367
20732
  throw new Error(
20368
20733
  `workspace '${ws}' has verified but unsealed resident work; refusing to discard it while reconciling custody`
@@ -20375,6 +20740,12 @@ async function reconcileRequiredCustodyHead(eng, ws, ledger, requiredCustodyHead
20375
20740
  `workspace '${ws}' could not reconcile required custody ${requiredCustodyHead}: ${mounted.restoreError || "custody has no verified main"}`
20376
20741
  );
20377
20742
  }
20743
+ const reconciled = kgit.resolveRef(eng, gitdirOf(ws), BRANCH2);
20744
+ if (reconciled !== requiredCustodyHead || mounted.remoteMain !== requiredCustodyHead) {
20745
+ throw new Error(
20746
+ `workspace '${ws}' restored custody ${mounted.remoteMain || reconciled || "none"}, not required custody ${requiredCustodyHead}`
20747
+ );
20748
+ }
20378
20749
  return mounted;
20379
20750
  }
20380
20751
  function assertAuthored(res, what) {
@@ -20512,7 +20883,10 @@ async function applyWorkspaceEffect(eng, ws, ledger, requestBytes, admissionChec
20512
20883
  const result = response.outcome.value.result;
20513
20884
  if (!result || result.outcome.case !== "admitted") {
20514
20885
  const outcome = result?.outcome.case || "empty";
20515
- 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
+ );
20516
20890
  }
20517
20891
  await custodyPush(eng, ws, ledger, { remoteRef: "refs/heads/main", ffOnly: true });
20518
20892
  return toBinary6(ApplyWorkspaceEffectResponseSchema, response.outcome.value);
@@ -20623,8 +20997,8 @@ function prepareRemoteOffer(eng, ws, requestBytes) {
20623
20997
  if (authoring.authorSecret.byteLength !== 0) {
20624
20998
  throw new Error("remote offer preparation refuses client signing secrets");
20625
20999
  }
20626
- if (request.intent.case !== "call") {
20627
- throw new Error("remote offer preparation requires a typed directive call");
21000
+ if (request.intent.case !== "call" && request.intent.case !== "modelLifecycle") {
21001
+ throw new Error("remote offer preparation requires a typed directive or model-lifecycle call");
20628
21002
  }
20629
21003
  const response = callProto(eng.ex, {
20630
21004
  case: "prepareRemoteOffer",
@@ -21090,7 +21464,13 @@ function packDelta(eng, ws, base, head) {
21090
21464
  case: "packDelta",
21091
21465
  value: create7(PackDeltaRequestSchema2, { repo: repoArgOf(ws), base: base || void 0, head })
21092
21466
  }, "packDelta").pack;
21093
- } catch {
21467
+ } catch (error) {
21468
+ console.error("[nomos-custody-pack] packDelta refused", {
21469
+ workspace: ws,
21470
+ base: base || "<full>",
21471
+ head,
21472
+ error: String(error)
21473
+ });
21094
21474
  return null;
21095
21475
  }
21096
21476
  }
@@ -22267,7 +22647,10 @@ async function emitOutbox(eng, ws, ledger, workspaceEffectBase = "", admissionCh
22267
22647
  const targetResult = response.result;
22268
22648
  if (!targetResult || targetResult.outcome.case !== "admitted") {
22269
22649
  const outcome = targetResult?.outcome.case || "empty";
22270
- 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
+ );
22271
22654
  }
22272
22655
  break;
22273
22656
  }
@@ -22299,7 +22682,7 @@ async function emitOutbox(eng, ws, ledger, workspaceEffectBase = "", admissionCh
22299
22682
  } catch (e) {
22300
22683
  errors++;
22301
22684
  const destination = offer.route.case === "httpsRoute" ? offer.route.value.url : offer.route.case === "workspaceRoute" ? offer.route.value.workspace : offer.destination;
22302
- log("outbox-deliver-failed", { ws, offerId: offer.id, destination, error: String(e).slice(0, 200) });
22685
+ log("outbox-deliver-failed", { ws, offerId: offer.id, destination, error: String(e).slice(0, 2e3) });
22303
22686
  }
22304
22687
  }
22305
22688
  if (delivered.length || errors) log("outbox", { ws, delivered: delivered.length, errors });
@@ -22330,6 +22713,26 @@ function snapshot(eng, ws) {
22330
22713
  const wsDir = dirOf(eng.preopen.dir.contents.get("ws")).contents.get(ws);
22331
22714
  return serializeTree2(wsDir);
22332
22715
  }
22716
+ function localCustodySnapshot(eng, ws) {
22717
+ const checkpoint = exportCheckpoint(eng, ws);
22718
+ const tree = snapshot(eng, ws);
22719
+ const head = headOf(eng, ws);
22720
+ const body = toBinary6(LocalCustodySnapshotSchema2, create7(LocalCustodySnapshotSchema2, {
22721
+ formatVersion: 3,
22722
+ workspace: ws,
22723
+ tree,
22724
+ checkpoint: checkpoint.blob ? bytesFromB64(checkpoint.blob) : void 0,
22725
+ frontier: checkpoint.frontier ? bytesFromB64(checkpoint.frontier) : void 0,
22726
+ cursor: checkpoint.cursor === void 0 ? void 0 : String(checkpoint.cursor),
22727
+ stateRoot: checkpoint.stateRoot,
22728
+ syncedBase: head || void 0
22729
+ }));
22730
+ const prefix = enc7.encode("NOMOS-CUSTODY-PB3\n");
22731
+ const framed = new Uint8Array(prefix.byteLength + body.byteLength);
22732
+ framed.set(prefix);
22733
+ framed.set(body, prefix.byteLength);
22734
+ return framed;
22735
+ }
22333
22736
  function stats(eng) {
22334
22737
  return {
22335
22738
  mounted: eng.mounted.size,
@@ -22406,6 +22809,7 @@ var init_engine = __esm({
22406
22809
  init_lifecycle_calls2();
22407
22810
  init_offer_result2();
22408
22811
  init_kernel_pb2();
22812
+ init_snapshot_pb2();
22409
22813
  enc7 = new TextEncoder();
22410
22814
  dec7 = new TextDecoder();
22411
22815
  BRANCH2 = "main";
@@ -23438,6 +23842,14 @@ __export(governance_exports, {
23438
23842
  import { createHash, createPrivateKey, createPublicKey } from "node:crypto";
23439
23843
  import { mkdirSync as mkdirSync3, readFileSync as readFileSync3, writeFileSync as writeFileSync4 } from "node:fs";
23440
23844
  import { dirname as dirname3, join as join4 } from "node:path";
23845
+ function custodyAdmissionAccepted(admission) {
23846
+ if (admission === null || admission === void 0 || admission.ok === false) return false;
23847
+ const refused = (admission.sessions ?? []).some(
23848
+ (session) => (session.rejected?.length ?? 0) > 0 || (session.intents ?? []).some((intent) => intent.outcome?.case !== "admitted")
23849
+ );
23850
+ if (refused) return false;
23851
+ return admission.ok === true || /^[0-9a-f]{40}$/i.test(String(admission.main ?? ""));
23852
+ }
23441
23853
  async function clientConnect() {
23442
23854
  const mod = await Promise.resolve().then(() => (init_src2(), src_exports));
23443
23855
  return mod.connect;
@@ -23576,8 +23988,7 @@ async function adoptRootModelLifecycle(candidateHash, opts, acceptance) {
23576
23988
  }
23577
23989
  const sync = await holon.sync({ admit: true, discoverRemote: true });
23578
23990
  const admission = sync.admission;
23579
- const rejected = (admission?.sessions ?? []).flatMap((session) => session.rejected ?? []);
23580
- const ok = sync.pushFailed !== true && sync.offline !== true && admission?.ok === true && rejected.length === 0;
23991
+ const ok = sync.pushFailed !== true && sync.offline !== true && custodyAdmissionAccepted(admission);
23581
23992
  return { ok, adoption, sync };
23582
23993
  }
23583
23994
  async function adoptWorkspaceModel(workspace, domain, candidateHash, opts, acceptance) {
@@ -23612,8 +24023,7 @@ async function adoptWorkspaceModel(workspace, domain, candidateHash, opts, accep
23612
24023
  }
23613
24024
  const sync = await holon.sync({ admit: true, discoverRemote: true });
23614
24025
  const admission = sync.admission;
23615
- const rejected = (admission?.sessions ?? []).flatMap((session) => session.rejected ?? []);
23616
- const ok = sync.pushFailed !== true && sync.offline !== true && admission?.ok === true && rejected.length === 0;
24026
+ const ok = sync.pushFailed !== true && sync.offline !== true && custodyAdmissionAccepted(admission);
23617
24027
  return { ok, adoption, sync };
23618
24028
  } finally {
23619
24029
  holon._dispose?.();
@@ -23662,11 +24072,11 @@ async function signAndPostPreparedOffer(ws, domain, prepare, opts, authorMode =
23662
24072
  }
23663
24073
  const sync = await holon.sync({ admit: true, discoverRemote: true });
23664
24074
  const admission = sync.admission;
23665
- const rejected = (admission?.sessions ?? []).flatMap((session) => session.rejected ?? []);
23666
- 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;
23667
24077
  return {
23668
- ok: !failed && admission?.ok === true,
23669
- 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,
23670
24080
  body: sync.pushError ?? admission ?? sync,
23671
24081
  principal,
23672
24082
  actor,
@@ -28525,10 +28935,14 @@ function domainInventory(value) {
28525
28935
  const domains = row.domains.map((candidate) => {
28526
28936
  if (typeof candidate !== "object" || candidate === null) throw new Error("domain inventory contains a non-record installation");
28527
28937
  const install = candidate;
28528
- if (typeof install.domainHash !== "string" || typeof install.phase !== "string" || !Array.isArray(install.domainKeys) || !install.domainKeys.every((key2) => typeof key2 === "string")) {
28938
+ if (typeof install.domainHash !== "string" || typeof install.phase !== "string" || install.domainKeys !== void 0 && (!Array.isArray(install.domainKeys) || !install.domainKeys.every((key2) => typeof key2 === "string"))) {
28529
28939
  throw new Error("domain inventory contains an invalid installation record");
28530
28940
  }
28531
- return { domainHash: install.domainHash, phase: install.phase, domainKeys: install.domainKeys };
28941
+ return {
28942
+ domainHash: install.domainHash,
28943
+ phase: install.phase,
28944
+ domainKeys: install.domainKeys ?? []
28945
+ };
28532
28946
  });
28533
28947
  const currentLaw2 = Object.fromEntries(Object.entries(row.currentLaw).map(([key2, hash]) => {
28534
28948
  if (typeof hash !== "string") throw new Error(`domain inventory has a non-string current law for '${key2}'`);