githolon 0.108.4 → 0.108.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/compile_mountability_entry.js +72 -8
- package/dist/dev-server.mjs +643 -134
- package/dist/framework/bootstrap.law.usdz +0 -0
- package/dist/framework/nomos.law.usdz +0 -0
- package/dist/full-cli.mjs +557 -143
- package/package.json +2 -2
package/dist/dev-server.mjs
CHANGED
|
@@ -1192,7 +1192,7 @@ var init_lifecycle_calls = __esm({
|
|
|
1192
1192
|
|
|
1193
1193
|
// ../adapter/proto/nomos/kernel/v1/kernel_pb.js
|
|
1194
1194
|
import { enumDesc, fileDesc, messageDesc, serviceDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
|
|
1195
|
-
var file_nomos_kernel_v1_kernel, CallRequestSchema, CallResponseSchema, OfferAggregateRefSchema, BornWorkspaceSchema, BirthOutcomeSchema, PrepareRemoteOfferRequestSchema, PrepareRemoteOfferResponseSchema, WorkspaceTargetSchema, InitializeWorkspaceRequestSchema, DirectiveCallSchema, AuthoringOptionsSchema, CapturedClockSchema, BirthCertificateSchema, SignBirthCertificateRequestSchema, OfferRequestSchema, QueryRequestSchema, QueryAuthoritySchema, InjectedKeySchema, RowsQuerySchema, ByIdQuerySchema, TallyQuerySchema, SpatialQuerySchema, NamedQuerySchema, TestRequestSchema, SetTestRootRequestSchema, CustodyRequestSchema, PackDeltaRequestSchema, ApplyPackRequestSchema, RepoStatsRequestSchema, IntentsAboveRequestSchema, InspectChangeRequestSchema, RefusalVerdictSchema, EncodeRefusalVerdictRequestSchema, InspectRefusalVerdictRequestSchema, ProveCompactionEquivalenceRequestSchema, ReadBlobRequestSchema, ResolveRefRequestSchema, ListRefsRequestSchema, WriteRefRequestSchema, DeleteRefRequestSchema, WriteMetaCommitRequestSchema, LawClosureInfoRequestSchema, CheckpointExportRequestSchema, VerifiedFrontierReceiptSchema, StoredCheckpointManifestSchema, CheckpointImportRequestSchema, RestoreMainRequestSchema, ResolveStatePositionRequestSchema, NomosValueSchema, NomosStructSchema, BirthOutcomeStatusSchema, BirthOutcomeStatus, QueryOperationSchema, QueryOperation, KernelLawCapabilitySchema, KernelLawCapability, CheckpointCompressionSchema, CheckpointCompression, CheckpointVerificationPolicySchema, CheckpointVerificationPolicy, CheckpointAssuranceSchema, CheckpointAssurance;
|
|
1195
|
+
var file_nomos_kernel_v1_kernel, CallRequestSchema, CallResponseSchema, OfferAggregateRefSchema, BornWorkspaceSchema, BirthOutcomeSchema, PrepareRemoteOfferRequestSchema, PrepareRemoteOfferResponseSchema, ApplyWorkspaceEffectRequestSchema, ApplyWorkspaceEffectResponseSchema, WorkspaceTargetSchema, InitializeWorkspaceRequestSchema, DirectiveCallSchema, AuthoringOptionsSchema, CapturedClockSchema, BirthCertificateSchema, SignBirthCertificateRequestSchema, OfferRequestSchema, QueryRequestSchema, QueryAuthoritySchema, InjectedKeySchema, RowsQuerySchema, ByIdQuerySchema, TallyQuerySchema, SpatialQuerySchema, NamedQuerySchema, OutboxRequestSchema, TestRequestSchema, SetTestRootRequestSchema, CustodyRequestSchema, PackDeltaRequestSchema, ApplyPackRequestSchema, RepoStatsRequestSchema, IntentsAboveRequestSchema, InspectChangeRequestSchema, RefusalVerdictSchema, EncodeRefusalVerdictRequestSchema, InspectRefusalVerdictRequestSchema, ProveCompactionEquivalenceRequestSchema, ReadBlobRequestSchema, ResolveRefRequestSchema, ListRefsRequestSchema, WriteRefRequestSchema, DeleteRefRequestSchema, WriteMetaCommitRequestSchema, LawClosureInfoRequestSchema, CheckpointExportRequestSchema, VerifiedFrontierReceiptSchema, StoredCheckpointManifestSchema, CheckpointImportRequestSchema, RestoreMainRequestSchema, ResolveStatePositionRequestSchema, NomosValueSchema, NomosStructSchema, BirthOutcomeStatusSchema, BirthOutcomeStatus, QueryOperationSchema, QueryOperation, KernelLawCapabilitySchema, KernelLawCapability, CheckpointCompressionSchema, CheckpointCompression, CheckpointVerificationPolicySchema, CheckpointVerificationPolicy, CheckpointAssuranceSchema, CheckpointAssurance;
|
|
1196
1196
|
var init_kernel_pb = __esm({
|
|
1197
1197
|
"../adapter/proto/nomos/kernel/v1/kernel_pb.js"() {
|
|
1198
1198
|
"use strict";
|
|
@@ -1204,6 +1204,8 @@ var init_kernel_pb = __esm({
|
|
|
1204
1204
|
BirthOutcomeSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 8);
|
|
1205
1205
|
PrepareRemoteOfferRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 19);
|
|
1206
1206
|
PrepareRemoteOfferResponseSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 21);
|
|
1207
|
+
ApplyWorkspaceEffectRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 38);
|
|
1208
|
+
ApplyWorkspaceEffectResponseSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 39);
|
|
1207
1209
|
WorkspaceTargetSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 43);
|
|
1208
1210
|
InitializeWorkspaceRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 45);
|
|
1209
1211
|
DirectiveCallSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 47);
|
|
@@ -1220,6 +1222,7 @@ var init_kernel_pb = __esm({
|
|
|
1220
1222
|
TallyQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 74);
|
|
1221
1223
|
SpatialQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 75);
|
|
1222
1224
|
NamedQuerySchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 78);
|
|
1225
|
+
OutboxRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 96);
|
|
1223
1226
|
TestRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 98);
|
|
1224
1227
|
SetTestRootRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 99);
|
|
1225
1228
|
CustodyRequestSchema = /* @__PURE__ */ messageDesc(file_nomos_kernel_v1_kernel, 101);
|
|
@@ -1337,6 +1340,17 @@ var init_offer_result = __esm({
|
|
|
1337
1340
|
}
|
|
1338
1341
|
});
|
|
1339
1342
|
|
|
1343
|
+
// ../adapter/proto/nomos/custody/v1/snapshot_pb.js
|
|
1344
|
+
import { fileDesc as fileDesc2, messageDesc as messageDesc2 } from "@bufbuild/protobuf/codegenv2";
|
|
1345
|
+
var file_nomos_custody_v1_snapshot, LocalCustodySnapshotSchema;
|
|
1346
|
+
var init_snapshot_pb = __esm({
|
|
1347
|
+
"../adapter/proto/nomos/custody/v1/snapshot_pb.js"() {
|
|
1348
|
+
"use strict";
|
|
1349
|
+
file_nomos_custody_v1_snapshot = /* @__PURE__ */ fileDesc2("Ch9ub21vcy9jdXN0b2R5L3YxL3NuYXBzaG90LnByb3RvEhBub21vcy5jdXN0b2R5LnYxIqACChRMb2NhbEN1c3RvZHlTbmFwc2hvdBIWCg5mb3JtYXRfdmVyc2lvbhgBIAEoDRIWCgl3b3Jrc3BhY2UYAiABKAlIAIgBARIMCgR0cmVlGAMgASgMEhcKCmNoZWNrcG9pbnQYBCABKAxIAYgBARIVCghmcm9udGllchgFIAEoDEgCiAEBEhMKBmN1cnNvchgGIAEoCUgDiAEBEhcKCnN0YXRlX3Jvb3QYByABKAlIBIgBARIYCgtzeW5jZWRfYmFzZRgIIAEoCUgFiAEBQgwKCl93b3Jrc3BhY2VCDQoLX2NoZWNrcG9pbnRCCwoJX2Zyb250aWVyQgkKB19jdXJzb3JCDQoLX3N0YXRlX3Jvb3RCDgoMX3N5bmNlZF9iYXNlYgZwcm90bzM");
|
|
1350
|
+
LocalCustodySnapshotSchema = /* @__PURE__ */ messageDesc2(file_nomos_custody_v1_snapshot, 0);
|
|
1351
|
+
}
|
|
1352
|
+
});
|
|
1353
|
+
|
|
1340
1354
|
// ../adapter/engine.ts
|
|
1341
1355
|
import { WASI, File, Directory, OpenFile, ConsoleStdout, PreopenDirectory } from "@bjorn3/browser_wasi_shim";
|
|
1342
1356
|
import { create, fromBinary, toBinary } from "@bufbuild/protobuf";
|
|
@@ -1398,6 +1412,13 @@ function invokeCallRequest(ex, request, STDERR) {
|
|
|
1398
1412
|
ex.git_holon_dealloc(requestPtr, bytes.length);
|
|
1399
1413
|
}
|
|
1400
1414
|
}
|
|
1415
|
+
function callKernel(eng, request) {
|
|
1416
|
+
if (request.protocolVersion !== PROTO_ABI_VERSION) {
|
|
1417
|
+
throw new Error(`kernel protobuf ABI ${request.protocolVersion}; expected ${PROTO_ABI_VERSION}`);
|
|
1418
|
+
}
|
|
1419
|
+
if (!request.requestId) throw new Error("kernel protobuf request id is required");
|
|
1420
|
+
return invokeCallRequest(eng.ex, request, eng.STDERR);
|
|
1421
|
+
}
|
|
1401
1422
|
function callProto(ex, operation, STDERR) {
|
|
1402
1423
|
return invokeCallRequest(ex, create(CallRequestSchema, {
|
|
1403
1424
|
protocolVersion: PROTO_ABI_VERSION,
|
|
@@ -2122,6 +2143,30 @@ function intentOfferResidencies(eng, offers) {
|
|
|
2122
2143
|
}
|
|
2123
2144
|
return [...unique.values()];
|
|
2124
2145
|
}
|
|
2146
|
+
function hasWorkspaceResidency(eng, workspace, sourceHead, foldRoot) {
|
|
2147
|
+
if (!eng.mounted.has(workspace)) return false;
|
|
2148
|
+
const gitdir = gitdirOf(workspace);
|
|
2149
|
+
const main = kgit.resolveRef(eng, gitdir, BRANCH);
|
|
2150
|
+
if (!main) return false;
|
|
2151
|
+
try {
|
|
2152
|
+
return !!kgit.resolveStatePosition(eng, gitdir, main, sourceHead, foldRoot);
|
|
2153
|
+
} catch {
|
|
2154
|
+
return false;
|
|
2155
|
+
}
|
|
2156
|
+
}
|
|
2157
|
+
async function ensureWorkspaceResidency(eng, workspace, sourceHead, foldRoot, ledger) {
|
|
2158
|
+
if (hasWorkspaceResidency(eng, workspace, sourceHead, foldRoot)) {
|
|
2159
|
+
return { workspace, sourceHead, foldRoot, reused: true };
|
|
2160
|
+
}
|
|
2161
|
+
if (eng.mounted.has(workspace)) unmount(eng, workspace);
|
|
2162
|
+
const mounted = await mountWorkspace(eng, workspace, ledger);
|
|
2163
|
+
if (!mounted.restored || !hasWorkspaceResidency(eng, workspace, sourceHead, foldRoot)) {
|
|
2164
|
+
throw new Error(
|
|
2165
|
+
`workspace residency '${workspace}' does not contain required source state ${foldRoot}`
|
|
2166
|
+
);
|
|
2167
|
+
}
|
|
2168
|
+
return { workspace, sourceHead, foldRoot, reused: false };
|
|
2169
|
+
}
|
|
2125
2170
|
function stageWorkspaceDir(eng, ws) {
|
|
2126
2171
|
const wsContents = /* @__PURE__ */ new Map();
|
|
2127
2172
|
dirOf(eng.preopen.dir.contents.get("ws")).contents.set(ws, new Directory(wsContents));
|
|
@@ -2224,6 +2269,50 @@ function requireCurrentControllerLawHash(eng, ws) {
|
|
|
2224
2269
|
function installedLaw(eng, ws) {
|
|
2225
2270
|
return namedQueryProto(eng, ws, QueryOperation.INSTALLED_LAW);
|
|
2226
2271
|
}
|
|
2272
|
+
function outboundOffers(eng, ws, nowMillis = Date.now()) {
|
|
2273
|
+
const response = callProto(eng.ex, {
|
|
2274
|
+
case: "outbox",
|
|
2275
|
+
value: create(OutboxRequestSchema, {
|
|
2276
|
+
target: protoTarget(ws),
|
|
2277
|
+
clock: create(CapturedClockSchema, {
|
|
2278
|
+
physicalMillis: BigInt(nowMillis),
|
|
2279
|
+
logical: 0,
|
|
2280
|
+
replica: BigInt(eng.replica)
|
|
2281
|
+
})
|
|
2282
|
+
})
|
|
2283
|
+
}, eng.STDERR);
|
|
2284
|
+
if (response.outcome.case !== "outbox") {
|
|
2285
|
+
throw new Error(`kernel returned ${response.outcome.case || "empty"} for outbox request`);
|
|
2286
|
+
}
|
|
2287
|
+
return response.outcome.value;
|
|
2288
|
+
}
|
|
2289
|
+
async function applyWorkspaceEffect(eng, ws, ledger, requestBytes, admissionCheckpointSecret) {
|
|
2290
|
+
const request = fromBinary(ApplyWorkspaceEffectRequestSchema, requestBytes);
|
|
2291
|
+
if (request.target?.workspace !== ws || request.target.repo !== repoArgOf(ws)) {
|
|
2292
|
+
throw new Error("workspace-effect protobuf target does not match the mounted target custody");
|
|
2293
|
+
}
|
|
2294
|
+
if (admissionCheckpointSecret.byteLength !== 32) {
|
|
2295
|
+
throw new Error("target runtime admission checkpoint credential is missing or malformed");
|
|
2296
|
+
}
|
|
2297
|
+
request.admissionCheckpointSecret = admissionCheckpointSecret;
|
|
2298
|
+
const response = callProto(eng.ex, {
|
|
2299
|
+
case: "applyWorkspaceEffect",
|
|
2300
|
+
value: request
|
|
2301
|
+
}, eng.STDERR);
|
|
2302
|
+
if (response.outcome.case !== "applyWorkspaceEffect") {
|
|
2303
|
+
throw new Error(`kernel returned ${response.outcome.case || "empty"} for workspace effect`);
|
|
2304
|
+
}
|
|
2305
|
+
const result = response.outcome.value.result;
|
|
2306
|
+
if (!result || result.outcome.case !== "admitted") {
|
|
2307
|
+
const outcome = result?.outcome.case || "empty";
|
|
2308
|
+
const detail = result?.outcome.case === "refused" ? result.outcome.value.refusal?.message : void 0;
|
|
2309
|
+
throw new Error(
|
|
2310
|
+
`target kernel ${outcome} the workspace effect${detail ? `: ${detail}` : ""}`
|
|
2311
|
+
);
|
|
2312
|
+
}
|
|
2313
|
+
await custodyPush(eng, ws, ledger, { remoteRef: "refs/heads/main", ffOnly: true });
|
|
2314
|
+
return toBinary(ApplyWorkspaceEffectResponseSchema, response.outcome.value);
|
|
2315
|
+
}
|
|
2227
2316
|
function author(eng, ws, domain, directiveId, payload, controllerHash, opts = {}) {
|
|
2228
2317
|
const seq = eng.seq++;
|
|
2229
2318
|
const capPorts = { clock: { physical: Date.now(), logical: 0, replica: eng.replica }, rng: osEntropyBuffer(opts.rngDraws ?? 64) };
|
|
@@ -2301,8 +2390,8 @@ function prepareRemoteOffer(eng, ws, requestBytes) {
|
|
|
2301
2390
|
if (authoring.authorSecret.byteLength !== 0) {
|
|
2302
2391
|
throw new Error("remote offer preparation refuses client signing secrets");
|
|
2303
2392
|
}
|
|
2304
|
-
if (request.intent.case !== "call") {
|
|
2305
|
-
throw new Error("remote offer preparation requires a typed directive call");
|
|
2393
|
+
if (request.intent.case !== "call" && request.intent.case !== "modelLifecycle") {
|
|
2394
|
+
throw new Error("remote offer preparation requires a typed directive or model-lifecycle call");
|
|
2306
2395
|
}
|
|
2307
2396
|
const response = callProto(eng.ex, {
|
|
2308
2397
|
case: "prepareRemoteOffer",
|
|
@@ -2606,7 +2695,13 @@ function packDelta(eng, ws, base, head) {
|
|
|
2606
2695
|
case: "packDelta",
|
|
2607
2696
|
value: create(PackDeltaRequestSchema, { repo: repoArgOf(ws), base: base || void 0, head })
|
|
2608
2697
|
}, "packDelta").pack;
|
|
2609
|
-
} catch {
|
|
2698
|
+
} catch (error) {
|
|
2699
|
+
console.error("[nomos-custody-pack] packDelta refused", {
|
|
2700
|
+
workspace: ws,
|
|
2701
|
+
base: base || "<full>",
|
|
2702
|
+
head,
|
|
2703
|
+
error: String(error)
|
|
2704
|
+
});
|
|
2610
2705
|
return null;
|
|
2611
2706
|
}
|
|
2612
2707
|
}
|
|
@@ -3197,6 +3292,121 @@ async function deleteRefusedRef(eng, ws, ledger, offerId) {
|
|
|
3197
3292
|
}
|
|
3198
3293
|
return ref;
|
|
3199
3294
|
}
|
|
3295
|
+
async function emitOutbox(eng, ws, ledger, workspaceEffectBase = "", admissionCheckpointSecret) {
|
|
3296
|
+
const outbox = outboundOffers(eng, ws);
|
|
3297
|
+
const nextDueAtMillis = outbox.nextDueAtMillis === void 0 ? void 0 : Number(outbox.nextDueAtMillis);
|
|
3298
|
+
if (outbox.offers.length === 0) {
|
|
3299
|
+
return { delivered: [], skipped: 0, errors: 0, nextDueAtMillis };
|
|
3300
|
+
}
|
|
3301
|
+
const gitdir = gitdirOf(ws);
|
|
3302
|
+
const delivered = [];
|
|
3303
|
+
let errors = 0;
|
|
3304
|
+
for (const offer of outbox.offers) {
|
|
3305
|
+
try {
|
|
3306
|
+
switch (offer.route.case) {
|
|
3307
|
+
case "httpsRoute": {
|
|
3308
|
+
const destination = offer.route.value.url;
|
|
3309
|
+
const res = await fetch(destination, {
|
|
3310
|
+
method: "POST",
|
|
3311
|
+
headers: {
|
|
3312
|
+
"content-type": offer.contentType,
|
|
3313
|
+
"x-nomos-offer-id": offer.id,
|
|
3314
|
+
"x-nomos-obligation-id": offer.obligationId,
|
|
3315
|
+
"x-nomos-source-workspace": offer.sourceWorkspace,
|
|
3316
|
+
"x-nomos-custody-head": offer.custodyHead
|
|
3317
|
+
},
|
|
3318
|
+
// Fetch's DOM typing requires an ArrayBuffer-backed body; this copies opaque bytes without
|
|
3319
|
+
// decoding or re-authoring them. The receiving kernel sees the exact sealed USDA payload.
|
|
3320
|
+
body: Uint8Array.from(offer.sealedOffer).buffer,
|
|
3321
|
+
signal: AbortSignal.timeout(3e4)
|
|
3322
|
+
});
|
|
3323
|
+
if (!res.ok) {
|
|
3324
|
+
throw new Error(`HTTPS capability returned ${res.status}`);
|
|
3325
|
+
}
|
|
3326
|
+
break;
|
|
3327
|
+
}
|
|
3328
|
+
case "workspaceRoute": {
|
|
3329
|
+
const targetWorkspace = offer.route.value.workspace;
|
|
3330
|
+
const request = create(ApplyWorkspaceEffectRequestSchema, {
|
|
3331
|
+
source: protoTarget(ws),
|
|
3332
|
+
sourceCommit: offer.sourceCommit,
|
|
3333
|
+
sourceOfferPath: offer.sourceOfferPath,
|
|
3334
|
+
target: protoTarget(targetWorkspace),
|
|
3335
|
+
sourceEvidencePack: offer.sourceEvidencePack
|
|
3336
|
+
});
|
|
3337
|
+
const response = workspaceEffectBase ? fromBinary(
|
|
3338
|
+
ApplyWorkspaceEffectResponseSchema,
|
|
3339
|
+
new Uint8Array(await (async () => {
|
|
3340
|
+
const remote = await fetch(
|
|
3341
|
+
`${workspaceEffectBase.replace(/\/+$/, "")}/v2/workspaces/${encodeURIComponent(targetWorkspace)}/workspace-effect`,
|
|
3342
|
+
{
|
|
3343
|
+
method: "POST",
|
|
3344
|
+
headers: { "content-type": "application/vnd.nomos.workspace-effect+protobuf" },
|
|
3345
|
+
body: toBinary(ApplyWorkspaceEffectRequestSchema, request),
|
|
3346
|
+
signal: AbortSignal.timeout(3e4)
|
|
3347
|
+
}
|
|
3348
|
+
);
|
|
3349
|
+
if (!remote.ok) throw new Error(`workspace-effect receiver returned ${remote.status}: ${(await remote.text()).slice(0, 200)}`);
|
|
3350
|
+
return remote.arrayBuffer();
|
|
3351
|
+
})())
|
|
3352
|
+
) : (() => {
|
|
3353
|
+
if (admissionCheckpointSecret?.byteLength !== 32) {
|
|
3354
|
+
throw new Error("local target admission checkpoint credential is missing or malformed");
|
|
3355
|
+
}
|
|
3356
|
+
request.admissionCheckpointSecret = admissionCheckpointSecret;
|
|
3357
|
+
const local = callProto(eng.ex, {
|
|
3358
|
+
case: "applyWorkspaceEffect",
|
|
3359
|
+
value: request
|
|
3360
|
+
}, eng.STDERR);
|
|
3361
|
+
if (local.outcome.case !== "applyWorkspaceEffect") {
|
|
3362
|
+
throw new Error(`kernel returned ${local.outcome.case || "empty"} for workspace effect`);
|
|
3363
|
+
}
|
|
3364
|
+
return local.outcome.value;
|
|
3365
|
+
})();
|
|
3366
|
+
const targetResult = response.result;
|
|
3367
|
+
if (!targetResult || targetResult.outcome.case !== "admitted") {
|
|
3368
|
+
const outcome = targetResult?.outcome.case || "empty";
|
|
3369
|
+
const detail = targetResult?.outcome.case === "refused" ? targetResult.outcome.value.refusal?.message : void 0;
|
|
3370
|
+
throw new Error(
|
|
3371
|
+
`target kernel ${outcome} the workspace effect${detail ? `: ${detail}` : ""}`
|
|
3372
|
+
);
|
|
3373
|
+
}
|
|
3374
|
+
break;
|
|
3375
|
+
}
|
|
3376
|
+
case void 0: {
|
|
3377
|
+
if (!offer.destination) throw new Error("legacy outbound offer has no HTTPS destination");
|
|
3378
|
+
const res = await fetch(offer.destination, {
|
|
3379
|
+
method: "POST",
|
|
3380
|
+
headers: {
|
|
3381
|
+
"content-type": offer.contentType,
|
|
3382
|
+
"x-nomos-offer-id": offer.id,
|
|
3383
|
+
"x-nomos-obligation-id": offer.obligationId,
|
|
3384
|
+
"x-nomos-source-workspace": offer.sourceWorkspace,
|
|
3385
|
+
"x-nomos-custody-head": offer.custodyHead
|
|
3386
|
+
},
|
|
3387
|
+
body: Uint8Array.from(offer.sealedOffer).buffer,
|
|
3388
|
+
signal: AbortSignal.timeout(3e4)
|
|
3389
|
+
});
|
|
3390
|
+
if (!res.ok) throw new Error(`legacy HTTPS capability returned ${res.status}`);
|
|
3391
|
+
break;
|
|
3392
|
+
}
|
|
3393
|
+
}
|
|
3394
|
+
kgit.writeRef(eng, gitdir, offer.deliveryRef, offer.custodyOid);
|
|
3395
|
+
try {
|
|
3396
|
+
await custodyPush(eng, ws, ledger, { remoteRef: offer.deliveryRef });
|
|
3397
|
+
} catch (e) {
|
|
3398
|
+
log("outbox-delivery-ref-push-failed", { ws, ref: offer.deliveryRef, error: String(e).slice(0, 200) });
|
|
3399
|
+
}
|
|
3400
|
+
delivered.push(offer.id);
|
|
3401
|
+
} catch (e) {
|
|
3402
|
+
errors++;
|
|
3403
|
+
const destination = offer.route.case === "httpsRoute" ? offer.route.value.url : offer.route.case === "workspaceRoute" ? offer.route.value.workspace : offer.destination;
|
|
3404
|
+
log("outbox-deliver-failed", { ws, offerId: offer.id, destination, error: String(e).slice(0, 2e3) });
|
|
3405
|
+
}
|
|
3406
|
+
}
|
|
3407
|
+
if (delivered.length || errors) log("outbox", { ws, delivered: delivered.length, errors });
|
|
3408
|
+
return { delivered, skipped: 0, errors, nextDueAtMillis };
|
|
3409
|
+
}
|
|
3200
3410
|
async function boot(eng, ws, ledger) {
|
|
3201
3411
|
const m = await mountWorkspace(eng, ws, ledger);
|
|
3202
3412
|
if (nomosActive(eng, ws)) {
|
|
@@ -3222,6 +3432,26 @@ function snapshot(eng, ws) {
|
|
|
3222
3432
|
const wsDir = dirOf(eng.preopen.dir.contents.get("ws")).contents.get(ws);
|
|
3223
3433
|
return serializeTree(wsDir);
|
|
3224
3434
|
}
|
|
3435
|
+
function localCustodySnapshot(eng, ws) {
|
|
3436
|
+
const checkpoint = exportCheckpoint(eng, ws);
|
|
3437
|
+
const tree = snapshot(eng, ws);
|
|
3438
|
+
const head = headOf(eng, ws);
|
|
3439
|
+
const body = toBinary(LocalCustodySnapshotSchema, create(LocalCustodySnapshotSchema, {
|
|
3440
|
+
formatVersion: 3,
|
|
3441
|
+
workspace: ws,
|
|
3442
|
+
tree,
|
|
3443
|
+
checkpoint: checkpoint.blob ? bytesFromB64(checkpoint.blob) : void 0,
|
|
3444
|
+
frontier: checkpoint.frontier ? bytesFromB64(checkpoint.frontier) : void 0,
|
|
3445
|
+
cursor: checkpoint.cursor === void 0 ? void 0 : String(checkpoint.cursor),
|
|
3446
|
+
stateRoot: checkpoint.stateRoot,
|
|
3447
|
+
syncedBase: head || void 0
|
|
3448
|
+
}));
|
|
3449
|
+
const prefix = enc3.encode("NOMOS-CUSTODY-PB3\n");
|
|
3450
|
+
const framed = new Uint8Array(prefix.byteLength + body.byteLength);
|
|
3451
|
+
framed.set(prefix);
|
|
3452
|
+
framed.set(body, prefix.byteLength);
|
|
3453
|
+
return framed;
|
|
3454
|
+
}
|
|
3225
3455
|
async function ledgerStats(eng, ws, ledger = null) {
|
|
3226
3456
|
const gitdir = gitdirOf(ws);
|
|
3227
3457
|
let head = kgit.resolveRef(eng, gitdir, BRANCH);
|
|
@@ -3249,7 +3479,7 @@ async function ledgerStats(eng, ws, ledger = null) {
|
|
|
3249
3479
|
if (mounted) mounted.ledgerStats = out;
|
|
3250
3480
|
return out;
|
|
3251
3481
|
}
|
|
3252
|
-
var enc3, dec3, BRANCH, PROTO_ABI_VERSION, protoRequestSequence, protoBirthCertificate, RESULT_PACK_INLINE_MAX, dirOf, repoArgOf, gitdirOf, birthCertificateLawPayload, unpack, unsignedWasiPointers, log, protoTarget, protoAuthority, repoArgOfGitdir, bytesFromB64, kgit, closureInstallPayload, routeTagHexOfHomeKey, SUMMARY_SEP, summaryKey, splitSummaryKey, NOMOS_SHARD_ROWS_READ, groupOf, tallyOf, isExtremumRead, extremumMonotone, MAX_INLINE_INTENT_OFFER_BYTES, MAX_STAGED_INTENT_OFFER_BYTES, CKPT_REF, pushVia, fullRef, applyPackInto, custodyLsRefs, capturedReadUnix, queryArguments, queryAuthorityOptions, qById, query, authorKeygen, certSign,
|
|
3482
|
+
var enc3, dec3, BRANCH, PROTO_ABI_VERSION, protoRequestSequence, protoBirthCertificate, RESULT_PACK_INLINE_MAX, dirOf, repoArgOf, gitdirOf, headOf, birthCertificateLawPayload, unpack, unsignedWasiPointers, log, protoTarget, protoAuthority, repoArgOfGitdir, bytesFromB64, kgit, closureInstallPayload, routeTagHexOfHomeKey, SUMMARY_SEP, summaryKey, splitSummaryKey, NOMOS_SHARD_ROWS_READ, groupOf, tallyOf, isExtremumRead, extremumMonotone, MAX_INLINE_INTENT_OFFER_BYTES, MAX_STAGED_INTENT_OFFER_BYTES, CKPT_REF, pushVia, fullRef, applyPackInto, custodyLsRefs, capturedReadUnix, queryArguments, queryAuthorityOptions, qById, query, authorKeygen, certSign, count, sum, spatialWithin, extremum, nomosActive, refusedRefName, GENESIS_WARRANT_ID, isWarranted;
|
|
3253
3483
|
var init_engine = __esm({
|
|
3254
3484
|
"../adapter/engine.ts"() {
|
|
3255
3485
|
"use strict";
|
|
@@ -3260,6 +3490,7 @@ var init_engine = __esm({
|
|
|
3260
3490
|
init_lifecycle_calls();
|
|
3261
3491
|
init_offer_result();
|
|
3262
3492
|
init_kernel_pb();
|
|
3493
|
+
init_snapshot_pb();
|
|
3263
3494
|
enc3 = new TextEncoder();
|
|
3264
3495
|
dec3 = new TextDecoder();
|
|
3265
3496
|
BRANCH = "main";
|
|
@@ -3270,6 +3501,7 @@ var init_engine = __esm({
|
|
|
3270
3501
|
dirOf = (n) => n;
|
|
3271
3502
|
repoArgOf = (ws) => `/work/ws/${ws}`;
|
|
3272
3503
|
gitdirOf = (ws) => `/work/ws/${ws}/nomos.git`;
|
|
3504
|
+
headOf = (eng, ws) => kgit.resolveRef(eng, gitdirOf(ws), BRANCH) ?? "";
|
|
3273
3505
|
birthCertificateLawPayload = (certificate) => ({
|
|
3274
3506
|
child: certificate.child,
|
|
3275
3507
|
founder: certificate.founder,
|
|
@@ -3600,13 +3832,6 @@ var init_engine = __esm({
|
|
|
3600
3832
|
}
|
|
3601
3833
|
return response.outcome.value.certificate;
|
|
3602
3834
|
};
|
|
3603
|
-
readPosture = (eng, ws, principal = "", authToken = "", nowUnix = 0, authorSecret = "") => namedQueryProto(
|
|
3604
|
-
eng,
|
|
3605
|
-
ws,
|
|
3606
|
-
QueryOperation.READ_POSTURE,
|
|
3607
|
-
{},
|
|
3608
|
-
queryAuthorityOptions(principal, [], authToken, nowUnix, authorSecret)
|
|
3609
|
-
);
|
|
3610
3835
|
count = (eng, ws, countId, groupKey, principal = "", authToken = "", nowUnix = 0, authorSecret = "") => applicationQueryProto(eng, ws, {
|
|
3611
3836
|
case: "count",
|
|
3612
3837
|
value: create(TallyQuerySchema, { id: countId, groupKey, principal })
|
|
@@ -3674,7 +3899,7 @@ __export(bootstrap_exports, {
|
|
|
3674
3899
|
platformGenesisDomain: () => platformGenesisDomain
|
|
3675
3900
|
});
|
|
3676
3901
|
import { readFileSync } from "node:fs";
|
|
3677
|
-
import { createHash } from "node:crypto";
|
|
3902
|
+
import { createHash, generateKeyPairSync, sign as nodeSign } from "node:crypto";
|
|
3678
3903
|
import path from "node:path";
|
|
3679
3904
|
import { pathToFileURL } from "node:url";
|
|
3680
3905
|
async function loadApplicationFrameworkCalls(lawUsdzPath) {
|
|
@@ -3691,7 +3916,7 @@ async function loadApplicationFrameworkCalls(lawUsdzPath) {
|
|
|
3691
3916
|
);
|
|
3692
3917
|
}
|
|
3693
3918
|
const calls = generated.nomosInternalFrameworkCalls;
|
|
3694
|
-
if (calls === void 0 || typeof calls.identity?.enrollSigner !== "function" || typeof calls.identity?.setAuthProvider !== "function" || typeof calls.birth?.seedBirthPolicy !== "function" || typeof calls.birth?.seedBirthAttestation !== "function" || typeof calls.birth?.seedGenesis !== "function") {
|
|
3919
|
+
if (calls === void 0 || typeof calls.identity?.enrollAdmissionCheckpointSigner !== "function" || typeof calls.identity?.enrollSigner !== "function" || typeof calls.identity?.setAuthProvider !== "function" || typeof calls.birth?.seedAuthProvider !== "function" || typeof calls.birth?.seedBirthPolicy !== "function" || typeof calls.birth?.seedBirthAttestation !== "function" || typeof calls.birth?.seedGenesis !== "function") {
|
|
3695
3920
|
throw new Error(
|
|
3696
3921
|
`the generated application binding ${headlessPath} does not expose the complete typed bootstrap call set`
|
|
3697
3922
|
);
|
|
@@ -3753,6 +3978,59 @@ function devAuthProviderPayload(initial, nowMillis = Date.now(), operator = "use
|
|
|
3753
3978
|
setAt: nowMillis
|
|
3754
3979
|
};
|
|
3755
3980
|
}
|
|
3981
|
+
function syntheticIdentityProvider(platform, generation = 0) {
|
|
3982
|
+
const { privateKey, publicKey } = generateKeyPairSync("ec", {
|
|
3983
|
+
namedCurve: "P-256"
|
|
3984
|
+
});
|
|
3985
|
+
const jwk = publicKey.export({ format: "jwk" });
|
|
3986
|
+
const kid = generation === 0 ? "dev-idp" : `dev-idp-${generation}`;
|
|
3987
|
+
const issuer = `https://dev-idp.local/${platform}`;
|
|
3988
|
+
const audience = `${platform}-app`;
|
|
3989
|
+
const publicKeys = [
|
|
3990
|
+
{
|
|
3991
|
+
kty: "EC",
|
|
3992
|
+
crv: "P-256",
|
|
3993
|
+
kid,
|
|
3994
|
+
alg: "ES256",
|
|
3995
|
+
use: "sig",
|
|
3996
|
+
x: jwk.x,
|
|
3997
|
+
y: jwk.y
|
|
3998
|
+
}
|
|
3999
|
+
];
|
|
4000
|
+
const jwks = JSON.stringify({ keys: publicKeys });
|
|
4001
|
+
const b64url = (bytes) => Buffer.from(bytes).toString("base64url");
|
|
4002
|
+
const mint = (claims) => {
|
|
4003
|
+
const header = b64url(JSON.stringify({ alg: "ES256", typ: "JWT", kid }));
|
|
4004
|
+
const payload = b64url(
|
|
4005
|
+
JSON.stringify({
|
|
4006
|
+
iss: issuer,
|
|
4007
|
+
aud: audience,
|
|
4008
|
+
nbf: 0,
|
|
4009
|
+
exp: 4102444800,
|
|
4010
|
+
...claims
|
|
4011
|
+
})
|
|
4012
|
+
);
|
|
4013
|
+
const signingInput = `${header}.${payload}`;
|
|
4014
|
+
const signature = b64url(
|
|
4015
|
+
nodeSign("sha256", Buffer.from(signingInput), {
|
|
4016
|
+
key: privateKey,
|
|
4017
|
+
dsaEncoding: "ieee-p1363"
|
|
4018
|
+
})
|
|
4019
|
+
);
|
|
4020
|
+
return `${signingInput}.${signature}`;
|
|
4021
|
+
};
|
|
4022
|
+
return {
|
|
4023
|
+
issuer,
|
|
4024
|
+
audience,
|
|
4025
|
+
jwks,
|
|
4026
|
+
publicKeys,
|
|
4027
|
+
jwksUrl: `${issuer}/jwks.json`,
|
|
4028
|
+
label: "dev",
|
|
4029
|
+
requireDeviceBinding: "true",
|
|
4030
|
+
kid,
|
|
4031
|
+
mint
|
|
4032
|
+
};
|
|
4033
|
+
}
|
|
3756
4034
|
function firebaseIdentityProvider(project, jwks) {
|
|
3757
4035
|
const id = project.trim();
|
|
3758
4036
|
if (!/^[a-z][a-z0-9-]{4,61}[a-z0-9]$/.test(id)) {
|
|
@@ -3846,18 +4124,7 @@ async function bootstrapPlatform(dev, opts) {
|
|
|
3846
4124
|
const sOp = authorKeygen(eng);
|
|
3847
4125
|
const opKeyHash = createHash("sha256").update(Buffer.from(sOp.public, "base64")).digest("hex");
|
|
3848
4126
|
const foundingPrincipal = `key:${opKeyHash}`;
|
|
3849
|
-
const
|
|
3850
|
-
const { privateKey: idpPrivateKey, publicKey: idpPublicKey } = generateKeyPairSync("ec", { namedCurve: "P-256" });
|
|
3851
|
-
const idpJwk = idpPublicKey.export({ format: "jwk" });
|
|
3852
|
-
const syntheticIdp = {
|
|
3853
|
-
issuer: `https://dev-idp.local/${platform}`,
|
|
3854
|
-
audience: `${platform}-app`,
|
|
3855
|
-
jwks: JSON.stringify({ keys: [{ kty: "EC", crv: "P-256", kid: "dev-idp", alg: "ES256", use: "sig", x: idpJwk.x, y: idpJwk.y }] }),
|
|
3856
|
-
publicKeys: [{ kty: "EC", crv: "P-256", kid: "dev-idp", alg: "ES256", use: "sig", x: idpJwk.x, y: idpJwk.y }],
|
|
3857
|
-
jwksUrl: `https://dev-idp.local/${platform}/jwks.json`,
|
|
3858
|
-
label: "dev",
|
|
3859
|
-
requireDeviceBinding: "true"
|
|
3860
|
-
};
|
|
4127
|
+
const syntheticIdp = syntheticIdentityProvider(platform);
|
|
3861
4128
|
const selectedIdp = opts.firebaseProject ? firebaseIdentityProvider(
|
|
3862
4129
|
opts.firebaseProject,
|
|
3863
4130
|
await (async () => {
|
|
@@ -3871,13 +4138,6 @@ async function bootstrapPlatform(dev, opts) {
|
|
|
3871
4138
|
const idpIssuer = selectedIdp.issuer;
|
|
3872
4139
|
const idpAudience = selectedIdp.audience;
|
|
3873
4140
|
const idpJwks = selectedIdp.jwks;
|
|
3874
|
-
const b64url = (b) => Buffer.from(b).toString("base64url");
|
|
3875
|
-
const mintDevToken = (claims) => {
|
|
3876
|
-
const header = b64url(JSON.stringify({ alg: "ES256", typ: "JWT", kid: "dev-idp" }));
|
|
3877
|
-
const payload = b64url(JSON.stringify({ iss: idpIssuer, aud: idpAudience, nbf: 0, exp: 4102444800, ...claims }));
|
|
3878
|
-
const si = `${header}.${payload}`;
|
|
3879
|
-
return `${si}.${b64url(nodeSign("sha256", Buffer.from(si), { key: idpPrivateKey, dsaEncoding: "ieee-p1363" }))}`;
|
|
3880
|
-
};
|
|
3881
4141
|
const platformCert = certSign(eng, {
|
|
3882
4142
|
child: platform,
|
|
3883
4143
|
founder: foundingPrincipal,
|
|
@@ -3926,7 +4186,7 @@ async function bootstrapPlatform(dev, opts) {
|
|
|
3926
4186
|
ISS: idpIssuer,
|
|
3927
4187
|
AUD: idpAudience,
|
|
3928
4188
|
JWKS: idpJwks,
|
|
3929
|
-
...opts.firebaseProject ? {} : { mint:
|
|
4189
|
+
...opts.firebaseProject ? {} : { mint: syntheticIdp.mint },
|
|
3930
4190
|
apPayload
|
|
3931
4191
|
};
|
|
3932
4192
|
}
|
|
@@ -3986,6 +4246,20 @@ async function bootstrapPlatform(dev, opts) {
|
|
|
3986
4246
|
}
|
|
3987
4247
|
log2(`application birth policy seeded from the compiled scenario (${applicationMaxChildWorkspaces} child workspaces per principal)`);
|
|
3988
4248
|
}
|
|
4249
|
+
if (pendingIdP) {
|
|
4250
|
+
const seededAuthProvider = await preWarrant(
|
|
4251
|
+
applicationFrameworkCalls.birth.seedAuthProvider({
|
|
4252
|
+
domain: homeDomain,
|
|
4253
|
+
workspace: platform,
|
|
4254
|
+
...pendingIdP.apPayload
|
|
4255
|
+
})
|
|
4256
|
+
);
|
|
4257
|
+
if (!seededAuthProvider.ok) {
|
|
4258
|
+
throw new Error(
|
|
4259
|
+
`platform AuthProvider seed REFUSED: ${String(seededAuthProvider.error).slice(0, 400)}`
|
|
4260
|
+
);
|
|
4261
|
+
}
|
|
4262
|
+
}
|
|
3989
4263
|
const warrant = await signed(applicationFrameworkCalls.birth.seedGenesis({
|
|
3990
4264
|
domain: homeDomain,
|
|
3991
4265
|
workspace: platform,
|
|
@@ -3994,32 +4268,78 @@ async function bootstrapPlatform(dev, opts) {
|
|
|
3994
4268
|
bornAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
3995
4269
|
}));
|
|
3996
4270
|
if (!warrant.ok) throw new Error(`platform WARRANT (seedGenesis) REFUSED: ${String(warrant.error).slice(0, 400)}`);
|
|
4271
|
+
const checkpoint = dev.admissionCheckpoint;
|
|
4272
|
+
if (checkpoint === void 0) {
|
|
4273
|
+
throw new Error("dev bootstrap has no runtime admission checkpoint identity");
|
|
4274
|
+
}
|
|
4275
|
+
const checkpointKeyHash = createHash("sha256").update(Buffer.from(checkpoint.public, "base64")).digest("hex");
|
|
4276
|
+
const checkpointEnrollment = await signed(
|
|
4277
|
+
applicationFrameworkCalls.identity.enrollAdmissionCheckpointSigner({
|
|
4278
|
+
domain: homeDomain,
|
|
4279
|
+
workspace: platform,
|
|
4280
|
+
keyHash: checkpointKeyHash,
|
|
4281
|
+
validFromEpoch: 0,
|
|
4282
|
+
grantedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
4283
|
+
})
|
|
4284
|
+
);
|
|
4285
|
+
if (!checkpointEnrollment.ok) {
|
|
4286
|
+
throw new Error(
|
|
4287
|
+
`platform admission checkpoint enrollment REFUSED: ${String(checkpointEnrollment.error).slice(0, 400)}`
|
|
4288
|
+
);
|
|
4289
|
+
}
|
|
3997
4290
|
dev.operatorDevice = sOp;
|
|
3998
4291
|
dev.operatorPrincipal = foundingPrincipal;
|
|
3999
4292
|
if (pendingIdP) {
|
|
4000
|
-
|
|
4001
|
-
|
|
4002
|
-
|
|
4003
|
-
applicationFrameworkCalls.identity.setAuthProvider({
|
|
4004
|
-
domain: homeDomain,
|
|
4005
|
-
workspace: platform,
|
|
4006
|
-
...pendingIdP.apPayload
|
|
4007
|
-
}),
|
|
4008
|
-
lawHash,
|
|
4009
|
-
{ actor: foundingPrincipal, authorSecret: sOp.secret }
|
|
4010
|
-
));
|
|
4011
|
-
if (ap.ok) {
|
|
4012
|
-
if (pendingIdP.mint) {
|
|
4013
|
-
devIdP = { issuer: pendingIdP.ISS, audience: pendingIdP.AUD, jwks: pendingIdP.JWKS, mint: pendingIdP.mint };
|
|
4014
|
-
log2(`dev test IdP registered (setAuthProvider ${pendingIdP.ISS}, aud ${pendingIdP.AUD}) \u2014 mint tokens via POST /dev/mint-token`);
|
|
4015
|
-
} else {
|
|
4016
|
-
log2(`Firebase AuthProvider registered (setAuthProvider ${pendingIdP.ISS}, aud ${pendingIdP.AUD}) \u2014 signed-in clients use their real Firebase ID token`);
|
|
4017
|
-
}
|
|
4293
|
+
if (pendingIdP.mint) {
|
|
4294
|
+
devIdP = { issuer: pendingIdP.ISS, audience: pendingIdP.AUD, jwks: pendingIdP.JWKS, mint: pendingIdP.mint };
|
|
4295
|
+
log2(`dev test IdP registered (seedAuthProvider ${pendingIdP.ISS}, aud ${pendingIdP.AUD}) \u2014 mint tokens via POST /dev/mint-token`);
|
|
4018
4296
|
} else {
|
|
4019
|
-
log2(`
|
|
4297
|
+
log2(`Firebase AuthProvider registered (seedAuthProvider ${pendingIdP.ISS}, aud ${pendingIdP.AUD}) \u2014 signed-in clients use their real Firebase ID token`);
|
|
4020
4298
|
}
|
|
4021
4299
|
}
|
|
4022
4300
|
dev.testIdP = devIdP;
|
|
4301
|
+
if (!opts.firebaseProject && applicationFrameworkCalls && devIdP) {
|
|
4302
|
+
let generation = 0;
|
|
4303
|
+
let lastProviderEpoch = pendingIdP?.apPayload.keySet.epoch ?? 0;
|
|
4304
|
+
dev.rotateTestIdP = async () => {
|
|
4305
|
+
const next = syntheticIdentityProvider(platform, ++generation);
|
|
4306
|
+
const providerEpoch = Math.max(Date.now(), lastProviderEpoch + 1);
|
|
4307
|
+
const payload = devAuthProviderPayload(
|
|
4308
|
+
next,
|
|
4309
|
+
providerEpoch,
|
|
4310
|
+
foundingPrincipal
|
|
4311
|
+
);
|
|
4312
|
+
const admitted = await serialize(
|
|
4313
|
+
async () => authorOperatorCall(
|
|
4314
|
+
eng,
|
|
4315
|
+
platform,
|
|
4316
|
+
applicationFrameworkCalls.identity.setAuthProvider({
|
|
4317
|
+
domain: homeDomain,
|
|
4318
|
+
workspace: platform,
|
|
4319
|
+
...payload
|
|
4320
|
+
}),
|
|
4321
|
+
lawHash,
|
|
4322
|
+
{ actor: foundingPrincipal, authorSecret: sOp.secret }
|
|
4323
|
+
)
|
|
4324
|
+
);
|
|
4325
|
+
if (!admitted.ok) {
|
|
4326
|
+
throw new Error(
|
|
4327
|
+
`test IdP rotation setAuthProvider REFUSED: ${String(admitted.error).slice(0, 600)}`
|
|
4328
|
+
);
|
|
4329
|
+
}
|
|
4330
|
+
lastProviderEpoch = providerEpoch;
|
|
4331
|
+
dev.testIdP = {
|
|
4332
|
+
issuer: next.issuer,
|
|
4333
|
+
audience: next.audience,
|
|
4334
|
+
jwks: next.jwks,
|
|
4335
|
+
mint: next.mint
|
|
4336
|
+
};
|
|
4337
|
+
log2(
|
|
4338
|
+
`dev test IdP rotated lawfully to ${next.kid} (provider epoch ${providerEpoch})`
|
|
4339
|
+
);
|
|
4340
|
+
return { providerEpoch, kid: next.kid };
|
|
4341
|
+
};
|
|
4342
|
+
}
|
|
4023
4343
|
log2(`root-attested platform: founding key ${opKeyHash.slice(0, 12)}\u2026 signed GenesisWarrant, seeded BirthAttestation (platform_cert signed by K_root, P_P=${sP.public.slice(0, 12)}\u2026), WARRANTED (self-id ${platform})`);
|
|
4024
4344
|
log2(" a birthHome under this platform now assembles [home_cert, u_delegation(S_P), platform_cert(K_root)] \u2014 no unwarranted-cert.");
|
|
4025
4345
|
log2(" ENROLL each user via the warranted lane: enrollFirstDevice (AuthProvider) or enrollDelegation (S_P-signed cert).");
|
|
@@ -4117,7 +4437,7 @@ import { readFileSync as readFileSync2, writeFileSync, existsSync as existsSync2
|
|
|
4117
4437
|
import { fileURLToPath } from "node:url";
|
|
4118
4438
|
import path2 from "node:path";
|
|
4119
4439
|
import os from "node:os";
|
|
4120
|
-
import { fromBinary as fromBinary2 } from "@bufbuild/protobuf";
|
|
4440
|
+
import { create as create3, fromBinary as fromBinary2, toBinary as toBinary3 } from "@bufbuild/protobuf";
|
|
4121
4441
|
|
|
4122
4442
|
// ../adapter/custody-offer-transport.ts
|
|
4123
4443
|
init_kernel_pb();
|
|
@@ -4125,30 +4445,32 @@ import { create as create2, toBinary as toBinary2 } from "@bufbuild/protobuf";
|
|
|
4125
4445
|
|
|
4126
4446
|
// ../adapter/proto/nomos/runtime/v2/runtime_pb.js
|
|
4127
4447
|
init_kernel_pb();
|
|
4128
|
-
import { enumDesc as enumDesc3, fileDesc as
|
|
4448
|
+
import { enumDesc as enumDesc3, fileDesc as fileDesc4, messageDesc as messageDesc4, serviceDesc as serviceDesc2, tsEnum as tsEnum3 } from "@bufbuild/protobuf/codegenv2";
|
|
4129
4449
|
|
|
4130
4450
|
// ../adapter/proto/nomos/kernel/v1/progress_pb.js
|
|
4131
|
-
import { enumDesc as enumDesc2, fileDesc as
|
|
4132
|
-
var file_nomos_kernel_v1_progress = /* @__PURE__ */
|
|
4451
|
+
import { enumDesc as enumDesc2, fileDesc as fileDesc3, messageDesc as messageDesc3, tsEnum as tsEnum2 } from "@bufbuild/protobuf/codegenv2";
|
|
4452
|
+
var file_nomos_kernel_v1_progress = /* @__PURE__ */ fileDesc3("Ch5ub21vcy9rZXJuZWwvdjEvcHJvZ3Jlc3MucHJvdG8SD25vbW9zLmtlcm5lbC52MSLEAwoWS2VybmVsUHJvZ3Jlc3NTbmFwc2hvdBIWCg5zY2hlbWFfdmVyc2lvbhgBIAEoDRIQCghzZXF1ZW5jZRgCIAEoBBI7CglvcGVyYXRpb24YAyABKA4yKC5ub21vcy5rZXJuZWwudjEuS2VybmVsUHJvZ3Jlc3NPcGVyYXRpb24SMwoFcGhhc2UYBCABKA4yJC5ub21vcy5rZXJuZWwudjEuS2VybmVsUHJvZ3Jlc3NQaGFzZRIXCg9jb21wbGV0ZWRfdW5pdHMYBSABKAQSEwoLdG90YWxfdW5pdHMYBiABKAQSMQoEdW5pdBgHIAEoDjIjLm5vbW9zLmtlcm5lbC52MS5LZXJuZWxQcm9ncmVzc1VuaXQSEAoIdGVybWluYWwYCCABKAgSHAoUYWxsb2NhdG9yX2xpdmVfYnl0ZXMYCSABKAQSHAoUYWxsb2NhdG9yX3BlYWtfYnl0ZXMYCiABKAQSQwoSbGF3X2h5ZHJhdGlvbl9zdGVwGAsgASgOMicubm9tb3Mua2VybmVsLnYxLktlcm5lbExhd0h5ZHJhdGlvblN0ZXASGgoSbGF3X3BhY2thZ2Vfc2hhMjU2GAwgASgJKnAKF0tlcm5lbFByb2dyZXNzT3BlcmF0aW9uEikKJUtFUk5FTF9QUk9HUkVTU19PUEVSQVRJT05fVU5TUEVDSUZJRUQQABIqCiZLRVJORUxfUFJPR1JFU1NfT1BFUkFUSU9OX1JFU1RPUkVfTUFJThABKtkDChNLZXJuZWxQcm9ncmVzc1BoYXNlEiUKIUtFUk5FTF9QUk9HUkVTU19QSEFTRV9VTlNQRUNJRklFRBAAEicKI0tFUk5FTF9QUk9HUkVTU19QSEFTRV9DSEVDS19DVVNUT0RZEAESJAogS0VSTkVMX1BST0dSRVNTX1BIQVNFX1JFQURfQ0hBSU4QAhIrCidLRVJORUxfUFJPR1JFU1NfUEhBU0VfSU5JVElBTElaRV9FTkdJTkUQAxInCiNLRVJORUxfUFJPR1JFU1NfUEhBU0VfUkVBRF9USU1FTElORRAEEiUKIUtFUk5FTF9QUk9HUkVTU19QSEFTRV9IWURSQVRFX0xBVxAFEioKJktFUk5FTF9QUk9HUkVTU19QSEFTRV9SRUNPVkVSWV9QUkVTQ0FOEAYSKAokS0VSTkVMX1BST0dSRVNTX1BIQVNFX1ZFUklGWV9JTlRFTlRTEAcSKQolS0VSTkVMX1BST0dSRVNTX1BIQVNFX1BST01PVEVfQ1VTVE9EWRAIEioKJktFUk5FTF9QUk9HUkVTU19QSEFTRV9SRUJVSUxEX0ZST05USUVSEAkSIgoeS0VSTkVMX1BST0dSRVNTX1BIQVNFX0NPTVBMRVRFEAoqgQEKEktlcm5lbFByb2dyZXNzVW5pdBIkCiBLRVJORUxfUFJPR1JFU1NfVU5JVF9VTlNQRUNJRklFRBAAEh8KG0tFUk5FTF9QUk9HUkVTU19VTklUX0lOVEVOVBABEiQKIEtFUk5FTF9QUk9HUkVTU19VTklUX0xBV19QQUNLQUdFEAIqqwIKFktlcm5lbExhd0h5ZHJhdGlvblN0ZXASKQolS0VSTkVMX0xBV19IWURSQVRJT05fU1RFUF9VTlNQRUNJRklFRBAAEioKJktFUk5FTF9MQVdfSFlEUkFUSU9OX1NURVBfUkVBRF9DTE9TVVJFEAESKwonS0VSTkVMX0xBV19IWURSQVRJT05fU1RFUF9DT01QT1NFX1NUQUdFEAISLAooS0VSTkVMX0xBV19IWURSQVRJT05fU1RFUF9ERVJJVkVfU0NIRU1BUxADEi8KK0tFUk5FTF9MQVdfSFlEUkFUSU9OX1NURVBfTE9BRF9QT0xJQ1lfU0hFTEwQBBIuCipLRVJORUxfTEFXX0hZRFJBVElPTl9TVEVQX1BBQ0tBR0VfQ09NUExFVEUQBWIGcHJvdG8z");
|
|
4133
4453
|
|
|
4134
4454
|
// ../adapter/proto/nomos/runtime/v2/runtime_pb.js
|
|
4135
|
-
var file_nomos_runtime_v2_runtime = /* @__PURE__ */ fileDesc3("Ch5ub21vcy9ydW50aW1lL3YyL3J1bnRpbWUucHJvdG8SEG5vbW9zLnJ1bnRpbWUudjIioAkKDlJ1bnRpbWVSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoBBIyCgV0cmFjZRgDIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuVHJhY2VDb250ZXh0SAGIAQESOgoLa2VybmVsX2NhbGwYCiABKAsyIy5ub21vcy5ydW50aW1lLnYyLktlcm5lbENhbGxSZXF1ZXN0SAASMwoHY29ubmVjdBgLIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuQ29ubmVjdFJlcXVlc3RIABJCCg9saXN0X3dvcmtzcGFjZXMYDCABKAsyJy5ub21vcy5ydW50aW1lLnYyLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdEgAEkgKEnNuYXBzaG90X3dvcmtzcGFjZRgNIAEoCzIqLm5vbW9zLnJ1bnRpbWUudjIuU25hcHNob3RXb3Jrc3BhY2VSZXF1ZXN0SAASQAoOc3luY193b3Jrc3BhY2UYDiABKAsyJi5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXF1ZXN0SAASQQoPc3RhcnRfYXV0b19zeW5jGA8gASgLMiYubm9tb3MucnVudGltZS52Mi5TdGFydEF1dG9TeW5jUmVxdWVzdEgAEj8KDnN0b3BfYXV0b19zeW5jGBAgASgLMiUubm9tb3MucnVudGltZS52Mi5TdG9wQXV0b1N5bmNSZXF1ZXN0SAASLwoFd2F0Y2gYESABKAsyHi5ub21vcy5ydW50aW1lLnYyLldhdGNoUmVxdWVzdEgAEjMKB3Vud2F0Y2gYEiABKAsyIC5ub21vcy5ydW50aW1lLnYyLlVud2F0Y2hSZXF1ZXN0SAASQAoOcHJlcGFyZV9kb21haW4YEyABKAsyJi5ub21vcy5ydW50aW1lLnYyLlByZXBhcmVEb21haW5SZXF1ZXN0SAASTQoVcmVzb2x2ZV9jdXN0b2R5X2JyZWFrGBQgASgLMiwubm9tb3MucnVudGltZS52Mi5SZXNvbHZlQ3VzdG9keUJyZWFrUmVxdWVzdEgAEjoKC2Nsb3NlX3JlYWxtGBUgASgLMiMubm9tb3MucnVudGltZS52Mi5DbG9zZVJlYWxtUmVxdWVzdEgAEjoKC2RlYWRfbGV0dGVyGBYgASgLMiMubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmVxdWVzdEgAEkAKDmhpc3RvcmljX3F1ZXJ5GBcgASgLMiYubm9tb3MucnVudGltZS52Mi5IaXN0b3JpY1F1ZXJ5UmVxdWVzdEgAEkIKD21vZGVsX2xpZmVjeWNsZRgYIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxMaWZlY3ljbGVSZXF1ZXN0SAASXQodZXN0YWJsaXNoX2FwcGxpY2F0aW9uX2N1c3RvZHkYGSABKAsyNC5ub21vcy5ydW50aW1lLnYyLkVzdGFibGlzaEFwcGxpY2F0aW9uQ3VzdG9keVJlcXVlc3RIAEIJCgdjb21tYW5kQggKBl90cmFjZSJTChFLZXJuZWxDYWxsUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEi0KB3JlcXVlc3QYAiABKAsyHC5ub21vcy5rZXJuZWwudjEuQ2FsbFJlcXVlc3Qi8QIKIkVzdGFibGlzaEFwcGxpY2F0aW9uQ3VzdG9keVJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIOCgZwYXJlbnQYAiABKAkSEQoJcHJpbmNpcGFsGAMgASgJEg8KB3N1YmplY3QYBCABKAkSFQoNZGV2aWNlX3NlY3JldBgFIAEoDBIVCg1kZXZpY2VfcHVibGljGAYgASgMEhIKCmF1dGhfdG9rZW4YByABKAkSEAoIaWRfdG9rZW4YCCABKAkSFAoMdmVyaWZpZWRfdmlhGAkgASgJEg8KB2Jvcm5fYXQYCiABKAkSOwoTZW5yb2xsX2ZpcnN0X2RldmljZRgLIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5EaXJlY3RpdmVDYWxsEj0KFWJpcnRoX3JlY2VpdmluZ19ncm91cBgMIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5EaXJlY3RpdmVDYWxsEg8KB2NvbmZpcm0YDSABKAginwEKHUFwcGxpY2F0aW9uQ3VzdG9keUVzdGFibGlzaGVkEgwKBGhvbWUYASABKAkSFwoKY2hpbGRfaGVhZBgCIAEoCUgAiAEBEhAKCHZlcmlmaWVkGAMgASgIEh8KEnZlcmlmaWNhdGlvbl9lcnJvchgEIAEoCUgBiAEBQg0KC19jaGlsZF9oZWFkQhUKE192ZXJpZmljYXRpb25fZXJyb3IiZQoUSGlzdG9yaWNRdWVyeVJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIOCgZtb21lbnQYAiABKAkSLAoFcXVlcnkYAyABKAsyHS5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXF1ZXN0IrUJCg9SdW50aW1lUmVzcG9uc2USGAoQcHJvdG9jb2xfdmVyc2lvbhgBIAEoDRISCgpyZXF1ZXN0X2lkGAIgASgEEjMKB2ZhaWx1cmUYCiABKAsyIC5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVGYWlsdXJlSAASNAoLa2VybmVsX2NhbGwYCyABKAsyHS5ub21vcy5rZXJuZWwudjEuQ2FsbFJlc3BvbnNlSAASMAoJY29ubmVjdGVkGAwgASgLMhsubm9tb3MucnVudGltZS52Mi5Db25uZWN0ZWRIABI5Cg53b3Jrc3BhY2VfbGlzdBgNIAEoCzIfLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlTGlzdEgAEkEKEndvcmtzcGFjZV9zbmFwc2hvdBgOIAEoCzIjLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlU25hcHNob3RIABJBCg5zeW5jX3dvcmtzcGFjZRgPIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuU3luY1dvcmtzcGFjZVJlc3BvbnNlSAASPgoRYXV0b19zeW5jX3N0YXJ0ZWQYECABKAsyIS5ub21vcy5ydW50aW1lLnYyLkF1dG9TeW5jU3RhcnRlZEgAEj4KEWF1dG9fc3luY19zdG9wcGVkGBEgASgLMiEubm9tb3MucnVudGltZS52Mi5BdXRvU3luY1N0b3BwZWRIABI3Cg13YXRjaF9zdGFydGVkGBIgASgLMh4ubm9tb3MucnVudGltZS52Mi5XYXRjaFN0YXJ0ZWRIABI3Cg13YXRjaF9zdG9wcGVkGBMgASgLMh4ubm9tb3MucnVudGltZS52Mi5XYXRjaFN0b3BwZWRIABI7Cg9kb21haW5fcHJlcGFyZWQYFCABKAsyIC5ub21vcy5ydW50aW1lLnYyLkRvbWFpblByZXBhcmVkSAASSAoWY3VzdG9keV9icmVha19yZXNvbHZlZBgVIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrUmVzb2x2ZWRIABI1CgxyZWFsbV9jbG9zZWQYFiABKAsyHS5ub21vcy5ydW50aW1lLnYyLlJlYWxtQ2xvc2VkSAASMwoHYmxvY2tlZBgXIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUJsb2NrZWRIABJIChZyZW1vdGVfb2ZmZXJfYWRtaXNzaW9uGBggASgLMiYubm9tb3MucnVudGltZS52Mi5SZW1vdGVPZmZlckFkbWlzc2lvbkgAEjsKC2RlYWRfbGV0dGVyGBkgASgLMiQubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmVzcG9uc2VIABJDCg9tb2RlbF9saWZlY3ljbGUYGiABKAsyKC5ub21vcy5ydW50aW1lLnYyLk1vZGVsTGlmZWN5Y2xlUmVzcG9uc2VIABJaCh9hcHBsaWNhdGlvbl9jdXN0b2R5X2VzdGFibGlzaGVkGBsgASgLMi8ubm9tb3MucnVudGltZS52Mi5BcHBsaWNhdGlvbkN1c3RvZHlFc3RhYmxpc2hlZEgAQgkKB291dGNvbWUinwEKDlJ1bnRpbWVCbG9ja2VkEkEKCXdvcmtzcGFjZRgBIAEoCzIsLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlUmVzaWRlbmN5UmVxdWlyZWRIABJACghzaWJsaW5ncxgCIAEoCzIsLm5vbW9zLnJ1bnRpbWUudjIuU2libGluZ1Jlc2lkZW5jaWVzUmVxdWlyZWRIAEIICgZyZWFzb24iLwoaV29ya3NwYWNlUmVzaWRlbmN5UmVxdWlyZWQSEQoJd29ya3NwYWNlGAEgASgJIlUKGFNpYmxpbmdSZXNpZGVuY3lSZXF1aXJlZBIRCgl3b3Jrc3BhY2UYASABKAkSEwoLc291cmNlX2hlYWQYAiABKAkSEQoJZm9sZF9yb290GAMgASgJIl0KGlNpYmxpbmdSZXNpZGVuY2llc1JlcXVpcmVkEj8KC3Jlc2lkZW5jaWVzGAEgAygLMioubm9tb3MucnVudGltZS52Mi5TaWJsaW5nUmVzaWRlbmN5UmVxdWlyZWQihgIKFFJlbW90ZU9mZmVyQWRtaXNzaW9uEhEKCXdvcmtzcGFjZRgBIAEoCRIMCgRtYWluGAIgASgJEhgKC3NlYWxlZF9tYWluGAMgASgJSACIAQESLwoHdmVyZGljdBgEIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5PZmZlclJlc3BvbnNlEjMKDGJvcm5fY3VzdG9keRgFIAMoCzIdLm5vbW9zLnJ1bnRpbWUudjIuQm9ybkN1c3RvZHkSEwoLcmVzdWx0X3BhY2sYBiABKAwSGAoLcmVzdWx0X2Jhc2UYByABKAlIAYgBAUIOCgxfc2VhbGVkX21haW5CDgoMX3Jlc3VsdF9iYXNlIkoKC0Jvcm5DdXN0b2R5Ei0KBWNoaWxkGAEgASgLMh4ubm9tb3Mua2VybmVsLnYxLkJvcm5Xb3Jrc3BhY2USDAoEcGFjaxgCIAEoDCL5AQoYQ3VzdG9keU9mZmVyQmF0Y2hSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoCRI3CgZpbmxpbmUYAyABKAsyJS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbmxpbmVPZmZlcnNIABJGChFzZXNzaW9uX2NhbmRpZGF0ZRgEIAEoCzIpLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keVNlc3Npb25DYW5kaWRhdGVIABIWCgliYXNlX2hlYWQYBSABKAlIAYgBAUIICgZzb3VyY2VCDAoKX2Jhc2VfaGVhZCJOChJDdXN0b2R5SW50ZW50T2ZmZXISDwoHc2Vzc2lvbhgBIAEoCRISCgpjb21taXRfb2lkGAIgASgJEhMKC2NoYW5nZV91c2RhGAMgASgMIksKE0N1c3RvZHlJbmxpbmVPZmZlcnMSNAoGb2ZmZXJzGAEgAygLMiQubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW50ZW50T2ZmZXIiLAoXQ3VzdG9keVNlc3Npb25DYW5kaWRhdGUSEQoJcmVmZXJlbmNlGAEgASgJIvcBChlDdXN0b2R5T2ZmZXJCYXRjaFJlc3BvbnNlEhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoCRI3CglhZG1pc3Npb24YCiABKAsyIi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlBZG1pc3Npb25IABIzCgdmYWlsdXJlGAsgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAEjMKB2Jsb2NrZWQYDCABKAsyIC5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVCbG9ja2VkSABCCQoHb3V0Y29tZSLuAgoQQ3VzdG9keUFkbWlzc2lvbhIMCgRtYWluGAEgASgJEhgKC3NlYWxlZF9tYWluGAIgASgJSACIAQESOwoIc2Vzc2lvbnMYAyADKAsyKS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlTZXNzaW9uQWRtaXNzaW9uEjUKDmJpcnRoX291dGNvbWVzGAQgAygLMh0ubm9tb3Mua2VybmVsLnYxLkJpcnRoT3V0Y29tZRIzCgxib3JuX2N1c3RvZHkYBSADKAsyHS5ub21vcy5ydW50aW1lLnYyLkJvcm5DdXN0b2R5EhMKC3Jlc3VsdF9wYWNrGAYgASgMEhgKC3Jlc3VsdF9iYXNlGAcgASgJSAGIAQESOgoHdGltaW5ncxgIIAEoCzIpLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUFkbWlzc2lvblRpbWluZ3NCDgoMX3NlYWxlZF9tYWluQg4KDF9yZXN1bHRfYmFzZSJlChdDdXN0b2R5U2Vzc2lvbkFkbWlzc2lvbhIPCgdzZXNzaW9uGAEgASgJEjkKB2ludGVudHMYAiADKAsyKC5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbnRlbnRBZG1pc3Npb24ikAIKFkN1c3RvZHlJbnRlbnRBZG1pc3Npb24SEgoKY29tbWl0X29pZBgBIAEoCRIWCglpbnRlbnRfaWQYAiABKAlIAYgBARI7CghhZG1pdHRlZBgKIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudEFkbWl0dGVkSAASOQoHc2tpcHBlZBgLIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudFNraXBwZWRIABI5CgdyZWZ1c2VkGAwgASgLMiYubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW50ZW50UmVmdXNlZEgAQgkKB291dGNvbWVCDAoKX2ludGVudF9pZCKQAQoVQ3VzdG9keUludGVudEFkbWl0dGVkEgwKBGhlYWQYASABKAkSMwoHY3JlYXRlZBgCIAMoCzIiLm5vbW9zLmtlcm5lbC52MS5PZmZlckFnZ3JlZ2F0ZVJlZhI0CghhZmZlY3RlZBgDIAMoCzIiLm5vbW9zLmtlcm5lbC52MS5PZmZlckFnZ3JlZ2F0ZVJlZiIvChRDdXN0b2R5SW50ZW50U2tpcHBlZBIXCg9hbHJlYWR5X29uX21haW4YASABKAgiWgoUQ3VzdG9keUludGVudFJlZnVzZWQSDwoHbWVzc2FnZRgBIAEoCRIVCg1kZWFkX2xldHRlcmVkGAIgASgIEhEKBGhpbnQYAyABKAlIAIgBAUIHCgVfaGludCLtAQoXQ3VzdG9keUFkbWlzc2lvblRpbWluZ3MSFAoMdG90YWxfbWlsbGlzGAEgASgBEhMKC3NjYW5fbWlsbGlzGAIgASgBEhQKDGZldGNoX21pbGxpcxgDIAEoARITCgtzZWFsX21pbGxpcxgEIAEoARIYChBnYXRlX2ZvbGRfbWlsbGlzGAUgASgBEhQKDGludGVudF9jb3VudBgGIAEoDRIVCg1zZXNzaW9uX2NvdW50GAcgASgNEjUKBXNwYW5zGAggAygLMiYubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QWRtaXNzaW9uU3BhbiKXAQoUQ3VzdG9keUFkbWlzc2lvblNwYW4SCgoCaWQYASABKAkSDQoFdHJhY2sYAiABKAkSDAoEbmFtZRgDIAEoCRIMCgRraW5kGAQgASgJEg0KBWRlcHRoGAUgASgNEhsKE3N0YXJ0ZWRfdW5peF9taWxsaXMYBiABKAESHAoUZmluaXNoZWRfdW5peF9taWxsaXMYByABKAEiQgoMVHJhY2VDb250ZXh0EhAKCHRyYWNlX2lkGAEgASgMEg8KB3NwYW5faWQYAiABKAwSDwoHc2FtcGxlZBgDIAEoCCLpAQoOUnVudGltZUZhaWx1cmUSDAoEY29kZRgBIAEoCRIPCgdtZXNzYWdlGAIgASgJEhEKCWNvbXBvbmVudBgDIAEoCRIWCgl3b3Jrc3BhY2UYBCABKAlIAIgBARITCgZkb21haW4YBSABKAlIAYgBARIWCglkaXJlY3RpdmUYBiABKAlIAogBARI5CgphdHRyaWJ1dGVzGAcgAygLMiUubm9tb3MucnVudGltZS52Mi5EaWFnbm9zdGljQXR0cmlidXRlQgwKCl93b3Jrc3BhY2VCCQoHX2RvbWFpbkIMCgpfZGlyZWN0aXZlIqUBChNEaWFnbm9zdGljQXR0cmlidXRlEgwKBG5hbWUYASABKAkSFgoMc3RyaW5nX3ZhbHVlGAIgASgJSAASFwoNaW50ZWdlcl92YWx1ZRgDIAEoEkgAEhYKDGRvdWJsZV92YWx1ZRgEIAEoAUgAEhcKDWJvb2xlYW5fdmFsdWUYBSABKAhIABIVCgtieXRlc192YWx1ZRgGIAEoDEgAQgcKBXZhbHVlIs0CCg5Db25uZWN0UmVxdWVzdBIRCgl3b3Jrc3BhY2UYASABKAkSEQoJY2xpZW50X2lkGAIgASgJEhQKB3Nlc3Npb24YAyABKAlIAIgBARISCgVjbG91ZBgEIAEoCUgBiAEBEhIKCmF1dGhfdG9rZW4YBSABKAwSFQoNYXV0aG9yX3NlY3JldBgGIAEoDBIiChptYXhpbXVtX21vdW50ZWRfd29ya3NwYWNlcxgHIAEoDRIUCgxhbGxvd191bmJvcm4YCCABKAgSDwoHcmVjb3ZlchgJIAEoCBJCChRjdXN0b2R5X2JyZWFrX3BvbGljeRgKIAEoDjIkLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrUG9saWN5EhsKE2hhc19yZXN0b3JlX2N1c3RvZHkYCyABKAhCCgoIX3Nlc3Npb25CCAoGX2Nsb3VkIosBCglDb25uZWN0ZWQSEQoJd29ya3NwYWNlGAEgASgJEg8KB3Nlc3Npb24YAiABKAkSEwoLY2xvdWRfYm91bmQYAyABKAgSOAoIcmVjb3ZlcnkYBCABKAsyIS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlSZWNvdmVyeUgAiAEBQgsKCV9yZWNvdmVyeSJbCg9DdXN0b2R5UmVjb3ZlcnkSFQoNcHJldmlvdXNfaGVhZBgBIAEoCRIWCg5yZWNvdmVyZWRfaGVhZBgCIAEoCRIZChFyZWNvdmVyZWRfaW50ZW50cxgDIAEoBCIXChVMaXN0V29ya3NwYWNlc1JlcXVlc3QirQEKEFdvcmtzcGFjZVN1bW1hcnkSDwoHc2Vzc2lvbhgBIAEoCRIRCgl3b3Jrc3BhY2UYAiABKAkSNwoJcmVzaWRlbmN5GAMgASgOMiQubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VSZXNpZGVuY3kSPAoMc3luY19wb3N0dXJlGAQgASgOMiYubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTeW5jUG9zdHVyZSJHCg1Xb3Jrc3BhY2VMaXN0EjYKCndvcmtzcGFjZXMYASADKAsyIi5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZVN1bW1hcnkiTQoYU25hcHNob3RXb3Jrc3BhY2VSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSFAoHaWZfaGVhZBgCIAEoCUgAiAEBQgoKCF9pZl9oZWFkIlwKEVdvcmtzcGFjZVNuYXBzaG90EhEKCXdvcmtzcGFjZRgBIAEoCRIMCgRoZWFkGAIgASgJEhEKCXVuY2hhbmdlZBgDIAEoCBITCgtoYXNfY3VzdG9keRgEIAEoCCI2ChRTeW5jV29ya3NwYWNlUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEg0KBWFkbWl0GAIgASgIIrwFChVTeW5jV29ya3NwYWNlUmVzcG9uc2USEQoJd29ya3NwYWNlGAEgASgJEhoKDXByZXZpb3VzX2hlYWQYAiABKAlIAIgBARIZCgxjdXJyZW50X2hlYWQYAyABKAlIAYgBARIQCghhZG1pdHRlZBgEIAEoBBIPCgdyZWZ1c2VkGAUgASgEEhAKCGRlZmVycmVkGAYgASgEEhIKCmxvY2FsX29ubHkYByABKAgSDgoGcHVsbGVkGAggASgIEhAKCGRpdmVyZ2VkGAkgASgIEhoKEnJlY29ubmVjdF9yZXF1aXJlZBgKIAEoCBITCgtzdGlsbF9haGVhZBgLIAEoCBIPCgdvZmZsaW5lGAwgASgIEhMKC3B1c2hfZmFpbGVkGA0gASgIEh0KFWRpcmVjdF9vZmZlcl9kZWZlcnJlZBgOIAEoCBI1Cg5iaXJ0aF9vdXRjb21lcxgPIAMoCzIdLm5vbW9zLmtlcm5lbC52MS5CaXJ0aE91dGNvbWUSGwoTYWRtaXR0ZWRfaW50ZW50X2lkcxgQIAMoCRIcChRjb252ZXJnZWRfaW50ZW50X2lkcxgRIAMoCRJCCgpwdXNoX2Vycm9yGBIgASgLMikubm9tb3MucnVudGltZS52Mi5SdW50aW1lVHJhbnNwb3J0RmFpbHVyZUgCiAEBEkcKD2Rpc2NvdmVyeV9lcnJvchgTIAEoCzIpLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVRyYW5zcG9ydEZhaWx1cmVIA4gBARIzCgd0aW1pbmdzGBQgASgLMiIubm9tb3MucnVudGltZS52Mi5TeW5jUGhhc2VUaW1pbmdzQhAKDl9wcmV2aW91c19oZWFkQg8KDV9jdXJyZW50X2hlYWRCDQoLX3B1c2hfZXJyb3JCEgoQX2Rpc2NvdmVyeV9lcnJvciJdChdSdW50aW1lVHJhbnNwb3J0RmFpbHVyZRIQCghlbmRwb2ludBgBIAEoCRIOCgZzdGF0dXMYAiABKBESDwoHcmVmdXNlZBgDIAEoCBIPCgdtZXNzYWdlGAQgASgJIrEBChBTeW5jUGhhc2VUaW1pbmdzEhMKC3B1c2hfbWlsbGlzGAEgASgBEhQKDGFkbWl0X21pbGxpcxgCIAEoARIXCg9wcmVmZXRjaF9taWxsaXMYAyABKAESFwoPY29udmVyZ2VfbWlsbGlzGAQgASgBEhIKCnB1c2hfYnl0ZXMYBSABKAQSFQoNc2VydmVyX21pbGxpcxgGIAEoARIVCg1vZmZlcl9pbl9wdXNoGAcgASgIIt8BChRTdGFydEF1dG9TeW5jUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEhwKD2RlYm91bmNlX21pbGxpcxgCIAEoDUgAiAEBEhwKD2ZhbGxiYWNrX21pbGxpcxgDIAEoDUgBiAEBEhoKDXNpZ25hbF9taWxsaXMYBCABKA1IAogBARIWCglzaWduYWxfaWQYBSABKAlIA4gBAUISChBfZGVib3VuY2VfbWlsbGlzQhIKEF9mYWxsYmFja19taWxsaXNCEAoOX3NpZ25hbF9taWxsaXNCDAoKX3NpZ25hbF9pZCIiCg9BdXRvU3luY1N0YXJ0ZWQSDwoHc2Vzc2lvbhgBIAEoCSImChNTdG9wQXV0b1N5bmNSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkiIgoPQXV0b1N5bmNTdG9wcGVkEg8KB3Nlc3Npb24YASABKAkiqgEKDFdhdGNoUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEhcKD3N1YnNjcmlwdGlvbl9pZBgCIAEoCRIpCgRraW5kGAMgASgOMhsubm9tb3MucnVudGltZS52Mi5XYXRjaEtpbmQSLAoFcXVlcnkYBCABKAsyHS5ub21vcy5rZXJuZWwudjEuUXVlcnlSZXF1ZXN0EhcKD2ludGVydmFsX21pbGxpcxgFIAEoDSInCgxXYXRjaFN0YXJ0ZWQSFwoPc3Vic2NyaXB0aW9uX2lkGAEgASgJIikKDlVud2F0Y2hSZXF1ZXN0EhcKD3N1YnNjcmlwdGlvbl9pZBgBIAEoCSInCgxXYXRjaFN0b3BwZWQSFwoPc3Vic2NyaXB0aW9uX2lkGAEgASgJInUKFFByZXBhcmVEb21haW5SZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDgoGZG9tYWluGAIgASgJEhYKDnBhY2thZ2Vfc2hhMjU2GAMgASgJEhYKCWRpcmVjdGl2ZRgEIAEoCUgAiAEBQgwKCl9kaXJlY3RpdmUiUgoORG9tYWluUHJlcGFyZWQSDgoGZG9tYWluGAEgASgJEhYKDnBhY2thZ2Vfc2hhMjU2GAIgASgJEhgKEGFscmVhZHlfcmVzaWRlbnQYAyABKAgi9gEKFU1vZGVsTGlmZWN5Y2xlUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEj0KBXN0YWdlGAogASgLMiwubm9tb3MucnVudGltZS52Mi5TdGFnZUdlbmVyYXRlZE1vZGVsUmVxdWVzdEgAEj0KBWFkb3B0GAsgASgLMiwubm9tb3MucnVudGltZS52Mi5BZG9wdEdlbmVyYXRlZE1vZGVsUmVxdWVzdEgAEkEKB3Jlc3RvcmUYDCABKAsyLi5ub21vcy5ydW50aW1lLnYyLlJlc3RvcmVHZW5lcmF0ZWRNb2RlbFJlcXVlc3RIAEILCglvcGVyYXRpb24ihgEKGlN0YWdlR2VuZXJhdGVkTW9kZWxSZXF1ZXN0Eg4KBmRvbWFpbhgBIAEoCRIWCg5jYW5kaWRhdGVfaGFzaBgCIAEoCRIQCghsYXdfdXNkehgDIAEoDBIbCg5zb3VyY2Vfc2Vzc2lvbhgEIAEoCUgAiAEBQhEKD19zb3VyY2Vfc2Vzc2lvbiJ6ChpBZG9wdEdlbmVyYXRlZE1vZGVsUmVxdWVzdBIOCgZkb21haW4YASABKAkSFgoOY2FuZGlkYXRlX2hhc2gYAiABKAkSHgoRYWNjZXB0YW5jZV9yZWFzb24YAyABKAlIAIgBAUIUChJfYWNjZXB0YW5jZV9yZWFzb24iegocUmVzdG9yZUdlbmVyYXRlZE1vZGVsUmVxdWVzdBIOCgZkb21haW4YASABKAkSFAoMY3VycmVudF9oYXNoGAIgASgJEh4KEWFjY2VwdGFuY2VfcmVhc29uGAMgASgJSACIAQFCFAoSX2FjY2VwdGFuY2VfcmVhc29uIpMBCg9Nb2RlbERpZmZlcmVuY2USMwoEa2luZBgBIAEoDjIlLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxEaWZmZXJlbmNlS2luZBIRCgRhcmVhGAIgASgJSACIAQESEwoGYWN0aW9uGAMgASgJSAGIAQESDwoHc3VtbWFyeRgEIAEoCUIHCgVfYXJlYUIJCgdfYWN0aW9uIqUBCgtNb2RlbFJldmlldxIXCg9jaGVja2VkX2FjdGlvbnMYASABKAQSGQoRY2FuZGlkYXRlX2FjdGlvbnMYAiABKAQSGQoMc2FtZV9vdXRjb21lGAMgASgISACIAQESNgoLZGlmZmVyZW5jZXMYBCADKAsyIS5ub21vcy5ydW50aW1lLnYyLk1vZGVsRGlmZmVyZW5jZUIPCg1fc2FtZV9vdXRjb21lIoUCChZNb2RlbExpZmVjeWNsZVJlc3BvbnNlEhAKCGFjY2VwdGVkGAEgASgIEjQKBXN0YWdlGAIgASgOMiUubm9tb3MucnVudGltZS52Mi5Nb2RlbExpZmVjeWNsZVN0YWdlEhQKB21lc3NhZ2UYAyABKAlIAIgBARIRCgRoZWFkGAQgASgJSAGIAQESFwoKcmVjZWlwdF9pZBgFIAEoCUgCiAEBEjIKBnJldmlldxgGIAEoCzIdLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxSZXZpZXdIA4gBAUIKCghfbWVzc2FnZUIHCgVfaGVhZEINCgtfcmVjZWlwdF9pZEIJCgdfcmV2aWV3ImcKGlJlc29sdmVDdXN0b2R5QnJlYWtSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSOAoIZGVjaXNpb24YAiABKA4yJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha0RlY2lzaW9uImEKFEN1c3RvZHlCcmVha1Jlc29sdmVkEg8KB3Nlc3Npb24YASABKAkSOAoIZGVjaXNpb24YAiABKA4yJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha0RlY2lzaW9uIhMKEUNsb3NlUmVhbG1SZXF1ZXN0Ig0KC1JlYWxtQ2xvc2VkIuUBChFEZWFkTGV0dGVyUmVxdWVzdBIPCgdzZXNzaW9uGAEgASgJEjgKBGxpc3QYCiABKAsyKC5ub21vcy5ydW50aW1lLnYyLkxpc3REZWFkTGV0dGVyc1JlcXVlc3RIABI5CgVyZXRyeRgLIAEoCzIoLm5vbW9zLnJ1bnRpbWUudjIuUmV0cnlEZWFkTGV0dGVyUmVxdWVzdEgAEj0KB2Rpc2NhcmQYDCABKAsyKi5ub21vcy5ydW50aW1lLnYyLkRpc2NhcmREZWFkTGV0dGVyUmVxdWVzdEgAQgsKCW9wZXJhdGlvbiIYChZMaXN0RGVhZExldHRlcnNSZXF1ZXN0IisKFlJldHJ5RGVhZExldHRlclJlcXVlc3QSEQoJaW50ZW50X2lkGAEgASgJIi0KGERpc2NhcmREZWFkTGV0dGVyUmVxdWVzdBIRCglpbnRlbnRfaWQYASABKAkivQEKEkRlYWRMZXR0ZXJSZXNwb25zZRIwCgRsaXN0GAogASgLMiAubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyTGlzdEgAEjIKBXJldHJ5GAsgASgLMiEubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmV0cnlIABI2CgdkaXNjYXJkGAwgASgLMiMubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyRGlzY2FyZEgAQgkKB291dGNvbWUiRAoORGVhZExldHRlckxpc3QSMgoHZW50cmllcxgBIAMoCzIhLm5vbW9zLnJ1bnRpbWUudjIuRGVhZExldHRlckVudHJ5IrkBCg9EZWFkTGV0dGVyRW50cnkSDwoCaWQYASABKAlIAIgBARISCgpjb21taXRfb2lkGAIgASgJEg4KBnNvdXJjZRgDIAEoCRIPCgdtZXNzYWdlGAQgASgJEhMKBmRvbWFpbhgFIAEoCUgBiAEBEhYKCWRpcmVjdGl2ZRgGIAEoCUgCiAEBEhMKC3JlY29yZGVkX2F0GAcgASgJQgUKA19pZEIJCgdfZG9tYWluQgwKCl9kaXJlY3RpdmUieQoPRGVhZExldHRlclJldHJ5Eg8KB3JldHJpZWQYASABKAgSEQoEaGVhZBgCIAEoCUgAiAEBEhcKD2FscmVhZHlfb25fbWFpbhgDIAEoCBIUCgdtZXNzYWdlGAQgASgJSAGIAQFCBwoFX2hlYWRCCgoIX21lc3NhZ2UiJAoRRGVhZExldHRlckRpc2NhcmQSDwoHcmVtb3ZlZBgBIAEoBCLNBQoMUnVudGltZUV2ZW50EhAKCHNlcXVlbmNlGAEgASgEEhQKB3Nlc3Npb24YAiABKAlIAYgBARIvCgVyZWFkeRgKIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVJlYWR5SAASNwoNd2F0Y2hfY2hhbmdlZBgLIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuV2F0Y2hDaGFuZ2VkSAASOQoOc3luY19jb21wbGV0ZWQYDCABKAsyHy5ub21vcy5ydW50aW1lLnYyLlN5bmNDb21wbGV0ZWRIABI1CgxsaW5rX2NoYW5nZWQYDSABKAsyHS5ub21vcy5ydW50aW1lLnYyLkxpbmtDaGFuZ2VkSAASOQoOc2lnbmFsX2NoYW5nZWQYDiABKAsyHy5ub21vcy5ydW50aW1lLnYyLlNpZ25hbENoYW5nZWRIABI7Cg9jdXN0b2R5X2NoYW5nZWQYDyABKAsyIC5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlDaGFuZ2VkSAASQgoTbG9jYWxfd29ya19yZWplY3RlZBgQIAEoCzIjLm5vbW9zLnJ1bnRpbWUudjIuTG9jYWxXb3JrUmVqZWN0ZWRIABIzCgtsYXdfY2hhbmdlZBgRIAEoCzIcLm5vbW9zLnJ1bnRpbWUudjIuTGF3Q2hhbmdlZEgAEkMKD2tlcm5lbF9wcm9ncmVzcxgSIAEoCzIoLm5vbW9zLnJ1bnRpbWUudjIuS2VybmVsUHJvZ3Jlc3NPYnNlcnZlZEgAEi0KBHNwYW4YEyABKAsyHS5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVTcGFuSAASPwoRdHJhbnNmZXJfcHJvZ3Jlc3MYFCABKAsyIi5ub21vcy5ydW50aW1lLnYyLlRyYW5zZmVyUHJvZ3Jlc3NIAEIHCgVldmVudEIKCghfc2Vzc2lvbiI+CgxSdW50aW1lUmVhZHkSFwoPcnVudGltZV92ZXJzaW9uGAEgASgJEhUKDWtlcm5lbF9zaGEyNTYYAiABKAwigAEKDFdhdGNoQ2hhbmdlZBIXCg9zdWJzY3JpcHRpb25faWQYASABKAkSEwoLcmVzdWx0X3VzZGEYAiABKAwSNgoHZmFpbHVyZRgDIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUZhaWx1cmVIAIgBAUIKCghfZmFpbHVyZSKcAQoNU3luY0NvbXBsZXRlZBIOCgZyZWFzb24YASABKAkSNwoGcmVzdWx0GAIgASgLMicubm9tb3MucnVudGltZS52Mi5TeW5jV29ya3NwYWNlUmVzcG9uc2USNgoHZmFpbHVyZRgDIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUZhaWx1cmVIAIgBAUIKCghfZmFpbHVyZSI7CgtMaW5rQ2hhbmdlZBIsCgZzdGF0dXMYASABKA4yHC5ub21vcy5ydW50aW1lLnYyLkxpbmtTdGF0dXMiOAoNU2lnbmFsQ2hhbmdlZBIOCgZkb21haW4YASABKAkSFwoPcHJvamVjdGlvbl91c2RhGAIgASgMIvQBCg5DdXN0b2R5Q2hhbmdlZBIxCgRraW5kGAEgASgOMiMubm9tb3MucnVudGltZS52Mi5DdXN0b2R5Q2hhbmdlS2luZBI1Cg1jdXN0b2R5X2JyZWFrGAIgASgLMh4ubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QnJlYWsSFgoJb3BlcmF0aW9uGAMgASgJSACIAQESFQoIcmVjbG9uZWQYBCABKAhIAYgBARIbCg5wYXJrZWRfaW50ZW50cxgFIAEoBEgCiAEBQgwKCl9vcGVyYXRpb25CCwoJX3JlY2xvbmVkQhEKD19wYXJrZWRfaW50ZW50cyLhAQoRTG9jYWxXb3JrUmVqZWN0ZWQSEQoJd29ya3NwYWNlGAEgASgJEjYKB3JlZnVzZWQYAiADKAsyJS5ub21vcy5ydW50aW1lLnYyLlJlamVjdGVkTG9jYWxJbnRlbnQSDgoGcGFya2VkGAMgASgIEhUKCHJlc2V0X3RvGAQgASgJSACIAQESEQoJcmV0cnlhYmxlGAUgASgIEjoKBnNvdXJjZRgGIAEoDjIqLm5vbW9zLnJ1bnRpbWUudjIuTG9jYWxXb3JrUmVqZWN0aW9uU291cmNlQgsKCV9yZXNldF90byJjChNDdXN0b2R5U3VwZXJzZXNzaW9uEhoKDXN1cGVyc2VkZWRfYXQYASABKAlIAIgBARITCgZyZWFzb24YAiABKAlIAYgBAUIQCg5fc3VwZXJzZWRlZF9hdEIJCgdfcmVhc29uIrgCCgxDdXN0b2R5QnJlYWsSMAoEa2luZBgBIAEoDjIiLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrS2luZBIVCg1sb2NhbF9nZW5lc2lzGAIgASgJEhYKDnJlbW90ZV9nZW5lc2lzGAMgASgJEhoKEnJlbW90ZV9pbmNhcm5hdGlvbhgEIAEoCRJACgxzdXBlcnNlc3Npb24YBSABKAsyJS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlTdXBlcnNlc3Npb25IAIgBARIaChJsb2NhbF9vbmx5X2ludGVudHMYBiABKAQSIgoVbGFzdF9zeW5jZWRfYXRfbWlsbGlzGAcgASgESAGIAQFCDwoNX3N1cGVyc2Vzc2lvbkIYChZfbGFzdF9zeW5jZWRfYXRfbWlsbGlzIs0BChNSZWplY3RlZExvY2FsSW50ZW50EhYKCWludGVudF9pZBgBIAEoCUgAiAEBEhcKCmNvbW1pdF9vaWQYAiABKAlIAYgBARITCgZkb21haW4YAyABKAlIAogBARIWCglkaXJlY3RpdmUYBCABKAlIA4gBARIPCgdtZXNzYWdlGAUgASgJEhEKCXJldHJ5YWJsZRgGIAEoCEIMCgpfaW50ZW50X2lkQg0KC19jb21taXRfb2lkQgkKB19kb21haW5CDAoKX2RpcmVjdGl2ZSJQCgpMYXdDaGFuZ2VkEg4KBmRvbWFpbhgBIAEoCRIWCg5wYWNrYWdlX3NoYTI1NhgCIAEoCRIaChJjb21wYXRpYmlsaXR5X3VzZGEYAyABKAwi3QEKC1J1bnRpbWVTcGFuEhAKCHRyYWNlX2lkGAEgASgMEg8KB3NwYW5faWQYAiABKAwSGwoOcGFyZW50X3NwYW5faWQYAyABKAxIAIgBARIMCgRuYW1lGAQgASgJEhoKEnN0YXJ0ZWRfdW5peF9uYW5vcxgFIAEoBBIWCg5kdXJhdGlvbl9uYW5vcxgGIAEoBBI5CgphdHRyaWJ1dGVzGAcgAygLMiUubm9tb3MucnVudGltZS52Mi5EaWFnbm9zdGljQXR0cmlidXRlQhEKD19wYXJlbnRfc3Bhbl9pZCLqAQoWS2VybmVsUHJvZ3Jlc3NPYnNlcnZlZBI5CghzbmFwc2hvdBgBIAEoCzInLm5vbW9zLmtlcm5lbC52MS5LZXJuZWxQcm9ncmVzc1NuYXBzaG90EiQKHGhvc3Rfb2JzZXJ2ZWRfZWxhcHNlZF9taWNyb3MYAiABKAQSKgoiaG9zdF9vYnNlcnZlZF9waGFzZV9lbGFwc2VkX21pY3JvcxgDIAEoBBIeChZwcm9jZXNzX3Jlc2lkZW50X2J5dGVzGAQgASgEEiMKG3Byb2Nlc3NfcGVha19yZXNpZGVudF9ieXRlcxgFIAEoBCKCAQoQVHJhbnNmZXJQcm9ncmVzcxIWCg5yZWNlaXZlZF9ieXRlcxgBIAEoBBIYCgt0b3RhbF9ieXRlcxgCIAEoBEgAiAEBEiwKBGtpbmQYAyABKA4yHi5ub21vcy5ydW50aW1lLnYyLlRyYW5zZmVyS2luZEIOCgxfdG90YWxfYnl0ZXMqmQEKEkN1c3RvZHlCcmVha1BvbGljeRIkCiBDVVNUT0RZX0JSRUFLX1BPTElDWV9VTlNQRUNJRklFRBAAEhwKGENVU1RPRFlfQlJFQUtfUE9MSUNZX0FTSxABEh4KGkNVU1RPRFlfQlJFQUtfUE9MSUNZX0FET1BUEAISHwobQ1VTVE9EWV9CUkVBS19QT0xJQ1lfUkVKRUNUEAMqoAEKEldvcmtzcGFjZVJlc2lkZW5jeRIjCh9XT1JLU1BBQ0VfUkVTSURFTkNZX1VOU1BFQ0lGSUVEEAASHwobV09SS1NQQUNFX1JFU0lERU5DWV9NT1VOVEVEEAESHgoaV09SS1NQQUNFX1JFU0lERU5DWV9QQVJLRUQQAhIkCiBXT1JLU1BBQ0VfUkVTSURFTkNZX0NVU1RPRFlfT05MWRADKo0BChRXb3Jrc3BhY2VTeW5jUG9zdHVyZRImCiJXT1JLU1BBQ0VfU1lOQ19QT1NUVVJFX1VOU1BFQ0lGSUVEEAASJQohV09SS1NQQUNFX1NZTkNfUE9TVFVSRV9MT0NBTF9PTkxZEAESJgoiV09SS1NQQUNFX1NZTkNfUE9TVFVSRV9DTE9VRF9CT1VORBACKqgBCglXYXRjaEtpbmQSGgoWV0FUQ0hfS0lORF9VTlNQRUNJRklFRBAAEhQKEFdBVENIX0tJTkRfUVVFUlkQARIUChBXQVRDSF9LSU5EX0JZX0lEEAISFgoSV0FUQ0hfS0lORF9TUEFUSUFMEAMSFwoTV0FUQ0hfS0lORF9BQ1RJVklUWRAEIgQIBRAFKhxXQVRDSF9LSU5EX1BFTkRJTkdfQ09ORkxJQ1RTKqQDChNNb2RlbExpZmVjeWNsZVN0YWdlEiUKIU1PREVMX0xJRkVDWUNMRV9TVEFHRV9VTlNQRUNJRklFRBAAEisKJ01PREVMX0xJRkVDWUNMRV9TVEFHRV9JREVOVElUWV9SRVFVSVJFRBABEioKJk1PREVMX0xJRkVDWUNMRV9TVEFHRV9TVEFHSU5HX1JFUVVJUkVEEAISIwofTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1BSRUZMSUdIVBADEi0KKU1PREVMX0xJRkVDWUNMRV9TVEFHRV9BQ0NFUFRBTkNFX1JFUVVJUkVEEAQSIwofTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0FETUlTU0lPThAFEiEKHU1PREVMX0xJRkVDWUNMRV9TVEFHRV9QRU5ESU5HEAYSIgoeTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1BST01PVEVEEAcSIgoeTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1JFU1RPUkVEEAgSKQolTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0FMUkVBRFlfQ1VSUkVOVBAJKqQBChNNb2RlbERpZmZlcmVuY2VLaW5kEiUKIU1PREVMX0RJRkZFUkVOQ0VfS0lORF9VTlNQRUNJRklFRBAAEh8KG01PREVMX0RJRkZFUkVOQ0VfS0lORF9SVUxFUxABEiEKHU1PREVMX0RJRkZFUkVOQ0VfS0lORF9PVVRDT01FEAISIgoeTU9ERUxfRElGRkVSRU5DRV9LSU5EX0VWSURFTkNFEAMqgwEKFEN1c3RvZHlCcmVha0RlY2lzaW9uEiYKIkNVU1RPRFlfQlJFQUtfREVDSVNJT05fVU5TUEVDSUZJRUQQABIgChxDVVNUT0RZX0JSRUFLX0RFQ0lTSU9OX0FET1BUEAESIQodQ1VTVE9EWV9CUkVBS19ERUNJU0lPTl9SRUpFQ1QQAipXCgpMaW5rU3RhdHVzEhsKF0xJTktfU1RBVFVTX1VOU1BFQ0lGSUVEEAASFAoQTElOS19TVEFUVVNfT1BFThABEhYKEkxJTktfU1RBVFVTX0NMT1NFRBACKuIBChFDdXN0b2R5Q2hhbmdlS2luZBIjCh9DVVNUT0RZX0NIQU5HRV9LSU5EX1VOU1BFQ0lGSUVEEAASIAocQ1VTVE9EWV9DSEFOR0VfS0lORF9ERVRFQ1RFRBABEiAKHENVU1RPRFlfQ0hBTkdFX0tJTkRfUkVKRUNURUQQAhIgChxDVVNUT0RZX0NIQU5HRV9LSU5EX0FET1BUSU5HEAMSJQohQ1VTVE9EWV9DSEFOR0VfS0lORF9BRE9QVF9SRUZVU0VEEAQSGwoXQ1VTVE9EWV9DSEFOR0VfS0lORF9BU0sQBSp6ChBDdXN0b2R5QnJlYWtLaW5kEiIKHkNVU1RPRFlfQlJFQUtfS0lORF9VTlNQRUNJRklFRBAAEiEKHUNVU1RPRFlfQlJFQUtfS0lORF9TVVBFUlNFREVEEAESHwobQ1VTVE9EWV9CUkVBS19LSU5EX0RJVkVSR0VEEAIqmAEKGExvY2FsV29ya1JlamVjdGlvblNvdXJjZRIrCidMT0NBTF9XT1JLX1JFSkVDVElPTl9TT1VSQ0VfVU5TUEVDSUZJRUQQABIpCiVMT0NBTF9XT1JLX1JFSkVDVElPTl9TT1VSQ0VfQURNSVNTSU9OEAESJAogTE9DQUxfV09SS19SRUpFQ1RJT05fU09VUkNFX1NZTkMQAip2CgxUcmFuc2ZlcktpbmQSHQoZVFJBTlNGRVJfS0lORF9VTlNQRUNJRklFRBAAEhcKE1RSQU5TRkVSX0tJTkRfREVMVEEQARIWChJUUkFOU0ZFUl9LSU5EX0ZVTEwQAhIWChJUUkFOU0ZFUl9LSU5EX1BVU0gQAzJkChNOb21vc1J1bnRpbWVTZXJ2aWNlEk0KBkludm9rZRIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVJlcXVlc3QaIS5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVSZXNwb25zZWIGcHJvdG8z", [file_nomos_kernel_v1_kernel, file_nomos_kernel_v1_progress]);
|
|
4136
|
-
var
|
|
4137
|
-
var
|
|
4138
|
-
var
|
|
4139
|
-
var
|
|
4140
|
-
var
|
|
4141
|
-
var
|
|
4142
|
-
var
|
|
4143
|
-
var
|
|
4144
|
-
var
|
|
4145
|
-
var
|
|
4146
|
-
var
|
|
4147
|
-
var
|
|
4148
|
-
var
|
|
4149
|
-
var
|
|
4150
|
-
var
|
|
4151
|
-
var
|
|
4455
|
+
var file_nomos_runtime_v2_runtime = /* @__PURE__ */ fileDesc4("Ch5ub21vcy9ydW50aW1lL3YyL3J1bnRpbWUucHJvdG8SEG5vbW9zLnJ1bnRpbWUudjIitwoKDlJ1bnRpbWVSZXF1ZXN0EhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoBBIyCgV0cmFjZRgDIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuVHJhY2VDb250ZXh0SAGIAQESOgoLa2VybmVsX2NhbGwYCiABKAsyIy5ub21vcy5ydW50aW1lLnYyLktlcm5lbENhbGxSZXF1ZXN0SAASMwoHY29ubmVjdBgLIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuQ29ubmVjdFJlcXVlc3RIABJCCg9saXN0X3dvcmtzcGFjZXMYDCABKAsyJy5ub21vcy5ydW50aW1lLnYyLkxpc3RXb3Jrc3BhY2VzUmVxdWVzdEgAEkgKEnNuYXBzaG90X3dvcmtzcGFjZRgNIAEoCzIqLm5vbW9zLnJ1bnRpbWUudjIuU25hcHNob3RXb3Jrc3BhY2VSZXF1ZXN0SAASQAoOc3luY193b3Jrc3BhY2UYDiABKAsyJi5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXF1ZXN0SAASQQoPc3RhcnRfYXV0b19zeW5jGA8gASgLMiYubm9tb3MucnVudGltZS52Mi5TdGFydEF1dG9TeW5jUmVxdWVzdEgAEj8KDnN0b3BfYXV0b19zeW5jGBAgASgLMiUubm9tb3MucnVudGltZS52Mi5TdG9wQXV0b1N5bmNSZXF1ZXN0SAASLwoFd2F0Y2gYESABKAsyHi5ub21vcy5ydW50aW1lLnYyLldhdGNoUmVxdWVzdEgAEjMKB3Vud2F0Y2gYEiABKAsyIC5ub21vcy5ydW50aW1lLnYyLlVud2F0Y2hSZXF1ZXN0SAASQAoOcHJlcGFyZV9kb21haW4YEyABKAsyJi5ub21vcy5ydW50aW1lLnYyLlByZXBhcmVEb21haW5SZXF1ZXN0SAASTQoVcmVzb2x2ZV9jdXN0b2R5X2JyZWFrGBQgASgLMiwubm9tb3MucnVudGltZS52Mi5SZXNvbHZlQ3VzdG9keUJyZWFrUmVxdWVzdEgAEjoKC2Nsb3NlX3JlYWxtGBUgASgLMiMubm9tb3MucnVudGltZS52Mi5DbG9zZVJlYWxtUmVxdWVzdEgAEjoKC2RlYWRfbGV0dGVyGBYgASgLMiMubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyUmVxdWVzdEgAEkAKDmhpc3RvcmljX3F1ZXJ5GBcgASgLMiYubm9tb3MucnVudGltZS52Mi5IaXN0b3JpY1F1ZXJ5UmVxdWVzdEgAEkIKD21vZGVsX2xpZmVjeWNsZRgYIAEoCzInLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxMaWZlY3ljbGVSZXF1ZXN0SAASXQodZXN0YWJsaXNoX2FwcGxpY2F0aW9uX2N1c3RvZHkYGSABKAsyNC5ub21vcy5ydW50aW1lLnYyLkVzdGFibGlzaEFwcGxpY2F0aW9uQ3VzdG9keVJlcXVlc3RIABJEChB3b3Jrc3BhY2Vfc3RhdHVzGBogASgLMigubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTdGF0dXNSZXF1ZXN0SAASTwoWcmVtb3RlX2dlbmVyYXRlZF9vZmZlchgbIAEoCzItLm5vbW9zLnJ1bnRpbWUudjIuUmVtb3RlR2VuZXJhdGVkT2ZmZXJSZXF1ZXN0SABCCQoHY29tbWFuZEIICgZfdHJhY2UiUwoRS2VybmVsQ2FsbFJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRItCgdyZXF1ZXN0GAIgASgLMhwubm9tb3Mua2VybmVsLnYxLkNhbGxSZXF1ZXN0IvECCiJFc3RhYmxpc2hBcHBsaWNhdGlvbkN1c3RvZHlSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDgoGcGFyZW50GAIgASgJEhEKCXByaW5jaXBhbBgDIAEoCRIPCgdzdWJqZWN0GAQgASgJEhUKDWRldmljZV9zZWNyZXQYBSABKAwSFQoNZGV2aWNlX3B1YmxpYxgGIAEoDBISCgphdXRoX3Rva2VuGAcgASgJEhAKCGlkX3Rva2VuGAggASgJEhQKDHZlcmlmaWVkX3ZpYRgJIAEoCRIPCgdib3JuX2F0GAogASgJEjsKE2Vucm9sbF9maXJzdF9kZXZpY2UYCyABKAsyHi5ub21vcy5rZXJuZWwudjEuRGlyZWN0aXZlQ2FsbBI9ChViaXJ0aF9yZWNlaXZpbmdfZ3JvdXAYDCABKAsyHi5ub21vcy5rZXJuZWwudjEuRGlyZWN0aXZlQ2FsbBIPCgdjb25maXJtGA0gASgIIp8BCh1BcHBsaWNhdGlvbkN1c3RvZHlFc3RhYmxpc2hlZBIMCgRob21lGAEgASgJEhcKCmNoaWxkX2hlYWQYAiABKAlIAIgBARIQCgh2ZXJpZmllZBgDIAEoCBIfChJ2ZXJpZmljYXRpb25fZXJyb3IYBCABKAlIAYgBAUINCgtfY2hpbGRfaGVhZEIVChNfdmVyaWZpY2F0aW9uX2Vycm9yImUKFEhpc3RvcmljUXVlcnlSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDgoGbW9tZW50GAIgASgJEiwKBXF1ZXJ5GAMgASgLMh0ubm9tb3Mua2VybmVsLnYxLlF1ZXJ5UmVxdWVzdCLGCgoPUnVudGltZVJlc3BvbnNlEhgKEHByb3RvY29sX3ZlcnNpb24YASABKA0SEgoKcmVxdWVzdF9pZBgCIAEoBBIzCgdmYWlsdXJlGAogASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAEjQKC2tlcm5lbF9jYWxsGAsgASgLMh0ubm9tb3Mua2VybmVsLnYxLkNhbGxSZXNwb25zZUgAEjAKCWNvbm5lY3RlZBgMIAEoCzIbLm5vbW9zLnJ1bnRpbWUudjIuQ29ubmVjdGVkSAASOQoOd29ya3NwYWNlX2xpc3QYDSABKAsyHy5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZUxpc3RIABJBChJ3b3Jrc3BhY2Vfc25hcHNob3QYDiABKAsyIy5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZVNuYXBzaG90SAASQQoOc3luY193b3Jrc3BhY2UYDyABKAsyJy5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXNwb25zZUgAEj4KEWF1dG9fc3luY19zdGFydGVkGBAgASgLMiEubm9tb3MucnVudGltZS52Mi5BdXRvU3luY1N0YXJ0ZWRIABI+ChFhdXRvX3N5bmNfc3RvcHBlZBgRIAEoCzIhLm5vbW9zLnJ1bnRpbWUudjIuQXV0b1N5bmNTdG9wcGVkSAASNwoNd2F0Y2hfc3RhcnRlZBgSIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuV2F0Y2hTdGFydGVkSAASNwoNd2F0Y2hfc3RvcHBlZBgTIAEoCzIeLm5vbW9zLnJ1bnRpbWUudjIuV2F0Y2hTdG9wcGVkSAASOwoPZG9tYWluX3ByZXBhcmVkGBQgASgLMiAubm9tb3MucnVudGltZS52Mi5Eb21haW5QcmVwYXJlZEgAEkgKFmN1c3RvZHlfYnJlYWtfcmVzb2x2ZWQYFSABKAsyJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha1Jlc29sdmVkSAASNQoMcmVhbG1fY2xvc2VkGBYgASgLMh0ubm9tb3MucnVudGltZS52Mi5SZWFsbUNsb3NlZEgAEjMKB2Jsb2NrZWQYFyABKAsyIC5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVCbG9ja2VkSAASSAoWcmVtb3RlX29mZmVyX2FkbWlzc2lvbhgYIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuUmVtb3RlT2ZmZXJBZG1pc3Npb25IABI7CgtkZWFkX2xldHRlchgZIAEoCzIkLm5vbW9zLnJ1bnRpbWUudjIuRGVhZExldHRlclJlc3BvbnNlSAASQwoPbW9kZWxfbGlmZWN5Y2xlGBogASgLMigubm9tb3MucnVudGltZS52Mi5Nb2RlbExpZmVjeWNsZVJlc3BvbnNlSAASWgofYXBwbGljYXRpb25fY3VzdG9keV9lc3RhYmxpc2hlZBgbIAEoCzIvLm5vbW9zLnJ1bnRpbWUudjIuQXBwbGljYXRpb25DdXN0b2R5RXN0YWJsaXNoZWRIABI9ChB3b3Jrc3BhY2Vfc3RhdHVzGBwgASgLMiEubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTdGF0dXNIABJQChZyZW1vdGVfZ2VuZXJhdGVkX29mZmVyGB0gASgLMi4ubm9tb3MucnVudGltZS52Mi5SZW1vdGVHZW5lcmF0ZWRPZmZlckFjY2VwdGVkSABCCQoHb3V0Y29tZSK3AQobUmVtb3RlR2VuZXJhdGVkT2ZmZXJSZXF1ZXN0EhYKDnNvdXJjZV9zZXNzaW9uGAEgASgJEhgKEHRhcmdldF93b3Jrc3BhY2UYAiABKAkSDQoFYWN0b3IYAyABKAkSFQoNYXV0aG9yX3NlY3JldBgEIAEoDBISCgphdXRoX3Rva2VuGAUgASgMEiwKBGNhbGwYBiABKAsyHi5ub21vcy5rZXJuZWwudjEuRGlyZWN0aXZlQ2FsbCI/ChxSZW1vdGVHZW5lcmF0ZWRPZmZlckFjY2VwdGVkEhEKCXdvcmtzcGFjZRgBIAEoCRIMCgRoZWFkGAIgASgJIp8BCg5SdW50aW1lQmxvY2tlZBJBCgl3b3Jrc3BhY2UYASABKAsyLC5ub21vcy5ydW50aW1lLnYyLldvcmtzcGFjZVJlc2lkZW5jeVJlcXVpcmVkSAASQAoIc2libGluZ3MYAiABKAsyLC5ub21vcy5ydW50aW1lLnYyLlNpYmxpbmdSZXNpZGVuY2llc1JlcXVpcmVkSABCCAoGcmVhc29uIi8KGldvcmtzcGFjZVJlc2lkZW5jeVJlcXVpcmVkEhEKCXdvcmtzcGFjZRgBIAEoCSJVChhTaWJsaW5nUmVzaWRlbmN5UmVxdWlyZWQSEQoJd29ya3NwYWNlGAEgASgJEhMKC3NvdXJjZV9oZWFkGAIgASgJEhEKCWZvbGRfcm9vdBgDIAEoCSJdChpTaWJsaW5nUmVzaWRlbmNpZXNSZXF1aXJlZBI/CgtyZXNpZGVuY2llcxgBIAMoCzIqLm5vbW9zLnJ1bnRpbWUudjIuU2libGluZ1Jlc2lkZW5jeVJlcXVpcmVkIoYCChRSZW1vdGVPZmZlckFkbWlzc2lvbhIRCgl3b3Jrc3BhY2UYASABKAkSDAoEbWFpbhgCIAEoCRIYCgtzZWFsZWRfbWFpbhgDIAEoCUgAiAEBEi8KB3ZlcmRpY3QYBCABKAsyHi5ub21vcy5rZXJuZWwudjEuT2ZmZXJSZXNwb25zZRIzCgxib3JuX2N1c3RvZHkYBSADKAsyHS5ub21vcy5ydW50aW1lLnYyLkJvcm5DdXN0b2R5EhMKC3Jlc3VsdF9wYWNrGAYgASgMEhgKC3Jlc3VsdF9iYXNlGAcgASgJSAGIAQFCDgoMX3NlYWxlZF9tYWluQg4KDF9yZXN1bHRfYmFzZSJKCgtCb3JuQ3VzdG9keRItCgVjaGlsZBgBIAEoCzIeLm5vbW9zLmtlcm5lbC52MS5Cb3JuV29ya3NwYWNlEgwKBHBhY2sYAiABKAwi+QEKGEN1c3RvZHlPZmZlckJhdGNoUmVxdWVzdBIYChBwcm90b2NvbF92ZXJzaW9uGAEgASgNEhIKCnJlcXVlc3RfaWQYAiABKAkSNwoGaW5saW5lGAMgASgLMiUubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW5saW5lT2ZmZXJzSAASRgoRc2Vzc2lvbl9jYW5kaWRhdGUYBCABKAsyKS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlTZXNzaW9uQ2FuZGlkYXRlSAASFgoJYmFzZV9oZWFkGAUgASgJSAGIAQFCCAoGc291cmNlQgwKCl9iYXNlX2hlYWQiTgoSQ3VzdG9keUludGVudE9mZmVyEg8KB3Nlc3Npb24YASABKAkSEgoKY29tbWl0X29pZBgCIAEoCRITCgtjaGFuZ2VfdXNkYRgDIAEoDCJLChNDdXN0b2R5SW5saW5lT2ZmZXJzEjQKBm9mZmVycxgBIAMoCzIkLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudE9mZmVyIiwKF0N1c3RvZHlTZXNzaW9uQ2FuZGlkYXRlEhEKCXJlZmVyZW5jZRgBIAEoCSL3AQoZQ3VzdG9keU9mZmVyQmF0Y2hSZXNwb25zZRIYChBwcm90b2NvbF92ZXJzaW9uGAEgASgNEhIKCnJlcXVlc3RfaWQYAiABKAkSNwoJYWRtaXNzaW9uGAogASgLMiIubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QWRtaXNzaW9uSAASMwoHZmFpbHVyZRgLIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZUZhaWx1cmVIABIzCgdibG9ja2VkGAwgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lQmxvY2tlZEgAQgkKB291dGNvbWUi7gIKEEN1c3RvZHlBZG1pc3Npb24SDAoEbWFpbhgBIAEoCRIYCgtzZWFsZWRfbWFpbhgCIAEoCUgAiAEBEjsKCHNlc3Npb25zGAMgAygLMikubm9tb3MucnVudGltZS52Mi5DdXN0b2R5U2Vzc2lvbkFkbWlzc2lvbhI1Cg5iaXJ0aF9vdXRjb21lcxgEIAMoCzIdLm5vbW9zLmtlcm5lbC52MS5CaXJ0aE91dGNvbWUSMwoMYm9ybl9jdXN0b2R5GAUgAygLMh0ubm9tb3MucnVudGltZS52Mi5Cb3JuQ3VzdG9keRITCgtyZXN1bHRfcGFjaxgGIAEoDBIYCgtyZXN1bHRfYmFzZRgHIAEoCUgBiAEBEjoKB3RpbWluZ3MYCCABKAsyKS5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlBZG1pc3Npb25UaW1pbmdzQg4KDF9zZWFsZWRfbWFpbkIOCgxfcmVzdWx0X2Jhc2UiZQoXQ3VzdG9keVNlc3Npb25BZG1pc3Npb24SDwoHc2Vzc2lvbhgBIAEoCRI5CgdpbnRlbnRzGAIgAygLMigubm9tb3MucnVudGltZS52Mi5DdXN0b2R5SW50ZW50QWRtaXNzaW9uIpACChZDdXN0b2R5SW50ZW50QWRtaXNzaW9uEhIKCmNvbW1pdF9vaWQYASABKAkSFgoJaW50ZW50X2lkGAIgASgJSAGIAQESOwoIYWRtaXR0ZWQYCiABKAsyJy5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbnRlbnRBZG1pdHRlZEgAEjkKB3NraXBwZWQYCyABKAsyJi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlJbnRlbnRTa2lwcGVkSAASOQoHcmVmdXNlZBgMIAEoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUludGVudFJlZnVzZWRIAEIJCgdvdXRjb21lQgwKCl9pbnRlbnRfaWQikAEKFUN1c3RvZHlJbnRlbnRBZG1pdHRlZBIMCgRoZWFkGAEgASgJEjMKB2NyZWF0ZWQYAiADKAsyIi5ub21vcy5rZXJuZWwudjEuT2ZmZXJBZ2dyZWdhdGVSZWYSNAoIYWZmZWN0ZWQYAyADKAsyIi5ub21vcy5rZXJuZWwudjEuT2ZmZXJBZ2dyZWdhdGVSZWYiLwoUQ3VzdG9keUludGVudFNraXBwZWQSFwoPYWxyZWFkeV9vbl9tYWluGAEgASgIIloKFEN1c3RvZHlJbnRlbnRSZWZ1c2VkEg8KB21lc3NhZ2UYASABKAkSFQoNZGVhZF9sZXR0ZXJlZBgCIAEoCBIRCgRoaW50GAMgASgJSACIAQFCBwoFX2hpbnQi7QEKF0N1c3RvZHlBZG1pc3Npb25UaW1pbmdzEhQKDHRvdGFsX21pbGxpcxgBIAEoARITCgtzY2FuX21pbGxpcxgCIAEoARIUCgxmZXRjaF9taWxsaXMYAyABKAESEwoLc2VhbF9taWxsaXMYBCABKAESGAoQZ2F0ZV9mb2xkX21pbGxpcxgFIAEoARIUCgxpbnRlbnRfY291bnQYBiABKA0SFQoNc2Vzc2lvbl9jb3VudBgHIAEoDRI1CgVzcGFucxgIIAMoCzImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUFkbWlzc2lvblNwYW4ilwEKFEN1c3RvZHlBZG1pc3Npb25TcGFuEgoKAmlkGAEgASgJEg0KBXRyYWNrGAIgASgJEgwKBG5hbWUYAyABKAkSDAoEa2luZBgEIAEoCRINCgVkZXB0aBgFIAEoDRIbChNzdGFydGVkX3VuaXhfbWlsbGlzGAYgASgBEhwKFGZpbmlzaGVkX3VuaXhfbWlsbGlzGAcgASgBIkIKDFRyYWNlQ29udGV4dBIQCgh0cmFjZV9pZBgBIAEoDBIPCgdzcGFuX2lkGAIgASgMEg8KB3NhbXBsZWQYAyABKAgi6QEKDlJ1bnRpbWVGYWlsdXJlEgwKBGNvZGUYASABKAkSDwoHbWVzc2FnZRgCIAEoCRIRCgljb21wb25lbnQYAyABKAkSFgoJd29ya3NwYWNlGAQgASgJSACIAQESEwoGZG9tYWluGAUgASgJSAGIAQESFgoJZGlyZWN0aXZlGAYgASgJSAKIAQESOQoKYXR0cmlidXRlcxgHIAMoCzIlLm5vbW9zLnJ1bnRpbWUudjIuRGlhZ25vc3RpY0F0dHJpYnV0ZUIMCgpfd29ya3NwYWNlQgkKB19kb21haW5CDAoKX2RpcmVjdGl2ZSKlAQoTRGlhZ25vc3RpY0F0dHJpYnV0ZRIMCgRuYW1lGAEgASgJEhYKDHN0cmluZ192YWx1ZRgCIAEoCUgAEhcKDWludGVnZXJfdmFsdWUYAyABKBJIABIWCgxkb3VibGVfdmFsdWUYBCABKAFIABIXCg1ib29sZWFuX3ZhbHVlGAUgASgISAASFQoLYnl0ZXNfdmFsdWUYBiABKAxIAEIHCgV2YWx1ZSLNAgoOQ29ubmVjdFJlcXVlc3QSEQoJd29ya3NwYWNlGAEgASgJEhEKCWNsaWVudF9pZBgCIAEoCRIUCgdzZXNzaW9uGAMgASgJSACIAQESEgoFY2xvdWQYBCABKAlIAYgBARISCgphdXRoX3Rva2VuGAUgASgMEhUKDWF1dGhvcl9zZWNyZXQYBiABKAwSIgoabWF4aW11bV9tb3VudGVkX3dvcmtzcGFjZXMYByABKA0SFAoMYWxsb3dfdW5ib3JuGAggASgIEg8KB3JlY292ZXIYCSABKAgSQgoUY3VzdG9keV9icmVha19wb2xpY3kYCiABKA4yJC5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVha1BvbGljeRIbChNoYXNfcmVzdG9yZV9jdXN0b2R5GAsgASgIQgoKCF9zZXNzaW9uQggKBl9jbG91ZCKLAQoJQ29ubmVjdGVkEhEKCXdvcmtzcGFjZRgBIAEoCRIPCgdzZXNzaW9uGAIgASgJEhMKC2Nsb3VkX2JvdW5kGAMgASgIEjgKCHJlY292ZXJ5GAQgASgLMiEubm9tb3MucnVudGltZS52Mi5DdXN0b2R5UmVjb3ZlcnlIAIgBAUILCglfcmVjb3ZlcnkiWwoPQ3VzdG9keVJlY292ZXJ5EhUKDXByZXZpb3VzX2hlYWQYASABKAkSFgoOcmVjb3ZlcmVkX2hlYWQYAiABKAkSGQoRcmVjb3ZlcmVkX2ludGVudHMYAyABKAQiFwoVTGlzdFdvcmtzcGFjZXNSZXF1ZXN0Iq0BChBXb3Jrc3BhY2VTdW1tYXJ5Eg8KB3Nlc3Npb24YASABKAkSEQoJd29ya3NwYWNlGAIgASgJEjcKCXJlc2lkZW5jeRgDIAEoDjIkLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlUmVzaWRlbmN5EjwKDHN5bmNfcG9zdHVyZRgEIAEoDjImLm5vbW9zLnJ1bnRpbWUudjIuV29ya3NwYWNlU3luY1Bvc3R1cmUiRwoNV29ya3NwYWNlTGlzdBI2Cgp3b3Jrc3BhY2VzGAEgAygLMiIubm9tb3MucnVudGltZS52Mi5Xb3Jrc3BhY2VTdW1tYXJ5IikKFldvcmtzcGFjZVN0YXR1c1JlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCSJACg9Xb3Jrc3BhY2VTdGF0dXMSEQoJd29ya3NwYWNlGAEgASgJEhEKBGhlYWQYAiABKAlIAIgBAUIHCgVfaGVhZCJNChhTbmFwc2hvdFdvcmtzcGFjZVJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIUCgdpZl9oZWFkGAIgASgJSACIAQFCCgoIX2lmX2hlYWQiXAoRV29ya3NwYWNlU25hcHNob3QSEQoJd29ya3NwYWNlGAEgASgJEgwKBGhlYWQYAiABKAkSEQoJdW5jaGFuZ2VkGAMgASgIEhMKC2hhc19jdXN0b2R5GAQgASgIIjYKFFN5bmNXb3Jrc3BhY2VSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSDQoFYWRtaXQYAiABKAgivAUKFVN5bmNXb3Jrc3BhY2VSZXNwb25zZRIRCgl3b3Jrc3BhY2UYASABKAkSGgoNcHJldmlvdXNfaGVhZBgCIAEoCUgAiAEBEhkKDGN1cnJlbnRfaGVhZBgDIAEoCUgBiAEBEhAKCGFkbWl0dGVkGAQgASgEEg8KB3JlZnVzZWQYBSABKAQSEAoIZGVmZXJyZWQYBiABKAQSEgoKbG9jYWxfb25seRgHIAEoCBIOCgZwdWxsZWQYCCABKAgSEAoIZGl2ZXJnZWQYCSABKAgSGgoScmVjb25uZWN0X3JlcXVpcmVkGAogASgIEhMKC3N0aWxsX2FoZWFkGAsgASgIEg8KB29mZmxpbmUYDCABKAgSEwoLcHVzaF9mYWlsZWQYDSABKAgSHQoVZGlyZWN0X29mZmVyX2RlZmVycmVkGA4gASgIEjUKDmJpcnRoX291dGNvbWVzGA8gAygLMh0ubm9tb3Mua2VybmVsLnYxLkJpcnRoT3V0Y29tZRIbChNhZG1pdHRlZF9pbnRlbnRfaWRzGBAgAygJEhwKFGNvbnZlcmdlZF9pbnRlbnRfaWRzGBEgAygJEkIKCnB1c2hfZXJyb3IYEiABKAsyKS5ub21vcy5ydW50aW1lLnYyLlJ1bnRpbWVUcmFuc3BvcnRGYWlsdXJlSAKIAQESRwoPZGlzY292ZXJ5X2Vycm9yGBMgASgLMikubm9tb3MucnVudGltZS52Mi5SdW50aW1lVHJhbnNwb3J0RmFpbHVyZUgDiAEBEjMKB3RpbWluZ3MYFCABKAsyIi5ub21vcy5ydW50aW1lLnYyLlN5bmNQaGFzZVRpbWluZ3NCEAoOX3ByZXZpb3VzX2hlYWRCDwoNX2N1cnJlbnRfaGVhZEINCgtfcHVzaF9lcnJvckISChBfZGlzY292ZXJ5X2Vycm9yIl0KF1J1bnRpbWVUcmFuc3BvcnRGYWlsdXJlEhAKCGVuZHBvaW50GAEgASgJEg4KBnN0YXR1cxgCIAEoERIPCgdyZWZ1c2VkGAMgASgIEg8KB21lc3NhZ2UYBCABKAkisQEKEFN5bmNQaGFzZVRpbWluZ3MSEwoLcHVzaF9taWxsaXMYASABKAESFAoMYWRtaXRfbWlsbGlzGAIgASgBEhcKD3ByZWZldGNoX21pbGxpcxgDIAEoARIXCg9jb252ZXJnZV9taWxsaXMYBCABKAESEgoKcHVzaF9ieXRlcxgFIAEoBBIVCg1zZXJ2ZXJfbWlsbGlzGAYgASgBEhUKDW9mZmVyX2luX3B1c2gYByABKAgi3wEKFFN0YXJ0QXV0b1N5bmNSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSHAoPZGVib3VuY2VfbWlsbGlzGAIgASgNSACIAQESHAoPZmFsbGJhY2tfbWlsbGlzGAMgASgNSAGIAQESGgoNc2lnbmFsX21pbGxpcxgEIAEoDUgCiAEBEhYKCXNpZ25hbF9pZBgFIAEoCUgDiAEBQhIKEF9kZWJvdW5jZV9taWxsaXNCEgoQX2ZhbGxiYWNrX21pbGxpc0IQCg5fc2lnbmFsX21pbGxpc0IMCgpfc2lnbmFsX2lkIiIKD0F1dG9TeW5jU3RhcnRlZBIPCgdzZXNzaW9uGAEgASgJIiYKE1N0b3BBdXRvU3luY1JlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCSIiCg9BdXRvU3luY1N0b3BwZWQSDwoHc2Vzc2lvbhgBIAEoCSKqAQoMV2F0Y2hSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSFwoPc3Vic2NyaXB0aW9uX2lkGAIgASgJEikKBGtpbmQYAyABKA4yGy5ub21vcy5ydW50aW1lLnYyLldhdGNoS2luZBIsCgVxdWVyeRgEIAEoCzIdLm5vbW9zLmtlcm5lbC52MS5RdWVyeVJlcXVlc3QSFwoPaW50ZXJ2YWxfbWlsbGlzGAUgASgNIicKDFdhdGNoU3RhcnRlZBIXCg9zdWJzY3JpcHRpb25faWQYASABKAkiKQoOVW53YXRjaFJlcXVlc3QSFwoPc3Vic2NyaXB0aW9uX2lkGAEgASgJIicKDFdhdGNoU3RvcHBlZBIXCg9zdWJzY3JpcHRpb25faWQYASABKAkidQoUUHJlcGFyZURvbWFpblJlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRIOCgZkb21haW4YAiABKAkSFgoOcGFja2FnZV9zaGEyNTYYAyABKAkSFgoJZGlyZWN0aXZlGAQgASgJSACIAQFCDAoKX2RpcmVjdGl2ZSJSCg5Eb21haW5QcmVwYXJlZBIOCgZkb21haW4YASABKAkSFgoOcGFja2FnZV9zaGEyNTYYAiABKAkSGAoQYWxyZWFkeV9yZXNpZGVudBgDIAEoCCL2AQoVTW9kZWxMaWZlY3ljbGVSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSPQoFc3RhZ2UYCiABKAsyLC5ub21vcy5ydW50aW1lLnYyLlN0YWdlR2VuZXJhdGVkTW9kZWxSZXF1ZXN0SAASPQoFYWRvcHQYCyABKAsyLC5ub21vcy5ydW50aW1lLnYyLkFkb3B0R2VuZXJhdGVkTW9kZWxSZXF1ZXN0SAASQQoHcmVzdG9yZRgMIAEoCzIuLm5vbW9zLnJ1bnRpbWUudjIuUmVzdG9yZUdlbmVyYXRlZE1vZGVsUmVxdWVzdEgAQgsKCW9wZXJhdGlvbiKGAQoaU3RhZ2VHZW5lcmF0ZWRNb2RlbFJlcXVlc3QSDgoGZG9tYWluGAEgASgJEhYKDmNhbmRpZGF0ZV9oYXNoGAIgASgJEhAKCGxhd191c2R6GAMgASgMEhsKDnNvdXJjZV9zZXNzaW9uGAQgASgJSACIAQFCEQoPX3NvdXJjZV9zZXNzaW9uInoKGkFkb3B0R2VuZXJhdGVkTW9kZWxSZXF1ZXN0Eg4KBmRvbWFpbhgBIAEoCRIWCg5jYW5kaWRhdGVfaGFzaBgCIAEoCRIeChFhY2NlcHRhbmNlX3JlYXNvbhgDIAEoCUgAiAEBQhQKEl9hY2NlcHRhbmNlX3JlYXNvbiJ6ChxSZXN0b3JlR2VuZXJhdGVkTW9kZWxSZXF1ZXN0Eg4KBmRvbWFpbhgBIAEoCRIUCgxjdXJyZW50X2hhc2gYAiABKAkSHgoRYWNjZXB0YW5jZV9yZWFzb24YAyABKAlIAIgBAUIUChJfYWNjZXB0YW5jZV9yZWFzb24ikwEKD01vZGVsRGlmZmVyZW5jZRIzCgRraW5kGAEgASgOMiUubm9tb3MucnVudGltZS52Mi5Nb2RlbERpZmZlcmVuY2VLaW5kEhEKBGFyZWEYAiABKAlIAIgBARITCgZhY3Rpb24YAyABKAlIAYgBARIPCgdzdW1tYXJ5GAQgASgJQgcKBV9hcmVhQgkKB19hY3Rpb24ipQEKC01vZGVsUmV2aWV3EhcKD2NoZWNrZWRfYWN0aW9ucxgBIAEoBBIZChFjYW5kaWRhdGVfYWN0aW9ucxgCIAEoBBIZCgxzYW1lX291dGNvbWUYAyABKAhIAIgBARI2CgtkaWZmZXJlbmNlcxgEIAMoCzIhLm5vbW9zLnJ1bnRpbWUudjIuTW9kZWxEaWZmZXJlbmNlQg8KDV9zYW1lX291dGNvbWUihQIKFk1vZGVsTGlmZWN5Y2xlUmVzcG9uc2USEAoIYWNjZXB0ZWQYASABKAgSNAoFc3RhZ2UYAiABKA4yJS5ub21vcy5ydW50aW1lLnYyLk1vZGVsTGlmZWN5Y2xlU3RhZ2USFAoHbWVzc2FnZRgDIAEoCUgAiAEBEhEKBGhlYWQYBCABKAlIAYgBARIXCgpyZWNlaXB0X2lkGAUgASgJSAKIAQESMgoGcmV2aWV3GAYgASgLMh0ubm9tb3MucnVudGltZS52Mi5Nb2RlbFJldmlld0gDiAEBQgoKCF9tZXNzYWdlQgcKBV9oZWFkQg0KC19yZWNlaXB0X2lkQgkKB19yZXZpZXciZwoaUmVzb2x2ZUN1c3RvZHlCcmVha1JlcXVlc3QSDwoHc2Vzc2lvbhgBIAEoCRI4CghkZWNpc2lvbhgCIAEoDjImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrRGVjaXNpb24iYQoUQ3VzdG9keUJyZWFrUmVzb2x2ZWQSDwoHc2Vzc2lvbhgBIAEoCRI4CghkZWNpc2lvbhgCIAEoDjImLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUJyZWFrRGVjaXNpb24iEwoRQ2xvc2VSZWFsbVJlcXVlc3QiDQoLUmVhbG1DbG9zZWQi5QEKEURlYWRMZXR0ZXJSZXF1ZXN0Eg8KB3Nlc3Npb24YASABKAkSOAoEbGlzdBgKIAEoCzIoLm5vbW9zLnJ1bnRpbWUudjIuTGlzdERlYWRMZXR0ZXJzUmVxdWVzdEgAEjkKBXJldHJ5GAsgASgLMigubm9tb3MucnVudGltZS52Mi5SZXRyeURlYWRMZXR0ZXJSZXF1ZXN0SAASPQoHZGlzY2FyZBgMIAEoCzIqLm5vbW9zLnJ1bnRpbWUudjIuRGlzY2FyZERlYWRMZXR0ZXJSZXF1ZXN0SABCCwoJb3BlcmF0aW9uIhgKFkxpc3REZWFkTGV0dGVyc1JlcXVlc3QiKwoWUmV0cnlEZWFkTGV0dGVyUmVxdWVzdBIRCglpbnRlbnRfaWQYASABKAkiLQoYRGlzY2FyZERlYWRMZXR0ZXJSZXF1ZXN0EhEKCWludGVudF9pZBgBIAEoCSK9AQoSRGVhZExldHRlclJlc3BvbnNlEjAKBGxpc3QYCiABKAsyIC5ub21vcy5ydW50aW1lLnYyLkRlYWRMZXR0ZXJMaXN0SAASMgoFcmV0cnkYCyABKAsyIS5ub21vcy5ydW50aW1lLnYyLkRlYWRMZXR0ZXJSZXRyeUgAEjYKB2Rpc2NhcmQYDCABKAsyIy5ub21vcy5ydW50aW1lLnYyLkRlYWRMZXR0ZXJEaXNjYXJkSABCCQoHb3V0Y29tZSJECg5EZWFkTGV0dGVyTGlzdBIyCgdlbnRyaWVzGAEgAygLMiEubm9tb3MucnVudGltZS52Mi5EZWFkTGV0dGVyRW50cnkiuQEKD0RlYWRMZXR0ZXJFbnRyeRIPCgJpZBgBIAEoCUgAiAEBEhIKCmNvbW1pdF9vaWQYAiABKAkSDgoGc291cmNlGAMgASgJEg8KB21lc3NhZ2UYBCABKAkSEwoGZG9tYWluGAUgASgJSAGIAQESFgoJZGlyZWN0aXZlGAYgASgJSAKIAQESEwoLcmVjb3JkZWRfYXQYByABKAlCBQoDX2lkQgkKB19kb21haW5CDAoKX2RpcmVjdGl2ZSJ5Cg9EZWFkTGV0dGVyUmV0cnkSDwoHcmV0cmllZBgBIAEoCBIRCgRoZWFkGAIgASgJSACIAQESFwoPYWxyZWFkeV9vbl9tYWluGAMgASgIEhQKB21lc3NhZ2UYBCABKAlIAYgBAUIHCgVfaGVhZEIKCghfbWVzc2FnZSIkChFEZWFkTGV0dGVyRGlzY2FyZBIPCgdyZW1vdmVkGAEgASgEIs0FCgxSdW50aW1lRXZlbnQSEAoIc2VxdWVuY2UYASABKAQSFAoHc2Vzc2lvbhgCIAEoCUgBiAEBEi8KBXJlYWR5GAogASgLMh4ubm9tb3MucnVudGltZS52Mi5SdW50aW1lUmVhZHlIABI3Cg13YXRjaF9jaGFuZ2VkGAsgASgLMh4ubm9tb3MucnVudGltZS52Mi5XYXRjaENoYW5nZWRIABI5Cg5zeW5jX2NvbXBsZXRlZBgMIAEoCzIfLm5vbW9zLnJ1bnRpbWUudjIuU3luY0NvbXBsZXRlZEgAEjUKDGxpbmtfY2hhbmdlZBgNIAEoCzIdLm5vbW9zLnJ1bnRpbWUudjIuTGlua0NoYW5nZWRIABI5Cg5zaWduYWxfY2hhbmdlZBgOIAEoCzIfLm5vbW9zLnJ1bnRpbWUudjIuU2lnbmFsQ2hhbmdlZEgAEjsKD2N1c3RvZHlfY2hhbmdlZBgPIAEoCzIgLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keUNoYW5nZWRIABJCChNsb2NhbF93b3JrX3JlamVjdGVkGBAgASgLMiMubm9tb3MucnVudGltZS52Mi5Mb2NhbFdvcmtSZWplY3RlZEgAEjMKC2xhd19jaGFuZ2VkGBEgASgLMhwubm9tb3MucnVudGltZS52Mi5MYXdDaGFuZ2VkSAASQwoPa2VybmVsX3Byb2dyZXNzGBIgASgLMigubm9tb3MucnVudGltZS52Mi5LZXJuZWxQcm9ncmVzc09ic2VydmVkSAASLQoEc3BhbhgTIAEoCzIdLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVNwYW5IABI/ChF0cmFuc2Zlcl9wcm9ncmVzcxgUIAEoCzIiLm5vbW9zLnJ1bnRpbWUudjIuVHJhbnNmZXJQcm9ncmVzc0gAQgcKBWV2ZW50QgoKCF9zZXNzaW9uIj4KDFJ1bnRpbWVSZWFkeRIXCg9ydW50aW1lX3ZlcnNpb24YASABKAkSFQoNa2VybmVsX3NoYTI1NhgCIAEoDCKAAQoMV2F0Y2hDaGFuZ2VkEhcKD3N1YnNjcmlwdGlvbl9pZBgBIAEoCRITCgtyZXN1bHRfdXNkYRgCIAEoDBI2CgdmYWlsdXJlGAMgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAiAEBQgoKCF9mYWlsdXJlIpwBCg1TeW5jQ29tcGxldGVkEg4KBnJlYXNvbhgBIAEoCRI3CgZyZXN1bHQYAiABKAsyJy5ub21vcy5ydW50aW1lLnYyLlN5bmNXb3Jrc3BhY2VSZXNwb25zZRI2CgdmYWlsdXJlGAMgASgLMiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lRmFpbHVyZUgAiAEBQgoKCF9mYWlsdXJlIjsKC0xpbmtDaGFuZ2VkEiwKBnN0YXR1cxgBIAEoDjIcLm5vbW9zLnJ1bnRpbWUudjIuTGlua1N0YXR1cyI4Cg1TaWduYWxDaGFuZ2VkEg4KBmRvbWFpbhgBIAEoCRIXCg9wcm9qZWN0aW9uX3VzZGEYAiABKAwi9AEKDkN1c3RvZHlDaGFuZ2VkEjEKBGtpbmQYASABKA4yIy5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlDaGFuZ2VLaW5kEjUKDWN1c3RvZHlfYnJlYWsYAiABKAsyHi5ub21vcy5ydW50aW1lLnYyLkN1c3RvZHlCcmVhaxIWCglvcGVyYXRpb24YAyABKAlIAIgBARIVCghyZWNsb25lZBgEIAEoCEgBiAEBEhsKDnBhcmtlZF9pbnRlbnRzGAUgASgESAKIAQFCDAoKX29wZXJhdGlvbkILCglfcmVjbG9uZWRCEQoPX3BhcmtlZF9pbnRlbnRzIuEBChFMb2NhbFdvcmtSZWplY3RlZBIRCgl3b3Jrc3BhY2UYASABKAkSNgoHcmVmdXNlZBgCIAMoCzIlLm5vbW9zLnJ1bnRpbWUudjIuUmVqZWN0ZWRMb2NhbEludGVudBIOCgZwYXJrZWQYAyABKAgSFQoIcmVzZXRfdG8YBCABKAlIAIgBARIRCglyZXRyeWFibGUYBSABKAgSOgoGc291cmNlGAYgASgOMioubm9tb3MucnVudGltZS52Mi5Mb2NhbFdvcmtSZWplY3Rpb25Tb3VyY2VCCwoJX3Jlc2V0X3RvImMKE0N1c3RvZHlTdXBlcnNlc3Npb24SGgoNc3VwZXJzZWRlZF9hdBgBIAEoCUgAiAEBEhMKBnJlYXNvbhgCIAEoCUgBiAEBQhAKDl9zdXBlcnNlZGVkX2F0QgkKB19yZWFzb24iuAIKDEN1c3RvZHlCcmVhaxIwCgRraW5kGAEgASgOMiIubm9tb3MucnVudGltZS52Mi5DdXN0b2R5QnJlYWtLaW5kEhUKDWxvY2FsX2dlbmVzaXMYAiABKAkSFgoOcmVtb3RlX2dlbmVzaXMYAyABKAkSGgoScmVtb3RlX2luY2FybmF0aW9uGAQgASgJEkAKDHN1cGVyc2Vzc2lvbhgFIAEoCzIlLm5vbW9zLnJ1bnRpbWUudjIuQ3VzdG9keVN1cGVyc2Vzc2lvbkgAiAEBEhoKEmxvY2FsX29ubHlfaW50ZW50cxgGIAEoBBIiChVsYXN0X3N5bmNlZF9hdF9taWxsaXMYByABKARIAYgBAUIPCg1fc3VwZXJzZXNzaW9uQhgKFl9sYXN0X3N5bmNlZF9hdF9taWxsaXMizQEKE1JlamVjdGVkTG9jYWxJbnRlbnQSFgoJaW50ZW50X2lkGAEgASgJSACIAQESFwoKY29tbWl0X29pZBgCIAEoCUgBiAEBEhMKBmRvbWFpbhgDIAEoCUgCiAEBEhYKCWRpcmVjdGl2ZRgEIAEoCUgDiAEBEg8KB21lc3NhZ2UYBSABKAkSEQoJcmV0cnlhYmxlGAYgASgIQgwKCl9pbnRlbnRfaWRCDQoLX2NvbW1pdF9vaWRCCQoHX2RvbWFpbkIMCgpfZGlyZWN0aXZlIlAKCkxhd0NoYW5nZWQSDgoGZG9tYWluGAEgASgJEhYKDnBhY2thZ2Vfc2hhMjU2GAIgASgJEhoKEmNvbXBhdGliaWxpdHlfdXNkYRgDIAEoDCLdAQoLUnVudGltZVNwYW4SEAoIdHJhY2VfaWQYASABKAwSDwoHc3Bhbl9pZBgCIAEoDBIbCg5wYXJlbnRfc3Bhbl9pZBgDIAEoDEgAiAEBEgwKBG5hbWUYBCABKAkSGgoSc3RhcnRlZF91bml4X25hbm9zGAUgASgEEhYKDmR1cmF0aW9uX25hbm9zGAYgASgEEjkKCmF0dHJpYnV0ZXMYByADKAsyJS5ub21vcy5ydW50aW1lLnYyLkRpYWdub3N0aWNBdHRyaWJ1dGVCEQoPX3BhcmVudF9zcGFuX2lkIuoBChZLZXJuZWxQcm9ncmVzc09ic2VydmVkEjkKCHNuYXBzaG90GAEgASgLMicubm9tb3Mua2VybmVsLnYxLktlcm5lbFByb2dyZXNzU25hcHNob3QSJAocaG9zdF9vYnNlcnZlZF9lbGFwc2VkX21pY3JvcxgCIAEoBBIqCiJob3N0X29ic2VydmVkX3BoYXNlX2VsYXBzZWRfbWljcm9zGAMgASgEEh4KFnByb2Nlc3NfcmVzaWRlbnRfYnl0ZXMYBCABKAQSIwobcHJvY2Vzc19wZWFrX3Jlc2lkZW50X2J5dGVzGAUgASgEIoIBChBUcmFuc2ZlclByb2dyZXNzEhYKDnJlY2VpdmVkX2J5dGVzGAEgASgEEhgKC3RvdGFsX2J5dGVzGAIgASgESACIAQESLAoEa2luZBgDIAEoDjIeLm5vbW9zLnJ1bnRpbWUudjIuVHJhbnNmZXJLaW5kQg4KDF90b3RhbF9ieXRlcyqZAQoSQ3VzdG9keUJyZWFrUG9saWN5EiQKIENVU1RPRFlfQlJFQUtfUE9MSUNZX1VOU1BFQ0lGSUVEEAASHAoYQ1VTVE9EWV9CUkVBS19QT0xJQ1lfQVNLEAESHgoaQ1VTVE9EWV9CUkVBS19QT0xJQ1lfQURPUFQQAhIfChtDVVNUT0RZX0JSRUFLX1BPTElDWV9SRUpFQ1QQAyqgAQoSV29ya3NwYWNlUmVzaWRlbmN5EiMKH1dPUktTUEFDRV9SRVNJREVOQ1lfVU5TUEVDSUZJRUQQABIfChtXT1JLU1BBQ0VfUkVTSURFTkNZX01PVU5URUQQARIeChpXT1JLU1BBQ0VfUkVTSURFTkNZX1BBUktFRBACEiQKIFdPUktTUEFDRV9SRVNJREVOQ1lfQ1VTVE9EWV9PTkxZEAMqjQEKFFdvcmtzcGFjZVN5bmNQb3N0dXJlEiYKIldPUktTUEFDRV9TWU5DX1BPU1RVUkVfVU5TUEVDSUZJRUQQABIlCiFXT1JLU1BBQ0VfU1lOQ19QT1NUVVJFX0xPQ0FMX09OTFkQARImCiJXT1JLU1BBQ0VfU1lOQ19QT1NUVVJFX0NMT1VEX0JPVU5EEAIqqAEKCVdhdGNoS2luZBIaChZXQVRDSF9LSU5EX1VOU1BFQ0lGSUVEEAASFAoQV0FUQ0hfS0lORF9RVUVSWRABEhQKEFdBVENIX0tJTkRfQllfSUQQAhIWChJXQVRDSF9LSU5EX1NQQVRJQUwQAxIXChNXQVRDSF9LSU5EX0FDVElWSVRZEAQiBAgFEAUqHFdBVENIX0tJTkRfUEVORElOR19DT05GTElDVFMqpAMKE01vZGVsTGlmZWN5Y2xlU3RhZ2USJQohTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1VOU1BFQ0lGSUVEEAASKwonTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0lERU5USVRZX1JFUVVJUkVEEAESKgomTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1NUQUdJTkdfUkVRVUlSRUQQAhIjCh9NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfUFJFRkxJR0hUEAMSLQopTU9ERUxfTElGRUNZQ0xFX1NUQUdFX0FDQ0VQVEFOQ0VfUkVRVUlSRUQQBBIjCh9NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfQURNSVNTSU9OEAUSIQodTU9ERUxfTElGRUNZQ0xFX1NUQUdFX1BFTkRJTkcQBhIiCh5NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfUFJPTU9URUQQBxIiCh5NT0RFTF9MSUZFQ1lDTEVfU1RBR0VfUkVTVE9SRUQQCBIpCiVNT0RFTF9MSUZFQ1lDTEVfU1RBR0VfQUxSRUFEWV9DVVJSRU5UEAkqpAEKE01vZGVsRGlmZmVyZW5jZUtpbmQSJQohTU9ERUxfRElGRkVSRU5DRV9LSU5EX1VOU1BFQ0lGSUVEEAASHwobTU9ERUxfRElGRkVSRU5DRV9LSU5EX1JVTEVTEAESIQodTU9ERUxfRElGRkVSRU5DRV9LSU5EX09VVENPTUUQAhIiCh5NT0RFTF9ESUZGRVJFTkNFX0tJTkRfRVZJREVOQ0UQAyqDAQoUQ3VzdG9keUJyZWFrRGVjaXNpb24SJgoiQ1VTVE9EWV9CUkVBS19ERUNJU0lPTl9VTlNQRUNJRklFRBAAEiAKHENVU1RPRFlfQlJFQUtfREVDSVNJT05fQURPUFQQARIhCh1DVVNUT0RZX0JSRUFLX0RFQ0lTSU9OX1JFSkVDVBACKlcKCkxpbmtTdGF0dXMSGwoXTElOS19TVEFUVVNfVU5TUEVDSUZJRUQQABIUChBMSU5LX1NUQVRVU19PUEVOEAESFgoSTElOS19TVEFUVVNfQ0xPU0VEEAIq4gEKEUN1c3RvZHlDaGFuZ2VLaW5kEiMKH0NVU1RPRFlfQ0hBTkdFX0tJTkRfVU5TUEVDSUZJRUQQABIgChxDVVNUT0RZX0NIQU5HRV9LSU5EX0RFVEVDVEVEEAESIAocQ1VTVE9EWV9DSEFOR0VfS0lORF9SRUpFQ1RFRBACEiAKHENVU1RPRFlfQ0hBTkdFX0tJTkRfQURPUFRJTkcQAxIlCiFDVVNUT0RZX0NIQU5HRV9LSU5EX0FET1BUX1JFRlVTRUQQBBIbChdDVVNUT0RZX0NIQU5HRV9LSU5EX0FTSxAFKnoKEEN1c3RvZHlCcmVha0tpbmQSIgoeQ1VTVE9EWV9CUkVBS19LSU5EX1VOU1BFQ0lGSUVEEAASIQodQ1VTVE9EWV9CUkVBS19LSU5EX1NVUEVSU0VERUQQARIfChtDVVNUT0RZX0JSRUFLX0tJTkRfRElWRVJHRUQQAiqYAQoYTG9jYWxXb3JrUmVqZWN0aW9uU291cmNlEisKJ0xPQ0FMX1dPUktfUkVKRUNUSU9OX1NPVVJDRV9VTlNQRUNJRklFRBAAEikKJUxPQ0FMX1dPUktfUkVKRUNUSU9OX1NPVVJDRV9BRE1JU1NJT04QARIkCiBMT0NBTF9XT1JLX1JFSkVDVElPTl9TT1VSQ0VfU1lOQxACKnYKDFRyYW5zZmVyS2luZBIdChlUUkFOU0ZFUl9LSU5EX1VOU1BFQ0lGSUVEEAASFwoTVFJBTlNGRVJfS0lORF9ERUxUQRABEhYKElRSQU5TRkVSX0tJTkRfRlVMTBACEhYKElRSQU5TRkVSX0tJTkRfUFVTSBADMmQKE05vbW9zUnVudGltZVNlcnZpY2USTQoGSW52b2tlEiAubm9tb3MucnVudGltZS52Mi5SdW50aW1lUmVxdWVzdBohLm5vbW9zLnJ1bnRpbWUudjIuUnVudGltZVJlc3BvbnNlYgZwcm90bzM", [file_nomos_kernel_v1_kernel, file_nomos_kernel_v1_progress]);
|
|
4456
|
+
var RuntimeRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 0);
|
|
4457
|
+
var RuntimeResponseSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 5);
|
|
4458
|
+
var RuntimeBlockedSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 8);
|
|
4459
|
+
var WorkspaceResidencyRequiredSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 9);
|
|
4460
|
+
var SiblingResidencyRequiredSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 10);
|
|
4461
|
+
var SiblingResidenciesRequiredSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 11);
|
|
4462
|
+
var BornCustodySchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 13);
|
|
4463
|
+
var CustodyOfferBatchRequestSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 14);
|
|
4464
|
+
var CustodyOfferBatchResponseSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 18);
|
|
4465
|
+
var CustodyAdmissionSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 19);
|
|
4466
|
+
var CustodySessionAdmissionSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 20);
|
|
4467
|
+
var CustodyIntentAdmissionSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 21);
|
|
4468
|
+
var CustodyIntentAdmittedSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 22);
|
|
4469
|
+
var CustodyIntentSkippedSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 23);
|
|
4470
|
+
var CustodyIntentRefusedSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 24);
|
|
4471
|
+
var CustodyAdmissionTimingsSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 25);
|
|
4472
|
+
var CustodyAdmissionSpanSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 26);
|
|
4473
|
+
var RuntimeFailureSchema = /* @__PURE__ */ messageDesc4(file_nomos_runtime_v2_runtime, 28);
|
|
4152
4474
|
|
|
4153
4475
|
// ../adapter/custody-offer-transport.ts
|
|
4154
4476
|
function record(value) {
|
|
@@ -4470,38 +4792,6 @@ function requireSingleOsgiResource(xml) {
|
|
|
4470
4792
|
return resources[0];
|
|
4471
4793
|
}
|
|
4472
4794
|
|
|
4473
|
-
// ../adapter/pack_auth_contract.ts
|
|
4474
|
-
var HDR = Object.freeze({
|
|
4475
|
-
/** The verified PROOF: an IdP access token (JWT), kernel-verified against the workspace's AuthProvider. */
|
|
4476
|
-
AUTH: "x-nomos-auth",
|
|
4477
|
-
/** The bare CLAIM (transitional / unverified fallback when no token is presented). */
|
|
4478
|
-
PRINCIPAL: "x-nomos-principal"
|
|
4479
|
-
});
|
|
4480
|
-
function bulkReadForbidden(ws, kind, verdict) {
|
|
4481
|
-
const v = verdict || {};
|
|
4482
|
-
const caps = v.requiredRelationAnyOf || v.caps || [];
|
|
4483
|
-
const schemaUnresolvable = v.schemaResolved === false;
|
|
4484
|
-
const premise = v.tokenError ? `token-verification-failed:${v.tokenError}` : schemaUnresolvable ? "relation-schema-unresolvable" : v.resolvedPrincipal ? "principal-lacks-workspace-read-cap" : "no-principal-presented";
|
|
4485
|
-
const why = v.tokenError ? `the presented ${HDR.AUTH} token did NOT verify (${v.tokenError}) against the workspace's declared issuer ${v.issuer || "?"}${v.audience ? ` / audience ${v.audience}` : ""}.` : schemaUnresolvable ? `the workspace's relation SCHEMA did not resolve \u2014 no principal can hold any read capability until the law's relation declarations merge cleanly (check for a cross-domain (type, relation) rewrite conflict on the shared 'workspace' type).` : v.resolvedPrincipal ? `resolved principal '${v.resolvedPrincipal}'${v.principalVerified ? " (token-verified)" : ` (unverified bare ${HDR.PRINCIPAL} claim)`} holds none of the required read capabilities.` : `no principal was presented \u2014 send a verified ${HDR.AUTH} token for a principal the owner granted a read capability.`;
|
|
4486
|
-
return {
|
|
4487
|
-
ok: false,
|
|
4488
|
-
ws,
|
|
4489
|
-
error: `${kind}-forbidden`,
|
|
4490
|
-
forbidden: {
|
|
4491
|
-
premise,
|
|
4492
|
-
workspace: ws,
|
|
4493
|
-
resolvedPrincipal: v.resolvedPrincipal || null,
|
|
4494
|
-
principalVerified: !!v.principalVerified,
|
|
4495
|
-
tokenError: v.tokenError || null,
|
|
4496
|
-
requiredObject: v.requiredObject || "workspace:self",
|
|
4497
|
-
requiredRelationAnyOf: caps,
|
|
4498
|
-
issuer: v.issuer || null,
|
|
4499
|
-
audience: v.audience || null
|
|
4500
|
-
},
|
|
4501
|
-
hint: `this workspace is private (read visibility) \u2014 a ${kind} reads the whole ledger, so it requires a principal granted ANY of its read capabilities (${caps.join(", ") || "a read cap"}) on ${v.requiredObject || "workspace:self"}: ${why}`
|
|
4502
|
-
};
|
|
4503
|
-
}
|
|
4504
|
-
|
|
4505
4795
|
// ../cloud/cloudflare-shell/src/gateway-route-resolver.ts
|
|
4506
4796
|
function aliasIdsFor(x, path3) {
|
|
4507
4797
|
const ids = [];
|
|
@@ -4734,8 +5024,9 @@ function receivePackCommands(raw) {
|
|
|
4734
5024
|
init_types();
|
|
4735
5025
|
var DIR = path2.dirname(fileURLToPath(import.meta.url));
|
|
4736
5026
|
var REPO_ROOT = path2.resolve(DIR, "../..");
|
|
4737
|
-
var MAX_TYPED_OFFER_REQUEST_BYTES =
|
|
5027
|
+
var MAX_TYPED_OFFER_REQUEST_BYTES = 32 * 1024 * 1024;
|
|
4738
5028
|
var MAX_TYPED_CUSTODY_OFFER_BYTES = 64 * 1024 * 1024;
|
|
5029
|
+
var MAX_TYPED_WORKSPACE_EFFECT_BYTES = 34 * 1024 * 1024;
|
|
4739
5030
|
var RECOGNIZED_UNSUPPORTED = /* @__PURE__ */ new Set([
|
|
4740
5031
|
"container-status",
|
|
4741
5032
|
"recycle-container",
|
|
@@ -4940,6 +5231,35 @@ async function startDevCloud(opts = {}) {
|
|
|
4940
5231
|
for (let i = 0; i < 8; i++) replica = replica << 8n | BigInt(replicaDigest[i]);
|
|
4941
5232
|
replica &= (1n << 63n) - 1n;
|
|
4942
5233
|
const eng = await createEngine({ wasmModule, bootstrapLawUsdz, nomosLawUsdz, replica, installedBy: "nomos-cloud-dev" });
|
|
5234
|
+
const admissionCheckpointSecretPath = path2.join(dataDir, "admission-checkpoint.secret");
|
|
5235
|
+
const admissionCheckpointPublicPath = path2.join(dataDir, "admission-checkpoint.public");
|
|
5236
|
+
let admissionCheckpoint;
|
|
5237
|
+
let admissionCheckpointSecret;
|
|
5238
|
+
if (existsSync2(admissionCheckpointSecretPath) && existsSync2(admissionCheckpointPublicPath)) {
|
|
5239
|
+
admissionCheckpointSecret = new Uint8Array(readFileSync2(admissionCheckpointSecretPath));
|
|
5240
|
+
const admissionCheckpointPublic = new Uint8Array(readFileSync2(admissionCheckpointPublicPath));
|
|
5241
|
+
if (admissionCheckpointSecret.byteLength !== 32 || admissionCheckpointPublic.byteLength !== 32) {
|
|
5242
|
+
throw new Error("persisted admission checkpoint keypair is malformed");
|
|
5243
|
+
}
|
|
5244
|
+
admissionCheckpoint = {
|
|
5245
|
+
secret: Buffer.from(admissionCheckpointSecret).toString("base64"),
|
|
5246
|
+
public: Buffer.from(admissionCheckpointPublic).toString("base64")
|
|
5247
|
+
};
|
|
5248
|
+
} else {
|
|
5249
|
+
admissionCheckpoint = authorKeygen(eng);
|
|
5250
|
+
admissionCheckpointSecret = new Uint8Array(
|
|
5251
|
+
Buffer.from(admissionCheckpoint.secret, "base64")
|
|
5252
|
+
);
|
|
5253
|
+
const admissionCheckpointPublic = Buffer.from(admissionCheckpoint.public, "base64");
|
|
5254
|
+
if (admissionCheckpointSecret.byteLength !== 32 || admissionCheckpointPublic.byteLength !== 32) {
|
|
5255
|
+
throw new Error("kernel produced a malformed admission checkpoint keypair");
|
|
5256
|
+
}
|
|
5257
|
+
writeFileSync(admissionCheckpointSecretPath, admissionCheckpointSecret, { mode: 384 });
|
|
5258
|
+
writeFileSync(admissionCheckpointPublicPath, admissionCheckpointPublic, { mode: 384 });
|
|
5259
|
+
}
|
|
5260
|
+
if (admissionCheckpointSecret.byteLength !== 32) {
|
|
5261
|
+
throw new Error("kernel produced a malformed admission checkpoint secret");
|
|
5262
|
+
}
|
|
4943
5263
|
const restoredTestKRootPublic = String(process.env.NOMOS_TEST_K_ROOT_PUBLIC ?? "").trim();
|
|
4944
5264
|
if (restoredTestKRootPublic) {
|
|
4945
5265
|
const rootBytes = Buffer.from(restoredTestKRootPublic, "base64");
|
|
@@ -4986,6 +5306,75 @@ async function startDevCloud(opts = {}) {
|
|
|
4986
5306
|
headers: {},
|
|
4987
5307
|
pushLane: pushLaneFor(ws)
|
|
4988
5308
|
});
|
|
5309
|
+
async function mountWorkspaceWithResidencies(ws, visiting = /* @__PURE__ */ new Set()) {
|
|
5310
|
+
const mounted = await mountWorkspace(eng, ws, ledgerFor(ws));
|
|
5311
|
+
if (mounted.restored || mounted.requiredResidencies.length === 0) return mounted;
|
|
5312
|
+
if (visiting.has(ws)) {
|
|
5313
|
+
throw new Error(`cyclic workspace residency dependency while mounting '${ws}'`);
|
|
5314
|
+
}
|
|
5315
|
+
const next = new Set(visiting).add(ws);
|
|
5316
|
+
for (const residency of mounted.requiredResidencies) {
|
|
5317
|
+
const source = await mountWorkspaceWithResidencies(residency.workspace, next);
|
|
5318
|
+
if (!source.restored) {
|
|
5319
|
+
throw new Error(
|
|
5320
|
+
`workspace '${ws}' requires unavailable residency '${residency.workspace}'`
|
|
5321
|
+
);
|
|
5322
|
+
}
|
|
5323
|
+
await ensureWorkspaceResidency(
|
|
5324
|
+
eng,
|
|
5325
|
+
residency.workspace,
|
|
5326
|
+
residency.sourceHead,
|
|
5327
|
+
residency.foldRoot,
|
|
5328
|
+
ledgerFor(residency.workspace)
|
|
5329
|
+
);
|
|
5330
|
+
}
|
|
5331
|
+
unmount(eng, ws);
|
|
5332
|
+
return mountWorkspace(eng, ws, ledgerFor(ws));
|
|
5333
|
+
}
|
|
5334
|
+
async function emitOutboxCascade(sourceWorkspace) {
|
|
5335
|
+
const pending = [sourceWorkspace];
|
|
5336
|
+
const seenOfferIds = /* @__PURE__ */ new Set();
|
|
5337
|
+
while (pending.length > 0) {
|
|
5338
|
+
const ws = pending.shift();
|
|
5339
|
+
await mountWorkspace(eng, ws, ledgerFor(ws));
|
|
5340
|
+
const due = outboundOffers(eng, ws);
|
|
5341
|
+
if (due.offers.length === 0) continue;
|
|
5342
|
+
const targetWorkspaces = /* @__PURE__ */ new Set();
|
|
5343
|
+
for (const offer of due.offers) {
|
|
5344
|
+
if (seenOfferIds.has(offer.id)) {
|
|
5345
|
+
throw new Error(
|
|
5346
|
+
`dev outbox lifecycle repeated due offer '${offer.id}' after delivery`
|
|
5347
|
+
);
|
|
5348
|
+
}
|
|
5349
|
+
seenOfferIds.add(offer.id);
|
|
5350
|
+
if (offer.route.case === "workspaceRoute") {
|
|
5351
|
+
const target = offer.route.value.workspace;
|
|
5352
|
+
if (!target) throw new Error(`workspace outbox offer '${offer.id}' has no target`);
|
|
5353
|
+
targetWorkspaces.add(target);
|
|
5354
|
+
}
|
|
5355
|
+
}
|
|
5356
|
+
for (const target of targetWorkspaces) {
|
|
5357
|
+
await mountWorkspace(eng, target, ledgerFor(target));
|
|
5358
|
+
}
|
|
5359
|
+
const result = await emitOutbox(
|
|
5360
|
+
eng,
|
|
5361
|
+
ws,
|
|
5362
|
+
ledgerFor(ws),
|
|
5363
|
+
"",
|
|
5364
|
+
admissionCheckpointSecret
|
|
5365
|
+
);
|
|
5366
|
+
for (const target of targetWorkspaces) {
|
|
5367
|
+
await commitAndPush(eng, target, ledgerFor(target));
|
|
5368
|
+
pending.push(target);
|
|
5369
|
+
}
|
|
5370
|
+
if (result.errors > 0) {
|
|
5371
|
+
console.warn(
|
|
5372
|
+
`[dev-cloud] outbox deferred ${result.errors} of ${due.offers.length} typed delivery attempt(s) from '${ws}'`
|
|
5373
|
+
);
|
|
5374
|
+
return;
|
|
5375
|
+
}
|
|
5376
|
+
}
|
|
5377
|
+
}
|
|
4989
5378
|
async function persistBorn(born) {
|
|
4990
5379
|
if (!Array.isArray(born)) return [];
|
|
4991
5380
|
const out = [];
|
|
@@ -5040,27 +5429,6 @@ async function startDevCloud(opts = {}) {
|
|
|
5040
5429
|
});
|
|
5041
5430
|
const claimedPrincipalOf = (req) => String(req.headers["x-nomos-principal"] || "").slice(0, 128);
|
|
5042
5431
|
const authTokenOf = (req) => String(req.headers["x-nomos-auth"] || "").replace(/^Bearer\s+/i, "");
|
|
5043
|
-
const postureGate = (res, ws, req, kind) => {
|
|
5044
|
-
if (process.env.NOMOS_TEST_DIAGNOSTICS === "1") {
|
|
5045
|
-
console.error(
|
|
5046
|
-
`[dev-cloud] read-posture request ${ws} ${kind} auth-bytes=${authTokenOf(req).length} principal=${claimedPrincipalOf(req) || "(none)"}`
|
|
5047
|
-
);
|
|
5048
|
-
}
|
|
5049
|
-
let posture;
|
|
5050
|
-
try {
|
|
5051
|
-
posture = readPosture(eng, ws, claimedPrincipalOf(req), authTokenOf(req), Math.floor(Date.now() / 1e3));
|
|
5052
|
-
} catch {
|
|
5053
|
-
return false;
|
|
5054
|
-
}
|
|
5055
|
-
if (process.env.NOMOS_TEST_DIAGNOSTICS === "1") {
|
|
5056
|
-
console.error(`[dev-cloud] read-posture ${ws} ${kind} ${JSON.stringify(posture)}`);
|
|
5057
|
-
}
|
|
5058
|
-
if (posture && posture.private && !posture.allowedAny) {
|
|
5059
|
-
sendJson(res, bulkReadForbidden(ws, kind, posture), 403);
|
|
5060
|
-
return true;
|
|
5061
|
-
}
|
|
5062
|
-
return false;
|
|
5063
|
-
};
|
|
5064
5432
|
function openapiFor(ws) {
|
|
5065
5433
|
const merged = { openapi: "3.1.0", info: { title: `${ws} (nomos workspace)`, version: "0", "x-nomos-workspace": ws }, paths: {} };
|
|
5066
5434
|
const domOf = (o) => {
|
|
@@ -5142,6 +5510,18 @@ async function startDevCloud(opts = {}) {
|
|
|
5142
5510
|
const token = idp.mint({ sub: b.sub, ...b.nonce ? { nonce: b.nonce } : {} });
|
|
5143
5511
|
return sendJson(res, { ok: true, token, issuer: idp.issuer, audience: idp.audience, jwks: idp.jwks });
|
|
5144
5512
|
}
|
|
5513
|
+
if (url.pathname === "/dev/rotate-idp" && req.method === "POST") {
|
|
5514
|
+
const rotate = devSelf?.rotateTestIdP;
|
|
5515
|
+
if (!rotate) {
|
|
5516
|
+
return sendJson(res, {
|
|
5517
|
+
ok: false,
|
|
5518
|
+
error: "no rotatable dev IdP \u2014 start an ephemeral platform without --firebase-project"
|
|
5519
|
+
}, 409);
|
|
5520
|
+
}
|
|
5521
|
+
await rotate();
|
|
5522
|
+
res.writeHead(204, CORS);
|
|
5523
|
+
return res.end();
|
|
5524
|
+
}
|
|
5145
5525
|
if (url.pathname === "/v1/runtime/holon.wasm" || url.pathname === "/v1/runtime/holon-testmint.wasm") {
|
|
5146
5526
|
res.writeHead(200, { ...CORS, "content-type": "application/wasm", "cache-control": "no-store", "x-nomos-kernel": kernelKind, "x-nomos-kernel-sha": kernelSha });
|
|
5147
5527
|
return res.end(Buffer.from(wasmBytes));
|
|
@@ -5265,7 +5645,7 @@ async function startDevCloud(opts = {}) {
|
|
|
5265
5645
|
const ledger = ledgerFor(ws);
|
|
5266
5646
|
let initialized = false, ledgerState = null, mount = null;
|
|
5267
5647
|
if (custody.get(`holon-${ws}`)) {
|
|
5268
|
-
mount = await
|
|
5648
|
+
mount = await mountWorkspaceWithResidencies(ws);
|
|
5269
5649
|
try {
|
|
5270
5650
|
initialized = nomosActive(eng, ws);
|
|
5271
5651
|
} catch {
|
|
@@ -5292,7 +5672,7 @@ async function startDevCloud(opts = {}) {
|
|
|
5292
5672
|
if (sub[0] === "domains" && sub.length === 1) {
|
|
5293
5673
|
if (req.method === "GET") {
|
|
5294
5674
|
return await serialize(async () => {
|
|
5295
|
-
await
|
|
5675
|
+
await mountWorkspaceWithResidencies(ws);
|
|
5296
5676
|
sendJson(res, { ok: true, ws, ...installedLaw(eng, ws) });
|
|
5297
5677
|
});
|
|
5298
5678
|
}
|
|
@@ -5315,9 +5695,47 @@ async function startDevCloud(opts = {}) {
|
|
|
5315
5695
|
await mountWorkspace(eng, ws, ledger);
|
|
5316
5696
|
const out = await admitAll(eng, ws, ledger, {});
|
|
5317
5697
|
if (Array.isArray(out.born) && out.born.length) await persistBorn(packBornChildren(eng, out.born));
|
|
5698
|
+
await emitOutboxCascade(ws);
|
|
5318
5699
|
sendJson(res, { ok: true, ws, sessions: out.sessions, main: out.main, ...out.timings ? { timings: out.timings } : {} });
|
|
5319
5700
|
});
|
|
5320
5701
|
}
|
|
5702
|
+
if (sub[0] === "workspace-effect" && req.method === "POST") {
|
|
5703
|
+
return await serialize(async () => {
|
|
5704
|
+
const contentType = String(req.headers["content-type"] || "");
|
|
5705
|
+
if (!contentType.includes("application/vnd.nomos.workspace-effect+protobuf")) {
|
|
5706
|
+
return sendBytes(res, Buffer.from("expected typed workspace-effect protobuf"), 415, {
|
|
5707
|
+
"content-type": "text/plain; charset=utf-8"
|
|
5708
|
+
});
|
|
5709
|
+
}
|
|
5710
|
+
const raw = await readBody(req);
|
|
5711
|
+
if (raw.byteLength === 0 || raw.byteLength > MAX_TYPED_WORKSPACE_EFFECT_BYTES) {
|
|
5712
|
+
return sendBytes(
|
|
5713
|
+
res,
|
|
5714
|
+
Buffer.from(`typed workspace effect must be 1..${MAX_TYPED_WORKSPACE_EFFECT_BYTES} bytes`),
|
|
5715
|
+
413,
|
|
5716
|
+
{ "content-type": "text/plain; charset=utf-8" }
|
|
5717
|
+
);
|
|
5718
|
+
}
|
|
5719
|
+
if (!custody.get(`holon-${ws}`)) {
|
|
5720
|
+
return sendBytes(res, Buffer.from(`workspace-effect target '${ws}' has no custody`), 404, {
|
|
5721
|
+
"content-type": "text/plain; charset=utf-8"
|
|
5722
|
+
});
|
|
5723
|
+
}
|
|
5724
|
+
const ledger = ledgerFor(ws);
|
|
5725
|
+
await mountWorkspace(eng, ws, ledger);
|
|
5726
|
+
const response = await applyWorkspaceEffect(
|
|
5727
|
+
eng,
|
|
5728
|
+
ws,
|
|
5729
|
+
ledger,
|
|
5730
|
+
new Uint8Array(raw),
|
|
5731
|
+
admissionCheckpointSecret
|
|
5732
|
+
);
|
|
5733
|
+
await emitOutboxCascade(ws);
|
|
5734
|
+
sendBytes(res, Buffer.from(response), 200, {
|
|
5735
|
+
"content-type": "application/vnd.nomos.workspace-effect-result+protobuf"
|
|
5736
|
+
});
|
|
5737
|
+
});
|
|
5738
|
+
}
|
|
5321
5739
|
if (sub[0] === "intent-offers" && req.method === "POST") {
|
|
5322
5740
|
return await serialize(async () => {
|
|
5323
5741
|
const contentType = String(req.headers["content-type"] || "");
|
|
@@ -5364,6 +5782,7 @@ async function startDevCloud(opts = {}) {
|
|
|
5364
5782
|
return sendBytes(res, Buffer.from("typed custody offer has no source"), 400, { "content-type": "text/plain; charset=utf-8" });
|
|
5365
5783
|
}
|
|
5366
5784
|
if (Array.isArray(out.born) && out.born.length) await persistBorn(out.born);
|
|
5785
|
+
await emitOutboxCascade(ws);
|
|
5367
5786
|
sendBytes(res, encodeCustodyOfferResponse(request, ws, out), 200, {
|
|
5368
5787
|
"content-type": "application/vnd.nomos.custody-offer-result+protobuf"
|
|
5369
5788
|
});
|
|
@@ -5425,7 +5844,6 @@ async function startDevCloud(opts = {}) {
|
|
|
5425
5844
|
if (sub[0] === "pack" && req.method === "GET") {
|
|
5426
5845
|
return await serialize(async () => {
|
|
5427
5846
|
await mountWorkspace(eng, ws, ledgerFor(ws));
|
|
5428
|
-
if (postureGate(res, ws, req, "pack")) return;
|
|
5429
5847
|
const have = url.searchParams.get("have") || "";
|
|
5430
5848
|
let r;
|
|
5431
5849
|
try {
|
|
@@ -5446,9 +5864,11 @@ async function startDevCloud(opts = {}) {
|
|
|
5446
5864
|
if (sub[0] === "snapshot" && req.method === "GET") {
|
|
5447
5865
|
return await serialize(async () => {
|
|
5448
5866
|
await mountWorkspace(eng, ws, ledgerFor(ws));
|
|
5449
|
-
|
|
5450
|
-
|
|
5451
|
-
|
|
5867
|
+
const bytes = localCustodySnapshot(eng, ws);
|
|
5868
|
+
sendBytes(res, bytes, 200, {
|
|
5869
|
+
"content-type": "application/vnd.nomos.local-custody-snapshot+protobuf",
|
|
5870
|
+
"x-nomos-layout": "local-custody-v3"
|
|
5871
|
+
});
|
|
5452
5872
|
});
|
|
5453
5873
|
}
|
|
5454
5874
|
if (sub.length === 1 && sub[0] === "prepare-offer" && req.method === "POST") {
|
|
@@ -5488,6 +5908,91 @@ async function startDevCloud(opts = {}) {
|
|
|
5488
5908
|
});
|
|
5489
5909
|
});
|
|
5490
5910
|
}
|
|
5911
|
+
if (sub.length === 1 && sub[0] === "runtime" && req.method === "POST") {
|
|
5912
|
+
const contentType = String(req.headers["content-type"] || "");
|
|
5913
|
+
if (!contentType.includes("application/vnd.nomos.runtime-request+protobuf")) {
|
|
5914
|
+
return sendBytes(res, Buffer.from("expected typed Runtime v2 protobuf"), 415, {
|
|
5915
|
+
"content-type": "text/plain; charset=utf-8"
|
|
5916
|
+
});
|
|
5917
|
+
}
|
|
5918
|
+
let requestBytes;
|
|
5919
|
+
try {
|
|
5920
|
+
requestBytes = await readBoundedBody(req, MAX_TYPED_OFFER_REQUEST_BYTES);
|
|
5921
|
+
} catch (error) {
|
|
5922
|
+
if (error instanceof RangeError) {
|
|
5923
|
+
return sendBytes(res, Buffer.from(error.message), 413, {
|
|
5924
|
+
"content-type": "text/plain; charset=utf-8"
|
|
5925
|
+
});
|
|
5926
|
+
}
|
|
5927
|
+
throw error;
|
|
5928
|
+
}
|
|
5929
|
+
const runtime = fromBinary2(RuntimeRequestSchema, requestBytes);
|
|
5930
|
+
if (runtime.protocolVersion !== 2 || !runtime.requestId) {
|
|
5931
|
+
return sendBytes(res, Buffer.from("runtime request requires protocol version 2 and a request id"), 400, {
|
|
5932
|
+
"content-type": "text/plain; charset=utf-8"
|
|
5933
|
+
});
|
|
5934
|
+
}
|
|
5935
|
+
if (runtime.command.case !== "kernelCall" || !runtime.command.value.request) {
|
|
5936
|
+
return sendBytes(res, Buffer.from("local runtime currently accepts generated kernel calls"), 400, {
|
|
5937
|
+
"content-type": "text/plain; charset=utf-8"
|
|
5938
|
+
});
|
|
5939
|
+
}
|
|
5940
|
+
if (runtime.command.value.session !== ws) {
|
|
5941
|
+
return sendBytes(res, Buffer.from("runtime session does not match the routed workspace"), 409, {
|
|
5942
|
+
"content-type": "text/plain; charset=utf-8"
|
|
5943
|
+
});
|
|
5944
|
+
}
|
|
5945
|
+
const call = runtime.command.value.request;
|
|
5946
|
+
if (call.protocolVersion !== 1 || !call.requestId) {
|
|
5947
|
+
return sendBytes(res, Buffer.from("kernel call requires protocol version 1 and a request id"), 400, {
|
|
5948
|
+
"content-type": "text/plain; charset=utf-8"
|
|
5949
|
+
});
|
|
5950
|
+
}
|
|
5951
|
+
if (call.operation.case === "offer" || call.operation.case === "query") {
|
|
5952
|
+
const target = call.operation.value.target;
|
|
5953
|
+
if (!target || target.workspace !== ws || target.repo !== `/work/ws/${ws}` || target.branch !== "main") {
|
|
5954
|
+
return sendBytes(res, Buffer.from("runtime kernel call target is not bound to this workspace/main"), 409, {
|
|
5955
|
+
"content-type": "text/plain; charset=utf-8"
|
|
5956
|
+
});
|
|
5957
|
+
}
|
|
5958
|
+
} else if (call.operation.case === "custody" && call.operation.value.operation.case === "resolveRef") {
|
|
5959
|
+
const resolve = call.operation.value.operation.value;
|
|
5960
|
+
if (resolve.repo !== `/work/ws/${ws}` || resolve.reference !== "refs/heads/main") {
|
|
5961
|
+
return sendBytes(res, Buffer.from("runtime custody lookup is not bound to this workspace/main"), 409, {
|
|
5962
|
+
"content-type": "text/plain; charset=utf-8"
|
|
5963
|
+
});
|
|
5964
|
+
}
|
|
5965
|
+
} else {
|
|
5966
|
+
return sendBytes(res, Buffer.from("kernel operation is not available on the remote runtime lane"), 400, {
|
|
5967
|
+
"content-type": "text/plain; charset=utf-8"
|
|
5968
|
+
});
|
|
5969
|
+
}
|
|
5970
|
+
if (call.operation.case === "offer" && call.operation.value.intent.case !== "sealedChangeUsda") {
|
|
5971
|
+
return sendBytes(res, Buffer.from("remote runtime admits only locally signed USDA transitions"), 400, {
|
|
5972
|
+
"content-type": "text/plain; charset=utf-8"
|
|
5973
|
+
});
|
|
5974
|
+
}
|
|
5975
|
+
return await serialize(async () => {
|
|
5976
|
+
const ledger = ledgerFor(ws);
|
|
5977
|
+
await mountWorkspace(eng, ws, ledger);
|
|
5978
|
+
const response = callKernel(eng, call);
|
|
5979
|
+
if (response.outcome.case === "offer" && response.outcome.value.outcome.case === "admitted") {
|
|
5980
|
+
await commitAndPush(eng, ws, ledger);
|
|
5981
|
+
const admitted = response.outcome.value.outcome.value;
|
|
5982
|
+
if (admitted.born.length > 0) {
|
|
5983
|
+
await persistBorn(packBornChildren(eng, admitted.born));
|
|
5984
|
+
}
|
|
5985
|
+
await emitOutboxCascade(ws);
|
|
5986
|
+
}
|
|
5987
|
+
sendBytes(res, toBinary3(RuntimeResponseSchema, create3(RuntimeResponseSchema, {
|
|
5988
|
+
protocolVersion: 2,
|
|
5989
|
+
requestId: runtime.requestId,
|
|
5990
|
+
outcome: { case: "kernelCall", value: response }
|
|
5991
|
+
})), 200, {
|
|
5992
|
+
"content-type": "application/vnd.nomos.runtime-response+protobuf"
|
|
5993
|
+
});
|
|
5994
|
+
});
|
|
5995
|
+
}
|
|
5491
5996
|
if (sub[0] === "aggregates" && sub[1] || sub[0] === "qbyid" && req.method === "GET") {
|
|
5492
5997
|
const id = sub[0] === "aggregates" ? decodeURIComponent(sub.slice(1).join("/")) : url.searchParams.get("id");
|
|
5493
5998
|
return await serialize(async () => {
|
|
@@ -5544,6 +6049,7 @@ async function startDevCloud(opts = {}) {
|
|
|
5544
6049
|
}
|
|
5545
6050
|
if (!out.ok) return sendJson(res, { ok: false, refused: true, error: String(out.error).slice(0, 600) }, 422);
|
|
5546
6051
|
const born = Array.isArray(out.born) && out.born.length ? await persistBorn(packBornChildren(eng, out.born)) : void 0;
|
|
6052
|
+
await emitOutboxCascade(ws);
|
|
5547
6053
|
sendJson(res, { ok: true, ws, head: out.head, ...born ? { born } : {}, ...out.birthOutcomes ? { birthOutcomes: out.birthOutcomes } : {} });
|
|
5548
6054
|
} catch (e) {
|
|
5549
6055
|
sendJson(res, { ok: false, refused: true, error: errMsg(e).slice(0, 600) }, 422);
|
|
@@ -5623,6 +6129,7 @@ async function startDevCloud(opts = {}) {
|
|
|
5623
6129
|
await mountWorkspace(eng, ws, ledger);
|
|
5624
6130
|
const out = await admitAll(eng, ws, ledger, {});
|
|
5625
6131
|
if (Array.isArray(out.born) && out.born.length) await persistBorn(packBornChildren(eng, out.born));
|
|
6132
|
+
await emitOutboxCascade(ws);
|
|
5626
6133
|
} catch (e) {
|
|
5627
6134
|
console.error(`[dev-cloud] admit ${ws} failed:`, errMsg(e));
|
|
5628
6135
|
}
|
|
@@ -5673,6 +6180,7 @@ Sec-WebSocket-Accept: ${accept}\r
|
|
|
5673
6180
|
ledgerFor,
|
|
5674
6181
|
serialize,
|
|
5675
6182
|
persistBorn,
|
|
6183
|
+
admissionCheckpoint,
|
|
5676
6184
|
// `--platform` requested ⇒ NOT ready until the boot-time ceremony completes (main flips it true).
|
|
5677
6185
|
...opts.platform ? { platformReady: false } : {},
|
|
5678
6186
|
close: () => new Promise((resolve) => {
|
|
@@ -5733,6 +6241,7 @@ function parseArgs(argv) {
|
|
|
5733
6241
|
const a = argv[i];
|
|
5734
6242
|
if (a === "--ephemeral") o.ephemeral = true;
|
|
5735
6243
|
else if (a === "--port") o.port = parseInt(argv[++i], 10);
|
|
6244
|
+
else if (a === "--host") o.host = argv[++i];
|
|
5736
6245
|
else if (a === "--data") o.data = argv[++i];
|
|
5737
6246
|
else if (a === "--firebase-project") o.firebaseProject = argv[++i];
|
|
5738
6247
|
else if (a === "--platform") o.platform = argv[++i];
|