@inkeep/agents-api 0.0.0-dev-20260216002643 → 0.0.0-dev-20260216012253
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/.well-known/workflow/v1/flow.cjs +52 -52
- package/dist/.well-known/workflow/v1/flow.cjs.debug.json +2 -2
- package/dist/.well-known/workflow/v1/manifest.json +20 -20
- package/dist/.well-known/workflow/v1/step.cjs.debug.json +2 -2
- package/dist/createApp.d.ts +2 -2
- package/dist/createApp.js +22 -0
- package/dist/data/db/manageDbClient.d.ts +2 -2
- package/dist/data/db/runDbClient.d.ts +2 -2
- package/dist/domains/evals/routes/datasetTriggers.d.ts +2 -2
- package/dist/domains/evals/routes/index.d.ts +2 -2
- package/dist/domains/evals/workflow/routes.d.ts +2 -2
- package/dist/domains/manage/routes/availableAgents.d.ts +2 -2
- package/dist/domains/manage/routes/conversations.d.ts +2 -2
- package/dist/domains/manage/routes/index.d.ts +2 -2
- package/dist/domains/manage/routes/mcp.d.ts +2 -2
- package/dist/domains/manage/routes/passwordResetLinks.d.ts +2 -2
- package/dist/domains/manage/routes/signoz.d.ts +2 -2
- package/dist/domains/manage/routes/users.d.ts +2 -2
- package/dist/domains/mcp/routes/mcp.d.ts +2 -2
- package/dist/domains/run/agents/relationTools.d.ts +2 -2
- package/dist/domains/run/tools/distill-conversation-history-tool.d.ts +1 -1
- package/dist/domains/run/types/chat.d.ts +4 -4
- package/dist/domains/run/workflow/steps/scheduledTriggerSteps.d.ts +5 -5
- package/dist/env.d.ts +2 -2
- package/dist/factory.d.ts +3 -3
- package/dist/index.d.ts +2 -2
- package/dist/middleware/evalsAuth.d.ts +2 -2
- package/dist/middleware/manageAuth.d.ts +2 -2
- package/dist/middleware/projectAccess.d.ts +2 -2
- package/dist/middleware/projectConfig.d.ts +3 -3
- package/dist/middleware/requirePermission.d.ts +2 -2
- package/dist/middleware/runAuth.d.ts +4 -4
- package/dist/middleware/sessionAuth.d.ts +3 -3
- package/dist/middleware/tenantAccess.d.ts +2 -2
- package/dist/middleware/tracing.d.ts +3 -3
- package/package.json +5 -5
|
@@ -50198,6 +50198,44 @@ var runDatasetItemWorkflow = Object.assign(_runDatasetItemWorkflow, {
|
|
|
50198
50198
|
workflowId: "workflow//./src/domains/evals/workflow/functions/runDatasetItem//_runDatasetItemWorkflow"
|
|
50199
50199
|
});
|
|
50200
50200
|
|
|
50201
|
+
// src/domains/evals/workflow/functions/evaluateConversation.ts
|
|
50202
|
+
var getConversationStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/evals/workflow/functions/evaluateConversation//getConversationStep");
|
|
50203
|
+
var getEvaluatorsStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/evals/workflow/functions/evaluateConversation//getEvaluatorsStep");
|
|
50204
|
+
var executeEvaluatorStep2 = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/evals/workflow/functions/evaluateConversation//executeEvaluatorStep");
|
|
50205
|
+
var logStep2 = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/evals/workflow/functions/evaluateConversation//logStep");
|
|
50206
|
+
async function _evaluateConversationWorkflow(payload) {
|
|
50207
|
+
const { conversationId, evaluatorIds } = payload;
|
|
50208
|
+
await logStep2("Starting conversation evaluation", payload);
|
|
50209
|
+
const conversation = await getConversationStep(payload);
|
|
50210
|
+
const evaluators = await getEvaluatorsStep(payload);
|
|
50211
|
+
if (evaluators.length === 0) {
|
|
50212
|
+
await logStep2("No valid evaluators found", {
|
|
50213
|
+
conversationId,
|
|
50214
|
+
evaluatorIds
|
|
50215
|
+
});
|
|
50216
|
+
return {
|
|
50217
|
+
success: false,
|
|
50218
|
+
reason: "No valid evaluators"
|
|
50219
|
+
};
|
|
50220
|
+
}
|
|
50221
|
+
const results = [];
|
|
50222
|
+
for (const evaluator of evaluators) {
|
|
50223
|
+
const result = await executeEvaluatorStep2(payload, evaluator.id, conversation);
|
|
50224
|
+
results.push(result);
|
|
50225
|
+
}
|
|
50226
|
+
return {
|
|
50227
|
+
success: true,
|
|
50228
|
+
conversationId,
|
|
50229
|
+
resultCount: results.length
|
|
50230
|
+
};
|
|
50231
|
+
}
|
|
50232
|
+
__name(_evaluateConversationWorkflow, "_evaluateConversationWorkflow");
|
|
50233
|
+
_evaluateConversationWorkflow.workflowId = "workflow//./src/domains/evals/workflow/functions/evaluateConversation//_evaluateConversationWorkflow";
|
|
50234
|
+
globalThis.__private_workflows.set("workflow//./src/domains/evals/workflow/functions/evaluateConversation//_evaluateConversationWorkflow", _evaluateConversationWorkflow);
|
|
50235
|
+
var evaluateConversationWorkflow = Object.assign(_evaluateConversationWorkflow, {
|
|
50236
|
+
workflowId: "workflow//./src/domains/evals/workflow/functions/evaluateConversation//_evaluateConversationWorkflow"
|
|
50237
|
+
});
|
|
50238
|
+
|
|
50201
50239
|
// ../node_modules/.pnpm/@workflow+utils@4.1.0-beta.11/node_modules/@workflow/utils/dist/time.js
|
|
50202
50240
|
var import_ms = __toESM(require_ms(), 1);
|
|
50203
50241
|
|
|
@@ -50239,7 +50277,7 @@ __name(getWorkflowMetadata, "getWorkflowMetadata");
|
|
|
50239
50277
|
var fetch = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//workflow@4.1.0-beta.54//fetch");
|
|
50240
50278
|
|
|
50241
50279
|
// src/domains/run/workflow/steps/scheduledTriggerSteps.ts
|
|
50242
|
-
var
|
|
50280
|
+
var logStep3 = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/run/workflow/steps/scheduledTriggerSteps//logStep");
|
|
50243
50281
|
var calculateNextExecutionStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/run/workflow/steps/scheduledTriggerSteps//calculateNextExecutionStep");
|
|
50244
50282
|
var computeSleepDurationStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/run/workflow/steps/scheduledTriggerSteps//computeSleepDurationStep");
|
|
50245
50283
|
var getNextPendingInvocationStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/run/workflow/steps/scheduledTriggerSteps//getNextPendingInvocationStep");
|
|
@@ -50263,7 +50301,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
|
|
|
50263
50301
|
const { tenantId, projectId, agentId, scheduledTriggerId } = payload;
|
|
50264
50302
|
const metadata = getWorkflowMetadata();
|
|
50265
50303
|
const runnerId = metadata.workflowRunId;
|
|
50266
|
-
await
|
|
50304
|
+
await logStep3("Starting scheduled trigger runner workflow", {
|
|
50267
50305
|
tenantId,
|
|
50268
50306
|
projectId,
|
|
50269
50307
|
agentId,
|
|
@@ -50280,7 +50318,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
|
|
|
50280
50318
|
runnerId
|
|
50281
50319
|
});
|
|
50282
50320
|
if (!enabledCheck.shouldContinue || !enabledCheck.trigger) {
|
|
50283
|
-
await
|
|
50321
|
+
await logStep3("Scheduled trigger workflow stopping", {
|
|
50284
50322
|
scheduledTriggerId,
|
|
50285
50323
|
reason: enabledCheck.reason
|
|
50286
50324
|
});
|
|
@@ -50301,7 +50339,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
|
|
|
50301
50339
|
let scheduledFor;
|
|
50302
50340
|
if (isOneTime) {
|
|
50303
50341
|
if (!trigger.runAt) {
|
|
50304
|
-
await
|
|
50342
|
+
await logStep3("One-time trigger missing runAt", {
|
|
50305
50343
|
scheduledTriggerId
|
|
50306
50344
|
});
|
|
50307
50345
|
return {
|
|
@@ -50318,7 +50356,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
|
|
|
50318
50356
|
});
|
|
50319
50357
|
scheduledFor = nextExecutionTime;
|
|
50320
50358
|
} else {
|
|
50321
|
-
await
|
|
50359
|
+
await logStep3("Trigger missing both cronExpression and runAt", {
|
|
50322
50360
|
scheduledTriggerId
|
|
50323
50361
|
});
|
|
50324
50362
|
return {
|
|
@@ -50338,7 +50376,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
|
|
|
50338
50376
|
});
|
|
50339
50377
|
invocation = result.invocation;
|
|
50340
50378
|
if (isOneTime && result.alreadyExists && invocation.status !== "pending") {
|
|
50341
|
-
await
|
|
50379
|
+
await logStep3("One-time trigger already executed", {
|
|
50342
50380
|
scheduledTriggerId,
|
|
50343
50381
|
invocationId: invocation.id,
|
|
50344
50382
|
status: invocation.status
|
|
@@ -50349,13 +50387,13 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
|
|
|
50349
50387
|
};
|
|
50350
50388
|
}
|
|
50351
50389
|
}
|
|
50352
|
-
await
|
|
50390
|
+
await logStep3("Got next pending invocation", {
|
|
50353
50391
|
scheduledTriggerId,
|
|
50354
50392
|
invocationId: invocation.id,
|
|
50355
50393
|
scheduledFor: invocation.scheduledFor
|
|
50356
50394
|
});
|
|
50357
50395
|
const sleepMs = await computeSleepDurationStep(invocation.scheduledFor);
|
|
50358
|
-
await
|
|
50396
|
+
await logStep3("Sleeping until scheduled time", {
|
|
50359
50397
|
scheduledTriggerId,
|
|
50360
50398
|
invocationId: invocation.id,
|
|
50361
50399
|
scheduledFor: invocation.scheduledFor,
|
|
@@ -50370,7 +50408,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
|
|
|
50370
50408
|
runnerId
|
|
50371
50409
|
});
|
|
50372
50410
|
if (!postSleepCheck.shouldContinue || !postSleepCheck.trigger) {
|
|
50373
|
-
await
|
|
50411
|
+
await logStep3("Trigger disabled/deleted during sleep, stopping", {
|
|
50374
50412
|
scheduledTriggerId,
|
|
50375
50413
|
reason: postSleepCheck.reason
|
|
50376
50414
|
});
|
|
@@ -50388,7 +50426,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
|
|
|
50388
50426
|
invocationId: invocation.id
|
|
50389
50427
|
});
|
|
50390
50428
|
if (cancelCheck.cancelled) {
|
|
50391
|
-
await
|
|
50429
|
+
await logStep3("Invocation was cancelled, skipping to next", {
|
|
50392
50430
|
scheduledTriggerId,
|
|
50393
50431
|
invocationId: invocation.id
|
|
50394
50432
|
});
|
|
@@ -50406,7 +50444,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
|
|
|
50406
50444
|
invocationId: invocation.id
|
|
50407
50445
|
});
|
|
50408
50446
|
if (retryCancel.cancelled) {
|
|
50409
|
-
await
|
|
50447
|
+
await logStep3("Invocation cancelled during retry loop", {
|
|
50410
50448
|
scheduledTriggerId,
|
|
50411
50449
|
invocationId: invocation.id
|
|
50412
50450
|
});
|
|
@@ -50447,7 +50485,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
|
|
|
50447
50485
|
scheduledTriggerId,
|
|
50448
50486
|
invocationId: invocation.id
|
|
50449
50487
|
});
|
|
50450
|
-
await
|
|
50488
|
+
await logStep3("Scheduled trigger execution completed", {
|
|
50451
50489
|
scheduledTriggerId,
|
|
50452
50490
|
invocationId: invocation.id,
|
|
50453
50491
|
conversationId: result.conversationId
|
|
@@ -50456,7 +50494,7 @@ async function _scheduledTriggerRunnerWorkflow(payload) {
|
|
|
50456
50494
|
break;
|
|
50457
50495
|
}
|
|
50458
50496
|
lastError = result.error || "Unknown error";
|
|
50459
|
-
await
|
|
50497
|
+
await logStep3("Scheduled trigger execution failed", {
|
|
50460
50498
|
scheduledTriggerId,
|
|
50461
50499
|
invocationId: invocation.id,
|
|
50462
50500
|
attemptNumber,
|
|
@@ -50502,45 +50540,7 @@ globalThis.__private_workflows.set("workflow//./src/domains/run/workflow/functio
|
|
|
50502
50540
|
var scheduledTriggerRunnerWorkflow = Object.assign(_scheduledTriggerRunnerWorkflow, {
|
|
50503
50541
|
workflowId: "workflow//./src/domains/run/workflow/functions/scheduledTriggerRunner//_scheduledTriggerRunnerWorkflow"
|
|
50504
50542
|
});
|
|
50505
|
-
|
|
50506
|
-
// src/domains/evals/workflow/functions/evaluateConversation.ts
|
|
50507
|
-
var getConversationStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/evals/workflow/functions/evaluateConversation//getConversationStep");
|
|
50508
|
-
var getEvaluatorsStep = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/evals/workflow/functions/evaluateConversation//getEvaluatorsStep");
|
|
50509
|
-
var executeEvaluatorStep2 = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/evals/workflow/functions/evaluateConversation//executeEvaluatorStep");
|
|
50510
|
-
var logStep3 = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("step//./src/domains/evals/workflow/functions/evaluateConversation//logStep");
|
|
50511
|
-
async function _evaluateConversationWorkflow(payload) {
|
|
50512
|
-
const { conversationId, evaluatorIds } = payload;
|
|
50513
|
-
await logStep3("Starting conversation evaluation", payload);
|
|
50514
|
-
const conversation = await getConversationStep(payload);
|
|
50515
|
-
const evaluators = await getEvaluatorsStep(payload);
|
|
50516
|
-
if (evaluators.length === 0) {
|
|
50517
|
-
await logStep3("No valid evaluators found", {
|
|
50518
|
-
conversationId,
|
|
50519
|
-
evaluatorIds
|
|
50520
|
-
});
|
|
50521
|
-
return {
|
|
50522
|
-
success: false,
|
|
50523
|
-
reason: "No valid evaluators"
|
|
50524
|
-
};
|
|
50525
|
-
}
|
|
50526
|
-
const results = [];
|
|
50527
|
-
for (const evaluator of evaluators) {
|
|
50528
|
-
const result = await executeEvaluatorStep2(payload, evaluator.id, conversation);
|
|
50529
|
-
results.push(result);
|
|
50530
|
-
}
|
|
50531
|
-
return {
|
|
50532
|
-
success: true,
|
|
50533
|
-
conversationId,
|
|
50534
|
-
resultCount: results.length
|
|
50535
|
-
};
|
|
50536
|
-
}
|
|
50537
|
-
__name(_evaluateConversationWorkflow, "_evaluateConversationWorkflow");
|
|
50538
|
-
_evaluateConversationWorkflow.workflowId = "workflow//./src/domains/evals/workflow/functions/evaluateConversation//_evaluateConversationWorkflow";
|
|
50539
|
-
globalThis.__private_workflows.set("workflow//./src/domains/evals/workflow/functions/evaluateConversation//_evaluateConversationWorkflow", _evaluateConversationWorkflow);
|
|
50540
|
-
var evaluateConversationWorkflow = Object.assign(_evaluateConversationWorkflow, {
|
|
50541
|
-
workflowId: "workflow//./src/domains/evals/workflow/functions/evaluateConversation//_evaluateConversationWorkflow"
|
|
50542
|
-
});
|
|
50543
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL21zQDIuMS4zL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICJzcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvcnVuRGF0YXNldEl0ZW0udHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0B3b3JrZmxvdyt1dGlsc0A0LjEuMC1iZXRhLjExL25vZGVfbW9kdWxlcy9Ad29ya2Zsb3cvdXRpbHMvc3JjL3RpbWUudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0B3b3JrZmxvdytjb3JlQDQuMS4wLWJldGEuNTRfQGF3cy1zZGsrY2xpZW50LXN0c0AzLjk3MC4wX0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMC9ub2RlX21vZHVsZXMvQHdvcmtmbG93L2NvcmUvc3JjL3N5bWJvbHMudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL0B3b3JrZmxvdytjb3JlQDQuMS4wLWJldGEuNTRfQGF3cy1zZGsrY2xpZW50LXN0c0AzLjk3MC4wX0BvcGVudGVsZW1ldHJ5K2FwaUAxLjkuMC9ub2RlX21vZHVsZXMvQHdvcmtmbG93L2NvcmUvc3JjL3NsZWVwLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ad29ya2Zsb3crY29yZUA0LjEuMC1iZXRhLjU0X0Bhd3Mtc2RrK2NsaWVudC1zdHNAMy45NzAuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjAvbm9kZV9tb2R1bGVzL0B3b3JrZmxvdy9jb3JlL3NyYy93b3JrZmxvdy9nZXQtd29ya2Zsb3ctbWV0YWRhdGEudHMiLCAiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL3dvcmtmbG93QDQuMS4wLWJldGEuNTRfQGF3cy1zZGsrY2xpZW50LXN0c0AzLjk3MC4wX0BuZXN0anMrY29tbW9uQDExLjEuMTNfcmVmbGVjdC1tZXRhZF9mODUyODFmMjU4MGQ3MDY1ZmM1MTRlNjM3ZjVmNWUxZi9ub2RlX21vZHVsZXMvd29ya2Zsb3cvc3JjL3N0ZGxpYi50cyIsICJzcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLnRzIiwgInNyYy9kb21haW5zL3J1bi93b3JrZmxvdy9mdW5jdGlvbnMvc2NoZWR1bGVkVHJpZ2dlclJ1bm5lci50cyIsICJzcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvZXZhbHVhdGVDb252ZXJzYXRpb24udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogSGVscGVycy5cbiAqLyB2YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgdyA9IGQgKiA3O1xudmFyIHkgPSBkICogMzY1LjI1O1xuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi8gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgKyBKU09OLnN0cmluZ2lmeSh2YWwpKTtcbn07XG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqLyBmdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhzdHIpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICAgIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gICAgc3dpdGNoKHR5cGUpe1xuICAgICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBjYXNlICd5cnMnOlxuICAgICAgICBjYXNlICd5cic6XG4gICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiB5O1xuICAgICAgICBjYXNlICd3ZWVrcyc6XG4gICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgIHJldHVybiBuICogdztcbiAgICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBkO1xuICAgICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICBjYXNlICdocnMnOlxuICAgICAgICBjYXNlICdocic6XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBoO1xuICAgICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgY2FzZSAnbWlucyc6XG4gICAgICAgIGNhc2UgJ21pbic6XG4gICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBtO1xuICAgICAgICBjYXNlICdzZWNvbmRzJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnc2Vjcyc6XG4gICAgICAgIGNhc2UgJ3NlYyc6XG4gICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBzO1xuICAgICAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgICAgIGNhc2UgJ21zZWNzJzpcbiAgICAgICAgY2FzZSAnbXNlYyc6XG4gICAgICAgIGNhc2UgJ21zJzpcbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovIGZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gICAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICAgIGlmIChtc0FicyA+PSBkKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBtKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBzKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gICAgfVxuICAgIHJldHVybiBtcyArICdtcyc7XG59XG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi8gZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICAgIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgICBpZiAobXNBYnMgPj0gZCkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gaCkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IG0pIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IHMpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgICB9XG4gICAgcmV0dXJuIG1zICsgJyBtcyc7XG59XG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovIGZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgICB2YXIgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbikgKyAnICcgKyBuYW1lICsgKGlzUGx1cmFsID8gJ3MnIDogJycpO1xufVxuIiwgIi8qKlxuICogV29ya2Zsb3cgZm9yIHJ1bm5pbmcgZGF0YXNldCBpdGVtcyB0aHJvdWdoIHRoZSBjaGF0IEFQSS5cbiAqXG4gKiBUaGlzIG1ha2VzIGRhdGFzZXQgcnVuIHByb2Nlc3NpbmcgZmlyZS1hbmQtZm9yZ2V0IC0gZWFjaCBpdGVtIGlzIHF1ZXVlZFxuICogaW5kZXBlbmRlbnRseSBhbmQgcHJvY2Vzc2VkIGluIHBhcmFsbGVsIGJ5IHRoZSB3b3JrZmxvdyBzeXN0ZW0uXG4gKi8gLyoqX19pbnRlcm5hbF93b3JrZmxvd3N7XCJ3b3JrZmxvd3NcIjp7XCJzcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvcnVuRGF0YXNldEl0ZW0udHNcIjp7XCJfcnVuRGF0YXNldEl0ZW1Xb3JrZmxvd1wiOntcIndvcmtmbG93SWRcIjpcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3dcIn19fSxcInN0ZXBzXCI6e1wic3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLnRzXCI6e1wiY2FsbENoYXRBcGlTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vY2FsbENoYXRBcGlTdGVwXCJ9LFwiY3JlYXRlUmVsYXRpb25TdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vY3JlYXRlUmVsYXRpb25TdGVwXCJ9LFwiZXhlY3V0ZUV2YWx1YXRvclN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9leGVjdXRlRXZhbHVhdG9yU3RlcFwifSxcImxvZ1N0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9sb2dTdGVwXCJ9fX19Ki87XG4vKipcbiAqIFN0ZXA6IENhbGwgdGhlIGNoYXQgQVBJIHRvIHByb2Nlc3MgdGhlIGRhdGFzZXQgaXRlbVxuICovIHZhciBjYWxsQ2hhdEFwaVN0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vY2FsbENoYXRBcGlTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBDcmVhdGUgY29udmVyc2F0aW9uIHJlbGF0aW9uIGluIGRhdGFiYXNlXG4gKi8gdmFyIGNyZWF0ZVJlbGF0aW9uU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9jcmVhdGVSZWxhdGlvblN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IEV4ZWN1dGUgYSBzaW5nbGUgZXZhbHVhdG9yIG9uIGEgY29udmVyc2F0aW9uXG4gKi8gdmFyIGV4ZWN1dGVFdmFsdWF0b3JTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvcnVuRGF0YXNldEl0ZW0vL2V4ZWN1dGVFdmFsdWF0b3JTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBMb2cgd29ya2Zsb3cgcHJvZ3Jlc3NcbiAqLyB2YXIgbG9nU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9sb2dTdGVwXCIpO1xuLyoqXG4gKiBNYWluIHdvcmtmbG93IGZ1bmN0aW9uIC0gcHJvY2Vzc2VzIGEgc2luZ2xlIGRhdGFzZXQgaXRlbSB0aHJvdWdoIHRoZSBjaGF0IEFQSS5cbiAqIE9wdGlvbmFsbHkgcnVucyBldmFsdWF0b3JzIG9uIHRoZSByZXN1bHRpbmcgY29udmVyc2F0aW9uLlxuICovIGFzeW5jIGZ1bmN0aW9uIF9ydW5EYXRhc2V0SXRlbVdvcmtmbG93KHBheWxvYWQpIHtcbiAgICBjb25zdCB7IGRhdGFzZXRJdGVtSWQsIGRhdGFzZXRSdW5JZCwgYWdlbnRJZCwgZXZhbHVhdG9ySWRzLCBldmFsdWF0aW9uUnVuSWQgfSA9IHBheWxvYWQ7XG4gICAgYXdhaXQgbG9nU3RlcCgnU3RhcnRpbmcgZGF0YXNldCBpdGVtIHByb2Nlc3NpbmcnLCB7XG4gICAgICAgIGRhdGFzZXRJdGVtSWQsXG4gICAgICAgIGRhdGFzZXRSdW5JZCxcbiAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgaGFzRXZhbHVhdG9yczogISEoZXZhbHVhdG9ySWRzICYmIGV2YWx1YXRvcklkcy5sZW5ndGggPiAwKVxuICAgIH0pO1xuICAgIC8vIENhbGwgY2hhdCBBUElcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjYWxsQ2hhdEFwaVN0ZXAocGF5bG9hZCk7XG4gICAgLy8gQ3JlYXRlIHJlbGF0aW9uIGlmIHdlIGdvdCBhIGNvbnZlcnNhdGlvblxuICAgIGlmIChyZXN1bHQuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgYXdhaXQgY3JlYXRlUmVsYXRpb25TdGVwKHBheWxvYWQsIHJlc3VsdC5jb252ZXJzYXRpb25JZCk7XG4gICAgICAgIC8vIFJ1biBldmFsdWF0aW9ucyBpZiBjb25maWd1cmVkXG4gICAgICAgIGlmIChldmFsdWF0b3JJZHMgJiYgZXZhbHVhdG9ySWRzLmxlbmd0aCA+IDAgJiYgZXZhbHVhdGlvblJ1bklkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV2YWx1YXRvcklkIG9mIGV2YWx1YXRvcklkcyl7XG4gICAgICAgICAgICAgICAgYXdhaXQgZXhlY3V0ZUV2YWx1YXRvclN0ZXAocGF5bG9hZC50ZW5hbnRJZCwgcGF5bG9hZC5wcm9qZWN0SWQsIHJlc3VsdC5jb252ZXJzYXRpb25JZCwgZXZhbHVhdG9ySWQsIGV2YWx1YXRpb25SdW5JZCwgcGF5bG9hZC5kYXRhc2V0SXRlbUV4cGVjdGVkT3V0cHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ05vIGNvbnZlcnNhdGlvbiBjcmVhdGVkJywge1xuICAgICAgICAgICAgZGF0YXNldEl0ZW1JZCxcbiAgICAgICAgICAgIGRhdGFzZXRSdW5JZCxcbiAgICAgICAgICAgIGVycm9yOiByZXN1bHQuZXJyb3JcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6ICFyZXN1bHQuZXJyb3IsXG4gICAgICAgIGRhdGFzZXRJdGVtSWQsXG4gICAgICAgIGRhdGFzZXRSdW5JZCxcbiAgICAgICAgY29udmVyc2F0aW9uSWQ6IHJlc3VsdC5jb252ZXJzYXRpb25JZCB8fCBudWxsLFxuICAgICAgICBlcnJvcjogcmVzdWx0LmVycm9yIHx8IG51bGxcbiAgICB9O1xufVxuX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3cud29ya2Zsb3dJZCA9IFwid29ya2Zsb3cvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9fcnVuRGF0YXNldEl0ZW1Xb3JrZmxvd1wiO1xuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzLnNldChcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3dcIiwgX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3cpO1xuLy8gVGhpcyBJRCBtdXN0IG1hdGNoIHdoYXQgd29ya2Zsb3c6YnVpbGQgZ2VuZXJhdGVzIGluIC53ZWxsLWtub3duL3dvcmtmbG93L3YxL2Zsb3cuY2pzXG5leHBvcnQgY29uc3QgcnVuRGF0YXNldEl0ZW1Xb3JrZmxvdyA9IE9iamVjdC5hc3NpZ24oX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3csIHtcbiAgICB3b3JrZmxvd0lkOiAnd29ya2Zsb3cvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9fcnVuRGF0YXNldEl0ZW1Xb3JrZmxvdydcbn0pO1xuIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIi8qKlxuICogU3RlcCBmdW5jdGlvbnMgZm9yIHNjaGVkdWxlZCB0cmlnZ2VyIHdvcmtmbG93LlxuICpcbiAqIFRoZXNlIHN0ZXAgZnVuY3Rpb25zIGhhdmUgZnVsbCBOb2RlLmpzIGFjY2VzcyBhbmQgaGFuZGxlIGFsbCBkYXRhYmFzZVxuICogb3BlcmF0aW9ucyBhbmQgZXh0ZXJuYWwgc2VydmljZSBjYWxscy5cbiAqLyAvKipfX2ludGVybmFsX3dvcmtmbG93c3tcInN0ZXBzXCI6e1wic3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy50c1wiOntcImFkZENvbnZlcnNhdGlvbklkU3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9hZGRDb252ZXJzYXRpb25JZFN0ZXBcIn0sXCJjYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9jYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcFwifSxcImNoZWNrSW52b2NhdGlvbkNhbmNlbGxlZFN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcFwifSxcImNoZWNrVHJpZ2dlckVuYWJsZWRTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2NoZWNrVHJpZ2dlckVuYWJsZWRTdGVwXCJ9LFwiY29tcHV0ZVNsZWVwRHVyYXRpb25TdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2NvbXB1dGVTbGVlcER1cmF0aW9uU3RlcFwifSxcImNyZWF0ZUludm9jYXRpb25JZGVtcG90ZW50U3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9jcmVhdGVJbnZvY2F0aW9uSWRlbXBvdGVudFN0ZXBcIn0sXCJkZWxldGVQZW5kaW5nSW52b2NhdGlvbnNTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2RlbGV0ZVBlbmRpbmdJbnZvY2F0aW9uc1N0ZXBcIn0sXCJleGVjdXRlU2NoZWR1bGVkVHJpZ2dlclN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vZXhlY3V0ZVNjaGVkdWxlZFRyaWdnZXJTdGVwXCJ9LFwiZ2V0TmV4dFBlbmRpbmdJbnZvY2F0aW9uU3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9nZXROZXh0UGVuZGluZ0ludm9jYXRpb25TdGVwXCJ9LFwiaW5jcmVtZW50QXR0ZW1wdFN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vaW5jcmVtZW50QXR0ZW1wdFN0ZXBcIn0sXCJsb2dTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2xvZ1N0ZXBcIn0sXCJtYXJrQ29tcGxldGVkU3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9tYXJrQ29tcGxldGVkU3RlcFwifSxcIm1hcmtGYWlsZWRTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL21hcmtGYWlsZWRTdGVwXCJ9LFwibWFya1J1bm5pbmdTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL21hcmtSdW5uaW5nU3RlcFwifX19fSovO1xuLyoqXG4gKiBTdGVwOiBMb2cgYSBtZXNzYWdlIChhbGxvd3MgbG9nZ2luZyBmcm9tIHdvcmtmbG93IGNvbnRleHQpXG4gKi8gZXhwb3J0IHZhciBsb2dTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9sb2dTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBDYWxjdWxhdGUgdGhlIG5leHQgZXhlY3V0aW9uIHRpbWUgcmVsYXRpdmUgdG8gYSBiYXNlIHRpbWUuXG4gKi8gZXhwb3J0IHZhciBjYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vY2FsY3VsYXRlTmV4dEV4ZWN1dGlvblN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IENvbXB1dGUgc2xlZXAgZHVyYXRpb25cbiAqIFJldHVybnMgbWlsbGlzZWNvbmRzIHRvIHNsZWVwLlxuICovIGV4cG9ydCB2YXIgY29tcHV0ZVNsZWVwRHVyYXRpb25TdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9jb21wdXRlU2xlZXBEdXJhdGlvblN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IEdldCB0aGUgbmV4dCBwZW5kaW5nIGludm9jYXRpb24gdG8gZXhlY3V0ZSAoZWFybGllc3Qgc2NoZWR1bGVkRm9yKS5cbiAqIFJldHVybnMgbnVsbCBpZiBubyBwZW5kaW5nIGludm9jYXRpb25zIGV4aXN0LlxuICovIGV4cG9ydCB2YXIgZ2V0TmV4dFBlbmRpbmdJbnZvY2F0aW9uU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vZ2V0TmV4dFBlbmRpbmdJbnZvY2F0aW9uU3RlcFwiKTtcbi8qKlxuICogU3RlcDogRGVsZXRlIGFsbCBwZW5kaW5nIGludm9jYXRpb25zIGZvciBhIHRyaWdnZXIuXG4gKiBVc2VkIHdoZW4gY3JvbiBleHByZXNzaW9uIGNoYW5nZXMgb3IgdHJpZ2dlciBpcyBkaXNhYmxlZC5cbiAqLyBleHBvcnQgdmFyIGRlbGV0ZVBlbmRpbmdJbnZvY2F0aW9uc1N0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2RlbGV0ZVBlbmRpbmdJbnZvY2F0aW9uc1N0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IENoZWNrIGlmIHRyaWdnZXIgaXMgc3RpbGwgZW5hYmxlZCBhbmQgdGhpcyBydW5uZXIgaXMgYXV0aG9yaXRhdGl2ZS5cbiAqLyBleHBvcnQgdmFyIGNoZWNrVHJpZ2dlckVuYWJsZWRTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9jaGVja1RyaWdnZXJFbmFibGVkU3RlcFwiKTtcbi8qKlxuICogU3RlcDogVHJ5IHRvIGNyZWF0ZSBpbnZvY2F0aW9uIGlkZW1wb3RlbnRseS5cbiAqIFJldHVybnMgZXhpc3RpbmcgaW52b2NhdGlvbiBpZiBhbHJlYWR5IGNyZWF0ZWQuXG4gKi8gZXhwb3J0IHZhciBjcmVhdGVJbnZvY2F0aW9uSWRlbXBvdGVudFN0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2NyZWF0ZUludm9jYXRpb25JZGVtcG90ZW50U3RlcFwiKTtcbi8qKlxuICogU3RlcDogQ2hlY2sgaWYgaW52b2NhdGlvbiB3YXMgY2FuY2VsbGVkIGJlZm9yZSBleGVjdXRpb25cbiAqIFJldHVybnMgdHJ1ZSBpZiBjYW5jZWxsZWQgKHNob3VsZCBza2lwIGV4ZWN1dGlvbiksIGZhbHNlIG90aGVyd2lzZVxuICovIGV4cG9ydCB2YXIgY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcFwiKTtcbi8qKlxuICogU3RlcDogTWFyayBpbnZvY2F0aW9uIGFzIHJ1bm5pbmdcbiAqLyBleHBvcnQgdmFyIG1hcmtSdW5uaW5nU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vbWFya1J1bm5pbmdTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBBZGQgYSBjb252ZXJzYXRpb24gSUQgdG8gdGhlIGludm9jYXRpb24ncyBjb252ZXJzYXRpb25JZHMgYXJyYXlcbiAqIENhbGxlZCBhZnRlciBlYWNoIGF0dGVtcHQgdG8gdHJhY2sgYWxsIGNvbnZlcnNhdGlvbnMgY3JlYXRlZCBkdXJpbmcgcmV0cmllc1xuICovIGV4cG9ydCB2YXIgYWRkQ29udmVyc2F0aW9uSWRTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9hZGRDb252ZXJzYXRpb25JZFN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IE1hcmsgaW52b2NhdGlvbiBhcyBjb21wbGV0ZWRcbiAqLyBleHBvcnQgdmFyIG1hcmtDb21wbGV0ZWRTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9tYXJrQ29tcGxldGVkU3RlcFwiKTtcbi8qKlxuICogU3RlcDogTWFyayBpbnZvY2F0aW9uIGFzIGZhaWxlZFxuICovIGV4cG9ydCB2YXIgbWFya0ZhaWxlZFN0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL21hcmtGYWlsZWRTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBJbmNyZW1lbnQgYXR0ZW1wdCBudW1iZXIgZm9yIHJldHJ5XG4gKi8gZXhwb3J0IHZhciBpbmNyZW1lbnRBdHRlbXB0U3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vaW5jcmVtZW50QXR0ZW1wdFN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IEV4ZWN1dGUgdGhlIHNjaGVkdWxlZCB0cmlnZ2VyIHVzaW5nIGV4ZWN1dGVBZ2VudEFzeW5jLlxuICpcbiAqIFVzZXMgdGhlIHNoYXJlZCBleGVjdXRlQWdlbnRBc3luYyBmcm9tIFRyaWdnZXJTZXJ2aWNlIHdoaWNoIGluY2x1ZGVzXG4gKiBwcm9wZXIgdHJhY2luZywgZXJyb3IgaGFuZGxpbmcsIGFuZCBjb252ZXJzYXRpb24gbWFuYWdlbWVudC5cbiAqLyBleHBvcnQgdmFyIGV4ZWN1dGVTY2hlZHVsZWRUcmlnZ2VyU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vZXhlY3V0ZVNjaGVkdWxlZFRyaWdnZXJTdGVwXCIpO1xuIiwgIi8qKlxuICogV29ya2Zsb3cgZm9yIHJ1bm5pbmcgc2NoZWR1bGVkIHRyaWdnZXJzLlxuICpcbiAqIFRoaXMgd29ya2Zsb3c6XG4gKiAxLiBHZXRzIG9yIGNyZWF0ZXMgdGhlIG5leHQgcGVuZGluZyBpbnZvY2F0aW9uXG4gKiAyLiBTbGVlcHMgdW50aWwgaXRzIHNjaGVkdWxlZCB0aW1lXG4gKiAzLiBDaGVja3MgaWYgdGhlIHRyaWdnZXIgaXMgc3RpbGwgZW5hYmxlZFxuICogNC4gRXhlY3V0ZXMgdGhlIGFnZW50IHdpdGggcmV0cmllc1xuICogNS4gRm9yIGNyb24gdHJpZ2dlcnMsIGxvb3BzIGJhY2sgdG8gc3RlcCAxXG4gKlxuICovIGltcG9ydCB7IGdldFdvcmtmbG93TWV0YWRhdGEsIHNsZWVwIH0gZnJvbSAnd29ya2Zsb3cnO1xuaW1wb3J0IHsgYWRkQ29udmVyc2F0aW9uSWRTdGVwLCBjYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcCwgY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcCwgY2hlY2tUcmlnZ2VyRW5hYmxlZFN0ZXAsIGNvbXB1dGVTbGVlcER1cmF0aW9uU3RlcCwgY3JlYXRlSW52b2NhdGlvbklkZW1wb3RlbnRTdGVwLCBleGVjdXRlU2NoZWR1bGVkVHJpZ2dlclN0ZXAsIGdldE5leHRQZW5kaW5nSW52b2NhdGlvblN0ZXAsIGluY3JlbWVudEF0dGVtcHRTdGVwLCBsb2dTdGVwLCBtYXJrQ29tcGxldGVkU3RlcCwgbWFya0ZhaWxlZFN0ZXAsIG1hcmtSdW5uaW5nU3RlcCB9IGZyb20gJy4uL3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcyc7XG4vKipfX2ludGVybmFsX3dvcmtmbG93c3tcIndvcmtmbG93c1wiOntcInNyYy9kb21haW5zL3J1bi93b3JrZmxvdy9mdW5jdGlvbnMvc2NoZWR1bGVkVHJpZ2dlclJ1bm5lci50c1wiOntcIl9zY2hlZHVsZWRUcmlnZ2VyUnVubmVyV29ya2Zsb3dcIjp7XCJ3b3JrZmxvd0lkXCI6XCJ3b3JrZmxvdy8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvZnVuY3Rpb25zL3NjaGVkdWxlZFRyaWdnZXJSdW5uZXIvL19zY2hlZHVsZWRUcmlnZ2VyUnVubmVyV29ya2Zsb3dcIn19fX0qLztcbi8qKlxuICogR2VuZXJhdGUgaWRlbXBvdGVuY3kga2V5IGZvciBhIHNjaGVkdWxlZCBleGVjdXRpb24uXG4gKi8gZnVuY3Rpb24gZ2VuZXJhdGVJZGVtcG90ZW5jeUtleShzY2hlZHVsZWRUcmlnZ2VySWQsIHNjaGVkdWxlZEZvcikge1xuICAgIHJldHVybiBgc2NoZWRfJHtzY2hlZHVsZWRUcmlnZ2VySWR9XyR7c2NoZWR1bGVkRm9yfWA7XG59XG4vKipcbiAqIE1haW4gd29ya2Zsb3cgZnVuY3Rpb24gLSBydW5zIGEgc2NoZWR1bGVkIHRyaWdnZXIuXG4gKiBGb3IgY3JvbiB0cmlnZ2VycywgdGhpcyBsb29wcyBpbmRlZmluaXRlbHkgdW50aWwgZGlzYWJsZWQvZGVsZXRlZC5cbiAqIEZvciBvbmUtdGltZSB0cmlnZ2VycywgaXQgZXhlY3V0ZXMgb25jZSBhbmQgY29tcGxldGVzLlxuICpcbiAqLyBhc3luYyBmdW5jdGlvbiBfc2NoZWR1bGVkVHJpZ2dlclJ1bm5lcldvcmtmbG93KHBheWxvYWQpIHtcbiAgICBjb25zdCB7IHRlbmFudElkLCBwcm9qZWN0SWQsIGFnZW50SWQsIHNjaGVkdWxlZFRyaWdnZXJJZCB9ID0gcGF5bG9hZDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldFdvcmtmbG93TWV0YWRhdGEoKTtcbiAgICBjb25zdCBydW5uZXJJZCA9IG1ldGFkYXRhLndvcmtmbG93UnVuSWQ7XG4gICAgYXdhaXQgbG9nU3RlcCgnU3RhcnRpbmcgc2NoZWR1bGVkIHRyaWdnZXIgcnVubmVyIHdvcmtmbG93Jywge1xuICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgcHJvamVjdElkLFxuICAgICAgICBhZ2VudElkLFxuICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgIHJ1bm5lcklkXG4gICAgfSk7XG4gICAgLy8gVHJhY2sgdGhlIGxhc3Qgc2NoZWR1bGVkIHRpbWUgZm9yIGNyb24gY2FsY3VsYXRpb25zXG4gICAgbGV0IGxhc3RTY2hlZHVsZWRGb3IgPSBudWxsO1xuICAgIC8vIE1haW4gZXhlY3V0aW9uIGxvb3BcbiAgICB3aGlsZSh0cnVlKXtcbiAgICAgICAgY29uc3QgZW5hYmxlZENoZWNrID0gYXdhaXQgY2hlY2tUcmlnZ2VyRW5hYmxlZFN0ZXAoe1xuICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgcnVubmVySWRcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZW5hYmxlZENoZWNrLnNob3VsZENvbnRpbnVlIHx8ICFlbmFibGVkQ2hlY2sudHJpZ2dlcikge1xuICAgICAgICAgICAgYXdhaXQgbG9nU3RlcCgnU2NoZWR1bGVkIHRyaWdnZXIgd29ya2Zsb3cgc3RvcHBpbmcnLCB7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogZW5hYmxlZENoZWNrLnJlYXNvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogJ3N0b3BwZWQnLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogZW5hYmxlZENoZWNrLnJlYXNvblxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyID0gZW5hYmxlZENoZWNrLnRyaWdnZXI7XG4gICAgICAgIGNvbnN0IGlzT25lVGltZSA9ICEhdHJpZ2dlci5ydW5BdDtcbiAgICAgICAgbGV0IGludm9jYXRpb24gPSBhd2FpdCBnZXROZXh0UGVuZGluZ0ludm9jYXRpb25TdGVwKHtcbiAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQ3JlYXRlIGludm9jYXRpb24gaWYgbm9uZSBleGlzdHNcbiAgICAgICAgaWYgKCFpbnZvY2F0aW9uKSB7XG4gICAgICAgICAgICBsZXQgc2NoZWR1bGVkRm9yO1xuICAgICAgICAgICAgaWYgKGlzT25lVGltZSkge1xuICAgICAgICAgICAgICAgIGlmICghdHJpZ2dlci5ydW5BdCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBsb2dTdGVwKCdPbmUtdGltZSB0cmlnZ2VyIG1pc3NpbmcgcnVuQXQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb246ICdvbmUtdGltZSB0cmlnZ2VyIG1pc3NpbmcgcnVuQXQnXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNjaGVkdWxlZEZvciA9IHRyaWdnZXIucnVuQXQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXIuY3JvbkV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IG5leHRFeGVjdXRpb25UaW1lIH0gPSBhd2FpdCBjYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcCh7XG4gICAgICAgICAgICAgICAgICAgIGNyb25FeHByZXNzaW9uOiB0cmlnZ2VyLmNyb25FeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICBjcm9uVGltZXpvbmU6IHRyaWdnZXIuY3JvblRpbWV6b25lLFxuICAgICAgICAgICAgICAgICAgICBsYXN0U2NoZWR1bGVkRm9yXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRm9yID0gbmV4dEV4ZWN1dGlvblRpbWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ1RyaWdnZXIgbWlzc2luZyBib3RoIGNyb25FeHByZXNzaW9uIGFuZCBydW5BdCcsIHtcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICByZWFzb246ICd0cmlnZ2VyIG1pc3NpbmcgY3JvbkV4cHJlc3Npb24gYW5kIHJ1bkF0J1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpZGVtcG90ZW5jeUtleSA9IGdlbmVyYXRlSWRlbXBvdGVuY3lLZXkoc2NoZWR1bGVkVHJpZ2dlcklkLCBzY2hlZHVsZWRGb3IpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlSW52b2NhdGlvbklkZW1wb3RlbnRTdGVwKHtcbiAgICAgICAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRm9yLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IHRyaWdnZXIucGF5bG9hZCA/PyBudWxsLFxuICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGludm9jYXRpb24gPSByZXN1bHQuaW52b2NhdGlvbjtcbiAgICAgICAgICAgIC8vIEZvciBvbmUtdGltZSB0cmlnZ2VycywgY2hlY2sgaWYgYWxyZWFkeSBwcm9jZXNzZWRcbiAgICAgICAgICAgIGlmIChpc09uZVRpbWUgJiYgcmVzdWx0LmFscmVhZHlFeGlzdHMgJiYgaW52b2NhdGlvbi5zdGF0dXMgIT09ICdwZW5kaW5nJykge1xuICAgICAgICAgICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ09uZS10aW1lIHRyaWdnZXIgYWxyZWFkeSBleGVjdXRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogaW52b2NhdGlvbi5zdGF0dXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdhbHJlYWR5X2V4ZWN1dGVkJyxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbklkOiBpbnZvY2F0aW9uLmlkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBsb2dTdGVwKCdHb3QgbmV4dCBwZW5kaW5nIGludm9jYXRpb24nLCB7XG4gICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWQsXG4gICAgICAgICAgICBzY2hlZHVsZWRGb3I6IGludm9jYXRpb24uc2NoZWR1bGVkRm9yXG4gICAgICAgIH0pO1xuICAgICAgICAvLyA0LiBTbGVlcCB1bnRpbCB0aGUgaW52b2NhdGlvbidzIHNjaGVkdWxlZCB0aW1lXG4gICAgICAgIGNvbnN0IHNsZWVwTXMgPSBhd2FpdCBjb21wdXRlU2xlZXBEdXJhdGlvblN0ZXAoaW52b2NhdGlvbi5zY2hlZHVsZWRGb3IpO1xuICAgICAgICBhd2FpdCBsb2dTdGVwKCdTbGVlcGluZyB1bnRpbCBzY2hlZHVsZWQgdGltZScsIHtcbiAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZCxcbiAgICAgICAgICAgIHNjaGVkdWxlZEZvcjogaW52b2NhdGlvbi5zY2hlZHVsZWRGb3IsXG4gICAgICAgICAgICBzbGVlcE1zXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1zKTtcbiAgICAgICAgLy8gNS4gUmUtY2hlY2sgaWYgdHJpZ2dlciBpcyBzdGlsbCBlbmFibGVkIGFmdGVyIHNsZWVwXG4gICAgICAgIGNvbnN0IHBvc3RTbGVlcENoZWNrID0gYXdhaXQgY2hlY2tUcmlnZ2VyRW5hYmxlZFN0ZXAoe1xuICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgcnVubmVySWRcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcG9zdFNsZWVwQ2hlY2suc2hvdWxkQ29udGludWUgfHwgIXBvc3RTbGVlcENoZWNrLnRyaWdnZXIpIHtcbiAgICAgICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ1RyaWdnZXIgZGlzYWJsZWQvZGVsZXRlZCBkdXJpbmcgc2xlZXAsIHN0b3BwaW5nJywge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICByZWFzb246IHBvc3RTbGVlcENoZWNrLnJlYXNvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogJ3N0b3BwZWQnLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogcG9zdFNsZWVwQ2hlY2sucmVhc29uXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlZnJlc2ggdHJpZ2dlciBjb25maWcgKG1heSBoYXZlIGNoYW5nZWQgZHVyaW5nIHNsZWVwKVxuICAgICAgICBjb25zdCBjdXJyZW50VHJpZ2dlciA9IHBvc3RTbGVlcENoZWNrLnRyaWdnZXI7XG4gICAgICAgIC8vIDYuIENoZWNrIGlmIGludm9jYXRpb24gd2FzIGNhbmNlbGxlZCBkdXJpbmcgc2xlZXBcbiAgICAgICAgY29uc3QgY2FuY2VsQ2hlY2sgPSBhd2FpdCBjaGVja0ludm9jYXRpb25DYW5jZWxsZWRTdGVwKHtcbiAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNhbmNlbENoZWNrLmNhbmNlbGxlZCkge1xuICAgICAgICAgICAgYXdhaXQgbG9nU3RlcCgnSW52b2NhdGlvbiB3YXMgY2FuY2VsbGVkLCBza2lwcGluZyB0byBuZXh0Jywge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4gRXhlY3V0ZSB3aXRoIHJldHJpZXNcbiAgICAgICAgbGV0IGF0dGVtcHROdW1iZXIgPSBpbnZvY2F0aW9uLmF0dGVtcHROdW1iZXI7XG4gICAgICAgIGxldCBsYXN0RXJyb3IgPSBudWxsO1xuICAgICAgICBjb25zdCBtYXhBdHRlbXB0cyA9IGN1cnJlbnRUcmlnZ2VyLm1heFJldHJpZXMgKyAxO1xuICAgICAgICB3aGlsZShhdHRlbXB0TnVtYmVyIDw9IG1heEF0dGVtcHRzKXtcbiAgICAgICAgICAgIGNvbnN0IHJldHJ5Q2FuY2VsID0gYXdhaXQgY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcCh7XG4gICAgICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmV0cnlDYW5jZWwuY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbG9nU3RlcCgnSW52b2NhdGlvbiBjYW5jZWxsZWQgZHVyaW5nIHJldHJ5IGxvb3AnLCB7XG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbklkOiBpbnZvY2F0aW9uLmlkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNYXJrIGFzIHJ1bm5pbmdcbiAgICAgICAgICAgIGF3YWl0IG1hcmtSdW5uaW5nU3RlcCh7XG4gICAgICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlU2NoZWR1bGVkVHJpZ2dlclN0ZXAoe1xuICAgICAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgICAgIHByb2plY3RJZCxcbiAgICAgICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiBjdXJyZW50VHJpZ2dlci5tZXNzYWdlVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDogY3VycmVudFRyaWdnZXIucGF5bG9hZCA/PyBudWxsLFxuICAgICAgICAgICAgICAgIHRpbWVvdXRTZWNvbmRzOiBjdXJyZW50VHJpZ2dlci50aW1lb3V0U2Vjb25kc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBTYXZlIGNvbnZlcnNhdGlvbiBJRCBpbW1lZGlhdGVseSBhZnRlciBlYWNoIGF0dGVtcHRcbiAgICAgICAgICAgIGlmIChyZXN1bHQuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBhZGRDb252ZXJzYXRpb25JZFN0ZXAoe1xuICAgICAgICAgICAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQ6IHJlc3VsdC5jb252ZXJzYXRpb25JZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbWFya0NvbXBsZXRlZFN0ZXAoe1xuICAgICAgICAgICAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ1NjaGVkdWxlZCB0cmlnZ2VyIGV4ZWN1dGlvbiBjb21wbGV0ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbklkOiBpbnZvY2F0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZDogcmVzdWx0LmNvbnZlcnNhdGlvbklkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGFzdEVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RFcnJvciA9IHJlc3VsdC5lcnJvciB8fCAnVW5rbm93biBlcnJvcic7XG4gICAgICAgICAgICBhd2FpdCBsb2dTdGVwKCdTY2hlZHVsZWQgdHJpZ2dlciBleGVjdXRpb24gZmFpbGVkJywge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWQsXG4gICAgICAgICAgICAgICAgYXR0ZW1wdE51bWJlcixcbiAgICAgICAgICAgICAgICBlcnJvcjogbGFzdEVycm9yXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChhdHRlbXB0TnVtYmVyIDwgbWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBpbmNyZW1lbnRBdHRlbXB0U3RlcCh7XG4gICAgICAgICAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbklkOiBpbnZvY2F0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXR0ZW1wdDogYXR0ZW1wdE51bWJlclxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF0dGVtcHROdW1iZXIrKztcbiAgICAgICAgICAgICAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLnJhbmRvbSgpICogMC4zO1xuICAgICAgICAgICAgICAgIGF3YWl0IHNsZWVwKGN1cnJlbnRUcmlnZ2VyLnJldHJ5RGVsYXlTZWNvbmRzICogMTAwMCAqICgxICsgaml0dGVyKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE1hcmsgYXMgZmFpbGVkIGlmIGFsbCByZXRyaWVzIGV4aGF1c3RlZFxuICAgICAgICBpZiAobGFzdEVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCBtYXJrRmFpbGVkU3RlcCh7XG4gICAgICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJhY2sgdGhpcyBpbnZvY2F0aW9uJ3Mgc2NoZWR1bGVkIHRpbWUgZm9yIG5leHQgY3JvbiBjYWxjdWxhdGlvblxuICAgICAgICBsYXN0U2NoZWR1bGVkRm9yID0gaW52b2NhdGlvbi5zY2hlZHVsZWRGb3I7XG4gICAgICAgIC8vIEZvciBvbmUtdGltZSB0cmlnZ2Vycywgd2UncmUgZG9uZVxuICAgICAgICBpZiAoaXNPbmVUaW1lKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogbGFzdEVycm9yID8gJ2ZhaWxlZCcgOiAnY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAvLyBGb3IgY3JvbiB0cmlnZ2VycywgbG9vcCBjb250aW51ZXMgdG8gY3JlYXRlL2dldCBuZXh0IGludm9jYXRpb25cbiAgICB9XG59XG5fc2NoZWR1bGVkVHJpZ2dlclJ1bm5lcldvcmtmbG93LndvcmtmbG93SWQgPSBcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9mdW5jdGlvbnMvc2NoZWR1bGVkVHJpZ2dlclJ1bm5lci8vX3NjaGVkdWxlZFRyaWdnZXJSdW5uZXJXb3JrZmxvd1wiO1xuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzLnNldChcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9mdW5jdGlvbnMvc2NoZWR1bGVkVHJpZ2dlclJ1bm5lci8vX3NjaGVkdWxlZFRyaWdnZXJSdW5uZXJXb3JrZmxvd1wiLCBfc2NoZWR1bGVkVHJpZ2dlclJ1bm5lcldvcmtmbG93KTtcbi8vIEV4cG9ydCB3aXRoIHdvcmtmbG93SWQgZm9yIHRoZSBidWlsZCBzeXN0ZW1cbmV4cG9ydCBjb25zdCBzY2hlZHVsZWRUcmlnZ2VyUnVubmVyV29ya2Zsb3cgPSBPYmplY3QuYXNzaWduKF9zY2hlZHVsZWRUcmlnZ2VyUnVubmVyV29ya2Zsb3csIHtcbiAgICB3b3JrZmxvd0lkOiAnd29ya2Zsb3cvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L2Z1bmN0aW9ucy9zY2hlZHVsZWRUcmlnZ2VyUnVubmVyLy9fc2NoZWR1bGVkVHJpZ2dlclJ1bm5lcldvcmtmbG93J1xufSk7XG4iLCAiLyoqX19pbnRlcm5hbF93b3JrZmxvd3N7XCJ3b3JrZmxvd3NcIjp7XCJzcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvZXZhbHVhdGVDb252ZXJzYXRpb24udHNcIjp7XCJfZXZhbHVhdGVDb252ZXJzYXRpb25Xb3JrZmxvd1wiOntcIndvcmtmbG93SWRcIjpcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ldmFsdWF0ZUNvbnZlcnNhdGlvbi8vX2V2YWx1YXRlQ29udmVyc2F0aW9uV29ya2Zsb3dcIn19fSxcInN0ZXBzXCI6e1wic3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLnRzXCI6e1wiZXhlY3V0ZUV2YWx1YXRvclN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9leGVjdXRlRXZhbHVhdG9yU3RlcFwifSxcImdldENvbnZlcnNhdGlvblN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9nZXRDb252ZXJzYXRpb25TdGVwXCJ9LFwiZ2V0RXZhbHVhdG9yc1N0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9nZXRFdmFsdWF0b3JzU3RlcFwifSxcImxvZ1N0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9sb2dTdGVwXCJ9fX19Ki87XG52YXIgZ2V0Q29udmVyc2F0aW9uU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9nZXRDb252ZXJzYXRpb25TdGVwXCIpO1xudmFyIGdldEV2YWx1YXRvcnNTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvZXZhbHVhdGVDb252ZXJzYXRpb24vL2dldEV2YWx1YXRvcnNTdGVwXCIpO1xudmFyIGV4ZWN1dGVFdmFsdWF0b3JTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvZXZhbHVhdGVDb252ZXJzYXRpb24vL2V4ZWN1dGVFdmFsdWF0b3JTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBMb2cgd29ya2Zsb3cgcHJvZ3Jlc3NcbiAqLyB2YXIgbG9nU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9sb2dTdGVwXCIpO1xuLyoqXG4gKiBNYWluIHdvcmtmbG93IGZ1bmN0aW9uIC0gb3JjaGVzdHJhdGVzIHRoZSBldmFsdWF0aW9uIHN0ZXBzLlxuICpcbiAqIElNUE9SVEFOVDogVGhpcyBydW5zIGluIGEgZGV0ZXJtaW5pc3RpYyBzYW5kYm94LlxuICogLSBEbyBOT1QgY2FsbCBOb2RlLmpzIEFQSXMgZGlyZWN0bHkgaGVyZSAobm8gREIsIG5vIGZzLCBldGMuKVxuICogLSBBbGwgc2lkZSBlZmZlY3RzIG11c3QgaGFwcGVuIGluIHN0ZXAgZnVuY3Rpb25zXG4gKi8gYXN5bmMgZnVuY3Rpb24gX2V2YWx1YXRlQ29udmVyc2F0aW9uV29ya2Zsb3cocGF5bG9hZCkge1xuICAgIGNvbnN0IHsgY29udmVyc2F0aW9uSWQsIGV2YWx1YXRvcklkcyB9ID0gcGF5bG9hZDtcbiAgICBhd2FpdCBsb2dTdGVwKCdTdGFydGluZyBjb252ZXJzYXRpb24gZXZhbHVhdGlvbicsIHBheWxvYWQpO1xuICAgIGNvbnN0IGNvbnZlcnNhdGlvbiA9IGF3YWl0IGdldENvbnZlcnNhdGlvblN0ZXAocGF5bG9hZCk7XG4gICAgY29uc3QgZXZhbHVhdG9ycyA9IGF3YWl0IGdldEV2YWx1YXRvcnNTdGVwKHBheWxvYWQpO1xuICAgIGlmIChldmFsdWF0b3JzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBhd2FpdCBsb2dTdGVwKCdObyB2YWxpZCBldmFsdWF0b3JzIGZvdW5kJywge1xuICAgICAgICAgICAgY29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgICBldmFsdWF0b3JJZHNcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgIHJlYXNvbjogJ05vIHZhbGlkIGV2YWx1YXRvcnMnXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdHMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGV2YWx1YXRvciBvZiBldmFsdWF0b3JzKXtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0ZUV2YWx1YXRvclN0ZXAocGF5bG9hZCwgZXZhbHVhdG9yLmlkLCBjb252ZXJzYXRpb24pO1xuICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgY29udmVyc2F0aW9uSWQsXG4gICAgICAgIHJlc3VsdENvdW50OiByZXN1bHRzLmxlbmd0aFxuICAgIH07XG59XG5fZXZhbHVhdGVDb252ZXJzYXRpb25Xb3JrZmxvdy53b3JrZmxvd0lkID0gXCJ3b3JrZmxvdy8vLi9zcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvZXZhbHVhdGVDb252ZXJzYXRpb24vL19ldmFsdWF0ZUNvbnZlcnNhdGlvbldvcmtmbG93XCI7XG5nbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3Muc2V0KFwid29ya2Zsb3cvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9fZXZhbHVhdGVDb252ZXJzYXRpb25Xb3JrZmxvd1wiLCBfZXZhbHVhdGVDb252ZXJzYXRpb25Xb3JrZmxvdyk7XG4vLyBUaGlzIElEIG11c3QgbWF0Y2ggd2hhdCB3b3JrZmxvdzpidWlsZCBnZW5lcmF0ZXMgaW4gLndlbGwta25vd24vd29ya2Zsb3cvdjEvZmxvdy5janNcbmV4cG9ydCBjb25zdCBldmFsdWF0ZUNvbnZlcnNhdGlvbldvcmtmbG93ID0gT2JqZWN0LmFzc2lnbihfZXZhbHVhdGVDb252ZXJzYXRpb25Xb3JrZmxvdywge1xuICAgIHdvcmtmbG93SWQ6ICd3b3JrZmxvdy8vLi9zcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvZXZhbHVhdGVDb252ZXJzYXRpb24vL19ldmFsdWF0ZUNvbnZlcnNhdGlvbldvcmtmbG93J1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBLHFFQUFBQSxTQUFBO0FBQUE7QUFFSSxRQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBYVIsSUFBQUEsUUFBTyxVQUFVLFNBQVMsS0FBSyxTQUFTO0FBQ3hDLGdCQUFVLFdBQVcsQ0FBQztBQUN0QixVQUFJLE9BQU8sT0FBTztBQUNsQixVQUFJLFNBQVMsWUFBWSxJQUFJLFNBQVMsR0FBRztBQUNyQyxlQUFPLE1BQU0sR0FBRztBQUFBLE1BQ3BCLFdBQVcsU0FBUyxZQUFZLFNBQVMsR0FBRyxHQUFHO0FBQzNDLGVBQU8sUUFBUSxPQUFPLFFBQVEsR0FBRyxJQUFJLFNBQVMsR0FBRztBQUFBLE1BQ3JEO0FBQ0EsWUFBTSxJQUFJLE1BQU0sMERBQTBELEtBQUssVUFBVSxHQUFHLENBQUM7QUFB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UUFBUSxZQUFZLFdBQVc7QUFBQSxRQUMvQixjQUFjLFdBQVc7QUFBQSxNQUM3QjtBQUFBLElBQ0o7QUFBQSxFQUVKO0FBQ0o7QUEzUG1CO0FBNFBuQixnQ0FBZ0MsYUFBYTtBQUM3QyxXQUFXLG9CQUFvQixJQUFJLDBHQUEwRywrQkFBK0I7QUFFckssSUFBTSxpQ0FBaUMsT0FBTyxPQUFPLGlDQUFpQztBQUFBLEVBQ3pGLFlBQVk7QUFDaEIsQ0FBQzs7O0FDdlJELElBQUksc0JBQXNCLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsd0ZBQXdGO0FBQzlKLElBQUksb0JBQW9CLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsc0ZBQXNGO0FBQzFKLElBQUlDLHdCQUF1QixXQUFXLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLHlGQUF5RjtBQUc1SixJQUFJQyxXQUFVLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsNEVBQTRFO0FBT3RJLGVBQWUsOEJBQThCLFNBQVM7QUFDdEQsUUFBTSxFQUFFLGdCQUFnQixhQUFhLElBQUk7QUFDekMsUUFBTUEsU0FBUSxvQ0FBb0MsT0FBTztBQUN6RCxRQUFNLGVBQWUsTUFBTSxvQkFBb0IsT0FBTztBQUN0RCxRQUFNLGFBQWEsTUFBTSxrQkFBa0IsT0FBTztBQUNsRCxNQUFJLFdBQVcsV0FBVyxHQUFHO0FBQ3pCLFVBQU1BLFNBQVEsNkJBQTZCO0FBQUEsTUFDdkM7QUFBQSxNQUNBO0FBQUEsSUFDSixDQUFDO0FBQ0QsV0FBTztBQUFBLE1BQ0gsU0FBUztBQUFBLE1BQ1QsUUFBUTtBQUFBLElBQ1o7QUFBQSxFQUNKO0FBQ0EsUUFBTSxVQUFVLENBQUM7QUFDakIsYUFBVyxhQUFhLFlBQVc7QUFDL0IsVUFBTSxTQUFTLE1BQU1ELHNCQUFxQixTQUFTLFVBQVUsSUFBSSxZQUFZO0FBQzdFLFlBQVEsS0FBSyxNQUFNO0FBQUEsRUFDdkI7QUFDQSxTQUFPO0FBQUEsSUFDSCxTQUFTO0FBQUEsSUFDVDtBQUFBLElBQ0EsYUFBYSxRQUFRO0FBQUEsRUFDekI7QUFDSjtBQXpCbUI7QUEwQm5CLDhCQUE4QixhQUFhO0FBQzNDLFdBQVcsb0JBQW9CLElBQUksd0dBQXdHLDZCQUE2QjtBQUVqSyxJQUFNLCtCQUErQixPQUFPLE9BQU8sK0JBQStCO0FBQUEsRUFDckYsWUFBWTtBQUNoQixDQUFDOyIsCiAgIm5hbWVzIjogWyJtb2R1bGUiLCAibXMiLCAibG9nU3RlcCIsICJsb2dTdGVwIiwgImV4ZWN1dGVFdmFsdWF0b3JTdGVwIiwgImxvZ1N0ZXAiXQp9Cg==
|
|
50543
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vbm9kZV9tb2R1bGVzLy5wbnBtL21zQDIuMS4zL25vZGVfbW9kdWxlcy9tcy9pbmRleC5qcyIsICJzcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvcnVuRGF0YXNldEl0ZW0udHMiLCAic3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ad29ya2Zsb3crdXRpbHNANC4xLjAtYmV0YS4xMS9ub2RlX21vZHVsZXMvQHdvcmtmbG93L3V0aWxzL3NyYy90aW1lLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ad29ya2Zsb3crY29yZUA0LjEuMC1iZXRhLjU0X0Bhd3Mtc2RrK2NsaWVudC1zdHNAMy45NzAuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjAvbm9kZV9tb2R1bGVzL0B3b3JrZmxvdy9jb3JlL3NyYy9zeW1ib2xzLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS9Ad29ya2Zsb3crY29yZUA0LjEuMC1iZXRhLjU0X0Bhd3Mtc2RrK2NsaWVudC1zdHNAMy45NzAuMF9Ab3BlbnRlbGVtZXRyeSthcGlAMS45LjAvbm9kZV9tb2R1bGVzL0B3b3JrZmxvdy9jb3JlL3NyYy9zbGVlcC50cyIsICIuLi9ub2RlX21vZHVsZXMvLnBucG0vQHdvcmtmbG93K2NvcmVANC4xLjAtYmV0YS41NF9AYXdzLXNkaytjbGllbnQtc3RzQDMuOTcwLjBfQG9wZW50ZWxlbWV0cnkrYXBpQDEuOS4wL25vZGVfbW9kdWxlcy9Ad29ya2Zsb3cvY29yZS9zcmMvd29ya2Zsb3cvZ2V0LXdvcmtmbG93LW1ldGFkYXRhLnRzIiwgIi4uL25vZGVfbW9kdWxlcy8ucG5wbS93b3JrZmxvd0A0LjEuMC1iZXRhLjU0X0Bhd3Mtc2RrK2NsaWVudC1zdHNAMy45NzAuMF9AbmVzdGpzK2NvbW1vbkAxMS4xLjEzX3JlZmxlY3QtbWV0YWRfZjg1MjgxZjI1ODBkNzA2NWZjNTE0ZTYzN2Y1ZjVlMWYvbm9kZV9tb2R1bGVzL3dvcmtmbG93L3NyYy9zdGRsaWIudHMiLCAic3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy50cyIsICJzcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvZnVuY3Rpb25zL3NjaGVkdWxlZFRyaWdnZXJSdW5uZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogSGVscGVycy5cbiAqLyB2YXIgcyA9IDEwMDA7XG52YXIgbSA9IHMgKiA2MDtcbnZhciBoID0gbSAqIDYwO1xudmFyIGQgPSBoICogMjQ7XG52YXIgdyA9IGQgKiA3O1xudmFyIHkgPSBkICogMzY1LjI1O1xuLyoqXG4gKiBQYXJzZSBvciBmb3JtYXQgdGhlIGdpdmVuIGB2YWxgLlxuICpcbiAqIE9wdGlvbnM6XG4gKlxuICogIC0gYGxvbmdgIHZlcmJvc2UgZm9ybWF0dGluZyBbZmFsc2VdXG4gKlxuICogQHBhcmFtIHtTdHJpbmd8TnVtYmVyfSB2YWxcbiAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc11cbiAqIEB0aHJvd3Mge0Vycm9yfSB0aHJvdyBhbiBlcnJvciBpZiB2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIG51bWJlclxuICogQHJldHVybiB7U3RyaW5nfE51bWJlcn1cbiAqIEBhcGkgcHVibGljXG4gKi8gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbih2YWwsIG9wdGlvbnMpIHtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7XG4gICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnICYmIHZhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBwYXJzZSh2YWwpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUodmFsKSkge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5sb25nID8gZm10TG9uZyh2YWwpIDogZm10U2hvcnQodmFsKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCd2YWwgaXMgbm90IGEgbm9uLWVtcHR5IHN0cmluZyBvciBhIHZhbGlkIG51bWJlci4gdmFsPScgKyBKU09OLnN0cmluZ2lmeSh2YWwpKTtcbn07XG4vKipcbiAqIFBhcnNlIHRoZSBnaXZlbiBgc3RyYCBhbmQgcmV0dXJuIG1pbGxpc2Vjb25kcy5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gc3RyXG4gKiBAcmV0dXJuIHtOdW1iZXJ9XG4gKiBAYXBpIHByaXZhdGVcbiAqLyBmdW5jdGlvbiBwYXJzZShzdHIpIHtcbiAgICBzdHIgPSBTdHJpbmcoc3RyKTtcbiAgICBpZiAoc3RyLmxlbmd0aCA+IDEwMCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciBtYXRjaCA9IC9eKC0/KD86XFxkKyk/XFwuP1xcZCspICoobWlsbGlzZWNvbmRzP3xtc2Vjcz98bXN8c2Vjb25kcz98c2Vjcz98c3xtaW51dGVzP3xtaW5zP3xtfGhvdXJzP3xocnM/fGh8ZGF5cz98ZHx3ZWVrcz98d3x5ZWFycz98eXJzP3x5KT8kL2kuZXhlYyhzdHIpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgbiA9IHBhcnNlRmxvYXQobWF0Y2hbMV0pO1xuICAgIHZhciB0eXBlID0gKG1hdGNoWzJdIHx8ICdtcycpLnRvTG93ZXJDYXNlKCk7XG4gICAgc3dpdGNoKHR5cGUpe1xuICAgICAgICBjYXNlICd5ZWFycyc6XG4gICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBjYXNlICd5cnMnOlxuICAgICAgICBjYXNlICd5cic6XG4gICAgICAgIGNhc2UgJ3knOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiB5O1xuICAgICAgICBjYXNlICd3ZWVrcyc6XG4gICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBjYXNlICd3JzpcbiAgICAgICAgICAgIHJldHVybiBuICogdztcbiAgICAgICAgY2FzZSAnZGF5cyc6XG4gICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBkO1xuICAgICAgICBjYXNlICdob3Vycyc6XG4gICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICBjYXNlICdocnMnOlxuICAgICAgICBjYXNlICdocic6XG4gICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBoO1xuICAgICAgICBjYXNlICdtaW51dGVzJzpcbiAgICAgICAgY2FzZSAnbWludXRlJzpcbiAgICAgICAgY2FzZSAnbWlucyc6XG4gICAgICAgIGNhc2UgJ21pbic6XG4gICAgICAgIGNhc2UgJ20nOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBtO1xuICAgICAgICBjYXNlICdzZWNvbmRzJzpcbiAgICAgICAgY2FzZSAnc2Vjb25kJzpcbiAgICAgICAgY2FzZSAnc2Vjcyc6XG4gICAgICAgIGNhc2UgJ3NlYyc6XG4gICAgICAgIGNhc2UgJ3MnOlxuICAgICAgICAgICAgcmV0dXJuIG4gKiBzO1xuICAgICAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6XG4gICAgICAgIGNhc2UgJ21zZWNzJzpcbiAgICAgICAgY2FzZSAnbXNlYyc6XG4gICAgICAgIGNhc2UgJ21zJzpcbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG4vKipcbiAqIFNob3J0IGZvcm1hdCBmb3IgYG1zYC5cbiAqXG4gKiBAcGFyYW0ge051bWJlcn0gbXNcbiAqIEByZXR1cm4ge1N0cmluZ31cbiAqIEBhcGkgcHJpdmF0ZVxuICovIGZ1bmN0aW9uIGZtdFNob3J0KG1zKSB7XG4gICAgdmFyIG1zQWJzID0gTWF0aC5hYnMobXMpO1xuICAgIGlmIChtc0FicyA+PSBkKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gZCkgKyAnZCc7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBoKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gaCkgKyAnaCc7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBtKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbSkgKyAnbSc7XG4gICAgfVxuICAgIGlmIChtc0FicyA+PSBzKSB7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gcykgKyAncyc7XG4gICAgfVxuICAgIHJldHVybiBtcyArICdtcyc7XG59XG4vKipcbiAqIExvbmcgZm9ybWF0IGZvciBgbXNgLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBtc1xuICogQHJldHVybiB7U3RyaW5nfVxuICogQGFwaSBwcml2YXRlXG4gKi8gZnVuY3Rpb24gZm10TG9uZyhtcykge1xuICAgIHZhciBtc0FicyA9IE1hdGguYWJzKG1zKTtcbiAgICBpZiAobXNBYnMgPj0gZCkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgZCwgJ2RheScpO1xuICAgIH1cbiAgICBpZiAobXNBYnMgPj0gaCkge1xuICAgICAgICByZXR1cm4gcGx1cmFsKG1zLCBtc0FicywgaCwgJ2hvdXInKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IG0pIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIG0sICdtaW51dGUnKTtcbiAgICB9XG4gICAgaWYgKG1zQWJzID49IHMpIHtcbiAgICAgICAgcmV0dXJuIHBsdXJhbChtcywgbXNBYnMsIHMsICdzZWNvbmQnKTtcbiAgICB9XG4gICAgcmV0dXJuIG1zICsgJyBtcyc7XG59XG4vKipcbiAqIFBsdXJhbGl6YXRpb24gaGVscGVyLlxuICovIGZ1bmN0aW9uIHBsdXJhbChtcywgbXNBYnMsIG4sIG5hbWUpIHtcbiAgICB2YXIgaXNQbHVyYWwgPSBtc0FicyA+PSBuICogMS41O1xuICAgIHJldHVybiBNYXRoLnJvdW5kKG1zIC8gbikgKyAnICcgKyBuYW1lICsgKGlzUGx1cmFsID8gJ3MnIDogJycpO1xufVxuIiwgIi8qKlxuICogV29ya2Zsb3cgZm9yIHJ1bm5pbmcgZGF0YXNldCBpdGVtcyB0aHJvdWdoIHRoZSBjaGF0IEFQSS5cbiAqXG4gKiBUaGlzIG1ha2VzIGRhdGFzZXQgcnVuIHByb2Nlc3NpbmcgZmlyZS1hbmQtZm9yZ2V0IC0gZWFjaCBpdGVtIGlzIHF1ZXVlZFxuICogaW5kZXBlbmRlbnRseSBhbmQgcHJvY2Vzc2VkIGluIHBhcmFsbGVsIGJ5IHRoZSB3b3JrZmxvdyBzeXN0ZW0uXG4gKi8gLyoqX19pbnRlcm5hbF93b3JrZmxvd3N7XCJ3b3JrZmxvd3NcIjp7XCJzcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvcnVuRGF0YXNldEl0ZW0udHNcIjp7XCJfcnVuRGF0YXNldEl0ZW1Xb3JrZmxvd1wiOntcIndvcmtmbG93SWRcIjpcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3dcIn19fSxcInN0ZXBzXCI6e1wic3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLnRzXCI6e1wiY2FsbENoYXRBcGlTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vY2FsbENoYXRBcGlTdGVwXCJ9LFwiY3JlYXRlUmVsYXRpb25TdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vY3JlYXRlUmVsYXRpb25TdGVwXCJ9LFwiZXhlY3V0ZUV2YWx1YXRvclN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9leGVjdXRlRXZhbHVhdG9yU3RlcFwifSxcImxvZ1N0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9sb2dTdGVwXCJ9fX19Ki87XG4vKipcbiAqIFN0ZXA6IENhbGwgdGhlIGNoYXQgQVBJIHRvIHByb2Nlc3MgdGhlIGRhdGFzZXQgaXRlbVxuICovIHZhciBjYWxsQ2hhdEFwaVN0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vY2FsbENoYXRBcGlTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBDcmVhdGUgY29udmVyc2F0aW9uIHJlbGF0aW9uIGluIGRhdGFiYXNlXG4gKi8gdmFyIGNyZWF0ZVJlbGF0aW9uU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9jcmVhdGVSZWxhdGlvblN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IEV4ZWN1dGUgYSBzaW5nbGUgZXZhbHVhdG9yIG9uIGEgY29udmVyc2F0aW9uXG4gKi8gdmFyIGV4ZWN1dGVFdmFsdWF0b3JTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvcnVuRGF0YXNldEl0ZW0vL2V4ZWN1dGVFdmFsdWF0b3JTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBMb2cgd29ya2Zsb3cgcHJvZ3Jlc3NcbiAqLyB2YXIgbG9nU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9sb2dTdGVwXCIpO1xuLyoqXG4gKiBNYWluIHdvcmtmbG93IGZ1bmN0aW9uIC0gcHJvY2Vzc2VzIGEgc2luZ2xlIGRhdGFzZXQgaXRlbSB0aHJvdWdoIHRoZSBjaGF0IEFQSS5cbiAqIE9wdGlvbmFsbHkgcnVucyBldmFsdWF0b3JzIG9uIHRoZSByZXN1bHRpbmcgY29udmVyc2F0aW9uLlxuICovIGFzeW5jIGZ1bmN0aW9uIF9ydW5EYXRhc2V0SXRlbVdvcmtmbG93KHBheWxvYWQpIHtcbiAgICBjb25zdCB7IGRhdGFzZXRJdGVtSWQsIGRhdGFzZXRSdW5JZCwgYWdlbnRJZCwgZXZhbHVhdG9ySWRzLCBldmFsdWF0aW9uUnVuSWQgfSA9IHBheWxvYWQ7XG4gICAgYXdhaXQgbG9nU3RlcCgnU3RhcnRpbmcgZGF0YXNldCBpdGVtIHByb2Nlc3NpbmcnLCB7XG4gICAgICAgIGRhdGFzZXRJdGVtSWQsXG4gICAgICAgIGRhdGFzZXRSdW5JZCxcbiAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgaGFzRXZhbHVhdG9yczogISEoZXZhbHVhdG9ySWRzICYmIGV2YWx1YXRvcklkcy5sZW5ndGggPiAwKVxuICAgIH0pO1xuICAgIC8vIENhbGwgY2hhdCBBUElcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjYWxsQ2hhdEFwaVN0ZXAocGF5bG9hZCk7XG4gICAgLy8gQ3JlYXRlIHJlbGF0aW9uIGlmIHdlIGdvdCBhIGNvbnZlcnNhdGlvblxuICAgIGlmIChyZXN1bHQuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgYXdhaXQgY3JlYXRlUmVsYXRpb25TdGVwKHBheWxvYWQsIHJlc3VsdC5jb252ZXJzYXRpb25JZCk7XG4gICAgICAgIC8vIFJ1biBldmFsdWF0aW9ucyBpZiBjb25maWd1cmVkXG4gICAgICAgIGlmIChldmFsdWF0b3JJZHMgJiYgZXZhbHVhdG9ySWRzLmxlbmd0aCA+IDAgJiYgZXZhbHVhdGlvblJ1bklkKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGV2YWx1YXRvcklkIG9mIGV2YWx1YXRvcklkcyl7XG4gICAgICAgICAgICAgICAgYXdhaXQgZXhlY3V0ZUV2YWx1YXRvclN0ZXAocGF5bG9hZC50ZW5hbnRJZCwgcGF5bG9hZC5wcm9qZWN0SWQsIHJlc3VsdC5jb252ZXJzYXRpb25JZCwgZXZhbHVhdG9ySWQsIGV2YWx1YXRpb25SdW5JZCwgcGF5bG9hZC5kYXRhc2V0SXRlbUV4cGVjdGVkT3V0cHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ05vIGNvbnZlcnNhdGlvbiBjcmVhdGVkJywge1xuICAgICAgICAgICAgZGF0YXNldEl0ZW1JZCxcbiAgICAgICAgICAgIGRhdGFzZXRSdW5JZCxcbiAgICAgICAgICAgIGVycm9yOiByZXN1bHQuZXJyb3JcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6ICFyZXN1bHQuZXJyb3IsXG4gICAgICAgIGRhdGFzZXRJdGVtSWQsXG4gICAgICAgIGRhdGFzZXRSdW5JZCxcbiAgICAgICAgY29udmVyc2F0aW9uSWQ6IHJlc3VsdC5jb252ZXJzYXRpb25JZCB8fCBudWxsLFxuICAgICAgICBlcnJvcjogcmVzdWx0LmVycm9yIHx8IG51bGxcbiAgICB9O1xufVxuX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3cud29ya2Zsb3dJZCA9IFwid29ya2Zsb3cvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9fcnVuRGF0YXNldEl0ZW1Xb3JrZmxvd1wiO1xuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzLnNldChcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ydW5EYXRhc2V0SXRlbS8vX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3dcIiwgX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3cpO1xuLy8gVGhpcyBJRCBtdXN0IG1hdGNoIHdoYXQgd29ya2Zsb3c6YnVpbGQgZ2VuZXJhdGVzIGluIC53ZWxsLWtub3duL3dvcmtmbG93L3YxL2Zsb3cuY2pzXG5leHBvcnQgY29uc3QgcnVuRGF0YXNldEl0ZW1Xb3JrZmxvdyA9IE9iamVjdC5hc3NpZ24oX3J1bkRhdGFzZXRJdGVtV29ya2Zsb3csIHtcbiAgICB3b3JrZmxvd0lkOiAnd29ya2Zsb3cvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL3J1bkRhdGFzZXRJdGVtLy9fcnVuRGF0YXNldEl0ZW1Xb3JrZmxvdydcbn0pO1xuIiwgIi8qKl9faW50ZXJuYWxfd29ya2Zsb3dze1wid29ya2Zsb3dzXCI6e1wic3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLnRzXCI6e1wiX2V2YWx1YXRlQ29udmVyc2F0aW9uV29ya2Zsb3dcIjp7XCJ3b3JrZmxvd0lkXCI6XCJ3b3JrZmxvdy8vLi9zcmMvZG9tYWlucy9ldmFscy93b3JrZmxvdy9mdW5jdGlvbnMvZXZhbHVhdGVDb252ZXJzYXRpb24vL19ldmFsdWF0ZUNvbnZlcnNhdGlvbldvcmtmbG93XCJ9fX0sXCJzdGVwc1wiOntcInNyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ldmFsdWF0ZUNvbnZlcnNhdGlvbi50c1wiOntcImV4ZWN1dGVFdmFsdWF0b3JTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ldmFsdWF0ZUNvbnZlcnNhdGlvbi8vZXhlY3V0ZUV2YWx1YXRvclN0ZXBcIn0sXCJnZXRDb252ZXJzYXRpb25TdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ldmFsdWF0ZUNvbnZlcnNhdGlvbi8vZ2V0Q29udmVyc2F0aW9uU3RlcFwifSxcImdldEV2YWx1YXRvcnNTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ldmFsdWF0ZUNvbnZlcnNhdGlvbi8vZ2V0RXZhbHVhdG9yc1N0ZXBcIn0sXCJsb2dTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ldmFsdWF0ZUNvbnZlcnNhdGlvbi8vbG9nU3RlcFwifX19fSovO1xudmFyIGdldENvbnZlcnNhdGlvblN0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ldmFsdWF0ZUNvbnZlcnNhdGlvbi8vZ2V0Q29udmVyc2F0aW9uU3RlcFwiKTtcbnZhciBnZXRFdmFsdWF0b3JzU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9nZXRFdmFsdWF0b3JzU3RlcFwiKTtcbnZhciBleGVjdXRlRXZhbHVhdG9yU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9leGVjdXRlRXZhbHVhdG9yU3RlcFwiKTtcbi8qKlxuICogU3RlcDogTG9nIHdvcmtmbG93IHByb2dyZXNzXG4gKi8gdmFyIGxvZ1N0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ldmFsdWF0ZUNvbnZlcnNhdGlvbi8vbG9nU3RlcFwiKTtcbi8qKlxuICogTWFpbiB3b3JrZmxvdyBmdW5jdGlvbiAtIG9yY2hlc3RyYXRlcyB0aGUgZXZhbHVhdGlvbiBzdGVwcy5cbiAqXG4gKiBJTVBPUlRBTlQ6IFRoaXMgcnVucyBpbiBhIGRldGVybWluaXN0aWMgc2FuZGJveC5cbiAqIC0gRG8gTk9UIGNhbGwgTm9kZS5qcyBBUElzIGRpcmVjdGx5IGhlcmUgKG5vIERCLCBubyBmcywgZXRjLilcbiAqIC0gQWxsIHNpZGUgZWZmZWN0cyBtdXN0IGhhcHBlbiBpbiBzdGVwIGZ1bmN0aW9uc1xuICovIGFzeW5jIGZ1bmN0aW9uIF9ldmFsdWF0ZUNvbnZlcnNhdGlvbldvcmtmbG93KHBheWxvYWQpIHtcbiAgICBjb25zdCB7IGNvbnZlcnNhdGlvbklkLCBldmFsdWF0b3JJZHMgfSA9IHBheWxvYWQ7XG4gICAgYXdhaXQgbG9nU3RlcCgnU3RhcnRpbmcgY29udmVyc2F0aW9uIGV2YWx1YXRpb24nLCBwYXlsb2FkKTtcbiAgICBjb25zdCBjb252ZXJzYXRpb24gPSBhd2FpdCBnZXRDb252ZXJzYXRpb25TdGVwKHBheWxvYWQpO1xuICAgIGNvbnN0IGV2YWx1YXRvcnMgPSBhd2FpdCBnZXRFdmFsdWF0b3JzU3RlcChwYXlsb2FkKTtcbiAgICBpZiAoZXZhbHVhdG9ycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgYXdhaXQgbG9nU3RlcCgnTm8gdmFsaWQgZXZhbHVhdG9ycyBmb3VuZCcsIHtcbiAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkLFxuICAgICAgICAgICAgZXZhbHVhdG9ySWRzXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICByZWFzb246ICdObyB2YWxpZCBldmFsdWF0b3JzJ1xuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHRzID0gW107XG4gICAgZm9yIChjb25zdCBldmFsdWF0b3Igb2YgZXZhbHVhdG9ycyl7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGVFdmFsdWF0b3JTdGVwKHBheWxvYWQsIGV2YWx1YXRvci5pZCwgY29udmVyc2F0aW9uKTtcbiAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgIGNvbnZlcnNhdGlvbklkLFxuICAgICAgICByZXN1bHRDb3VudDogcmVzdWx0cy5sZW5ndGhcbiAgICB9O1xufVxuX2V2YWx1YXRlQ29udmVyc2F0aW9uV29ya2Zsb3cud29ya2Zsb3dJZCA9IFwid29ya2Zsb3cvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9fZXZhbHVhdGVDb252ZXJzYXRpb25Xb3JrZmxvd1wiO1xuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzLnNldChcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL2V2YWxzL3dvcmtmbG93L2Z1bmN0aW9ucy9ldmFsdWF0ZUNvbnZlcnNhdGlvbi8vX2V2YWx1YXRlQ29udmVyc2F0aW9uV29ya2Zsb3dcIiwgX2V2YWx1YXRlQ29udmVyc2F0aW9uV29ya2Zsb3cpO1xuLy8gVGhpcyBJRCBtdXN0IG1hdGNoIHdoYXQgd29ya2Zsb3c6YnVpbGQgZ2VuZXJhdGVzIGluIC53ZWxsLWtub3duL3dvcmtmbG93L3YxL2Zsb3cuY2pzXG5leHBvcnQgY29uc3QgZXZhbHVhdGVDb252ZXJzYXRpb25Xb3JrZmxvdyA9IE9iamVjdC5hc3NpZ24oX2V2YWx1YXRlQ29udmVyc2F0aW9uV29ya2Zsb3csIHtcbiAgICB3b3JrZmxvd0lkOiAnd29ya2Zsb3cvLy4vc3JjL2RvbWFpbnMvZXZhbHMvd29ya2Zsb3cvZnVuY3Rpb25zL2V2YWx1YXRlQ29udmVyc2F0aW9uLy9fZXZhbHVhdGVDb252ZXJzYXRpb25Xb3JrZmxvdydcbn0pO1xuIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIi8qKlxuICogU3RlcCBmdW5jdGlvbnMgZm9yIHNjaGVkdWxlZCB0cmlnZ2VyIHdvcmtmbG93LlxuICpcbiAqIFRoZXNlIHN0ZXAgZnVuY3Rpb25zIGhhdmUgZnVsbCBOb2RlLmpzIGFjY2VzcyBhbmQgaGFuZGxlIGFsbCBkYXRhYmFzZVxuICogb3BlcmF0aW9ucyBhbmQgZXh0ZXJuYWwgc2VydmljZSBjYWxscy5cbiAqLyAvKipfX2ludGVybmFsX3dvcmtmbG93c3tcInN0ZXBzXCI6e1wic3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy50c1wiOntcImFkZENvbnZlcnNhdGlvbklkU3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9hZGRDb252ZXJzYXRpb25JZFN0ZXBcIn0sXCJjYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9jYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcFwifSxcImNoZWNrSW52b2NhdGlvbkNhbmNlbGxlZFN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcFwifSxcImNoZWNrVHJpZ2dlckVuYWJsZWRTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2NoZWNrVHJpZ2dlckVuYWJsZWRTdGVwXCJ9LFwiY29tcHV0ZVNsZWVwRHVyYXRpb25TdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2NvbXB1dGVTbGVlcER1cmF0aW9uU3RlcFwifSxcImNyZWF0ZUludm9jYXRpb25JZGVtcG90ZW50U3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9jcmVhdGVJbnZvY2F0aW9uSWRlbXBvdGVudFN0ZXBcIn0sXCJkZWxldGVQZW5kaW5nSW52b2NhdGlvbnNTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2RlbGV0ZVBlbmRpbmdJbnZvY2F0aW9uc1N0ZXBcIn0sXCJleGVjdXRlU2NoZWR1bGVkVHJpZ2dlclN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vZXhlY3V0ZVNjaGVkdWxlZFRyaWdnZXJTdGVwXCJ9LFwiZ2V0TmV4dFBlbmRpbmdJbnZvY2F0aW9uU3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9nZXROZXh0UGVuZGluZ0ludm9jYXRpb25TdGVwXCJ9LFwiaW5jcmVtZW50QXR0ZW1wdFN0ZXBcIjp7XCJzdGVwSWRcIjpcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vaW5jcmVtZW50QXR0ZW1wdFN0ZXBcIn0sXCJsb2dTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2xvZ1N0ZXBcIn0sXCJtYXJrQ29tcGxldGVkU3RlcFwiOntcInN0ZXBJZFwiOlwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9tYXJrQ29tcGxldGVkU3RlcFwifSxcIm1hcmtGYWlsZWRTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL21hcmtGYWlsZWRTdGVwXCJ9LFwibWFya1J1bm5pbmdTdGVwXCI6e1wic3RlcElkXCI6XCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL21hcmtSdW5uaW5nU3RlcFwifX19fSovO1xuLyoqXG4gKiBTdGVwOiBMb2cgYSBtZXNzYWdlIChhbGxvd3MgbG9nZ2luZyBmcm9tIHdvcmtmbG93IGNvbnRleHQpXG4gKi8gZXhwb3J0IHZhciBsb2dTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9sb2dTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBDYWxjdWxhdGUgdGhlIG5leHQgZXhlY3V0aW9uIHRpbWUgcmVsYXRpdmUgdG8gYSBiYXNlIHRpbWUuXG4gKi8gZXhwb3J0IHZhciBjYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vY2FsY3VsYXRlTmV4dEV4ZWN1dGlvblN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IENvbXB1dGUgc2xlZXAgZHVyYXRpb25cbiAqIFJldHVybnMgbWlsbGlzZWNvbmRzIHRvIHNsZWVwLlxuICovIGV4cG9ydCB2YXIgY29tcHV0ZVNsZWVwRHVyYXRpb25TdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9jb21wdXRlU2xlZXBEdXJhdGlvblN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IEdldCB0aGUgbmV4dCBwZW5kaW5nIGludm9jYXRpb24gdG8gZXhlY3V0ZSAoZWFybGllc3Qgc2NoZWR1bGVkRm9yKS5cbiAqIFJldHVybnMgbnVsbCBpZiBubyBwZW5kaW5nIGludm9jYXRpb25zIGV4aXN0LlxuICovIGV4cG9ydCB2YXIgZ2V0TmV4dFBlbmRpbmdJbnZvY2F0aW9uU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vZ2V0TmV4dFBlbmRpbmdJbnZvY2F0aW9uU3RlcFwiKTtcbi8qKlxuICogU3RlcDogRGVsZXRlIGFsbCBwZW5kaW5nIGludm9jYXRpb25zIGZvciBhIHRyaWdnZXIuXG4gKiBVc2VkIHdoZW4gY3JvbiBleHByZXNzaW9uIGNoYW5nZXMgb3IgdHJpZ2dlciBpcyBkaXNhYmxlZC5cbiAqLyBleHBvcnQgdmFyIGRlbGV0ZVBlbmRpbmdJbnZvY2F0aW9uc1N0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2RlbGV0ZVBlbmRpbmdJbnZvY2F0aW9uc1N0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IENoZWNrIGlmIHRyaWdnZXIgaXMgc3RpbGwgZW5hYmxlZCBhbmQgdGhpcyBydW5uZXIgaXMgYXV0aG9yaXRhdGl2ZS5cbiAqLyBleHBvcnQgdmFyIGNoZWNrVHJpZ2dlckVuYWJsZWRTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9jaGVja1RyaWdnZXJFbmFibGVkU3RlcFwiKTtcbi8qKlxuICogU3RlcDogVHJ5IHRvIGNyZWF0ZSBpbnZvY2F0aW9uIGlkZW1wb3RlbnRseS5cbiAqIFJldHVybnMgZXhpc3RpbmcgaW52b2NhdGlvbiBpZiBhbHJlYWR5IGNyZWF0ZWQuXG4gKi8gZXhwb3J0IHZhciBjcmVhdGVJbnZvY2F0aW9uSWRlbXBvdGVudFN0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL2NyZWF0ZUludm9jYXRpb25JZGVtcG90ZW50U3RlcFwiKTtcbi8qKlxuICogU3RlcDogQ2hlY2sgaWYgaW52b2NhdGlvbiB3YXMgY2FuY2VsbGVkIGJlZm9yZSBleGVjdXRpb25cbiAqIFJldHVybnMgdHJ1ZSBpZiBjYW5jZWxsZWQgKHNob3VsZCBza2lwIGV4ZWN1dGlvbiksIGZhbHNlIG90aGVyd2lzZVxuICovIGV4cG9ydCB2YXIgY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcFwiKTtcbi8qKlxuICogU3RlcDogTWFyayBpbnZvY2F0aW9uIGFzIHJ1bm5pbmdcbiAqLyBleHBvcnQgdmFyIG1hcmtSdW5uaW5nU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vbWFya1J1bm5pbmdTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBBZGQgYSBjb252ZXJzYXRpb24gSUQgdG8gdGhlIGludm9jYXRpb24ncyBjb252ZXJzYXRpb25JZHMgYXJyYXlcbiAqIENhbGxlZCBhZnRlciBlYWNoIGF0dGVtcHQgdG8gdHJhY2sgYWxsIGNvbnZlcnNhdGlvbnMgY3JlYXRlZCBkdXJpbmcgcmV0cmllc1xuICovIGV4cG9ydCB2YXIgYWRkQ29udmVyc2F0aW9uSWRTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9hZGRDb252ZXJzYXRpb25JZFN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IE1hcmsgaW52b2NhdGlvbiBhcyBjb21wbGV0ZWRcbiAqLyBleHBvcnQgdmFyIG1hcmtDb21wbGV0ZWRTdGVwID0gZ2xvYmFsVGhpc1tTeW1ib2wuZm9yKFwiV09SS0ZMT1dfVVNFX1NURVBcIildKFwic3RlcC8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvc3RlcHMvc2NoZWR1bGVkVHJpZ2dlclN0ZXBzLy9tYXJrQ29tcGxldGVkU3RlcFwiKTtcbi8qKlxuICogU3RlcDogTWFyayBpbnZvY2F0aW9uIGFzIGZhaWxlZFxuICovIGV4cG9ydCB2YXIgbWFya0ZhaWxlZFN0ZXAgPSBnbG9iYWxUaGlzW1N5bWJvbC5mb3IoXCJXT1JLRkxPV19VU0VfU1RFUFwiKV0oXCJzdGVwLy8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9zdGVwcy9zY2hlZHVsZWRUcmlnZ2VyU3RlcHMvL21hcmtGYWlsZWRTdGVwXCIpO1xuLyoqXG4gKiBTdGVwOiBJbmNyZW1lbnQgYXR0ZW1wdCBudW1iZXIgZm9yIHJldHJ5XG4gKi8gZXhwb3J0IHZhciBpbmNyZW1lbnRBdHRlbXB0U3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vaW5jcmVtZW50QXR0ZW1wdFN0ZXBcIik7XG4vKipcbiAqIFN0ZXA6IEV4ZWN1dGUgdGhlIHNjaGVkdWxlZCB0cmlnZ2VyIHVzaW5nIGV4ZWN1dGVBZ2VudEFzeW5jLlxuICpcbiAqIFVzZXMgdGhlIHNoYXJlZCBleGVjdXRlQWdlbnRBc3luYyBmcm9tIFRyaWdnZXJTZXJ2aWNlIHdoaWNoIGluY2x1ZGVzXG4gKiBwcm9wZXIgdHJhY2luZywgZXJyb3IgaGFuZGxpbmcsIGFuZCBjb252ZXJzYXRpb24gbWFuYWdlbWVudC5cbiAqLyBleHBvcnQgdmFyIGV4ZWN1dGVTY2hlZHVsZWRUcmlnZ2VyU3RlcCA9IGdsb2JhbFRoaXNbU3ltYm9sLmZvcihcIldPUktGTE9XX1VTRV9TVEVQXCIpXShcInN0ZXAvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcy8vZXhlY3V0ZVNjaGVkdWxlZFRyaWdnZXJTdGVwXCIpO1xuIiwgIi8qKlxuICogV29ya2Zsb3cgZm9yIHJ1bm5pbmcgc2NoZWR1bGVkIHRyaWdnZXJzLlxuICpcbiAqIFRoaXMgd29ya2Zsb3c6XG4gKiAxLiBHZXRzIG9yIGNyZWF0ZXMgdGhlIG5leHQgcGVuZGluZyBpbnZvY2F0aW9uXG4gKiAyLiBTbGVlcHMgdW50aWwgaXRzIHNjaGVkdWxlZCB0aW1lXG4gKiAzLiBDaGVja3MgaWYgdGhlIHRyaWdnZXIgaXMgc3RpbGwgZW5hYmxlZFxuICogNC4gRXhlY3V0ZXMgdGhlIGFnZW50IHdpdGggcmV0cmllc1xuICogNS4gRm9yIGNyb24gdHJpZ2dlcnMsIGxvb3BzIGJhY2sgdG8gc3RlcCAxXG4gKlxuICovIGltcG9ydCB7IGdldFdvcmtmbG93TWV0YWRhdGEsIHNsZWVwIH0gZnJvbSAnd29ya2Zsb3cnO1xuaW1wb3J0IHsgYWRkQ29udmVyc2F0aW9uSWRTdGVwLCBjYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcCwgY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcCwgY2hlY2tUcmlnZ2VyRW5hYmxlZFN0ZXAsIGNvbXB1dGVTbGVlcER1cmF0aW9uU3RlcCwgY3JlYXRlSW52b2NhdGlvbklkZW1wb3RlbnRTdGVwLCBleGVjdXRlU2NoZWR1bGVkVHJpZ2dlclN0ZXAsIGdldE5leHRQZW5kaW5nSW52b2NhdGlvblN0ZXAsIGluY3JlbWVudEF0dGVtcHRTdGVwLCBsb2dTdGVwLCBtYXJrQ29tcGxldGVkU3RlcCwgbWFya0ZhaWxlZFN0ZXAsIG1hcmtSdW5uaW5nU3RlcCB9IGZyb20gJy4uL3N0ZXBzL3NjaGVkdWxlZFRyaWdnZXJTdGVwcyc7XG4vKipfX2ludGVybmFsX3dvcmtmbG93c3tcIndvcmtmbG93c1wiOntcInNyYy9kb21haW5zL3J1bi93b3JrZmxvdy9mdW5jdGlvbnMvc2NoZWR1bGVkVHJpZ2dlclJ1bm5lci50c1wiOntcIl9zY2hlZHVsZWRUcmlnZ2VyUnVubmVyV29ya2Zsb3dcIjp7XCJ3b3JrZmxvd0lkXCI6XCJ3b3JrZmxvdy8vLi9zcmMvZG9tYWlucy9ydW4vd29ya2Zsb3cvZnVuY3Rpb25zL3NjaGVkdWxlZFRyaWdnZXJSdW5uZXIvL19zY2hlZHVsZWRUcmlnZ2VyUnVubmVyV29ya2Zsb3dcIn19fX0qLztcbi8qKlxuICogR2VuZXJhdGUgaWRlbXBvdGVuY3kga2V5IGZvciBhIHNjaGVkdWxlZCBleGVjdXRpb24uXG4gKi8gZnVuY3Rpb24gZ2VuZXJhdGVJZGVtcG90ZW5jeUtleShzY2hlZHVsZWRUcmlnZ2VySWQsIHNjaGVkdWxlZEZvcikge1xuICAgIHJldHVybiBgc2NoZWRfJHtzY2hlZHVsZWRUcmlnZ2VySWR9XyR7c2NoZWR1bGVkRm9yfWA7XG59XG4vKipcbiAqIE1haW4gd29ya2Zsb3cgZnVuY3Rpb24gLSBydW5zIGEgc2NoZWR1bGVkIHRyaWdnZXIuXG4gKiBGb3IgY3JvbiB0cmlnZ2VycywgdGhpcyBsb29wcyBpbmRlZmluaXRlbHkgdW50aWwgZGlzYWJsZWQvZGVsZXRlZC5cbiAqIEZvciBvbmUtdGltZSB0cmlnZ2VycywgaXQgZXhlY3V0ZXMgb25jZSBhbmQgY29tcGxldGVzLlxuICpcbiAqLyBhc3luYyBmdW5jdGlvbiBfc2NoZWR1bGVkVHJpZ2dlclJ1bm5lcldvcmtmbG93KHBheWxvYWQpIHtcbiAgICBjb25zdCB7IHRlbmFudElkLCBwcm9qZWN0SWQsIGFnZW50SWQsIHNjaGVkdWxlZFRyaWdnZXJJZCB9ID0gcGF5bG9hZDtcbiAgICBjb25zdCBtZXRhZGF0YSA9IGdldFdvcmtmbG93TWV0YWRhdGEoKTtcbiAgICBjb25zdCBydW5uZXJJZCA9IG1ldGFkYXRhLndvcmtmbG93UnVuSWQ7XG4gICAgYXdhaXQgbG9nU3RlcCgnU3RhcnRpbmcgc2NoZWR1bGVkIHRyaWdnZXIgcnVubmVyIHdvcmtmbG93Jywge1xuICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgcHJvamVjdElkLFxuICAgICAgICBhZ2VudElkLFxuICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgIHJ1bm5lcklkXG4gICAgfSk7XG4gICAgLy8gVHJhY2sgdGhlIGxhc3Qgc2NoZWR1bGVkIHRpbWUgZm9yIGNyb24gY2FsY3VsYXRpb25zXG4gICAgbGV0IGxhc3RTY2hlZHVsZWRGb3IgPSBudWxsO1xuICAgIC8vIE1haW4gZXhlY3V0aW9uIGxvb3BcbiAgICB3aGlsZSh0cnVlKXtcbiAgICAgICAgY29uc3QgZW5hYmxlZENoZWNrID0gYXdhaXQgY2hlY2tUcmlnZ2VyRW5hYmxlZFN0ZXAoe1xuICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgcnVubmVySWRcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghZW5hYmxlZENoZWNrLnNob3VsZENvbnRpbnVlIHx8ICFlbmFibGVkQ2hlY2sudHJpZ2dlcikge1xuICAgICAgICAgICAgYXdhaXQgbG9nU3RlcCgnU2NoZWR1bGVkIHRyaWdnZXIgd29ya2Zsb3cgc3RvcHBpbmcnLCB7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogZW5hYmxlZENoZWNrLnJlYXNvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogJ3N0b3BwZWQnLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogZW5hYmxlZENoZWNrLnJlYXNvblxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyID0gZW5hYmxlZENoZWNrLnRyaWdnZXI7XG4gICAgICAgIGNvbnN0IGlzT25lVGltZSA9ICEhdHJpZ2dlci5ydW5BdDtcbiAgICAgICAgbGV0IGludm9jYXRpb24gPSBhd2FpdCBnZXROZXh0UGVuZGluZ0ludm9jYXRpb25TdGVwKHtcbiAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZFxuICAgICAgICB9KTtcbiAgICAgICAgLy8gQ3JlYXRlIGludm9jYXRpb24gaWYgbm9uZSBleGlzdHNcbiAgICAgICAgaWYgKCFpbnZvY2F0aW9uKSB7XG4gICAgICAgICAgICBsZXQgc2NoZWR1bGVkRm9yO1xuICAgICAgICAgICAgaWYgKGlzT25lVGltZSkge1xuICAgICAgICAgICAgICAgIGlmICghdHJpZ2dlci5ydW5BdCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBsb2dTdGVwKCdPbmUtdGltZSB0cmlnZ2VyIG1pc3NpbmcgcnVuQXQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWRcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWFzb246ICdvbmUtdGltZSB0cmlnZ2VyIG1pc3NpbmcgcnVuQXQnXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNjaGVkdWxlZEZvciA9IHRyaWdnZXIucnVuQXQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRyaWdnZXIuY3JvbkV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IG5leHRFeGVjdXRpb25UaW1lIH0gPSBhd2FpdCBjYWxjdWxhdGVOZXh0RXhlY3V0aW9uU3RlcCh7XG4gICAgICAgICAgICAgICAgICAgIGNyb25FeHByZXNzaW9uOiB0cmlnZ2VyLmNyb25FeHByZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICBjcm9uVGltZXpvbmU6IHRyaWdnZXIuY3JvblRpbWV6b25lLFxuICAgICAgICAgICAgICAgICAgICBsYXN0U2NoZWR1bGVkRm9yXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRm9yID0gbmV4dEV4ZWN1dGlvblRpbWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ1RyaWdnZXIgbWlzc2luZyBib3RoIGNyb25FeHByZXNzaW9uIGFuZCBydW5BdCcsIHtcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAnZXJyb3InLFxuICAgICAgICAgICAgICAgICAgICByZWFzb246ICd0cmlnZ2VyIG1pc3NpbmcgY3JvbkV4cHJlc3Npb24gYW5kIHJ1bkF0J1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpZGVtcG90ZW5jeUtleSA9IGdlbmVyYXRlSWRlbXBvdGVuY3lLZXkoc2NoZWR1bGVkVHJpZ2dlcklkLCBzY2hlZHVsZWRGb3IpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlSW52b2NhdGlvbklkZW1wb3RlbnRTdGVwKHtcbiAgICAgICAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkRm9yLFxuICAgICAgICAgICAgICAgIHBheWxvYWQ6IHRyaWdnZXIucGF5bG9hZCA/PyBudWxsLFxuICAgICAgICAgICAgICAgIGlkZW1wb3RlbmN5S2V5XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGludm9jYXRpb24gPSByZXN1bHQuaW52b2NhdGlvbjtcbiAgICAgICAgICAgIC8vIEZvciBvbmUtdGltZSB0cmlnZ2VycywgY2hlY2sgaWYgYWxyZWFkeSBwcm9jZXNzZWRcbiAgICAgICAgICAgIGlmIChpc09uZVRpbWUgJiYgcmVzdWx0LmFscmVhZHlFeGlzdHMgJiYgaW52b2NhdGlvbi5zdGF0dXMgIT09ICdwZW5kaW5nJykge1xuICAgICAgICAgICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ09uZS10aW1lIHRyaWdnZXIgYWxyZWFkeSBleGVjdXRlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWQsXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogaW52b2NhdGlvbi5zdGF0dXNcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6ICdhbHJlYWR5X2V4ZWN1dGVkJyxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbklkOiBpbnZvY2F0aW9uLmlkXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBsb2dTdGVwKCdHb3QgbmV4dCBwZW5kaW5nIGludm9jYXRpb24nLCB7XG4gICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWQsXG4gICAgICAgICAgICBzY2hlZHVsZWRGb3I6IGludm9jYXRpb24uc2NoZWR1bGVkRm9yXG4gICAgICAgIH0pO1xuICAgICAgICAvLyA0LiBTbGVlcCB1bnRpbCB0aGUgaW52b2NhdGlvbidzIHNjaGVkdWxlZCB0aW1lXG4gICAgICAgIGNvbnN0IHNsZWVwTXMgPSBhd2FpdCBjb21wdXRlU2xlZXBEdXJhdGlvblN0ZXAoaW52b2NhdGlvbi5zY2hlZHVsZWRGb3IpO1xuICAgICAgICBhd2FpdCBsb2dTdGVwKCdTbGVlcGluZyB1bnRpbCBzY2hlZHVsZWQgdGltZScsIHtcbiAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZCxcbiAgICAgICAgICAgIHNjaGVkdWxlZEZvcjogaW52b2NhdGlvbi5zY2hlZHVsZWRGb3IsXG4gICAgICAgICAgICBzbGVlcE1zXG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBzbGVlcChzbGVlcE1zKTtcbiAgICAgICAgLy8gNS4gUmUtY2hlY2sgaWYgdHJpZ2dlciBpcyBzdGlsbCBlbmFibGVkIGFmdGVyIHNsZWVwXG4gICAgICAgIGNvbnN0IHBvc3RTbGVlcENoZWNrID0gYXdhaXQgY2hlY2tUcmlnZ2VyRW5hYmxlZFN0ZXAoe1xuICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgcnVubmVySWRcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcG9zdFNsZWVwQ2hlY2suc2hvdWxkQ29udGludWUgfHwgIXBvc3RTbGVlcENoZWNrLnRyaWdnZXIpIHtcbiAgICAgICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ1RyaWdnZXIgZGlzYWJsZWQvZGVsZXRlZCBkdXJpbmcgc2xlZXAsIHN0b3BwaW5nJywge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICByZWFzb246IHBvc3RTbGVlcENoZWNrLnJlYXNvblxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogJ3N0b3BwZWQnLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogcG9zdFNsZWVwQ2hlY2sucmVhc29uXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIC8vIFJlZnJlc2ggdHJpZ2dlciBjb25maWcgKG1heSBoYXZlIGNoYW5nZWQgZHVyaW5nIHNsZWVwKVxuICAgICAgICBjb25zdCBjdXJyZW50VHJpZ2dlciA9IHBvc3RTbGVlcENoZWNrLnRyaWdnZXI7XG4gICAgICAgIC8vIDYuIENoZWNrIGlmIGludm9jYXRpb24gd2FzIGNhbmNlbGxlZCBkdXJpbmcgc2xlZXBcbiAgICAgICAgY29uc3QgY2FuY2VsQ2hlY2sgPSBhd2FpdCBjaGVja0ludm9jYXRpb25DYW5jZWxsZWRTdGVwKHtcbiAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgYWdlbnRJZCxcbiAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGNhbmNlbENoZWNrLmNhbmNlbGxlZCkge1xuICAgICAgICAgICAgYXdhaXQgbG9nU3RlcCgnSW52b2NhdGlvbiB3YXMgY2FuY2VsbGVkLCBza2lwcGluZyB0byBuZXh0Jywge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gNy4gRXhlY3V0ZSB3aXRoIHJldHJpZXNcbiAgICAgICAgbGV0IGF0dGVtcHROdW1iZXIgPSBpbnZvY2F0aW9uLmF0dGVtcHROdW1iZXI7XG4gICAgICAgIGxldCBsYXN0RXJyb3IgPSBudWxsO1xuICAgICAgICBjb25zdCBtYXhBdHRlbXB0cyA9IGN1cnJlbnRUcmlnZ2VyLm1heFJldHJpZXMgKyAxO1xuICAgICAgICB3aGlsZShhdHRlbXB0TnVtYmVyIDw9IG1heEF0dGVtcHRzKXtcbiAgICAgICAgICAgIGNvbnN0IHJldHJ5Q2FuY2VsID0gYXdhaXQgY2hlY2tJbnZvY2F0aW9uQ2FuY2VsbGVkU3RlcCh7XG4gICAgICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmV0cnlDYW5jZWwuY2FuY2VsbGVkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbG9nU3RlcCgnSW52b2NhdGlvbiBjYW5jZWxsZWQgZHVyaW5nIHJldHJ5IGxvb3AnLCB7XG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbklkOiBpbnZvY2F0aW9uLmlkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNYXJrIGFzIHJ1bm5pbmdcbiAgICAgICAgICAgIGF3YWl0IG1hcmtSdW5uaW5nU3RlcCh7XG4gICAgICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRlU2NoZWR1bGVkVHJpZ2dlclN0ZXAoe1xuICAgICAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgICAgIHByb2plY3RJZCxcbiAgICAgICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZVRlbXBsYXRlOiBjdXJyZW50VHJpZ2dlci5tZXNzYWdlVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgcGF5bG9hZDogY3VycmVudFRyaWdnZXIucGF5bG9hZCA/PyBudWxsLFxuICAgICAgICAgICAgICAgIHRpbWVvdXRTZWNvbmRzOiBjdXJyZW50VHJpZ2dlci50aW1lb3V0U2Vjb25kc1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBTYXZlIGNvbnZlcnNhdGlvbiBJRCBpbW1lZGlhdGVseSBhZnRlciBlYWNoIGF0dGVtcHRcbiAgICAgICAgICAgIGlmIChyZXN1bHQuY29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBhZGRDb252ZXJzYXRpb25JZFN0ZXAoe1xuICAgICAgICAgICAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQ6IHJlc3VsdC5jb252ZXJzYXRpb25JZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbWFya0NvbXBsZXRlZFN0ZXAoe1xuICAgICAgICAgICAgICAgICAgICB0ZW5hbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgICAgICBhZ2VudElkLFxuICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZWRUcmlnZ2VySWQsXG4gICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF3YWl0IGxvZ1N0ZXAoJ1NjaGVkdWxlZCB0cmlnZ2VyIGV4ZWN1dGlvbiBjb21wbGV0ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbklkOiBpbnZvY2F0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICBjb252ZXJzYXRpb25JZDogcmVzdWx0LmNvbnZlcnNhdGlvbklkXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGFzdEVycm9yID0gbnVsbDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RFcnJvciA9IHJlc3VsdC5lcnJvciB8fCAnVW5rbm93biBlcnJvcic7XG4gICAgICAgICAgICBhd2FpdCBsb2dTdGVwKCdTY2hlZHVsZWQgdHJpZ2dlciBleGVjdXRpb24gZmFpbGVkJywge1xuICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWQsXG4gICAgICAgICAgICAgICAgYXR0ZW1wdE51bWJlcixcbiAgICAgICAgICAgICAgICBlcnJvcjogbGFzdEVycm9yXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChhdHRlbXB0TnVtYmVyIDwgbWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBpbmNyZW1lbnRBdHRlbXB0U3RlcCh7XG4gICAgICAgICAgICAgICAgICAgIHRlbmFudElkLFxuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRyaWdnZXJJZCxcbiAgICAgICAgICAgICAgICAgICAgaW52b2NhdGlvbklkOiBpbnZvY2F0aW9uLmlkLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50QXR0ZW1wdDogYXR0ZW1wdE51bWJlclxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGF0dGVtcHROdW1iZXIrKztcbiAgICAgICAgICAgICAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLnJhbmRvbSgpICogMC4zO1xuICAgICAgICAgICAgICAgIGF3YWl0IHNsZWVwKGN1cnJlbnRUcmlnZ2VyLnJldHJ5RGVsYXlTZWNvbmRzICogMTAwMCAqICgxICsgaml0dGVyKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIE1hcmsgYXMgZmFpbGVkIGlmIGFsbCByZXRyaWVzIGV4aGF1c3RlZFxuICAgICAgICBpZiAobGFzdEVycm9yKSB7XG4gICAgICAgICAgICBhd2FpdCBtYXJrRmFpbGVkU3RlcCh7XG4gICAgICAgICAgICAgICAgdGVuYW50SWQsXG4gICAgICAgICAgICAgICAgcHJvamVjdElkLFxuICAgICAgICAgICAgICAgIGFnZW50SWQsXG4gICAgICAgICAgICAgICAgc2NoZWR1bGVkVHJpZ2dlcklkLFxuICAgICAgICAgICAgICAgIGludm9jYXRpb25JZDogaW52b2NhdGlvbi5pZFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVHJhY2sgdGhpcyBpbnZvY2F0aW9uJ3Mgc2NoZWR1bGVkIHRpbWUgZm9yIG5leHQgY3JvbiBjYWxjdWxhdGlvblxuICAgICAgICBsYXN0U2NoZWR1bGVkRm9yID0gaW52b2NhdGlvbi5zY2hlZHVsZWRGb3I7XG4gICAgICAgIC8vIEZvciBvbmUtdGltZSB0cmlnZ2Vycywgd2UncmUgZG9uZVxuICAgICAgICBpZiAoaXNPbmVUaW1lKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN0YXR1czogbGFzdEVycm9yID8gJ2ZhaWxlZCcgOiAnY29tcGxldGVkJyxcbiAgICAgICAgICAgICAgICBpbnZvY2F0aW9uSWQ6IGludm9jYXRpb24uaWRcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAvLyBGb3IgY3JvbiB0cmlnZ2VycywgbG9vcCBjb250aW51ZXMgdG8gY3JlYXRlL2dldCBuZXh0IGludm9jYXRpb25cbiAgICB9XG59XG5fc2NoZWR1bGVkVHJpZ2dlclJ1bm5lcldvcmtmbG93LndvcmtmbG93SWQgPSBcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9mdW5jdGlvbnMvc2NoZWR1bGVkVHJpZ2dlclJ1bm5lci8vX3NjaGVkdWxlZFRyaWdnZXJSdW5uZXJXb3JrZmxvd1wiO1xuZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzLnNldChcIndvcmtmbG93Ly8uL3NyYy9kb21haW5zL3J1bi93b3JrZmxvdy9mdW5jdGlvbnMvc2NoZWR1bGVkVHJpZ2dlclJ1bm5lci8vX3NjaGVkdWxlZFRyaWdnZXJSdW5uZXJXb3JrZmxvd1wiLCBfc2NoZWR1bGVkVHJpZ2dlclJ1bm5lcldvcmtmbG93KTtcbi8vIEV4cG9ydCB3aXRoIHdvcmtmbG93SWQgZm9yIHRoZSBidWlsZCBzeXN0ZW1cbmV4cG9ydCBjb25zdCBzY2hlZHVsZWRUcmlnZ2VyUnVubmVyV29ya2Zsb3cgPSBPYmplY3QuYXNzaWduKF9zY2hlZHVsZWRUcmlnZ2VyUnVubmVyV29ya2Zsb3csIHtcbiAgICB3b3JrZmxvd0lkOiAnd29ya2Zsb3cvLy4vc3JjL2RvbWFpbnMvcnVuL3dvcmtmbG93L2Z1bmN0aW9ucy9zY2hlZHVsZWRUcmlnZ2VyUnVubmVyLy9fc2NoZWR1bGVkVHJpZ2dlclJ1bm5lcldvcmtmbG93J1xufSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBLHFFQUFBQSxTQUFBO0FBQUE7QUFFSSxRQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBQ1osUUFBSSxJQUFJLElBQUk7QUFDWixRQUFJLElBQUksSUFBSTtBQUNaLFFBQUksSUFBSSxJQUFJO0FBYVIsSUFBQUEsUUFBTyxVQUFVLFNBQVMsS0FBSyxTQUFTO0FBQ3hDLGdCQUFVLFdBQVcsQ0FBQztBQUN0QixVQUFJLE9BQU8sT0FBTztBQUNsQixVQUFJLFNBQVMsWUFBWSxJQUFJLFNBQVMsR0FBRztBQUNyQyxlQUFPLE1BQU0sR0FBRztBQUFBLE1BQ3BCLFdBQVcsU0FBUyxZQUFZLFNBQVMsR0FBRyxHQUFHO0FBQzNDLGVBQU8sUUFBUSxPQUFPLFFBQVEsR0FBRyxJQUFJLFNBQVMsR0FBRztBQUFBLE1BQ3JEO0FBQ0EsWUFBTSxJQUFJLE1BQU0sMERBQTBELEtBQUssVUFBVSxHQUFHLENBQUM7QUFBQSxJQUNqRztBQU9JLGFBQVMsTUFBTSxLQUFLO0FBQ3BCLFlBQU0sT0FBTyxHQUFHO0FBQ2hCLFVBQUksSUFBSSxTQUFTLEtBQUs7QUFDbEI7QUFBQSxNQUNKO0FBQ0EsVUFBSSxRQUFRLG1JQUFtSSxLQUFLLEdBQUc7QUFDdkosVUFBSSxDQUFDLE9BQU87QUFDUjtBQUFBLE1BQ0o7QUFDQSxVQUFJLElBQUksV0FBVyxNQUFNLENBQUMsQ0FBQztBQUMzQixVQUFJLFFBQVEsTUFBTSxDQUFDLEtBQUssTUFBTSxZQUFZO0FBQzFDLGNBQU8sTUFBSztBQUFBLFFBQ1IsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUNELGlCQUFPLElBQUk7QUFBQSxRQUNmLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFDRCxpQkFBTyxJQUFJO0FBQUEsUUFDZixLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQ0QsaUJBQU8sSUFBSTtBQUFBLFFBQ2YsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUNELGlCQUFPLElBQUk7QUFBQSxRQUNmLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFBQSxRQUNMLEtBQUs7QUFDRCxpQkFBTyxJQUFJO0FBQUEsUUFDZixLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQUEsUUFDTCxLQUFLO0FBQ0QsaUJBQU8sSUFBSTtBQUFBLFFBQ2YsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUFBLFFBQ0wsS0FBSztBQUNELGlCQUFPO0FBQUEsUUFDWDtBQUNJLGlCQUFPO0FBQUEsTUFDZjtBQUFBLElBQ0o7QUFyRGE7QUE0RFQsYUFBUyxTQUFTQyxLQUFJO0FBQ3RCLFVBQUksUUFBUSxLQUFLLElBQUlBLEdBQUU7QUFDdkIsVUFBSSxTQUFTLEdBQUc7QUFDWixlQUFPLEtBQUssTUFBTUEsTUFBSyxDQUFDLElBQUk7QUFBQSxNQUNoQztBQUNBLFVBQUksU0FBUyxHQUFHO0FBQ1osZUFBTyxLQUFLLE1BQU1BLE1BQUssQ0FBQyxJQUFJO0FBQUEsTUFDaEM7QUFDQSxVQUFJLFNBQVMsR0FBRztBQUNaLGVBQU8sS0FBSyxNQUFNQSxNQUFLLENBQUMsSUFBSTtBQUFBLE1BQ2hDO0FBQ0EsVUFBSSxTQUFTLEdBQUc7QUFDWixlQUFPLEtBQUssTUFBTUEsTUFBSyxDQUFDLElBQUk7QUFBQSxNQUNoQztBQUNBLGFBQU9BLE1BQUs7QUFBQSxJQUNoQjtBQWZhO0FBc0JULGFBQVMsUUFBUUEsS0FBSTtBQUNyQixVQUFJLFFBQVEsS0FBSyxJQUFJQSxHQUFFO0FBQ3ZCLFVBQUksU0FBUyxHQUFHO0FBQ1osZUFBTyxPQUFPQSxLQUFJLE9BQU8sR0FBRyxLQUFLO0FBQUEsTUFDckM7QUFDQSxVQUFJLFNBQVMsR0FBRztBQUNaLGVBQU8sT0FBT0EsS0FBSSxPQUFPLEdBQUcsTUFBTTtBQUFBLE1BQ3RDO0FBQ0EsVUFBSSxTQUFTLEdBQUc7QUFDWixlQUFPLE9BQU9BLEtBQUksT0FBTyxHQUFHLFFBQVE7QUFBQSxNQUN4QztBQUNBLFVBQUksU0FBUyxHQUFHO0FBQ1osZUFBTyxPQUFPQSxLQUFJLE9BQU8sR0FBRyxRQUFRO0FBQUEsTUFDeEM7QUFDQSxhQUFPQSxNQUFLO0FBQUEsSUFDaEI7QUFmYTtBQWtCVCxhQUFTLE9BQU9BLEtBQUksT0FBTyxHQUFHLE1BQU07QUFDcEMsVUFBSSxXQUFXLFNBQVMsSUFBSTtBQUM1QixhQUFPLEtBQUssTUFBTUEsTUFBSyxDQUFDLElBQUksTUFBTSxRQUFRLFdBQVcsTUFBTTtBQUFBLElBQy9EO0FBSGE7QUFBQTtBQUFBOzs7QUNoSVQsSUFBSSxrQkFBa0IsV0FBVyxPQUFPLElBQUksbUJBQW1CLENBQUMsRUFBRSw4RUFBOEU7QUFHaEosSUFBSSxxQkFBcUIsV0FBVyxPQUFPLElBQUksbUJBQW1CLENBQUMsRUFBRSxpRkFBaUY7QUFHdEosSUFBSSx1QkFBdUIsV0FBVyxPQUFPLElBQUksbUJBQW1CLENBQUMsRUFBRSxtRkFBbUY7QUFHMUosSUFBSSxVQUFVLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsc0VBQXNFO0FBSWhJLGVBQWUsd0JBQXdCLFNBQVM7QUFDaEQsUUFBTSxFQUFFLGVBQWUsY0FBYyxTQUFTLGNBQWMsZ0JBQWdCLElBQUk7QUFDaEYsUUFBTSxRQUFRLG9DQUFvQztBQUFBLElBQzlDO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLGVBQWUsQ0FBQyxFQUFFLGdCQUFnQixhQUFhLFNBQVM7QUFBQSxFQUM1RCxDQUFDO0FBRUQsUUFBTSxTQUFTLE1BQU0sZ0JBQWdCLE9BQU87QUFFNUMsTUFBSSxPQUFPLGdCQUFnQjtBQUN2QixVQUFNLG1CQUFtQixTQUFTLE9BQU8sY0FBYztBQUV2RCxRQUFJLGdCQUFnQixhQUFhLFNBQVMsS0FBSyxpQkFBaUI7QUFDNUQsaUJBQVcsZUFBZSxjQUFhO0FBQ25DLGNBQU0scUJBQXFCLFFBQVEsVUFBVSxRQUFRLFdBQVcsT0FBTyxnQkFBZ0IsYUFBYSxpQkFBaUIsUUFBUSx5QkFBeUI7QUFBQSxNQUMxSjtBQUFBLElBQ0o7QUFBQSxFQUNKLE9BQU87QUFDSCxVQUFNLFFBQVEsMkJBQTJCO0FBQUEsTUFDckM7QUFBQSxNQUNBO0FBQUEsTUFDQSxPQUFPLE9BQU87QUFBQSxJQUNsQixDQUFDO0FBQUEsRUFDTDtBQUNBLFNBQU87QUFBQSxJQUNILFNBQVMsQ0FBQyxPQUFPO0FBQUEsSUFDakI7QUFBQSxJQUNBO0FBQUEsSUFDQSxnQkFBZ0IsT0FBTyxrQkFBa0I7QUFBQSxJQUN6QyxPQUFPLE9BQU8sU0FBUztBQUFBLEVBQzNCO0FBQ0o7QUFqQ21CO0FBa0NuQix3QkFBd0IsYUFBYTtBQUNyQyxXQUFXLG9CQUFvQixJQUFJLDRGQUE0Rix1QkFBdUI7QUFFL0ksSUFBTSx5QkFBeUIsT0FBTyxPQUFPLHlCQUF5QjtBQUFBLEVBQ3pFLFlBQVk7QUFDaEIsQ0FBQzs7O0FDM0RELElBQUksc0JBQXNCLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsd0ZBQXdGO0FBQzlKLElBQUksb0JBQW9CLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsc0ZBQXNGO0FBQzFKLElBQUlDLHdCQUF1QixXQUFXLE9BQU8sSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLHlGQUF5RjtBQUc1SixJQUFJQyxXQUFVLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsNEVBQTRFO0FBT3RJLGVBQWUsOEJBQThCLFNBQVM7QUFDdEQsUUFBTSxFQUFFLGdCQUFnQixhQUFhLElBQUk7QUFDekMsUUFBTUEsU0FBUSxvQ0FBb0MsT0FBTztBQUN6RCxRQUFNLGVBQWUsTUFBTSxvQkFBb0IsT0FBTztBQUN0RCxRQUFNLGFBQWEsTUFBTSxrQkFBa0IsT0FBTztBQUNsRCxNQUFJLFdBQVcsV0FBVyxHQUFHO0FBQ3pCLFVBQU1BLFNBQVEsNkJBQTZCO0FBQUEsTUFDdkM7QUFBQSxNQUNBO0FBQUEsSUFDSixDQUFDO0FBQ0QsV0FBTztBQUFBLE1BQ0gsU0FBUztBQUFBLE1BQ1QsUUFBUTtBQUFBLElBQ1o7QUFBQSxFQUNKO0FBQ0EsUUFBTSxVQUFVLENBQUM7QUFDakIsYUFBVyxhQUFhLFlBQVc7QUFDL0IsVUFBTSxTQUFTLE1BQU1ELHNCQUFxQixTQUFTLFVBQVUsSUFBSSxZQUFZO0FBQzdFLFlBQVEsS0FBSyxNQUFNO0FBQUEsRUFDdkI7QUFDQSxTQUFPO0FBQUEsSUFDSCxTQUFTO0FBQUEsSUFDVDtBQUFBLElBQ0EsYUFBYSxRQUFRO0FBQUEsRUFDekI7QUFDSjtBQXpCbUI7QUEwQm5CLDhCQUE4QixhQUFhO0FBQzNDLFdBQVcsb0JBQW9CLElBQUksd0dBQXdHLDZCQUE2QjtBQUVqSyxJQUFNLCtCQUErQixPQUFPLE9BQU8sK0JBQStCO0FBQUEsRUFDckYsWUFBWTtBQUNoQixDQUFDOzs7QUMzQ0QsZ0JBQWU7OztBQ0RSLElBQU0sb0JBQW9CLE9BQU8sSUFBSSxtQkFBbUI7QUFDeEQsSUFBTSx1QkFBdUIsT0FBTyxJQUFJLHNCQUFzQjtBQUM5RCxJQUFNLGlCQUFpQixPQUFPLElBQUksZ0JBQWdCO0FBQ2xELElBQU0sbUJBQW1CLE9BQU8sSUFBSSxrQkFBa0I7QUFDdEQsSUFBTSx5QkFBeUIsT0FBTyxJQUFJLHdCQUF3QjtBQUNsRSxJQUFNLGNBQWMsT0FBTyxJQUFJLHNCQUFzQjtBQUNyRCxJQUFNLHFCQUFxQixPQUFPLElBQUksc0JBQXNCO0FBQzVELElBQU0scUJBQXFCLE9BQU8sSUFBSSxzQkFBc0I7QUFDNUQsSUFBTSxtQkFBbUIsT0FBTyxJQUFJLFdBQVc7QUFDL0MsSUFBTSw0QkFBNEIsT0FBTyxJQUM5QywyQkFBMkI7QUFNMUIsSUFBQSwwQkFBQSxPQUFBLElBQUEseUJBQUE7OztBQ3FCSCxlQUFzQixNQUFNLE9BQWtDO0FBRTVELFFBQU0sVUFBVyxXQUFtQixjQUFjO0FBQ2xELE1BQUksQ0FBQyxTQUFTO0FBQ1osVUFBTSxJQUFJLE1BQU0seURBQXlEO0VBQzNFO0FBQ0EsU0FBTyxRQUFRLEtBQUs7QUFDdEI7QUFQc0I7OztBQ3BCZixJQUFNLDBCQUF1Qix1QkFBQSxJQUFBLGtCQUFBO0FBQ2xDLFNBQWdCLHNCQUFXO0FBRzNCLFFBQUEsTUFBQSxXQUFBLHVCQUFBO0FBQ0EsTUFBQSxDQUFBLEtBQVM7QUFDTCxVQUFNLElBQUMsTUFBQSwrRUFBQTs7QUFJWCxTQUFDOztBQVRlOzs7QUNOZixJQUFBLFFBQUEsV0FBQSxPQUFBLElBQUEsbUJBQUEsQ0FBQSxFQUFBLHFDQUFBOzs7QUNKUSxJQUFJRSxXQUFVLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsdUVBQXVFO0FBR2pJLElBQUksNkJBQTZCLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsMEZBQTBGO0FBSXZLLElBQUksMkJBQTJCLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsd0ZBQXdGO0FBSW5LLElBQUksK0JBQStCLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsNEZBQTRGO0FBSTNLLElBQUksK0JBQStCLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsNEZBQTRGO0FBRzNLLElBQUksMEJBQTBCLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsdUZBQXVGO0FBSWpLLElBQUksaUNBQWlDLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsOEZBQThGO0FBSS9LLElBQUksK0JBQStCLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsNEZBQTRGO0FBRzNLLElBQUksa0JBQWtCLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsK0VBQStFO0FBSWpKLElBQUksd0JBQXdCLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUscUZBQXFGO0FBRzdKLElBQUksb0JBQW9CLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsaUZBQWlGO0FBR3JKLElBQUksaUJBQWlCLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsOEVBQThFO0FBRy9JLElBQUksdUJBQXVCLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsb0ZBQW9GO0FBTTNKLElBQUksOEJBQThCLFdBQVcsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEVBQUUsMkZBQTJGOzs7QUN6Q2hMLFNBQVMsdUJBQXVCLG9CQUFvQixjQUFjO0FBQ2xFLFNBQU8sU0FBUyxrQkFBa0IsSUFBSSxZQUFZO0FBQ3REO0FBRmE7QUFRVCxlQUFlLGdDQUFnQyxTQUFTO0FBQ3hELFFBQU0sRUFBRSxVQUFVLFdBQVcsU0FBUyxtQkFBbUIsSUFBSTtBQUM3RCxRQUFNLFdBQVcsb0JBQW9CO0FBQ3JDLFFBQU0sV0FBVyxTQUFTO0FBQzFCLFFBQU1DLFNBQVEsOENBQThDO0FBQUEsSUFDeEQ7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDSixDQUFDO0FBRUQsTUFBSSxtQkFBbUI7QUFFdkIsU0FBTSxNQUFLO0FBQ1AsVUFBTSxlQUFlLE1BQU0sd0JBQXdCO0FBQUEsTUFDL0M7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDSixDQUFDO0FBQ0QsUUFBSSxDQUFDLGFBQWEsa0JBQWtCLENBQUMsYUFBYSxTQUFTO0FBQ3ZELFlBQU1BLFNBQVEsdUNBQXVDO0FBQUEsUUFDakQ7QUFBQSxRQUNBLFFBQVEsYUFBYTtBQUFBLE1BQ3pCLENBQUM7QUFDRCxhQUFPO0FBQUEsUUFDSCxRQUFRO0FBQUEsUUFDUixRQUFRLGFBQWE7QUFBQSxNQUN6QjtBQUFBLElBQ0o7QUFDQSxVQUFNLFVBQVUsYUFBYTtBQUM3QixVQUFNLFlBQVksQ0FBQyxDQUFDLFFBQVE7QUFDNUIsUUFBSSxhQUFhLE1BQU0sNkJBQTZCO0FBQUEsTUFDaEQ7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNKLENBQUM7QUFFRCxRQUFJLENBQUMsWUFBWTtBQUNiLFVBQUk7QUFDSixVQUFJLFdBQVc7QUFDWCxZQUFJLENBQUMsUUFBUSxPQUFPO0FBQ2hCLGdCQUFNQSxTQUFRLGtDQUFrQztBQUFBLFlBQzVDO0FBQUEsVUFDSixDQUFDO0FBQ0QsaUJBQU87QUFBQSxZQUNILFFBQVE7QUFBQSxZQUNSLFFBQVE7QUFBQSxVQUNaO0FBQUEsUUFDSjtBQUNBLHVCQUFlLFFBQVE7QUFBQSxNQUMzQixXQUFXLFFBQVEsZ0JBQWdCO0FBQy9CLGNBQU0sRUFBRSxrQkFBa0IsSUFBSSxNQUFNLDJCQUEyQjtBQUFBLFVBQzNELGdCQUFnQixRQUFRO0FBQUEsVUFDeEIsY0FBYyxRQUFRO0FBQUEsVUFDdEI7QUFBQSxRQUNKLENBQUM7QUFDRCx1QkFBZTtBQUFBLE1BQ25CLE9BQU87QUFDSCxjQUFNQSxTQUFRLGlEQUFpRDtBQUFBLFVBQzNEO0FBQUEsUUFDSixDQUFDO0FBQ0QsZUFBTztBQUFBLFVBQ0gsUUFBUTtBQUFBLFVBQ1IsUUFBUTtBQUFBLFFBQ1o7QUFBQSxNQUNKO0FBQ0EsWUFBTSxpQkFBaUIsdUJBQXVCLG9CQUFvQixZQUFZO0FBQzlFLFlBQU0sU0FBUyxNQUFNLCtCQUErQjtBQUFBLFFBQ2hEO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0EsU0FBUyxRQUFRLFdBQVc7QUFBQSxRQUM1QjtBQUFBLE1BQ0osQ0FBQztBQUNELG1CQUFhLE9BQU87QUFFcEIsVUFBSSxhQUFhLE9BQU8saUJBQWlCLFdBQVcsV0FBVyxXQUFXO0FBQ3RFLGNBQU1BLFNBQVEscUNBQXFDO0FBQUEsVUFDL0M7QUFBQSxVQUNBLGNBQWMsV0FBVztBQUFBLFVBQ3pCLFFBQVEsV0FBVztBQUFBLFFBQ3ZCLENBQUM7QUFDRCxlQUFPO0FBQUEsVUFDSCxRQUFRO0FBQUEsVUFDUixjQUFjLFdBQVc7QUFBQSxRQUM3QjtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQ0EsVUFBTUEsU0FBUSwrQkFBK0I7QUFBQSxNQUN6QztBQUFBLE1BQ0EsY0FBYyxXQUFXO0FBQUEsTUFDekIsY0FBYyxXQUFXO0FBQUEsSUFDN0IsQ0FBQztBQUVELFVBQU0sVUFBVSxNQUFNLHlCQUF5QixXQUFXLFlBQVk7QUFDdEUsVUFBTUEsU0FBUSxpQ0FBaUM7QUFBQSxNQUMzQztBQUFBLE1BQ0EsY0FBYyxXQUFXO0FBQUEsTUFDekIsY0FBYyxXQUFXO0FBQUEsTUFDekI7QUFBQSxJQUNKLENBQUM7QUFDRCxVQUFNLE1BQU0sT0FBTztBQUVuQixVQUFNLGlCQUFpQixNQUFNLHdCQUF3QjtBQUFBLE1BQ2pEO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0osQ0FBQztBQUNELFFBQUksQ0FBQyxlQUFlLGtCQUFrQixDQUFDLGVBQWUsU0FBUztBQUMzRCxZQUFNQSxTQUFRLG1EQUFtRDtBQUFBLFFBQzdEO0FBQUEsUUFDQSxRQUFRLGVBQWU7QUFBQSxNQUMzQixDQUFDO0FBQ0QsYUFBTztBQUFBLFFBQ0gsUUFBUTtBQUFBLFFBQ1IsUUFBUSxlQUFlO0FBQUEsTUFDM0I7QUFBQSxJQUNKO0FBRUEsVUFBTSxpQkFBaUIsZUFBZTtBQUV0QyxVQUFNLGNBQWMsTUFBTSw2QkFBNkI7QUFBQSxNQUNuRDtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0EsY0FBYyxXQUFXO0FBQUEsSUFDN0IsQ0FBQztBQUNELFFBQUksWUFBWSxXQUFXO0FBQ3ZCLFlBQU1BLFNBQVEsOENBQThDO0FBQUEsUUFDeEQ7QUFBQSxRQUNBLGNBQWMsV0FBVztBQUFBLE1BQzdCLENBQUM7QUFDRDtBQUFBLElBQ0o7QUFFQSxRQUFJLGdCQUFnQixXQUFXO0FBQy9CLFFBQUksWUFBWTtBQUNoQixVQUFNLGNBQWMsZUFBZSxhQUFhO0FBQ2hELFdBQU0saUJBQWlCLGFBQVk7QUFDL0IsWUFBTSxjQUFjLE1BQU0sNkJBQTZCO0FBQUEsUUFDbkQ7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBLGNBQWMsV0FBVztBQUFBLE1BQzdCLENBQUM7QUFDRCxVQUFJLFlBQVksV0FBVztBQUN2QixjQUFNQSxTQUFRLDBDQUEwQztBQUFBLFVBQ3BEO0FBQUEsVUFDQSxjQUFjLFdBQVc7QUFBQSxRQUM3QixDQUFDO0FBQ0Q7QUFBQSxNQUNKO0FBRUEsWUFBTSxnQkFBZ0I7QUFBQSxRQUNsQjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0EsY0FBYyxXQUFXO0FBQUEsTUFDN0IsQ0FBQztBQUNELFlBQU0sU0FBUyxNQUFNLDRCQUE0QjtBQUFBLFFBQzdDO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQSxjQUFjLFdBQVc7QUFBQSxRQUN6QixpQkFBaUIsZUFBZTtBQUFBLFFBQ2hDLFNBQVMsZUFBZSxXQUFXO0FBQUEsUUFDbkMsZ0JBQWdCLGVBQWU7QUFBQSxNQUNuQyxDQUFDO0FBRUQsVUFBSSxPQUFPLGdCQUFnQjtBQUN2QixjQUFNLHNCQUFzQjtBQUFBLFVBQ3hCO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQSxjQUFjLFdBQVc7QUFBQSxVQUN6QixnQkFBZ0IsT0FBTztBQUFBLFFBQzNCLENBQUM7QUFBQSxNQUNMO0FBQ0EsVUFBSSxPQUFPLFNBQVM7QUFDaEIsY0FBTSxrQkFBa0I7QUFBQSxVQUNwQjtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFVBQ0EsY0FBYyxXQUFXO0FBQUEsUUFDN0IsQ0FBQztBQUNELGNBQU1BLFNBQVEseUNBQXlDO0FBQUEsVUFDbkQ7QUFBQSxVQUNBLGNBQWMsV0FBVztBQUFBLFVBQ3pCLGdCQUFnQixPQUFPO0FBQUEsUUFDM0IsQ0FBQztBQUNELG9CQUFZO0FBQ1o7QUFBQSxNQUNKO0FBQ0Esa0JBQVksT0FBTyxTQUFTO0FBQzVCLFlBQU1BLFNBQVEsc0NBQXNDO0FBQUEsUUFDaEQ7QUFBQSxRQUNBLGNBQWMsV0FBVztBQUFBLFFBQ3pCO0FBQUEsUUFDQSxPQUFPO0FBQUEsTUFDWCxDQUFDO0FBQ0QsVUFBSSxnQkFBZ0IsYUFBYTtBQUM3QixjQUFNLHFCQUFxQjtBQUFBLFVBQ3ZCO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQSxjQUFjLFdBQVc7QUFBQSxVQUN6QixnQkFBZ0I7QUFBQSxRQUNwQixDQUFDO0FBQ0Q7QUFDQSxjQUFNLFNBQVMsS0FBSyxPQUFPLElBQUk7QUFDL0IsY0FBTSxNQUFNLGVBQWUsb0JBQW9CLE9BQVEsSUFBSSxPQUFPO0FBQUEsTUFDdEUsT0FBTztBQUNIO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFFQSxRQUFJLFdBQVc7QUFDWCxZQUFNLGVBQWU7QUFBQSxRQUNqQjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0EsY0FBYyxXQUFXO0FBQUEsTUFDN0IsQ0FBQztBQUFBLElBQ0w7QUFFQSx1QkFBbUIsV0FBVztBQUU5QixRQUFJLFdBQVc7QUFDWCxhQUFPO0FBQUEsUUFDSCxRQUFRLFlBQVksV0FBVztBQUFBLFFBQy9CLGNBQWMsV0FBVztBQUFBLE1BQzdCO0FBQUEsSUFDSjtBQUFBLEVBRUo7QUFDSjtBQTNQbUI7QUE0UG5CLGdDQUFnQyxhQUFhO0FBQzdDLFdBQVcsb0JBQW9CLElBQUksMEdBQTBHLCtCQUErQjtBQUVySyxJQUFNLGlDQUFpQyxPQUFPLE9BQU8saUNBQWlDO0FBQUEsRUFDekYsWUFBWTtBQUNoQixDQUFDOyIsCiAgIm5hbWVzIjogWyJtb2R1bGUiLCAibXMiLCAiZXhlY3V0ZUV2YWx1YXRvclN0ZXAiLCAibG9nU3RlcCIsICJsb2dTdGVwIiwgImxvZ1N0ZXAiXQp9Cg==
|
|
50544
50544
|
`;
|
|
50545
50545
|
var POST = workflowEntrypoint(workflowCode);
|
|
50546
50546
|
// Annotate the CommonJS export names for ESM import in node:
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"workflowFiles": [
|
|
3
3
|
"/home/runner/work/agents/agents/agents-api/src/domains/evals/workflow/functions/runDatasetItem.ts",
|
|
4
|
-
"/home/runner/work/agents/agents/agents-api/src/domains/
|
|
5
|
-
"/home/runner/work/agents/agents/agents-api/src/domains/
|
|
4
|
+
"/home/runner/work/agents/agents/agents-api/src/domains/evals/workflow/functions/evaluateConversation.ts",
|
|
5
|
+
"/home/runner/work/agents/agents/agents-api/src/domains/run/workflow/functions/scheduledTriggerRunner.ts"
|
|
6
6
|
],
|
|
7
7
|
"serdeOnlyFiles": []
|
|
8
8
|
}
|
|
@@ -17,20 +17,6 @@
|
|
|
17
17
|
"stepId": "step//workflow@4.1.0-beta.54//fetch"
|
|
18
18
|
}
|
|
19
19
|
},
|
|
20
|
-
"src/domains/evals/workflow/functions/runDatasetItem.ts": {
|
|
21
|
-
"callChatApiStep": {
|
|
22
|
-
"stepId": "step//./src/domains/evals/workflow/functions/runDatasetItem//callChatApiStep"
|
|
23
|
-
},
|
|
24
|
-
"createRelationStep": {
|
|
25
|
-
"stepId": "step//./src/domains/evals/workflow/functions/runDatasetItem//createRelationStep"
|
|
26
|
-
},
|
|
27
|
-
"executeEvaluatorStep": {
|
|
28
|
-
"stepId": "step//./src/domains/evals/workflow/functions/runDatasetItem//executeEvaluatorStep"
|
|
29
|
-
},
|
|
30
|
-
"logStep": {
|
|
31
|
-
"stepId": "step//./src/domains/evals/workflow/functions/runDatasetItem//logStep"
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
20
|
"src/domains/evals/workflow/functions/evaluateConversation.ts": {
|
|
35
21
|
"executeEvaluatorStep": {
|
|
36
22
|
"stepId": "step//./src/domains/evals/workflow/functions/evaluateConversation//executeEvaluatorStep"
|
|
@@ -45,6 +31,20 @@
|
|
|
45
31
|
"stepId": "step//./src/domains/evals/workflow/functions/evaluateConversation//logStep"
|
|
46
32
|
}
|
|
47
33
|
},
|
|
34
|
+
"src/domains/evals/workflow/functions/runDatasetItem.ts": {
|
|
35
|
+
"callChatApiStep": {
|
|
36
|
+
"stepId": "step//./src/domains/evals/workflow/functions/runDatasetItem//callChatApiStep"
|
|
37
|
+
},
|
|
38
|
+
"createRelationStep": {
|
|
39
|
+
"stepId": "step//./src/domains/evals/workflow/functions/runDatasetItem//createRelationStep"
|
|
40
|
+
},
|
|
41
|
+
"executeEvaluatorStep": {
|
|
42
|
+
"stepId": "step//./src/domains/evals/workflow/functions/runDatasetItem//executeEvaluatorStep"
|
|
43
|
+
},
|
|
44
|
+
"logStep": {
|
|
45
|
+
"stepId": "step//./src/domains/evals/workflow/functions/runDatasetItem//logStep"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
48
|
"src/domains/run/workflow/steps/scheduledTriggerSteps.ts": {
|
|
49
49
|
"addConversationIdStep": {
|
|
50
50
|
"stepId": "step//./src/domains/run/workflow/steps/scheduledTriggerSteps//addConversationIdStep"
|
|
@@ -91,18 +91,18 @@
|
|
|
91
91
|
}
|
|
92
92
|
},
|
|
93
93
|
"workflows": {
|
|
94
|
-
"src/domains/evals/workflow/functions/
|
|
95
|
-
"
|
|
96
|
-
"workflowId": "workflow//./src/domains/evals/workflow/functions/
|
|
94
|
+
"src/domains/evals/workflow/functions/evaluateConversation.ts": {
|
|
95
|
+
"_evaluateConversationWorkflow": {
|
|
96
|
+
"workflowId": "workflow//./src/domains/evals/workflow/functions/evaluateConversation//_evaluateConversationWorkflow",
|
|
97
97
|
"graph": {
|
|
98
98
|
"nodes": [],
|
|
99
99
|
"edges": []
|
|
100
100
|
}
|
|
101
101
|
}
|
|
102
102
|
},
|
|
103
|
-
"src/domains/evals/workflow/functions/
|
|
104
|
-
"
|
|
105
|
-
"workflowId": "workflow//./src/domains/evals/workflow/functions/
|
|
103
|
+
"src/domains/evals/workflow/functions/runDatasetItem.ts": {
|
|
104
|
+
"_runDatasetItemWorkflow": {
|
|
105
|
+
"workflowId": "workflow//./src/domains/evals/workflow/functions/runDatasetItem//_runDatasetItemWorkflow",
|
|
106
106
|
"graph": {
|
|
107
107
|
"nodes": [],
|
|
108
108
|
"edges": []
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
],
|
|
8
8
|
"workflowFiles": [
|
|
9
9
|
"/home/runner/work/agents/agents/agents-api/src/domains/evals/workflow/functions/runDatasetItem.ts",
|
|
10
|
-
"/home/runner/work/agents/agents/agents-api/src/domains/
|
|
11
|
-
"/home/runner/work/agents/agents/agents-api/src/domains/
|
|
10
|
+
"/home/runner/work/agents/agents/agents-api/src/domains/evals/workflow/functions/evaluateConversation.ts",
|
|
11
|
+
"/home/runner/work/agents/agents/agents-api/src/domains/run/workflow/functions/scheduledTriggerRunner.ts"
|
|
12
12
|
],
|
|
13
13
|
"serdeOnlyFiles": []
|
|
14
14
|
}
|
package/dist/createApp.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { AppConfig } from "./types/app.js";
|
|
2
2
|
import "./types/index.js";
|
|
3
3
|
import { Hono } from "hono";
|
|
4
|
-
import * as
|
|
4
|
+
import * as hono_types0 from "hono/types";
|
|
5
5
|
|
|
6
6
|
//#region src/createApp.d.ts
|
|
7
7
|
declare const isWebhookRoute: (path: string) => boolean;
|
|
8
|
-
declare function createAgentsHono(config: AppConfig): Hono<
|
|
8
|
+
declare function createAgentsHono(config: AppConfig): Hono<hono_types0.BlankEnv, hono_types0.BlankSchema, "/">;
|
|
9
9
|
//#endregion
|
|
10
10
|
export { createAgentsHono, isWebhookRoute };
|
package/dist/createApp.js
CHANGED
|
@@ -48,6 +48,28 @@ function createAgentsHono(config) {
|
|
|
48
48
|
app.use("*", requestId());
|
|
49
49
|
if (auth) {
|
|
50
50
|
app.use("/api/auth/*", cors(authCorsConfig));
|
|
51
|
+
if (env.ENVIRONMENT === "development") app.post("/api/auth/dev-session", async (c) => {
|
|
52
|
+
const email = env.INKEEP_AGENTS_MANAGE_UI_USERNAME;
|
|
53
|
+
if (!email) return c.json({ error: "Dev credentials not configured. Run pnpm db:auth:init first." }, 400);
|
|
54
|
+
const ctx = await auth.$context;
|
|
55
|
+
const found = await ctx.internalAdapter.findUserByEmail(email);
|
|
56
|
+
if (!found) return c.json({ error: "Dev user not found. Run pnpm db:auth:init first." }, 400);
|
|
57
|
+
const session = await ctx.internalAdapter.createSession(found.user.id);
|
|
58
|
+
const key = await crypto.subtle.importKey("raw", new TextEncoder().encode(ctx.secret), {
|
|
59
|
+
name: "HMAC",
|
|
60
|
+
hash: "SHA-256"
|
|
61
|
+
}, false, ["sign"]);
|
|
62
|
+
const sig = await crypto.subtle.sign("HMAC", key, new TextEncoder().encode(session.token));
|
|
63
|
+
const base64Sig = btoa(String.fromCharCode(...new Uint8Array(sig)));
|
|
64
|
+
const encodedValue = encodeURIComponent(`${session.token}.${base64Sig}`);
|
|
65
|
+
const { name: cookieName, options } = ctx.authCookies.sessionToken;
|
|
66
|
+
const { path, httpOnly, secure, sameSite = "lax" } = options;
|
|
67
|
+
const maxAge = ctx.sessionConfig.expiresIn;
|
|
68
|
+
const sameSiteValue = sameSite.charAt(0).toUpperCase() + sameSite.slice(1);
|
|
69
|
+
const cookieString = `${cookieName}=${encodedValue}; Path=${path}; Max-Age=${maxAge}${httpOnly ? "; HttpOnly" : ""}${secure ? "; Secure" : ""}; SameSite=${sameSiteValue}`;
|
|
70
|
+
c.header("set-cookie", cookieString);
|
|
71
|
+
return c.json({ ok: true });
|
|
72
|
+
});
|
|
51
73
|
app.on(["POST", "GET"], "/api/auth/*", (c) => {
|
|
52
74
|
return auth.handler(c.req.raw);
|
|
53
75
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as _inkeep_agents_core1 from "@inkeep/agents-core";
|
|
2
2
|
|
|
3
3
|
//#region src/data/db/manageDbClient.d.ts
|
|
4
|
-
declare const manageDbClient:
|
|
4
|
+
declare const manageDbClient: _inkeep_agents_core1.AgentsManageDatabaseClient;
|
|
5
5
|
//#endregion
|
|
6
6
|
export { manageDbClient as default };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as _inkeep_agents_core2 from "@inkeep/agents-core";
|
|
2
2
|
|
|
3
3
|
//#region src/data/db/runDbClient.d.ts
|
|
4
|
-
declare const runDbClient:
|
|
4
|
+
declare const runDbClient: _inkeep_agents_core2.AgentsRunDatabaseClient;
|
|
5
5
|
//#endregion
|
|
6
6
|
export { runDbClient as default };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { OpenAPIHono } from "@hono/zod-openapi";
|
|
2
|
-
import * as
|
|
2
|
+
import * as hono17 from "hono";
|
|
3
3
|
|
|
4
4
|
//#region src/domains/evals/routes/datasetTriggers.d.ts
|
|
5
|
-
declare const app: OpenAPIHono<
|
|
5
|
+
declare const app: OpenAPIHono<hono17.Env, {}, "/">;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { app as default };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { OpenAPIHono } from "@hono/zod-openapi";
|
|
2
|
-
import * as
|
|
2
|
+
import * as hono0 from "hono";
|
|
3
3
|
|
|
4
4
|
//#region src/domains/evals/routes/index.d.ts
|
|
5
|
-
declare const app: OpenAPIHono<
|
|
5
|
+
declare const app: OpenAPIHono<hono0.Env, {}, "/">;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { app as default };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
|
-
import * as
|
|
2
|
+
import * as hono_types4 from "hono/types";
|
|
3
3
|
|
|
4
4
|
//#region src/domains/evals/workflow/routes.d.ts
|
|
5
|
-
declare const workflowRoutes: Hono<
|
|
5
|
+
declare const workflowRoutes: Hono<hono_types4.BlankEnv, hono_types4.BlankSchema, "/">;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { workflowRoutes };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { OpenAPIHono } from "@hono/zod-openapi";
|
|
2
|
-
import * as
|
|
2
|
+
import * as hono6 from "hono";
|
|
3
3
|
|
|
4
4
|
//#region src/domains/manage/routes/availableAgents.d.ts
|
|
5
|
-
declare const app: OpenAPIHono<
|
|
5
|
+
declare const app: OpenAPIHono<hono6.Env, {}, "/">;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { app as default };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { OpenAPIHono } from "@hono/zod-openapi";
|
|
2
|
-
import * as
|
|
2
|
+
import * as hono0 from "hono";
|
|
3
3
|
|
|
4
4
|
//#region src/domains/manage/routes/conversations.d.ts
|
|
5
|
-
declare const app: OpenAPIHono<
|
|
5
|
+
declare const app: OpenAPIHono<hono0.Env, {}, "/">;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { app as default };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { OpenAPIHono } from "@hono/zod-openapi";
|
|
2
|
-
import * as
|
|
2
|
+
import * as hono18 from "hono";
|
|
3
3
|
|
|
4
4
|
//#region src/domains/manage/routes/index.d.ts
|
|
5
|
-
declare const app: OpenAPIHono<
|
|
5
|
+
declare const app: OpenAPIHono<hono18.Env, {}, "/">;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { app as default };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
|
-
import * as
|
|
2
|
+
import * as hono_types12 from "hono/types";
|
|
3
3
|
|
|
4
4
|
//#region src/domains/manage/routes/mcp.d.ts
|
|
5
|
-
declare const app: Hono<
|
|
5
|
+
declare const app: Hono<hono_types12.BlankEnv, hono_types12.BlankSchema, "/">;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { app as default };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { ManageAppVariables } from "../../../types/app.js";
|
|
2
2
|
import { Hono } from "hono";
|
|
3
|
-
import * as
|
|
3
|
+
import * as hono_types14 from "hono/types";
|
|
4
4
|
|
|
5
5
|
//#region src/domains/manage/routes/passwordResetLinks.d.ts
|
|
6
6
|
declare const passwordResetLinksRoutes: Hono<{
|
|
7
7
|
Variables: ManageAppVariables;
|
|
8
|
-
},
|
|
8
|
+
}, hono_types14.BlankSchema, "/">;
|
|
9
9
|
//#endregion
|
|
10
10
|
export { passwordResetLinksRoutes as default };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { ManageAppVariables } from "../../../types/app.js";
|
|
2
2
|
import { Hono } from "hono";
|
|
3
|
-
import * as
|
|
3
|
+
import * as hono_types3 from "hono/types";
|
|
4
4
|
|
|
5
5
|
//#region src/domains/manage/routes/signoz.d.ts
|
|
6
6
|
declare const app: Hono<{
|
|
7
7
|
Variables: ManageAppVariables;
|
|
8
|
-
},
|
|
8
|
+
}, hono_types3.BlankSchema, "/">;
|
|
9
9
|
//#endregion
|
|
10
10
|
export { app as default };
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { ManageAppVariables } from "../../../types/app.js";
|
|
2
2
|
import { Hono } from "hono";
|
|
3
|
-
import * as
|
|
3
|
+
import * as hono_types10 from "hono/types";
|
|
4
4
|
|
|
5
5
|
//#region src/domains/manage/routes/users.d.ts
|
|
6
6
|
declare const usersRoutes: Hono<{
|
|
7
7
|
Variables: ManageAppVariables;
|
|
8
|
-
},
|
|
8
|
+
}, hono_types10.BlankSchema, "/">;
|
|
9
9
|
//#endregion
|
|
10
10
|
export { usersRoutes as default };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Hono } from "hono";
|
|
2
|
-
import * as
|
|
2
|
+
import * as hono_types6 from "hono/types";
|
|
3
3
|
|
|
4
4
|
//#region src/domains/mcp/routes/mcp.d.ts
|
|
5
|
-
declare const app: Hono<
|
|
5
|
+
declare const app: Hono<hono_types6.BlankEnv, hono_types6.BlankSchema, "/">;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { app as default };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { AgentConfig, DelegateRelation } from "./Agent.js";
|
|
2
2
|
import { InternalRelation } from "../utils/project.js";
|
|
3
|
-
import * as
|
|
3
|
+
import * as _inkeep_agents_core0 from "@inkeep/agents-core";
|
|
4
4
|
import { CredentialStoreRegistry, FullExecutionContext } from "@inkeep/agents-core";
|
|
5
5
|
import * as ai0 from "ai";
|
|
6
6
|
|
|
@@ -44,7 +44,7 @@ declare function createDelegateToAgentTool({
|
|
|
44
44
|
message: string;
|
|
45
45
|
}, {
|
|
46
46
|
toolCallId: any;
|
|
47
|
-
result:
|
|
47
|
+
result: _inkeep_agents_core0.Message | _inkeep_agents_core0.Task;
|
|
48
48
|
}>;
|
|
49
49
|
/**
|
|
50
50
|
* Parameters for building a transfer relation config
|
|
@@ -32,9 +32,9 @@ declare const ConversationHistorySummarySchema: z.ZodObject<{
|
|
|
32
32
|
tool_call_id: z.ZodString;
|
|
33
33
|
content_summary: z.ZodString;
|
|
34
34
|
relevance: z.ZodEnum<{
|
|
35
|
-
low: "low";
|
|
36
35
|
high: "high";
|
|
37
36
|
medium: "medium";
|
|
37
|
+
low: "low";
|
|
38
38
|
}>;
|
|
39
39
|
}, z.core.$strip>>>;
|
|
40
40
|
conversation_flow: z.ZodObject<{
|
|
@@ -9,9 +9,9 @@ declare const ImageUrlSchema: z.ZodUnion<readonly [z.ZodURL, z.ZodString]>;
|
|
|
9
9
|
/** OpenAI-specific image detail level. Has no effect on other providers. */
|
|
10
10
|
declare const ImageDetailEnum: readonly ["auto", "low", "high"];
|
|
11
11
|
declare const ImageDetailSchema: z.ZodEnum<{
|
|
12
|
-
auto: "auto";
|
|
13
|
-
low: "low";
|
|
14
12
|
high: "high";
|
|
13
|
+
low: "low";
|
|
14
|
+
auto: "auto";
|
|
15
15
|
}>;
|
|
16
16
|
type ImageDetail = z.infer<typeof ImageDetailSchema>;
|
|
17
17
|
declare const ImageContentItemSchema: z.ZodObject<{
|
|
@@ -19,9 +19,9 @@ declare const ImageContentItemSchema: z.ZodObject<{
|
|
|
19
19
|
image_url: z.ZodObject<{
|
|
20
20
|
url: z.ZodUnion<readonly [z.ZodURL, z.ZodString]>;
|
|
21
21
|
detail: z.ZodOptional<z.ZodEnum<{
|
|
22
|
-
auto: "auto";
|
|
23
|
-
low: "low";
|
|
24
22
|
high: "high";
|
|
23
|
+
low: "low";
|
|
24
|
+
auto: "auto";
|
|
25
25
|
}>>;
|
|
26
26
|
}, z.core.$strip>;
|
|
27
27
|
}, z.core.$strip>;
|
|
@@ -105,7 +105,7 @@ declare function createInvocationIdempotentStep(params: {
|
|
|
105
105
|
projectId: string;
|
|
106
106
|
tenantId: string;
|
|
107
107
|
id: string;
|
|
108
|
-
status: "pending" | "
|
|
108
|
+
status: "pending" | "completed" | "failed" | "running" | "cancelled";
|
|
109
109
|
resolvedPayload?: Record<string, unknown> | null | undefined;
|
|
110
110
|
};
|
|
111
111
|
alreadyExists: boolean;
|
|
@@ -145,7 +145,7 @@ declare function markRunningStep(params: {
|
|
|
145
145
|
projectId: string;
|
|
146
146
|
tenantId: string;
|
|
147
147
|
id: string;
|
|
148
|
-
status: "pending" | "
|
|
148
|
+
status: "pending" | "completed" | "failed" | "running" | "cancelled";
|
|
149
149
|
resolvedPayload?: Record<string, unknown> | null | undefined;
|
|
150
150
|
}>;
|
|
151
151
|
/**
|
|
@@ -172,7 +172,7 @@ declare function addConversationIdStep(params: {
|
|
|
172
172
|
projectId: string;
|
|
173
173
|
tenantId: string;
|
|
174
174
|
id: string;
|
|
175
|
-
status: "pending" | "
|
|
175
|
+
status: "pending" | "completed" | "failed" | "running" | "cancelled";
|
|
176
176
|
resolvedPayload?: Record<string, unknown> | null | undefined;
|
|
177
177
|
} | undefined>;
|
|
178
178
|
/**
|
|
@@ -197,7 +197,7 @@ declare function markCompletedStep(params: {
|
|
|
197
197
|
projectId: string;
|
|
198
198
|
tenantId: string;
|
|
199
199
|
id: string;
|
|
200
|
-
status: "pending" | "
|
|
200
|
+
status: "pending" | "completed" | "failed" | "running" | "cancelled";
|
|
201
201
|
resolvedPayload?: Record<string, unknown> | null | undefined;
|
|
202
202
|
} | undefined>;
|
|
203
203
|
/**
|
|
@@ -222,7 +222,7 @@ declare function markFailedStep(params: {
|
|
|
222
222
|
projectId: string;
|
|
223
223
|
tenantId: string;
|
|
224
224
|
id: string;
|
|
225
|
-
status: "pending" | "
|
|
225
|
+
status: "pending" | "completed" | "failed" | "running" | "cancelled";
|
|
226
226
|
resolvedPayload?: Record<string, unknown> | null | undefined;
|
|
227
227
|
} | undefined>;
|
|
228
228
|
/**
|
package/dist/env.d.ts
CHANGED
|
@@ -14,11 +14,11 @@ declare const envSchema: z.ZodObject<{
|
|
|
14
14
|
pentest: "pentest";
|
|
15
15
|
}>>;
|
|
16
16
|
LOG_LEVEL: z.ZodDefault<z.ZodEnum<{
|
|
17
|
-
error: "error";
|
|
18
17
|
trace: "trace";
|
|
19
18
|
debug: "debug";
|
|
20
19
|
info: "info";
|
|
21
20
|
warn: "warn";
|
|
21
|
+
error: "error";
|
|
22
22
|
}>>;
|
|
23
23
|
INKEEP_AGENTS_MANAGE_DATABASE_URL: z.ZodString;
|
|
24
24
|
INKEEP_AGENTS_RUN_DATABASE_URL: z.ZodString;
|
|
@@ -59,7 +59,7 @@ declare const envSchema: z.ZodObject<{
|
|
|
59
59
|
declare const env: {
|
|
60
60
|
NODE_ENV: "development" | "production" | "test";
|
|
61
61
|
ENVIRONMENT: "development" | "production" | "test" | "pentest";
|
|
62
|
-
LOG_LEVEL: "
|
|
62
|
+
LOG_LEVEL: "trace" | "debug" | "info" | "warn" | "error";
|
|
63
63
|
INKEEP_AGENTS_MANAGE_DATABASE_URL: string;
|
|
64
64
|
INKEEP_AGENTS_RUN_DATABASE_URL: string;
|
|
65
65
|
INKEEP_AGENTS_API_URL: string;
|
package/dist/factory.d.ts
CHANGED
|
@@ -3,10 +3,10 @@ import "./types/index.js";
|
|
|
3
3
|
import { createAgentsHono } from "./createApp.js";
|
|
4
4
|
import { createAuth0Provider, createOIDCProvider } from "./ssoHelpers.js";
|
|
5
5
|
import { CredentialStore, ServerConfig } from "@inkeep/agents-core";
|
|
6
|
-
import * as
|
|
6
|
+
import * as hono1 from "hono";
|
|
7
7
|
import * as zod0 from "zod";
|
|
8
8
|
import { SSOProviderConfig, UserAuthConfig } from "@inkeep/agents-core/auth";
|
|
9
|
-
import * as
|
|
9
|
+
import * as hono_types1 from "hono/types";
|
|
10
10
|
import * as better_auth0 from "better-auth";
|
|
11
11
|
import * as better_auth_plugins0 from "better-auth/plugins";
|
|
12
12
|
import * as _better_auth_sso0 from "@better-auth/sso";
|
|
@@ -1570,6 +1570,6 @@ declare function createAgentsApp(config?: {
|
|
|
1570
1570
|
credentialStores?: CredentialStore[];
|
|
1571
1571
|
auth?: UserAuthConfig;
|
|
1572
1572
|
sandboxConfig?: SandboxConfig;
|
|
1573
|
-
}):
|
|
1573
|
+
}): hono1.Hono<hono_types1.BlankEnv, hono_types1.BlankSchema, "/">;
|
|
1574
1574
|
//#endregion
|
|
1575
1575
|
export { type SSOProviderConfig, type UserAuthConfig, createAgentsApp, createAgentsAuth, createAgentsHono, createAuth0Provider, createOIDCProvider };
|
package/dist/index.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ import { createAuth0Provider, createOIDCProvider } from "./ssoHelpers.js";
|
|
|
7
7
|
import { SSOProviderConfig, UserAuthConfig, createAgentsApp } from "./factory.js";
|
|
8
8
|
import { Hono } from "hono";
|
|
9
9
|
import * as zod205 from "zod";
|
|
10
|
-
import * as
|
|
10
|
+
import * as hono_types8 from "hono/types";
|
|
11
11
|
import * as better_auth79 from "better-auth";
|
|
12
12
|
import * as better_auth_plugins69 from "better-auth/plugins";
|
|
13
13
|
import * as _better_auth_sso10 from "@better-auth/sso";
|
|
@@ -1566,6 +1566,6 @@ declare const auth: better_auth79.Auth<{
|
|
|
1566
1566
|
}>;
|
|
1567
1567
|
}];
|
|
1568
1568
|
}>;
|
|
1569
|
-
declare const app: Hono<
|
|
1569
|
+
declare const app: Hono<hono_types8.BlankEnv, hono_types8.BlankSchema, "/">;
|
|
1570
1570
|
//#endregion
|
|
1571
1571
|
export { type AppConfig, type AppVariables, Hono, type NativeSandboxConfig, type SSOProviderConfig, type SandboxConfig, type UserAuthConfig, type VercelSandboxConfig, auth, createAgentsApp, createAgentsHono, createAuth0Provider, createOIDCProvider, app as default };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BaseExecutionContext } from "@inkeep/agents-core";
|
|
2
|
-
import * as
|
|
2
|
+
import * as hono3 from "hono";
|
|
3
3
|
|
|
4
4
|
//#region src/middleware/evalsAuth.d.ts
|
|
5
5
|
|
|
@@ -7,7 +7,7 @@ import * as hono5 from "hono";
|
|
|
7
7
|
* Middleware to authenticate API requests using Bearer token authentication
|
|
8
8
|
* First checks if token matches INKEEP_AGENTS_EVAL_API_BYPASS_SECRET,
|
|
9
9
|
*/
|
|
10
|
-
declare const evalApiKeyAuth: () =>
|
|
10
|
+
declare const evalApiKeyAuth: () => hono3.MiddlewareHandler<{
|
|
11
11
|
Variables: {
|
|
12
12
|
executionContext: BaseExecutionContext;
|
|
13
13
|
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BaseExecutionContext } from "@inkeep/agents-core";
|
|
2
|
-
import * as
|
|
2
|
+
import * as hono7 from "hono";
|
|
3
3
|
import { createAuth } from "@inkeep/agents-core/auth";
|
|
4
4
|
|
|
5
5
|
//#region src/middleware/manageAuth.d.ts
|
|
@@ -12,7 +12,7 @@ import { createAuth } from "@inkeep/agents-core/auth";
|
|
|
12
12
|
* 3. Database API key
|
|
13
13
|
* 4. Internal service token
|
|
14
14
|
*/
|
|
15
|
-
declare const manageApiKeyAuth: () =>
|
|
15
|
+
declare const manageApiKeyAuth: () => hono7.MiddlewareHandler<{
|
|
16
16
|
Variables: {
|
|
17
17
|
executionContext: BaseExecutionContext;
|
|
18
18
|
userId?: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ManageAppVariables } from "../types/app.js";
|
|
2
2
|
import { ProjectPermissionLevel } from "@inkeep/agents-core";
|
|
3
|
-
import * as
|
|
3
|
+
import * as hono2 from "hono";
|
|
4
4
|
|
|
5
5
|
//#region src/middleware/projectAccess.d.ts
|
|
6
6
|
/**
|
|
@@ -10,6 +10,6 @@ declare const requireProjectPermission: <Env$1 extends {
|
|
|
10
10
|
Variables: ManageAppVariables;
|
|
11
11
|
} = {
|
|
12
12
|
Variables: ManageAppVariables;
|
|
13
|
-
}>(permission?: ProjectPermissionLevel) =>
|
|
13
|
+
}>(permission?: ProjectPermissionLevel) => hono2.MiddlewareHandler<Env$1, string, {}, Response>;
|
|
14
14
|
//#endregion
|
|
15
15
|
export { requireProjectPermission };
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { BaseExecutionContext, ResolvedRef } from "@inkeep/agents-core";
|
|
2
|
-
import * as
|
|
2
|
+
import * as hono4 from "hono";
|
|
3
3
|
|
|
4
4
|
//#region src/middleware/projectConfig.d.ts
|
|
5
5
|
/**
|
|
6
6
|
* Middleware that fetches the full project definition from the Management API
|
|
7
7
|
*/
|
|
8
|
-
declare const projectConfigMiddleware:
|
|
8
|
+
declare const projectConfigMiddleware: hono4.MiddlewareHandler<{
|
|
9
9
|
Variables: {
|
|
10
10
|
executionContext: BaseExecutionContext;
|
|
11
11
|
resolvedRef: ResolvedRef;
|
|
@@ -15,7 +15,7 @@ declare const projectConfigMiddleware: hono7.MiddlewareHandler<{
|
|
|
15
15
|
* Creates a middleware that applies project config fetching except for specified route patterns
|
|
16
16
|
* @param skipRouteCheck - Function that returns true if the route should skip the middleware
|
|
17
17
|
*/
|
|
18
|
-
declare const projectConfigMiddlewareExcept: (skipRouteCheck: (path: string) => boolean) =>
|
|
18
|
+
declare const projectConfigMiddlewareExcept: (skipRouteCheck: (path: string) => boolean) => hono4.MiddlewareHandler<{
|
|
19
19
|
Variables: {
|
|
20
20
|
executionContext: BaseExecutionContext;
|
|
21
21
|
resolvedRef: ResolvedRef;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ManageAppVariables } from "../types/app.js";
|
|
2
|
-
import * as
|
|
2
|
+
import * as hono14 from "hono";
|
|
3
3
|
|
|
4
4
|
//#region src/middleware/requirePermission.d.ts
|
|
5
5
|
type Permission = {
|
|
@@ -9,6 +9,6 @@ declare const requirePermission: <Env$1 extends {
|
|
|
9
9
|
Variables: ManageAppVariables;
|
|
10
10
|
} = {
|
|
11
11
|
Variables: ManageAppVariables;
|
|
12
|
-
}>(permissions: Permission) =>
|
|
12
|
+
}>(permissions: Permission) => hono14.MiddlewareHandler<Env$1, string, {}, Response>;
|
|
13
13
|
//#endregion
|
|
14
14
|
export { requirePermission };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { BaseExecutionContext } from "@inkeep/agents-core";
|
|
2
|
-
import * as
|
|
2
|
+
import * as hono8 from "hono";
|
|
3
3
|
|
|
4
4
|
//#region src/middleware/runAuth.d.ts
|
|
5
|
-
declare const runApiKeyAuth: () =>
|
|
5
|
+
declare const runApiKeyAuth: () => hono8.MiddlewareHandler<{
|
|
6
6
|
Variables: {
|
|
7
7
|
executionContext: BaseExecutionContext;
|
|
8
8
|
};
|
|
@@ -11,7 +11,7 @@ declare const runApiKeyAuth: () => hono10.MiddlewareHandler<{
|
|
|
11
11
|
* Creates a middleware that applies API key authentication except for specified route patterns
|
|
12
12
|
* @param skipRouteCheck - Function that returns true if the route should skip authentication
|
|
13
13
|
*/
|
|
14
|
-
declare const runApiKeyAuthExcept: (skipRouteCheck: (path: string) => boolean) =>
|
|
14
|
+
declare const runApiKeyAuthExcept: (skipRouteCheck: (path: string) => boolean) => hono8.MiddlewareHandler<{
|
|
15
15
|
Variables: {
|
|
16
16
|
executionContext: BaseExecutionContext;
|
|
17
17
|
};
|
|
@@ -20,7 +20,7 @@ declare const runApiKeyAuthExcept: (skipRouteCheck: (path: string) => boolean) =
|
|
|
20
20
|
* Helper middleware for endpoints that optionally support API key authentication
|
|
21
21
|
* If no auth header is present, it continues without setting the executionContext
|
|
22
22
|
*/
|
|
23
|
-
declare const runOptionalAuth: () =>
|
|
23
|
+
declare const runOptionalAuth: () => hono8.MiddlewareHandler<{
|
|
24
24
|
Variables: {
|
|
25
25
|
executionContext?: BaseExecutionContext;
|
|
26
26
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as hono15 from "hono";
|
|
2
2
|
|
|
3
3
|
//#region src/middleware/sessionAuth.d.ts
|
|
4
4
|
|
|
@@ -7,11 +7,11 @@ import * as hono14 from "hono";
|
|
|
7
7
|
* Requires that a user has already been authenticated via Better Auth session.
|
|
8
8
|
* Used primarily for manage routes that require an active user session.
|
|
9
9
|
*/
|
|
10
|
-
declare const sessionAuth: () =>
|
|
10
|
+
declare const sessionAuth: () => hono15.MiddlewareHandler<any, string, {}, Response>;
|
|
11
11
|
/**
|
|
12
12
|
* Global session middleware - sets user and session in context for all routes
|
|
13
13
|
* Used for all routes that require an active user session.
|
|
14
14
|
*/
|
|
15
|
-
declare const sessionContext: () =>
|
|
15
|
+
declare const sessionContext: () => hono15.MiddlewareHandler<any, string, {}, Response>;
|
|
16
16
|
//#endregion
|
|
17
17
|
export { sessionAuth, sessionContext };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as hono13 from "hono";
|
|
2
2
|
|
|
3
3
|
//#region src/middleware/tenantAccess.d.ts
|
|
4
4
|
|
|
@@ -11,7 +11,7 @@ import * as hono16 from "hono";
|
|
|
11
11
|
* - API key user: Access only to the tenant associated with the API key
|
|
12
12
|
* - Session user: Access based on organization membership
|
|
13
13
|
*/
|
|
14
|
-
declare const requireTenantAccess: () =>
|
|
14
|
+
declare const requireTenantAccess: () => hono13.MiddlewareHandler<{
|
|
15
15
|
Variables: {
|
|
16
16
|
userId: string;
|
|
17
17
|
tenantId: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as hono11 from "hono";
|
|
2
2
|
|
|
3
3
|
//#region src/middleware/tracing.d.ts
|
|
4
|
-
declare const otelBaggageMiddleware: () =>
|
|
5
|
-
declare const executionBaggageMiddleware: () =>
|
|
4
|
+
declare const otelBaggageMiddleware: () => hono11.MiddlewareHandler<any, string, {}, Response>;
|
|
5
|
+
declare const executionBaggageMiddleware: () => hono11.MiddlewareHandler<any, string, {}, Response>;
|
|
6
6
|
//#endregion
|
|
7
7
|
export { executionBaggageMiddleware, otelBaggageMiddleware };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inkeep/agents-api",
|
|
3
|
-
"version": "0.0.0-dev-
|
|
3
|
+
"version": "0.0.0-dev-20260216012253",
|
|
4
4
|
"description": "Unified Inkeep Agents API - combines management, runtime, and evaluation capabilities",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"exports": {
|
|
@@ -67,10 +67,10 @@
|
|
|
67
67
|
"openid-client": "^6.8.1",
|
|
68
68
|
"pg": "^8.16.3",
|
|
69
69
|
"workflow": "^4.1.0-beta.54",
|
|
70
|
-
"@inkeep/agents-core": "^0.0.0-dev-
|
|
71
|
-
"@inkeep/agents-manage-mcp": "^0.0.0-dev-
|
|
72
|
-
"@inkeep/agents-mcp": "^0.0.0-dev-
|
|
73
|
-
"@inkeep/agents-work-apps": "^0.0.0-dev-
|
|
70
|
+
"@inkeep/agents-core": "^0.0.0-dev-20260216012253",
|
|
71
|
+
"@inkeep/agents-manage-mcp": "^0.0.0-dev-20260216012253",
|
|
72
|
+
"@inkeep/agents-mcp": "^0.0.0-dev-20260216012253",
|
|
73
|
+
"@inkeep/agents-work-apps": "^0.0.0-dev-20260216012253"
|
|
74
74
|
},
|
|
75
75
|
"peerDependencies": {
|
|
76
76
|
"@hono/zod-openapi": "^1.1.5",
|