@dollhousemcp/mcp-server 2.0.27 → 2.0.29
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/CHANGELOG.md +13 -0
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/mcp-aql/OperationSchema.js +2 -2
- package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/evaluatePermission.js +9 -3
- package/dist/services/BuildInfoService.d.ts +6 -1
- package/dist/services/BuildInfoService.d.ts.map +1 -1
- package/dist/services/BuildInfoService.js +23 -3
- package/dist/tools/portfolio/submitToPortfolioTool.d.ts.map +1 -1
- package/dist/tools/portfolio/submitToPortfolioTool.js +4 -3
- package/dist/utils/permissionHooks.d.ts +18 -0
- package/dist/utils/permissionHooks.d.ts.map +1 -1
- package/dist/utils/permissionHooks.js +182 -15
- package/dist/web/console/IngestRoutes.d.ts +7 -1
- package/dist/web/console/IngestRoutes.d.ts.map +1 -1
- package/dist/web/console/IngestRoutes.js +28 -6
- package/dist/web/console/LeaderForwardingSink.d.ts +6 -1
- package/dist/web/console/LeaderForwardingSink.d.ts.map +1 -1
- package/dist/web/console/LeaderForwardingSink.js +8 -2
- package/dist/web/console/UnifiedConsole.d.ts.map +1 -1
- package/dist/web/console/UnifiedConsole.js +6 -3
- package/dist/web/console/sessionClientPlatform.d.ts +11 -0
- package/dist/web/console/sessionClientPlatform.d.ts.map +1 -0
- package/dist/web/console/sessionClientPlatform.js +83 -0
- package/dist/web/public/permissions.js +10 -0
- package/dist/web/public/sessions.css +89 -9
- package/dist/web/public/sessions.js +160 -4
- package/dist/web/public/setup.js +40 -0
- package/dist/web/routes/permissionRoutes.d.ts +1 -0
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
- package/dist/web/routes/permissionRoutes.js +17 -7
- package/dist/web/routes/setupRoutes.d.ts +5 -1
- package/dist/web/routes/setupRoutes.d.ts.map +1 -1
- package/dist/web/routes/setupRoutes.js +28 -14
- package/dist/web/server.d.ts.map +1 -1
- package/dist/web/server.js +5 -1
- package/package.json +1 -1
- package/scripts/pretooluse-dollhouse.sh +36 -2
- package/scripts/pretooluse-vscode.sh +5 -2
- package/scripts/pretooluse-windsurf.sh +5 -2
- package/server.json +2 -2
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
import { Router } from 'express';
|
|
18
18
|
import type { UnifiedLogEntry } from '../../logging/types.js';
|
|
19
19
|
import type { MetricSnapshot } from '../../metrics/types.js';
|
|
20
|
+
import { type SessionClientPlatformId } from './sessionClientPlatform.js';
|
|
20
21
|
/**
|
|
21
22
|
* Tracked session information.
|
|
22
23
|
*/
|
|
@@ -45,6 +46,10 @@ export interface SessionInfo {
|
|
|
45
46
|
serverVersion: string;
|
|
46
47
|
/** Console/session contract version used for compatibility-aware takeover. */
|
|
47
48
|
consoleProtocolVersion: number;
|
|
49
|
+
/** Explicit MCP host platform, when the session reported one. */
|
|
50
|
+
clientPlatform: SessionClientPlatformId | null;
|
|
51
|
+
/** Human-readable MCP host label for UI rendering. */
|
|
52
|
+
clientPlatformLabel: string;
|
|
48
53
|
}
|
|
49
54
|
/**
|
|
50
55
|
* Payload for POST /api/ingest/logs
|
|
@@ -70,6 +75,7 @@ export interface SessionEventPayload {
|
|
|
70
75
|
startedAt: string;
|
|
71
76
|
serverVersion?: string;
|
|
72
77
|
consoleProtocolVersion?: number;
|
|
78
|
+
clientPlatform?: string;
|
|
73
79
|
}
|
|
74
80
|
/**
|
|
75
81
|
* Callbacks provided by the unified console orchestrator for broadcasting
|
|
@@ -89,7 +95,7 @@ export interface IngestRoutesResult {
|
|
|
89
95
|
/** Get all tracked sessions */
|
|
90
96
|
getSessions: () => SessionInfo[];
|
|
91
97
|
/** Register the leader as a session */
|
|
92
|
-
registerLeaderSession: (sessionId: string, pid: number) => void;
|
|
98
|
+
registerLeaderSession: (sessionId: string, pid: number, clientPlatform?: string | null) => void;
|
|
93
99
|
/** Register the web console as a session so the indicator is never empty (#1805) */
|
|
94
100
|
registerConsoleSession: () => void;
|
|
95
101
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IngestRoutes.d.ts","sourceRoot":"","sources":["../../../src/web/console/IngestRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"IngestRoutes.d.ts","sourceRoot":"","sources":["../../../src/web/console/IngestRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAW7D,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,4BAA4B,CAAC;AAqBpC;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,qDAAqD;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,+FAA+F;IAC/F,aAAa,EAAE,MAAM,CAAC;IACtB,uEAAuE;IACvE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC3B,wEAAwE;IACxE,QAAQ,EAAE,OAAO,CAAC;IAClB,wEAAwE;IACxE,aAAa,EAAE,OAAO,CAAC;IACvB,iGAAiG;IACjG,IAAI,EAAE,KAAK,GAAG,SAAS,CAAC;IACxB,4DAA4D;IAC5D,aAAa,EAAE,MAAM,CAAC;IACtB,8EAA8E;IAC9E,sBAAsB,EAAE,MAAM,CAAC;IAC/B,iEAAiE;IACjE,cAAc,EAAE,uBAAuB,GAAG,IAAI,CAAC;IAC/C,sDAAsD;IACtD,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,SAAS,GAAG,SAAS,GAAG,WAAW,CAAC;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC/C,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;IACvD,oBAAoB,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7E,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;CACjD;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,+BAA+B;IAC/B,WAAW,EAAE,MAAM,WAAW,EAAE,CAAC;IACjC,uCAAuC;IACvC,qBAAqB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAChG,oFAAoF;IACpF,sBAAsB,EAAE,MAAM,IAAI,CAAC;CACpC;AAyBD;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,gBAAgB,GAAG,kBAAkB,CAmenF"}
|
|
@@ -22,6 +22,7 @@ import { logger } from '../../utils/logger.js';
|
|
|
22
22
|
import { env } from '../../config/env.js';
|
|
23
23
|
import { PACKAGE_VERSION } from '../../generated/version.js';
|
|
24
24
|
import { CONSOLE_PROTOCOL_VERSION, LEGACY_CONSOLE_PROTOCOL_VERSION, } from './LeaderElection.js';
|
|
25
|
+
import { getSessionClientPlatformLabel, normalizeSessionClientPlatformId, } from './sessionClientPlatform.js';
|
|
25
26
|
/** Maximum payload size for ingestion requests */
|
|
26
27
|
const MAX_PAYLOAD_SIZE = '1mb';
|
|
27
28
|
/** Rate limit: max requests per window per source */
|
|
@@ -51,6 +52,9 @@ function normalizeConsoleProtocolVersion(version) {
|
|
|
51
52
|
}
|
|
52
53
|
return LEGACY_CONSOLE_PROTOCOL_VERSION;
|
|
53
54
|
}
|
|
55
|
+
function normalizeClientPlatform(platform) {
|
|
56
|
+
return normalizeSessionClientPlatformId(platform);
|
|
57
|
+
}
|
|
54
58
|
/**
|
|
55
59
|
* Create the ingestion routes and session registry.
|
|
56
60
|
*
|
|
@@ -92,11 +96,12 @@ export function createIngestRoutes(broadcasts) {
|
|
|
92
96
|
killedSessions.add(sessionId);
|
|
93
97
|
}
|
|
94
98
|
/** Create a new session entry for an orphan. Returns null on failure. */
|
|
95
|
-
function autoRegister(sessionId, pid, authenticated = false, serverVersion, consoleProtocolVersion) {
|
|
99
|
+
function autoRegister(sessionId, pid, authenticated = false, serverVersion, consoleProtocolVersion, clientPlatform) {
|
|
96
100
|
try {
|
|
97
101
|
const displayName = namePool.assign(sessionId);
|
|
98
102
|
const color = namePool.getColor(sessionId) ?? '#3b82f6';
|
|
99
103
|
const now = new Date().toISOString();
|
|
104
|
+
const normalizedClientPlatform = normalizeClientPlatform(clientPlatform);
|
|
100
105
|
const info = {
|
|
101
106
|
sessionId, displayName, color,
|
|
102
107
|
pid: pid || 0,
|
|
@@ -104,6 +109,8 @@ export function createIngestRoutes(broadcasts) {
|
|
|
104
109
|
status: 'active', isLeader: false, authenticated, kind: 'mcp',
|
|
105
110
|
serverVersion: normalizeServerVersion(serverVersion),
|
|
106
111
|
consoleProtocolVersion: normalizeConsoleProtocolVersion(consoleProtocolVersion),
|
|
112
|
+
clientPlatform: normalizedClientPlatform,
|
|
113
|
+
clientPlatformLabel: getSessionClientPlatformLabel(normalizedClientPlatform),
|
|
107
114
|
};
|
|
108
115
|
sessions.set(sessionId, info);
|
|
109
116
|
logger.info('[IngestRoutes] Auto-registered orphaned session', {
|
|
@@ -123,7 +130,7 @@ export function createIngestRoutes(broadcasts) {
|
|
|
123
130
|
* Auto-register or update an orphaned session from ingestion data.
|
|
124
131
|
* Returns the session (existing or newly created), or null if killed/pending.
|
|
125
132
|
*/
|
|
126
|
-
function ensureSession(sessionId, pid, authenticated = false, serverVersion, consoleProtocolVersion) {
|
|
133
|
+
function ensureSession(sessionId, pid, authenticated = false, serverVersion, consoleProtocolVersion, clientPlatform) {
|
|
127
134
|
if (killedSessions.has(sessionId))
|
|
128
135
|
return null;
|
|
129
136
|
if (pendingKills.has(sessionId)) {
|
|
@@ -132,7 +139,7 @@ export function createIngestRoutes(broadcasts) {
|
|
|
132
139
|
}
|
|
133
140
|
const existing = sessions.get(sessionId);
|
|
134
141
|
if (!existing) {
|
|
135
|
-
return autoRegister(sessionId, pid, authenticated, serverVersion, consoleProtocolVersion);
|
|
142
|
+
return autoRegister(sessionId, pid, authenticated, serverVersion, consoleProtocolVersion, clientPlatform);
|
|
136
143
|
}
|
|
137
144
|
if (existing.status === 'ended') {
|
|
138
145
|
existing.status = 'active';
|
|
@@ -153,6 +160,10 @@ export function createIngestRoutes(broadcasts) {
|
|
|
153
160
|
if (consoleProtocolVersion !== undefined) {
|
|
154
161
|
existing.consoleProtocolVersion = normalizeConsoleProtocolVersion(consoleProtocolVersion);
|
|
155
162
|
}
|
|
163
|
+
if (clientPlatform !== undefined) {
|
|
164
|
+
existing.clientPlatform = normalizeClientPlatform(clientPlatform);
|
|
165
|
+
existing.clientPlatformLabel = getSessionClientPlatformLabel(existing.clientPlatform);
|
|
166
|
+
}
|
|
156
167
|
return existing;
|
|
157
168
|
}
|
|
158
169
|
// JSON body parsing with size limit
|
|
@@ -246,12 +257,15 @@ export function createIngestRoutes(broadcasts) {
|
|
|
246
257
|
const displayName = namePool.assign(payload.sessionId);
|
|
247
258
|
const color = namePool.getColor(payload.sessionId) ?? '#3b82f6';
|
|
248
259
|
const isAuthenticated = Boolean(res.locals?.tokenEntry);
|
|
260
|
+
const normalizedClientPlatform = normalizeClientPlatform(payload.clientPlatform);
|
|
249
261
|
sessions.set(payload.sessionId, {
|
|
250
262
|
sessionId: payload.sessionId, displayName, color,
|
|
251
263
|
pid: payload.pid, startedAt: payload.startedAt || now, lastHeartbeat: now,
|
|
252
264
|
status: 'active', isLeader: false, authenticated: isAuthenticated, kind: 'mcp',
|
|
253
265
|
serverVersion: normalizeServerVersion(payload.serverVersion),
|
|
254
266
|
consoleProtocolVersion: normalizeConsoleProtocolVersion(payload.consoleProtocolVersion),
|
|
267
|
+
clientPlatform: normalizedClientPlatform,
|
|
268
|
+
clientPlatformLabel: getSessionClientPlatformLabel(normalizedClientPlatform),
|
|
255
269
|
});
|
|
256
270
|
logger.info('[IngestRoutes] Session registered', {
|
|
257
271
|
displayName, sessionId: payload.sessionId, pid: payload.pid, color,
|
|
@@ -276,7 +290,7 @@ export function createIngestRoutes(broadcasts) {
|
|
|
276
290
|
}
|
|
277
291
|
case 'heartbeat': {
|
|
278
292
|
// Auto-register or update — heartbeat includes PID for recovery (#1870)
|
|
279
|
-
ensureSession(payload.sessionId, payload.pid, false, payload.serverVersion, payload.consoleProtocolVersion);
|
|
293
|
+
ensureSession(payload.sessionId, payload.pid, false, payload.serverVersion, payload.consoleProtocolVersion, payload.clientPlatform);
|
|
280
294
|
break;
|
|
281
295
|
}
|
|
282
296
|
}
|
|
@@ -312,6 +326,8 @@ export function createIngestRoutes(broadcasts) {
|
|
|
312
326
|
kind: ls.kind || 'mcp',
|
|
313
327
|
serverVersion: normalizeServerVersion(ls.serverVersion),
|
|
314
328
|
consoleProtocolVersion: normalizeConsoleProtocolVersion(ls.consoleProtocolVersion),
|
|
329
|
+
clientPlatform: normalizeClientPlatform(ls.clientPlatform),
|
|
330
|
+
clientPlatformLabel: getSessionClientPlatformLabel(normalizeClientPlatform(ls.clientPlatform)),
|
|
315
331
|
});
|
|
316
332
|
}
|
|
317
333
|
}
|
|
@@ -432,9 +448,10 @@ export function createIngestRoutes(broadcasts) {
|
|
|
432
448
|
function getSessions() {
|
|
433
449
|
return Array.from(sessions.values()).filter(s => s.status === 'active');
|
|
434
450
|
}
|
|
435
|
-
function registerLeaderSession(sessionId, pid) {
|
|
451
|
+
function registerLeaderSession(sessionId, pid, clientPlatform) {
|
|
436
452
|
const displayName = namePool.assign(sessionId, true);
|
|
437
453
|
const color = namePool.getColor(sessionId) ?? '#3b82f6';
|
|
454
|
+
const normalizedClientPlatform = normalizeClientPlatform(clientPlatform ?? undefined);
|
|
438
455
|
sessions.set(sessionId, {
|
|
439
456
|
sessionId,
|
|
440
457
|
displayName,
|
|
@@ -448,6 +465,8 @@ export function createIngestRoutes(broadcasts) {
|
|
|
448
465
|
kind: 'mcp',
|
|
449
466
|
serverVersion: PACKAGE_VERSION,
|
|
450
467
|
consoleProtocolVersion: CONSOLE_PROTOCOL_VERSION,
|
|
468
|
+
clientPlatform: normalizedClientPlatform,
|
|
469
|
+
clientPlatformLabel: getSessionClientPlatformLabel(normalizedClientPlatform),
|
|
451
470
|
});
|
|
452
471
|
logger.info('[IngestRoutes] Leader session registered', { displayName, sessionId, pid, color });
|
|
453
472
|
}
|
|
@@ -461,6 +480,7 @@ export function createIngestRoutes(broadcasts) {
|
|
|
461
480
|
if (sessions.has(consoleId))
|
|
462
481
|
return;
|
|
463
482
|
const displayName = 'Web Console';
|
|
483
|
+
const normalizedClientPlatform = 'web-console';
|
|
464
484
|
sessions.set(consoleId, {
|
|
465
485
|
sessionId: consoleId,
|
|
466
486
|
displayName,
|
|
@@ -474,9 +494,11 @@ export function createIngestRoutes(broadcasts) {
|
|
|
474
494
|
kind: 'console',
|
|
475
495
|
serverVersion: PACKAGE_VERSION,
|
|
476
496
|
consoleProtocolVersion: CONSOLE_PROTOCOL_VERSION,
|
|
497
|
+
clientPlatform: normalizedClientPlatform,
|
|
498
|
+
clientPlatformLabel: getSessionClientPlatformLabel(normalizedClientPlatform),
|
|
477
499
|
});
|
|
478
500
|
logger.info('[IngestRoutes] Console session registered', { sessionId: consoleId, pid: process.pid });
|
|
479
501
|
}
|
|
480
502
|
return { router, getSessions, registerLeaderSession, registerConsoleSession };
|
|
481
503
|
}
|
|
482
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5nZXN0Um91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dlYi9jb25zb2xlL0luZ2VzdFJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUkxQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUNMLHdCQUF3QixFQUN4QiwrQkFBK0IsR0FDaEMsTUFBTSxxQkFBcUIsQ0FBQztBQUU3QixrREFBa0Q7QUFDbEQsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7QUFFL0IscURBQXFEO0FBQ3JELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQztBQUM1QixNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQztBQUVwQyxpREFBaUQ7QUFDakQsTUFBTSxrQkFBa0IsR0FBRyxLQUFLLENBQUM7QUFFakMsNkVBQTZFO0FBQzdFLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDO0FBRWhDLDZEQUE2RDtBQUM3RCxNQUFNLHVCQUF1QixHQUFHLEtBQUssQ0FBQztBQUV0QyxrRUFBa0U7QUFDbEUsTUFBTSxjQUFjLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLFlBQVk7QUFvRi9DLDZEQUE2RDtBQUM3RCxTQUFTLGNBQWMsQ0FBQyxDQUFTO0lBQy9CLE9B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ZXNDb250ZW50IjpbIi8qKlxuICogRXZlbnQgaW5nZXN0aW9uIHJvdXRlcyBmb3IgdGhlIHVuaWZpZWQgd2ViIGNvbnNvbGUuXG4gKlxuICogVGhlIGNvbnNvbGUgbGVhZGVyIG1vdW50cyB0aGVzZSByb3V0ZXMgc28gZm9sbG93ZXIgTUNQIHNlcnZlcnMgY2FuXG4gKiBmb3J3YXJkIHRoZWlyIGxvZ3MsIG1ldHJpY3MsIGFuZCBzZXNzaW9uIGxpZmVjeWNsZSBldmVudHMuIEFsbCBpbmdlc3RlZFxuICogZW50cmllcyBhcmUgc3RhbXBlZCB3aXRoIGBfc2Vzc2lvbklkYCBpbiB0aGVpciBkYXRhIGZpZWxkIGFuZCB0aGVuXG4gKiBicm9hZGNhc3QgdG8gU1NFIGNsaWVudHMgdmlhIHRoZSBleGlzdGluZyBsb2cvbWV0cmljcyBicm9hZGNhc3QgaG9va3MuXG4gKlxuICogUm91dGVzOlxuICogLSBQT1NUIC9hcGkvaW5nZXN0L2xvZ3MgICAgIOKAlCBCYXRjaGVkIGxvZyBlbnRyaWVzIGZyb20gYSBmb2xsb3dlclxuICogLSBQT1NUIC9hcGkvaW5nZXN0L21ldHJpY3MgIOKAlCBNZXRyaWMgc25hcHNob3RzIGZyb20gYSBmb2xsb3dlclxuICogLSBQT1NUIC9hcGkvaW5nZXN0L3Nlc3Npb24gIOKAlCBTZXNzaW9uIGxpZmVjeWNsZSBldmVudHMgKHN0YXJ0ZWQvc3RvcHBlZC9oZWFydGJlYXQpXG4gKiAtIEdFVCAgL2FwaS9zZXNzaW9ucyAgICAgICAg4oCUIEFjdGl2ZSBzZXNzaW9uIGxpc3QgZm9yIHRoZSBVSVxuICpcbiAqIEBzaW5jZSB2Mi4xLjAg4oCUIElzc3VlICMxNzAwXG4gKi9cblxuaW1wb3J0IGV4cHJlc3MsIHsgUm91dGVyIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3QsIFJlc3BvbnNlIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgdHlwZSB7IFVuaWZpZWRMb2dFbnRyeSB9IGZyb20gJy4uLy4uL2xvZ2dpbmcvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNZXRyaWNTbmFwc2hvdCB9IGZyb20gJy4uLy4uL21ldHJpY3MvdHlwZXMuanMnO1xuaW1wb3J0IHsgU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyIH0gZnJvbSAnLi4vLi4vdXRpbHMvU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2Vzc2lvbk5hbWVQb29sIH0gZnJvbSAnLi9TZXNzaW9uTmFtZXMuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IGVudiB9IGZyb20gJy4uLy4uL2NvbmZpZy9lbnYuanMnO1xuaW1wb3J0IHsgUEFDS0FHRV9WRVJTSU9OIH0gZnJvbSAnLi4vLi4vZ2VuZXJhdGVkL3ZlcnNpb24uanMnO1xuaW1wb3J0IHtcbiAgQ09OU09MRV9QUk9UT0NPTF9WRVJTSU9OLFxuICBMRUdBQ1lfQ09OU09MRV9QUk9UT0NPTF9WRVJTSU9OLFxufSBmcm9tICcuL0xlYWRlckVsZWN0aW9uLmpzJztcblxuLyoqIE1heGltdW0gcGF5bG9hZCBzaXplIGZvciBpbmdlc3Rpb24gcmVxdWVzdHMgKi9cbmNvbnN0IE1BWF9QQVlMT0FEX1NJWkUgPSAnMW1iJztcblxuLyoqIFJhdGUgbGltaXQ6IG1heCByZXF1ZXN0cyBwZXIgd2luZG93IHBlciBzb3VyY2UgKi9cbmNvbnN0IFJBVEVfTElNSVRfTUFYID0gMTAwMDtcbmNvbnN0IFJBVEVfTElNSVRfV0lORE9XX01TID0gNjBfMDAwO1xuXG4vKiogSG93IG9mdGVuIHRvIGNoZWNrIGZvciBzdGFsZSBzZXNzaW9ucyAobXMpICovXG5jb25zdCBSRUFQRVJfSU5URVJWQUxfTVMgPSA1XzAwMDtcblxuLyoqIEhvdyBsb25nIHNpbmNlIGxhc3QgaGVhcnRiZWF0IGJlZm9yZSBhIHNlc3Npb24gaXMgY29uc2lkZXJlZCBkZWFkIChtcykgKi9cbmNvbnN0IFNFU1NJT05fU1RBTEVfTVMgPSAxNV8wMDA7XG5cbi8qKiBUaW1lb3V0IGZvciBsZWdhY3kgcG9ydCBmZWRlcmF0aW9uL3Byb3h5IHJlcXVlc3RzIChtcykgKi9cbmNvbnN0IExFR0FDWV9GRVRDSF9USU1FT1VUX01TID0gMl8wMDA7XG5cbi8qKiBIb3cgbG9uZyBiZWZvcmUgZW5kZWQgc2Vzc2lvbnMgYXJlIHB1cmdlZCBmcm9tIHRoZSBNYXAgKG1zKSAqL1xuY29uc3QgRU5ERURfUFVSR0VfTVMgPSA1ICogNjBfMDAwOyAvLyA1IG1pbnV0ZXNcblxuLyoqXG4gKiBUcmFja2VkIHNlc3Npb24gaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2Vzc2lvbkluZm8ge1xuICAvKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgc2Vzc2lvbiAoVVVJRCBvciBgY29uc29sZS08cGlkPmApLiAqL1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgLyoqIEZyaWVuZGx5IHB1cHBldCBuYW1lIChlLmcuLCBcIktlcm1pdFwiLCBcIlB1bmNoXCIpIG9yIFwiV2ViIENvbnNvbGVcIi4gKi9cbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgLyoqIENhbm9uaWNhbCBoZXggY29sb3IgZm9yIHRoaXMgcHVwcGV0IGNoYXJhY3Rlci4gKi9cbiAgY29sb3I6IHN0cmluZztcbiAgLyoqIE9TIHByb2Nlc3MgSUQgb2YgdGhlIE1DUCBzZXJ2ZXIgb3Igd2ViIGNvbnNvbGUgcHJvY2Vzcy4gKi9cbiAgcGlkOiBudW1iZXI7XG4gIC8qKiBJU08gdGltZXN0YW1wIHdoZW4gdGhlIHNlc3Npb24gc3RhcnRlZC4gKi9cbiAgc3RhcnRlZEF0OiBzdHJpbmc7XG4gIC8qKiBJU08gdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBoZWFydGJlYXQgKGZvbGxvd2Vycykgb3IgcmVnaXN0cmF0aW9uIChsZWFkZXIvY29uc29sZSkuICovXG4gIGxhc3RIZWFydGJlYXQ6IHN0cmluZztcbiAgLyoqIExpZmVjeWNsZSBzdGF0dXMg4oCUICdhY3RpdmUnIHVudGlsIGVuZGVkIG9yIHJlYXBlZCBmb3Igc3RhbGVuZXNzLiAqL1xuICBzdGF0dXM6ICdhY3RpdmUnIHwgJ2VuZGVkJztcbiAgLyoqIFRydWUgaWYgdGhpcyBzZXNzaW9uIHdvbiBsZWFkZXIgZWxlY3Rpb24gYW5kIG93bnMgdGhlIHRva2VuIGZpbGUuICovXG4gIGlzTGVhZGVyOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGlzIHNlc3Npb24gY29ubmVjdGVkIHdpdGggYSB2YWxpZCBCZWFyZXIgdG9rZW4gKCMxODA1KS4gKi9cbiAgYXV0aGVudGljYXRlZDogYm9vbGVhbjtcbiAgLyoqIFNlc3Npb24ga2luZCDigJQgJ21jcCcgZm9yIE1DUCBzdGRpbyBzZXNzaW9ucywgJ2NvbnNvbGUnIGZvciB0aGUgd2ViIGNvbnNvbGUgaXRzZWxmICgjMTgwNSkuICovXG4gIGtpbmQ6ICdtY3AnIHwgJ2NvbnNvbGUnO1xuICAvKiogRG9sbGhvdXNlTUNQIHBhY2thZ2UgdmVyc2lvbiByZXBvcnRlZCBieSB0aGUgc2Vzc2lvbi4gKi9cbiAgc2VydmVyVmVyc2lvbjogc3RyaW5nO1xuICAvKiogQ29uc29sZS9zZXNzaW9uIGNvbnRyYWN0IHZlcnNpb24gdXNlZCBmb3IgY29tcGF0aWJpbGl0eS1hd2FyZSB0YWtlb3Zlci4gKi9cbiAgY29uc29sZVByb3RvY29sVmVyc2lvbjogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBheWxvYWQgZm9yIFBPU1QgL2FwaS9pbmdlc3QvbG9nc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdExvZ1BheWxvYWQge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgZW50cmllczogVW5pZmllZExvZ0VudHJ5W107XG59XG5cbi8qKlxuICogUGF5bG9hZCBmb3IgUE9TVCAvYXBpL2luZ2VzdC9tZXRyaWNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5nZXN0TWV0cmljc1BheWxvYWQge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgc25hcHNob3Q6IE1ldHJpY1NuYXBzaG90O1xufVxuXG4vKipcbiAqIFBheWxvYWQgZm9yIFBPU1QgL2FwaS9pbmdlc3Qvc2Vzc2lvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb25FdmVudFBheWxvYWQge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgZXZlbnQ6ICdzdGFydGVkJyB8ICdzdG9wcGVkJyB8ICdoZWFydGJlYXQnO1xuICBwaWQ6IG51bWJlcjtcbiAgc3RhcnRlZEF0OiBzdHJpbmc7XG4gIHNlcnZlclZlcnNpb24/OiBzdHJpbmc7XG4gIGNvbnNvbGVQcm90b2NvbFZlcnNpb24/OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ2FsbGJhY2tzIHByb3ZpZGVkIGJ5IHRoZSB1bmlmaWVkIGNvbnNvbGUgb3JjaGVzdHJhdG9yIGZvciBicm9hZGNhc3RpbmdcbiAqIGluZ2VzdGVkIGV2ZW50cyB0aHJvdWdoIHRoZSBleGlzdGluZyBTU0UgaW5mcmFzdHJ1Y3R1cmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5nZXN0QnJvYWRjYXN0cyB7XG4gIGxvZ0Jyb2FkY2FzdDogKGVudHJ5OiBVbmlmaWVkTG9nRW50cnkpID0+IHZvaWQ7XG4gIG1ldHJpY3NPblNuYXBzaG90PzogKHNuYXBzaG90OiBNZXRyaWNTbmFwc2hvdCkgPT4gdm9pZDtcbiAgc3RvcmVNZXRyaWNzU25hcHNob3Q/OiAoc25hcHNob3Q6IE1ldHJpY1NuYXBzaG90LCBzZXNzaW9uSWQ6IHN0cmluZykgPT4gdm9pZDtcbiAgc2Vzc2lvbkJyb2FkY2FzdD86IChldmVudDogU2Vzc2lvbkluZm8pID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIGNyZWF0aW5nIGluZ2VzdCByb3V0ZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5nZXN0Um91dGVzUmVzdWx0IHtcbiAgcm91dGVyOiBSb3V0ZXI7XG4gIC8qKiBHZXQgYWxsIHRyYWNrZWQgc2Vzc2lvbnMgKi9cbiAgZ2V0U2Vzc2lvbnM6ICgpID0+IFNlc3Npb25JbmZvW107XG4gIC8qKiBSZWdpc3RlciB0aGUgbGVhZGVyIGFzIGEgc2Vzc2lvbiAqL1xuICByZWdpc3RlckxlYWRlclNlc3Npb246IChzZXNzaW9uSWQ6IHN0cmluZywgcGlkOiBudW1iZXIpID0+IHZvaWQ7XG4gIC8qKiBSZWdpc3RlciB0aGUgd2ViIGNvbnNvbGUgYXMgYSBzZXNzaW9uIHNvIHRoZSBpbmRpY2F0b3IgaXMgbmV2ZXIgZW1wdHkgKCMxODA1KSAqL1xuICByZWdpc3RlckNvbnNvbGVTZXNzaW9uOiAoKSA9PiB2b2lkO1xufVxuXG4vKiogTm9ybWFsaXplIGEgc3RyaW5nIHZpYSBVbmljb2RlVmFsaWRhdG9yIChETUNQLVNFQy0wMDQpICovXG5mdW5jdGlvbiBub3JtYWxpemVJbnB1dChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gVW5pY29kZVZhbGlkYXRvci5ub3JtYWxpemUocykubm9ybWFsaXplZENvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVNlcnZlclZlcnNpb24odmVyc2lvbj86IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycgJiYgdmVyc2lvbi50cmltKCkubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB2ZXJzaW9uLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gJ3Vua25vd24nO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVDb25zb2xlUHJvdG9jb2xWZXJzaW9uKHZlcnNpb24/OiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdudW1iZXInICYmIE51bWJlci5pc0ludGVnZXIodmVyc2lvbikgJiYgdmVyc2lvbiA+PSAwKSB7XG4gICAgcmV0dXJuIHZlcnNpb247XG4gIH1cbiAgcmV0dXJuIExFR0FDWV9DT05TT0xFX1BST1RPQ09MX1ZFUlNJT047XG59XG5cbi8qKlxuICogQ3JlYXRlIHRoZSBpbmdlc3Rpb24gcm91dGVzIGFuZCBzZXNzaW9uIHJlZ2lzdHJ5LlxuICpcbiAqIEBwYXJhbSBicm9hZGNhc3RzIC0gQ2FsbGJhY2tzIHRvIGZvcndhcmQgaW5nZXN0ZWQgZXZlbnRzIHRvIFNTRSBjbGllbnRzXG4gKiBAcmV0dXJucyBSb3V0ZXIgYW5kIHNlc3Npb24gbWFuYWdlbWVudCBmdW5jdGlvbnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUluZ2VzdFJvdXRlcyhicm9hZGNhc3RzOiBJbmdlc3RCcm9hZGNhc3RzKTogSW5nZXN0Um91dGVzUmVzdWx0IHtcbiAgY29uc3Qgcm91dGVyID0gUm91dGVyKCk7XG4gIGNvbnN0IHNlc3Npb25zID0gbmV3IE1hcDxzdHJpbmcsIFNlc3Npb25JbmZvPigpO1xuICBjb25zdCBuYW1lUG9vbCA9IG5ldyBTZXNzaW9uTmFtZVBvb2woKTtcbiAgY29uc3QgcmF0ZUxpbWl0ZXIgPSBuZXcgU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyKFJBVEVfTElNSVRfTUFYLCBSQVRFX0xJTUlUX1dJTkRPV19NUyk7XG5cbiAgLy8gU2Vzc2lvbnMgdGhlIHVzZXIgZXhwbGljaXRseSBraWxsZWQg4oCUIG5ldmVyIGNvbWUgYmFjayAoIzE4NzApLlxuICAvLyBDbGVhcmVkIG9ubHkgb24gc2VydmVyIHJlc3RhcnQsIHdoaWNoIGlzIGFwcHJvcHJpYXRlIHNpbmNlIHRoYXQncyBhIG5ldyBjb250ZXh0LlxuICBjb25zdCBraWxsZWRTZXNzaW9ucyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8vIFNlc3Npb25zIHdhaXRpbmcgZm9yIGEgUElEIHNvIHdlIGNhbiBTSUdURVJNIHRoZW0gKCMxODcwKS5cbiAgLy8gV2hlbiB0aGUgdXNlciBkaXNtaXNzZXMgYSBwaWQ9MCBvcnBoYW4sIHdlIGFkZCBpdCBoZXJlLiBUaGUgbmV4dCBoZWFydGJlYXRcbiAgLy8gKGV2ZXJ5IDEwcykgY2FycmllcyB0aGUgUElEIOKAlCB3ZSBTSUdURVJNIGltbWVkaWF0ZWx5IGFuZCBtb3ZlIHRvIGtpbGxlZFNlc3Npb25zLlxuICBjb25zdCBwZW5kaW5nS2lsbHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvKiogRXhlY3V0ZSBhIGRlZmVycmVkIGtpbGwgaWYgd2Ugbm93IGhhdmUgYSBQSUQuICovXG4gIGZ1bmN0aW9uIHRyeUV4ZWN1dGVQZW5kaW5nS2lsbChzZXNzaW9uSWQ6IHN0cmluZywgcGlkPzogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3Qga2lsbFBpZCA9IHBpZCB8fCBzZXNzaW9ucy5nZXQoc2Vzc2lvbklkKT8ucGlkO1xuICAgIGlmICgha2lsbFBpZCkgcmV0dXJuO1xuICAgIHRyeSB7IHByb2Nlc3Mua2lsbChraWxsUGlkLCAnU0lHVEVSTScpOyB9IGNhdGNoIHsgLyogYWxyZWFkeSBkZWFkICovIH1cbiAgICBjb25zdCBleGlzdGluZyA9IHNlc3Npb25zLmdldChzZXNzaW9uSWQpO1xuICAgIGlmIChleGlzdGluZykgZXhpc3Rpbmcuc3RhdHVzID0gJ2VuZGVkJztcbiAgICBsb2dnZXIuaW5mbygnW0luZ2VzdFJvdXRlc10gRGVmZXJyZWQga2lsbCBleGVjdXRlZCDigJQgUElEIGFycml2ZWQnLCB7XG4gICAgICBkaXNwbGF5TmFtZTogZXhpc3Rpbmc/LmRpc3BsYXlOYW1lLCBzZXNzaW9uSWQsIHBpZDoga2lsbFBpZCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBQcm9tb3RlIGEgcGVuZGluZyBraWxsIHRvIHBlcm1hbmVudC4gKi9cbiAgZnVuY3Rpb24gZmluYWxpemVQZW5kaW5nS2lsbChzZXNzaW9uSWQ6IHN0cmluZywgcGlkPzogbnVtYmVyKTogdm9pZCB7XG4gICAgdHJ5RXhlY3V0ZVBlbmRpbmdLaWxsKHNlc3Npb25JZCwgcGlkKTtcbiAgICBwZW5kaW5nS2lsbHMuZGVsZXRlKHNlc3Npb25JZCk7XG4gICAga2lsbGVkU2Vzc2lvbnMuYWRkKHNlc3Npb25JZCk7XG4gIH1cblxuICAvKiogQ3JlYXRlIGEgbmV3IHNlc3Npb24gZW50cnkgZm9yIGFuIG9ycGhhbi4gUmV0dXJucyBudWxsIG9uIGZhaWx1cmUuICovXG4gIGZ1bmN0aW9uIGF1dG9SZWdpc3RlcihcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICBwaWQ/OiBudW1iZXIsXG4gICAgYXV0aGVudGljYXRlZCA9IGZhbHNlLFxuICAgIHNlcnZlclZlcnNpb24/OiBzdHJpbmcsXG4gICAgY29uc29sZVByb3RvY29sVmVyc2lvbj86IG51bWJlcixcbiAgKTogU2Vzc2lvbkluZm8gfCBudWxsIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGlzcGxheU5hbWUgPSBuYW1lUG9vbC5hc3NpZ24oc2Vzc2lvbklkKTtcbiAgICAgIGNvbnN0IGNvbG9yID0gbmFtZVBvb2wuZ2V0Q29sb3Ioc2Vzc2lvbklkKSA/PyAnIzNiODJmNic7XG4gICAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICBjb25zdCBpbmZvOiBTZXNzaW9uSW5mbyA9IHtcbiAgICAgICAgc2Vzc2lvbklkLCBkaXNwbGF5TmFtZSwgY29sb3IsXG4gICAgICAgIHBpZDogcGlkIHx8IDAsXG4gICAgICAgIHN0YXJ0ZWRBdDogbm93LCBsYXN0SGVhcnRiZWF0OiBub3csXG4gICAgICAgIHN0YXR1czogJ2FjdGl2ZScsIGlzTGVhZGVyOiBmYWxzZSwgYXV0aGVudGljYXRlZCwga2luZDogJ21jcCcsXG4gICAgICAgIHNlcnZlclZlcnNpb246IG5vcm1hbGl6ZVNlcnZlclZlcnNpb24oc2VydmVyVmVyc2lvbiksXG4gICAgICAgIGNvbnNvbGVQcm90b2NvbFZlcnNpb246IG5vcm1hbGl6ZUNvbnNvbGVQcm90b2NvbFZlcnNpb24oY29uc29sZVByb3RvY29sVmVyc2lvbiksXG4gICAgICB9O1xuICAgICAgc2Vzc2lvbnMuc2V0KHNlc3Npb25JZCwgaW5mbyk7XG4gICAgICBsb2dnZXIuaW5mbygnW0luZ2VzdFJvdXRlc10gQXV0by1yZWdpc3RlcmVkIG9ycGhhbmVkIHNlc3Npb24nLCB7XG4gICAgICAgIGRpc3BsYXlOYW1lLCBzZXNzaW9uSWQsIHNvdXJjZTogcGlkID8gJ2hlYXJ0YmVhdCcgOiAnaW5nZXN0aW9uJyxcbiAgICAgIH0pO1xuICAgICAgYnJvYWRjYXN0cy5zZXNzaW9uQnJvYWRjYXN0Py4oaW5mbyk7XG4gICAgICByZXR1cm4gaW5mbztcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZygnW0luZ2VzdFJvdXRlc10gRmFpbGVkIHRvIGF1dG8tcmVnaXN0ZXIgb3JwaGFuZWQgc2Vzc2lvbicsIHtcbiAgICAgICAgc2Vzc2lvbklkLCBlcnJvcjogKGVyciBhcyBFcnJvcikubWVzc2FnZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF1dG8tcmVnaXN0ZXIgb3IgdXBkYXRlIGFuIG9ycGhhbmVkIHNlc3Npb24gZnJvbSBpbmdlc3Rpb24gZGF0YS5cbiAgICogUmV0dXJucyB0aGUgc2Vzc2lvbiAoZXhpc3Rpbmcgb3IgbmV3bHkgY3JlYXRlZCksIG9yIG51bGwgaWYga2lsbGVkL3BlbmRpbmcuXG4gICAqL1xuICBmdW5jdGlvbiBlbnN1cmVTZXNzaW9uKFxuICAgIHNlc3Npb25JZDogc3RyaW5nLFxuICAgIHBpZD86IG51bWJlcixcbiAgICBhdXRoZW50aWNhdGVkID0gZmFsc2UsXG4gICAgc2VydmVyVmVyc2lvbj86IHN0cmluZyxcbiAgICBjb25zb2xlUHJvdG9jb2xWZXJzaW9uPzogbnVtYmVyLFxuICApOiBTZXNzaW9uSW5mbyB8IG51bGwge1xuICAgIGlmIChraWxsZWRTZXNzaW9ucy5oYXMoc2Vzc2lvbklkKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKHBlbmRpbmdLaWxscy5oYXMoc2Vzc2lvbklkKSkge1xuICAgICAgZmluYWxpemVQZW5kaW5nS2lsbChzZXNzaW9uSWQsIHBpZCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZyA9IHNlc3Npb25zLmdldChzZXNzaW9uSWQpO1xuICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgIHJldHVybiBhdXRvUmVnaXN0ZXIoc2Vzc2lvbklkLCBwaWQsIGF1dGhlbnRpY2F0ZWQsIHNlcnZlclZlcnNpb24sIGNvbnNvbGVQcm90b2NvbFZlcnNpb24pO1xuICAgIH1cblxuICAgIGlmIChleGlzdGluZy5zdGF0dXMgPT09ICdlbmRlZCcpIHtcbiAgICAgIGV4aXN0aW5nLnN0YXR1cyA9ICdhY3RpdmUnO1xuICAgICAgbG9nZ2VyLmluZm8oJ1tJbmdlc3RSb3V0ZXNdIFJldml2ZWQgZW5kZWQgc2Vzc2lvbiBzdGlsbCBzZW5kaW5nIGRhdGEnLCB7XG4gICAgICAgIGRpc3BsYXlOYW1lOiBleGlzdGluZy5kaXNwbGF5TmFtZSwgc2Vzc2lvbklkLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGV4aXN0aW5nLmxhc3RIZWFydGJlYXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgaWYgKHBpZCAmJiAhZXhpc3RpbmcucGlkKSB7XG4gICAgICBleGlzdGluZy5waWQgPSBwaWQ7XG4gICAgICBsb2dnZXIuaW5mbygnW0luZ2VzdFJvdXRlc10gUmVjb3ZlcmVkIFBJRCBmb3Igb3JwaGFuZWQgc2Vzc2lvbicsIHtcbiAgICAgICAgZGlzcGxheU5hbWU6IGV4aXN0aW5nLmRpc3BsYXlOYW1lLCBzZXNzaW9uSWQsIHBpZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc2VydmVyVmVyc2lvbikge1xuICAgICAgZXhpc3Rpbmcuc2VydmVyVmVyc2lvbiA9IG5vcm1hbGl6ZVNlcnZlclZlcnNpb24oc2VydmVyVmVyc2lvbik7XG4gICAgfVxuICAgIGlmIChjb25zb2xlUHJvdG9jb2xWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4aXN0aW5nLmNvbnNvbGVQcm90b2NvbFZlcnNpb24gPSBub3JtYWxpemVDb25zb2xlUHJvdG9jb2xWZXJzaW9uKGNvbnNvbGVQcm90b2NvbFZlcnNpb24pO1xuICAgIH1cbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cblxuICAvLyBKU09OIGJvZHkgcGFyc2luZyB3aXRoIHNpemUgbGltaXRcbiAgcm91dGVyLnVzZShleHByZXNzLmpzb24oeyBsaW1pdDogTUFYX1BBWUxPQURfU0laRSB9KSk7XG5cbiAgLyoqXG4gICAqIFBPU1QgL2FwaS9pbmdlc3QvbG9ncyDigJQgUmVjZWl2ZSBiYXRjaGVkIGxvZyBlbnRyaWVzIGZyb20gYSBmb2xsb3dlci5cbiAgICovXG4gIHJvdXRlci5wb3N0KCcvYXBpL2luZ2VzdC9sb2dzJywgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgIGlmICghcmF0ZUxpbWl0ZXIudHJ5QWNxdWlyZSgpKSB7XG4gICAgICByZXMuc3RhdHVzKDQyOSkuanNvbih7IGVycm9yOiAnUmF0ZSBsaW1pdCBleGNlZWRlZCcgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF5bG9hZCA9IHJlcS5ib2R5IGFzIEluZ2VzdExvZ1BheWxvYWQ7XG4gICAgaWYgKCFwYXlsb2FkPy5zZXNzaW9uSWQgfHwgIUFycmF5LmlzQXJyYXkocGF5bG9hZC5lbnRyaWVzKSkge1xuICAgICAgY29uc3QgcmVjZWl2ZWQgPSBwYXlsb2FkID8gT2JqZWN0LmtleXMocGF5bG9hZCkgOiBbXTtcbiAgICAgIGxvZ2dlci53YXJuKCdbSW5nZXN0Um91dGVzXSBJbnZhbGlkIGxvZyBwYXlsb2FkJywgeyByZWNlaXZlZCwgaGFzU2Vzc2lvbklkOiAhIXBheWxvYWQ/LnNlc3Npb25JZCwgaGFzRW50cmllczogQXJyYXkuaXNBcnJheShwYXlsb2FkPy5lbnRyaWVzKSB9KTtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6ICdJbnZhbGlkIHBheWxvYWQnLCByZXF1aXJlZDogWydzZXNzaW9uSWQnLCAnZW50cmllcyddLCByZWNlaXZlZCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGF5bG9hZC5zZXNzaW9uSWQgPSBub3JtYWxpemVJbnB1dChwYXlsb2FkLnNlc3Npb25JZCk7XG5cbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGxldCBza2lwcGVkID0gMDtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBheWxvYWQuZW50cmllcykge1xuICAgICAgaWYgKCFlbnRyeSB8fCB0eXBlb2YgZW50cnkubWVzc2FnZSAhPT0gJ3N0cmluZycpIHsgc2tpcHBlZCsrOyBjb250aW51ZTsgfVxuICAgICAgY29uc3Qgc3RhbXBlZDogVW5pZmllZExvZ0VudHJ5ID0ge1xuICAgICAgICAuLi5lbnRyeSxcbiAgICAgICAgZGF0YTogeyAuLi5lbnRyeS5kYXRhLCBfc2Vzc2lvbklkOiBwYXlsb2FkLnNlc3Npb25JZCB9LFxuICAgICAgfTtcbiAgICAgIGJyb2FkY2FzdHMubG9nQnJvYWRjYXN0KHN0YW1wZWQpO1xuICAgICAgY291bnQrKztcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgaGVhcnRiZWF0LCByZXZpdmUgZW5kZWQgc2Vzc2lvbnMsIG9yIGF1dG8tcmVnaXN0ZXIgb3JwaGFucyAoIzE4NzApXG4gICAgY29uc3Qgc2Vzc2lvbiA9IGVuc3VyZVNlc3Npb24ocGF5bG9hZC5zZXNzaW9uSWQpO1xuXG4gICAgaWYgKHNraXBwZWQgPiAwKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYFtJbmdlc3RSb3V0ZXNdIExvZyBpbmdlc3QgZnJvbSAke3Nlc3Npb24/LmRpc3BsYXlOYW1lID8/IHBheWxvYWQuc2Vzc2lvbklkfTogYWNjZXB0ZWQ9JHtjb3VudH0sIHNraXBwZWQ9JHtza2lwcGVkfWApO1xuICAgIH1cblxuICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgYWNjZXB0ZWQ6IGNvdW50LCBza2lwcGVkIH0pO1xuICB9KTtcblxuICAvKipcbiAgICogUE9TVCAvYXBpL2luZ2VzdC9tZXRyaWNzIOKAlCBSZWNlaXZlIG1ldHJpYyBzbmFwc2hvdHMgZnJvbSBhIGZvbGxvd2VyLlxuICAgKi9cbiAgcm91dGVyLnBvc3QoJy9hcGkvaW5nZXN0L21ldHJpY3MnLCAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKCFyYXRlTGltaXRlci50cnlBY3F1aXJlKCkpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDI5KS5qc29uKHsgZXJyb3I6ICdSYXRlIGxpbWl0IGV4Y2VlZGVkJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkID0gcmVxLmJvZHkgYXMgSW5nZXN0TWV0cmljc1BheWxvYWQ7XG4gICAgaWYgKCFwYXlsb2FkPy5zZXNzaW9uSWQgfHwgIXBheWxvYWQuc25hcHNob3QpIHtcbiAgICAgIGNvbnN0IHJlY2VpdmVkID0gcGF5bG9hZCA/IE9iamVjdC5rZXlzKHBheWxvYWQpIDogW107XG4gICAgICBsb2dnZXIud2FybignW0luZ2VzdFJvdXRlc10gSW52YWxpZCBtZXRyaWNzIHBheWxvYWQnLCB7IHJlY2VpdmVkIH0pO1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogJ0ludmFsaWQgcGF5bG9hZCcsIHJlcXVpcmVkOiBbJ3Nlc3Npb25JZCcsICdzbmFwc2hvdCddLCByZWNlaXZlZCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGF5bG9hZC5zZXNzaW9uSWQgPSBub3JtYWxpemVJbnB1dChwYXlsb2FkLnNlc3Npb25JZCk7XG5cbiAgICBpZiAoYnJvYWRjYXN0cy5tZXRyaWNzT25TbmFwc2hvdCkge1xuICAgICAgYnJvYWRjYXN0cy5tZXRyaWNzT25TbmFwc2hvdChwYXlsb2FkLnNuYXBzaG90KTtcbiAgICB9XG4gICAgaWYgKGJyb2FkY2FzdHMuc3RvcmVNZXRyaWNzU25hcHNob3QpIHtcbiAgICAgIGJyb2FkY2FzdHMuc3RvcmVNZXRyaWNzU25hcHNob3QocGF5bG9hZC5zbmFwc2hvdCwgcGF5bG9hZC5zZXNzaW9uSWQpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBoZWFydGJlYXQsIHJldml2ZSBlbmRlZCBzZXNzaW9ucywgb3IgYXV0by1yZWdpc3RlciBvcnBoYW5zICgjMTg3MClcbiAgICBjb25zdCBzZXNzaW9uID0gZW5zdXJlU2Vzc2lvbihwYXlsb2FkLnNlc3Npb25JZCk7XG4gICAgbG9nZ2VyLmRlYnVnKGBbSW5nZXN0Um91dGVzXSBNZXRyaWNzIGluZ2VzdGVkIGZyb20gJHtzZXNzaW9uPy5kaXNwbGF5TmFtZSA/PyBwYXlsb2FkLnNlc3Npb25JZH1gKTtcbiAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7IGFjY2VwdGVkOiB0cnVlIH0pO1xuICB9KTtcblxuICAvKipcbiAgICogUE9TVCAvYXBpL2luZ2VzdC9zZXNzaW9uIOKAlCBTZXNzaW9uIGxpZmVjeWNsZSBldmVudHMuXG4gICAqL1xuICByb3V0ZXIucG9zdCgnL2FwaS9pbmdlc3Qvc2Vzc2lvbicsIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCBwYXlsb2FkID0gcmVxLmJvZHkgYXMgU2Vzc2lvbkV2ZW50UGF5bG9hZDtcbiAgICBpZiAoIXBheWxvYWQ/LnNlc3Npb25JZCB8fCAhcGF5bG9hZC5ldmVudCkge1xuICAgICAgY29uc3QgcmVjZWl2ZWQgPSBwYXlsb2FkID8gT2JqZWN0LmtleXMocGF5bG9hZCkgOiBbXTtcbiAgICAgIGxvZ2dlci53YXJuKCdbSW5nZXN0Um91dGVzXSBJbnZhbGlkIHNlc3Npb24gZXZlbnQgcGF5bG9hZCcsIHsgcmVjZWl2ZWQgfSk7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yOiAnSW52YWxpZCBwYXlsb2FkJywgcmVxdWlyZWQ6IFsnc2Vzc2lvbklkJywgJ2V2ZW50J10sIHJlY2VpdmVkIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwYXlsb2FkLnNlc3Npb25JZCA9IG5vcm1hbGl6ZUlucHV0KHBheWxvYWQuc2Vzc2lvbklkKTtcblxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcblxuICAgIHN3aXRjaCAocGF5bG9hZC5ldmVudCkge1xuICAgICAgY2FzZSAnc3RhcnRlZCc6IHtcbiAgICAgICAgLy8gS2lsbGVkIHNlc3Npb25zIHN0YXkgZGVhZDsgcGVuZGluZyBraWxscyBnZXQgZmluYWxpemVkICgjMTg3MClcbiAgICAgICAgaWYgKGtpbGxlZFNlc3Npb25zLmhhcyhwYXlsb2FkLnNlc3Npb25JZCkpIGJyZWFrO1xuICAgICAgICBpZiAocGVuZGluZ0tpbGxzLmhhcyhwYXlsb2FkLnNlc3Npb25JZCkpIHsgZmluYWxpemVQZW5kaW5nS2lsbChwYXlsb2FkLnNlc3Npb25JZCwgcGF5bG9hZC5waWQpOyBicmVhazsgfVxuXG4gICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gbmFtZVBvb2wuYXNzaWduKHBheWxvYWQuc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc3QgY29sb3IgPSBuYW1lUG9vbC5nZXRDb2xvcihwYXlsb2FkLnNlc3Npb25JZCkgPz8gJyMzYjgyZjYnO1xuICAgICAgICBjb25zdCBpc0F1dGhlbnRpY2F0ZWQgPSBCb29sZWFuKChyZXMgYXMgYW55KS5sb2NhbHM/LnRva2VuRW50cnkpO1xuICAgICAgICBzZXNzaW9ucy5zZXQocGF5bG9hZC5zZXNzaW9uSWQsIHtcbiAgICAgICAgICBzZXNzaW9uSWQ6IHBheWxvYWQuc2Vzc2lvbklkLCBkaXNwbGF5TmFtZSwgY29sb3IsXG4gICAgICAgICAgcGlkOiBwYXlsb2FkLnBpZCwgc3RhcnRlZEF0OiBwYXlsb2FkLnN0YXJ0ZWRBdCB8fCBub3csIGxhc3RIZWFydGJlYXQ6IG5vdyxcbiAgICAgICAgICBzdGF0dXM6ICdhY3RpdmUnLCBpc0xlYWRlcjogZmFsc2UsIGF1dGhlbnRpY2F0ZWQ6IGlzQXV0aGVudGljYXRlZCwga2luZDogJ21jcCcsXG4gICAgICAgICAgc2VydmVyVmVyc2lvbjogbm9ybWFsaXplU2VydmVyVmVyc2lvbihwYXlsb2FkLnNlcnZlclZlcnNpb24pLFxuICAgICAgICAgIGNvbnNvbGVQcm90b2NvbFZlcnNpb246IG5vcm1hbGl6ZUNvbnNvbGVQcm90b2NvbFZlcnNpb24ocGF5bG9hZC5jb25zb2xlUHJvdG9jb2xWZXJzaW9uKSxcbiAgICAgICAgfSk7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdbSW5nZXN0Um91dGVzXSBTZXNzaW9uIHJlZ2lzdGVyZWQnLCB7XG4gICAgICAgICAgZGlzcGxheU5hbWUsIHNlc3Npb25JZDogcGF5bG9hZC5zZXNzaW9uSWQsIHBpZDogcGF5bG9hZC5waWQsIGNvbG9yLFxuICAgICAgICAgIGFjdGl2ZVNlc3Npb25zOiBBcnJheS5mcm9tKHNlc3Npb25zLnZhbHVlcygpKS5maWx0ZXIocyA9PiBzLnN0YXR1cyA9PT0gJ2FjdGl2ZScpLmxlbmd0aCxcbiAgICAgICAgfSk7XG4gICAgICAgIGJyb2FkY2FzdHMuc2Vzc2lvbkJyb2FkY2FzdD8uKHNlc3Npb25zLmdldChwYXlsb2FkLnNlc3Npb25JZCkhKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdzdG9wcGVkJzoge1xuICAgICAgICBjb25zdCBleGlzdGluZyA9IHNlc3Npb25zLmdldChwYXlsb2FkLnNlc3Npb25JZCk7XG4gICAgICAgIGlmIChleGlzdGluZykge1xuICAgICAgICAgIGV4aXN0aW5nLnN0YXR1cyA9ICdlbmRlZCc7XG4gICAgICAgICAgZXhpc3RpbmcubGFzdEhlYXJ0YmVhdCA9IG5vdztcbiAgICAgICAgICBuYW1lUG9vbC5yZWxlYXNlKHBheWxvYWQuc2Vzc2lvbklkKTtcbiAgICAgICAgICBsb2dnZXIuaW5mbygnW0luZ2VzdFJvdXRlc10gU2Vzc2lvbiBzdG9wcGVkJywge1xuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGV4aXN0aW5nLmRpc3BsYXlOYW1lLCBzZXNzaW9uSWQ6IHBheWxvYWQuc2Vzc2lvbklkLCBwaWQ6IGV4aXN0aW5nLnBpZCxcbiAgICAgICAgICAgIGFjdGl2ZVNlc3Npb25zOiBBcnJheS5mcm9tKHNlc3Npb25zLnZhbHVlcygpKS5maWx0ZXIocyA9PiBzLnN0YXR1cyA9PT0gJ2FjdGl2ZScpLmxlbmd0aCAtIDEsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJvYWRjYXN0cy5zZXNzaW9uQnJvYWRjYXN0Py4oZXhpc3RpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnaGVhcnRiZWF0Jzoge1xuICAgICAgICAvLyBBdXRvLXJlZ2lzdGVyIG9yIHVwZGF0ZSDigJQgaGVhcnRiZWF0IGluY2x1ZGVzIFBJRCBmb3IgcmVjb3ZlcnkgKCMxODcwKVxuICAgICAgICBlbnN1cmVTZXNzaW9uKFxuICAgICAgICAgIHBheWxvYWQuc2Vzc2lvbklkLFxuICAgICAgICAgIHBheWxvYWQucGlkLFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIHBheWxvYWQuc2VydmVyVmVyc2lvbixcbiAgICAgICAgICBwYXlsb2FkLmNvbnNvbGVQcm90b2NvbFZlcnNpb24sXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgb2s6IHRydWUgfSk7XG4gIH0pO1xuXG4gIC8qKlxuICAgKiBHRVQgL2FwaS9zZXNzaW9ucyDigJQgTGlzdCBhbGwgdHJhY2tlZCBzZXNzaW9ucy5cbiAgICovXG4gIHJvdXRlci5nZXQoJy9hcGkvc2Vzc2lvbnMnLCBhc3luYyAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgIC8vIFNlcnZlci1zaWRlIGFjdGl2ZSBmaWx0ZXIg4oCUIHRoZSBmcm9udGVuZCBhbHNvIGZpbHRlcnMsIGJ1dCBlbmRlZCBzZXNzaW9uc1xuICAgIC8vIHNob3VsZCBuZXZlciBsZWF2ZSB0aGUgQVBJIHRvIHByZXZlbnQgc3RhbGUgVUkgKCMxODcwKS5cbiAgICBjb25zdCBsb2NhbFNlc3Npb25zID0gQXJyYXkuZnJvbShzZXNzaW9ucy52YWx1ZXMoKSkuZmlsdGVyKHMgPT4gcy5zdGF0dXMgPT09ICdhY3RpdmUnKTtcbiAgICBjb25zdCBjdXJyZW50UG9ydCA9IGVudi5ET0xMSE9VU0VfV0VCX0NPTlNPTEVfUE9SVCA/PyA0MTcxNTtcblxuICAgIC8vIEZlZGVyYXRlIHdpdGggdGhlIGxlZ2FjeSBwb3J0ICgzOTM5KSB0byBzaG93IGFsbCBzZXNzaW9ucyBvbiB0aGVcbiAgICAvLyBtYWNoaW5lLCBpbmNsdWRpbmcgdW5hdXRoZW50aWNhdGVkIG9uZXMgZnJvbSBwcmUtYXV0aCBpbnN0YWxscy5cbiAgICAvLyBTZXJ2ZXItdG8tc2VydmVyIGF2b2lkcyBDT1JTIHJlc3RyaWN0aW9ucyAoIzE4MDUpLlxuICAgIGlmIChjdXJyZW50UG9ydCAhPT0gMzkzOSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCBMRUdBQ1lfRkVUQ0hfVElNRU9VVF9NUyk7XG4gICAgICAgIGNvbnN0IGxlZ2FjeVJlcyA9IGF3YWl0IGZldGNoKCdodHRwOi8vMTI3LjAuMC4xOjM5MzkvYXBpL3Nlc3Npb25zJywge1xuICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIH0pO1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgIGlmIChsZWdhY3lSZXMub2spIHtcbiAgICAgICAgICBjb25zdCBsZWdhY3lEYXRhID0gYXdhaXQgbGVnYWN5UmVzLmpzb24oKSBhcyB7IHNlc3Npb25zOiBTZXNzaW9uSW5mb1tdIH07XG4gICAgICAgICAgY29uc3QgbG9jYWxJZHMgPSBuZXcgU2V0KGxvY2FsU2Vzc2lvbnMubWFwKHMgPT4gcy5zZXNzaW9uSWQpKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGxzIG9mIChsZWdhY3lEYXRhLnNlc3Npb25zIHx8IFtdKSkge1xuICAgICAgICAgICAgaWYgKCFsb2NhbElkcy5oYXMobHMuc2Vzc2lvbklkKSAmJiBscy5zdGF0dXMgPT09ICdhY3RpdmUnKSB7XG4gICAgICAgICAgICAgIGxvY2FsU2Vzc2lvbnMucHVzaCh7XG4gICAgICAgICAgICAgICAgLi4ubHMsXG4gICAgICAgICAgICAgICAgYXV0aGVudGljYXRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAga2luZDogbHMua2luZCB8fCAnbWNwJyxcbiAgICAgICAgICAgICAgICBzZXJ2ZXJWZXJzaW9uOiBub3JtYWxpemVTZXJ2ZXJWZXJzaW9uKGxzLnNlcnZlclZlcnNpb24pLFxuICAgICAgICAgICAgICAgIGNvbnNvbGVQcm90b2NvbFZlcnNpb246IG5vcm1hbGl6ZUNvbnNvbGVQcm90b2NvbFZlcnNpb24obHMuY29uc29sZVByb3RvY29sVmVyc2lvbiksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIExlZ2FjeSBpbnN0YW5jZSBub3QgcnVubmluZyBvciB1bnJlYWNoYWJsZSDigJQgdGhhdCdzIGZpbmVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXMuanNvbih7IHNlc3Npb25zOiBsb2NhbFNlc3Npb25zIH0pO1xuICB9KTtcblxuICAvKipcbiAgICogUE9TVCAvYXBpL3Nlc3Npb25zLzpzZXNzaW9uSWQva2lsbCDigJQgVGVybWluYXRlIGEgc2Vzc2lvbidzIHNlcnZlciBwcm9jZXNzLlxuICAgKi9cbiAgcm91dGVyLnBvc3QoJy9hcGkvc2Vzc2lvbnMvOnNlc3Npb25JZC9raWxsJywgYXN5bmMgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgIGNvbnN0IHNlc3Npb25JZCA9IHJlcS5wYXJhbXNbJ3Nlc3Npb25JZCddIGFzIHN0cmluZztcbiAgICBjb25zdCBzZXNzaW9uID0gc2Vzc2lvbnMuZ2V0KHNlc3Npb25JZCk7XG5cbiAgICBpZiAoIXNlc3Npb24pIHtcbiAgICAgIC8vIFNlc3Npb24gbm90IGluIGxvY2FsIE1hcCDigJQgdHJ5IHByb3h5aW5nIGtpbGwgdG8gbGVnYWN5IHBvcnQgKCMxODcwKVxuICAgICAgY29uc3QgY3VycmVudFBvcnQgPSBlbnYuRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlQgPz8gNDE3MTU7XG4gICAgICBpZiAoY3VycmVudFBvcnQgIT09IDM5MzkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgTEVHQUNZX0ZFVENIX1RJTUVPVVRfTVMpO1xuICAgICAgICAgIGNvbnN0IHByb3h5UmVzID0gYXdhaXQgZmV0Y2goYGh0dHA6Ly8xMjcuMC4wLjE6MzkzOS9hcGkvc2Vzc2lvbnMvJHtlbmNvZGVVUklDb21wb25lbnQoc2Vzc2lvbklkKX0va2lsbGAsIHtcbiAgICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgaWYgKHByb3h5UmVzLm9rKSB7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0gYXdhaXQgcHJveHlSZXMuanNvbigpO1xuICAgICAgICAgICAgcmVzLmpzb24oZGF0YSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBMZWdhY3kgaW5zdGFuY2Ugbm90IHJ1bm5pbmcg4oCUIGZhbGwgdGhyb3VnaCB0byA0MDRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbG9nZ2VyLndhcm4oJ1tJbmdlc3RSb3V0ZXNdIEtpbGwgcmVxdWVzdGVkIGZvciB1bmtub3duIHNlc3Npb24nLCB7IHNlc3Npb25JZCB9KTtcbiAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHsgZXJyb3I6ICdTZXNzaW9uIG5vdCBmb3VuZCcsIHNlc3Npb25JZCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXNlc3Npb24ucGlkKSB7XG4gICAgICAvLyBBdXRvLXJlZ2lzdGVyZWQgb3JwaGFuIHdpdGggdW5rbm93biBQSUQg4oCUIHF1ZXVlIGZvciBkZWZlcnJlZCBraWxsICgjMTg3MCkuXG4gICAgICAvLyBUaGUgbmV4dCBoZWFydGJlYXQgKGV2ZXJ5IH4xMHMpIGNhcnJpZXMgdGhlIFBJRC4gZW5zdXJlU2Vzc2lvbigpIHdpbGxcbiAgICAgIC8vIFNJR1RFUk0gdGhlIHByb2Nlc3MgYXMgc29vbiBhcyB0aGUgUElEIGFycml2ZXMuIFNlc3Npb24gaXMgZ29uZSBmb3IgZ29vZC5cbiAgICAgIHNlc3Npb24uc3RhdHVzID0gJ2VuZGVkJztcbiAgICAgIG5hbWVQb29sLnJlbGVhc2Uoc2Vzc2lvbklkKTtcbiAgICAgIHBlbmRpbmdLaWxscy5hZGQoc2Vzc2lvbklkKTtcbiAgICAgIGxvZ2dlci5pbmZvKCdbSW5nZXN0Um91dGVzXSBRdWV1ZWQgZGVmZXJyZWQga2lsbCDigJQgd2FpdGluZyBmb3IgUElEIHZpYSBoZWFydGJlYXQnLCB7XG4gICAgICAgIGRpc3BsYXlOYW1lOiBzZXNzaW9uLmRpc3BsYXlOYW1lLCBzZXNzaW9uSWQsXG4gICAgICB9KTtcbiAgICAgIHJlcy5qc29uKHsgb2s6IHRydWUsIGRpc21pc3NlZDogc2Vzc2lvbi5kaXNwbGF5TmFtZSwgcmVhc29uOiAncGVuZGluZy1raWxsJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTSUdURVJNIHRoZSBwcm9jZXNzLiBFdmVuIGlmIGl0IGZhaWxzIChFU1JDSCA9IGFscmVhZHkgZGVhZCwgRVBFUk0gPSBub3Qgb3VycyksXG4gICAgLy8gbWFyayB0aGUgc2Vzc2lvbiBhcyBwZXJtYW5lbnRseSBraWxsZWQgc28gaXQgbmV2ZXIgcmVhcHBlYXJzICgjMTg3MCkuXG4gICAgdHJ5IHtcbiAgICAgIHByb2Nlc3Mua2lsbChzZXNzaW9uLnBpZCwgJ1NJR1RFUk0nKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSAoZXJyIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbikuY29kZTtcbiAgICAgIGlmIChjb2RlID09PSAnRVNSQ0gnKSB7XG4gICAgICAgIC8vIFByb2Nlc3MgYWxyZWFkeSBkZWFkIOKAlCB0cmVhdCBhcyBzdWNjZXNzZnVsIGtpbGwuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2dnZXIuZXJyb3IoJ1tJbmdlc3RSb3V0ZXNdIEZhaWxlZCB0byBraWxsIHNlc3Npb24nLCB7XG4gICAgICAgICAgZGlzcGxheU5hbWU6IHNlc3Npb24uZGlzcGxheU5hbWUsIHNlc3Npb25JZCwgcGlkOiBzZXNzaW9uLnBpZCwgZXJyb3I6IChlcnIgYXMgRXJyb3IpLm1lc3NhZ2UsXG4gICAgICAgIH0pO1xuICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiAnRmFpbGVkIHRvIGtpbGwgc2Vzc2lvbicsIHNlc3Npb25JZCwgZGlzcGxheU5hbWU6IHNlc3Npb24uZGlzcGxheU5hbWUsIHBpZDogc2Vzc2lvbi5waWQsIGRldGFpbDogKGVyciBhcyBFcnJvcikubWVzc2FnZSB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgICBzZXNzaW9uLnN0YXR1cyA9ICdlbmRlZCc7XG4gICAgbmFtZVBvb2wucmVsZWFzZShzZXNzaW9uSWQpO1xuICAgIGtpbGxlZFNlc3Npb25zLmFkZChzZXNzaW9uSWQpO1xuICAgIGxvZ2dlci5pbmZvKCdbSW5nZXN0Um91dGVzXSBTZXNzaW9uIGtpbGxlZCcsIHtcbiAgICAgIGRpc3BsYXlOYW1lOiBzZXNzaW9uLmRpc3BsYXlOYW1lLCBzZXNzaW9uSWQsIHBpZDogc2Vzc2lvbi5waWQsXG4gICAgICBhY3RpdmVTZXNzaW9uczogQXJyYXkuZnJvbShzZXNzaW9ucy52YWx1ZXMoKSkuZmlsdGVyKHMgPT4gcy5zdGF0dXMgPT09ICdhY3RpdmUnKS5sZW5ndGggLSAxLFxuICAgIH0pO1xuICAgIHJlcy5qc29uKHsgb2s6IHRydWUsIGtpbGxlZDogc2Vzc2lvbi5kaXNwbGF5TmFtZSwgcGlkOiBzZXNzaW9uLnBpZCB9KTtcbiAgfSk7XG5cbiAgLyoqIE1hcmsgc3RhbGUgYWN0aXZlIHNlc3Npb25zIGFzIGVuZGVkLiAqL1xuICBmdW5jdGlvbiByZWFwU3RhbGVTZXNzaW9ucyhub3c6IG51bWJlcik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW2lkLCBzZXNzaW9uXSBvZiBzZXNzaW9ucykge1xuICAgICAgaWYgKHNlc3Npb24uc3RhdHVzICE9PSAnYWN0aXZlJykgY29udGludWU7XG4gICAgICBpZiAoc2Vzc2lvbi5pc0xlYWRlciB8fCBzZXNzaW9uLmtpbmQgPT09ICdjb25zb2xlJykgY29udGludWU7XG4gICAgICBjb25zdCBhZ2UgPSBub3cgLSBuZXcgRGF0ZShzZXNzaW9uLmxhc3RIZWFydGJlYXQpLmdldFRpbWUoKTtcbiAgICAgIGlmIChhZ2UgPD0gU0VTU0lPTl9TVEFMRV9NUykgY29udGludWU7XG4gICAgICBzZXNzaW9uLnN0YXR1cyA9ICdlbmRlZCc7XG4gICAgICBuYW1lUG9vbC5yZWxlYXNlKGlkKTtcbiAgICAgIGxvZ2dlci5pbmZvKCdbSW5nZXN0Um91dGVzXSBSZWFwZWQgc3RhbGUgc2Vzc2lvbicsIHtcbiAgICAgICAgZGlzcGxheU5hbWU6IHNlc3Npb24uZGlzcGxheU5hbWUsIHNlc3Npb25JZDogaWQsIHBpZDogc2Vzc2lvbi5waWQsXG4gICAgICAgIGxhc3RIZWFydGJlYXRBZ286IGAke01hdGgucm91bmQoYWdlIC8gMTAwMCl9c2AsXG4gICAgICAgIGFjdGl2ZVNlc3Npb25zOiBBcnJheS5mcm9tKHNlc3Npb25zLnZhbHVlcygpKS5maWx0ZXIocyA9PiBzLnN0YXR1cyA9PT0gJ2FjdGl2ZScpLmxlbmd0aCAtIDEsXG4gICAgICB9KTtcbiAgICAgIGJyb2FkY2FzdHMuc2Vzc2lvbkJyb2FkY2FzdD8uKHNlc3Npb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBEZWxldGUgZW5kZWQgc2Vzc2lvbnMgdG8gYm91bmQgbWVtb3J5ICgjMTg3MCkuICovXG4gIGZ1bmN0aW9uIHB1cmdlU3RhbGVFbnRyaWVzKG5vdzogbnVtYmVyKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBbaWQsIHNlc3Npb25dIG9mIHNlc3Npb25zKSB7XG4gICAgICBpZiAoc2Vzc2lvbi5zdGF0dXMgPT09ICdlbmRlZCcgJiYgbm93IC0gbmV3IERhdGUoc2Vzc2lvbi5sYXN0SGVhcnRiZWF0KS5nZXRUaW1lKCkgPiBFTkRFRF9QVVJHRV9NUykge1xuICAgICAgICBzZXNzaW9ucy5kZWxldGUoaWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlYXBlckludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgcmVhcFN0YWxlU2Vzc2lvbnMobm93KTtcbiAgICBwdXJnZVN0YWxlRW50cmllcyhub3cpO1xuICB9LCBSRUFQRVJfSU5URVJWQUxfTVMpO1xuICByZWFwZXJJbnRlcnZhbC51bnJlZigpO1xuXG4gIGZ1bmN0aW9uIGdldFNlc3Npb25zKCk6IFNlc3Npb25JbmZvW10ge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHNlc3Npb25zLnZhbHVlcygpKS5maWx0ZXIocyA9PiBzLnN0YXR1cyA9PT0gJ2FjdGl2ZScpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVnaXN0ZXJMZWFkZXJTZXNzaW9uKHNlc3Npb25JZDogc3RyaW5nLCBwaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gbmFtZVBvb2wuYXNzaWduKHNlc3Npb25JZCwgdHJ1ZSk7XG4gICAgY29uc3QgY29sb3IgPSBuYW1lUG9vbC5nZXRDb2xvcihzZXNzaW9uSWQpID8/ICcjM2I4MmY2JztcbiAgICBzZXNzaW9ucy5zZXQoc2Vzc2lvbklkLCB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBkaXNwbGF5TmFtZSxcbiAgICAgIGNvbG9yLFxuICAgICAgcGlkLFxuICAgICAgc3RhcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBsYXN0SGVhcnRiZWF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBzdGF0dXM6ICdhY3RpdmUnLFxuICAgICAgaXNMZWFkZXI6IHRydWUsXG4gICAgICBhdXRoZW50aWNhdGVkOiB0cnVlLFxuICAgICAga2luZDogJ21jcCcsXG4gICAgICBzZXJ2ZXJWZXJzaW9uOiBQQUNLQUdFX1ZFUlNJT04sXG4gICAgICBjb25zb2xlUHJvdG9jb2xWZXJzaW9uOiBDT05TT0xFX1BST1RPQ09MX1ZFUlNJT04sXG4gICAgfSk7XG4gICAgbG9nZ2VyLmluZm8oJ1tJbmdlc3RSb3V0ZXNdIExlYWRlciBzZXNzaW9uIHJlZ2lzdGVyZWQnLCB7IGRpc3BsYXlOYW1lLCBzZXNzaW9uSWQsIHBpZCwgY29sb3IgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgdGhlIHdlYiBjb25zb2xlIGl0c2VsZiBhcyBhIHNlc3Npb24gKCMxODA1KS4gRW5zdXJlcyB0aGVcbiAgICogc2Vzc2lvbiBpbmRpY2F0b3IgYWx3YXlzIHNob3dzIGF0IGxlYXN0IG9uZSBlbnRyeSDigJQgdGhlIGNvbnNvbGUgdGhlXG4gICAqIHVzZXIgaXMgY3VycmVudGx5IGxvb2tpbmcgYXQuXG4gICAqL1xuICBmdW5jdGlvbiByZWdpc3RlckNvbnNvbGVTZXNzaW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnNvbGVJZCA9IGBjb25zb2xlLSR7cHJvY2Vzcy5waWR9YDtcbiAgICBpZiAoc2Vzc2lvbnMuaGFzKGNvbnNvbGVJZCkpIHJldHVybjtcbiAgICBjb25zdCBkaXNwbGF5TmFtZSA9ICdXZWIgQ29uc29sZSc7XG4gICAgc2Vzc2lvbnMuc2V0KGNvbnNvbGVJZCwge1xuICAgICAgc2Vzc2lvbklkOiBjb25zb2xlSWQsXG4gICAgICBkaXNwbGF5TmFtZSxcbiAgICAgIGNvbG9yOiAnIzYzNjZmMScsIC8vIGluZGlnbyDigJQgZGlzdGluY3QgZnJvbSBwdXBwZXQgZ3JlZW5zL2JsdWVzXG4gICAgICBwaWQ6IHByb2Nlc3MucGlkLFxuICAgICAgc3RhcnRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBsYXN0SGVhcnRiZWF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICBzdGF0dXM6ICdhY3RpdmUnLFxuICAgICAgaXNMZWFkZXI6IGZhbHNlLFxuICAgICAgYXV0aGVudGljYXRlZDogdHJ1ZSxcbiAgICAgIGtpbmQ6ICdjb25zb2xlJyxcbiAgICAgIHNlcnZlclZlcnNpb246IFBBQ0tBR0VfVkVSU0lPTixcbiAgICAgIGNvbnNvbGVQcm90b2NvbFZlcnNpb246IENPTlNPTEVfUFJPVE9DT0xfVkVSU0lPTixcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbygnW0luZ2VzdFJvdXRlc10gQ29uc29sZSBzZXNzaW9uIHJlZ2lzdGVyZWQnLCB7IHNlc3Npb25JZDogY29uc29sZUlkLCBwaWQ6IHByb2Nlc3MucGlkIH0pO1xuICB9XG5cbiAgcmV0dXJuIHsgcm91dGVyLCBnZXRTZXNzaW9ucywgcmVnaXN0ZXJMZWFkZXJTZXNzaW9uLCByZWdpc3RlckNvbnNvbGVTZXNzaW9uIH07XG59XG4iXX0=
|
|
504
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5nZXN0Um91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dlYi9jb25zb2xlL0luZ2VzdFJvdXRlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUkxQyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUNqRixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUNMLHdCQUF3QixFQUN4QiwrQkFBK0IsR0FDaEMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQ0wsNkJBQTZCLEVBQzdCLGdDQUFnQyxHQUVqQyxNQUFNLDRCQUE0QixDQUFDO0FBRXBDLGtEQUFrRDtBQUNsRCxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQztBQUUvQixxREFBcUQ7QUFDckQsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDO0FBQzVCLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDO0FBRXBDLGlEQUFpRDtBQUNqRCxNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQztBQUVqQyw2RUFBNkU7QUFDN0UsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUM7QUFFaEMsNkRBQTZEO0FBQzdELE1BQU0sdUJBQXVCLEdBQUcsS0FBSyxDQUFDO0FBRXRDLGtFQUFrRTtBQUNsRSxNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFD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LEVBQUUscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztBQUNoRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBFdmVudCBpbmdlc3Rpb24gcm91dGVzIGZvciB0aGUgdW5pZmllZCB3ZWIgY29uc29sZS5cbiAqXG4gKiBUaGUgY29uc29sZSBsZWFkZXIgbW91bnRzIHRoZXNlIHJvdXRlcyBzbyBmb2xsb3dlciBNQ1Agc2VydmVycyBjYW5cbiAqIGZvcndhcmQgdGhlaXIgbG9ncywgbWV0cmljcywgYW5kIHNlc3Npb24gbGlmZWN5Y2xlIGV2ZW50cy4gQWxsIGluZ2VzdGVkXG4gKiBlbnRyaWVzIGFyZSBzdGFtcGVkIHdpdGggYF9zZXNzaW9uSWRgIGluIHRoZWlyIGRhdGEgZmllbGQgYW5kIHRoZW5cbiAqIGJyb2FkY2FzdCB0byBTU0UgY2xpZW50cyB2aWEgdGhlIGV4aXN0aW5nIGxvZy9tZXRyaWNzIGJyb2FkY2FzdCBob29rcy5cbiAqXG4gKiBSb3V0ZXM6XG4gKiAtIFBPU1QgL2FwaS9pbmdlc3QvbG9ncyAgICAg4oCUIEJhdGNoZWQgbG9nIGVudHJpZXMgZnJvbSBhIGZvbGxvd2VyXG4gKiAtIFBPU1QgL2FwaS9pbmdlc3QvbWV0cmljcyAg4oCUIE1ldHJpYyBzbmFwc2hvdHMgZnJvbSBhIGZvbGxvd2VyXG4gKiAtIFBPU1QgL2FwaS9pbmdlc3Qvc2Vzc2lvbiAg4oCUIFNlc3Npb24gbGlmZWN5Y2xlIGV2ZW50cyAoc3RhcnRlZC9zdG9wcGVkL2hlYXJ0YmVhdClcbiAqIC0gR0VUICAvYXBpL3Nlc3Npb25zICAgICAgICDigJQgQWN0aXZlIHNlc3Npb24gbGlzdCBmb3IgdGhlIFVJXG4gKlxuICogQHNpbmNlIHYyLjEuMCDigJQgSXNzdWUgIzE3MDBcbiAqL1xuXG5pbXBvcnQgZXhwcmVzcywgeyBSb3V0ZXIgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB0eXBlIHsgVW5pZmllZExvZ0VudHJ5IH0gZnJvbSAnLi4vLi4vbG9nZ2luZy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1ldHJpY1NuYXBzaG90IH0gZnJvbSAnLi4vLi4vbWV0cmljcy90eXBlcy5qcyc7XG5pbXBvcnQgeyBTbGlkaW5nV2luZG93UmF0ZUxpbWl0ZXIgfSBmcm9tICcuLi8uLi91dGlscy9TbGlkaW5nV2luZG93UmF0ZUxpbWl0ZXIuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uLy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZXNzaW9uTmFtZVBvb2wgfSBmcm9tICcuL1Nlc3Npb25OYW1lcy5qcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZW52IH0gZnJvbSAnLi4vLi4vY29uZmlnL2Vudi5qcyc7XG5pbXBvcnQgeyBQQUNLQUdFX1ZFUlNJT04gfSBmcm9tICcuLi8uLi9nZW5lcmF0ZWQvdmVyc2lvbi5qcyc7XG5pbXBvcnQge1xuICBDT05TT0xFX1BST1RPQ09MX1ZFUlNJT04sXG4gIExFR0FDWV9DT05TT0xFX1BST1RPQ09MX1ZFUlNJT04sXG59IGZyb20gJy4vTGVhZGVyRWxlY3Rpb24uanMnO1xuaW1wb3J0IHtcbiAgZ2V0U2Vzc2lvbkNsaWVudFBsYXRmb3JtTGFiZWwsXG4gIG5vcm1hbGl6ZVNlc3Npb25DbGllbnRQbGF0Zm9ybUlkLFxuICB0eXBlIFNlc3Npb25DbGllbnRQbGF0Zm9ybUlkLFxufSBmcm9tICcuL3Nlc3Npb25DbGllbnRQbGF0Zm9ybS5qcyc7XG5cbi8qKiBNYXhpbXVtIHBheWxvYWQgc2l6ZSBmb3IgaW5nZXN0aW9uIHJlcXVlc3RzICovXG5jb25zdCBNQVhfUEFZTE9BRF9TSVpFID0gJzFtYic7XG5cbi8qKiBSYXRlIGxpbWl0OiBtYXggcmVxdWVzdHMgcGVyIHdpbmRvdyBwZXIgc291cmNlICovXG5jb25zdCBSQVRFX0xJTUlUX01BWCA9IDEwMDA7XG5jb25zdCBSQVRFX0xJTUlUX1dJTkRPV19NUyA9IDYwXzAwMDtcblxuLyoqIEhvdyBvZnRlbiB0byBjaGVjayBmb3Igc3RhbGUgc2Vzc2lvbnMgKG1zKSAqL1xuY29uc3QgUkVBUEVSX0lOVEVSVkFMX01TID0gNV8wMDA7XG5cbi8qKiBIb3cgbG9uZyBzaW5jZSBsYXN0IGhlYXJ0YmVhdCBiZWZvcmUgYSBzZXNzaW9uIGlzIGNvbnNpZGVyZWQgZGVhZCAobXMpICovXG5jb25zdCBTRVNTSU9OX1NUQUxFX01TID0gMTVfMDAwO1xuXG4vKiogVGltZW91dCBmb3IgbGVnYWN5IHBvcnQgZmVkZXJhdGlvbi9wcm94eSByZXF1ZXN0cyAobXMpICovXG5jb25zdCBMRUdBQ1lfRkVUQ0hfVElNRU9VVF9NUyA9IDJfMDAwO1xuXG4vKiogSG93IGxvbmcgYmVmb3JlIGVuZGVkIHNlc3Npb25zIGFyZSBwdXJnZWQgZnJvbSB0aGUgTWFwIChtcykgKi9cbmNvbnN0IEVOREVEX1BVUkdFX01TID0gNSAqIDYwXzAwMDsgLy8gNSBtaW51dGVzXG5cbi8qKlxuICogVHJhY2tlZCBzZXNzaW9uIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlc3Npb25JbmZvIHtcbiAgLyoqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHNlc3Npb24gKFVVSUQgb3IgYGNvbnNvbGUtPHBpZD5gKS4gKi9cbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIC8qKiBGcmllbmRseSBwdXBwZXQgbmFtZSAoZS5nLiwgXCJLZXJtaXRcIiwgXCJQdW5jaFwiKSBvciBcIldlYiBDb25zb2xlXCIuICovXG4gIGRpc3BsYXlOYW1lOiBzdHJpbmc7XG4gIC8qKiBDYW5vbmljYWwgaGV4IGNvbG9yIGZvciB0aGlzIHB1cHBldCBjaGFyYWN0ZXIuICovXG4gIGNvbG9yOiBzdHJpbmc7XG4gIC8qKiBPUyBwcm9jZXNzIElEIG9mIHRoZSBNQ1Agc2VydmVyIG9yIHdlYiBjb25zb2xlIHByb2Nlc3MuICovXG4gIHBpZDogbnVtYmVyO1xuICAvKiogSVNPIHRpbWVzdGFtcCB3aGVuIHRoZSBzZXNzaW9uIHN0YXJ0ZWQuICovXG4gIHN0YXJ0ZWRBdDogc3RyaW5nO1xuICAvKiogSVNPIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgaGVhcnRiZWF0IChmb2xsb3dlcnMpIG9yIHJlZ2lzdHJhdGlvbiAobGVhZGVyL2NvbnNvbGUpLiAqL1xuICBsYXN0SGVhcnRiZWF0OiBzdHJpbmc7XG4gIC8qKiBMaWZlY3ljbGUgc3RhdHVzIOKAlCAnYWN0aXZlJyB1bnRpbCBlbmRlZCBvciByZWFwZWQgZm9yIHN0YWxlbmVzcy4gKi9cbiAgc3RhdHVzOiAnYWN0aXZlJyB8ICdlbmRlZCc7XG4gIC8qKiBUcnVlIGlmIHRoaXMgc2Vzc2lvbiB3b24gbGVhZGVyIGVsZWN0aW9uIGFuZCBvd25zIHRoZSB0b2tlbiBmaWxlLiAqL1xuICBpc0xlYWRlcjogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgdGhpcyBzZXNzaW9uIGNvbm5lY3RlZCB3aXRoIGEgdmFsaWQgQmVhcmVyIHRva2VuICgjMTgwNSkuICovXG4gIGF1dGhlbnRpY2F0ZWQ6IGJvb2xlYW47XG4gIC8qKiBTZXNzaW9uIGtpbmQg4oCUICdtY3AnIGZvciBNQ1Agc3RkaW8gc2Vzc2lvbnMsICdjb25zb2xlJyBmb3IgdGhlIHdlYiBjb25zb2xlIGl0c2VsZiAoIzE4MDUpLiAqL1xuICBraW5kOiAnbWNwJyB8ICdjb25zb2xlJztcbiAgLyoqIERvbGxob3VzZU1DUCBwYWNrYWdlIHZlcnNpb24gcmVwb3J0ZWQgYnkgdGhlIHNlc3Npb24uICovXG4gIHNlcnZlclZlcnNpb246IHN0cmluZztcbiAgLyoqIENvbnNvbGUvc2Vzc2lvbiBjb250cmFjdCB2ZXJzaW9uIHVzZWQgZm9yIGNvbXBhdGliaWxpdHktYXdhcmUgdGFrZW92ZXIuICovXG4gIGNvbnNvbGVQcm90b2NvbFZlcnNpb246IG51bWJlcjtcbiAgLyoqIEV4cGxpY2l0IE1DUCBob3N0IHBsYXRmb3JtLCB3aGVuIHRoZSBzZXNzaW9uIHJlcG9ydGVkIG9uZS4gKi9cbiAgY2xpZW50UGxhdGZvcm06IFNlc3Npb25DbGllbnRQbGF0Zm9ybUlkIHwgbnVsbDtcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIE1DUCBob3N0IGxhYmVsIGZvciBVSSByZW5kZXJpbmcuICovXG4gIGNsaWVudFBsYXRmb3JtTGFiZWw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXlsb2FkIGZvciBQT1NUIC9hcGkvaW5nZXN0L2xvZ3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RMb2dQYXlsb2FkIHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIGVudHJpZXM6IFVuaWZpZWRMb2dFbnRyeVtdO1xufVxuXG4vKipcbiAqIFBheWxvYWQgZm9yIFBPU1QgL2FwaS9pbmdlc3QvbWV0cmljc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluZ2VzdE1ldHJpY3NQYXlsb2FkIHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIHNuYXBzaG90OiBNZXRyaWNTbmFwc2hvdDtcbn1cblxuLyoqXG4gKiBQYXlsb2FkIGZvciBQT1NUIC9hcGkvaW5nZXN0L3Nlc3Npb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXNzaW9uRXZlbnRQYXlsb2FkIHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIGV2ZW50OiAnc3RhcnRlZCcgfCAnc3RvcHBlZCcgfCAnaGVhcnRiZWF0JztcbiAgcGlkOiBudW1iZXI7XG4gIHN0YXJ0ZWRBdDogc3RyaW5nO1xuICBzZXJ2ZXJWZXJzaW9uPzogc3RyaW5nO1xuICBjb25zb2xlUHJvdG9jb2xWZXJzaW9uPzogbnVtYmVyO1xuICBjbGllbnRQbGF0Zm9ybT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDYWxsYmFja3MgcHJvdmlkZWQgYnkgdGhlIHVuaWZpZWQgY29uc29sZSBvcmNoZXN0cmF0b3IgZm9yIGJyb2FkY2FzdGluZ1xuICogaW5nZXN0ZWQgZXZlbnRzIHRocm91Z2ggdGhlIGV4aXN0aW5nIFNTRSBpbmZyYXN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RCcm9hZGNhc3RzIHtcbiAgbG9nQnJvYWRjYXN0OiAoZW50cnk6IFVuaWZpZWRMb2dFbnRyeSkgPT4gdm9pZDtcbiAgbWV0cmljc09uU25hcHNob3Q/OiAoc25hcHNob3Q6IE1ldHJpY1NuYXBzaG90KSA9PiB2b2lkO1xuICBzdG9yZU1ldHJpY3NTbmFwc2hvdD86IChzbmFwc2hvdDogTWV0cmljU25hcHNob3QsIHNlc3Npb25JZDogc3RyaW5nKSA9PiB2b2lkO1xuICBzZXNzaW9uQnJvYWRjYXN0PzogKGV2ZW50OiBTZXNzaW9uSW5mbykgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgY3JlYXRpbmcgaW5nZXN0IHJvdXRlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmdlc3RSb3V0ZXNSZXN1bHQge1xuICByb3V0ZXI6IFJvdXRlcjtcbiAgLyoqIEdldCBhbGwgdHJhY2tlZCBzZXNzaW9ucyAqL1xuICBnZXRTZXNzaW9uczogKCkgPT4gU2Vzc2lvbkluZm9bXTtcbiAgLyoqIFJlZ2lzdGVyIHRoZSBsZWFkZXIgYXMgYSBzZXNzaW9uICovXG4gIHJlZ2lzdGVyTGVhZGVyU2Vzc2lvbjogKHNlc3Npb25JZDogc3RyaW5nLCBwaWQ6IG51bWJlciwgY2xpZW50UGxhdGZvcm0/OiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkO1xuICAvKiogUmVnaXN0ZXIgdGhlIHdlYiBjb25zb2xlIGFzIGEgc2Vzc2lvbiBzbyB0aGUgaW5kaWNhdG9yIGlzIG5ldmVyIGVtcHR5ICgjMTgwNSkgKi9cbiAgcmVnaXN0ZXJDb25zb2xlU2Vzc2lvbjogKCkgPT4gdm9pZDtcbn1cblxuLyoqIE5vcm1hbGl6ZSBhIHN0cmluZyB2aWEgVW5pY29kZVZhbGlkYXRvciAoRE1DUC1TRUMtMDA0KSAqL1xuZnVuY3Rpb24gbm9ybWFsaXplSW5wdXQoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKHMpLm5vcm1hbGl6ZWRDb250ZW50O1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTZXJ2ZXJWZXJzaW9uKHZlcnNpb24/OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnICYmIHZlcnNpb24udHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gdmVyc2lvbi50cmltKCk7XG4gIH1cbiAgcmV0dXJuICd1bmtub3duJztcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQ29uc29sZVByb3RvY29sVmVyc2lvbih2ZXJzaW9uPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnbnVtYmVyJyAmJiBOdW1iZXIuaXNJbnRlZ2VyKHZlcnNpb24pICYmIHZlcnNpb24gPj0gMCkge1xuICAgIHJldHVybiB2ZXJzaW9uO1xuICB9XG4gIHJldHVybiBMRUdBQ1lfQ09OU09MRV9QUk9UT0NPTF9WRVJTSU9OO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVDbGllbnRQbGF0Zm9ybShwbGF0Zm9ybT86IHN0cmluZyB8IG51bGwpOiBTZXNzaW9uQ2xpZW50UGxhdGZvcm1JZCB8IG51bGwge1xuICByZXR1cm4gbm9ybWFsaXplU2Vzc2lvbkNsaWVudFBsYXRmb3JtSWQocGxhdGZvcm0pO1xufVxuXG4vKipcbiAqIENyZWF0ZSB0aGUgaW5nZXN0aW9uIHJvdXRlcyBhbmQgc2Vzc2lvbiByZWdpc3RyeS5cbiAqXG4gKiBAcGFyYW0gYnJvYWRjYXN0cyAtIENhbGxiYWNrcyB0byBmb3J3YXJkIGluZ2VzdGVkIGV2ZW50cyB0byBTU0UgY2xpZW50c1xuICogQHJldHVybnMgUm91dGVyIGFuZCBzZXNzaW9uIG1hbmFnZW1lbnQgZnVuY3Rpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbmdlc3RSb3V0ZXMoYnJvYWRjYXN0czogSW5nZXN0QnJvYWRjYXN0cyk6IEluZ2VzdFJvdXRlc1Jlc3VsdCB7XG4gIGNvbnN0IHJvdXRlciA9IFJvdXRlcigpO1xuICBjb25zdCBzZXNzaW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBTZXNzaW9uSW5mbz4oKTtcbiAgY29uc3QgbmFtZVBvb2wgPSBuZXcgU2Vzc2lvbk5hbWVQb29sKCk7XG4gIGNvbnN0IHJhdGVMaW1pdGVyID0gbmV3IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlcihSQVRFX0xJTUlUX01BWCwgUkFURV9MSU1JVF9XSU5ET1dfTVMpO1xuXG4gIC8vIFNlc3Npb25zIHRoZSB1c2VyIGV4cGxpY2l0bHkga2lsbGVkIOKAlCBuZXZlciBjb21lIGJhY2sgKCMxODcwKS5cbiAgLy8gQ2xlYXJlZCBvbmx5IG9uIHNlcnZlciByZXN0YXJ0LCB3aGljaCBpcyBhcHByb3ByaWF0ZSBzaW5jZSB0aGF0J3MgYSBuZXcgY29udGV4dC5cbiAgY29uc3Qga2lsbGVkU2Vzc2lvbnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuICAvLyBTZXNzaW9ucyB3YWl0aW5nIGZvciBhIFBJRCBzbyB3ZSBjYW4gU0lHVEVSTSB0aGVtICgjMTg3MCkuXG4gIC8vIFdoZW4gdGhlIHVzZXIgZGlzbWlzc2VzIGEgcGlkPTAgb3JwaGFuLCB3ZSBhZGQgaXQgaGVyZS4gVGhlIG5leHQgaGVhcnRiZWF0XG4gIC8vIChldmVyeSAxMHMpIGNhcnJpZXMgdGhlIFBJRCDigJQgd2UgU0lHVEVSTSBpbW1lZGlhdGVseSBhbmQgbW92ZSB0byBraWxsZWRTZXNzaW9ucy5cbiAgY29uc3QgcGVuZGluZ0tpbGxzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgLyoqIEV4ZWN1dGUgYSBkZWZlcnJlZCBraWxsIGlmIHdlIG5vdyBoYXZlIGEgUElELiAqL1xuICBmdW5jdGlvbiB0cnlFeGVjdXRlUGVuZGluZ0tpbGwoc2Vzc2lvbklkOiBzdHJpbmcsIHBpZD86IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGtpbGxQaWQgPSBwaWQgfHwgc2Vzc2lvbnMuZ2V0KHNlc3Npb25JZCk/LnBpZDtcbiAgICBpZiAoIWtpbGxQaWQpIHJldHVybjtcbiAgICB0cnkgeyBwcm9jZXNzLmtpbGwoa2lsbFBpZCwgJ1NJR1RFUk0nKTsgfSBjYXRjaCB7IC8qIGFscmVhZHkgZGVhZCAqLyB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSBzZXNzaW9ucy5nZXQoc2Vzc2lvbklkKTtcbiAgICBpZiAoZXhpc3RpbmcpIGV4aXN0aW5nLnN0YXR1cyA9ICdlbmRlZCc7XG4gICAgbG9nZ2VyLmluZm8oJ1tJbmdlc3RSb3V0ZXNdIERlZmVycmVkIGtpbGwgZXhlY3V0ZWQg4oCUIFBJRCBhcnJpdmVkJywge1xuICAgICAgZGlzcGxheU5hbWU6IGV4aXN0aW5nPy5kaXNwbGF5TmFtZSwgc2Vzc2lvbklkLCBwaWQ6IGtpbGxQaWQsXG4gICAgfSk7XG4gIH1cblxuICAvKiogUHJvbW90ZSBhIHBlbmRpbmcga2lsbCB0byBwZXJtYW5lbnQuICovXG4gIGZ1bmN0aW9uIGZpbmFsaXplUGVuZGluZ0tpbGwoc2Vzc2lvbklkOiBzdHJpbmcsIHBpZD86IG51bWJlcik6IHZvaWQge1xuICAgIHRyeUV4ZWN1dGVQZW5kaW5nS2lsbChzZXNzaW9uSWQsIHBpZCk7XG4gICAgcGVuZGluZ0tpbGxzLmRlbGV0ZShzZXNzaW9uSWQpO1xuICAgIGtpbGxlZFNlc3Npb25zLmFkZChzZXNzaW9uSWQpO1xuICB9XG5cbiAgLyoqIENyZWF0ZSBhIG5ldyBzZXNzaW9uIGVudHJ5IGZvciBhbiBvcnBoYW4uIFJldHVybnMgbnVsbCBvbiBmYWlsdXJlLiAqL1xuICBmdW5jdGlvbiBhdXRvUmVnaXN0ZXIoXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgcGlkPzogbnVtYmVyLFxuICAgIGF1dGhlbnRpY2F0ZWQgPSBmYWxzZSxcbiAgICBzZXJ2ZXJWZXJzaW9uPzogc3RyaW5nLFxuICAgIGNvbnNvbGVQcm90b2NvbFZlcnNpb24/OiBudW1iZXIsXG4gICAgY2xpZW50UGxhdGZvcm0/OiBzdHJpbmcsXG4gICk6IFNlc3Npb25JbmZvIHwgbnVsbCB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gbmFtZVBvb2wuYXNzaWduKHNlc3Npb25JZCk7XG4gICAgICBjb25zdCBjb2xvciA9IG5hbWVQb29sLmdldENvbG9yKHNlc3Npb25JZCkgPz8gJyMzYjgyZjYnO1xuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuICAgICAgY29uc3Qgbm9ybWFsaXplZENsaWVudFBsYXRmb3JtID0gbm9ybWFsaXplQ2xpZW50UGxhdGZvcm0oY2xpZW50UGxhdGZvcm0pO1xuICAgICAgY29uc3QgaW5mbzogU2Vzc2lvbkluZm8gPSB7XG4gICAgICAgIHNlc3Npb25JZCwgZGlzcGxheU5hbWUsIGNvbG9yLFxuICAgICAgICBwaWQ6IHBpZCB8fCAwLFxuICAgICAgICBzdGFydGVkQXQ6IG5vdywgbGFzdEhlYXJ0YmVhdDogbm93LFxuICAgICAgICBzdGF0dXM6ICdhY3RpdmUnLCBpc0xlYWRlcjogZmFsc2UsIGF1dGhlbnRpY2F0ZWQsIGtpbmQ6ICdtY3AnLFxuICAgICAgICBzZXJ2ZXJWZXJzaW9uOiBub3JtYWxpemVTZXJ2ZXJWZXJzaW9uKHNlcnZlclZlcnNpb24pLFxuICAgICAgICBjb25zb2xlUHJvdG9jb2xWZXJzaW9uOiBub3JtYWxpemVDb25zb2xlUHJvdG9jb2xWZXJzaW9uKGNvbnNvbGVQcm90b2NvbFZlcnNpb24pLFxuICAgICAgICBjbGllbnRQbGF0Zm9ybTogbm9ybWFsaXplZENsaWVudFBsYXRmb3JtLFxuICAgICAgICBjbGllbnRQbGF0Zm9ybUxhYmVsOiBnZXRTZXNzaW9uQ2xpZW50UGxhdGZvcm1MYWJlbChub3JtYWxpemVkQ2xpZW50UGxhdGZvcm0pLFxuICAgICAgfTtcbiAgICAgIHNlc3Npb25zLnNldChzZXNzaW9uSWQsIGluZm8pO1xuICAgICAgbG9nZ2VyLmluZm8oJ1tJbmdlc3RSb3V0ZXNdIEF1dG8tcmVnaXN0ZXJlZCBvcnBoYW5lZCBzZXNzaW9uJywge1xuICAgICAgICBkaXNwbGF5TmFtZSwgc2Vzc2lvbklkLCBzb3VyY2U6IHBpZCA/ICdoZWFydGJlYXQnIDogJ2luZ2VzdGlvbicsXG4gICAgICB9KTtcbiAgICAgIGJyb2FkY2FzdHMuc2Vzc2lvbkJyb2FkY2FzdD8uKGluZm8pO1xuICAgICAgcmV0dXJuIGluZm87XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ1tJbmdlc3RSb3V0ZXNdIEZhaWxlZCB0byBhdXRvLXJlZ2lzdGVyIG9ycGhhbmVkIHNlc3Npb24nLCB7XG4gICAgICAgIHNlc3Npb25JZCwgZXJyb3I6IChlcnIgYXMgRXJyb3IpLm1lc3NhZ2UsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBdXRvLXJlZ2lzdGVyIG9yIHVwZGF0ZSBhbiBvcnBoYW5lZCBzZXNzaW9uIGZyb20gaW5nZXN0aW9uIGRhdGEuXG4gICAqIFJldHVybnMgdGhlIHNlc3Npb24gKGV4aXN0aW5nIG9yIG5ld2x5IGNyZWF0ZWQpLCBvciBudWxsIGlmIGtpbGxlZC9wZW5kaW5nLlxuICAgKi9cbiAgZnVuY3Rpb24gZW5zdXJlU2Vzc2lvbihcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICBwaWQ/OiBudW1iZXIsXG4gICAgYXV0aGVudGljYXRlZCA9IGZhbHNlLFxuICAgIHNlcnZlclZlcnNpb24/OiBzdHJpbmcsXG4gICAgY29uc29sZVByb3RvY29sVmVyc2lvbj86IG51bWJlcixcbiAgICBjbGllbnRQbGF0Zm9ybT86IHN0cmluZyxcbiAgKTogU2Vzc2lvbkluZm8gfCBudWxsIHtcbiAgICBpZiAoa2lsbGVkU2Vzc2lvbnMuaGFzKHNlc3Npb25JZCkpIHJldHVybiBudWxsO1xuICAgIGlmIChwZW5kaW5nS2lsbHMuaGFzKHNlc3Npb25JZCkpIHtcbiAgICAgIGZpbmFsaXplUGVuZGluZ0tpbGwoc2Vzc2lvbklkLCBwaWQpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZXhpc3RpbmcgPSBzZXNzaW9ucy5nZXQoc2Vzc2lvbklkKTtcbiAgICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgICByZXR1cm4gYXV0b1JlZ2lzdGVyKFxuICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgIHBpZCxcbiAgICAgICAgYXV0aGVudGljYXRlZCxcbiAgICAgICAgc2VydmVyVmVyc2lvbixcbiAgICAgICAgY29uc29sZVByb3RvY29sVmVyc2lvbixcbiAgICAgICAgY2xpZW50UGxhdGZvcm0sXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChleGlzdGluZy5zdGF0dXMgPT09ICdlbmRlZCcpIHtcbiAgICAgIGV4aXN0aW5nLnN0YXR1cyA9ICdhY3RpdmUnO1xuICAgICAgbG9nZ2VyLmluZm8oJ1tJbmdlc3RSb3V0ZXNdIFJldml2ZWQgZW5kZWQgc2Vzc2lvbiBzdGlsbCBzZW5kaW5nIGRhdGEnLCB7XG4gICAgICAgIGRpc3BsYXlOYW1lOiBleGlzdGluZy5kaXNwbGF5TmFtZSwgc2Vzc2lvbklkLFxuICAgICAgfSk7XG4gICAgfVxuICAgIGV4aXN0aW5nLmxhc3RIZWFydGJlYXQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgaWYgKHBpZCAmJiAhZXhpc3RpbmcucGlkKSB7XG4gICAgICBleGlzdGluZy5waWQgPSBwaWQ7XG4gICAgICBsb2dnZXIuaW5mbygnW0luZ2VzdFJvdXRlc10gUmVjb3ZlcmVkIFBJRCBmb3Igb3JwaGFuZWQgc2Vzc2lvbicsIHtcbiAgICAgICAgZGlzcGxheU5hbWU6IGV4aXN0aW5nLmRpc3BsYXlOYW1lLCBzZXNzaW9uSWQsIHBpZCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoc2VydmVyVmVyc2lvbikge1xuICAgICAgZXhpc3Rpbmcuc2VydmVyVmVyc2lvbiA9IG5vcm1hbGl6ZVNlcnZlclZlcnNpb24oc2VydmVyVmVyc2lvbik7XG4gICAgfVxuICAgIGlmIChjb25zb2xlUHJvdG9jb2xWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4aXN0aW5nLmNvbnNvbGVQcm90b2NvbFZlcnNpb24gPSBub3JtYWxpemVDb25zb2xlUHJvdG9jb2xWZXJzaW9uKGNvbnNvbGVQcm90b2NvbFZlcnNpb24pO1xuICAgIH1cbiAgICBpZiAoY2xpZW50UGxhdGZvcm0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgZXhpc3RpbmcuY2xpZW50UGxhdGZvcm0gPSBub3JtYWxpemVDbGllbnRQbGF0Zm9ybShjbGllbnRQbGF0Zm9ybSk7XG4gICAgICBleGlzdGluZy5jbGllbnRQbGF0Zm9ybUxhYmVsID0gZ2V0U2Vzc2lvbkNsaWVudFBsYXRmb3JtTGFiZWwoZXhpc3RpbmcuY2xpZW50UGxhdGZvcm0pO1xuICAgIH1cbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cblxuICAvLyBKU09OIGJvZHkgcGFyc2luZyB3aXRoIHNpemUgbGltaXRcbiAgcm91dGVyLnVzZShleHByZXNzLmpzb24oeyBsaW1pdDogTUFYX1BBWUxPQURfU0laRSB9KSk7XG5cbiAgLyoqXG4gICAqIFBPU1QgL2FwaS9pbmdlc3QvbG9ncyDigJQgUmVjZWl2ZSBiYXRjaGVkIGxvZyBlbnRyaWVzIGZyb20gYSBmb2xsb3dlci5cbiAgICovXG4gIHJvdXRlci5wb3N0KCcvYXBpL2luZ2VzdC9sb2dzJywgKHJlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgIGlmICghcmF0ZUxpbWl0ZXIudHJ5QWNxdWlyZSgpKSB7XG4gICAgICByZXMuc3RhdHVzKDQyOSkuanNvbih7IGVycm9yOiAnUmF0ZSBsaW1pdCBleGNlZWRlZCcgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGF5bG9hZCA9IHJlcS5ib2R5IGFzIEluZ2VzdExvZ1BheWxvYWQ7XG4gICAgaWYgKCFwYXlsb2FkPy5zZXNzaW9uSWQgfHwgIUFycmF5LmlzQXJyYXkocGF5bG9hZC5lbnRyaWVzKSkge1xuICAgICAgY29uc3QgcmVjZWl2ZWQgPSBwYXlsb2FkID8gT2JqZWN0LmtleXMocGF5bG9hZCkgOiBbXTtcbiAgICAgIGxvZ2dlci53YXJuKCdbSW5nZXN0Um91dGVzXSBJbnZhbGlkIGxvZyBwYXlsb2FkJywgeyByZWNlaXZlZCwgaGFzU2Vzc2lvbklkOiAhIXBheWxvYWQ/LnNlc3Npb25JZCwgaGFzRW50cmllczogQXJyYXkuaXNBcnJheShwYXlsb2FkPy5lbnRyaWVzKSB9KTtcbiAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHsgZXJyb3I6ICdJbnZhbGlkIHBheWxvYWQnLCByZXF1aXJlZDogWydzZXNzaW9uSWQnLCAnZW50cmllcyddLCByZWNlaXZlZCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGF5bG9hZC5zZXNzaW9uSWQgPSBub3JtYWxpemVJbnB1dChwYXlsb2FkLnNlc3Npb25JZCk7XG5cbiAgICBsZXQgY291bnQgPSAwO1xuICAgIGxldCBza2lwcGVkID0gMDtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHBheWxvYWQuZW50cmllcykge1xuICAgICAgaWYgKCFlbnRyeSB8fCB0eXBlb2YgZW50cnkubWVzc2FnZSAhPT0gJ3N0cmluZycpIHsgc2tpcHBlZCsrOyBjb250aW51ZTsgfVxuICAgICAgY29uc3Qgc3RhbXBlZDogVW5pZmllZExvZ0VudHJ5ID0ge1xuICAgICAgICAuLi5lbnRyeSxcbiAgICAgICAgZGF0YTogeyAuLi5lbnRyeS5kYXRhLCBfc2Vzc2lvbklkOiBwYXlsb2FkLnNlc3Npb25JZCB9LFxuICAgICAgfTtcbiAgICAgIGJyb2FkY2FzdHMubG9nQnJvYWRjYXN0KHN0YW1wZWQpO1xuICAgICAgY291bnQrKztcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgaGVhcnRiZWF0LCByZXZpdmUgZW5kZWQgc2Vzc2lvbnMsIG9yIGF1dG8tcmVnaXN0ZXIgb3JwaGFucyAoIzE4NzApXG4gICAgY29uc3Qgc2Vzc2lvbiA9IGVuc3VyZVNlc3Npb24ocGF5bG9hZC5zZXNzaW9uSWQpO1xuXG4gICAgaWYgKHNraXBwZWQgPiAwKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYFtJbmdlc3RSb3V0ZXNdIExvZyBpbmdlc3QgZnJvbSAke3Nlc3Npb24/LmRpc3BsYXlOYW1lID8/IHBheWxvYWQuc2Vzc2lvbklkfTogYWNjZXB0ZWQ9JHtjb3VudH0sIHNraXBwZWQ9JHtza2lwcGVkfWApO1xuICAgIH1cblxuICAgIHJlcy5zdGF0dXMoMjAwKS5qc29uKHsgYWNjZXB0ZWQ6IGNvdW50LCBza2lwcGVkIH0pO1xuICB9KTtcblxuICAvKipcbiAgICogUE9TVCAvYXBpL2luZ2VzdC9tZXRyaWNzIOKAlCBSZWNlaXZlIG1ldHJpYyBzbmFwc2hvdHMgZnJvbSBhIGZvbGxvd2VyLlxuICAgKi9cbiAgcm91dGVyLnBvc3QoJy9hcGkvaW5nZXN0L21ldHJpY3MnLCAocmVxOiBSZXF1ZXN0LCByZXM6IFJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKCFyYXRlTGltaXRlci50cnlBY3F1aXJlKCkpIHtcbiAgICAgIHJlcy5zdGF0dXMoNDI5KS5qc29uKHsgZXJyb3I6ICdSYXRlIGxpbWl0IGV4Y2VlZGVkJyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkID0gcmVxLmJvZHkgYXMgSW5nZXN0TWV0cmljc1BheWxvYWQ7XG4gICAgaWYgKCFwYXlsb2FkPy5zZXNzaW9uSWQgfHwgIXBheWxvYWQuc25hcHNob3QpIHtcbiAgICAgIGNvbnN0IHJlY2VpdmVkID0gcGF5bG9hZCA/IE9iamVjdC5rZXlzKHBheWxvYWQpIDogW107XG4gICAgICBsb2dnZXIud2FybignW0luZ2VzdFJvdXRlc10gSW52YWxpZCBtZXRyaWNzIHBheWxvYWQnLCB7IHJlY2VpdmVkIH0pO1xuICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oeyBlcnJvcjogJ0ludmFsaWQgcGF5bG9hZCcsIHJlcXVpcmVkOiBbJ3Nlc3Npb25JZCcsICdzbmFwc2hvdCddLCByZWNlaXZlZCB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGF5bG9hZC5zZXNzaW9uSWQgPSBub3JtYWxpemVJbnB1dChwYXlsb2FkLnNlc3Npb25JZCk7XG5cbiAgICBpZiAoYnJvYWRjYXN0cy5tZXRyaWNzT25TbmFwc2hvdCkge1xuICAgICAgYnJvYWRjYXN0cy5tZXRyaWNzT25TbmFwc2hvdChwYXlsb2FkLnNuYXBzaG90KTtcbiAgICB9XG4gICAgaWYgKGJyb2FkY2FzdHMuc3RvcmVNZXRyaWNzU25hcHNob3QpIHtcbiAgICAgIGJyb2FkY2FzdHMuc3RvcmVNZXRyaWNzU25hcHNob3QocGF5bG9hZC5zbmFwc2hvdCwgcGF5bG9hZC5zZXNzaW9uSWQpO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBoZWFydGJlYXQsIHJldml2ZSBlbmRlZCBzZXNzaW9ucywgb3IgYXV0by1yZWdpc3RlciBvcnBoYW5zICgjMTg3MClcbiAgICBjb25zdCBzZXNzaW9uID0gZW5zdXJlU2Vzc2lvbihwYXlsb2FkLnNlc3Npb25JZCk7XG4gICAgbG9nZ2VyLmRlYnVnKGBbSW5nZXN0Um91dGVzXSBNZXRyaWNzIGluZ2VzdGVkIGZyb20gJHtzZXNzaW9uPy5kaXNwbGF5TmFtZSA/PyBwYXlsb2FkLnNlc3Npb25JZH1gKTtcbiAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7IGFjY2VwdGVkOiB0cnVlIH0pO1xuICB9KTtcblxuICAvKipcbiAgICogUE9TVCAvYXBpL2luZ2VzdC9zZXNzaW9uIOKAlCBTZXNzaW9uIGxpZmVjeWNsZSBldmVudHMuXG4gICAqL1xuICByb3V0ZXIucG9zdCgnL2FwaS9pbmdlc3Qvc2Vzc2lvbicsIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCBwYXlsb2FkID0gcmVxLmJvZHkgYXMgU2Vzc2lvbkV2ZW50UGF5bG9hZDtcbiAgICBpZiAoIXBheWxvYWQ/LnNlc3Npb25JZCB8fCAhcGF5bG9hZC5ldmVudCkge1xuICAgICAgY29uc3QgcmVjZWl2ZWQgPSBwYXlsb2FkID8gT2JqZWN0LmtleXMocGF5bG9hZCkgOiBbXTtcbiAgICAgIGxvZ2dlci53YXJuKCdbSW5nZXN0Um91dGVzXSBJbnZhbGlkIHNlc3Npb24gZXZlbnQgcGF5bG9hZCcsIHsgcmVjZWl2ZWQgfSk7XG4gICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7IGVycm9yOiAnSW52YWxpZCBwYXlsb2FkJywgcmVxdWlyZWQ6IFsnc2Vzc2lvbklkJywgJ2V2ZW50J10sIHJlY2VpdmVkIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwYXlsb2FkLnNlc3Npb25JZCA9IG5vcm1hbGl6ZUlucHV0KHBheWxvYWQuc2Vzc2lvbklkKTtcblxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKTtcblxuICAgIHN3aXRjaCAocGF5bG9hZC5ldmVudCkge1xuICAgICAgY2FzZSAnc3RhcnRlZCc6IHtcbiAgICAgICAgLy8gS2lsbGVkIHNlc3Npb25zIHN0YXkgZGVhZDsgcGVuZGluZyBraWxscyBnZXQgZmluYWxpemVkICgjMTg3MClcbiAgICAgICAgaWYgKGtpbGxlZFNlc3Npb25zLmhhcyhwYXlsb2FkLnNlc3Npb25JZCkpIGJyZWFrO1xuICAgICAgICBpZiAocGVuZGluZ0tpbGxzLmhhcyhwYXlsb2FkLnNlc3Npb25JZCkpIHsgZmluYWxpemVQZW5kaW5nS2lsbChwYXlsb2FkLnNlc3Npb25JZCwgcGF5bG9hZC5waWQpOyBicmVhazsgfVxuXG4gICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gbmFtZVBvb2wuYXNzaWduKHBheWxvYWQuc2Vzc2lvbklkKTtcbiAgICAgICAgY29uc3QgY29sb3IgPSBuYW1lUG9vbC5nZXRDb2xvcihwYXlsb2FkLnNlc3Npb25JZCkgPz8gJyMzYjgyZjYnO1xuICAgICAgICBjb25zdCBpc0F1dGhlbnRpY2F0ZWQgPSBCb29sZWFuKChyZXMgYXMgYW55KS5sb2NhbHM/LnRva2VuRW50cnkpO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkQ2xpZW50UGxhdGZvcm0gPSBub3JtYWxpemVDbGllbnRQbGF0Zm9ybShwYXlsb2FkLmNsaWVudFBsYXRmb3JtKTtcbiAgICAgICAgc2Vzc2lvbnMuc2V0KHBheWxvYWQuc2Vzc2lvbklkLCB7XG4gICAgICAgICAgc2Vzc2lvbklkOiBwYXlsb2FkLnNlc3Npb25JZCwgZGlzcGxheU5hbWUsIGNvbG9yLFxuICAgICAgICAgIHBpZDogcGF5bG9hZC5waWQsIHN0YXJ0ZWRBdDogcGF5bG9hZC5zdGFydGVkQXQgfHwgbm93LCBsYXN0SGVhcnRiZWF0OiBub3csXG4gICAgICAgICAgc3RhdHVzOiAnYWN0aXZlJywgaXNMZWFkZXI6IGZhbHNlLCBhdXRoZW50aWNhdGVkOiBpc0F1dGhlbnRpY2F0ZWQsIGtpbmQ6ICdtY3AnLFxuICAgICAgICAgIHNlcnZlclZlcnNpb246IG5vcm1hbGl6ZVNlcnZlclZlcnNpb24ocGF5bG9hZC5zZXJ2ZXJWZXJzaW9uKSxcbiAgICAgICAgICBjb25zb2xlUHJvdG9jb2xWZXJzaW9uOiBub3JtYWxpemVDb25zb2xlUHJvdG9jb2xWZXJzaW9uKHBheWxvYWQuY29uc29sZVByb3RvY29sVmVyc2lvbiksXG4gICAgICAgICAgY2xpZW50UGxhdGZvcm06IG5vcm1hbGl6ZWRDbGllbnRQbGF0Zm9ybSxcbiAgICAgICAgICBjbGllbnRQbGF0Zm9ybUxhYmVsOiBnZXRTZXNzaW9uQ2xpZW50UGxhdGZvcm1MYWJlbChub3JtYWxpemVkQ2xpZW50UGxhdGZvcm0pLFxuICAgICAgICB9KTtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1tJbmdlc3RSb3V0ZXNdIFNlc3Npb24gcmVnaXN0ZXJlZCcsIHtcbiAgICAgICAgICBkaXNwbGF5TmFtZSwgc2Vzc2lvbklkOiBwYXlsb2FkLnNlc3Npb25JZCwgcGlkOiBwYXlsb2FkLnBpZCwgY29sb3IsXG4gICAgICAgICAgYWN0aXZlU2Vzc2lvbnM6IEFycmF5LmZyb20oc2Vzc2lvbnMudmFsdWVzKCkpLmZpbHRlcihzID0+IHMuc3RhdHVzID09PSAnYWN0aXZlJykubGVuZ3RoLFxuICAgICAgICB9KTtcbiAgICAgICAgYnJvYWRjYXN0cy5zZXNzaW9uQnJvYWRjYXN0Py4oc2Vzc2lvbnMuZ2V0KHBheWxvYWQuc2Vzc2lvbklkKSEpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0b3BwZWQnOiB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nID0gc2Vzc2lvbnMuZ2V0KHBheWxvYWQuc2Vzc2lvbklkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nKSB7XG4gICAgICAgICAgZXhpc3Rpbmcuc3RhdHVzID0gJ2VuZGVkJztcbiAgICAgICAgICBleGlzdGluZy5sYXN0SGVhcnRiZWF0ID0gbm93O1xuICAgICAgICAgIG5hbWVQb29sLnJlbGVhc2UocGF5bG9hZC5zZXNzaW9uSWQpO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKCdbSW5nZXN0Um91dGVzXSBTZXNzaW9uIHN0b3BwZWQnLCB7XG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogZXhpc3RpbmcuZGlzcGxheU5hbWUsIHNlc3Npb25JZDogcGF5bG9hZC5zZXNzaW9uSWQsIHBpZDogZXhpc3RpbmcucGlkLFxuICAgICAgICAgICAgYWN0aXZlU2Vzc2lvbnM6IEFycmF5LmZyb20oc2Vzc2lvbnMudmFsdWVzKCkpLmZpbHRlcihzID0+IHMuc3RhdHVzID09PSAnYWN0aXZlJykubGVuZ3RoIC0gMSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicm9hZGNhc3RzLnNlc3Npb25Ccm9hZGNhc3Q/LihleGlzdGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdoZWFydGJlYXQnOiB7XG4gICAgICAgIC8vIEF1dG8tcmVnaXN0ZXIgb3IgdXBkYXRlIOKAlCBoZWFydGJlYXQgaW5jbHVkZXMgUElEIGZvciByZWNvdmVyeSAoIzE4NzApXG4gICAgICAgIGVuc3VyZVNlc3Npb24oXG4gICAgICAgICAgcGF5bG9hZC5zZXNzaW9uSWQsXG4gICAgICAgICAgcGF5bG9hZC5waWQsXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgcGF5bG9hZC5zZXJ2ZXJWZXJzaW9uLFxuICAgICAgICAgIHBheWxvYWQuY29uc29sZVByb3RvY29sVmVyc2lvbixcbiAgICAgICAgICBwYXlsb2FkLmNsaWVudFBsYXRmb3JtLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXMuc3RhdHVzKDIwMCkuanNvbih7IG9rOiB0cnVlIH0pO1xuICB9KTtcblxuICAvKipcbiAgICogR0VUIC9hcGkvc2Vzc2lvbnMg4oCUIExpc3QgYWxsIHRyYWNrZWQgc2Vzc2lvbnMuXG4gICAqL1xuICByb3V0ZXIuZ2V0KCcvYXBpL3Nlc3Npb25zJywgYXN5bmMgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICAvLyBTZXJ2ZXItc2lkZSBhY3RpdmUgZmlsdGVyIOKAlCB0aGUgZnJvbnRlbmQgYWxzbyBmaWx0ZXJzLCBidXQgZW5kZWQgc2Vzc2lvbnNcbiAgICAvLyBzaG91bGQgbmV2ZXIgbGVhdmUgdGhlIEFQSSB0byBwcmV2ZW50IHN0YWxlIFVJICgjMTg3MCkuXG4gICAgY29uc3QgbG9jYWxTZXNzaW9ucyA9IEFycmF5LmZyb20oc2Vzc2lvbnMudmFsdWVzKCkpLmZpbHRlcihzID0+IHMuc3RhdHVzID09PSAnYWN0aXZlJyk7XG4gICAgY29uc3QgY3VycmVudFBvcnQgPSBlbnYuRE9MTEhPVVNFX1dFQl9DT05TT0xFX1BPUlQgPz8gNDE3MTU7XG5cbiAgICAvLyBGZWRlcmF0ZSB3aXRoIHRoZSBsZWdhY3kgcG9ydCAoMzkzOSkgdG8gc2hvdyBhbGwgc2Vzc2lvbnMgb24gdGhlXG4gICAgLy8gbWFjaGluZSwgaW5jbHVkaW5nIHVuYXV0aGVudGljYXRlZCBvbmVzIGZyb20gcHJlLWF1dGggaW5zdGFsbHMuXG4gICAgLy8gU2VydmVyLXRvLXNlcnZlciBhdm9pZHMgQ09SUyByZXN0cmljdGlvbnMgKCMxODA1KS5cbiAgICBpZiAoY3VycmVudFBvcnQgIT09IDM5MzkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKSwgTEVHQUNZX0ZFVENIX1RJTUVPVVRfTVMpO1xuICAgICAgICBjb25zdCBsZWdhY3lSZXMgPSBhd2FpdCBmZXRjaCgnaHR0cDovLzEyNy4wLjAuMTozOTM5L2FwaS9zZXNzaW9ucycsIHtcbiAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICB9KTtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICBpZiAobGVnYWN5UmVzLm9rKSB7XG4gICAgICAgICAgY29uc3QgbGVnYWN5RGF0YSA9IGF3YWl0IGxlZ2FjeVJlcy5qc29uKCkgYXMgeyBzZXNzaW9uczogU2Vzc2lvbkluZm9bXSB9O1xuICAgICAgICAgIGNvbnN0IGxvY2FsSWRzID0gbmV3IFNldChsb2NhbFNlc3Npb25zLm1hcChzID0+IHMuc2Vzc2lvbklkKSk7XG4gICAgICAgICAgZm9yIChjb25zdCBscyBvZiAobGVnYWN5RGF0YS5zZXNzaW9ucyB8fCBbXSkpIHtcbiAgICAgICAgICAgIGlmICghbG9jYWxJZHMuaGFzKGxzLnNlc3Npb25JZCkgJiYgbHMuc3RhdHVzID09PSAnYWN0aXZlJykge1xuICAgICAgICAgICAgICBsb2NhbFNlc3Npb25zLnB1c2goe1xuICAgICAgICAgICAgICAgIC4uLmxzLFxuICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICBraW5kOiBscy5raW5kIHx8ICdtY3AnLFxuICAgICAgICAgICAgICBzZXJ2ZXJWZXJzaW9uOiBub3JtYWxpemVTZXJ2ZXJWZXJzaW9uKGxzLnNlcnZlclZlcnNpb24pLFxuICAgICAgICAgICAgICBjb25zb2xlUHJvdG9jb2xWZXJzaW9uOiBub3JtYWxpemVDb25zb2xlUHJvdG9jb2xWZXJzaW9uKGxzLmNvbnNvbGVQcm90b2NvbFZlcnNpb24pLFxuICAgICAgICAgICAgICBjbGllbnRQbGF0Zm9ybTogbm9ybWFsaXplQ2xpZW50UGxhdGZvcm0obHMuY2xpZW50UGxhdGZvcm0pLFxuICAgICAgICAgICAgICBjbGllbnRQbGF0Zm9ybUxhYmVsOiBnZXRTZXNzaW9uQ2xpZW50UGxhdGZvcm1MYWJlbChub3JtYWxpemVDbGllbnRQbGF0Zm9ybShscy5jbGllbnRQbGF0Zm9ybSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBMZWdhY3kgaW5zdGFuY2Ugbm90IHJ1bm5pbmcgb3IgdW5yZWFjaGFibGUg4oCUIHRoYXQncyBmaW5lXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmVzLmpzb24oeyBzZXNzaW9uczogbG9jYWxTZXNzaW9ucyB9KTtcbiAgfSk7XG5cbiAgLyoqXG4gICAqIFBPU1QgL2FwaS9zZXNzaW9ucy86c2Vzc2lvbklkL2tpbGwg4oCUIFRlcm1pbmF0ZSBhIHNlc3Npb24ncyBzZXJ2ZXIgcHJvY2Vzcy5cbiAgICovXG4gIHJvdXRlci5wb3N0KCcvYXBpL3Nlc3Npb25zLzpzZXNzaW9uSWQva2lsbCcsIGFzeW5jIChyZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCBzZXNzaW9uSWQgPSByZXEucGFyYW1zWydzZXNzaW9uSWQnXSBhcyBzdHJpbmc7XG4gICAgY29uc3Qgc2Vzc2lvbiA9IHNlc3Npb25zLmdldChzZXNzaW9uSWQpO1xuXG4gICAgaWYgKCFzZXNzaW9uKSB7XG4gICAgICAvLyBTZXNzaW9uIG5vdCBpbiBsb2NhbCBNYXAg4oCUIHRyeSBwcm94eWluZyBraWxsIHRvIGxlZ2FjeSBwb3J0ICgjMTg3MClcbiAgICAgIGNvbnN0IGN1cnJlbnRQb3J0ID0gZW52LkRPTExIT1VTRV9XRUJfQ09OU09MRV9QT1JUID8/IDQxNzE1O1xuICAgICAgaWYgKGN1cnJlbnRQb3J0ICE9PSAzOTM5KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KCksIExFR0FDWV9GRVRDSF9USU1FT1VUX01TKTtcbiAgICAgICAgICBjb25zdCBwcm94eVJlcyA9IGF3YWl0IGZldGNoKGBodHRwOi8vMTI3LjAuMC4xOjM5MzkvYXBpL3Nlc3Npb25zLyR7ZW5jb2RlVVJJQ29tcG9uZW50KHNlc3Npb25JZCl9L2tpbGxgLCB7XG4gICAgICAgICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgIGlmIChwcm94eVJlcy5vaykge1xuICAgICAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IHByb3h5UmVzLmpzb24oKTtcbiAgICAgICAgICAgIHJlcy5qc29uKGRhdGEpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gTGVnYWN5IGluc3RhbmNlIG5vdCBydW5uaW5nIOKAlCBmYWxsIHRocm91Z2ggdG8gNDA0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxvZ2dlci53YXJuKCdbSW5nZXN0Um91dGVzXSBLaWxsIHJlcXVlc3RlZCBmb3IgdW5rbm93biBzZXNzaW9uJywgeyBzZXNzaW9uSWQgfSk7XG4gICAgICByZXMuc3RhdHVzKDQwNCkuanNvbih7IGVycm9yOiAnU2Vzc2lvbiBub3QgZm91bmQnLCBzZXNzaW9uSWQgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFzZXNzaW9uLnBpZCkge1xuICAgICAgLy8gQXV0by1yZWdpc3RlcmVkIG9ycGhhbiB3aXRoIHVua25vd24gUElEIOKAlCBxdWV1ZSBmb3IgZGVmZXJyZWQga2lsbCAoIzE4NzApLlxuICAgICAgLy8gVGhlIG5leHQgaGVhcnRiZWF0IChldmVyeSB+MTBzKSBjYXJyaWVzIHRoZSBQSUQuIGVuc3VyZVNlc3Npb24oKSB3aWxsXG4gICAgICAvLyBTSUdURVJNIHRoZSBwcm9jZXNzIGFzIHNvb24gYXMgdGhlIFBJRCBhcnJpdmVzLiBTZXNzaW9uIGlzIGdvbmUgZm9yIGdvb2QuXG4gICAgICBzZXNzaW9uLnN0YXR1cyA9ICdlbmRlZCc7XG4gICAgICBuYW1lUG9vbC5yZWxlYXNlKHNlc3Npb25JZCk7XG4gICAgICBwZW5kaW5nS2lsbHMuYWRkKHNlc3Npb25JZCk7XG4gICAgICBsb2dnZXIuaW5mbygnW0luZ2VzdFJvdXRlc10gUXVldWVkIGRlZmVycmVkIGtpbGwg4oCUIHdhaXRpbmcgZm9yIFBJRCB2aWEgaGVhcnRiZWF0Jywge1xuICAgICAgICBkaXNwbGF5TmFtZTogc2Vzc2lvbi5kaXNwbGF5TmFtZSwgc2Vzc2lvbklkLFxuICAgICAgfSk7XG4gICAgICByZXMuanNvbih7IG9rOiB0cnVlLCBkaXNtaXNzZWQ6IHNlc3Npb24uZGlzcGxheU5hbWUsIHJlYXNvbjogJ3BlbmRpbmcta2lsbCcgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU0lHVEVSTSB0aGUgcHJvY2Vzcy4gRXZlbiBpZiBpdCBmYWlscyAoRVNSQ0ggPSBhbHJlYWR5IGRlYWQsIEVQRVJNID0gbm90IG91cnMpLFxuICAgIC8vIG1hcmsgdGhlIHNlc3Npb24gYXMgcGVybWFuZW50bHkga2lsbGVkIHNvIGl0IG5ldmVyIHJlYXBwZWFycyAoIzE4NzApLlxuICAgIHRyeSB7XG4gICAgICBwcm9jZXNzLmtpbGwoc2Vzc2lvbi5waWQsICdTSUdURVJNJyk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zdCBjb2RlID0gKGVyciBhcyBOb2RlSlMuRXJybm9FeGNlcHRpb24pLmNvZGU7XG4gICAgICBpZiAoY29kZSA9PT0gJ0VTUkNIJykge1xuICAgICAgICAvLyBQcm9jZXNzIGFscmVhZHkgZGVhZCDigJQgdHJlYXQgYXMgc3VjY2Vzc2Z1bCBraWxsLlxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKCdbSW5nZXN0Um91dGVzXSBGYWlsZWQgdG8ga2lsbCBzZXNzaW9uJywge1xuICAgICAgICAgIGRpc3BsYXlOYW1lOiBzZXNzaW9uLmRpc3BsYXlOYW1lLCBzZXNzaW9uSWQsIHBpZDogc2Vzc2lvbi5waWQsIGVycm9yOiAoZXJyIGFzIEVycm9yKS5tZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogJ0ZhaWxlZCB0byBraWxsIHNlc3Npb24nLCBzZXNzaW9uSWQsIGRpc3BsYXlOYW1lOiBzZXNzaW9uLmRpc3BsYXlOYW1lLCBwaWQ6IHNlc3Npb24ucGlkLCBkZXRhaWw6IChlcnIgYXMgRXJyb3IpLm1lc3NhZ2UgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gICAgc2Vzc2lvbi5zdGF0dXMgPSAnZW5kZWQnO1xuICAgIG5hbWVQb29sLnJlbGVhc2Uoc2Vzc2lvbklkKTtcbiAgICBraWxsZWRTZXNzaW9ucy5hZGQoc2Vzc2lvbklkKTtcbiAgICBsb2dnZXIuaW5mbygnW0luZ2VzdFJvdXRlc10gU2Vzc2lvbiBraWxsZWQnLCB7XG4gICAgICBkaXNwbGF5TmFtZTogc2Vzc2lvbi5kaXNwbGF5TmFtZSwgc2Vzc2lvbklkLCBwaWQ6IHNlc3Npb24ucGlkLFxuICAgICAgYWN0aXZlU2Vzc2lvbnM6IEFycmF5LmZyb20oc2Vzc2lvbnMudmFsdWVzKCkpLmZpbHRlcihzID0+IHMuc3RhdHVzID09PSAnYWN0aXZlJykubGVuZ3RoIC0gMSxcbiAgICB9KTtcbiAgICByZXMuanNvbih7IG9rOiB0cnVlLCBraWxsZWQ6IHNlc3Npb24uZGlzcGxheU5hbWUsIHBpZDogc2Vzc2lvbi5waWQgfSk7XG4gIH0pO1xuXG4gIC8qKiBNYXJrIHN0YWxlIGFjdGl2ZSBzZXNzaW9ucyBhcyBlbmRlZC4gKi9cbiAgZnVuY3Rpb24gcmVhcFN0YWxlU2Vzc2lvbnMobm93OiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtpZCwgc2Vzc2lvbl0gb2Ygc2Vzc2lvbnMpIHtcbiAgICAgIGlmIChzZXNzaW9uLnN0YXR1cyAhPT0gJ2FjdGl2ZScpIGNvbnRpbnVlO1xuICAgICAgaWYgKHNlc3Npb24uaXNMZWFkZXIgfHwgc2Vzc2lvbi5raW5kID09PSAnY29uc29sZScpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgYWdlID0gbm93IC0gbmV3IERhdGUoc2Vzc2lvbi5sYXN0SGVhcnRiZWF0KS5nZXRUaW1lKCk7XG4gICAgICBpZiAoYWdlIDw9IFNFU1NJT05fU1RBTEVfTVMpIGNvbnRpbnVlO1xuICAgICAgc2Vzc2lvbi5zdGF0dXMgPSAnZW5kZWQnO1xuICAgICAgbmFtZVBvb2wucmVsZWFzZShpZCk7XG4gICAgICBsb2dnZXIuaW5mbygnW0luZ2VzdFJvdXRlc10gUmVhcGVkIHN0YWxlIHNlc3Npb24nLCB7XG4gICAgICAgIGRpc3BsYXlOYW1lOiBzZXNzaW9uLmRpc3BsYXlOYW1lLCBzZXNzaW9uSWQ6IGlkLCBwaWQ6IHNlc3Npb24ucGlkLFxuICAgICAgICBsYXN0SGVhcnRiZWF0QWdvOiBgJHtNYXRoLnJvdW5kKGFnZSAvIDEwMDApfXNgLFxuICAgICAgICBhY3RpdmVTZXNzaW9uczogQXJyYXkuZnJvbShzZXNzaW9ucy52YWx1ZXMoKSkuZmlsdGVyKHMgPT4gcy5zdGF0dXMgPT09ICdhY3RpdmUnKS5sZW5ndGggLSAxLFxuICAgICAgfSk7XG4gICAgICBicm9hZGNhc3RzLnNlc3Npb25Ccm9hZGNhc3Q/LihzZXNzaW9uKTtcbiAgICB9XG4gIH1cblxuICAvKiogRGVsZXRlIGVuZGVkIHNlc3Npb25zIHRvIGJvdW5kIG1lbW9yeSAoIzE4NzApLiAqL1xuICBmdW5jdGlvbiBwdXJnZVN0YWxlRW50cmllcyhub3c6IG51bWJlcik6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW2lkLCBzZXNzaW9uXSBvZiBzZXNzaW9ucykge1xuICAgICAgaWYgKHNlc3Npb24uc3RhdHVzID09PSAnZW5kZWQnICYmIG5vdyAtIG5ldyBEYXRlKHNlc3Npb24ubGFzdEhlYXJ0YmVhdCkuZ2V0VGltZSgpID4gRU5ERURfUFVSR0VfTVMpIHtcbiAgICAgICAgc2Vzc2lvbnMuZGVsZXRlKGlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCByZWFwZXJJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIHJlYXBTdGFsZVNlc3Npb25zKG5vdyk7XG4gICAgcHVyZ2VTdGFsZUVudHJpZXMobm93KTtcbiAgfSwgUkVBUEVSX0lOVEVSVkFMX01TKTtcbiAgcmVhcGVySW50ZXJ2YWwudW5yZWYoKTtcblxuICBmdW5jdGlvbiBnZXRTZXNzaW9ucygpOiBTZXNzaW9uSW5mb1tdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShzZXNzaW9ucy52YWx1ZXMoKSkuZmlsdGVyKHMgPT4gcy5zdGF0dXMgPT09ICdhY3RpdmUnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlZ2lzdGVyTGVhZGVyU2Vzc2lvbihzZXNzaW9uSWQ6IHN0cmluZywgcGlkOiBudW1iZXIsIGNsaWVudFBsYXRmb3JtPzogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gbmFtZVBvb2wuYXNzaWduKHNlc3Npb25JZCwgdHJ1ZSk7XG4gICAgY29uc3QgY29sb3IgPSBuYW1lUG9vbC5nZXRDb2xvcihzZXNzaW9uSWQpID8/ICcjM2I4MmY2JztcbiAgICBjb25zdCBub3JtYWxpemVkQ2xpZW50UGxhdGZvcm0gPSBub3JtYWxpemVDbGllbnRQbGF0Zm9ybShjbGllbnRQbGF0Zm9ybSA/PyB1bmRlZmluZWQpO1xuICAgIHNlc3Npb25zLnNldChzZXNzaW9uSWQsIHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgY29sb3IsXG4gICAgICBwaWQsXG4gICAgICBzdGFydGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGxhc3RIZWFydGJlYXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIHN0YXR1czogJ2FjdGl2ZScsXG4gICAgICBpc0xlYWRlcjogdHJ1ZSxcbiAgICAgIGF1dGhlbnRpY2F0ZWQ6IHRydWUsXG4gICAgICBraW5kOiAnbWNwJyxcbiAgICAgIHNlcnZlclZlcnNpb246IFBBQ0tBR0VfVkVSU0lPTixcbiAgICAgIGNvbnNvbGVQcm90b2NvbFZlcnNpb246IENPTlNPTEVfUFJPVE9DT0xfVkVSU0lPTixcbiAgICAgIGNsaWVudFBsYXRmb3JtOiBub3JtYWxpemVkQ2xpZW50UGxhdGZvcm0sXG4gICAgICBjbGllbnRQbGF0Zm9ybUxhYmVsOiBnZXRTZXNzaW9uQ2xpZW50UGxhdGZvcm1MYWJlbChub3JtYWxpemVkQ2xpZW50UGxhdGZvcm0pLFxuICAgIH0pO1xuICAgIGxvZ2dlci5pbmZvKCdbSW5nZXN0Um91dGVzXSBMZWFkZXIgc2Vzc2lvbiByZWdpc3RlcmVkJywgeyBkaXNwbGF5TmFtZSwgc2Vzc2lvbklkLCBwaWQsIGNvbG9yIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIHRoZSB3ZWIgY29uc29sZSBpdHNlbGYgYXMgYSBzZXNzaW9uICgjMTgwNSkuIEVuc3VyZXMgdGhlXG4gICAqIHNlc3Npb24gaW5kaWNhdG9yIGFsd2F5cyBzaG93cyBhdCBsZWFzdCBvbmUgZW50cnkg4oCUIHRoZSBjb25zb2xlIHRoZVxuICAgKiB1c2VyIGlzIGN1cnJlbnRseSBsb29raW5nIGF0LlxuICAgKi9cbiAgZnVuY3Rpb24gcmVnaXN0ZXJDb25zb2xlU2Vzc2lvbigpOiB2b2lkIHtcbiAgICBjb25zdCBjb25zb2xlSWQgPSBgY29uc29sZS0ke3Byb2Nlc3MucGlkfWA7XG4gICAgaWYgKHNlc3Npb25zLmhhcyhjb25zb2xlSWQpKSByZXR1cm47XG4gICAgY29uc3QgZGlzcGxheU5hbWUgPSAnV2ViIENvbnNvbGUnO1xuICAgIGNvbnN0IG5vcm1hbGl6ZWRDbGllbnRQbGF0Zm9ybTogU2Vzc2lvbkNsaWVudFBsYXRmb3JtSWQgPSAnd2ViLWNvbnNvbGUnO1xuICAgIHNlc3Npb25zLnNldChjb25zb2xlSWQsIHtcbiAgICAgIHNlc3Npb25JZDogY29uc29sZUlkLFxuICAgICAgZGlzcGxheU5hbWUsXG4gICAgICBjb2xvcjogJyM2MzY2ZjEnLCAvLyBpbmRpZ28g4oCUIGRpc3RpbmN0IGZyb20gcHVwcGV0IGdyZWVucy9ibHVlc1xuICAgICAgcGlkOiBwcm9jZXNzLnBpZCxcbiAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgbGFzdEhlYXJ0YmVhdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgc3RhdHVzOiAnYWN0aXZlJyxcbiAgICAgIGlzTGVhZGVyOiBmYWxzZSxcbiAgICAgIGF1dGhlbnRpY2F0ZWQ6IHRydWUsXG4gICAgICBraW5kOiAnY29uc29sZScsXG4gICAgICBzZXJ2ZXJWZXJzaW9uOiBQQUNLQUdFX1ZFUlNJT04sXG4gICAgICBjb25zb2xlUHJvdG9jb2xWZXJzaW9uOiBDT05TT0xFX1BST1RPQ09MX1ZFUlNJT04sXG4gICAgICBjbGllbnRQbGF0Zm9ybTogbm9ybWFsaXplZENsaWVudFBsYXRmb3JtLFxuICAgICAgY2xpZW50UGxhdGZvcm1MYWJlbDogZ2V0U2Vzc2lvbkNsaWVudFBsYXRmb3JtTGFiZWwobm9ybWFsaXplZENsaWVudFBsYXRmb3JtKSxcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbygnW0luZ2VzdFJvdXRlc10gQ29uc29sZSBzZXNzaW9uIHJlZ2lzdGVyZWQnLCB7IHNlc3Npb25JZDogY29uc29sZUlkLCBwaWQ6IHByb2Nlc3MucGlkIH0pO1xuICB9XG5cbiAgcmV0dXJuIHsgcm91dGVyLCBnZXRTZXNzaW9ucywgcmVnaXN0ZXJMZWFkZXJTZXNzaW9uLCByZWdpc3RlckNvbnNvbGVTZXNzaW9uIH07XG59XG4iXX0=
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
*/
|
|
17
17
|
import type { ILogSink, UnifiedLogEntry } from '../../logging/types.js';
|
|
18
18
|
import type { MetricSnapshot } from '../../metrics/types.js';
|
|
19
|
+
import { type SessionClientPlatformId } from './sessionClientPlatform.js';
|
|
19
20
|
/**
|
|
20
21
|
* ILogSink that batch-POSTs entries to the leader's /api/ingest/logs.
|
|
21
22
|
*/
|
|
@@ -66,10 +67,14 @@ export declare class SessionHeartbeat {
|
|
|
66
67
|
private readonly pid;
|
|
67
68
|
/** Optional console auth token (#1780). Included as Bearer header on ingest POSTs. */
|
|
68
69
|
private readonly authToken;
|
|
70
|
+
/** Explicit MCP host platform metadata for this runtime. */
|
|
71
|
+
private readonly clientPlatform;
|
|
69
72
|
private heartbeatTimer;
|
|
70
73
|
constructor(leaderUrl: string, sessionId: string, pid: number,
|
|
71
74
|
/** Optional console auth token (#1780). Included as Bearer header on ingest POSTs. */
|
|
72
|
-
authToken?: string | null
|
|
75
|
+
authToken?: string | null,
|
|
76
|
+
/** Explicit MCP host platform metadata for this runtime. */
|
|
77
|
+
clientPlatform?: SessionClientPlatformId | null);
|
|
73
78
|
/** Notify the leader that this session has started */
|
|
74
79
|
start(): Promise<void>;
|
|
75
80
|
/** Notify the leader that this session is stopping */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LeaderForwardingSink.d.ts","sourceRoot":"","sources":["../../../src/web/console/LeaderForwardingSink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"LeaderForwardingSink.d.ts","sourceRoot":"","sources":["../../../src/web/console/LeaderForwardingSink.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAM7D,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,4BAA4B,CAAC;AAqCpC;;GAEG;AACH,qBAAa,uBAAwB,YAAW,QAAQ;IASpD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,gGAAgG;IAChG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAbjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyB;IAChD,OAAO,CAAC,UAAU,CAA+C;IACjE,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,mBAAmB,CAAK;IAChC,OAAO,CAAC,MAAM,CAAS;gBAGJ,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM;IAClC,sFAAsF;IACrE,SAAS,GAAE,MAAM,GAAG,IAAW;IAChD,gGAAgG;IAC/E,aAAa,CAAC,GAAE,MAAM,IAAI,aAAA;IAO7C,KAAK,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAkB7B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAItB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAQd,WAAW;IAgCzB,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,aAAa;CAwBtB;AAED;;GAEG;AACH,qBAAa,2BAA2B;IAEpC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAHT,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM;IAClC,sFAAsF;IACrE,SAAS,GAAE,MAAM,GAAG,IAAW;IAG5C,UAAU,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CAgB1D;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAIzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,sFAAsF;IACtF,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,4DAA4D;IAC5D,OAAO,CAAC,QAAQ,CAAC,cAAc;IATjC,OAAO,CAAC,cAAc,CAA+C;gBAGlD,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,MAAM;IAC5B,sFAAsF;IACrE,SAAS,GAAE,MAAM,GAAG,IAAW;IAChD,4DAA4D;IAC3C,cAAc,GAAE,uBAAuB,GAAG,IAAsC;IAGnG,sDAAsD;IAChD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,sDAAsD;IAChD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAQb,SAAS;CAwBxB"}
|