@githolon/dsl 0.103.3 → 0.103.5
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/dart/CHANGELOG.md +15 -0
- package/dart/lib/src/runner/node-entry.mjs +411 -149
- package/dart/lib/src/runner/offline-install.mjs +222 -99
- package/dart/lib/src/session_bound.dart +111 -2
- package/dart/lib/src/test_harness.dart +117 -66
- package/dart/lib/src/webview_bridge.dart +726 -61
- package/dart/pubspec.lock +1 -1
- package/dart/pubspec.yaml +4 -5
- package/dart/test/acquire_session_test.dart +62 -5
- package/dart/test/cloud_bound_topology_test.dart +59 -38
- package/dart/test/session_bound_test.dart +25 -10
- package/dart/test/webview_bridge_test.dart +357 -9
- package/dart_types/CHANGELOG.md +5 -0
- package/dart_types/lib/nomos_types.dart +1 -0
- package/dart_types/lib/src/git_object_id.dart +37 -0
- package/dart_types/pubspec.yaml +1 -1
- package/package.json +1 -1
- package/runtime/generated-application-host.js +425 -145
- package/src/births.ts +16 -1
- package/src/business_birth.ts +67 -46
- package/src/codegen_dart.ts +68 -12
- package/src/codegen_dart_application.ts +114 -19
- package/src/codegen_dart_client.ts +149 -6
- package/src/codegen_proof.ts +16 -9
- package/src/codegen_provider_dart.ts +5 -0
- package/src/codegen_ts.ts +115 -19
- package/src/compile_package_main.ts +142 -40
- package/src/fields.ts +43 -0
- package/src/framework/attested_receipts.ts +34 -1
- package/src/framework/domain_lifecycle.ts +140 -83
- package/src/framework/genesis.ts +2 -1
- package/src/framework/home.ts +20 -45
- package/src/framework/workspaces.ts +62 -29
- package/src/idof_lint.ts +65 -51
- package/src/index.ts +21 -1
- package/src/intent.ts +11 -1
- package/src/law_graph.ts +81 -11
- package/src/law_graph_usda.ts +45 -54
- package/src/relation_schema.ts +18 -0
- package/src/shape_compat.ts +3 -0
- package/src/stable_ids_for_module.ts +7 -1
- package/src/value_object.ts +40 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// <define:__NOMOS_KERNEL_RELEASE__>
|
|
4
|
-
var define_NOMOS_KERNEL_RELEASE_default = { production: { hash: "
|
|
4
|
+
var define_NOMOS_KERNEL_RELEASE_default = { production: { hash: "79df1f00d23ed0f5dbcbf24071edf6e1667137d844248a40b456e13f4a85d176", version: "kernel-79df1f00", features: ["compoundKeys", "capturedReads", "invariantGate", "surfacedMerge", "fieldProvenance", "nullSemantics", "attestedReads", "conflictSnapshots", "ownedAudience"], protocol: 1 }, testMint: { hash: "9eac1a5907116c8c7adbd89799d513e4463ef2f127cb14367e05576096fcc228", version: "kernel-9eac1a59", features: ["compoundKeys", "capturedReads", "invariantGate", "surfacedMerge", "fieldProvenance", "nullSemantics", "attestedReads", "conflictSnapshots", "ownedAudience"], protocol: 1 } };
|
|
5
5
|
|
|
6
6
|
// runner/node-entry.ts
|
|
7
7
|
import { createInterface } from "node:readline";
|
|
@@ -255,7 +255,33 @@ function createWebviewRunner({ post: post2, openRealm: openRealm2 }) {
|
|
|
255
255
|
}, 5e3);
|
|
256
256
|
}
|
|
257
257
|
};
|
|
258
|
+
const tearDownRealm = async () => {
|
|
259
|
+
for (const rec of sessions.values()) {
|
|
260
|
+
if (rec.autoStop) {
|
|
261
|
+
try {
|
|
262
|
+
rec.autoStop();
|
|
263
|
+
} catch {
|
|
264
|
+
}
|
|
265
|
+
rec.autoStop = null;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
for (const s of subs.values()) try {
|
|
269
|
+
s.stop();
|
|
270
|
+
} catch {
|
|
271
|
+
}
|
|
272
|
+
subs.clear();
|
|
273
|
+
pendingCustodyAsks.clear();
|
|
274
|
+
const retiring = realm;
|
|
275
|
+
realm = null;
|
|
276
|
+
sessions.clear();
|
|
277
|
+
if (retiring) await retiring.dispose();
|
|
278
|
+
return { disposed: true };
|
|
279
|
+
};
|
|
258
280
|
const ops = {
|
|
281
|
+
// Framework-private application-owner release. Tenant code never calls this; NomosBridge.dispose does.
|
|
282
|
+
async disposeRealm() {
|
|
283
|
+
return tearDownRealm();
|
|
284
|
+
},
|
|
259
285
|
async connect(a) {
|
|
260
286
|
const session = String(a.session ?? a.workspace);
|
|
261
287
|
const workspace = String(a.workspace ?? a.session);
|
|
@@ -398,6 +424,14 @@ function createWebviewRunner({ post: post2, openRealm: openRealm2 }) {
|
|
|
398
424
|
}
|
|
399
425
|
return { stopped: true };
|
|
400
426
|
},
|
|
427
|
+
async refreshCredentials(a) {
|
|
428
|
+
const rec = pickSession(a);
|
|
429
|
+
const holon = await liveHolon(rec);
|
|
430
|
+
if (typeof holon.refreshAuthToken !== "function") throw new Error("connected holon cannot refresh identity proof in place");
|
|
431
|
+
const result = holon.refreshAuthToken(String(a.authToken ?? ""));
|
|
432
|
+
if (rec.autoStop?.trigger) rec.autoStop.trigger("credential-refresh");
|
|
433
|
+
return result;
|
|
434
|
+
},
|
|
401
435
|
async metrics(a) {
|
|
402
436
|
return await (await need(a)).metrics();
|
|
403
437
|
},
|
|
@@ -476,6 +510,52 @@ function createWebviewRunner({ post: post2, openRealm: openRealm2 }) {
|
|
|
476
510
|
if (r && r.ok && rec.autoStop && rec.autoStop.trigger) rec.autoStop.trigger("write");
|
|
477
511
|
return { verdict: r };
|
|
478
512
|
},
|
|
513
|
+
// FRAMEWORK-PRIVATE: the generated client carries its own compiled USDA candidate into the
|
|
514
|
+
// current signed session. This is an ordinary stageDomain offer; application code sees only
|
|
515
|
+
// the typed model lifecycle and never bytes, workspace routing or directive vocabulary.
|
|
516
|
+
async stageGeneratedModel(a) {
|
|
517
|
+
const rec = pickSession(a);
|
|
518
|
+
const target = await liveHolon(rec);
|
|
519
|
+
if (typeof target.__nomosStageGeneratedModel !== "function") {
|
|
520
|
+
throw new Error("installed Nomos runtime cannot stage generated models");
|
|
521
|
+
}
|
|
522
|
+
const verdict = await target.__nomosStageGeneratedModel(
|
|
523
|
+
String(a.domain ?? ""),
|
|
524
|
+
String(a.candidateHash ?? ""),
|
|
525
|
+
unb64(String(a.lawUsdz ?? ""))
|
|
526
|
+
);
|
|
527
|
+
nudgeAfterWrite(rec);
|
|
528
|
+
return { verdict };
|
|
529
|
+
},
|
|
530
|
+
// FRAMEWORK-PRIVATE: a generated parent carries its accepted USDA model into an older generated
|
|
531
|
+
// child. Both sessions are already authenticated on this plane; the child authors an ordinary
|
|
532
|
+
// stageDomain offer with its own inherited device capability. Tenant code never sees bytes or lifecycle.
|
|
533
|
+
async stageGeneratedModelFromParent(a) {
|
|
534
|
+
const sourceSession = String(a.sourceSession ?? "");
|
|
535
|
+
const sourceRec = sessions.get(sourceSession);
|
|
536
|
+
if (!sourceRec) throw new Error(`generated model source session '${sourceSession}' is not open`);
|
|
537
|
+
const targetRec = pickSession(a);
|
|
538
|
+
const source = await liveHolon(sourceRec);
|
|
539
|
+
const target = await liveHolon(targetRec);
|
|
540
|
+
if (typeof source.__nomosModelInstallation !== "function" || typeof target.__nomosStageGeneratedModel !== "function") {
|
|
541
|
+
throw new Error("installed Nomos runtime cannot inherit generated child models");
|
|
542
|
+
}
|
|
543
|
+
const domain = String(a.domain ?? "");
|
|
544
|
+
const candidateHash = String(a.candidateHash ?? "");
|
|
545
|
+
const sourceModel = source.__nomosModelInstallation(domain, candidateHash);
|
|
546
|
+
if (!sourceModel || sourceModel.phase !== "Active") {
|
|
547
|
+
throw new Error(`generated parent has not accepted model '${candidateHash}' for '${domain}'`);
|
|
548
|
+
}
|
|
549
|
+
const lawUsdz = unb64(String(a.lawUsdz ?? ""));
|
|
550
|
+
const verdict = await target.__nomosStageGeneratedModel(
|
|
551
|
+
domain,
|
|
552
|
+
candidateHash,
|
|
553
|
+
lawUsdz,
|
|
554
|
+
sourceModel.dependencies ?? []
|
|
555
|
+
);
|
|
556
|
+
nudgeAfterWrite(targetRec);
|
|
557
|
+
return { verdict };
|
|
558
|
+
},
|
|
479
559
|
// FRAMEWORK-PRIVATE: generated clients say model.restorePrevious(); the client discovers the
|
|
480
560
|
// predecessor, derives its dispositions, re-proves history and records the attributed decision.
|
|
481
561
|
async restorePreviousGeneratedModel(a) {
|
|
@@ -797,6 +877,7 @@ function createWebviewRunner({ post: post2, openRealm: openRealm2 }) {
|
|
|
797
877
|
nudgeAfterWrite(rec);
|
|
798
878
|
return {
|
|
799
879
|
head,
|
|
880
|
+
...r && typeof r === "object" && r.intentId ? { intentId: r.intentId } : {},
|
|
800
881
|
timing: { recv, done },
|
|
801
882
|
created: r && typeof r === "object" && r.created || [],
|
|
802
883
|
affected: r && typeof r === "object" && r.affected || [],
|
|
@@ -855,26 +936,7 @@ function createWebviewRunner({ post: post2, openRealm: openRealm2 }) {
|
|
|
855
936
|
},
|
|
856
937
|
/** Stop every watch + autoSync across every session, then tear the whole realm down (host teardown). */
|
|
857
938
|
dispose() {
|
|
858
|
-
|
|
859
|
-
try {
|
|
860
|
-
rec.autoStop();
|
|
861
|
-
} catch {
|
|
862
|
-
}
|
|
863
|
-
rec.autoStop = null;
|
|
864
|
-
}
|
|
865
|
-
for (const s of subs.values()) try {
|
|
866
|
-
s.stop();
|
|
867
|
-
} catch {
|
|
868
|
-
}
|
|
869
|
-
subs.clear();
|
|
870
|
-
if (realm) {
|
|
871
|
-
try {
|
|
872
|
-
realm.dispose();
|
|
873
|
-
} catch {
|
|
874
|
-
}
|
|
875
|
-
realm = null;
|
|
876
|
-
}
|
|
877
|
-
sessions.clear();
|
|
939
|
+
void tearDownRealm();
|
|
878
940
|
}
|
|
879
941
|
};
|
|
880
942
|
}
|
|
@@ -6220,52 +6282,74 @@ function writeTypeOfScalar(type) {
|
|
|
6220
6282
|
}
|
|
6221
6283
|
|
|
6222
6284
|
// src/_adapter/proto/nomos/kernel/v1/kernel_pb.js
|
|
6223
|
-
var file_nomos_kernel_v1_kernel = /* @__PURE__ */ fileDesc("Chxub21vcy9rZXJuZWwvdjEva2VybmVsLnByb3RvEg9ub21vcy5rZXJuZWwudjEimAMKC0NhbGxSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoCRIsCgRvcGVuGAogASgLMhwubm9tb3Mua2VybmVsLnYxLk9wZW5SZXF1ZXN0SAASLgoFb2ZmZXIYCyABKAsyHS5ub21vcy5rZXJuZWwudjEuT2ZmZXJSZXF1ZXN0SAASLgoFcXVlcnkYDCABKAsyHS5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXF1ZXN0SAASMAoGb3V0Ym94GA0gASgLMh4ubm9tb3Mua2VybmVsLnYxLk91dGJveFJlcXVlc3RIABIsCgRzeW5jGA4gASgLMhwubm9tb3Mua2VybmVsLnYxLlN5bmNSZXF1ZXN0SAASMgoHY3VzdG9keRgPIAEoCzIfLm5vbW9zLmtlcm5lbC52MS5DdXN0b2R5UmVxdWVzdEgAEiwKBHRlc3QYECABKAsyHC5ub21vcy5rZXJuZWwudjEuVGVzdFJlcXVlc3RIAEILCglvcGVyYXRpb24iywMKDENhbGxSZXNwb25zZRIYChBwcm90b2NvbF92ZXJzaW9uGAEgASgNEhIKCnJlcXVlc3RfaWQYAiABKAkSKwoHZmFpbHVyZRgKIAEoCzIYLm5vbW9zLmtlcm5lbC52MS5GYWlsdXJlSAASLQoEb3BlbhgLIAEoCzIdLm5vbW9zLmtlcm5lbC52MS5PcGVuUmVzcG9uc2VIABIvCgVvZmZlchgMIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5PZmZlclJlc3BvbnNlSAASLwoFcXVlcnkYDSABKAsyHi5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXNwb25zZUgAEjEKBm91dGJveBgOIAEoCzIfLm5vbW9zLmtlcm5lbC52MS5PdXRib3hSZXNwb25zZUgAEi0KBHN5bmMYDyABKAsyHS5ub21vcy5rZXJuZWwudjEuU3luY1Jlc3BvbnNlSAASMwoHY3VzdG9keRgQIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5DdXN0b2R5UmVzcG9uc2VIABItCgR0ZXN0GBEgASgLMh0ubm9tb3Mua2VybmVsLnYxLlRlc3RSZXNwb25zZUgAQgkKB291dGNvbWUiVwoHRmFpbHVyZRIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSLQoHZGV0YWlscxgDIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdCI8CgxPcGVuUmVzcG9uc2USLAoGcmVzdWx0GAEgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IsMCCg1PZmZlclJlc3BvbnNlEjIKCGFkbWl0dGVkGAEgASgLMh4ubm9tb3Mua2VybmVsLnYxLk9mZmVyQWRtaXR0ZWRIABIwCgdyZWZ1c2VkGAIgASgLMh0ubm9tb3Mua2VybmVsLnYxLk9mZmVyUmVmdXNlZEgAEjsKDWRlYWRfbGV0dGVyZWQYAyABKAsyIi5ub21vcy5rZXJuZWwudjEuT2ZmZXJEZWFkTGV0dGVyZWRIABI4CgtxdWFyYW50aW5lZBgEIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5PZmZlclF1YXJhbnRpbmVkSAASSgoVYmxvY2tlZF9vbl9kZXBlbmRlbmN5GAUgASgLMikubm9tb3Mua2VybmVsLnYxLk9mZmVyQmxvY2tlZE9uRGVwZW5kZW5jeUgAQgkKB291dGNvbWUiPQoNT2ZmZXJBZG1pdHRlZBIsCgZyZXN1bHQYASABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QilgEKDE9mZmVyUmVmdXNlZBIVCghvZmZlcl9pZBgBIAEoCUgAiAEBEi8KB3JlZnVzYWwYAiABKAsyHi5ub21vcy5rZXJuZWwudjEuS2VybmVsUmVmdXNhbBIxCgtkaWFnbm9zdGljcxgDIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdEILCglfb2ZmZXJfaWQiegoRT2ZmZXJEZWFkTGV0dGVyZWQSFQoIb2ZmZXJfaWQYASABKAlIAIgBARIOCgZyZWFzb24YAiABKAkSMQoLZGlhZ25vc3RpY3MYAyABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RCCwoJX29mZmVyX2lkIq4BChBPZmZlclF1YXJhbnRpbmVkEhUKCG9mZmVyX2lkGAEgASgJSACIAQESGQoRYXV0aG9yZWRfbGF3X2hhc2gYAiABKAkSGAoQY3VycmVudF9sYXdfaGFzaBgDIAEoCRIOCgZyZWFzb24YBCABKAkSMQoLZGlhZ25vc3RpY3MYBSABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RCCwoJX29mZmVyX2lkIoEBChhPZmZlckJsb2NrZWRPbkRlcGVuZGVuY3kSFQoIb2ZmZXJfaWQYASABKAlIAIgBARIOCgZkZXRhaWwYAiABKAkSMQoLZGlhZ25vc3RpY3MYAyABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RCCwoJX29mZmVyX2lkIoEBCg1LZXJuZWxSZWZ1c2FsEjAKBGNvZGUYASABKA4yIi5ub21vcy5rZXJuZWwudjEuS2VybmVsUmVmdXNhbENvZGUSDwoHbWVzc2FnZRgCIAEoCRItCgdkZXRhaWxzGAMgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IqQCCg1RdWVyeVJlc3BvbnNlEiwKBXZhbHVlGAEgASgLMhsubm9tb3Mua2VybmVsLnYxLk5vbW9zVmFsdWVIABJBChBhcHBsaWNhdGlvbl9qc29uGAIgASgLMiUubm9tb3Mua2VybmVsLnYxLkFwcGxpY2F0aW9uSnNvblZhbHVlSAASSgoTYXV0aG9yaXphdGlvbl9jaGVjaxgKIAEoCzIrLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uQ2hlY2tSZXNwb25zZUgAEkwKFGF1dGhvcml6YXRpb25fZXhwYW5kGAsgASgLMiwubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25FeHBhbmRSZXNwb25zZUgAQggKBnJlc3VsdCIkChRBcHBsaWNhdGlvbkpzb25WYWx1ZRIMCgR1dGY4GAEgASgMIj4KDk91dGJveFJlc3BvbnNlEiwKBnJlc3VsdBgBIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdCI8CgxTeW5jUmVzcG9uc2USLAoGcmVzdWx0GAEgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IkIKD1dvcmtzcGFjZVRhcmdldBIMCgRyZXBvGAEgASgJEhEKCXdvcmtzcGFjZRgCIAEoCRIOCgZicmFuY2gYAyABKAkiTgoLT3BlblJlcXVlc3QSMAoGdGFyZ2V0GAEgASgLMiAubm9tb3Mua2VybmVsLnYxLldvcmtzcGFjZVRhcmdldBINCgVzcGFucxgCIAEoCCJhCg1EaXJlY3RpdmVDYWxsEg4KBmRvbWFpbhgBIAEoCRIRCglkaXJlY3RpdmUYAiABKAkSLQoHcGF5bG9hZBgDIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdCLAAgoQQXV0aG9yaW5nT3B0aW9ucxINCgVhY3RvchgBIAEoCRISCgphdXRoX3Rva2VuGAIgASgMEhUKDWF1dGhvcl9zZWNyZXQYAyABKAwSHQoQdmFsaWRfZnJvbV9lcG9jaBgEIAEoBEgAiAEBEh8KEnByaW5jaXBhbF92ZXJpZmllZBgFIAEoCEgBiAEBEgsKA3JuZxgGIAMoARIYChBkZWZlcl9wcm9qZWN0aW9uGAcgASgIEg0KBXNwYW5zGAggASgIEg8KB2RyeV9ydW4YCSABKAgSEAoIc2VxdWVuY2UYCiABKAQSLQoFY2xvY2sYCyABKAsyHi5ub21vcy5rZXJuZWwudjEuQ2FwdHVyZWRDbG9ja0ITChFfdmFsaWRfZnJvbV9lcG9jaEIVChNfcHJpbmNpcGFsX3ZlcmlmaWVkIkoKDUNhcHR1cmVkQ2xvY2sSFwoPcGh5c2ljYWxfbWlsbGlzGAEgASgEEg8KB2xvZ2ljYWwYAiABKA0SDwoHcmVwbGljYRgDIAEoBCLeAwoMT2ZmZXJSZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSLgoEY2FsbBgCIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5EaXJlY3RpdmVDYWxsSAASHAoSc2VhbGVkX2NoYW5nZV91c2RhGAcgASgMSAASNAoJYXV0aG9yaW5nGAMgASgLMiEubm9tb3Mua2VybmVsLnYxLkF1dGhvcmluZ09wdGlvbnMSEAoIbGF3X3VzZHoYBCABKAwSMwoMYXR0ZXN0YXRpb25zGAUgAygLMh0ubm9tb3Mua2VybmVsLnYxLkF0dGVzdGVkUmVhZBI9ChJjb25mbGljdF9zbmFwc2hvdHMYBiADKAsyIS5ub21vcy5rZXJuZWwudjEuQ29uZmxpY3RTbmFwc2hvdBIaChJleGVjdXRpb25fbGF3X3VzZHoYCCABKAwSIAoTY29udHJvbGxlcl9sYXdfaGFzaBgJIAEoCUgBiAEBEh0KEGNhbmRpZGF0ZV9jb21taXQYCiABKAlIAogBAUIICgZpbnRlbnRCFgoUX2NvbnRyb2xsZXJfbGF3X2hhc2hCEwoRX2NhbmRpZGF0ZV9jb21taXQikwEKDEF0dGVzdGVkUmVhZBIQCghxdWVyeV9pZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSKwoGcmVzdWx0GAMgASgLMhsubm9tb3Mua2VybmVsLnYxLk5vbW9zVmFsdWUSEwoLYXR0ZXN0YXRpb24YBCABKAwidQoQQ29uZmxpY3RTbmFwc2hvdBIWCg5hZ2dyZWdhdGVfdHlwZRgBIAEoCRIUCgxhZ2dyZWdhdGVfaWQYAiABKAkSDQoFZmllbGQYAyABKAkSFQoNdGFyZ2V0X3NjaGVtYRgEIAEoCRINCgV0b2tlbhgFIAEoCSLbBQoMUXVlcnlSZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSMgoJYXV0aG9yaXR5GAIgASgLMh8ubm9tb3Mua2VybmVsLnYxLlF1ZXJ5QXV0aG9yaXR5Eg0KBXNwYW5zGAMgASgIEioKBHJvd3MYCiABKAsyGi5ub21vcy5rZXJuZWwudjEuUm93c1F1ZXJ5SAASKgoEcGFnZRgLIAEoCzIaLm5vbW9zLmtlcm5lbC52MS5QYWdlUXVlcnlIABIrCgVieV9pZBgMIAEoCzIaLm5vbW9zLmtlcm5lbC52MS5CeUlkUXVlcnlIABI5CgxyZXNvbHZlX3JlZnMYDSABKAsyIS5ub21vcy5rZXJuZWwudjEuUmVzb2x2ZVJlZnNRdWVyeUgAEjsKDXJlZl9mcmVzaG5lc3MYDiABKAsyIi5ub21vcy5rZXJuZWwudjEuUmVmRnJlc2huZXNzUXVlcnlIABIsCgVjb3VudBgPIAEoCzIbLm5vbW9zLmtlcm5lbC52MS5UYWxseVF1ZXJ5SAASKgoDc3VtGBAgASgLMhsubm9tb3Mua2VybmVsLnYxLlRhbGx5UXVlcnlIABIwCgdzcGF0aWFsGBEgASgLMh0ubm9tb3Mua2VybmVsLnYxLlNwYXRpYWxRdWVyeUgAEiwKBW5hbWVkGBIgASgLMhsubm9tb3Mua2VybmVsLnYxLk5hbWVkUXVlcnlIABJJChNhdXRob3JpemF0aW9uX2NoZWNrGBMgASgLMioubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25DaGVja1JlcXVlc3RIABJLChRhdXRob3JpemF0aW9uX2V4cGFuZBgUIAEoCzIrLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRXhwYW5kUmVxdWVzdEgAQgcKBXF1ZXJ5IpIBCg5RdWVyeUF1dGhvcml0eRIXCg9wcmluY2lwYWxfY2xhaW0YASABKAkSEgoKYXV0aF90b2tlbhgCIAEoDBIQCghub3dfdW5peBgDIAEoBBIVCg1hdXRob3Jfc2VjcmV0GAQgASgMEioKBGtleXMYBSADKAsyHC5ub21vcy5rZXJuZWwudjEuSW5qZWN0ZWRLZXkiOAoLSW5qZWN0ZWRLZXkSDQoFc2NvcGUYASABKAkSDQoFZXBvY2gYAiABKAQSCwoDa2V5GAMgASgMIlsKCVJvd3NRdWVyeRIKCgJpZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSEQoJcHJpbmNpcGFsGAMgASgJInkKCVBhZ2VRdWVyeRIKCgJpZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSDQoFbGltaXQYAyABKA0SDQoFYWZ0ZXIYBCABKAkSEQoJcHJpbmNpcGFsGAUgASgJIkwKCUJ5SWRRdWVyeRIWCg5hZ2dyZWdhdGVfdHlwZRgBIAEoCRIUCgxhZ2dyZWdhdGVfaWQYAiABKAkSEQoJcHJpbmNpcGFsGAMgASgJIlwKCE5vbW9zUmVmEhEKCXdvcmtzcGFjZRgBIAEoCRIWCg5hZ2dyZWdhdGVfdHlwZRgCIAEoCRIUCgxhZ2dyZWdhdGVfaWQYAyABKAkSDwoHdmVyc2lvbhgEIAEoCSJOChBSZXNvbHZlUmVmc1F1ZXJ5EicKBHJlZnMYASADKAsyGS5ub21vcy5rZXJuZWwudjEuTm9tb3NSZWYSEQoJcHJpbmNpcGFsGAIgASgJIkUKEVJlZkZyZXNobmVzc1F1ZXJ5EjAKBHJlZnMYASADKAsyIi5ub21vcy5rZXJuZWwudjEuUmVmRnJlc2huZXNzQ2hlY2sigAEKEVJlZkZyZXNobmVzc0NoZWNrEikKBnBpbm5lZBgBIAEoCzIZLm5vbW9zLmtlcm5lbC52MS5Ob21vc1JlZhIpCgZzZXJpZXMYAiABKAsyGS5ub21vcy5rZXJuZWwudjEuTm9tb3NSZWYSFQoNY3VycmVudF9maWVsZBgDIAEoCSJcCgpUYWxseVF1ZXJ5EgoKAmlkGAEgASgJEi8KCWFyZ3VtZW50cxgCIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdBIRCglwcmluY2lwYWwYAyABKAkiXgoMU3BhdGlhbFF1ZXJ5EgoKAmlkGAEgASgJEi8KCWFyZ3VtZW50cxgCIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdBIRCglwcmluY2lwYWwYAyABKAkicQoKTmFtZWRRdWVyeRIyCglvcGVyYXRpb24YASABKA4yHy5ub21vcy5rZXJuZWwudjEuUXVlcnlPcGVyYXRpb24SLwoJYXJndW1lbnRzGAIgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0Ii8KE0F1dGhvcml6YXRpb25PYmplY3QSDAoEdHlwZRgBIAEoCRIKCgJpZBgCIAEoCSJUChRBdXRob3JpemF0aW9uU3ViamVjdBIMCgR0eXBlGAEgASgJEgoKAmlkGAIgASgJEhUKCHJlbGF0aW9uGAMgASgJSACIAQFCCwoJX3JlbGF0aW9uIpwBChhSZWxhdGlvbnNoaXBUdXBsZUFkZHJlc3MSNgoIcmVzb3VyY2UYASABKAsyJC5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbk9iamVjdBIQCghyZWxhdGlvbhgCIAEoCRI2CgdzdWJqZWN0GAMgASgLMiUubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25TdWJqZWN0IoEBChhBdXRob3JpemF0aW9uQ29uc2lzdGVuY3kSIwoZY3VycmVudF92ZXJpZmllZF9mcm9udGllchgBIAEoCEgAEhkKD2F0X2xlYXN0X2NvbW1pdBgCIAEoCUgAEhYKDGV4YWN0X2NvbW1pdBgDIAEoCUgAQg0KC3JlcXVpcmVtZW50ImYKHUF1dGhvcml6YXRpb25Db25kaXRpb25Db250ZXh0EhQKDGNvbmRpdGlvbl9pZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3Qi9wIKGUF1dGhvcml6YXRpb25DaGVja1JlcXVlc3QSNgoIcmVzb3VyY2UYASABKAsyJC5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbk9iamVjdBISCgpwZXJtaXNzaW9uGAIgASgJEjYKB3N1YmplY3QYAyABKAsyJS5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvblN1YmplY3QSPgoLY29uc2lzdGVuY3kYBCABKAsyKS5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbkNvbnNpc3RlbmN5Ej8KB2NvbnRleHQYBSADKAsyLi5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbkNvbmRpdGlvbkNvbnRleHQSIAoTZXhwZWN0ZWRfbW9kZWxfaGFzaBgGIAEoCUgAiAEBEhsKE2luY2x1ZGVfZXhwbGFuYXRpb24YByABKAhCFgoUX2V4cGVjdGVkX21vZGVsX2hhc2gi7QIKGkF1dGhvcml6YXRpb25FeHBhbmRSZXF1ZXN0EjYKCHJlc291cmNlGAEgASgLMiQubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25PYmplY3QSEgoKcGVybWlzc2lvbhgCIAEoCRI+Cgtjb25zaXN0ZW5jeRgDIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uQ29uc2lzdGVuY3kSPwoHY29udGV4dBgEIAMoCzIuLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uQ29uZGl0aW9uQ29udGV4dBIgChNleHBlY3RlZF9tb2RlbF9oYXNoGAUgASgJSACIAQESDQoFbGltaXQYBiABKA0SEgoFYWZ0ZXIYByABKAlIAYgBARIbChNpbmNsdWRlX2V4cGxhbmF0aW9uGAggASgIQhYKFF9leHBlY3RlZF9tb2RlbF9oYXNoQggKBl9hZnRlciK9AQoZUmVsYXRpb25zaGlwVHVwbGVFdmlkZW5jZRI4CgV0dXBsZRgBIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5SZWxhdGlvbnNoaXBUdXBsZUFkZHJlc3MSEAoIdHVwbGVfaWQYAiABKAkSGgoSYXNzZXJ0aW9uX2V2ZW50X2lkGAMgASgJEiAKE3Jldm9jYXRpb25fZXZlbnRfaWQYBCABKAlIAIgBAUIWChRfcmV2b2NhdGlvbl9ldmVudF9pZCLhAwoYQXV0aG9yaXphdGlvbkV4cGxhbmF0aW9uEkYKCW9wZXJhdGlvbhgBIAEoDjIzLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRXhwbGFuYXRpb24uT3BlcmF0aW9uEhAKCHJlbGF0aW9uGAIgASgJEg4KBnJlc3VsdBgDIAEoCBI8CghldmlkZW5jZRgEIAMoCzIqLm5vbW9zLmtlcm5lbC52MS5SZWxhdGlvbnNoaXBUdXBsZUV2aWRlbmNlEjsKCGNoaWxkcmVuGAUgAygLMikubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25FeHBsYW5hdGlvbiLfAQoJT3BlcmF0aW9uEhkKFU9QRVJBVElPTl9VTlNQRUNJRklFRBAAEhQKEE9QRVJBVElPTl9ESVJFQ1QQARIeChpPUEVSQVRJT05fQ09NUFVURURfVVNFUlNFVBACEh4KGk9QRVJBVElPTl9UVVBMRV9UT19VU0VSU0VUEAMSEwoPT1BFUkFUSU9OX1VOSU9OEAQSGgoWT1BFUkFUSU9OX0lOVEVSU0VDVElPThAFEhcKE09QRVJBVElPTl9FWENMVVNJT04QBhIXChNPUEVSQVRJT05fQ09ORElUSU9OEAcidwoaQXV0aG9yaXphdGlvbkRlY2lzaW9uQmFzaXMSIAoYYXV0aG9yaXphdGlvbl9tb2RlbF9oYXNoGAEgASgJEiEKGXJlbGF0aW9uc2hpcF9zdGF0ZV9jb21taXQYAiABKAkSFAoMY29udGV4dF9oYXNoGAMgASgMIr4BChpBdXRob3JpemF0aW9uQ2hlY2tSZXNwb25zZRIPCgdhbGxvd2VkGAEgASgIEjoKBWJhc2lzGAIgASgLMisubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25EZWNpc2lvbkJhc2lzEkMKC2V4cGxhbmF0aW9uGAMgASgLMikubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25FeHBsYW5hdGlvbkgAiAEBQg4KDF9leHBsYW5hdGlvbiKDAgobQXV0aG9yaXphdGlvbkV4cGFuZFJlc3BvbnNlEjcKCHN1YmplY3RzGAEgAygLMiUubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25TdWJqZWN0EjoKBWJhc2lzGAIgASgLMisubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25EZWNpc2lvbkJhc2lzEhEKBG5leHQYAyABKAlIAIgBARJDCgtleHBsYW5hdGlvbhgEIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRXhwbGFuYXRpb25IAYgBAUIHCgVfbmV4dEIOCgxfZXhwbGFuYXRpb24iQQoNT3V0Ym94UmVxdWVzdBIwCgZ0YXJnZXQYASABKAsyIC5ub21vcy5rZXJuZWwudjEuV29ya3NwYWNlVGFyZ2V0ImMKC1N5bmNSZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSEQoJZnJvbV9iYXNlGAIgASgJEg8KB3RvX2hlYWQYAyABKAkiUwoLVGVzdFJlcXVlc3QSNwoIc2V0X3Jvb3QYASABKAsyIy5ub21vcy5rZXJuZWwudjEuU2V0VGVzdFJvb3RSZXF1ZXN0SABCCwoJb3BlcmF0aW9uIigKElNldFRlc3RSb290UmVxdWVzdBISCgpwdWJsaWNfa2V5GAEgASgMIj0KDFRlc3RSZXNwb25zZRItCgZyZXN1bHQYASABKAsyHS5ub21vcy5rZXJuZWwudjEuQWNrbm93bGVkZ2VkIoMJCg5DdXN0b2R5UmVxdWVzdBI3CgpwYWNrX2RlbHRhGAogASgLMiEubm9tb3Mua2VybmVsLnYxLlBhY2tEZWx0YVJlcXVlc3RIABI3CgphcHBseV9wYWNrGAsgASgLMiEubm9tb3Mua2VybmVsLnYxLkFwcGx5UGFja1JlcXVlc3RIABI3CgpyZXBvX3N0YXRzGAwgASgLMiEubm9tb3Mua2VybmVsLnYxLlJlcG9TdGF0c1JlcXVlc3RIABI9Cg1pbnRlbnRzX2Fib3ZlGA0gASgLMiQubm9tb3Mua2VybmVsLnYxLkludGVudHNBYm92ZVJlcXVlc3RIABI/Cg5pbnNwZWN0X2NoYW5nZRgOIAEoCzIlLm5vbW9zLmtlcm5lbC52MS5JbnNwZWN0Q2hhbmdlUmVxdWVzdEgAEkEKD2VuY29kZV9kb2N1bWVudBgPIAEoCzImLm5vbW9zLmtlcm5lbC52MS5FbmNvZGVEb2N1bWVudFJlcXVlc3RIABJDChBpbnNwZWN0X2RvY3VtZW50GBAgASgLMicubm9tb3Mua2VybmVsLnYxLkluc3BlY3REb2N1bWVudFJlcXVlc3RIABI1CglyZWFkX2Jsb2IYESABKAsyIC5ub21vcy5rZXJuZWwudjEuUmVhZEJsb2JSZXF1ZXN0SAASOQoLcmVzb2x2ZV9yZWYYEiABKAsyIi5ub21vcy5rZXJuZWwudjEuUmVzb2x2ZVJlZlJlcXVlc3RIABI1CglsaXN0X3JlZnMYEyABKAsyIC5ub21vcy5rZXJuZWwudjEuTGlzdFJlZnNSZXF1ZXN0SAASNQoJd3JpdGVfcmVmGBQgASgLMiAubm9tb3Mua2VybmVsLnYxLldyaXRlUmVmUmVxdWVzdEgAEjcKCmRlbGV0ZV9yZWYYFSABKAsyIS5ub21vcy5rZXJuZWwudjEuRGVsZXRlUmVmUmVxdWVzdEgAEkQKEXdyaXRlX21ldGFfY29tbWl0GBYgASgLMicubm9tb3Mua2VybmVsLnYxLldyaXRlTWV0YUNvbW1pdFJlcXVlc3RIABJCChBsYXdfY2xvc3VyZV9pbmZvGBcgASgLMiYubm9tb3Mua2VybmVsLnYxLkxhd0Nsb3N1cmVJbmZvUmVxdWVzdEgAEkUKEWNoZWNrcG9pbnRfZXhwb3J0GBggASgLMigubm9tb3Mua2VybmVsLnYxLkNoZWNrcG9pbnRFeHBvcnRSZXF1ZXN0SAASRQoRY2hlY2twb2ludF9pbXBvcnQYGSABKAsyKC5ub21vcy5rZXJuZWwudjEuQ2hlY2twb2ludEltcG9ydFJlcXVlc3RIABJDChBjYXBhY2l0eV9yZXNlcnZlGBogASgLMicubm9tb3Mua2VybmVsLnYxLkNhcGFjaXR5UmVzZXJ2ZVJlcXVlc3RIABI7CgxyZXN0b3JlX21haW4YGyABKAsyIy5ub21vcy5rZXJuZWwudjEuUmVzdG9yZU1haW5SZXF1ZXN0SABCCwoJb3BlcmF0aW9uImgKEFBhY2tEZWx0YVJlcXVlc3QSDAoEcmVwbxgBIAEoCRIRCgRoZWFkGAIgASgJSACIAQESEQoEYmFzZRgDIAEoCUgBiAEBEg4KBmJyYW5jaBgEIAEoCUIHCgVfaGVhZEIHCgVfYmFzZSJyChBBcHBseVBhY2tSZXF1ZXN0EgwKBHJlcG8YASABKAkSDgoEcGFjaxgCIAEoDEgAEhoKEHN0YWdlZF9wYWNrX2ZpbGUYBCABKAlIABIRCgRoZWFkGAMgASgJSAGIAQFCCAoGc291cmNlQgcKBV9oZWFkIiAKEFJlcG9TdGF0c1JlcXVlc3QSDAoEcmVwbxgBIAEoCSKsAQoTSW50ZW50c0Fib3ZlUmVxdWVzdBIMCgRyZXBvGAEgASgJEhEKBGhlYWQYAiABKAlIAIgBARIRCgRiYXNlGAMgASgJSAGIAQESDgoGYnJhbmNoGAQgASgJEg0KBWxpbWl0GAUgASgEEhgKEGNvbXBsZXRlX2xvZ2ljYWwYBiABKAgSFgoOY29tcGFjdF9zdG9yZWQYByABKAhCBwoFX2hlYWRCBwoFX2Jhc2UiKwoUSW5zcGVjdENoYW5nZVJlcXVlc3QSEwoLY2hhbmdlX3VzZGEYASABKAwiRgoVRW5jb2RlRG9jdW1lbnRSZXF1ZXN0Ei0KCGRvY3VtZW50GAEgASgLMhsubm9tb3Mua2VybmVsLnYxLk5vbW9zVmFsdWUiLwoWSW5zcGVjdERvY3VtZW50UmVxdWVzdBIVCg1kb2N1bWVudF91c2RhGAEgASgMIjoKD1JlYWRCbG9iUmVxdWVzdBIMCgRyZXBvGAEgASgJEgsKA29pZBgCIAEoCRIMCgRwYXRoGAMgASgJIjQKEVJlc29sdmVSZWZSZXF1ZXN0EgwKBHJlcG8YASABKAkSEQoJcmVmZXJlbmNlGAIgASgJIi8KD0xpc3RSZWZzUmVxdWVzdBIMCgRyZXBvGAEgASgJEg4KBnByZWZpeBgCIAEoCSJCCg9Xcml0ZVJlZlJlcXVlc3QSDAoEcmVwbxgBIAEoCRIRCglyZWZlcmVuY2UYAiABKAkSDgoGdGFyZ2V0GAMgASgJIjMKEERlbGV0ZVJlZlJlcXVlc3QSDAoEcmVwbxgBIAEoCRIRCglyZWZlcmVuY2UYAiABKAkiKQoITWV0YUZpbGUSDAoEcGF0aBgBIAEoCRIPCgdjb250ZW50GAIgASgMIq4BChZXcml0ZU1ldGFDb21taXRSZXF1ZXN0EgwKBHJlcG8YASABKAkSDwoHcGFyZW50cxgCIAMoCRIoCgVmaWxlcxgDIAMoCzIZLm5vbW9zLmtlcm5lbC52MS5NZXRhRmlsZRIPCgdtZXNzYWdlGAQgASgJEhQKDHRpbWVfc2Vjb25kcxgFIAEoEhIWCglyZWZlcmVuY2UYBiABKAlIAIgBAUIMCgpfcmVmZXJlbmNlIi0KFUxhd0Nsb3N1cmVJbmZvUmVxdWVzdBIUCgxjbG9zdXJlX2ZpbGUYASABKAkihwEKF0NoZWNrcG9pbnRFeHBvcnRSZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSIQoUc3RhZ2VkX2Zyb250aWVyX2ZpbGUYAiABKAlIAIgBAUIXChVfc3RhZ2VkX2Zyb250aWVyX2ZpbGUi6QEKF0NoZWNrcG9pbnRJbXBvcnRSZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSEgoIZnJvbnRpZXIYAiABKAxIABIeChRzdGFnZWRfZnJvbnRpZXJfZmlsZRgGIAEoCUgAEhMKBmN1cnNvchgDIAEoCUgBiAEBEhcKCnN0YXRlX3Jvb3QYBCABKAlIAogBARINCgVzcGFucxgFIAEoCEIRCg9mcm9udGllcl9zb3VyY2VCCQoHX2N1cnNvckINCgtfc3RhdGVfcm9vdCIxChZDYXBhY2l0eVJlc2VydmVSZXF1ZXN0EhcKD2FnZ3JlZ2F0ZV9jb3VudBgBIAEoBCJUChJSZXN0b3JlTWFpblJlcXVlc3QSMAoGdGFyZ2V0GAEgASgLMiAubm9tb3Mua2VybmVsLnYxLldvcmtzcGFjZVRhcmdldBIMCgRoZWFkGAIgASgJIo0JCg9DdXN0b2R5UmVzcG9uc2USOAoKcGFja19kZWx0YRgKIAEoCzIiLm5vbW9zLmtlcm5lbC52MS5QYWNrRGVsdGFSZXNwb25zZUgAEjgKCmFwcGx5X3BhY2sYCyABKAsyIi5ub21vcy5rZXJuZWwudjEuQXBwbHlQYWNrUmVzcG9uc2VIABI4CgpyZXBvX3N0YXRzGAwgASgLMiIubm9tb3Mua2VybmVsLnYxLlJlcG9TdGF0c1Jlc3BvbnNlSAASPgoNaW50ZW50c19hYm92ZRgNIAEoCzIlLm5vbW9zLmtlcm5lbC52MS5JbnRlbnRzQWJvdmVSZXNwb25zZUgAEkAKDmluc3BlY3RfY2hhbmdlGA4gASgLMiYubm9tb3Mua2VybmVsLnYxLkluc3BlY3RDaGFuZ2VSZXNwb25zZUgAEkIKD2VuY29kZV9kb2N1bWVudBgPIAEoCzInLm5vbW9zLmtlcm5lbC52MS5FbmNvZGVEb2N1bWVudFJlc3BvbnNlSAASRAoQaW5zcGVjdF9kb2N1bWVudBgQIAEoCzIoLm5vbW9zLmtlcm5lbC52MS5JbnNwZWN0RG9jdW1lbnRSZXNwb25zZUgAEjYKCXJlYWRfYmxvYhgRIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5SZWFkQmxvYlJlc3BvbnNlSAASOgoLcmVzb2x2ZV9yZWYYEiABKAsyIy5ub21vcy5rZXJuZWwudjEuUmVzb2x2ZVJlZlJlc3BvbnNlSAASNgoJbGlzdF9yZWZzGBMgASgLMiEubm9tb3Mua2VybmVsLnYxLkxpc3RSZWZzUmVzcG9uc2VIABIyCgl3cml0ZV9yZWYYFCABKAsyHS5ub21vcy5rZXJuZWwudjEuQWNrbm93bGVkZ2VkSAASMwoKZGVsZXRlX3JlZhgVIAEoCzIdLm5vbW9zLmtlcm5lbC52MS5BY2tub3dsZWRnZWRIABJFChF3cml0ZV9tZXRhX2NvbW1pdBgWIAEoCzIoLm5vbW9zLmtlcm5lbC52MS5Xcml0ZU1ldGFDb21taXRSZXNwb25zZUgAEkMKEGxhd19jbG9zdXJlX2luZm8YFyABKAsyJy5ub21vcy5rZXJuZWwudjEuTGF3Q2xvc3VyZUluZm9SZXNwb25zZUgAEkYKEWNoZWNrcG9pbnRfZXhwb3J0GBggASgLMikubm9tb3Mua2VybmVsLnYxLkNoZWNrcG9pbnRFeHBvcnRSZXNwb25zZUgAEkYKEWNoZWNrcG9pbnRfaW1wb3J0GBkgASgLMikubm9tb3Mua2VybmVsLnYxLkNoZWNrcG9pbnRJbXBvcnRSZXNwb25zZUgAEkQKEGNhcGFjaXR5X3Jlc2VydmUYGiABKAsyKC5ub21vcy5rZXJuZWwudjEuQ2FwYWNpdHlSZXNlcnZlUmVzcG9uc2VIABI8CgxyZXN0b3JlX21haW4YGyABKAsyJC5ub21vcy5rZXJuZWwudjEuUmVzdG9yZU1haW5SZXNwb25zZUgAQgsKCW9wZXJhdGlvbiIhChFQYWNrRGVsdGFSZXNwb25zZRIMCgRwYWNrGAEgASgMIjwKEUFwcGx5UGFja1Jlc3BvbnNlEhQKDG9iamVjdF9jb3VudBgBIAEoBBIRCglwYWNrX2hhc2gYAiABKAkipwEKEVJlcG9TdGF0c1Jlc3BvbnNlEhMKC3RvdGFsX2J5dGVzGAEgASgEEhQKDG9iamVjdF9ieXRlcxgCIAEoBBIVCg1sb29zZV9vYmplY3RzGAMgASgEEhMKC2xvb3NlX2J5dGVzGAQgASgEEhIKCnBhY2tfZmlsZXMYBSABKAQSEgoKcGFja19ieXRlcxgGIAEoBBITCgtpbmRleF9ieXRlcxgHIAEoBCKWAQoMSW50ZW50UmVjb3JkEgsKA29pZBgBIAEoCRIRCglpbnRlbnRfaWQYAiABKAkSDgoGZG9tYWluGAMgASgJEhEKCWRpcmVjdGl2ZRgEIAEoCRITCgtjaGFuZ2VfdXNkYRgFIAEoDBIuCghzZW1hbnRpYxgGIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdCJGChRJbnRlbnRzQWJvdmVSZXNwb25zZRIuCgdpbnRlbnRzGAEgAygLMh0ubm9tb3Mua2VybmVsLnYxLkludGVudFJlY29yZCJHChVJbnNwZWN0Q2hhbmdlUmVzcG9uc2USLgoIc2VtYW50aWMYASABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QiLwoWRW5jb2RlRG9jdW1lbnRSZXNwb25zZRIVCg1kb2N1bWVudF91c2RhGAEgASgMIkgKF0luc3BlY3REb2N1bWVudFJlc3BvbnNlEi0KCGRvY3VtZW50GAEgASgLMhsubm9tb3Mua2VybmVsLnYxLk5vbW9zVmFsdWUiLwoQUmVhZEJsb2JSZXNwb25zZRINCgVmb3VuZBgBIAEoCBIMCgRibG9iGAIgASgMIi4KElJlc29sdmVSZWZSZXNwb25zZRIQCgNvaWQYASABKAlIAIgBAUIGCgRfb2lkIisKCVJlZlJlY29yZBIRCglyZWZlcmVuY2UYASABKAkSCwoDb2lkGAIgASgJIjwKEExpc3RSZWZzUmVzcG9uc2USKAoEcmVmcxgBIAMoCzIaLm5vbW9zLmtlcm5lbC52MS5SZWZSZWNvcmQiDgoMQWNrbm93bGVkZ2VkIiYKF1dyaXRlTWV0YUNvbW1pdFJlc3BvbnNlEgsKA29pZBgBIAEoCSKDAQoWTGF3Q2xvc3VyZUluZm9SZXNwb25zZRIQCghpZGVudGl0eRgBIAEoCRIZChFyb290X2xvZ2ljYWxfcGF0aBgCIAEoCRITCgthc3NldF9jb3VudBgDIAEoBBISCgpwcmltX2NvdW50GAQgASgEEhMKC2RvbWFpbl9rZXlzGAUgAygJIu8CChhDaGVja3BvaW50RXhwb3J0UmVzcG9uc2USDQoFZW1wdHkYASABKAgSEwoGY3Vyc29yGAIgASgJSACIAQESEAoIZnJvbnRpZXIYAyABKAwSFwoKc3RhdGVfcm9vdBgEIAEoCUgBiAEBEhIKCnN0YXRlX3RyZWUYBSABKAgSDgoGcGlubmVkGAYgASgIEhsKE3JlYWRfaW5kZXhfc25hcHNob3QYByABKAgSIwobcmVhZF9pbmRleF9zbmFwc2hvdF9wZW5kaW5nGAggASgIEiQKF3JlYWRfaW5kZXhfc3FsaXRlX2J5dGVzGAkgASgESAKIAQESJQoYcmVhZF9pbmRleF9jdXN0b2R5X2J5dGVzGAogASgESAOIAQFCCQoHX2N1cnNvckINCgtfc3RhdGVfcm9vdEIaChhfcmVhZF9pbmRleF9zcWxpdGVfYnl0ZXNCGwoZX3JlYWRfaW5kZXhfY3VzdG9keV9ieXRlcyKeAgoYQ2hlY2twb2ludEltcG9ydFJlc3BvbnNlEhAKCHJlc3RvcmVkGAEgASgIEhMKBnJlYXNvbhgCIAEoCUgAiAEBEhcKD2Zyb250aWVyX3NlZWRlZBgDIAEoCBIlCh1mcm9udGllcl92ZXJpZmljYXRpb25fcGVuZGluZxgEIAEoCBIXCg9hZ2dyZWdhdGVfY291bnQYBSABKAQSKwoFc3BhbnMYBiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSEwoGY3Vyc29yGAcgASgJSAGIAQESEQoJcmVhZF9vbmx5GAggASgIEhcKD2xhenlfcmVhZF9pbmRleBgJIAEoCEIJCgdfcmVhc29uQgkKB19jdXJzb3IiSgoXQ2FwYWNpdHlSZXNlcnZlUmVzcG9uc2USFwoPYWdncmVnYXRlX2NvdW50GAEgASgEEhYKDnJlc2VydmVkX2J5dGVzGAIgASgEIkMKE1Jlc3RvcmVNYWluUmVzcG9uc2USDAoEaGVhZBgBIAEoCRIQCgh2ZXJpZmllZBgCIAEoCBIMCgR3YWxrGAMgASgJIpsCCgpOb21vc1ZhbHVlEiUKBG51bGwYASABKAsyFS5ub21vcy5rZXJuZWwudjEuTnVsbEgAEhEKB2Jvb2xlYW4YAiABKAhIABIYCg5zaWduZWRfaW50ZWdlchgDIAEoEkgAEhoKEHVuc2lnbmVkX2ludGVnZXIYBCABKARIABIYCg5mbG9hdGluZ19wb2ludBgFIAEoAUgAEg4KBHRleHQYBiABKAlIABIPCgVieXRlcxgHIAEoDEgAEioKBGxpc3QYCCABKAsyGi5ub21vcy5rZXJuZWwudjEuTm9tb3NMaXN0SAASLgoGb2JqZWN0GAkgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0SABCBgoEa2luZCIGCgROdWxsIjgKCU5vbW9zTGlzdBIrCgZ2YWx1ZXMYASADKAsyGy5ub21vcy5rZXJuZWwudjEuTm9tb3NWYWx1ZSKTAQoLTm9tb3NTdHJ1Y3QSOAoGZmllbGRzGAEgAygLMigubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0LkZpZWxkc0VudHJ5GkoKC0ZpZWxkc0VudHJ5EgsKA2tleRgBIAEoCRIqCgV2YWx1ZRgCIAEoCzIbLm5vbW9zLmtlcm5lbC52MS5Ob21vc1ZhbHVlOgI4ASrpEgoRS2VybmVsUmVmdXNhbENvZGUSIwofS0VSTkVMX1JFRlVTQUxfQ09ERV9VTlNQRUNJRklFRBAAEiUKIUtFUk5FTF9SRUZVU0FMX0NPREVfQkFEX1NJR05BVFVSRRABEiQKIEtFUk5FTF9SRUZVU0FMX0NPREVfVU5BVVRIT1JJWkVEEAISJwojS0VSTkVMX1JFRlVTQUxfQ09ERV9QT0xJQ1lfRElTQUJMRUQQAxIqCiZLRVJORUxfUkVGVVNBTF9DT0RFX1VOQ0VSVElGSUVEX1BPTElDWRAEEiMKH0tFUk5FTF9SRUZVU0FMX0NPREVfUkVGRVJFTlRJQUwQBRIvCitLRVJORUxfUkVGVVNBTF9DT0RFX1BPSU5UX1NUQVRFX1VOQVZBSUxBQkxFEAYSJAogS0VSTkVMX1JFRlVTQUxfQ09ERV9DQVBfRVhDRUVERUQQBxItCilLRVJORUxfUkVGVVNBTF9DT0RFX0NBUF9DT1VOVF9VTkFWQUlMQUJMRRAIEikKJUtFUk5FTF9SRUZVU0FMX0NPREVfRVZJREVOQ0VfVU5CQUNLRUQQCRImCiJLRVJORUxfUkVGVVNBTF9DT0RFX09SUEhBTl9SRUNFSVBUEAoSNgoyS0VSTkVMX1JFRlVTQUxfQ09ERV9SRUNFSVBUX09OX1RFUk1JTkFMX09CTElHQVRJT04QCxIiCh5LRVJORUxfUkVGVVNBTF9DT0RFX05PVF9NSU5URUQQDBIoCiRLRVJORUxfUkVGVVNBTF9DT0RFX0RPTUFJTl9MSUZFQ1lDTEUQDRIpCiVLRVJORUxfUkVGVVNBTF9DT0RFX1RZUEVfVEFHX01JU01BVENIEA4SLAooS0VSTkVMX1JFRlVTQUxfQ09ERV9SRVRJUkVEX1JFQURfU1VSRkFDRRAPEjAKLEtFUk5FTF9SRUZVU0FMX0NPREVfQ1JPU1NfV09SS1NQQUNFX0RFQ0xJTkVEEBASKwonS0VSTkVMX1JFRlVTQUxfQ09ERV9BR0dSRUdBVEVfSU5WQVJJQU5UEBESKwonS0VSTkVMX1JFRlVTQUxfQ09ERV9XT1JLU1BBQ0VfSU5WQVJJQU5UEBISLgoqS0VSTkVMX1JFRlVTQUxfQ09ERV9DQVBUVVJFRF9SRUFEX0NPTkZMSUNUEBMSMgouS0VSTkVMX1JFRlVTQUxfQ09ERV9DT05GTElDVF9TTkFQU0hPVF9SRVFVSVJFRBAUEjQKMEtFUk5FTF9SRUZVU0FMX0NPREVfQ09ORkxJQ1RfU05BUFNIT1RfVU5ERUNMQVJFRBAVEjEKLUtFUk5FTF9SRUZVU0FMX0NPREVfQ09ORkxJQ1RfU05BUFNIT1RfSU5WQUxJRBAWEi8KK0tFUk5FTF9SRUZVU0FMX0NPREVfQ09ORkxJQ1RfU05BUFNIT1RfU1RBTEUQFxIwCixLRVJORUxfUkVGVVNBTF9DT0RFX0NBUFRVUkVEX1JFQURfVU5ERUNMQVJFRBAYEi0KKUtFUk5FTF9SRUZVU0FMX0NPREVfQ0FQVFVSRURfUkVBRF9QUklWQVRFEBkSMAosS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RFRF9SRUFEX1VOREVDTEFSRUQQGhIzCi9LRVJORUxfUkVGVVNBTF9DT0RFX0FUVEVTVEVEX1JFQURfVU5UUlVTVEVEX0tFWRAbEjYKMktFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNURURfUkVBRF9VTlRSVVNURURfU09VUkNFEBwSLAooS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RFRF9SRUFEX0ZPUkdFRBAdEisKJ0tFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNURURfUkVBRF9TVEFMRRAeEi4KKktFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNURURfUkVBRF9PVkVSU0laRRAfEjcKM0tFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNURURfUkVBRF9ESVNIT05PUkVEX1NPVVJDRRAgEjUKMUtFUk5FTF9SRUZVU0FMX0NPREVfRVFVSVZPQ0FUSU9OX0VWSURFTkNFX0lOVkFMSUQQIRIzCi9LRVJORUxfUkVGVVNBTF9DT0RFX0FUVEVTVEFUSU9OX1JFQ0VJUFRfSU5WQUxJRBAiEisKJ0tFUk5FTF9SRUZVU0FMX0NPREVfS0VZX1JPU1RFUl9NSVNNQVRDSBAjEi8KK0tFUk5FTF9SRUZVU0FMX0NPREVfS0VZX0VQT0NIX05PVF9NT05PVE9OSUMQJBIpCiVLRVJORUxfUkVGVVNBTF9DT0RFX1dSSVRFX0VQT0NIX1NUQUxFECUSLQopS0VSTkVMX1JFRlVTQUxfQ09ERV9FTlZFTE9QRV9TSURfTUlTTUFUQ0gQJhIyCi5LRVJORUxfUkVGVVNBTF9DT0RFX1JFVk9LRURfTUVNQkVSX1JFU1VSUkVDVEVEECcSKAokS0VSTkVMX1JFRlVTQUxfQ09ERV9GT1JHRURfUFJJTkNJUEFMECgSKAokS0VSTkVMX1JFRlVTQUxfQ09ERV9PV05FRF9LRVlfQU5DSE9SECkSJgoiS0VSTkVMX1JFRlVTQUxfQ09ERV9PV05FRF9SRUNPVkVSWRAqEiwKKEtFUk5FTF9SRUZVU0FMX0NPREVfU1VSRkFDRURfQkFTSVNfQUhFQUQQKxIyCi5LRVJORUxfUkVGVVNBTF9DT0RFX1NJR05FUl9FUE9DSF9PVVRfT0ZfV0lORE9XECwSJgoiS0VSTkVMX1JFRlVTQUxfQ09ERV9FVk9MVkVfUkVGVVNFRBAtEisKJ0tFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNUQVRJT05fSU5WQUxJRBAuEi0KKUtFUk5FTF9SRUZVU0FMX0NPREVfUEFSRU5UX0RJRF9OT1RfQVRURVNUEC8SKQolS0VSTkVMX1JFRlVTQUxfQ09ERV9DRVJUX0NIQUlOX0JST0tFThAwEioKJktFUk5FTF9SRUZVU0FMX0NPREVfTk9UX1JPT1RFRF9BVF9ST09UEDESKgomS0VSTkVMX1JFRlVTQUxfQ09ERV9ERUxFR0FUSU9OX0lOVkFMSUQQMhIlCiFLRVJORUxfUkVGVVNBTF9DT0RFX1BMQU5fUkVKRUNURUQQMyqFDAoOUXVlcnlPcGVyYXRpb24SHwobUVVFUllfT1BFUkFUSU9OX1VOU1BFQ0lGSUVEEAASHAoYUVVFUllfT1BFUkFUSU9OX0VYVFJFTVVNEAESJQohUVVFUllfT1BFUkFUSU9OX1BFTkRJTkdfQ09ORkxJQ1RTEAISLAooUVVFUllfT1BFUkFUSU9OX1BFTkRJTkdfQ09ORkxJQ1RfU1VNTUFSWRADEiAKHFFVRVJZX09QRVJBVElPTl9SRUFEX1BPU1RVUkUQBBIfChtRVUVSWV9PUEVSQVRJT05fQ1VSUkVOVF9MQVcQBRIjCh9RVUVSWV9PUEVSQVRJT05fSU5URVJGQUNFX09GRkVSEAYSJwojUVVFUllfT1BFUkFUSU9OX1JFTEFUSU9OX0dBVEVfT0ZGRVIQBxIdChlRVUVSWV9PUEVSQVRJT05fU0NFTkVfTEFXEAgSIQodUVVFUllfT1BFUkFUSU9OX0lOU1RBTExFRF9MQVcQCRIcChhRVUVSWV9PUEVSQVRJT05fREVTQ1JJQkUQChIgChxRVUVSWV9PUEVSQVRJT05fS0VSTkVMX1NUQU1QEAsSIwofUVVFUllfT1BFUkFUSU9OX0RFVkVMT1BFUl9TUEFOUxAMEikKJVFVRVJZX09QRVJBVElPTl9ERUNMQVJFRF9DQVBBQklMSVRJRVMQDRIdChlRVUVSWV9PUEVSQVRJT05fUkVBRElORVNTEA4SJAogUVVFUllfT1BFUkFUSU9OX1BST0pFQ1RJT05fU1RBVFMQDxIlCiFRVUVSWV9PUEVSQVRJT05fTUVNT1JZX0RST1BfUFJPQkUQEBIYChRRVUVSWV9PUEVSQVRJT05fV0FSTRAREhsKF1FVRVJZX09QRVJBVElPTl9SRUZSRVNIEBISIAocUVVFUllfT1BFUkFUSU9OX1ZFUklGWV9DSEFJThATEiUKIVFVRVJZX09QRVJBVElPTl9ISVNUT1JZX1BSRUZMSUdIVBAUEhkKFVFVRVJZX09QRVJBVElPTl9ST1VURRAVEhgKFFFVRVJZX09QRVJBVElPTl9NSU5UEBYSIQodUVVFUllfT1BFUkFUSU9OX0NSWVBUT19LRVlHRU4QFxIlCiFRVUVSWV9PUEVSQVRJT05fQ1JZUFRPX1NFQUxfRklFTEQQGBIsCihRVUVSWV9PUEVSQVRJT05fQ1JZUFRPX0JMSU5EX0lOREVYX1RPS0VOEBkSKgomUVVFUllfT1BFUkFUSU9OX0NSWVBUT19PV05FRF9TQ09QRV9LRVkQGhIvCitRVUVSWV9PUEVSQVRJT05fQ1JZUFRPX09XTkVEX0RFVklDRV9SRVFVRVNUEBsSMQotUVVFUllfT1BFUkFUSU9OX0NSWVBUT19PV05FRF9QUkVQQVJFX0FQUFJPVkFMEBwSMQotUVVFUllfT1BFUkFUSU9OX0NSWVBUT19PV05FRF9QUkVQQVJFX1JFQ09WRVJZEB0SIwofUVVFUllfT1BFUkFUSU9OX0NSWVBUT19XUkFQX0tFWRAeEiUKIVFVRVJZX09QRVJBVElPTl9DUllQVE9fVU5XUkFQX0tFWRAfEiEKHVFVRVJZX09QRVJBVElPTl9BVVRIT1JfS0VZR0VOECASJAogUVVFUllfT1BFUkFUSU9OX0FUVEVTVEFUSU9OX1NJR04QIRIgChxRVUVSWV9PUEVSQVRJT05fUkVDRUlQVF9QQVRIECISHQoZUVVFUllfT1BFUkFUSU9OX0NFUlRfU0lHThAjEiUKIVFVRVJZX09QRVJBVElPTl9CSVJUSF9UUlVTVF9TVEFURRAkEiEKHVFVRVJZX09QRVJBVElPTl9FUkFfQ0VSVF9TSUdOECUSKAokUVVFUllfT1BFUkFUSU9OX0RFTEVHQVRJT05fQ0VSVF9TSUdOECYSKQolUVVFUllfT1BFUkFUSU9OX0NBTk9OSUNBTElaRV9GUk9OVElFUhAnEisKJ1FVRVJZX09QRVJBVElPTl9DQU5PTklDQUxJWkVfUFJPSkVDVElPThAoMlkKEk5vbW9zS2VybmVsU2VydmljZRJDCgRDYWxsEhwubm9tb3Mua2VybmVsLnYxLkNhbGxSZXF1ZXN0Gh0ubm9tb3Mua2VybmVsLnYxLkNhbGxSZXNwb25zZWIGcHJvdG8z");
|
|
6285
|
+
var file_nomos_kernel_v1_kernel = /* @__PURE__ */ fileDesc("Chxub21vcy9rZXJuZWwvdjEva2VybmVsLnByb3RvEg9ub21vcy5rZXJuZWwudjEimAMKC0NhbGxSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoCRIsCgRvcGVuGAogASgLMhwubm9tb3Mua2VybmVsLnYxLk9wZW5SZXF1ZXN0SAASLgoFb2ZmZXIYCyABKAsyHS5ub21vcy5rZXJuZWwudjEuT2ZmZXJSZXF1ZXN0SAASLgoFcXVlcnkYDCABKAsyHS5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXF1ZXN0SAASMAoGb3V0Ym94GA0gASgLMh4ubm9tb3Mua2VybmVsLnYxLk91dGJveFJlcXVlc3RIABIsCgRzeW5jGA4gASgLMhwubm9tb3Mua2VybmVsLnYxLlN5bmNSZXF1ZXN0SAASMgoHY3VzdG9keRgPIAEoCzIfLm5vbW9zLmtlcm5lbC52MS5DdXN0b2R5UmVxdWVzdEgAEiwKBHRlc3QYECABKAsyHC5ub21vcy5rZXJuZWwudjEuVGVzdFJlcXVlc3RIAEILCglvcGVyYXRpb24iywMKDENhbGxSZXNwb25zZRIYChBwcm90b2NvbF92ZXJzaW9uGAEgASgNEhIKCnJlcXVlc3RfaWQYAiABKAkSKwoHZmFpbHVyZRgKIAEoCzIYLm5vbW9zLmtlcm5lbC52MS5GYWlsdXJlSAASLQoEb3BlbhgLIAEoCzIdLm5vbW9zLmtlcm5lbC52MS5PcGVuUmVzcG9uc2VIABIvCgVvZmZlchgMIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5PZmZlclJlc3BvbnNlSAASLwoFcXVlcnkYDSABKAsyHi5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXNwb25zZUgAEjEKBm91dGJveBgOIAEoCzIfLm5vbW9zLmtlcm5lbC52MS5PdXRib3hSZXNwb25zZUgAEi0KBHN5bmMYDyABKAsyHS5ub21vcy5rZXJuZWwudjEuU3luY1Jlc3BvbnNlSAASMwoHY3VzdG9keRgQIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5DdXN0b2R5UmVzcG9uc2VIABItCgR0ZXN0GBEgASgLMh0ubm9tb3Mua2VybmVsLnYxLlRlc3RSZXNwb25zZUgAQgkKB291dGNvbWUiVwoHRmFpbHVyZRIMCgRjb2RlGAEgASgJEg8KB21lc3NhZ2UYAiABKAkSLQoHZGV0YWlscxgDIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdCI8CgxPcGVuUmVzcG9uc2USLAoGcmVzdWx0GAEgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IsMCCg1PZmZlclJlc3BvbnNlEjIKCGFkbWl0dGVkGAEgASgLMh4ubm9tb3Mua2VybmVsLnYxLk9mZmVyQWRtaXR0ZWRIABIwCgdyZWZ1c2VkGAIgASgLMh0ubm9tb3Mua2VybmVsLnYxLk9mZmVyUmVmdXNlZEgAEjsKDWRlYWRfbGV0dGVyZWQYAyABKAsyIi5ub21vcy5rZXJuZWwudjEuT2ZmZXJEZWFkTGV0dGVyZWRIABI4CgtxdWFyYW50aW5lZBgEIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5PZmZlclF1YXJhbnRpbmVkSAASSgoVYmxvY2tlZF9vbl9kZXBlbmRlbmN5GAUgASgLMikubm9tb3Mua2VybmVsLnYxLk9mZmVyQmxvY2tlZE9uRGVwZW5kZW5jeUgAQgkKB291dGNvbWUiPQoNT2ZmZXJBZG1pdHRlZBIsCgZyZXN1bHQYASABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QilgEKDE9mZmVyUmVmdXNlZBIVCghvZmZlcl9pZBgBIAEoCUgAiAEBEi8KB3JlZnVzYWwYAiABKAsyHi5ub21vcy5rZXJuZWwudjEuS2VybmVsUmVmdXNhbBIxCgtkaWFnbm9zdGljcxgDIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdEILCglfb2ZmZXJfaWQiegoRT2ZmZXJEZWFkTGV0dGVyZWQSFQoIb2ZmZXJfaWQYASABKAlIAIgBARIOCgZyZWFzb24YAiABKAkSMQoLZGlhZ25vc3RpY3MYAyABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RCCwoJX29mZmVyX2lkIq4BChBPZmZlclF1YXJhbnRpbmVkEhUKCG9mZmVyX2lkGAEgASgJSACIAQESGQoRYXV0aG9yZWRfbGF3X2hhc2gYAiABKAkSGAoQY3VycmVudF9sYXdfaGFzaBgDIAEoCRIOCgZyZWFzb24YBCABKAkSMQoLZGlhZ25vc3RpY3MYBSABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RCCwoJX29mZmVyX2lkIoEBChhPZmZlckJsb2NrZWRPbkRlcGVuZGVuY3kSFQoIb2ZmZXJfaWQYASABKAlIAIgBARIOCgZkZXRhaWwYAiABKAkSMQoLZGlhZ25vc3RpY3MYAyABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RCCwoJX29mZmVyX2lkIoEBCg1LZXJuZWxSZWZ1c2FsEjAKBGNvZGUYASABKA4yIi5ub21vcy5rZXJuZWwudjEuS2VybmVsUmVmdXNhbENvZGUSDwoHbWVzc2FnZRgCIAEoCRItCgdkZXRhaWxzGAMgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IqQCCg1RdWVyeVJlc3BvbnNlEiwKBXZhbHVlGAEgASgLMhsubm9tb3Mua2VybmVsLnYxLk5vbW9zVmFsdWVIABJBChBhcHBsaWNhdGlvbl9qc29uGAIgASgLMiUubm9tb3Mua2VybmVsLnYxLkFwcGxpY2F0aW9uSnNvblZhbHVlSAASSgoTYXV0aG9yaXphdGlvbl9jaGVjaxgKIAEoCzIrLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uQ2hlY2tSZXNwb25zZUgAEkwKFGF1dGhvcml6YXRpb25fZXhwYW5kGAsgASgLMiwubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25FeHBhbmRSZXNwb25zZUgAQggKBnJlc3VsdCIkChRBcHBsaWNhdGlvbkpzb25WYWx1ZRIMCgR1dGY4GAEgASgMIj4KDk91dGJveFJlc3BvbnNlEiwKBnJlc3VsdBgBIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdCI8CgxTeW5jUmVzcG9uc2USLAoGcmVzdWx0GAEgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0IkIKD1dvcmtzcGFjZVRhcmdldBIMCgRyZXBvGAEgASgJEhEKCXdvcmtzcGFjZRgCIAEoCRIOCgZicmFuY2gYAyABKAkiTgoLT3BlblJlcXVlc3QSMAoGdGFyZ2V0GAEgASgLMiAubm9tb3Mua2VybmVsLnYxLldvcmtzcGFjZVRhcmdldBINCgVzcGFucxgCIAEoCCJhCg1EaXJlY3RpdmVDYWxsEg4KBmRvbWFpbhgBIAEoCRIRCglkaXJlY3RpdmUYAiABKAkSLQoHcGF5bG9hZBgDIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdCLAAgoQQXV0aG9yaW5nT3B0aW9ucxINCgVhY3RvchgBIAEoCRISCgphdXRoX3Rva2VuGAIgASgMEhUKDWF1dGhvcl9zZWNyZXQYAyABKAwSHQoQdmFsaWRfZnJvbV9lcG9jaBgEIAEoBEgAiAEBEh8KEnByaW5jaXBhbF92ZXJpZmllZBgFIAEoCEgBiAEBEgsKA3JuZxgGIAMoARIYChBkZWZlcl9wcm9qZWN0aW9uGAcgASgIEg0KBXNwYW5zGAggASgIEg8KB2RyeV9ydW4YCSABKAgSEAoIc2VxdWVuY2UYCiABKAQSLQoFY2xvY2sYCyABKAsyHi5ub21vcy5rZXJuZWwudjEuQ2FwdHVyZWRDbG9ja0ITChFfdmFsaWRfZnJvbV9lcG9jaEIVChNfcHJpbmNpcGFsX3ZlcmlmaWVkIkoKDUNhcHR1cmVkQ2xvY2sSFwoPcGh5c2ljYWxfbWlsbGlzGAEgASgEEg8KB2xvZ2ljYWwYAiABKA0SDwoHcmVwbGljYRgDIAEoBCLDAwoQQmlydGhDZXJ0aWZpY2F0ZRINCgVjaGlsZBgBIAEoCRIPCgdmb3VuZGVyGAIgASgJEhAKCHZlcmlmaWVkGAMgASgIEhIKCnBhcmVudF9rZXkYBCABKAwSEQoJcGFyZW50X2lkGAUgASgJEg0KBWVwb2NoGAYgASgDEhEKCXNpZ25hdHVyZRgHIAEoDBIZCgx2ZXJpZmllZF92aWEYCCABKAlIAIgBARIWCglpZHBfdG9rZW4YCSABKAlIAYgBARIbCg5jYXB0dXJlZF9jbG9jaxgKIAEoA0gCiAEBEiEKFGF1dGhfcHJvdmlkZXJfaXNzdWVyGAsgASgJSAOIAQESHwoSYXV0aF9wcm92aWRlcl9qd2tzGAwgASgJSASIAQESIwoWYXV0aF9wcm92aWRlcl9hdWRpZW5jZRgNIAEoCUgFiAEBQg8KDV92ZXJpZmllZF92aWFCDAoKX2lkcF90b2tlbkIRCg9fY2FwdHVyZWRfY2xvY2tCFwoVX2F1dGhfcHJvdmlkZXJfaXNzdWVyQhUKE19hdXRoX3Byb3ZpZGVyX2p3a3NCGQoXX2F1dGhfcHJvdmlkZXJfYXVkaWVuY2UinAQKDE9mZmVyUmVxdWVzdBIwCgZ0YXJnZXQYASABKAsyIC5ub21vcy5rZXJuZWwudjEuV29ya3NwYWNlVGFyZ2V0Ei4KBGNhbGwYAiABKAsyHi5ub21vcy5rZXJuZWwudjEuRGlyZWN0aXZlQ2FsbEgAEhwKEnNlYWxlZF9jaGFuZ2VfdXNkYRgHIAEoDEgAEjQKCWF1dGhvcmluZxgDIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpbmdPcHRpb25zEhAKCGxhd191c2R6GAQgASgMEjMKDGF0dGVzdGF0aW9ucxgFIAMoCzIdLm5vbW9zLmtlcm5lbC52MS5BdHRlc3RlZFJlYWQSPQoSY29uZmxpY3Rfc25hcHNob3RzGAYgAygLMiEubm9tb3Mua2VybmVsLnYxLkNvbmZsaWN0U25hcHNob3QSGgoSZXhlY3V0aW9uX2xhd191c2R6GAggASgMEiAKE2NvbnRyb2xsZXJfbGF3X2hhc2gYCSABKAlIAYgBARIdChBjYW5kaWRhdGVfY29tbWl0GAogASgJSAKIAQESPAoRYmlydGhfY2VydGlmaWNhdGUYCyABKAsyIS5ub21vcy5rZXJuZWwudjEuQmlydGhDZXJ0aWZpY2F0ZUIICgZpbnRlbnRCFgoUX2NvbnRyb2xsZXJfbGF3X2hhc2hCEwoRX2NhbmRpZGF0ZV9jb21taXQikwEKDEF0dGVzdGVkUmVhZBIQCghxdWVyeV9pZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSKwoGcmVzdWx0GAMgASgLMhsubm9tb3Mua2VybmVsLnYxLk5vbW9zVmFsdWUSEwoLYXR0ZXN0YXRpb24YBCABKAwidQoQQ29uZmxpY3RTbmFwc2hvdBIWCg5hZ2dyZWdhdGVfdHlwZRgBIAEoCRIUCgxhZ2dyZWdhdGVfaWQYAiABKAkSDQoFZmllbGQYAyABKAkSFQoNdGFyZ2V0X3NjaGVtYRgEIAEoCRINCgV0b2tlbhgFIAEoCSLbBQoMUXVlcnlSZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSMgoJYXV0aG9yaXR5GAIgASgLMh8ubm9tb3Mua2VybmVsLnYxLlF1ZXJ5QXV0aG9yaXR5Eg0KBXNwYW5zGAMgASgIEioKBHJvd3MYCiABKAsyGi5ub21vcy5rZXJuZWwudjEuUm93c1F1ZXJ5SAASKgoEcGFnZRgLIAEoCzIaLm5vbW9zLmtlcm5lbC52MS5QYWdlUXVlcnlIABIrCgVieV9pZBgMIAEoCzIaLm5vbW9zLmtlcm5lbC52MS5CeUlkUXVlcnlIABI5CgxyZXNvbHZlX3JlZnMYDSABKAsyIS5ub21vcy5rZXJuZWwudjEuUmVzb2x2ZVJlZnNRdWVyeUgAEjsKDXJlZl9mcmVzaG5lc3MYDiABKAsyIi5ub21vcy5rZXJuZWwudjEuUmVmRnJlc2huZXNzUXVlcnlIABIsCgVjb3VudBgPIAEoCzIbLm5vbW9zLmtlcm5lbC52MS5UYWxseVF1ZXJ5SAASKgoDc3VtGBAgASgLMhsubm9tb3Mua2VybmVsLnYxLlRhbGx5UXVlcnlIABIwCgdzcGF0aWFsGBEgASgLMh0ubm9tb3Mua2VybmVsLnYxLlNwYXRpYWxRdWVyeUgAEiwKBW5hbWVkGBIgASgLMhsubm9tb3Mua2VybmVsLnYxLk5hbWVkUXVlcnlIABJJChNhdXRob3JpemF0aW9uX2NoZWNrGBMgASgLMioubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25DaGVja1JlcXVlc3RIABJLChRhdXRob3JpemF0aW9uX2V4cGFuZBgUIAEoCzIrLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRXhwYW5kUmVxdWVzdEgAQgcKBXF1ZXJ5IpIBCg5RdWVyeUF1dGhvcml0eRIXCg9wcmluY2lwYWxfY2xhaW0YASABKAkSEgoKYXV0aF90b2tlbhgCIAEoDBIQCghub3dfdW5peBgDIAEoBBIVCg1hdXRob3Jfc2VjcmV0GAQgASgMEioKBGtleXMYBSADKAsyHC5ub21vcy5rZXJuZWwudjEuSW5qZWN0ZWRLZXkiOAoLSW5qZWN0ZWRLZXkSDQoFc2NvcGUYASABKAkSDQoFZXBvY2gYAiABKAQSCwoDa2V5GAMgASgMIlsKCVJvd3NRdWVyeRIKCgJpZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSEQoJcHJpbmNpcGFsGAMgASgJInkKCVBhZ2VRdWVyeRIKCgJpZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSDQoFbGltaXQYAyABKA0SDQoFYWZ0ZXIYBCABKAkSEQoJcHJpbmNpcGFsGAUgASgJIkwKCUJ5SWRRdWVyeRIWCg5hZ2dyZWdhdGVfdHlwZRgBIAEoCRIUCgxhZ2dyZWdhdGVfaWQYAiABKAkSEQoJcHJpbmNpcGFsGAMgASgJIlwKCE5vbW9zUmVmEhEKCXdvcmtzcGFjZRgBIAEoCRIWCg5hZ2dyZWdhdGVfdHlwZRgCIAEoCRIUCgxhZ2dyZWdhdGVfaWQYAyABKAkSDwoHdmVyc2lvbhgEIAEoCSJOChBSZXNvbHZlUmVmc1F1ZXJ5EicKBHJlZnMYASADKAsyGS5ub21vcy5rZXJuZWwudjEuTm9tb3NSZWYSEQoJcHJpbmNpcGFsGAIgASgJIkUKEVJlZkZyZXNobmVzc1F1ZXJ5EjAKBHJlZnMYASADKAsyIi5ub21vcy5rZXJuZWwudjEuUmVmRnJlc2huZXNzQ2hlY2sigAEKEVJlZkZyZXNobmVzc0NoZWNrEikKBnBpbm5lZBgBIAEoCzIZLm5vbW9zLmtlcm5lbC52MS5Ob21vc1JlZhIpCgZzZXJpZXMYAiABKAsyGS5ub21vcy5rZXJuZWwudjEuTm9tb3NSZWYSFQoNY3VycmVudF9maWVsZBgDIAEoCSJcCgpUYWxseVF1ZXJ5EgoKAmlkGAEgASgJEi8KCWFyZ3VtZW50cxgCIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdBIRCglwcmluY2lwYWwYAyABKAkiXgoMU3BhdGlhbFF1ZXJ5EgoKAmlkGAEgASgJEi8KCWFyZ3VtZW50cxgCIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdBIRCglwcmluY2lwYWwYAyABKAkicQoKTmFtZWRRdWVyeRIyCglvcGVyYXRpb24YASABKA4yHy5ub21vcy5rZXJuZWwudjEuUXVlcnlPcGVyYXRpb24SLwoJYXJndW1lbnRzGAIgASgLMhwubm9tb3Mua2VybmVsLnYxLk5vbW9zU3RydWN0Ii8KE0F1dGhvcml6YXRpb25PYmplY3QSDAoEdHlwZRgBIAEoCRIKCgJpZBgCIAEoCSJUChRBdXRob3JpemF0aW9uU3ViamVjdBIMCgR0eXBlGAEgASgJEgoKAmlkGAIgASgJEhUKCHJlbGF0aW9uGAMgASgJSACIAQFCCwoJX3JlbGF0aW9uIpwBChhSZWxhdGlvbnNoaXBUdXBsZUFkZHJlc3MSNgoIcmVzb3VyY2UYASABKAsyJC5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbk9iamVjdBIQCghyZWxhdGlvbhgCIAEoCRI2CgdzdWJqZWN0GAMgASgLMiUubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25TdWJqZWN0IoEBChhBdXRob3JpemF0aW9uQ29uc2lzdGVuY3kSIwoZY3VycmVudF92ZXJpZmllZF9mcm9udGllchgBIAEoCEgAEhkKD2F0X2xlYXN0X2NvbW1pdBgCIAEoCUgAEhYKDGV4YWN0X2NvbW1pdBgDIAEoCUgAQg0KC3JlcXVpcmVtZW50ImYKHUF1dGhvcml6YXRpb25Db25kaXRpb25Db250ZXh0EhQKDGNvbmRpdGlvbl9pZBgBIAEoCRIvCglhcmd1bWVudHMYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3Qi9wIKGUF1dGhvcml6YXRpb25DaGVja1JlcXVlc3QSNgoIcmVzb3VyY2UYASABKAsyJC5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbk9iamVjdBISCgpwZXJtaXNzaW9uGAIgASgJEjYKB3N1YmplY3QYAyABKAsyJS5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvblN1YmplY3QSPgoLY29uc2lzdGVuY3kYBCABKAsyKS5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbkNvbnNpc3RlbmN5Ej8KB2NvbnRleHQYBSADKAsyLi5ub21vcy5rZXJuZWwudjEuQXV0aG9yaXphdGlvbkNvbmRpdGlvbkNvbnRleHQSIAoTZXhwZWN0ZWRfbW9kZWxfaGFzaBgGIAEoCUgAiAEBEhsKE2luY2x1ZGVfZXhwbGFuYXRpb24YByABKAhCFgoUX2V4cGVjdGVkX21vZGVsX2hhc2gi7QIKGkF1dGhvcml6YXRpb25FeHBhbmRSZXF1ZXN0EjYKCHJlc291cmNlGAEgASgLMiQubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25PYmplY3QSEgoKcGVybWlzc2lvbhgCIAEoCRI+Cgtjb25zaXN0ZW5jeRgDIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uQ29uc2lzdGVuY3kSPwoHY29udGV4dBgEIAMoCzIuLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uQ29uZGl0aW9uQ29udGV4dBIgChNleHBlY3RlZF9tb2RlbF9oYXNoGAUgASgJSACIAQESDQoFbGltaXQYBiABKA0SEgoFYWZ0ZXIYByABKAlIAYgBARIbChNpbmNsdWRlX2V4cGxhbmF0aW9uGAggASgIQhYKFF9leHBlY3RlZF9tb2RlbF9oYXNoQggKBl9hZnRlciK9AQoZUmVsYXRpb25zaGlwVHVwbGVFdmlkZW5jZRI4CgV0dXBsZRgBIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5SZWxhdGlvbnNoaXBUdXBsZUFkZHJlc3MSEAoIdHVwbGVfaWQYAiABKAkSGgoSYXNzZXJ0aW9uX2V2ZW50X2lkGAMgASgJEiAKE3Jldm9jYXRpb25fZXZlbnRfaWQYBCABKAlIAIgBAUIWChRfcmV2b2NhdGlvbl9ldmVudF9pZCLhAwoYQXV0aG9yaXphdGlvbkV4cGxhbmF0aW9uEkYKCW9wZXJhdGlvbhgBIAEoDjIzLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRXhwbGFuYXRpb24uT3BlcmF0aW9uEhAKCHJlbGF0aW9uGAIgASgJEg4KBnJlc3VsdBgDIAEoCBI8CghldmlkZW5jZRgEIAMoCzIqLm5vbW9zLmtlcm5lbC52MS5SZWxhdGlvbnNoaXBUdXBsZUV2aWRlbmNlEjsKCGNoaWxkcmVuGAUgAygLMikubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25FeHBsYW5hdGlvbiLfAQoJT3BlcmF0aW9uEhkKFU9QRVJBVElPTl9VTlNQRUNJRklFRBAAEhQKEE9QRVJBVElPTl9ESVJFQ1QQARIeChpPUEVSQVRJT05fQ09NUFVURURfVVNFUlNFVBACEh4KGk9QRVJBVElPTl9UVVBMRV9UT19VU0VSU0VUEAMSEwoPT1BFUkFUSU9OX1VOSU9OEAQSGgoWT1BFUkFUSU9OX0lOVEVSU0VDVElPThAFEhcKE09QRVJBVElPTl9FWENMVVNJT04QBhIXChNPUEVSQVRJT05fQ09ORElUSU9OEAcidwoaQXV0aG9yaXphdGlvbkRlY2lzaW9uQmFzaXMSIAoYYXV0aG9yaXphdGlvbl9tb2RlbF9oYXNoGAEgASgJEiEKGXJlbGF0aW9uc2hpcF9zdGF0ZV9jb21taXQYAiABKAkSFAoMY29udGV4dF9oYXNoGAMgASgMIr4BChpBdXRob3JpemF0aW9uQ2hlY2tSZXNwb25zZRIPCgdhbGxvd2VkGAEgASgIEjoKBWJhc2lzGAIgASgLMisubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25EZWNpc2lvbkJhc2lzEkMKC2V4cGxhbmF0aW9uGAMgASgLMikubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25FeHBsYW5hdGlvbkgAiAEBQg4KDF9leHBsYW5hdGlvbiKDAgobQXV0aG9yaXphdGlvbkV4cGFuZFJlc3BvbnNlEjcKCHN1YmplY3RzGAEgAygLMiUubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25TdWJqZWN0EjoKBWJhc2lzGAIgASgLMisubm9tb3Mua2VybmVsLnYxLkF1dGhvcml6YXRpb25EZWNpc2lvbkJhc2lzEhEKBG5leHQYAyABKAlIAIgBARJDCgtleHBsYW5hdGlvbhgEIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5BdXRob3JpemF0aW9uRXhwbGFuYXRpb25IAYgBAUIHCgVfbmV4dEIOCgxfZXhwbGFuYXRpb24iQQoNT3V0Ym94UmVxdWVzdBIwCgZ0YXJnZXQYASABKAsyIC5ub21vcy5rZXJuZWwudjEuV29ya3NwYWNlVGFyZ2V0ImMKC1N5bmNSZXF1ZXN0EjAKBnRhcmdldBgBIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5Xb3Jrc3BhY2VUYXJnZXQSEQoJZnJvbV9iYXNlGAIgASgJEg8KB3RvX2hlYWQYAyABKAkiUwoLVGVzdFJlcXVlc3QSNwoIc2V0X3Jvb3QYASABKAsyIy5ub21vcy5rZXJuZWwudjEuU2V0VGVzdFJvb3RSZXF1ZXN0SABCCwoJb3BlcmF0aW9uIigKElNldFRlc3RSb290UmVxdWVzdBISCgpwdWJsaWNfa2V5GAEgASgMIj0KDFRlc3RSZXNwb25zZRItCgZyZXN1bHQYASABKAsyHS5ub21vcy5rZXJuZWwudjEuQWNrbm93bGVkZ2VkIp0JCg5DdXN0b2R5UmVxdWVzdBI3CgpwYWNrX2RlbHRhGAogASgLMiEubm9tb3Mua2VybmVsLnYxLlBhY2tEZWx0YVJlcXVlc3RIABI3CgphcHBseV9wYWNrGAsgASgLMiEubm9tb3Mua2VybmVsLnYxLkFwcGx5UGFja1JlcXVlc3RIABI3CgpyZXBvX3N0YXRzGAwgASgLMiEubm9tb3Mua2VybmVsLnYxLlJlcG9TdGF0c1JlcXVlc3RIABI9Cg1pbnRlbnRzX2Fib3ZlGA0gASgLMiQubm9tb3Mua2VybmVsLnYxLkludGVudHNBYm92ZVJlcXVlc3RIABI/Cg5pbnNwZWN0X2NoYW5nZRgOIAEoCzIlLm5vbW9zLmtlcm5lbC52MS5JbnNwZWN0Q2hhbmdlUmVxdWVzdEgAEk4KFmVuY29kZV9yZWZ1c2FsX3ZlcmRpY3QYDyABKAsyLC5ub21vcy5rZXJuZWwudjEuRW5jb2RlUmVmdXNhbFZlcmRpY3RSZXF1ZXN0SAASUAoXaW5zcGVjdF9yZWZ1c2FsX3ZlcmRpY3QYECABKAsyLS5ub21vcy5rZXJuZWwudjEuSW5zcGVjdFJlZnVzYWxWZXJkaWN0UmVxdWVzdEgAEjUKCXJlYWRfYmxvYhgRIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5SZWFkQmxvYlJlcXVlc3RIABI5CgtyZXNvbHZlX3JlZhgSIAEoCzIiLm5vbW9zLmtlcm5lbC52MS5SZXNvbHZlUmVmUmVxdWVzdEgAEjUKCWxpc3RfcmVmcxgTIAEoCzIgLm5vbW9zLmtlcm5lbC52MS5MaXN0UmVmc1JlcXVlc3RIABI1Cgl3cml0ZV9yZWYYFCABKAsyIC5ub21vcy5rZXJuZWwudjEuV3JpdGVSZWZSZXF1ZXN0SAASNwoKZGVsZXRlX3JlZhgVIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5EZWxldGVSZWZSZXF1ZXN0SAASRAoRd3JpdGVfbWV0YV9jb21taXQYFiABKAsyJy5ub21vcy5rZXJuZWwudjEuV3JpdGVNZXRhQ29tbWl0UmVxdWVzdEgAEkIKEGxhd19jbG9zdXJlX2luZm8YFyABKAsyJi5ub21vcy5rZXJuZWwudjEuTGF3Q2xvc3VyZUluZm9SZXF1ZXN0SAASRQoRY2hlY2twb2ludF9leHBvcnQYGCABKAsyKC5ub21vcy5rZXJuZWwudjEuQ2hlY2twb2ludEV4cG9ydFJlcXVlc3RIABJFChFjaGVja3BvaW50X2ltcG9ydBgZIAEoCzIoLm5vbW9zLmtlcm5lbC52MS5DaGVja3BvaW50SW1wb3J0UmVxdWVzdEgAEkMKEGNhcGFjaXR5X3Jlc2VydmUYGiABKAsyJy5ub21vcy5rZXJuZWwudjEuQ2FwYWNpdHlSZXNlcnZlUmVxdWVzdEgAEjsKDHJlc3RvcmVfbWFpbhgbIAEoCzIjLm5vbW9zLmtlcm5lbC52MS5SZXN0b3JlTWFpblJlcXVlc3RIAEILCglvcGVyYXRpb24inAEKEFBhY2tEZWx0YVJlcXVlc3QSDAoEcmVwbxgBIAEoCRIRCgRoZWFkGAIgASgJSACIAQESEQoEYmFzZRgDIAEoCUgBiAEBEg4KBmJyYW5jaBgEIAEoCRIdChBzdGFnZWRfcGFja19maWxlGAUgASgJSAKIAQFCBwoFX2hlYWRCBwoFX2Jhc2VCEwoRX3N0YWdlZF9wYWNrX2ZpbGUicgoQQXBwbHlQYWNrUmVxdWVzdBIMCgRyZXBvGAEgASgJEg4KBHBhY2sYAiABKAxIABIaChBzdGFnZWRfcGFja19maWxlGAQgASgJSAASEQoEaGVhZBgDIAEoCUgBiAEBQggKBnNvdXJjZUIHCgVfaGVhZCIgChBSZXBvU3RhdHNSZXF1ZXN0EgwKBHJlcG8YASABKAkirAEKE0ludGVudHNBYm92ZVJlcXVlc3QSDAoEcmVwbxgBIAEoCRIRCgRoZWFkGAIgASgJSACIAQESEQoEYmFzZRgDIAEoCUgBiAEBEg4KBmJyYW5jaBgEIAEoCRINCgVsaW1pdBgFIAEoBBIYChBjb21wbGV0ZV9sb2dpY2FsGAYgASgIEhYKDmNvbXBhY3Rfc3RvcmVkGAcgASgIQgcKBV9oZWFkQgcKBV9iYXNlIisKFEluc3BlY3RDaGFuZ2VSZXF1ZXN0EhMKC2NoYW5nZV91c2RhGAEgASgMIt8BCg5SZWZ1c2FsVmVyZGljdBIVCghvZmZlcl9pZBgBIAEoCUgAiAEBEhAKA29pZBgCIAEoCUgBiAEBEhMKBmRvbWFpbhgDIAEoCUgCiAEBEhkKDGRpcmVjdGl2ZV9pZBgEIAEoCUgDiAEBEhQKB3Nlc3Npb24YBSABKAlIBIgBARIRCglwYXJrZWRfYXQYBiABKAkSDgoGcmVhc29uGAcgASgJQgsKCV9vZmZlcl9pZEIGCgRfb2lkQgkKB19kb21haW5CDwoNX2RpcmVjdGl2ZV9pZEIKCghfc2Vzc2lvbiJPChtFbmNvZGVSZWZ1c2FsVmVyZGljdFJlcXVlc3QSMAoHdmVyZGljdBgBIAEoCzIfLm5vbW9zLmtlcm5lbC52MS5SZWZ1c2FsVmVyZGljdCI0ChxJbnNwZWN0UmVmdXNhbFZlcmRpY3RSZXF1ZXN0EhQKDHZlcmRpY3RfdXNkYRgBIAEoDCI6Cg9SZWFkQmxvYlJlcXVlc3QSDAoEcmVwbxgBIAEoCRILCgNvaWQYAiABKAkSDAoEcGF0aBgDIAEoCSI0ChFSZXNvbHZlUmVmUmVxdWVzdBIMCgRyZXBvGAEgASgJEhEKCXJlZmVyZW5jZRgCIAEoCSIvCg9MaXN0UmVmc1JlcXVlc3QSDAoEcmVwbxgBIAEoCRIOCgZwcmVmaXgYAiABKAkiQgoPV3JpdGVSZWZSZXF1ZXN0EgwKBHJlcG8YASABKAkSEQoJcmVmZXJlbmNlGAIgASgJEg4KBnRhcmdldBgDIAEoCSIzChBEZWxldGVSZWZSZXF1ZXN0EgwKBHJlcG8YASABKAkSEQoJcmVmZXJlbmNlGAIgASgJIikKCE1ldGFGaWxlEgwKBHBhdGgYASABKAkSDwoHY29udGVudBgCIAEoDCKuAQoWV3JpdGVNZXRhQ29tbWl0UmVxdWVzdBIMCgRyZXBvGAEgASgJEg8KB3BhcmVudHMYAiADKAkSKAoFZmlsZXMYAyADKAsyGS5ub21vcy5rZXJuZWwudjEuTWV0YUZpbGUSDwoHbWVzc2FnZRgEIAEoCRIUCgx0aW1lX3NlY29uZHMYBSABKBISFgoJcmVmZXJlbmNlGAYgASgJSACIAQFCDAoKX3JlZmVyZW5jZSJnChVMYXdDbG9zdXJlSW5mb1JlcXVlc3QSFAoMY2xvc3VyZV9maWxlGAEgASgJEjgKCmNhcGFiaWxpdHkYAiABKA4yJC5ub21vcy5rZXJuZWwudjEuS2VybmVsTGF3Q2FwYWJpbGl0eSKHAQoXQ2hlY2twb2ludEV4cG9ydFJlcXVlc3QSMAoGdGFyZ2V0GAEgASgLMiAubm9tb3Mua2VybmVsLnYxLldvcmtzcGFjZVRhcmdldBIhChRzdGFnZWRfZnJvbnRpZXJfZmlsZRgCIAEoCUgAiAEBQhcKFV9zdGFnZWRfZnJvbnRpZXJfZmlsZSLpAQoXQ2hlY2twb2ludEltcG9ydFJlcXVlc3QSMAoGdGFyZ2V0GAEgASgLMiAubm9tb3Mua2VybmVsLnYxLldvcmtzcGFjZVRhcmdldBISCghmcm9udGllchgCIAEoDEgAEh4KFHN0YWdlZF9mcm9udGllcl9maWxlGAYgASgJSAASEwoGY3Vyc29yGAMgASgJSAGIAQESFwoKc3RhdGVfcm9vdBgEIAEoCUgCiAEBEg0KBXNwYW5zGAUgASgIQhEKD2Zyb250aWVyX3NvdXJjZUIJCgdfY3Vyc29yQg0KC19zdGF0ZV9yb290IjEKFkNhcGFjaXR5UmVzZXJ2ZVJlcXVlc3QSFwoPYWdncmVnYXRlX2NvdW50GAEgASgEIlQKElJlc3RvcmVNYWluUmVxdWVzdBIwCgZ0YXJnZXQYASABKAsyIC5ub21vcy5rZXJuZWwudjEuV29ya3NwYWNlVGFyZ2V0EgwKBGhlYWQYAiABKAkipwkKD0N1c3RvZHlSZXNwb25zZRI4CgpwYWNrX2RlbHRhGAogASgLMiIubm9tb3Mua2VybmVsLnYxLlBhY2tEZWx0YVJlc3BvbnNlSAASOAoKYXBwbHlfcGFjaxgLIAEoCzIiLm5vbW9zLmtlcm5lbC52MS5BcHBseVBhY2tSZXNwb25zZUgAEjgKCnJlcG9fc3RhdHMYDCABKAsyIi5ub21vcy5rZXJuZWwudjEuUmVwb1N0YXRzUmVzcG9uc2VIABI+Cg1pbnRlbnRzX2Fib3ZlGA0gASgLMiUubm9tb3Mua2VybmVsLnYxLkludGVudHNBYm92ZVJlc3BvbnNlSAASQAoOaW5zcGVjdF9jaGFuZ2UYDiABKAsyJi5ub21vcy5rZXJuZWwudjEuSW5zcGVjdENoYW5nZVJlc3BvbnNlSAASTwoWZW5jb2RlX3JlZnVzYWxfdmVyZGljdBgPIAEoCzItLm5vbW9zLmtlcm5lbC52MS5FbmNvZGVSZWZ1c2FsVmVyZGljdFJlc3BvbnNlSAASUQoXaW5zcGVjdF9yZWZ1c2FsX3ZlcmRpY3QYECABKAsyLi5ub21vcy5rZXJuZWwudjEuSW5zcGVjdFJlZnVzYWxWZXJkaWN0UmVzcG9uc2VIABI2CglyZWFkX2Jsb2IYESABKAsyIS5ub21vcy5rZXJuZWwudjEuUmVhZEJsb2JSZXNwb25zZUgAEjoKC3Jlc29sdmVfcmVmGBIgASgLMiMubm9tb3Mua2VybmVsLnYxLlJlc29sdmVSZWZSZXNwb25zZUgAEjYKCWxpc3RfcmVmcxgTIAEoCzIhLm5vbW9zLmtlcm5lbC52MS5MaXN0UmVmc1Jlc3BvbnNlSAASMgoJd3JpdGVfcmVmGBQgASgLMh0ubm9tb3Mua2VybmVsLnYxLkFja25vd2xlZGdlZEgAEjMKCmRlbGV0ZV9yZWYYFSABKAsyHS5ub21vcy5rZXJuZWwudjEuQWNrbm93bGVkZ2VkSAASRQoRd3JpdGVfbWV0YV9jb21taXQYFiABKAsyKC5ub21vcy5rZXJuZWwudjEuV3JpdGVNZXRhQ29tbWl0UmVzcG9uc2VIABJDChBsYXdfY2xvc3VyZV9pbmZvGBcgASgLMicubm9tb3Mua2VybmVsLnYxLkxhd0Nsb3N1cmVJbmZvUmVzcG9uc2VIABJGChFjaGVja3BvaW50X2V4cG9ydBgYIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5DaGVja3BvaW50RXhwb3J0UmVzcG9uc2VIABJGChFjaGVja3BvaW50X2ltcG9ydBgZIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5DaGVja3BvaW50SW1wb3J0UmVzcG9uc2VIABJEChBjYXBhY2l0eV9yZXNlcnZlGBogASgLMigubm9tb3Mua2VybmVsLnYxLkNhcGFjaXR5UmVzZXJ2ZVJlc3BvbnNlSAASPAoMcmVzdG9yZV9tYWluGBsgASgLMiQubm9tb3Mua2VybmVsLnYxLlJlc3RvcmVNYWluUmVzcG9uc2VIAEILCglvcGVyYXRpb24iMAoRUGFja0RlbHRhUmVzcG9uc2USDAoEcGFjaxgBIAEoDBINCgVieXRlcxgCIAEoBCI8ChFBcHBseVBhY2tSZXNwb25zZRIUCgxvYmplY3RfY291bnQYASABKAQSEQoJcGFja19oYXNoGAIgASgJIqcBChFSZXBvU3RhdHNSZXNwb25zZRITCgt0b3RhbF9ieXRlcxgBIAEoBBIUCgxvYmplY3RfYnl0ZXMYAiABKAQSFQoNbG9vc2Vfb2JqZWN0cxgDIAEoBBITCgtsb29zZV9ieXRlcxgEIAEoBBISCgpwYWNrX2ZpbGVzGAUgASgEEhIKCnBhY2tfYnl0ZXMYBiABKAQSEwoLaW5kZXhfYnl0ZXMYByABKAQi4gEKDEludGVudFJlY29yZBILCgNvaWQYASABKAkSEQoJaW50ZW50X2lkGAIgASgJEg4KBmRvbWFpbhgDIAEoCRIRCglkaXJlY3RpdmUYBCABKAkSEwoLY2hhbmdlX3VzZGEYBSABKAwSLgoIc2VtYW50aWMYBiABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSSgoVdHJhbnNwb3J0X3JlcXVpcmVtZW50GAcgASgOMisubm9tb3Mua2VybmVsLnYxLkludGVudFRyYW5zcG9ydFJlcXVpcmVtZW50IkYKFEludGVudHNBYm92ZVJlc3BvbnNlEi4KB2ludGVudHMYASADKAsyHS5ub21vcy5rZXJuZWwudjEuSW50ZW50UmVjb3JkIkIKE05vbWluYWxDYWxsSWRlbnRpdHkSEwoLZG9tYWluX3BhdGgYASABKAkSFgoOZGlyZWN0aXZlX3BhdGgYAiABKAkiiAEKGExpZmVjeWNsZUluc3RhbGxJZGVudGl0eRIfChd0YXJnZXRfY2xvc3VyZV9pZGVudGl0eRgBIAEoCRIUCgxpbnN0YWxsZWRfYnkYAiABKAkSNQoFcGhhc2UYAyABKA4yJi5ub21vcy5rZXJuZWwudjEuTGlmZWN5Y2xlSW5zdGFsbFBoYXNlIuYBChVJbnNwZWN0Q2hhbmdlUmVzcG9uc2USLgoIc2VtYW50aWMYASABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QSEQoJaW50ZW50X2lkGAIgASgJEjIKBGNhbGwYAyABKAsyJC5ub21vcy5rZXJuZWwudjEuTm9taW5hbENhbGxJZGVudGl0eRIQCghhdXRob3JlZBgEIAEoCBJEChFsaWZlY3ljbGVfaW5zdGFsbBgFIAEoCzIpLm5vbW9zLmtlcm5lbC52MS5MaWZlY3ljbGVJbnN0YWxsSWRlbnRpdHkiNAocRW5jb2RlUmVmdXNhbFZlcmRpY3RSZXNwb25zZRIUCgx2ZXJkaWN0X3VzZGEYASABKAwiUQodSW5zcGVjdFJlZnVzYWxWZXJkaWN0UmVzcG9uc2USMAoHdmVyZGljdBgBIAEoCzIfLm5vbW9zLmtlcm5lbC52MS5SZWZ1c2FsVmVyZGljdCIvChBSZWFkQmxvYlJlc3BvbnNlEg0KBWZvdW5kGAEgASgIEgwKBGJsb2IYAiABKAwiLgoSUmVzb2x2ZVJlZlJlc3BvbnNlEhAKA29pZBgBIAEoCUgAiAEBQgYKBF9vaWQiKwoJUmVmUmVjb3JkEhEKCXJlZmVyZW5jZRgBIAEoCRILCgNvaWQYAiABKAkiPAoQTGlzdFJlZnNSZXNwb25zZRIoCgRyZWZzGAEgAygLMhoubm9tb3Mua2VybmVsLnYxLlJlZlJlY29yZCIOCgxBY2tub3dsZWRnZWQiJgoXV3JpdGVNZXRhQ29tbWl0UmVzcG9uc2USCwoDb2lkGAEgASgJIoMBChZMYXdDbG9zdXJlSW5mb1Jlc3BvbnNlEhAKCGlkZW50aXR5GAEgASgJEhkKEXJvb3RfbG9naWNhbF9wYXRoGAIgASgJEhMKC2Fzc2V0X2NvdW50GAMgASgEEhIKCnByaW1fY291bnQYBCABKAQSEwoLZG9tYWluX2tleXMYBSADKAki7wIKGENoZWNrcG9pbnRFeHBvcnRSZXNwb25zZRINCgVlbXB0eRgBIAEoCBITCgZjdXJzb3IYAiABKAlIAIgBARIQCghmcm9udGllchgDIAEoDBIXCgpzdGF0ZV9yb290GAQgASgJSAGIAQESEgoKc3RhdGVfdHJlZRgFIAEoCBIOCgZwaW5uZWQYBiABKAgSGwoTcmVhZF9pbmRleF9zbmFwc2hvdBgHIAEoCBIjChtyZWFkX2luZGV4X3NuYXBzaG90X3BlbmRpbmcYCCABKAgSJAoXcmVhZF9pbmRleF9zcWxpdGVfYnl0ZXMYCSABKARIAogBARIlChhyZWFkX2luZGV4X2N1c3RvZHlfYnl0ZXMYCiABKARIA4gBAUIJCgdfY3Vyc29yQg0KC19zdGF0ZV9yb290QhoKGF9yZWFkX2luZGV4X3NxbGl0ZV9ieXRlc0IbChlfcmVhZF9pbmRleF9jdXN0b2R5X2J5dGVzIp4CChhDaGVja3BvaW50SW1wb3J0UmVzcG9uc2USEAoIcmVzdG9yZWQYASABKAgSEwoGcmVhc29uGAIgASgJSACIAQESFwoPZnJvbnRpZXJfc2VlZGVkGAMgASgIEiUKHWZyb250aWVyX3ZlcmlmaWNhdGlvbl9wZW5kaW5nGAQgASgIEhcKD2FnZ3JlZ2F0ZV9jb3VudBgFIAEoBBIrCgVzcGFucxgGIAEoCzIcLm5vbW9zLmtlcm5lbC52MS5Ob21vc1N0cnVjdBITCgZjdXJzb3IYByABKAlIAYgBARIRCglyZWFkX29ubHkYCCABKAgSFwoPbGF6eV9yZWFkX2luZGV4GAkgASgIQgkKB19yZWFzb25CCQoHX2N1cnNvciJKChdDYXBhY2l0eVJlc2VydmVSZXNwb25zZRIXCg9hZ2dyZWdhdGVfY291bnQYASABKAQSFgoOcmVzZXJ2ZWRfYnl0ZXMYAiABKAQiQwoTUmVzdG9yZU1haW5SZXNwb25zZRIMCgRoZWFkGAEgASgJEhAKCHZlcmlmaWVkGAIgASgIEgwKBHdhbGsYAyABKAkimwIKCk5vbW9zVmFsdWUSJQoEbnVsbBgBIAEoCzIVLm5vbW9zLmtlcm5lbC52MS5OdWxsSAASEQoHYm9vbGVhbhgCIAEoCEgAEhgKDnNpZ25lZF9pbnRlZ2VyGAMgASgSSAASGgoQdW5zaWduZWRfaW50ZWdlchgEIAEoBEgAEhgKDmZsb2F0aW5nX3BvaW50GAUgASgBSAASDgoEdGV4dBgGIAEoCUgAEg8KBWJ5dGVzGAcgASgMSAASKgoEbGlzdBgIIAEoCzIaLm5vbW9zLmtlcm5lbC52MS5Ob21vc0xpc3RIABIuCgZvYmplY3QYCSABKAsyHC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3RIAEIGCgRraW5kIgYKBE51bGwiOAoJTm9tb3NMaXN0EisKBnZhbHVlcxgBIAMoCzIbLm5vbW9zLmtlcm5lbC52MS5Ob21vc1ZhbHVlIpMBCgtOb21vc1N0cnVjdBI4CgZmaWVsZHMYASADKAsyKC5ub21vcy5rZXJuZWwudjEuTm9tb3NTdHJ1Y3QuRmllbGRzRW50cnkaSgoLRmllbGRzRW50cnkSCwoDa2V5GAEgASgJEioKBXZhbHVlGAIgASgLMhsubm9tb3Mua2VybmVsLnYxLk5vbW9zVmFsdWU6AjgBKukSChFLZXJuZWxSZWZ1c2FsQ29kZRIjCh9LRVJORUxfUkVGVVNBTF9DT0RFX1VOU1BFQ0lGSUVEEAASJQohS0VSTkVMX1JFRlVTQUxfQ09ERV9CQURfU0lHTkFUVVJFEAESJAogS0VSTkVMX1JFRlVTQUxfQ09ERV9VTkFVVEhPUklaRUQQAhInCiNLRVJORUxfUkVGVVNBTF9DT0RFX1BPTElDWV9ESVNBQkxFRBADEioKJktFUk5FTF9SRUZVU0FMX0NPREVfVU5DRVJUSUZJRURfUE9MSUNZEAQSIwofS0VSTkVMX1JFRlVTQUxfQ09ERV9SRUZFUkVOVElBTBAFEi8KK0tFUk5FTF9SRUZVU0FMX0NPREVfUE9JTlRfU1RBVEVfVU5BVkFJTEFCTEUQBhIkCiBLRVJORUxfUkVGVVNBTF9DT0RFX0NBUF9FWENFRURFRBAHEi0KKUtFUk5FTF9SRUZVU0FMX0NPREVfQ0FQX0NPVU5UX1VOQVZBSUxBQkxFEAgSKQolS0VSTkVMX1JFRlVTQUxfQ09ERV9FVklERU5DRV9VTkJBQ0tFRBAJEiYKIktFUk5FTF9SRUZVU0FMX0NPREVfT1JQSEFOX1JFQ0VJUFQQChI2CjJLRVJORUxfUkVGVVNBTF9DT0RFX1JFQ0VJUFRfT05fVEVSTUlOQUxfT0JMSUdBVElPThALEiIKHktFUk5FTF9SRUZVU0FMX0NPREVfTk9UX01JTlRFRBAMEigKJEtFUk5FTF9SRUZVU0FMX0NPREVfRE9NQUlOX0xJRkVDWUNMRRANEikKJUtFUk5FTF9SRUZVU0FMX0NPREVfVFlQRV9UQUdfTUlTTUFUQ0gQDhIsCihLRVJORUxfUkVGVVNBTF9DT0RFX1JFVElSRURfUkVBRF9TVVJGQUNFEA8SMAosS0VSTkVMX1JFRlVTQUxfQ09ERV9DUk9TU19XT1JLU1BBQ0VfREVDTElORUQQEBIrCidLRVJORUxfUkVGVVNBTF9DT0RFX0FHR1JFR0FURV9JTlZBUklBTlQQERIrCidLRVJORUxfUkVGVVNBTF9DT0RFX1dPUktTUEFDRV9JTlZBUklBTlQQEhIuCipLRVJORUxfUkVGVVNBTF9DT0RFX0NBUFRVUkVEX1JFQURfQ09ORkxJQ1QQExIyCi5LRVJORUxfUkVGVVNBTF9DT0RFX0NPTkZMSUNUX1NOQVBTSE9UX1JFUVVJUkVEEBQSNAowS0VSTkVMX1JFRlVTQUxfQ09ERV9DT05GTElDVF9TTkFQU0hPVF9VTkRFQ0xBUkVEEBUSMQotS0VSTkVMX1JFRlVTQUxfQ09ERV9DT05GTElDVF9TTkFQU0hPVF9JTlZBTElEEBYSLworS0VSTkVMX1JFRlVTQUxfQ09ERV9DT05GTElDVF9TTkFQU0hPVF9TVEFMRRAXEjAKLEtFUk5FTF9SRUZVU0FMX0NPREVfQ0FQVFVSRURfUkVBRF9VTkRFQ0xBUkVEEBgSLQopS0VSTkVMX1JFRlVTQUxfQ09ERV9DQVBUVVJFRF9SRUFEX1BSSVZBVEUQGRIwCixLRVJORUxfUkVGVVNBTF9DT0RFX0FUVEVTVEVEX1JFQURfVU5ERUNMQVJFRBAaEjMKL0tFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNURURfUkVBRF9VTlRSVVNURURfS0VZEBsSNgoyS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RFRF9SRUFEX1VOVFJVU1RFRF9TT1VSQ0UQHBIsCihLRVJORUxfUkVGVVNBTF9DT0RFX0FUVEVTVEVEX1JFQURfRk9SR0VEEB0SKwonS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RFRF9SRUFEX1NUQUxFEB4SLgoqS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RFRF9SRUFEX09WRVJTSVpFEB8SNwozS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RFRF9SRUFEX0RJU0hPTk9SRURfU09VUkNFECASNQoxS0VSTkVMX1JFRlVTQUxfQ09ERV9FUVVJVk9DQVRJT05fRVZJREVOQ0VfSU5WQUxJRBAhEjMKL0tFUk5FTF9SRUZVU0FMX0NPREVfQVRURVNUQVRJT05fUkVDRUlQVF9JTlZBTElEECISKwonS0VSTkVMX1JFRlVTQUxfQ09ERV9LRVlfUk9TVEVSX01JU01BVENIECMSLworS0VSTkVMX1JFRlVTQUxfQ09ERV9LRVlfRVBPQ0hfTk9UX01PTk9UT05JQxAkEikKJUtFUk5FTF9SRUZVU0FMX0NPREVfV1JJVEVfRVBPQ0hfU1RBTEUQJRItCilLRVJORUxfUkVGVVNBTF9DT0RFX0VOVkVMT1BFX1NJRF9NSVNNQVRDSBAmEjIKLktFUk5FTF9SRUZVU0FMX0NPREVfUkVWT0tFRF9NRU1CRVJfUkVTVVJSRUNURUQQJxIoCiRLRVJORUxfUkVGVVNBTF9DT0RFX0ZPUkdFRF9QUklOQ0lQQUwQKBIoCiRLRVJORUxfUkVGVVNBTF9DT0RFX09XTkVEX0tFWV9BTkNIT1IQKRImCiJLRVJORUxfUkVGVVNBTF9DT0RFX09XTkVEX1JFQ09WRVJZECoSLAooS0VSTkVMX1JFRlVTQUxfQ09ERV9TVVJGQUNFRF9CQVNJU19BSEVBRBArEjIKLktFUk5FTF9SRUZVU0FMX0NPREVfU0lHTkVSX0VQT0NIX09VVF9PRl9XSU5ET1cQLBImCiJLRVJORUxfUkVGVVNBTF9DT0RFX0VWT0xWRV9SRUZVU0VEEC0SKwonS0VSTkVMX1JFRlVTQUxfQ09ERV9BVFRFU1RBVElPTl9JTlZBTElEEC4SLQopS0VSTkVMX1JFRlVTQUxfQ09ERV9QQVJFTlRfRElEX05PVF9BVFRFU1QQLxIpCiVLRVJORUxfUkVGVVNBTF9DT0RFX0NFUlRfQ0hBSU5fQlJPS0VOEDASKgomS0VSTkVMX1JFRlVTQUxfQ09ERV9OT1RfUk9PVEVEX0FUX1JPT1QQMRIqCiZLRVJORUxfUkVGVVNBTF9DT0RFX0RFTEVHQVRJT05fSU5WQUxJRBAyEiUKIUtFUk5FTF9SRUZVU0FMX0NPREVfUExBTl9SRUpFQ1RFRBAzKoUMCg5RdWVyeU9wZXJhdGlvbhIfChtRVUVSWV9PUEVSQVRJT05fVU5TUEVDSUZJRUQQABIcChhRVUVSWV9PUEVSQVRJT05fRVhUUkVNVU0QARIlCiFRVUVSWV9PUEVSQVRJT05fUEVORElOR19DT05GTElDVFMQAhIsCihRVUVSWV9PUEVSQVRJT05fUEVORElOR19DT05GTElDVF9TVU1NQVJZEAMSIAocUVVFUllfT1BFUkFUSU9OX1JFQURfUE9TVFVSRRAEEh8KG1FVRVJZX09QRVJBVElPTl9DVVJSRU5UX0xBVxAFEiMKH1FVRVJZX09QRVJBVElPTl9JTlRFUkZBQ0VfT0ZGRVIQBhInCiNRVUVSWV9PUEVSQVRJT05fUkVMQVRJT05fR0FURV9PRkZFUhAHEh0KGVFVRVJZX09QRVJBVElPTl9TQ0VORV9MQVcQCBIhCh1RVUVSWV9PUEVSQVRJT05fSU5TVEFMTEVEX0xBVxAJEhwKGFFVRVJZX09QRVJBVElPTl9ERVNDUklCRRAKEiAKHFFVRVJZX09QRVJBVElPTl9LRVJORUxfU1RBTVAQCxIjCh9RVUVSWV9PUEVSQVRJT05fREVWRUxPUEVSX1NQQU5TEAwSKQolUVVFUllfT1BFUkFUSU9OX0RFQ0xBUkVEX0NBUEFCSUxJVElFUxANEh0KGVFVRVJZX09QRVJBVElPTl9SRUFESU5FU1MQDhIkCiBRVUVSWV9PUEVSQVRJT05fUFJPSkVDVElPTl9TVEFUUxAPEiUKIVFVRVJZX09QRVJBVElPTl9NRU1PUllfRFJPUF9QUk9CRRAQEhgKFFFVRVJZX09QRVJBVElPTl9XQVJNEBESGwoXUVVFUllfT1BFUkFUSU9OX1JFRlJFU0gQEhIgChxRVUVSWV9PUEVSQVRJT05fVkVSSUZZX0NIQUlOEBMSJQohUVVFUllfT1BFUkFUSU9OX0hJU1RPUllfUFJFRkxJR0hUEBQSGQoVUVVFUllfT1BFUkFUSU9OX1JPVVRFEBUSGAoUUVVFUllfT1BFUkFUSU9OX01JTlQQFhIhCh1RVUVSWV9PUEVSQVRJT05fQ1JZUFRPX0tFWUdFThAXEiUKIVFVRVJZX09QRVJBVElPTl9DUllQVE9fU0VBTF9GSUVMRBAYEiwKKFFVRVJZX09QRVJBVElPTl9DUllQVE9fQkxJTkRfSU5ERVhfVE9LRU4QGRIqCiZRVUVSWV9PUEVSQVRJT05fQ1JZUFRPX09XTkVEX1NDT1BFX0tFWRAaEi8KK1FVRVJZX09QRVJBVElPTl9DUllQVE9fT1dORURfREVWSUNFX1JFUVVFU1QQGxIxCi1RVUVSWV9PUEVSQVRJT05fQ1JZUFRPX09XTkVEX1BSRVBBUkVfQVBQUk9WQUwQHBIxCi1RVUVSWV9PUEVSQVRJT05fQ1JZUFRPX09XTkVEX1BSRVBBUkVfUkVDT1ZFUlkQHRIjCh9RVUVSWV9PUEVSQVRJT05fQ1JZUFRPX1dSQVBfS0VZEB4SJQohUVVFUllfT1BFUkFUSU9OX0NSWVBUT19VTldSQVBfS0VZEB8SIQodUVVFUllfT1BFUkFUSU9OX0FVVEhPUl9LRVlHRU4QIBIkCiBRVUVSWV9PUEVSQVRJT05fQVRURVNUQVRJT05fU0lHThAhEiAKHFFVRVJZX09QRVJBVElPTl9SRUNFSVBUX1BBVEgQIhIdChlRVUVSWV9PUEVSQVRJT05fQ0VSVF9TSUdOECMSJQohUVVFUllfT1BFUkFUSU9OX0JJUlRIX1RSVVNUX1NUQVRFECQSIQodUVVFUllfT1BFUkFUSU9OX0VSQV9DRVJUX1NJR04QJRIoCiRRVUVSWV9PUEVSQVRJT05fREVMRUdBVElPTl9DRVJUX1NJR04QJhIpCiVRVUVSWV9PUEVSQVRJT05fQ0FOT05JQ0FMSVpFX0ZST05USUVSECcSKwonUVVFUllfT1BFUkFUSU9OX0NBTk9OSUNBTElaRV9QUk9KRUNUSU9OECgqbAoTS2VybmVsTGF3Q2FwYWJpbGl0eRIlCiFLRVJORUxfTEFXX0NBUEFCSUxJVFlfVU5TUEVDSUZJRUQQABIuCipLRVJORUxfTEFXX0NBUEFCSUxJVFlfU1RBR0VfWkVST19CT09UU1RSQVAQASqoAQoaSW50ZW50VHJhbnNwb3J0UmVxdWlyZW1lbnQSLAooSU5URU5UX1RSQU5TUE9SVF9SRVFVSVJFTUVOVF9VTlNQRUNJRklFRBAAEi4KKklOVEVOVF9UUkFOU1BPUlRfUkVRVUlSRU1FTlRfU0VBTEVEX0NIQU5HRRABEiwKKElOVEVOVF9UUkFOU1BPUlRfUkVRVUlSRU1FTlRfQ09NTUlUX1RSRUUQAiqJAQoVTGlmZWN5Y2xlSW5zdGFsbFBoYXNlEicKI0xJRkVDWUNMRV9JTlNUQUxMX1BIQVNFX1VOU1BFQ0lGSUVEEAASIgoeTElGRUNZQ0xFX0lOU1RBTExfUEhBU0VfQUNUSVZFEAESIwofTElGRUNZQ0xFX0lOU1RBTExfUEhBU0VfUEVORElORxACMlkKEk5vbW9zS2VybmVsU2VydmljZRJDCgRDYWxsEhwubm9tb3Mua2VybmVsLnYxLkNhbGxSZXF1ZXN0Gh0ubm9tb3Mua2VybmVsLnYxLkNhbGxSZXNwb25zZWIGcHJvdG8z");
|
|
6224
6286
|
var CallRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 0);
|
|
6225
6287
|
var CallResponseSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 1);
|
|
6226
6288
|
var WorkspaceTargetSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 15);
|
|
6227
6289
|
var DirectiveCallSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 17);
|
|
6228
6290
|
var AuthoringOptionsSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 18);
|
|
6229
6291
|
var CapturedClockSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 19);
|
|
6230
|
-
var
|
|
6231
|
-
var
|
|
6232
|
-
var
|
|
6233
|
-
var
|
|
6234
|
-
var
|
|
6235
|
-
var
|
|
6236
|
-
var
|
|
6237
|
-
var
|
|
6238
|
-
var
|
|
6239
|
-
var
|
|
6240
|
-
var
|
|
6241
|
-
var
|
|
6242
|
-
var
|
|
6243
|
-
var
|
|
6244
|
-
var
|
|
6245
|
-
var
|
|
6246
|
-
var
|
|
6247
|
-
var
|
|
6248
|
-
var
|
|
6249
|
-
var
|
|
6250
|
-
var
|
|
6251
|
-
var
|
|
6252
|
-
var
|
|
6253
|
-
var
|
|
6254
|
-
var
|
|
6255
|
-
var
|
|
6256
|
-
var
|
|
6257
|
-
var
|
|
6258
|
-
var
|
|
6259
|
-
var
|
|
6260
|
-
var
|
|
6261
|
-
var
|
|
6262
|
-
var
|
|
6292
|
+
var BirthCertificateSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 20);
|
|
6293
|
+
var OfferRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 21);
|
|
6294
|
+
var QueryRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 24);
|
|
6295
|
+
var QueryAuthoritySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 25);
|
|
6296
|
+
var RowsQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 27);
|
|
6297
|
+
var PageQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 28);
|
|
6298
|
+
var ByIdQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 29);
|
|
6299
|
+
var NomosRefSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 30);
|
|
6300
|
+
var ResolveRefsQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 31);
|
|
6301
|
+
var RefFreshnessQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 32);
|
|
6302
|
+
var RefFreshnessCheckSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 33);
|
|
6303
|
+
var TallyQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 34);
|
|
6304
|
+
var SpatialQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 35);
|
|
6305
|
+
var NamedQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 36);
|
|
6306
|
+
var AuthorizationObjectSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 37);
|
|
6307
|
+
var AuthorizationSubjectSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 38);
|
|
6308
|
+
var AuthorizationConsistencySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 40);
|
|
6309
|
+
var AuthorizationCheckRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 42);
|
|
6310
|
+
var OutboxRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 49);
|
|
6311
|
+
var SyncRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 50);
|
|
6312
|
+
var TestRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 51);
|
|
6313
|
+
var SetTestRootRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 52);
|
|
6314
|
+
var CustodyRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 54);
|
|
6315
|
+
var PackDeltaRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 55);
|
|
6316
|
+
var ApplyPackRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 56);
|
|
6317
|
+
var RepoStatsRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 57);
|
|
6318
|
+
var IntentsAboveRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 58);
|
|
6319
|
+
var WriteRefRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 66);
|
|
6320
|
+
var DeleteRefRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 67);
|
|
6321
|
+
var LawClosureInfoRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 70);
|
|
6322
|
+
var CheckpointExportRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 71);
|
|
6323
|
+
var CheckpointImportRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 72);
|
|
6324
|
+
var RestoreMainRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 74);
|
|
6325
|
+
var NomosValueSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 97);
|
|
6326
|
+
var NomosStructSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 100);
|
|
6263
6327
|
var QueryOperationSchema = /* @__PURE__ */ enumDesc(file_nomos_kernel_v1_kernel, 1);
|
|
6264
6328
|
var QueryOperation = /* @__PURE__ */ tsEnum(QueryOperationSchema);
|
|
6329
|
+
var KernelLawCapabilitySchema = /* @__PURE__ */ enumDesc(file_nomos_kernel_v1_kernel, 2);
|
|
6330
|
+
var KernelLawCapability = /* @__PURE__ */ tsEnum(KernelLawCapabilitySchema);
|
|
6331
|
+
var IntentTransportRequirementSchema = /* @__PURE__ */ enumDesc(file_nomos_kernel_v1_kernel, 3);
|
|
6332
|
+
var IntentTransportRequirement = /* @__PURE__ */ tsEnum(IntentTransportRequirementSchema);
|
|
6265
6333
|
|
|
6266
6334
|
// src/kernel_provider_wasm.ts
|
|
6267
6335
|
var enc2 = new TextEncoder();
|
|
6268
6336
|
var dec2 = new TextDecoder();
|
|
6337
|
+
var certificateBytes = (value) => value instanceof Uint8Array ? value : Uint8Array.from(Array.isArray(value) ? value.map(Number) : []);
|
|
6338
|
+
var protoBirthCertificate = (raw) => create(BirthCertificateSchema, {
|
|
6339
|
+
child: String(raw.child ?? ""),
|
|
6340
|
+
founder: String(raw.founder ?? ""),
|
|
6341
|
+
verified: raw.verified === true,
|
|
6342
|
+
parentKey: certificateBytes(raw.parentKey ?? raw.parent_key),
|
|
6343
|
+
parentId: String(raw.parentId ?? raw.parent_id ?? ""),
|
|
6344
|
+
epoch: BigInt(Number(raw.epoch ?? 0)),
|
|
6345
|
+
signature: certificateBytes(raw.signature),
|
|
6346
|
+
verifiedVia: raw.verifiedVia ?? raw.verified_via,
|
|
6347
|
+
idpToken: raw.idpToken ?? raw.idp_token,
|
|
6348
|
+
capturedClock: raw.capturedClock === void 0 && raw.captured_clock === void 0 ? void 0 : BigInt(Number(raw.capturedClock ?? raw.captured_clock)),
|
|
6349
|
+
authProviderIssuer: raw.authProviderIssuer ?? raw.auth_provider_issuer,
|
|
6350
|
+
authProviderJwks: raw.authProviderJwks ?? raw.auth_provider_jwks,
|
|
6351
|
+
authProviderAudience: raw.authProviderAudience ?? raw.auth_provider_audience
|
|
6352
|
+
});
|
|
6269
6353
|
var nmsInternalSnapshotToBase64 = (bytes) => {
|
|
6270
6354
|
if (typeof Buffer !== "undefined") {
|
|
6271
6355
|
return Buffer.from(bytes.buffer, bytes.byteOffset, bytes.byteLength).toString("base64");
|
|
@@ -6329,6 +6413,26 @@ var unsignedWasiPointers = (imports) => {
|
|
|
6329
6413
|
var PROTO_ABI_VERSION = 1;
|
|
6330
6414
|
var protoRequestSequence = 0;
|
|
6331
6415
|
var monotonicMs = () => globalThis.performance?.now?.() ?? Date.now();
|
|
6416
|
+
var KernelRuntimeArtifact = {
|
|
6417
|
+
Executable: "holon.wasm",
|
|
6418
|
+
StageZeroLaw: "bootstrap.law.usdz",
|
|
6419
|
+
ControllerLaw: "nomos.law.usdz"
|
|
6420
|
+
};
|
|
6421
|
+
async function localRuntimeArtifact(artifact) {
|
|
6422
|
+
const runtimeDir = globalThis.process?.env?.NOMOS_LOCAL_RUNTIME_DIR?.replace(/\/+$/, "");
|
|
6423
|
+
if (!runtimeDir) return null;
|
|
6424
|
+
const nodeFsPromises = "node:fs/promises";
|
|
6425
|
+
try {
|
|
6426
|
+
return new Uint8Array(await import(nodeFsPromises).then((fs) => fs.readFile(`${runtimeDir}/${artifact}`)));
|
|
6427
|
+
} catch (cause) {
|
|
6428
|
+
throw new LoadError(`local Nomos runtime is missing ${artifact}`, {
|
|
6429
|
+
code: "nomos.load.runtime_bundle_incomplete",
|
|
6430
|
+
artifact,
|
|
6431
|
+
sourceUrl: runtimeDir,
|
|
6432
|
+
info: cause
|
|
6433
|
+
});
|
|
6434
|
+
}
|
|
6435
|
+
}
|
|
6332
6436
|
function protoValue(value) {
|
|
6333
6437
|
if (value === null || value === void 0) return create(NomosValueSchema, { kind: { case: "null", value: {} } });
|
|
6334
6438
|
if (typeof value === "boolean") return create(NomosValueSchema, { kind: { case: "boolean", value } });
|
|
@@ -6639,6 +6743,7 @@ function providerOperation(mode, rawFields, workBytes) {
|
|
|
6639
6743
|
})
|
|
6640
6744
|
},
|
|
6641
6745
|
authoring,
|
|
6746
|
+
birthCertificate: fields.birthCertificate ? protoBirthCertificate(fields.birthCertificate) : void 0,
|
|
6642
6747
|
lawUsdz: fields.lawClosureFile ? workBytes(String(fields.lawClosureFile)) : new Uint8Array(),
|
|
6643
6748
|
executionLawUsdz: fields.executionLawClosureFile ? workBytes(String(fields.executionLawClosureFile)) : new Uint8Array(),
|
|
6644
6749
|
controllerLawHash: fields.domainHash === void 0 ? void 0 : String(fields.domainHash),
|
|
@@ -6686,7 +6791,7 @@ function providerOperation(mode, rawFields, workBytes) {
|
|
|
6686
6791
|
head: fields.head ? String(fields.head) : void 0
|
|
6687
6792
|
})
|
|
6688
6793
|
};
|
|
6689
|
-
else if (mode === "pack_delta") custody = { case: "packDelta", value: create(PackDeltaRequestSchema, { repo: String(fields.repoArg ?? ""), base: fields.base ? String(fields.base) : void 0, head: fields.head ? String(fields.head) : void 0, branch: String(fields.branch ?? "main") }) };
|
|
6794
|
+
else if (mode === "pack_delta") custody = { case: "packDelta", value: create(PackDeltaRequestSchema, { repo: String(fields.repoArg ?? ""), base: fields.base ? String(fields.base) : void 0, head: fields.head ? String(fields.head) : void 0, branch: String(fields.branch ?? "main"), stagedPackFile: fields.stagedPackFile ? String(fields.stagedPackFile) : void 0 }) };
|
|
6690
6795
|
else if (mode === "intents_above") custody = { case: "intentsAbove", value: create(IntentsAboveRequestSchema, { repo: String(fields.repoArg ?? ""), base: fields.base ? String(fields.base) : void 0, head: fields.head ? String(fields.head) : void 0, branch: String(fields.branch ?? "main"), limit: BigInt(Number(fields.limit ?? 0)), completeLogical: fields.completeLogical === true, compactStored: fields.compactStored === true }) };
|
|
6691
6796
|
else if (mode === "checkpoint_export") custody = { case: "checkpointExport", value: create(CheckpointExportRequestSchema, { target, stagedFrontierFile: fields.stagedFrontierFile ? String(fields.stagedFrontierFile) : void 0 }) };
|
|
6692
6797
|
else if (mode === "checkpoint_import") custody = {
|
|
@@ -6719,14 +6824,20 @@ function nmsInternalReportProviderTransport(host, encoded, phases, responseBytes
|
|
|
6719
6824
|
})}`);
|
|
6720
6825
|
}
|
|
6721
6826
|
function nmsInternalEncodeProviderCall(mode, fields, workBytes, requestPrefix = "browser") {
|
|
6827
|
+
return nmsInternalEncodeTypedProviderCall(
|
|
6828
|
+
providerOperation(mode, fields, workBytes),
|
|
6829
|
+
requestPrefix
|
|
6830
|
+
);
|
|
6831
|
+
}
|
|
6832
|
+
function nmsInternalEncodeTypedProviderCall(operation, requestPrefix = "browser") {
|
|
6722
6833
|
const started = monotonicMs();
|
|
6723
6834
|
const requestId = `${requestPrefix}-${++protoRequestSequence}`;
|
|
6724
6835
|
const bytes = toBinary(CallRequestSchema, create(CallRequestSchema, {
|
|
6725
6836
|
protocolVersion: PROTO_ABI_VERSION,
|
|
6726
6837
|
requestId,
|
|
6727
|
-
operation
|
|
6838
|
+
operation
|
|
6728
6839
|
}));
|
|
6729
|
-
return { requestId, mode, bytes, encodeMs: monotonicMs() - started };
|
|
6840
|
+
return { requestId, mode: operation.case || "empty", bytes, encodeMs: monotonicMs() - started };
|
|
6730
6841
|
}
|
|
6731
6842
|
function nmsInternalDecodeProviderResponse(bytes, requestId, stderr = []) {
|
|
6732
6843
|
const response = fromBinary(CallResponseSchema, bytes);
|
|
@@ -6765,13 +6876,15 @@ function nmsInternalDecodeProviderResponse(bytes, requestId, stderr = []) {
|
|
|
6765
6876
|
case "applyPack":
|
|
6766
6877
|
return JSON.stringify({ ok: true, objects: Number(result.value.objectCount), packHash: result.value.packHash });
|
|
6767
6878
|
case "packDelta":
|
|
6768
|
-
return JSON.stringify({ ok: true, bytes: result.value.pack.length, packB64: nmsInternalSnapshotToBase64(result.value.pack) });
|
|
6879
|
+
return JSON.stringify({ ok: true, bytes: Number(result.value.bytes || BigInt(result.value.pack.length)), ...result.value.pack.length ? { packB64: nmsInternalSnapshotToBase64(result.value.pack) } : {} });
|
|
6769
6880
|
case "intentsAbove":
|
|
6770
|
-
return JSON.stringify({ ok: true, intents: result.value.intents.map((intent) => ({ oid: intent.oid, id: intent.intentId, domain: intent.domain, directiveId: intent.directive, changeB64: nmsInternalSnapshotToBase64(intent.changeUsda), ...jsStruct(intent.semantic) })) });
|
|
6881
|
+
return JSON.stringify({ ok: true, intents: result.value.intents.map((intent) => ({ oid: intent.oid, id: intent.intentId, domain: intent.domain, directiveId: intent.directive, changeB64: nmsInternalSnapshotToBase64(intent.changeUsda), transportRequirement: intent.transportRequirement, ...jsStruct(intent.semantic) })) });
|
|
6771
6882
|
case "checkpointExport":
|
|
6772
6883
|
return JSON.stringify({ ok: true, empty: result.value.empty, cursor: result.value.cursor, frontier: result.value.frontier.length ? nmsInternalSnapshotToBase64(result.value.frontier) : void 0, stateRoot: result.value.stateRoot, stateTree: result.value.stateTree, pinned: result.value.pinned, readIndexSnapshot: result.value.readIndexSnapshot, readIndexSnapshotPending: result.value.readIndexSnapshotPending, readIndexSqliteBytes: result.value.readIndexSqliteBytes === void 0 ? void 0 : Number(result.value.readIndexSqliteBytes), readIndexCustodyBytes: result.value.readIndexCustodyBytes === void 0 ? void 0 : Number(result.value.readIndexCustodyBytes) });
|
|
6773
6884
|
case "checkpointImport":
|
|
6774
6885
|
return JSON.stringify({ ok: true, restored: result.value.restored, reason: result.value.reason, frontierSeeded: result.value.frontierSeeded, frontierVerificationPending: result.value.frontierVerificationPending, aggregates: Number(result.value.aggregateCount), kernelSpans: jsStruct(result.value.spans), cursor: result.value.cursor, readOnly: result.value.readOnly, lazyReadIndex: result.value.lazyReadIndex });
|
|
6886
|
+
case "lawClosureInfo":
|
|
6887
|
+
return JSON.stringify({ ok: true, identity: result.value.identity, domains: result.value.domainKeys });
|
|
6775
6888
|
case "writeRef":
|
|
6776
6889
|
case "deleteRef":
|
|
6777
6890
|
return JSON.stringify({ ok: true });
|
|
@@ -6787,7 +6900,13 @@ var wasmModuleCache = /* @__PURE__ */ new Map();
|
|
|
6787
6900
|
function wasmModuleFor(base, fetchImpl) {
|
|
6788
6901
|
let p = wasmModuleCache.get(base);
|
|
6789
6902
|
if (!p) {
|
|
6903
|
+
const localRuntimeDir = globalThis.process?.env?.NOMOS_LOCAL_RUNTIME_DIR;
|
|
6790
6904
|
const localWasm = globalThis.process?.env?.NOMOS_LOCAL_WASM;
|
|
6905
|
+
if (localRuntimeDir) {
|
|
6906
|
+
p = localRuntimeArtifact(KernelRuntimeArtifact.Executable).then((bytes) => WebAssembly.compile(new Uint8Array(bytes).buffer));
|
|
6907
|
+
wasmModuleCache.set(base, p);
|
|
6908
|
+
return p;
|
|
6909
|
+
}
|
|
6791
6910
|
if (localWasm) {
|
|
6792
6911
|
const nodeFsPromises = "node:fs/promises";
|
|
6793
6912
|
p = import(nodeFsPromises).then((fs) => fs.readFile(localWasm)).then((b) => WebAssembly.compile(b));
|
|
@@ -6860,15 +6979,26 @@ function createWasmEnginePlane({ span } = {}) {
|
|
|
6860
6979
|
root = /* @__PURE__ */ new Map();
|
|
6861
6980
|
wsParent = new Directory(/* @__PURE__ */ new Map());
|
|
6862
6981
|
root.set("ws", wsParent);
|
|
6863
|
-
|
|
6864
|
-
const
|
|
6865
|
-
|
|
6866
|
-
|
|
6867
|
-
|
|
6868
|
-
if (
|
|
6869
|
-
|
|
6870
|
-
|
|
6871
|
-
|
|
6982
|
+
const loadRuntimeLaw = async (artifact) => {
|
|
6983
|
+
const local = await localRuntimeArtifact(artifact);
|
|
6984
|
+
if (local) return local;
|
|
6985
|
+
const sourceUrl = `${base}/v1/runtime/${artifact}`;
|
|
6986
|
+
const response = await fetchImpl(sourceUrl, { headers: authHeaders });
|
|
6987
|
+
if (!response?.ok) {
|
|
6988
|
+
throw new LoadError(`runtime package fetch ${response?.status ?? "failed"}`, {
|
|
6989
|
+
code: "nomos.load.runtime_package_fetch_failed",
|
|
6990
|
+
artifact,
|
|
6991
|
+
sourceUrl
|
|
6992
|
+
});
|
|
6993
|
+
}
|
|
6994
|
+
return new Uint8Array(await response.arrayBuffer());
|
|
6995
|
+
};
|
|
6996
|
+
const [bootstrapLaw, controllerLaw] = await Promise.all([
|
|
6997
|
+
loadRuntimeLaw(KernelRuntimeArtifact.StageZeroLaw),
|
|
6998
|
+
loadRuntimeLaw(KernelRuntimeArtifact.ControllerLaw)
|
|
6999
|
+
]);
|
|
7000
|
+
root.set(KernelRuntimeArtifact.StageZeroLaw, new File(bootstrapLaw));
|
|
7001
|
+
root.set(KernelRuntimeArtifact.ControllerLaw, new File(controllerLaw));
|
|
6872
7002
|
preopen = new PreopenDirectory("/work", root);
|
|
6873
7003
|
fs = makeGitFs(preopen, "/work", { File, Directory });
|
|
6874
7004
|
const _bootInst = _span("receive", "boot: instantiate holon (wasm)", "boot");
|
|
@@ -6888,6 +7018,22 @@ function createWasmEnginePlane({ span } = {}) {
|
|
|
6888
7018
|
throw new Error(`holon refused to start (exit ${code}): ${STDERR.join("\n")}`);
|
|
6889
7019
|
}
|
|
6890
7020
|
ex = inst.exports;
|
|
7021
|
+
protoTransportCall(
|
|
7022
|
+
ex,
|
|
7023
|
+
nmsInternalEncodeTypedProviderCall({
|
|
7024
|
+
case: "custody",
|
|
7025
|
+
value: create(CustodyRequestSchema, {
|
|
7026
|
+
operation: {
|
|
7027
|
+
case: "lawClosureInfo",
|
|
7028
|
+
value: create(LawClosureInfoRequestSchema, {
|
|
7029
|
+
closureFile: `/work/${KernelRuntimeArtifact.StageZeroLaw}`,
|
|
7030
|
+
capability: KernelLawCapability.STAGE_ZERO_BOOTSTRAP
|
|
7031
|
+
})
|
|
7032
|
+
}
|
|
7033
|
+
})
|
|
7034
|
+
}, "browser-boot"),
|
|
7035
|
+
STDERR
|
|
7036
|
+
);
|
|
6891
7037
|
_bootInst.end();
|
|
6892
7038
|
})();
|
|
6893
7039
|
return bootPromise;
|
|
@@ -7199,6 +7345,26 @@ function pkt(payload) {
|
|
|
7199
7345
|
return concatBytes([enc3.encode(len), body]);
|
|
7200
7346
|
}
|
|
7201
7347
|
var FLUSH = enc3.encode("0000");
|
|
7348
|
+
function receivePackCommandPrefix(updates) {
|
|
7349
|
+
const cmds = [];
|
|
7350
|
+
updates.forEach((u, i) => {
|
|
7351
|
+
const old = u.oldOid || ZERO_OID;
|
|
7352
|
+
const neu = u.newOid || ZERO_OID;
|
|
7353
|
+
const caps = i === 0 ? "\0report-status" : "";
|
|
7354
|
+
cmds.push(pkt(`${old} ${neu} ${u.ref}${caps}
|
|
7355
|
+
`));
|
|
7356
|
+
});
|
|
7357
|
+
cmds.push(FLUSH);
|
|
7358
|
+
return concatBytes(cmds);
|
|
7359
|
+
}
|
|
7360
|
+
function assertReceivePackAccepted(status, response, updates) {
|
|
7361
|
+
const txt = dec3.decode(response);
|
|
7362
|
+
const unpacked = /unpack ok/.test(txt);
|
|
7363
|
+
const everyRefOk = updates.every((u) => new RegExp(`ok ${u.ref.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}`).test(txt));
|
|
7364
|
+
if (!(status >= 200 && status < 300 && unpacked && everyRefOk && !/\bng /.test(txt))) {
|
|
7365
|
+
throw new Error(`receive-pack ${status}: ${txt.replace(/[^\x20-\x7e]/g, " ").trim().slice(0, 200)}`);
|
|
7366
|
+
}
|
|
7367
|
+
}
|
|
7202
7368
|
function readPktLines(buf, off = 0) {
|
|
7203
7369
|
const lines = [];
|
|
7204
7370
|
while (off + 4 <= buf.length) {
|
|
@@ -7241,16 +7407,7 @@ async function lsRefs(remote, headers = {}, { service = "git-upload-pack", prefi
|
|
|
7241
7407
|
}
|
|
7242
7408
|
async function pushPack(remote, headers = {}, { updates = [], pack = null } = {}, fetchImpl = fetch) {
|
|
7243
7409
|
if (!updates.length) return { ok: true, noop: true };
|
|
7244
|
-
const
|
|
7245
|
-
updates.forEach((u, i) => {
|
|
7246
|
-
const old = u.oldOid || ZERO_OID;
|
|
7247
|
-
const neu = u.newOid || ZERO_OID;
|
|
7248
|
-
const caps = i === 0 ? "\0report-status" : "";
|
|
7249
|
-
cmds.push(pkt(`${old} ${neu} ${u.ref}${caps}
|
|
7250
|
-
`));
|
|
7251
|
-
});
|
|
7252
|
-
cmds.push(FLUSH);
|
|
7253
|
-
const body = concatBytes([...cmds, pack && pack.length ? pack : EMPTY_PACK]);
|
|
7410
|
+
const body = concatBytes([receivePackCommandPrefix(updates), pack && pack.length ? pack : EMPTY_PACK]);
|
|
7254
7411
|
let r;
|
|
7255
7412
|
try {
|
|
7256
7413
|
r = await fetchImpl(`${remote}/git-receive-pack`, {
|
|
@@ -7261,12 +7418,7 @@ async function pushPack(remote, headers = {}, { updates = [], pack = null } = {}
|
|
|
7261
7418
|
} catch (error) {
|
|
7262
7419
|
throw new Error(`receive-pack transport failed (${body.byteLength} bytes): ${String(error)}`, { cause: error });
|
|
7263
7420
|
}
|
|
7264
|
-
|
|
7265
|
-
const unpacked = /unpack ok/.test(txt);
|
|
7266
|
-
const everyRefOk = updates.every((u) => new RegExp(`ok ${u.ref.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}`).test(txt));
|
|
7267
|
-
if (!(r.ok && unpacked && everyRefOk && !/\bng /.test(txt))) {
|
|
7268
|
-
throw new Error(`receive-pack ${r.status}: ${txt.replace(/[^\x20-\x7e]/g, " ").trim().slice(0, 200)}`);
|
|
7269
|
-
}
|
|
7421
|
+
assertReceivePackAccepted(r.status, new Uint8Array(await r.arrayBuffer()), updates);
|
|
7270
7422
|
return { ok: true };
|
|
7271
7423
|
}
|
|
7272
7424
|
|
|
@@ -7732,21 +7884,18 @@ function createGovernanceOffers(ctx) {
|
|
|
7732
7884
|
* relay as `{ intentBytes }`. `domain` defaults to "workspaces". The signature is verified by the kernel.
|
|
7733
7885
|
* @returns {Promise<SealedOffer>}
|
|
7734
7886
|
*/
|
|
7735
|
-
signGovernanceOffer: ({ domain, directiveId, payload, authorSecret, actor, domainHash, lawUsdz } = {}) => {
|
|
7887
|
+
signGovernanceOffer: ({ domain, directiveId, payload, authorSecret, actor, domainHash, lawUsdz, birthCertificate } = {}) => {
|
|
7736
7888
|
if (!directiveId || typeof directiveId !== "string") throw new Error("signGovernanceOffer requires a governance directiveId");
|
|
7737
7889
|
if (!authorSecret || typeof authorSecret !== "string") throw new Error("signGovernanceOffer requires the requester's device `authorSecret` (base64 from authorKeygen) \u2014 the signature IS the authorization");
|
|
7738
7890
|
if (!actor || typeof actor !== "string") throw new Error("signGovernanceOffer requires `actor` (the subject the key authors as, e.g. `user:<uid>`)");
|
|
7739
|
-
return offerDirective(domain || "workspaces", directiveId, payload ?? {}, { domainHash, actor, signWith: authorSecret, lawUsdz, returnSealed: true });
|
|
7891
|
+
return offerDirective(domain || "workspaces", directiveId, payload ?? {}, { domainHash, actor, signWith: authorSecret, lawUsdz, birthCertificate, returnSealed: true });
|
|
7740
7892
|
},
|
|
7741
|
-
/**
|
|
7742
|
-
* Build the `enrollSigner` payload that binds a device key to a principal (`keyHash = sha256(pubkey)`).
|
|
7743
|
-
*/
|
|
7893
|
+
/** Build the self-binding `enrollSigner` payload (`keyHash = sha256(pubkey)`). */
|
|
7744
7894
|
enrollSignerPayload: ({ principal, publicKey, grantedBy, grantedAt } = {}) => serialize(async () => {
|
|
7745
7895
|
if (!principal || typeof principal !== "string") throw new Error("enrollSignerPayload requires the auth-provider `principal` uid the key may author as");
|
|
7746
7896
|
if (!publicKey || typeof publicKey !== "string") throw new Error("enrollSignerPayload requires the device `publicKey` (base64 from authorKeygen)");
|
|
7747
7897
|
const p = canonicalPrincipal(principal);
|
|
7748
7898
|
return {
|
|
7749
|
-
principal: p,
|
|
7750
7899
|
keyHash: await sha256hexBytes2(bytesUnb642(publicKey)),
|
|
7751
7900
|
grantedBy: canonicalPrincipal(grantedBy || p),
|
|
7752
7901
|
grantedAt: typeof grantedAt === "number" ? grantedAt : Date.now()
|
|
@@ -8291,6 +8440,9 @@ async function sha256hex(t) {
|
|
|
8291
8440
|
const b = await crypto.subtle.digest("SHA-256", enc4.encode(t));
|
|
8292
8441
|
return [...new Uint8Array(b)].map((x) => x.toString(16).padStart(2, "0")).join("");
|
|
8293
8442
|
}
|
|
8443
|
+
async function nmsInternalCandidateSessionRef(clientId) {
|
|
8444
|
+
return `refs/heads/session/${await sha256hex(`nomos-candidate-session:${clientId}`)}`;
|
|
8445
|
+
}
|
|
8294
8446
|
async function sha256hexBytes(bytes) {
|
|
8295
8447
|
const b = await crypto.subtle.digest("SHA-256", bytes);
|
|
8296
8448
|
return [...new Uint8Array(b)].map((x) => x.toString(16).padStart(2, "0")).join("");
|
|
@@ -8446,7 +8598,8 @@ ${String(commit).toLowerCase()}`;
|
|
|
8446
8598
|
const remote = `${base}/v2/workspaces/${workspace}/git`;
|
|
8447
8599
|
const cid = clientId || [...crypto.getRandomValues(new Uint8Array(8))].map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
8448
8600
|
const replica = await replicaIdFromValue(`client:${cid}`);
|
|
8449
|
-
|
|
8601
|
+
let activeAuthToken = authToken;
|
|
8602
|
+
let authHeaders = packAuthHeaders({ authToken: activeAuthToken, principal });
|
|
8450
8603
|
let _spanSeq = 0;
|
|
8451
8604
|
const span = (track, name, kind, extra = {}) => {
|
|
8452
8605
|
if (typeof onSpan !== "function") return { end: () => {
|
|
@@ -8826,7 +8979,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
8826
8979
|
activeHolonCall = null;
|
|
8827
8980
|
}
|
|
8828
8981
|
};
|
|
8829
|
-
const tokenSubject = jwtClaim(
|
|
8982
|
+
const tokenSubject = jwtClaim(activeAuthToken || "", "sub");
|
|
8830
8983
|
const connectionPrincipal = canonicalPrincipal(
|
|
8831
8984
|
typeof principal === "string" && principal ? principal : typeof tokenSubject === "string" ? tokenSubject : ""
|
|
8832
8985
|
);
|
|
@@ -8834,8 +8987,8 @@ ${String(commit).toLowerCase()}`;
|
|
|
8834
8987
|
const out = {};
|
|
8835
8988
|
const pr = typeof p === "string" && p ? p : connectionPrincipal;
|
|
8836
8989
|
if (pr) out.principal = pr;
|
|
8837
|
-
if (
|
|
8838
|
-
out.authToken =
|
|
8990
|
+
if (activeAuthToken) {
|
|
8991
|
+
out.authToken = activeAuthToken;
|
|
8839
8992
|
out.nowUnix = Math.floor(Date.now() / 1e3);
|
|
8840
8993
|
}
|
|
8841
8994
|
if (deviceSecret) out.authorSecret = deviceSecret;
|
|
@@ -8883,6 +9036,9 @@ ${String(commit).toLowerCase()}`;
|
|
|
8883
9036
|
"spec.installedBy": domain.installedBy,
|
|
8884
9037
|
"spec.authorityScope": domain.authorityScope,
|
|
8885
9038
|
"spec.supersedes": domain.supersedes,
|
|
9039
|
+
"spec.lawClosureIdentity": domain.lawClosureIdentity,
|
|
9040
|
+
"spec.dependencies": Array.isArray(domain.dependencies) ? domain.dependencies : [],
|
|
9041
|
+
"spec.domainKeys": Array.isArray(domain.domainKeys) ? domain.domainKeys : [],
|
|
8886
9042
|
"status.phase": domain.phase,
|
|
8887
9043
|
"status.supersededBy": domain.supersededBy,
|
|
8888
9044
|
"metadata.generation": domain.generation
|
|
@@ -8968,33 +9124,41 @@ ${String(commit).toLowerCase()}`;
|
|
|
8968
9124
|
return intentsAbove(head, baseHead).map((it) => ({ session: cid, oid: it.oid.slice(0, 10), changeB64: it.changeB64 }));
|
|
8969
9125
|
}
|
|
8970
9126
|
async function pushCandidateCustody(head, baseHead) {
|
|
8971
|
-
|
|
8972
|
-
throw new Error(
|
|
8973
|
-
"this kernel provider cannot transport an offer's auxiliary Git custody; use the WASI client/CLI or upgrade the native provider"
|
|
8974
|
-
);
|
|
8975
|
-
}
|
|
8976
|
-
const sessionRef = `refs/heads/session/${cid}`;
|
|
9127
|
+
const sessionRef = await nmsInternalCandidateSessionRef(cid);
|
|
8977
9128
|
const refs = await lsRefs(remote, authHeaders, {
|
|
8978
9129
|
service: "git-receive-pack",
|
|
8979
9130
|
prefix: sessionRef
|
|
8980
9131
|
}, _fetch);
|
|
8981
9132
|
const oldOid = refs[sessionRef] || ZERO_OID;
|
|
8982
|
-
|
|
8983
|
-
if (oldOid !== ZERO_OID)
|
|
8984
|
-
|
|
8985
|
-
|
|
8986
|
-
|
|
8987
|
-
|
|
8988
|
-
|
|
9133
|
+
const bases = [];
|
|
9134
|
+
if (oldOid !== ZERO_OID) bases.push(oldOid);
|
|
9135
|
+
if (baseHead && !bases.includes(baseHead)) bases.push(baseHead);
|
|
9136
|
+
bases.push(null);
|
|
9137
|
+
if (typeof provider.pushPackDelta === "function") {
|
|
9138
|
+
const pushed = await provider.pushPackDelta({
|
|
9139
|
+
remote,
|
|
9140
|
+
headers: authHeaders,
|
|
9141
|
+
ref: sessionRef,
|
|
9142
|
+
oldOid,
|
|
9143
|
+
head,
|
|
9144
|
+
bases
|
|
9145
|
+
});
|
|
9146
|
+
return { ref: sessionRef, bytes: pushed.bytes };
|
|
9147
|
+
}
|
|
9148
|
+
if (typeof provider.packDelta !== "function") {
|
|
9149
|
+
throw new Error(
|
|
9150
|
+
"this kernel provider cannot transport an offer's auxiliary Git custody; upgrade the provider"
|
|
9151
|
+
);
|
|
8989
9152
|
}
|
|
8990
|
-
|
|
9153
|
+
let pack = null;
|
|
9154
|
+
for (const base2 of bases) {
|
|
8991
9155
|
try {
|
|
8992
|
-
pack = provider.packDelta(
|
|
9156
|
+
pack = provider.packDelta(base2, head);
|
|
8993
9157
|
} catch {
|
|
8994
9158
|
pack = null;
|
|
8995
9159
|
}
|
|
9160
|
+
if (pack) break;
|
|
8996
9161
|
}
|
|
8997
|
-
if (!pack) pack = provider.packDelta("", head);
|
|
8998
9162
|
if (!pack) throw new Error("the kernel could not build the candidate custody pack");
|
|
8999
9163
|
await pushPack(remote, authHeaders, {
|
|
9000
9164
|
updates: [{ ref: sessionRef, oldOid, newOid: head }],
|
|
@@ -9353,7 +9517,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
9353
9517
|
}
|
|
9354
9518
|
}
|
|
9355
9519
|
}
|
|
9356
|
-
const offerDirective = (domain, directiveId, payload, { domainHash, actor = "", signWith, authTokenOverride, returnSealed = false, returnCreated = false, lawUsdz, __nomosConflictSnapshots, __nomosCorrectionAuthority, force = false } = {}) => {
|
|
9520
|
+
const offerDirective = (domain, directiveId, payload, { domainHash, actor = "", signWith, authTokenOverride, returnSealed = false, returnCreated = false, lawUsdz, birthCertificate, __nomosConflictSnapshots, __nomosCorrectionAuthority, force = false } = {}) => {
|
|
9357
9521
|
if (directiveId === BUSINESS_CORRECTION_DIRECTIVE && __nomosCorrectionAuthority !== BUSINESS_CORRECTION_AUTHORITY) {
|
|
9358
9522
|
throw new Error("Nomos business corrections are private framework law; use the generated corrections.undo(reason) / corrections.redo(reason) surface");
|
|
9359
9523
|
}
|
|
@@ -9403,6 +9567,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
9403
9567
|
// key cannot already be present in the signer relation by definition.
|
|
9404
9568
|
...authTokenOverride ? { principal: actor, authToken: authTokenOverride, nowUnix: Math.floor(Date.now() / 1e3) } : readAuthFields(void 0, actor),
|
|
9405
9569
|
...lawClosureFile ? { lawClosureFile } : {},
|
|
9570
|
+
...birthCertificate ? { birthCertificate } : {},
|
|
9406
9571
|
// SIGN THE WRITE (the write-pin): a client-held device secret makes the author door mint the
|
|
9407
9572
|
// signed-author attestation; a warranted workspace's gate requires it. Absent ⇒ unsigned (era-safe).
|
|
9408
9573
|
// A per-author `signWith` (e.g. a governance signing key) overrides the connect-time device secret.
|
|
@@ -9458,7 +9623,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
9458
9623
|
const bcm = /birth-unattestable \(([^)]+)\)/.exec(String(res.error || ""));
|
|
9459
9624
|
const certSecret = signWith || deviceSecret;
|
|
9460
9625
|
const p = payload;
|
|
9461
|
-
if (bcm && bcm[1] && certSecret && actor && p && typeof p === "object"
|
|
9626
|
+
if (bcm && bcm[1] && certSecret && actor && p && typeof p === "object") {
|
|
9462
9627
|
const child = bcm[1];
|
|
9463
9628
|
const derived = JSON.parse(call("query", { queryBytes: qBytes({ op: "attestationSign", secret: certSecret, asserterWorkspace: "derive", object: "derive:public", relation: "derive", subject: "user:derive", attestedAt: "1970-01-01T00:00:00.000Z" }) }));
|
|
9464
9629
|
const devicePub = derived && derived.publicKey;
|
|
@@ -9645,25 +9810,10 @@ ${String(commit).toLowerCase()}`;
|
|
|
9645
9810
|
if (!frontierTrustStateAvailable) call("query", { queryBytes: qBytes({ op: "byId", aggregateId: "genesis-warrant:self" }) });
|
|
9646
9811
|
}
|
|
9647
9812
|
}
|
|
9648
|
-
|
|
9649
|
-
let certified = {
|
|
9650
|
-
...p,
|
|
9651
|
-
ownerKeyHash: p.ownerKeyHash || keyHash,
|
|
9652
|
-
birthCert: JSON.stringify(sign(Boolean(__testRootSecret)))
|
|
9653
|
-
};
|
|
9654
|
-
envelope.payload = { domain, directiveId, payload: certified };
|
|
9813
|
+
envelope.payload = { domain, directiveId, payload: p };
|
|
9655
9814
|
writeWork(`envelope-${s}.json`, enc4.encode(stringifyBig(envelope)));
|
|
9656
9815
|
raw = authorViaOffer(authorArgs);
|
|
9657
9816
|
res = JSON.parse(raw);
|
|
9658
|
-
const verdictMismatch = res && res.ok === false ? /cert verified=(true|false) != the gate verdict verified=(true|false)/.exec(String(res.error || "")) : null;
|
|
9659
|
-
if (verdictMismatch) {
|
|
9660
|
-
const gateVerified = verdictMismatch[2] === "true";
|
|
9661
|
-
certified = { ...p, ownerKeyHash: p.ownerKeyHash || keyHash, birthCert: JSON.stringify(sign(gateVerified)) };
|
|
9662
|
-
envelope.payload = { domain, directiveId, payload: certified };
|
|
9663
|
-
writeWork(`envelope-${s}.json`, enc4.encode(stringifyBig(envelope)));
|
|
9664
|
-
raw = authorViaOffer(authorArgs);
|
|
9665
|
-
res = JSON.parse(raw);
|
|
9666
|
-
}
|
|
9667
9817
|
}
|
|
9668
9818
|
}
|
|
9669
9819
|
}
|
|
@@ -9716,7 +9866,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
9716
9866
|
}
|
|
9717
9867
|
const birth = res.born ? { born: res.born } : {};
|
|
9718
9868
|
const birthOut = res.birthOutcomes ? { birthOutcomes: res.birthOutcomes } : {};
|
|
9719
|
-
return returnSealed ? { head: res.head, intentBytes: sealedB64, ...birth, ...birthOut } : returnCreated ? { head: res.head, created, affected, workspace, ...birth, ...birthOut } : res.head;
|
|
9869
|
+
return returnSealed ? { head: res.head, intentBytes: sealedB64, ...birth, ...birthOut } : returnCreated ? { head: res.head, intentId: res.intentId, created, affected, workspace, ...birth, ...birthOut } : res.head;
|
|
9720
9870
|
}, `offerDirective:${domain}.${directiveId}`);
|
|
9721
9871
|
};
|
|
9722
9872
|
const _nomosAdoptModel = async (domain, candidateHash, opts = {}) => {
|
|
@@ -9730,6 +9880,17 @@ ${String(commit).toLowerCase()}`;
|
|
|
9730
9880
|
if (!domain.trim() || !candidateHash.trim()) {
|
|
9731
9881
|
return { ok: false, stage: "preflight", error: "the generated model identity is missing" };
|
|
9732
9882
|
}
|
|
9883
|
+
const candidateInstallation = installRowsInner().find(
|
|
9884
|
+
(row) => row?.id === `domain-installation:${candidateHash}`
|
|
9885
|
+
);
|
|
9886
|
+
const candidatePhase = String(candidateInstallation?.data?.["status.phase"] ?? "");
|
|
9887
|
+
if (candidatePhase !== "Pending") {
|
|
9888
|
+
return {
|
|
9889
|
+
ok: false,
|
|
9890
|
+
stage: candidatePhase.length === 0 ? "staging-required" : "preflight",
|
|
9891
|
+
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}', not a staged successor of the current model`
|
|
9892
|
+
};
|
|
9893
|
+
}
|
|
9733
9894
|
let report;
|
|
9734
9895
|
try {
|
|
9735
9896
|
report = await serialize(async () => {
|
|
@@ -9756,6 +9917,13 @@ ${String(commit).toLowerCase()}`;
|
|
|
9756
9917
|
returnCreated: false
|
|
9757
9918
|
});
|
|
9758
9919
|
const head = typeof outcome === "string" ? outcome : String(outcome?.head ?? "");
|
|
9920
|
+
const readiness = await prepareDomainReady(domain, candidateHash);
|
|
9921
|
+
if (readiness.prepared !== true) {
|
|
9922
|
+
throw Object.assign(
|
|
9923
|
+
new Error(`the promoted model '${candidateHash}' is active but its authenticated '${domain}' USDA slice is not ready`),
|
|
9924
|
+
{ code: "nomos.model.readiness_failed" }
|
|
9925
|
+
);
|
|
9926
|
+
}
|
|
9759
9927
|
recomputeCompat();
|
|
9760
9928
|
return {
|
|
9761
9929
|
ok: true,
|
|
@@ -9774,6 +9942,57 @@ ${String(commit).toLowerCase()}`;
|
|
|
9774
9942
|
};
|
|
9775
9943
|
}
|
|
9776
9944
|
};
|
|
9945
|
+
const _nomosModelInstallation = (domain, candidateHash) => {
|
|
9946
|
+
const row = installRowsInner()?.find(
|
|
9947
|
+
(entry) => entry?.id === `domain-installation:${candidateHash}`
|
|
9948
|
+
);
|
|
9949
|
+
const data = row?.data;
|
|
9950
|
+
const domainKeys = Array.isArray(data?.["spec.domainKeys"]) ? data["spec.domainKeys"].map(String) : [];
|
|
9951
|
+
if (!data || !domainKeys.includes(domain)) return null;
|
|
9952
|
+
return {
|
|
9953
|
+
hash: candidateHash,
|
|
9954
|
+
phase: String(data["status.phase"] ?? ""),
|
|
9955
|
+
dependencies: Array.isArray(data["spec.dependencies"]) ? data["spec.dependencies"].map(String) : [],
|
|
9956
|
+
domainKeys
|
|
9957
|
+
};
|
|
9958
|
+
};
|
|
9959
|
+
const _nomosStageGeneratedModel = async (domain, candidateHash, lawUsdz, dependencies) => {
|
|
9960
|
+
if (!connectionPrincipal) {
|
|
9961
|
+
throw new Error("generated model staging needs the signed-in session");
|
|
9962
|
+
}
|
|
9963
|
+
const rows = installRowsInner() ?? [];
|
|
9964
|
+
const existing = rows.find(
|
|
9965
|
+
(entry) => entry?.id === `domain-installation:${candidateHash}`
|
|
9966
|
+
);
|
|
9967
|
+
const existingPhase = String(existing?.data?.["status.phase"] ?? "");
|
|
9968
|
+
if (existingPhase === "Active" || existingPhase === "Pending") {
|
|
9969
|
+
return { ok: true, status: existingPhase.toLowerCase(), candidateHash };
|
|
9970
|
+
}
|
|
9971
|
+
if (!(lawUsdz instanceof Uint8Array) || lawUsdz.byteLength === 0) {
|
|
9972
|
+
throw new Error(`generated model '${candidateHash}' has no USDZ transport asset`);
|
|
9973
|
+
}
|
|
9974
|
+
const predecessor = rows.find((entry) => {
|
|
9975
|
+
const data = entry?.data;
|
|
9976
|
+
return String(data?.["status.phase"] ?? "") === "Active" && Array.isArray(data?.["spec.domainKeys"]) && data["spec.domainKeys"].map(String).includes(domain);
|
|
9977
|
+
});
|
|
9978
|
+
const priorHash = String(predecessor?.data?.["spec.domainHash"] ?? "");
|
|
9979
|
+
if (!priorHash) {
|
|
9980
|
+
throw new Error(`generated application cannot identify the active '${domain}' model it would supersede`);
|
|
9981
|
+
}
|
|
9982
|
+
const inheritedDependencies = Array.isArray(dependencies) ? dependencies : Array.isArray(predecessor?.data?.["spec.dependencies"]) ? predecessor.data["spec.dependencies"].map(String) : [];
|
|
9983
|
+
const head = await offerDirective("nomos", "stageDomain", {
|
|
9984
|
+
domainHash: candidateHash,
|
|
9985
|
+
installedBy: "generated-application",
|
|
9986
|
+
lawClosureIdentity: candidateHash,
|
|
9987
|
+
dependencies: [...new Set(inheritedDependencies.map(String))].sort(),
|
|
9988
|
+
supersedes: priorHash,
|
|
9989
|
+
finalizers: []
|
|
9990
|
+
}, {
|
|
9991
|
+
actor: connectionPrincipal,
|
|
9992
|
+
lawUsdz
|
|
9993
|
+
});
|
|
9994
|
+
return { ok: true, status: "pending", candidateHash, head };
|
|
9995
|
+
};
|
|
9777
9996
|
const _nomosRestorePreviousModel = async (domain, currentHash, opts = {}) => {
|
|
9778
9997
|
if (!connectionPrincipal) {
|
|
9779
9998
|
return {
|
|
@@ -10193,7 +10412,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
10193
10412
|
if (!verdict.ok) throw new KernelCoherenceError(verdict);
|
|
10194
10413
|
return verdict;
|
|
10195
10414
|
};
|
|
10196
|
-
const signWorkspaceOffer = async ({ target, domain, directiveId, payload, actor, authorSecret: signingSecret, authToken: targetToken, domainHash }) => {
|
|
10415
|
+
const signWorkspaceOffer = async ({ target, domain, directiveId, payload, actor, authorSecret: signingSecret, authToken: targetToken, domainHash, birthCertificate }) => {
|
|
10197
10416
|
if (!target || typeof target !== "string") throw new Error("cross-workspace offer requires a target workspace");
|
|
10198
10417
|
if (target === workspace) {
|
|
10199
10418
|
return offerDirective(domain, directiveId, payload, {
|
|
@@ -10201,7 +10420,8 @@ ${String(commit).toLowerCase()}`;
|
|
|
10201
10420
|
signWith: signingSecret,
|
|
10202
10421
|
...targetToken ? { authTokenOverride: targetToken } : {},
|
|
10203
10422
|
returnSealed: true,
|
|
10204
|
-
...domainHash ? { domainHash } : {}
|
|
10423
|
+
...domainHash ? { domainHash } : {},
|
|
10424
|
+
...birthCertificate ? { birthCertificate } : {}
|
|
10205
10425
|
});
|
|
10206
10426
|
}
|
|
10207
10427
|
let targetHolon;
|
|
@@ -10241,7 +10461,8 @@ ${String(commit).toLowerCase()}`;
|
|
|
10241
10461
|
payload,
|
|
10242
10462
|
actor,
|
|
10243
10463
|
authorSecret: signingSecret,
|
|
10244
|
-
...domainHash ? { domainHash } : {}
|
|
10464
|
+
...domainHash ? { domainHash } : {},
|
|
10465
|
+
...birthCertificate ? { birthCertificate } : {}
|
|
10245
10466
|
});
|
|
10246
10467
|
} finally {
|
|
10247
10468
|
if (temporary) {
|
|
@@ -11058,6 +11279,9 @@ ${String(commit).toLowerCase()}`;
|
|
|
11058
11279
|
correctMostRecent: (opts) => _correctMostRecent(opts.kind, opts),
|
|
11059
11280
|
/** Framework-private exact-history adoption seam consumed only by generated `model.adopt()`. */
|
|
11060
11281
|
__nomosAdoptModel: (domain, candidateHash, opts = {}) => _nomosAdoptModel(domain, candidateHash, opts),
|
|
11282
|
+
/** Framework-private generated parent-to-child model inheritance. */
|
|
11283
|
+
__nomosModelInstallation: (domain, candidateHash) => _nomosModelInstallation(domain, candidateHash),
|
|
11284
|
+
__nomosStageGeneratedModel: (domain, candidateHash, lawUsdz, dependencies) => _nomosStageGeneratedModel(domain, candidateHash, lawUsdz, dependencies),
|
|
11061
11285
|
/** Framework-private exact-history restoration seam consumed only by generated `model.restorePrevious()`. */
|
|
11062
11286
|
__nomosRestorePreviousModel: (domain, currentHash, opts = {}) => _nomosRestorePreviousModel(domain, currentHash, opts),
|
|
11063
11287
|
/**
|
|
@@ -11561,7 +11785,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
11561
11785
|
if (!publicKey || typeof publicKey !== "string") throw new Error("enrollDevice requires the device `publicKey` (base64 from mintDeviceKey)");
|
|
11562
11786
|
const keyHash = await sha256hexBytes(bytesUnb64(publicKey));
|
|
11563
11787
|
const p = canonicalPrincipal(principal2);
|
|
11564
|
-
const payload = {
|
|
11788
|
+
const payload = { keyHash, grantedBy: canonicalPrincipal(grantedBy || p), grantedAt: typeof grantedAt === "number" ? grantedAt : Date.now() };
|
|
11565
11789
|
return offerDirective("home", "enrollSigner", payload, { actor: p });
|
|
11566
11790
|
},
|
|
11567
11791
|
/**
|
|
@@ -11811,8 +12035,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
11811
12035
|
{ child: home, founder: owner, verified: true, parentKey: device.public, parentId: parent, epoch: 0 },
|
|
11812
12036
|
device.secret
|
|
11813
12037
|
);
|
|
11814
|
-
const
|
|
11815
|
-
const birthPayload = { owner, ownerKeyHash, frameworkHash, lawHash, bornAt, homeCert: JSON.stringify(homeCert) };
|
|
12038
|
+
const birthPayload = { owner, frameworkHash, lawHash, bornAt };
|
|
11816
12039
|
const sealedBirth = await signWorkspaceOffer({
|
|
11817
12040
|
target: parent,
|
|
11818
12041
|
domain: homeDomain,
|
|
@@ -11820,7 +12043,8 @@ ${String(commit).toLowerCase()}`;
|
|
|
11820
12043
|
payload: birthPayload,
|
|
11821
12044
|
actor: owner,
|
|
11822
12045
|
authorSecret: device.secret,
|
|
11823
|
-
authToken: typeof at === "string" ? at : void 0
|
|
12046
|
+
authToken: typeof at === "string" ? at : void 0,
|
|
12047
|
+
birthCertificate: homeCert
|
|
11824
12048
|
});
|
|
11825
12049
|
const offerBody = await governanceOffers.postGovernanceOffer({
|
|
11826
12050
|
directiveId,
|
|
@@ -12216,6 +12440,23 @@ ${String(commit).toLowerCase()}`;
|
|
|
12216
12440
|
const intent = decodeIntentOfferBytes(intentBytes);
|
|
12217
12441
|
return offerDirective(intent.domain, intent.directiveId, intent.payload, { domainHash: intent.domainHash, actor: intent.actor });
|
|
12218
12442
|
},
|
|
12443
|
+
/** Replace an expired identity proof without remounting custody or losing watches. The caller is the
|
|
12444
|
+
* generated application runtime; tenant code never receives this seam. A refreshed token may prove only
|
|
12445
|
+
* the same signed-in subject that opened the workspace. */
|
|
12446
|
+
refreshAuthToken: (token) => {
|
|
12447
|
+
const next = typeof token === "string" ? token.trim() : "";
|
|
12448
|
+
if (!next) throw new Error("credential refresh returned an empty identity proof");
|
|
12449
|
+
const subjectClaim = jwtClaim(next, "sub");
|
|
12450
|
+
const nextSubject = canonicalPrincipal(
|
|
12451
|
+
typeof subjectClaim === "string" ? subjectClaim : ""
|
|
12452
|
+
);
|
|
12453
|
+
if (!nextSubject || nextSubject !== connectionPrincipal) {
|
|
12454
|
+
throw new Error("credential refresh changed the signed-in identity; reopen the application explicitly");
|
|
12455
|
+
}
|
|
12456
|
+
activeAuthToken = next;
|
|
12457
|
+
authHeaders = packAuthHeaders({ authToken: activeAuthToken, principal: connectionPrincipal });
|
|
12458
|
+
return { refreshed: true };
|
|
12459
|
+
},
|
|
12219
12460
|
/**
|
|
12220
12461
|
* THE ONE ENCODER as the public offer entrypoint. A generated client (TS or Dart-via-bridge) calls THIS
|
|
12221
12462
|
* with the planned payload + the verified `actor` — it NEVER re-encodes the v2 envelope itself. The bytes
|
|
@@ -12230,9 +12471,9 @@ ${String(commit).toLowerCase()}`;
|
|
|
12230
12471
|
// THIS offer with a key OTHER than the connect-time one (the sibling-birth / ensureParentSignerEnrollment
|
|
12231
12472
|
// recovery lanes ride this — the runner maps a bridge op's `authorSecret` onto `opts.signWith`). Dropping it
|
|
12232
12473
|
// here silently signed every per-offer-keyed write with the connect-time key (or nothing) — bug #9.
|
|
12233
|
-
offerDirective: (domain, directiveId, payload, opts = {}) => offerDirective(domain, directiveId, payload, { domainHash: opts.domainHash, actor: opts.actor, signWith: opts.signWith, lawUsdz: opts.lawUsdz, __nomosConflictSnapshots: opts.__nomosConflictSnapshots, returnCreated: opts.returnCreated !== false, force: opts.force === true }),
|
|
12474
|
+
offerDirective: (domain, directiveId, payload, opts = {}) => offerDirective(domain, directiveId, payload, { domainHash: opts.domainHash, actor: opts.actor, signWith: opts.signWith, lawUsdz: opts.lawUsdz, birthCertificate: opts.birthCertificate, __nomosConflictSnapshots: opts.__nomosConflictSnapshots, returnCreated: opts.returnCreated !== false, force: opts.force === true }),
|
|
12234
12475
|
// THE WRITE VERB, canonical name. `offerDirective` is the legacy alias; both encode via the one codec.
|
|
12235
|
-
offerIntent: (domain, directiveId, payload, opts = {}) => offerDirective(domain, directiveId, payload, { domainHash: opts.domainHash, actor: opts.actor, signWith: opts.signWith, lawUsdz: opts.lawUsdz, __nomosConflictSnapshots: opts.__nomosConflictSnapshots, returnCreated: opts.returnCreated !== false, force: opts.force === true }),
|
|
12476
|
+
offerIntent: (domain, directiveId, payload, opts = {}) => offerDirective(domain, directiveId, payload, { domainHash: opts.domainHash, actor: opts.actor, signWith: opts.signWith, lawUsdz: opts.lawUsdz, birthCertificate: opts.birthCertificate, __nomosConflictSnapshots: opts.__nomosConflictSnapshots, returnCreated: opts.returnCreated !== false, force: opts.force === true }),
|
|
12236
12477
|
/** HOLON-NATIVE ROUTING (routing by id): ask the holon which shard a write to `id` belongs on — the
|
|
12237
12478
|
* wasm decodes the id's route tag and resolves its folded shard map. Returns `{ ok, tag, shard }`
|
|
12238
12479
|
* (`shard:""` = a known-tag but unplaced home; `tag:null` = not a route-tagged id). The routed wrapper
|
|
@@ -12406,9 +12647,16 @@ ${String(commit).toLowerCase()}`;
|
|
|
12406
12647
|
try {
|
|
12407
12648
|
const rows = intentsAbove(snap.localHead, syncedBase);
|
|
12408
12649
|
const offers = rows.map((it) => ({ session: cid, oid: it.oid.slice(0, 10), changeB64: it.changeB64 }));
|
|
12409
|
-
const carriesAuxiliaryCustody = rows.some(
|
|
12410
|
-
|
|
12411
|
-
|
|
12650
|
+
const carriesAuxiliaryCustody = rows.some((it) => {
|
|
12651
|
+
switch (it.transportRequirement) {
|
|
12652
|
+
case IntentTransportRequirement.SEALED_CHANGE:
|
|
12653
|
+
return false;
|
|
12654
|
+
case IntentTransportRequirement.COMMIT_TREE:
|
|
12655
|
+
return true;
|
|
12656
|
+
case IntentTransportRequirement.UNSPECIFIED:
|
|
12657
|
+
throw new Error("kernel returned an intent without a transport requirement");
|
|
12658
|
+
}
|
|
12659
|
+
});
|
|
12412
12660
|
if (offers.length && carriesAuxiliaryCustody) {
|
|
12413
12661
|
if (!snap.localHead) throw new Error("lifecycle offer has no local candidate head");
|
|
12414
12662
|
const pushedCandidate = await pushCandidateCustody(snap.localHead, syncedBase);
|
|
@@ -12604,6 +12852,16 @@ ${String(commit).toLowerCase()}`;
|
|
|
12604
12852
|
result.stillAhead = await resolveBranchHead() !== syncedBase;
|
|
12605
12853
|
} catch {
|
|
12606
12854
|
}
|
|
12855
|
+
const admittedIntentIds = Array.from(new Set(
|
|
12856
|
+
(admission?.sessions || []).flatMap(
|
|
12857
|
+
(session) => [...session.admitted || [], ...session.skipped || []].map((entry) => typeof entry.intent === "string" ? entry.intent : "").filter(Boolean)
|
|
12858
|
+
)
|
|
12859
|
+
));
|
|
12860
|
+
if (admittedIntentIds.length) result.admittedIntentIds = admittedIntentIds;
|
|
12861
|
+
const convergenceDeferred = !!(result.converged && result.converged.deferred);
|
|
12862
|
+
if (admittedIntentIds.length && !convergenceDeferred && result.stillAhead !== true && result.offline !== true) {
|
|
12863
|
+
result.convergedIntentIds = admittedIntentIds;
|
|
12864
|
+
}
|
|
12607
12865
|
result.directOfferDeferred = directOfferDeferred;
|
|
12608
12866
|
if (pushError) {
|
|
12609
12867
|
result.pushError = pushError;
|
|
@@ -12778,6 +13036,15 @@ ${String(commit).toLowerCase()}`;
|
|
|
12778
13036
|
let t = null, retryTimer = null;
|
|
12779
13037
|
let lastOid = null, drains = 0, stopSub = null, reconnectBackoffMs = 500;
|
|
12780
13038
|
let _fireWindow = [];
|
|
13039
|
+
const scheduleTransportRetry = () => {
|
|
13040
|
+
if (retryTimer) clearTimeout(retryTimer);
|
|
13041
|
+
const waitMs = reconnectBackoffMs;
|
|
13042
|
+
reconnectBackoffMs = Math.min(reconnectBackoffMs * 2, 3e4);
|
|
13043
|
+
retryTimer = setTimeout(() => {
|
|
13044
|
+
retryTimer = null;
|
|
13045
|
+
fire("reconnect");
|
|
13046
|
+
}, waitMs);
|
|
13047
|
+
};
|
|
12781
13048
|
const announcePresence = async (reason = "heartbeat") => {
|
|
12782
13049
|
if (stopped || !stopSub || typeof stopSub.signal !== "function") return;
|
|
12783
13050
|
try {
|
|
@@ -12849,13 +13116,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
12849
13116
|
announcePresence(reason || "sync");
|
|
12850
13117
|
const transportDeferred = !!(r && (r.offline === true || r.pushFailed === true && r.pushError?.refused !== true));
|
|
12851
13118
|
if (transportDeferred) {
|
|
12852
|
-
|
|
12853
|
-
const waitMs = reconnectBackoffMs;
|
|
12854
|
-
reconnectBackoffMs = Math.min(reconnectBackoffMs * 2, 3e4);
|
|
12855
|
-
retryTimer = setTimeout(() => {
|
|
12856
|
-
retryTimer = null;
|
|
12857
|
-
fire("reconnect");
|
|
12858
|
-
}, waitMs);
|
|
13119
|
+
scheduleTransportRetry();
|
|
12859
13120
|
return;
|
|
12860
13121
|
}
|
|
12861
13122
|
reconnectBackoffMs = 500;
|
|
@@ -12886,6 +13147,7 @@ ${String(commit).toLowerCase()}`;
|
|
|
12886
13147
|
}, (e) => {
|
|
12887
13148
|
if (stopped) return;
|
|
12888
13149
|
if (onError) onError(e, reason);
|
|
13150
|
+
if (remoteUnavailableAtConnect(e)) scheduleTransportRetry();
|
|
12889
13151
|
});
|
|
12890
13152
|
}, debounceMs);
|
|
12891
13153
|
};
|