@dollhousemcp/mcp-server 2.0.30 → 2.0.31
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 +4 -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 +6 -3
- package/dist/services/BuildInfoService.d.ts +3 -1
- package/dist/services/BuildInfoService.d.ts.map +1 -1
- package/dist/services/BuildInfoService.js +27 -5
- package/dist/utils/permissionHookShared.d.ts +39 -0
- package/dist/utils/permissionHookShared.d.ts.map +1 -1
- package/dist/utils/permissionHookShared.js +38 -1
- package/dist/utils/permissionHookStatus.d.ts.map +1 -1
- package/dist/utils/permissionHookStatus.js +6 -2
- package/dist/utils/permissionHooks.d.ts +1 -1
- package/dist/utils/permissionHooks.d.ts.map +1 -1
- package/dist/utils/permissionHooks.js +2 -2
- package/dist/web/routes/healthRoutes.d.ts.map +1 -1
- package/dist/web/routes/healthRoutes.js +3 -1
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
- package/dist/web/routes/permissionRoutes.js +10 -2
- package/package.json +1 -1
- package/scripts/pretooluse-dollhouse.sh +157 -39
- package/server.json +2 -2
|
@@ -11,7 +11,7 @@ import { homedir } from 'node:os';
|
|
|
11
11
|
import { logger } from '../../utils/logger.js';
|
|
12
12
|
import { formatPermissionResponse } from '../../handlers/mcp-aql/evaluatePermission.js';
|
|
13
13
|
import { ensureLatestPortFile } from '../portDiscovery.js';
|
|
14
|
-
import { getLastPermissionHookStartupRepairSummary, getPermissionHookStatusAsync, reconcilePermissionHookStatus, summarizePermissionHookHealth, } from '../../utils/permissionHooks.js';
|
|
14
|
+
import { getLastPermissionHookStartupRepairSummary, getPermissionHookDiagnosticsPath, getPermissionHookStatusAsync, readLastPermissionHookDiagnostic, reconcilePermissionHookStatus, summarizePermissionHookHealth, } from '../../utils/permissionHooks.js';
|
|
15
15
|
import { SlidingWindowRateLimiter } from '../../utils/SlidingWindowRateLimiter.js';
|
|
16
16
|
import { PERMISSION_AUTHORITY_HOSTS, PERMISSION_AUTHORITY_MODES, readPermissionAuthorityState, setPermissionAuthorityMode, } from '../../utils/permissionAuthority.js';
|
|
17
17
|
const PERMISSION_ROUTE_RATE_LIMIT_REQUESTS = 120;
|
|
@@ -319,12 +319,16 @@ export function registerPermissionRoutes(router, handler, options = {}) {
|
|
|
319
319
|
const allowOperations = data.combinedAllowOperations ?? [];
|
|
320
320
|
const confirmOperations = data.combinedConfirmOperations ?? [];
|
|
321
321
|
const hookStartupRepair = getLastPermissionHookStartupRepairSummary();
|
|
322
|
+
const hookDiagnosticsPath = getPermissionHookDiagnosticsPath(authorityHomeDir);
|
|
323
|
+
const hookLastDiagnostic = await readLastPermissionHookDiagnostic(authorityHomeDir);
|
|
322
324
|
const hookHealthHost = hookStatus.host ?? hookHost ?? 'managed-host';
|
|
323
325
|
const hookHealth = summarizePermissionHookHealth({
|
|
324
326
|
installedHosts: hookStatus.installed || hookStatus.assetsPrepared ? [hookHealthHost] : [],
|
|
325
327
|
currentHosts: hookStatus.assetsCurrent ? [hookHealthHost] : [],
|
|
326
328
|
repairedHosts: hookStatus.autoRepaired ? [hookHealthHost] : [],
|
|
327
329
|
needsRepairHosts: hookStatus.needsRepair ? [hookHealthHost] : [],
|
|
330
|
+
diagnosticsPath: hookDiagnosticsPath,
|
|
331
|
+
lastDiagnostic: hookLastDiagnostic,
|
|
328
332
|
lastStartupRepair: hookStartupRepair,
|
|
329
333
|
});
|
|
330
334
|
res.json({
|
|
@@ -352,6 +356,10 @@ export function registerPermissionRoutes(router, handler, options = {}) {
|
|
|
352
356
|
hookRepairError: hookStatus.repairError,
|
|
353
357
|
hookHealth,
|
|
354
358
|
hookStartupRepair,
|
|
359
|
+
hookDiagnostics: {
|
|
360
|
+
logPath: hookDiagnosticsPath,
|
|
361
|
+
lastEvent: hookLastDiagnostic,
|
|
362
|
+
},
|
|
355
363
|
authority: authorityState,
|
|
356
364
|
authoritySupportedHosts: installedAuthorityHosts,
|
|
357
365
|
authoritySupportedModes: [...PERMISSION_AUTHORITY_MODES],
|
|
@@ -446,4 +454,4 @@ function normalizeAuthorityMode(value) {
|
|
|
446
454
|
function asStringArray(value) {
|
|
447
455
|
return Array.isArray(value) ? value.filter((entry) => typeof entry === 'string') : [];
|
|
448
456
|
}
|
|
449
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvblJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93ZWIvcm91dGVzL3Blcm1pc3Npb25Sb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sT0FBbUIsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDeEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUNMLHlDQUF5QyxFQUN6Qyw0QkFBNEIsRUFDNUIsNkJBQTZCLEVBQzdCLDZCQUE2QixHQUM5QixNQUFNLGdDQUFnQyxDQUFDO0FBRXhDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQ25GLE9BQU8sRUFHTCwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzFCLDRCQUE0QixFQUM1QiwwQkFBMEIsR0FDM0IsTUFBTSxvQ0FBb0MsQ0FBQztBQXlENUMsTUFBTSxvQ0FBb0MsR0FBRyxHQUFHLENBQUM7QUFDakQsTUFBTSxxQ0FBcUMsR0FBRyxNQUFNLENBQUM7QUFDckQsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFhakMsTUFBTSxnQ0FBZ0MsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQzVFLE1BQU0saUNBQWlDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFHNUUsMEVBQTBFO0FBQzFFLFNBQVMsYUFBYSxDQUFDLEdBQTRCLEVBQUUsSUFBYyxFQUFFLFFBQWdCO0lBQ25GLEtB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QUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQztnQkFDbkIsS0FBSyxFQUFFLEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLHVDQUF1QzthQUNwRixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxzQkFBc0IsQ0FBQyxLQUFjO0lBQzVDLE9BQU8sT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLDBCQUEwQixDQUFDLFFBQVEsQ0FBQyxLQUFnQyxDQUFDO1FBQ3ZHLENBQUMsQ0FBQyxLQUFnQztRQUNsQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQ1gsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsS0FBYztJQUM1QyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSwwQkFBMEIsQ0FBQyxRQUFRLENBQUMsS0FBZ0MsQ0FBQztRQUN2RyxDQUFDLENBQUMsS0FBZ0M7UUFDbEMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNYLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxLQUFjO0lBQ25DLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBbUIsRUFBRSxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDekcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGVybWlzc2lvbiBldmFsdWF0aW9uIEhUVFAgcm91dGVzIGFuZCBkZWNpc2lvbiB0cmFja2luZy5cbiAqXG4gKiBQcm92aWRlczpcbiAqIC0gUE9TVCAvZXZhbHVhdGVfcGVybWlzc2lvbiDigJQgZXZhbHVhdGVzIHRvb2wgcGVybWlzc2lvbnMgdmlhIE1DUC1BUUxcbiAqIC0gR0VUIC9wZXJtaXNzaW9ucy9zdGF0dXMg4oCUIHJldHVybnMgY3VycmVudCBwb2xpY2llcyBhbmQgcmVjZW50IGRlY2lzaW9uc1xuICogLSBEZWNpc2lvbiB0cmFja2luZyByaW5nIGJ1ZmZlciBmb3IgdGhlIGxpdmUgZGFzaGJvYXJkIGZlZWRcbiAqL1xuXG5pbXBvcnQgZXhwcmVzcywgeyBSb3V0ZXIgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IE1DUEFRTEhhbmRsZXIgfSBmcm9tICcuLi8uLi9oYW5kbGVycy9tY3AtYXFsL01DUEFRTEhhbmRsZXIuanMnO1xuaW1wb3J0IHsgZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9ldmFsdWF0ZVBlcm1pc3Npb24uanMnO1xuaW1wb3J0IHsgZW5zdXJlTGF0ZXN0UG9ydEZpbGUgfSBmcm9tICcuLi9wb3J0RGlzY292ZXJ5LmpzJztcbmltcG9ydCB7XG4gIGdldExhc3RQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5LFxuICBnZXRQZXJtaXNzaW9uSG9va1N0YXR1c0FzeW5jLFxuICByZWNvbmNpbGVQZXJtaXNzaW9uSG9va1N0YXR1cyxcbiAgc3VtbWFyaXplUGVybWlzc2lvbkhvb2tIZWFsdGgsXG59IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25Ib29rcy5qcyc7XG5cbmltcG9ydCB7IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlciB9IGZyb20gJy4uLy4uL3V0aWxzL1NsaWRpbmdXaW5kb3dSYXRlTGltaXRlci5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFBlcm1pc3Npb25BdXRob3JpdHlIb3N0LFxuICB0eXBlIFBlcm1pc3Npb25BdXRob3JpdHlNb2RlLFxuICBQRVJNSVNTSU9OX0FVVEhPUklUWV9IT1NUUyxcbiAgUEVSTUlTU0lPTl9BVVRIT1JJVFlfTU9ERVMsXG4gIHJlYWRQZXJtaXNzaW9uQXV0aG9yaXR5U3RhdGUsXG4gIHNldFBlcm1pc3Npb25BdXRob3JpdHlNb2RlLFxufSBmcm9tICcuLi8uLi91dGlscy9wZXJtaXNzaW9uQXV0aG9yaXR5LmpzJztcblxuLy8g4pSA4pSAIFBlcm1pc3Npb24gRGVjaXNpb24gVHJhY2tpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBSaW5nIGJ1ZmZlciBvZiByZWNlbnQgcGVybWlzc2lvbiBkZWNpc2lvbnMgZm9yIHRoZSBsaXZlIGRhc2hib2FyZCBmZWVkLlxuXG5pbnRlcmZhY2UgUGVybWlzc2lvbkRlY2lzaW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG4gIHNlc3Npb25faWQ/OiBzdHJpbmc7XG4gIHRvb2xfbmFtZTogc3RyaW5nO1xuICBjb21tYW5kPzogc3RyaW5nO1xuICBkZWNpc2lvbjogc3RyaW5nO1xuICByZWFzb24/OiBzdHJpbmc7XG4gIHBsYXRmb3JtPzogc3RyaW5nO1xuICB0YXJnZXQ/OiBzdHJpbmc7XG4gIHRhcmdldExhYmVsPzogc3RyaW5nO1xuICBkZXRhaWxzPzogUGVybWlzc2lvbkRlY2lzaW9uRGV0YWlsW107XG59XG5cbmludGVyZmFjZSBQZXJtaXNzaW9uRGVjaXNpb25EZXRhaWwge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBtb25vc3BhY2U/OiBib29sZWFuO1xufVxuXG50eXBlIFBlcm1pc3Npb25EZWNpc2lvblRhcmdldEtleSA9XG4gIHwgJ2ZpbGVfcGF0aCdcbiAgfCAncGF0aCdcbiAgfCAndXJsJ1xuICB8ICdwYXR0ZXJuJ1xuICB8ICdxdWVyeSdcbiAgfCAnZWxlbWVudF9uYW1lJ1xuICB8ICdyZXF1ZXN0X2lkJztcblxuaW50ZXJmYWNlIFBlcm1pc3Npb25EZWNpc2lvbklucHV0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb21tYW5kPzogc3RyaW5nO1xuICBmaWxlX3BhdGg/OiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbiAgcGF0dGVybj86IHN0cmluZztcbiAgcXVlcnk/OiBzdHJpbmc7XG4gIGVsZW1lbnRfbmFtZT86IHN0cmluZztcbiAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBlcm1pc3Npb25EZWNpc2lvblRhcmdldERlc2NyaXB0b3Ige1xuICBrZXk6IFBlcm1pc3Npb25EZWNpc2lvblRhcmdldEtleTtcbiAgbGFiZWw6IHN0cmluZztcbiAgbW9ub3NwYWNlPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEtub3duUG9saWN5U2Vzc2lvbiB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICBzb3VyY2U6ICdwb2xpY3knO1xufVxuXG5jb25zdCBQRVJNSVNTSU9OX1JPVVRFX1JBVEVfTElNSVRfUkVRVUVTVFMgPSAxMjA7XG5jb25zdCBQRVJNSVNTSU9OX1JPVVRFX1JBVEVfTElNSVRfV0lORE9XX01TID0gNjBfMDAwO1xuY29uc3QgREVDSVNJT05fQlVGRkVSX1NJWkUgPSAyMDA7XG5cbmludGVyZmFjZSBQZXJtaXNzaW9uRGVjaXNpb25UcmFja2VyIHtcbiAgdHJhY2tEZWNpc2lvbihcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB0b29sTmFtZTogc3RyaW5nLFxuICAgIGlucHV0OiBQZXJtaXNzaW9uRGVjaXNpb25JbnB1dCxcbiAgICByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHBsYXRmb3JtOiBzdHJpbmcsXG4gICk6IHZvaWQ7XG4gIGdldFJlY2VudERlY2lzaW9ucygpOiBQZXJtaXNzaW9uRGVjaXNpb25bXTtcbn1cblxuY29uc3QgQ0xBVURFX0NPTVBBVElCTEVfSE9PS19QTEFURk9STVMgPSBuZXcgU2V0KFsnY2xhdWRlX2NvZGUnLCAndnNjb2RlJ10pO1xuY29uc3QgTk9STUFMSVpBQkxFX1BFUk1JU1NJT05fREVDSVNJT05TID0gbmV3IFNldChbJ2FsbG93JywgJ2RlbnknLCAnYXNrJ10pO1xudHlwZSBOb3JtYWxpemFibGVQZXJtaXNzaW9uRGVjaXNpb24gPSAnYWxsb3cnIHwgJ2RlbnknIHwgJ2Fzayc7XG5cbi8qKiBFeHRyYWN0IGEgc3RyaW5nIGZpZWxkIGZyb20gYSByZWNvcmQsIHRyeWluZyBtdWx0aXBsZSBrZXlzIGluIG9yZGVyICovXG5mdW5jdGlvbiBleHRyYWN0U3RyaW5nKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtleXM6IHN0cmluZ1tdLCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHZhbCA9IG9iaj8uW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsO1xuICB9XG4gIHJldHVybiBmYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gZXh0cmFjdERlY2lzaW9uKHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcge1xuICBjb25zdCBuZXN0ZWQgPSByZXN1bHQuaG9va1NwZWNpZmljT3V0cHV0O1xuICBpZiAobmVzdGVkICYmIHR5cGVvZiBuZXN0ZWQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG5lc3RlZCkpIHtcbiAgICBjb25zdCBuZXN0ZWREZWNpc2lvbiA9IChuZXN0ZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnBlcm1pc3Npb25EZWNpc2lvbjtcbiAgICBpZiAodHlwZW9mIG5lc3RlZERlY2lzaW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG5lc3RlZERlY2lzaW9uO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZXN1bHQucGVybWlzc2lvbiA9PT0gJ3N0cmluZycpIHJldHVybiByZXN1bHQucGVybWlzc2lvbjtcbiAgaWYgKHR5cGVvZiByZXN1bHQuZGVjaXNpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gcmVzdWx0LmRlY2lzaW9uO1xuICBpZiAodHlwZW9mIHJlc3VsdC5iZWhhdmlvciA9PT0gJ3N0cmluZycpIHJldHVybiByZXN1bHQuYmVoYXZpb3I7XG4gIGlmICh0eXBlb2YgcmVzdWx0LmFsbG93ZWQgPT09ICdib29sZWFuJykgcmV0dXJuIHJlc3VsdC5hbGxvd2VkID8gJ2FsbG93JyA6ICdkZW55JztcbiAgcmV0dXJuICd1bmtub3duJztcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFJlYXNvbihyZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgY29uc3QgbmVzdGVkID0gcmVzdWx0Lmhvb2tTcGVjaWZpY091dHB1dDtcbiAgaWYgKG5lc3RlZCAmJiB0eXBlb2YgbmVzdGVkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShuZXN0ZWQpKSB7XG4gICAgY29uc3QgbmVzdGVkUmVhc29uID0gKG5lc3RlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikucGVybWlzc2lvbkRlY2lzaW9uUmVhc29uO1xuICAgIGlmICh0eXBlb2YgbmVzdGVkUmVhc29uID09PSAnc3RyaW5nJykgcmV0dXJuIG5lc3RlZFJlYXNvbjtcbiAgfVxuXG4gIHJldHVybiBleHRyYWN0U3RyaW5nKHJlc3VsdCwgWydyZWFzb24nLCAnbWVzc2FnZSddLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZE5vcm1hbGl6ZUNsYXVkZUhvb2socGxhdGZvcm06IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGxhdGZvcm0gIT09IHVuZGVmaW5lZCAmJiBDTEFVREVfQ09NUEFUSUJMRV9IT09LX1BMQVRGT1JNUy5oYXMocGxhdGZvcm0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQZXJtaXNzaW9uUmVzcG9uc2VGb3JQbGF0Zm9ybShcbiAgcGxhdGZvcm06IHN0cmluZyxcbiAgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAoIXNob3VsZE5vcm1hbGl6ZUNsYXVkZUhvb2socGxhdGZvcm0pKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IG5lc3RlZCA9IHJlc3VsdC5ob29rU3BlY2lmaWNPdXRwdXQ7XG4gIGlmIChuZXN0ZWQgJiYgdHlwZW9mIG5lc3RlZCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkobmVzdGVkKSkge1xuICAgIGNvbnN0IG5lc3RlZERlY2lzaW9uID0gKG5lc3RlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikucGVybWlzc2lvbkRlY2lzaW9uO1xuICAgIGlmICh0eXBlb2YgbmVzdGVkRGVjaXNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRlY2lzaW9uID0gZXh0cmFjdERlY2lzaW9uKHJlc3VsdCk7XG4gIGlmIChOT1JNQUxJWkFCTEVfUEVSTUlTU0lPTl9ERUNJU0lPTlMuaGFzKGRlY2lzaW9uKSkge1xuICAgIHJldHVybiBmb3JtYXRQZXJtaXNzaW9uUmVzcG9uc2UoXG4gICAgICBkZWNpc2lvbiBhcyBOb3JtYWxpemFibGVQZXJtaXNzaW9uRGVjaXNpb24sXG4gICAgICBwbGF0Zm9ybSxcbiAgICAgIGlucHV0LFxuICAgICAgZXh0cmFjdFJlYXNvbihyZXN1bHQpLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCBpbnB1dCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGVjaXNpb25EZXRhaWxzKFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBpbnB1dDogUGVybWlzc2lvbkRlY2lzaW9uSW5wdXQsXG4gIHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBsYXRmb3JtOiBzdHJpbmcsXG4pOiB7IHRhcmdldD86IHN0cmluZzsgdGFyZ2V0TGFiZWw/OiBzdHJpbmc7IGRldGFpbHM6IFBlcm1pc3Npb25EZWNpc2lvbkRldGFpbFtdIH0ge1xuICBjb25zdCBkZXRhaWxzOiBQZXJtaXNzaW9uRGVjaXNpb25EZXRhaWxbXSA9IFtdO1xuXG4gIGlmIChwbGF0Zm9ybSkge1xuICAgIGRldGFpbHMucHVzaCh7IGxhYmVsOiAnUGxhdGZvcm0nLCB2YWx1ZTogcGxhdGZvcm0sIG1vbm9zcGFjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGlmICh0b29sTmFtZSA9PT0gJ0Jhc2gnICYmIHR5cGVvZiBpbnB1dC5jb21tYW5kID09PSAnc3RyaW5nJyAmJiBpbnB1dC5jb21tYW5kICE9PSAnJykge1xuICAgIGRldGFpbHMucHVzaCh7IGxhYmVsOiAnQ29tbWFuZCcsIHZhbHVlOiBpbnB1dC5jb21tYW5kLCBtb25vc3BhY2U6IHRydWUgfSk7XG4gIH1cblxuICBjb25zdCB0YXJnZXREZXNjcmlwdG9yczogUGVybWlzc2lvbkRlY2lzaW9uVGFyZ2V0RGVzY3JpcHRvcltdID0gW1xuICAgIHsga2V5OiAnZmlsZV9wYXRoJywgbGFiZWw6ICdGaWxlJywgbW9ub3NwYWNlOiB0cnVlIH0sXG4gICAgeyBrZXk6ICdwYXRoJywgbGFiZWw6ICdQYXRoJywgbW9ub3NwYWNlOiB0cnVlIH0sXG4gICAgeyBrZXk6ICd1cmwnLCBsYWJlbDogJ1VSTCcgfSxcbiAgICB7IGtleTogJ3BhdHRlcm4nLCBsYWJlbDogJ1BhdHRlcm4nLCBtb25vc3BhY2U6IHRydWUgfSxcbiAgICB7IGtleTogJ3F1ZXJ5JywgbGFiZWw6ICdRdWVyeScgfSxcbiAgICB7IGtleTogJ2VsZW1lbnRfbmFtZScsIGxhYmVsOiAnRWxlbWVudCcsIG1vbm9zcGFjZTogdHJ1ZSB9LFxuICAgIHsga2V5OiAncmVxdWVzdF9pZCcsIGxhYmVsOiAnUmVxdWVzdCcsIG1vbm9zcGFjZTogdHJ1ZSB9LFxuICBdO1xuXG4gIGxldCB0YXJnZXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHRhcmdldExhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBkZXNjcmlwdG9yIG9mIHRhcmdldERlc2NyaXB0b3JzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBpbnB1dFtkZXNjcmlwdG9yLmtleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0YXJnZXQgPSB2YWx1ZTtcbiAgICB0YXJnZXRMYWJlbCA9IGRlc2NyaXB0b3IubGFiZWw7XG4gICAgZGV0YWlscy5wdXNoKHsgbGFiZWw6IGRlc2NyaXB0b3IubGFiZWwsIHZhbHVlLCBtb25vc3BhY2U6IGRlc2NyaXB0b3IubW9ub3NwYWNlIH0pO1xuICAgIGJyZWFrO1xuICB9XG5cbiAgY29uc3QgbWF0Y2hlZFBhdHRlcm4gPSBleHRyYWN0U3RyaW5nKHJlc3VsdCwgWydtYXRjaGVkX3BhdHRlcm4nLCAnbWF0Y2hlZFBhdHRlcm4nXSwgJycpO1xuICBpZiAobWF0Y2hlZFBhdHRlcm4gIT09ICcnKSB7XG4gICAgZGV0YWlscy5wdXNoKHsgbGFiZWw6ICdNYXRjaGVkIFBhdHRlcm4nLCB2YWx1ZTogbWF0Y2hlZFBhdHRlcm4sIG1vbm9zcGFjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHBvbGljeVNvdXJjZSA9IGV4dHJhY3RTdHJpbmcocmVzdWx0LCBbJ3BvbGljeV9zb3VyY2UnLCAncG9saWN5U291cmNlJ10sICcnKTtcbiAgaWYgKHBvbGljeVNvdXJjZSAhPT0gJycpIHtcbiAgICBkZXRhaWxzLnB1c2goeyBsYWJlbDogJ1BvbGljeSBTb3VyY2UnLCB2YWx1ZTogcG9saWN5U291cmNlLCBtb25vc3BhY2U6IHRydWUgfSk7XG4gIH1cblxuICByZXR1cm4geyB0YXJnZXQsIHRhcmdldExhYmVsLCBkZXRhaWxzIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBlcm1pc3Npb25EZWNpc2lvblRyYWNrZXIoYnVmZmVyU2l6ZSA9IERFQ0lTSU9OX0JVRkZFUl9TSVpFKTogUGVybWlzc2lvbkRlY2lzaW9uVHJhY2tlciB7XG4gIGNvbnN0IHJlY2VudERlY2lzaW9uczogUGVybWlzc2lvbkRlY2lzaW9uW10gPSBbXTtcbiAgbGV0IGRlY2lzaW9uQ291bnRlciA9IDA7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFja0RlY2lzaW9uKFxuICAgICAgc2Vzc2lvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICB0b29sTmFtZTogc3RyaW5nLFxuICAgICAgaW5wdXQ6IFBlcm1pc3Npb25EZWNpc2lvbklucHV0LFxuICAgICAgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgIHBsYXRmb3JtOiBzdHJpbmcsXG4gICAgKTogdm9pZCB7XG4gICAgICBjb25zdCBkZXRhaWxTdGF0ZSA9IGJ1aWxkRGVjaXNpb25EZXRhaWxzKHRvb2xOYW1lLCBpbnB1dCwgcmVzdWx0LCBwbGF0Zm9ybSk7XG4gICAgICBjb25zdCBlbnRyeTogUGVybWlzc2lvbkRlY2lzaW9uID0ge1xuICAgICAgICBpZDogYGQtJHsrK2RlY2lzaW9uQ291bnRlcn1gLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgLi4uKHNlc3Npb25JZCA/IHsgc2Vzc2lvbl9pZDogc2Vzc2lvbklkIH0gOiB7fSksXG4gICAgICAgIHRvb2xfbmFtZTogdG9vbE5hbWUsXG4gICAgICAgIGNvbW1hbmQ6IHRvb2xOYW1lID09PSAnQmFzaCcgJiYgdHlwZW9mIGlucHV0Py5jb21tYW5kID09PSAnc3RyaW5nJyA/IGlucHV0LmNvbW1hbmQgOiB1bmRlZmluZWQsXG4gICAgICAgIGRlY2lzaW9uOiBleHRyYWN0RGVjaXNpb24ocmVzdWx0KSxcbiAgICAgICAgcmVhc29uOiBleHRyYWN0UmVhc29uKHJlc3VsdCksXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgICB0YXJnZXQ6IGRldGFpbFN0YXRlLnRhcmdldCxcbiAgICAgICAgdGFyZ2V0TGFiZWw6IGRldGFpbFN0YXRlLnRhcmdldExhYmVsLFxuICAgICAgICBkZXRhaWxzOiBkZXRhaWxTdGF0ZS5kZXRhaWxzLFxuICAgICAgfTtcbiAgICAgIHJlY2VudERlY2lzaW9ucy51bnNoaWZ0KGVudHJ5KTtcbiAgICAgIGlmIChyZWNlbnREZWNpc2lvbnMubGVuZ3RoID4gYnVmZmVyU2l6ZSkge1xuICAgICAgICByZWNlbnREZWNpc2lvbnMubGVuZ3RoID0gYnVmZmVyU2l6ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGdldFJlY2VudERlY2lzaW9ucygpOiBQZXJtaXNzaW9uRGVjaXNpb25bXSB7XG4gICAgICByZXR1cm4gcmVjZW50RGVjaXNpb25zO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUnVsZUFycmF5cyguLi5zb3VyY2VzOiB1bmtub3duW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG1lcmdlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNvdXJjZSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc291cmNlKSB7XG4gICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyAmJiBlbnRyeSAhPT0gJycpIHtcbiAgICAgICAgbWVyZ2VkLmFkZChlbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKG1lcmdlZCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBvbGljeUVsZW1lbnRzKGVsZW1lbnRzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICByZXR1cm4gZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiAoe1xuICAgIC4uLmVsZW1lbnQsXG4gICAgZWxlbWVudF9uYW1lOiByZXNvbHZlRWxlbWVudE5hbWUoZWxlbWVudCksXG4gICAgYWxsb3dSdWxlczogbWVyZ2VSdWxlQXJyYXlzKGVsZW1lbnQuYWxsb3dQYXR0ZXJucywgZWxlbWVudC5hbGxvd09wZXJhdGlvbnMpLFxuICAgIGNvbmZpcm1SdWxlczogbWVyZ2VSdWxlQXJyYXlzKGVsZW1lbnQuY29uZmlybVBhdHRlcm5zLCBlbGVtZW50LmNvbmZpcm1PcGVyYXRpb25zKSxcbiAgICBkZW55UnVsZXM6IG1lcmdlUnVsZUFycmF5cyhlbGVtZW50LmRlbnlQYXR0ZXJucywgZWxlbWVudC5kZW55T3BlcmF0aW9ucyksXG4gICAgaW52YWxpZEdhdGVrZWVwZXJQb2xpY3k6ICEhZWxlbWVudC5pbnZhbGlkR2F0ZWtlZXBlclBvbGljeSxcbiAgICBpbnZhbGlkR2F0ZWtlZXBlck1lc3NhZ2U6IHR5cGVvZiBlbGVtZW50LmludmFsaWRHYXRla2VlcGVyTWVzc2FnZSA9PT0gJ3N0cmluZycgPyBlbGVtZW50LmludmFsaWRHYXRla2VlcGVyTWVzc2FnZSA6IHVuZGVmaW5lZCxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRWxlbWVudE5hbWUoZWxlbWVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVsZW1lbnQuZWxlbWVudF9uYW1lID09PSAnc3RyaW5nJykgcmV0dXJuIGVsZW1lbnQuZWxlbWVudF9uYW1lO1xuICBpZiAodHlwZW9mIGVsZW1lbnQubmFtZSA9PT0gJ3N0cmluZycpIHJldHVybiBlbGVtZW50Lm5hbWU7XG4gIHJldHVybiAnJztcbn1cblxuLyoqIEhlbHBlciB0byBleHRyYWN0IHNpbmdsZSByZXN1bHQgZnJvbSBNQ1AtQVFMIGJhdGNoIHJlc3BvbnNlICovXG5mdW5jdGlvbiBhc1NpbmdsZVJlc3VsdChyZXN1bHRzOiB1bmtub3duKTogeyBzdWNjZXNzOiBib29sZWFuOyBkYXRhPzogdW5rbm93bjsgZXJyb3I/OiBzdHJpbmcgfSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdHMpKSByZXR1cm4gcmVzdWx0c1swXSB8fCB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0VtcHR5IHJlc3VsdCcgfTtcbiAgcmV0dXJuIHJlc3VsdHMgYXMgeyBzdWNjZXNzOiBib29sZWFuOyBkYXRhPzogdW5rbm93bjsgZXJyb3I/OiBzdHJpbmcgfTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEtub3duUG9saWN5U2Vzc2lvbnMoZWxlbWVudHM6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IEtub3duUG9saWN5U2Vzc2lvbltdIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBrbm93blNlc3Npb25zOiBLbm93blBvbGljeVNlc3Npb25bXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgIGNvbnN0IHNlc3Npb25JZHMgPSBBcnJheS5pc0FycmF5KGVsZW1lbnQuc2Vzc2lvbklkcykgPyBlbGVtZW50LnNlc3Npb25JZHMgOiBbXTtcbiAgICBmb3IgKGNvbnN0IHNlc3Npb25JZCBvZiBzZXNzaW9uSWRzKSB7XG4gICAgICBpZiAodHlwZW9mIHNlc3Npb25JZCAhPT0gJ3N0cmluZycgfHwgc2Vzc2lvbklkID09PSAnJyB8fCBzZWVuLmhhcyhzZXNzaW9uSWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBzZWVuLmFkZChzZXNzaW9uSWQpO1xuICAgICAga25vd25TZXNzaW9ucy5wdXNoKHtcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICBkaXNwbGF5TmFtZTogc2Vzc2lvbklkLFxuICAgICAgICBzb3VyY2U6ICdwb2xpY3knLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGtub3duU2Vzc2lvbnMuc29ydCgoYSwgYikgPT4gYS5zZXNzaW9uSWQubG9jYWxlQ29tcGFyZShiLnNlc3Npb25JZCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZWxmSGVhbExhdGVzdFBlcm1pc3Npb25Qb3J0RmlsZShwb3J0OiBudW1iZXIgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHR5cGVvZiBwb3J0ICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGVuc3VyZUxhdGVzdFBvcnRGaWxlKHBvcnQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoJ1tXZWJVSS9HYXRld2F5XSBDb3VsZCBub3QgcmVmcmVzaCBwZXJtaXNzaW9uLXNlcnZlci5wb3J0Jywge1xuICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgIHBvcnQsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxlZFBlcm1pc3Npb25BdXRob3JpdHlIb3N0cyhcbiAgaG9tZURpcjogc3RyaW5nLFxuICBhdXRob3JpdHlTdGF0ZTogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiByZWFkUGVybWlzc2lvbkF1dGhvcml0eVN0YXRlPj4sXG4gIGF1dG9SZXBhaXJIb29rQXNzZXRzOiBib29sZWFuLFxuKTogUHJvbWlzZTxQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdFtdPiB7XG4gIGNvbnN0IGluc3RhbGxlZFN0YXR1c2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgUEVSTUlTU0lPTl9BVVRIT1JJVFlfSE9TVFMubWFwKGFzeW5jIChob3N0KSA9PiAoe1xuICAgICAgaG9zdCxcbiAgICAgIHN0YXR1czogYXdhaXQgcmVjb25jaWxlUGVybWlzc2lvbkhvb2tTdGF0dXMoaG9zdCwgeyBob21lRGlyLCBhdXRvUmVwYWlyOiBhdXRvUmVwYWlySG9va0Fzc2V0cyB9KSxcbiAgICB9KSksXG4gICk7XG5cbiAgY29uc3QgaW5zdGFsbGVkSG9zdHMgPSBpbnN0YWxsZWRTdGF0dXNlc1xuICAgIC5maWx0ZXIoKHsgc3RhdHVzIH0pID0+IHN0YXR1cy5pbnN0YWxsZWQpXG4gICAgLm1hcCgoeyBob3N0IH0pID0+IGhvc3QpO1xuXG4gIGNvbnN0IHBlcnNpc3RlZEhvc3RzID0gT2JqZWN0LmtleXMoYXV0aG9yaXR5U3RhdGUuaG9zdHMgfHwge30pLmZpbHRlcigoaG9zdCk6IGhvc3QgaXMgUGVybWlzc2lvbkF1dGhvcml0eUhvc3QgPT5cbiAgICAoUEVSTUlTU0lPTl9BVVRIT1JJVFlfSE9TVFMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKGhvc3QpLFxuICApO1xuXG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoaW5zdGFsbGVkSG9zdHMuY29uY2F0KHBlcnNpc3RlZEhvc3RzKSkpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHBlcm1pc3Npb24tcmVsYXRlZCByb3V0ZXMgb24gYSBnYXRld2F5IHJvdXRlci5cbiAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIE1DUC1BUUwgaGFuZGxlciBmb3IgcG9saWN5IGV2YWx1YXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJQZXJtaXNzaW9uUm91dGVzT3B0aW9ucyB7XG4gIGhvbWVEaXI/OiBzdHJpbmc7XG4gIGF1dG9SZXBhaXJIb29rQXNzZXRzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUGVybWlzc2lvblJvdXRlcyhcbiAgcm91dGVyOiBSb3V0ZXIsXG4gIGhhbmRsZXI6IE1DUEFRTEhhbmRsZXIsXG4gIG9wdGlvbnM6IFJlZ2lzdGVyUGVybWlzc2lvblJvdXRlc09wdGlvbnMgPSB7fSxcbik6IHZvaWQge1xuICBjb25zdCBhdXRob3JpdHlIb21lRGlyID0gb3B0aW9ucy5ob21lRGlyID8/IGhvbWVkaXIoKTtcbiAgY29uc3QgYXV0b1JlcGFpckhvb2tBc3NldHMgPSBvcHRpb25zLmF1dG9SZXBhaXJIb29rQXNzZXRzID8/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCc7XG4gIGNvbnN0IGRlY2lzaW9uVHJhY2tlciA9IGNyZWF0ZVBlcm1pc3Npb25EZWNpc2lvblRyYWNrZXIoKTtcbiAgLyoqXG4gICAqIFBPU1QgL2FwaS9ldmFsdWF0ZV9wZXJtaXNzaW9uXG4gICAqIFBlcm1pc3Npb24gZXZhbHVhdGlvbiBlbmRwb2ludCBmb3IgUHJlVG9vbFVzZSBob29rcy5cbiAgICogUm91dGVzIHRocm91Z2ggZXZhbHVhdGVfcGVybWlzc2lvbiBNQ1AtQVFMIFJFQUQgb3BlcmF0aW9uLlxuICAgKiBGYWlsLW9wZW46IHJldHVybnMgYWxsb3cgb24gYW55IGVycm9yIHRvIGF2b2lkIGJsb2NraW5nIHRoZSB1c2VyLlxuICAgKi9cbiAgY29uc3QgcGVybWlzc2lvbkxpbWl0ZXIgPSBuZXcgU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyKFxuICAgIFBFUk1JU1NJT05fUk9VVEVfUkFURV9MSU1JVF9SRVFVRVNUUyxcbiAgICBQRVJNSVNTSU9OX1JPVVRFX1JBVEVfTElNSVRfV0lORE9XX01TLFxuICApO1xuICByb3V0ZXIucG9zdCgnL2V2YWx1YXRlX3Blcm1pc3Npb24nLCBleHByZXNzLmpzb24oKSwgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgYXdhaXQgc2VsZkhlYWxMYXRlc3RQZXJtaXNzaW9uUG9ydEZpbGUocmVxLnNvY2tldC5sb2NhbFBvcnQpO1xuXG4gICAgY29uc3QgYm9keSA9IHJlcS5ib2R5IGFzIHtcbiAgICAgIHRvb2xfbmFtZT86IHN0cmluZztcbiAgICAgIGlucHV0PzogUGVybWlzc2lvbkRlY2lzaW9uSW5wdXQ7XG4gICAgICBwbGF0Zm9ybT86IHN0cmluZztcbiAgICAgIHNlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IHR5cGVvZiBib2R5LnBsYXRmb3JtID09PSAnc3RyaW5nJyA/IGJvZHkucGxhdGZvcm0ubm9ybWFsaXplKCdORkMnKSA6ICdjbGF1ZGVfY29kZSc7XG5cbiAgICBpZiAoIXBlcm1pc3Npb25MaW1pdGVyLnRyeUFjcXVpcmUoKSkge1xuICAgICAgcmVzLmpzb24oZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCB7fSkpOyAvLyBmYWlsIG9wZW4gb24gcmF0ZSBsaW1pdFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVuaWNvZGUgbm9ybWFsaXphdGlvbiAoTkZDKSBvbiBzdHJpbmcgaW5wdXRzIHRvIHByZXZlbnQgaG9tb2dyYXBoIGF0dGFja3NcbiAgICBjb25zdCB0b29sX25hbWUgPSB0eXBlb2YgYm9keS50b29sX25hbWUgPT09ICdzdHJpbmcnID8gYm9keS50b29sX25hbWUubm9ybWFsaXplKCdORkMnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzZXNzaW9uX2lkID0gdHlwZW9mIGJvZHkuc2Vzc2lvbl9pZCA9PT0gJ3N0cmluZycgPyBib2R5LnNlc3Npb25faWQubm9ybWFsaXplKCdORkMnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpbnB1dCA9IGJvZHkuaW5wdXQ7XG5cbiAgICBpZiAoIXRvb2xfbmFtZSkge1xuICAgICAgcmVzLmpzb24oZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCBpbnB1dCB8fCB7fSkpOyAvLyBmYWlsIG9wZW4gb24gYmFkIGlucHV0XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRNcyA9IERhdGUubm93KCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9wUmVzdWx0ID0gYXNTaW5nbGVSZXN1bHQoYXdhaXQgaGFuZGxlci5oYW5kbGVSZWFkKHtcbiAgICAgICAgb3BlcmF0aW9uOiAnZXZhbHVhdGVfcGVybWlzc2lvbicsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHRvb2xfbmFtZSxcbiAgICAgICAgICBpbnB1dDogaW5wdXQgfHwge30sXG4gICAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgICAgLi4uKHNlc3Npb25faWQgPyB7IHNlc3Npb25faWQgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRNcyA9IERhdGUubm93KCkgLSBzdGFydE1zO1xuXG4gICAgICBpZiAoIW9wUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtXZWJVSS9HYXRld2F5XSBldmFsdWF0ZV9wZXJtaXNzaW9uIGZhaWxlZCAoJHtlbGFwc2VkTXN9bXMpOiAke29wUmVzdWx0LmVycm9yfWApO1xuICAgICAgICByZXMuanNvbihmb3JtYXRQZXJtaXNzaW9uUmVzcG9uc2UoJ2FsbG93JywgcGxhdGZvcm0sIGlucHV0IHx8IHt9KSk7IC8vIGZhaWwgb3BlblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJhd1Jlc3VsdCA9IG9wUmVzdWx0LmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSBub3JtYWxpemVQZXJtaXNzaW9uUmVzcG9uc2VGb3JQbGF0Zm9ybShcbiAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgIGlucHV0IHx8IHt9LFxuICAgICAgICByYXdSZXN1bHQsXG4gICAgICApO1xuICAgICAgY29uc3QgdHJhY2tlZFJlc3VsdCA9IHsgLi4ucmF3UmVzdWx0LCAuLi5yZXNwb25zZURhdGEgfTtcbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZXh0cmFjdERlY2lzaW9uKHJlc3BvbnNlRGF0YSk7XG4gICAgICBsb2dnZXIuZGVidWcoYFtXZWJVSS9HYXRld2F5XSBldmFsdWF0ZV9wZXJtaXNzaW9uOiAke3Rvb2xfbmFtZX0g4oaSICR7ZGVjaXNpb259ICgke2VsYXBzZWRNc31tcylgKTtcblxuICAgICAgLy8gVHJhY2sgZGVjaXNpb24gZm9yIGxpdmUgZGFzaGJvYXJkIGZlZWRcbiAgICAgIGRlY2lzaW9uVHJhY2tlci50cmFja0RlY2lzaW9uKHNlc3Npb25faWQsIHRvb2xfbmFtZSwgaW5wdXQgfHwge30sIHRyYWNrZWRSZXN1bHQsIHBsYXRmb3JtKTtcblxuICAgICAgcmVzLmpzb24ocmVzcG9uc2VEYXRhKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRNcyA9IERhdGUubm93KCkgLSBzdGFydE1zO1xuICAgICAgbG9nZ2VyLmVycm9yKGBbV2ViVUkvR2F0ZXdheV0gZXZhbHVhdGVfcGVybWlzc2lvbiBlcnJvciAoJHtlbGFwc2VkTXN9bXMpOmAsIGVycik7XG4gICAgICByZXMuanNvbihmb3JtYXRQZXJtaXNzaW9uUmVzcG9uc2UoJ2FsbG93JywgcGxhdGZvcm0sIGlucHV0IHx8IHt9KSk7IC8vIGZhaWwgb3BlblxuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIEdFVCAvYXBpL3Blcm1pc3Npb25zL3N0YXR1c1xuICAgKiBSZXR1cm5zIGN1cnJlbnQgcGVybWlzc2lvbiBwb2xpY2llcyBhbmQgcmVjZW50IGRlY2lzaW9uc1xuICAgKiBmb3IgdGhlIGxpdmUgcGVybWlzc2lvbnMgZGFzaGJvYXJkLlxuICAgKi9cbiAgcm91dGVyLmdldCgnL3Blcm1pc3Npb25zL3N0YXR1cycsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZWxmSGVhbExhdGVzdFBlcm1pc3Npb25Qb3J0RmlsZShyZXEuc29ja2V0LmxvY2FsUG9ydCk7XG5cbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IHR5cGVvZiByZXEucXVlcnlbJ3Nlc3Npb25JZCddID09PSAnc3RyaW5nJyAmJiByZXEucXVlcnlbJ3Nlc3Npb25JZCddXG4gICAgICAgID8gcmVxLnF1ZXJ5WydzZXNzaW9uSWQnXVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3Qgb3BSZXN1bHQgPSBhc1NpbmdsZVJlc3VsdChhd2FpdCBoYW5kbGVyLmhhbmRsZVJlYWQoe1xuICAgICAgICBvcGVyYXRpb246ICdnZXRfZWZmZWN0aXZlX2NsaV9wb2xpY2llcycsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHJlcG9ydGluZ19zY29wZTogJ2Rhc2hib2FyZCcsXG4gICAgICAgICAgLi4uKHNlc3Npb25JZCA/IHsgc2Vzc2lvbl9pZDogc2Vzc2lvbklkIH0gOiB7fSksXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmICghb3BSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiBvcFJlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIGdldCBwb2xpY2llcycgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YSA9IG9wUmVzdWx0LmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCBhdXRob3JpdHlTdGF0ZSA9IGF3YWl0IHJlYWRQZXJtaXNzaW9uQXV0aG9yaXR5U3RhdGUoYXV0aG9yaXR5SG9tZURpcik7XG4gICAgICBjb25zdCBpbnN0YWxsZWRBdXRob3JpdHlIb3N0cyA9IGF3YWl0IHJlc29sdmVJbnN0YWxsZWRQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdHMoXG4gICAgICAgIGF1dGhvcml0eUhvbWVEaXIsXG4gICAgICAgIGF1dGhvcml0eVN0YXRlLFxuICAgICAgICBhdXRvUmVwYWlySG9va0Fzc2V0cyxcbiAgICAgICk7XG4gICAgICBjb25zdCBob29rSG9zdCA9IHR5cGVvZiBkYXRhLmhvb2tIb3N0ID09PSAnc3RyaW5nJyA/IGRhdGEuaG9va0hvc3QgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBob29rU3RhdHVzID0gaG9va0hvc3RcbiAgICAgICAgPyBhd2FpdCByZWNvbmNpbGVQZXJtaXNzaW9uSG9va1N0YXR1cyhob29rSG9zdCwgeyBob21lRGlyOiBhdXRob3JpdHlIb21lRGlyLCBhdXRvUmVwYWlyOiBhdXRvUmVwYWlySG9va0Fzc2V0cyB9KVxuICAgICAgICA6IGF3YWl0IGdldFBlcm1pc3Npb25Ib29rU3RhdHVzQXN5bmMoYXV0aG9yaXR5SG9tZURpcik7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IG5vcm1hbGl6ZVBvbGljeUVsZW1lbnRzKChkYXRhLmVsZW1lbnRzIHx8IFtdKSBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pO1xuXG4gICAgICBjb25zdCBkZW55UGF0dGVybnMgPSAoZGF0YS5jb21iaW5lZERlbnlQYXR0ZXJucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBhbGxvd1BhdHRlcm5zID0gKGRhdGEuY29tYmluZWRBbGxvd1BhdHRlcm5zIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKSA/PyBbXTtcbiAgICAgIGNvbnN0IGNvbmZpcm1QYXR0ZXJucyA9IChkYXRhLmNvbWJpbmVkQ29uZmlybVBhdHRlcm5zIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKSA/PyBbXTtcbiAgICAgIGNvbnN0IGRlbnlPcGVyYXRpb25zID0gKGRhdGEuY29tYmluZWREZW55T3BlcmF0aW9ucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBhbGxvd09wZXJhdGlvbnMgPSAoZGF0YS5jb21iaW5lZEFsbG93T3BlcmF0aW9ucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBjb25maXJtT3BlcmF0aW9ucyA9IChkYXRhLmNvbWJpbmVkQ29uZmlybU9wZXJhdGlvbnMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpID8/IFtdO1xuXG4gICAgICBjb25zdCBob29rU3RhcnR1cFJlcGFpciA9IGdldExhc3RQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5KCk7XG4gICAgICBjb25zdCBob29rSGVhbHRoSG9zdCA9IGhvb2tTdGF0dXMuaG9zdCA/PyBob29rSG9zdCA/PyAnbWFuYWdlZC1ob3N0JztcbiAgICAgIGNvbnN0IGhvb2tIZWFsdGggPSBzdW1tYXJpemVQZXJtaXNzaW9uSG9va0hlYWx0aCh7XG4gICAgICAgIGluc3RhbGxlZEhvc3RzOiBob29rU3RhdHVzLmluc3RhbGxlZCB8fCBob29rU3RhdHVzLmFzc2V0c1ByZXBhcmVkID8gW2hvb2tIZWFsdGhIb3N0XSA6IFtdLFxuICAgICAgICBjdXJyZW50SG9zdHM6IGhvb2tTdGF0dXMuYXNzZXRzQ3VycmVudCA/IFtob29rSGVhbHRoSG9zdF0gOiBbXSxcbiAgICAgICAgcmVwYWlyZWRIb3N0czogaG9va1N0YXR1cy5hdXRvUmVwYWlyZWQgPyBbaG9va0hlYWx0aEhvc3RdIDogW10sXG4gICAgICAgIG5lZWRzUmVwYWlySG9zdHM6IGhvb2tTdGF0dXMubmVlZHNSZXBhaXIgPyBbaG9va0hlYWx0aEhvc3RdIDogW10sXG4gICAgICAgIGxhc3RTdGFydHVwUmVwYWlyOiBob29rU3RhcnR1cFJlcGFpcixcbiAgICAgIH0pO1xuXG4gICAgICByZXMuanNvbih7XG4gICAgICAgIC4uLihzZXNzaW9uSWQgPyB7IHNlc3Npb25JZCB9IDoge30pLFxuICAgICAgICBhY3RpdmVFbGVtZW50Q291bnQ6IGRhdGEuYWN0aXZlRWxlbWVudENvdW50LFxuICAgICAgICBoYXNBbGxvd2xpc3Q6IGRhdGEuaGFzQWxsb3dsaXN0LFxuICAgICAgICBkZW55UGF0dGVybnMsXG4gICAgICAgIGFsbG93UGF0dGVybnMsXG4gICAgICAgIGNvbmZpcm1QYXR0ZXJucyxcbiAgICAgICAgZGVueU9wZXJhdGlvbnMsXG4gICAgICAgIGFsbG93T3BlcmF0aW9ucyxcbiAgICAgICAgY29uZmlybU9wZXJhdGlvbnMsXG4gICAgICAgIGRlbnlSdWxlczogbWVyZ2VSdWxlQXJyYXlzKGRlbnlQYXR0ZXJucywgZGVueU9wZXJhdGlvbnMpLFxuICAgICAgICBhbGxvd1J1bGVzOiBtZXJnZVJ1bGVBcnJheXMoYWxsb3dQYXR0ZXJucywgYWxsb3dPcGVyYXRpb25zKSxcbiAgICAgICAgY29uZmlybVJ1bGVzOiBtZXJnZVJ1bGVBcnJheXMoY29uZmlybVBhdHRlcm5zLCBjb25maXJtT3BlcmF0aW9ucyksXG4gICAgICAgIGVsZW1lbnRzLFxuICAgICAgICBrbm93blNlc3Npb25zOiBleHRyYWN0S25vd25Qb2xpY3lTZXNzaW9ucyhlbGVtZW50cyksXG4gICAgICAgIHBlcm1pc3Npb25Qcm9tcHRBY3RpdmU6IGRhdGEucGVybWlzc2lvblByb21wdEFjdGl2ZSxcbiAgICAgICAgaG9va0luc3RhbGxlZDogaG9va1N0YXR1cy5pbnN0YWxsZWQsXG4gICAgICAgIGhvb2tIb3N0OiBkYXRhLmhvb2tIb3N0LFxuICAgICAgICBob29rQXNzZXRzUHJlcGFyZWQ6IGhvb2tTdGF0dXMuYXNzZXRzUHJlcGFyZWQsXG4gICAgICAgIGhvb2tBc3NldHNDdXJyZW50OiBob29rU3RhdHVzLmFzc2V0c0N1cnJlbnQsXG4gICAgICAgIGhvb2tBdXRvUmVwYWlyZWQ6IGhvb2tTdGF0dXMuYXV0b1JlcGFpcmVkLFxuICAgICAgICBob29rTmVlZHNSZXBhaXI6IGhvb2tTdGF0dXMubmVlZHNSZXBhaXIsXG4gICAgICAgIGhvb2tSZXBhaXJFcnJvcjogaG9va1N0YXR1cy5yZXBhaXJFcnJvcixcbiAgICAgICAgaG9va0hlYWx0aCxcbiAgICAgICAgaG9va1N0YXJ0dXBSZXBhaXIsXG4gICAgICAgIGF1dGhvcml0eTogYXV0aG9yaXR5U3RhdGUsXG4gICAgICAgIGF1dGhvcml0eVN1cHBvcnRlZEhvc3RzOiBpbnN0YWxsZWRBdXRob3JpdHlIb3N0cyxcbiAgICAgICAgYXV0aG9yaXR5U3VwcG9ydGVkTW9kZXM6IFsuLi5QRVJNSVNTSU9OX0FVVEhPUklUWV9NT0RFU10sXG4gICAgICAgIGF1dGhvcml0eUFpTXV0YWJsZTogZmFsc2UsXG4gICAgICAgIGVuZm9yY2VtZW50UmVhZHk6IGRhdGEuZW5mb3JjZW1lbnRSZWFkeSxcbiAgICAgICAgaW52YWxpZFBvbGljeUVsZW1lbnRDb3VudDogZGF0YS5pbnZhbGlkUG9saWN5RWxlbWVudENvdW50ID8/IDAsXG4gICAgICAgIGFkdmlzb3J5OiBkYXRhLmFkdmlzb3J5LFxuICAgICAgICByZWNlbnREZWNpc2lvbnM6IGRlY2lzaW9uVHJhY2tlci5nZXRSZWNlbnREZWNpc2lvbnMoKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdbV2ViVUkvR2F0ZXdheV0gcGVybWlzc2lvbnMvc3RhdHVzIGVycm9yOicsIGVycik7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiAnRmFpbGVkIHRvIGdldCBwZXJtaXNzaW9uIHN0YXR1cycgfSk7XG4gICAgfVxuICB9KTtcblxuICByb3V0ZXIuZ2V0KCcvcGVybWlzc2lvbnMvYXV0aG9yaXR5JywgYXN5bmMgKF9yZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBhdXRob3JpdHlTdGF0ZSA9IGF3YWl0IHJlYWRQZXJtaXNzaW9uQXV0aG9yaXR5U3RhdGUoYXV0aG9yaXR5SG9tZURpcik7XG4gICAgICBjb25zdCBpbnN0YWxsZWRBdXRob3JpdHlIb3N0cyA9IGF3YWl0IHJlc29sdmVJbnN0YWxsZWRQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdHMoXG4gICAgICAgIGF1dGhvcml0eUhvbWVEaXIsXG4gICAgICAgIGF1dGhvcml0eVN0YXRlLFxuICAgICAgICBhdXRvUmVwYWlySG9va0Fzc2V0cyxcbiAgICAgICk7XG4gICAgICByZXMuanNvbih7XG4gICAgICAgIC4uLmF1dGhvcml0eVN0YXRlLFxuICAgICAgICBzdXBwb3J0ZWRIb3N0czogaW5zdGFsbGVkQXV0aG9yaXR5SG9zdHMsXG4gICAgICAgIHN1cHBvcnRlZE1vZGVzOiBbLi4uUEVSTUlTU0lPTl9BVVRIT1JJVFlfTU9ERVNdLFxuICAgICAgICBhaU11dGFibGU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1tXZWJVSS9HYXRld2F5XSBwZXJtaXNzaW9ucy9hdXRob3JpdHkgZXJyb3I6JywgZXJyKTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHsgZXJyb3I6ICdGYWlsZWQgdG8gZ2V0IHBlcm1pc3Npb24gYXV0aG9yaXR5JyB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJvdXRlci5wb3N0KCcvcGVybWlzc2lvbnMvYXV0aG9yaXR5JywgZXhwcmVzcy5qc29uKCksIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBob3N0ID0gbm9ybWFsaXplQXV0aG9yaXR5SG9zdChyZXEuYm9keT8uaG9zdCk7XG4gICAgICBjb25zdCBtb2RlID0gbm9ybWFsaXplQXV0aG9yaXR5TW9kZShyZXEuYm9keT8ubW9kZSk7XG4gICAgICBjb25zdCByZWFzb24gPSB0eXBlb2YgcmVxLmJvZHk/LnJlYXNvbiA9PT0gJ3N0cmluZycgJiYgcmVxLmJvZHkucmVhc29uLnRyaW0oKSAhPT0gJydcbiAgICAgICAgPyByZXEuYm9keS5yZWFzb24udHJpbSgpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBpZiAoIWhvc3QgfHwgIW1vZGUpIHtcbiAgICAgICAgcmVzLnN0YXR1cyg0MDApLmpzb24oe1xuICAgICAgICAgIGVycm9yOiAnaG9zdCBhbmQgbW9kZSBhcmUgcmVxdWlyZWQnLFxuICAgICAgICAgIHN1cHBvcnRlZEhvc3RzOiBbLi4uUEVSTUlTU0lPTl9BVVRIT1JJVFlfSE9TVFNdLFxuICAgICAgICAgIHN1cHBvcnRlZE1vZGVzOiBbLi4uUEVSTUlTU0lPTl9BVVRIT1JJVFlfTU9ERVNdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgcG9saWNpZXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKG1vZGUgPT09ICdhdXRob3JpdGF0aXZlJykge1xuICAgICAgICBjb25zdCBwb2xpY3lSZXN1bHQgPSBhc1NpbmdsZVJlc3VsdChhd2FpdCBoYW5kbGVyLmhhbmRsZVJlYWQoe1xuICAgICAgICAgIG9wZXJhdGlvbjogJ2dldF9lZmZlY3RpdmVfY2xpX3BvbGljaWVzJyxcbiAgICAgICAgICBwYXJhbXM6IHsgcmVwb3J0aW5nX3Njb3BlOiAnZGFzaGJvYXJkJyB9LFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgaWYgKCFwb2xpY3lSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHsgZXJyb3I6IHBvbGljeVJlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIGZldGNoIGVmZmVjdGl2ZSBwb2xpY2llcycgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcG9saWNpZXMgPSBwb2xpY3lSZXN1bHQuZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYXV0aG9yaXR5U3RhdGUgPSBhd2FpdCBzZXRQZXJtaXNzaW9uQXV0aG9yaXR5TW9kZSh7XG4gICAgICAgIGhvc3QsXG4gICAgICAgIG1vZGUsXG4gICAgICAgIHJlYXNvbixcbiAgICAgICAgaG9tZURpcjogYXV0aG9yaXR5SG9tZURpcixcbiAgICAgICAgcG9saWNpZXM6IG1vZGUgPT09ICdhdXRob3JpdGF0aXZlJ1xuICAgICAgICAgID8ge1xuICAgICAgICAgICAgY29tYmluZWRBbGxvd1BhdHRlcm5zOiBhc1N0cmluZ0FycmF5KHBvbGljaWVzPy5jb21iaW5lZEFsbG93UGF0dGVybnMpLFxuICAgICAgICAgICAgY29tYmluZWRDb25maXJtUGF0dGVybnM6IGFzU3RyaW5nQXJyYXkocG9saWNpZXM/LmNvbWJpbmVkQ29uZmlybVBhdHRlcm5zKSxcbiAgICAgICAgICAgIGNvbWJpbmVkRGVueVBhdHRlcm5zOiBhc1N0cmluZ0FycmF5KHBvbGljaWVzPy5jb21iaW5lZERlbnlQYXR0ZXJucyksXG4gICAgICAgICAgfVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG5cbiAgICAgIHJlcy5qc29uKHsgc3VjY2VzczogdHJ1ZSwgYXV0aG9yaXR5OiBhdXRob3JpdHlTdGF0ZSB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgYFtXZWJVSS9HYXRld2F5XSBwZXJtaXNzaW9ucy9hdXRob3JpdHkgdXBkYXRlIGVycm9yIChob3N0PSR7U3RyaW5nKHJlcS5ib2R5Py5ob3N0ID8/ICcnKX0sIG1vZGU9JHtTdHJpbmcocmVxLmJvZHk/Lm1vZGUgPz8gJycpfSk6YCxcbiAgICAgICAgZXJyLFxuICAgICAgKTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtcbiAgICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiAnRmFpbGVkIHRvIHVwZGF0ZSBwZXJtaXNzaW9uIGF1dGhvcml0eScsXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVBdXRob3JpdHlIb3N0KHZhbHVlOiB1bmtub3duKTogUGVybWlzc2lvbkF1dGhvcml0eUhvc3QgfCBudWxsIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgUEVSTUlTU0lPTl9BVVRIT1JJVFlfSE9TVFMuaW5jbHVkZXModmFsdWUgYXMgUGVybWlzc2lvbkF1dGhvcml0eUhvc3QpXG4gICAgPyB2YWx1ZSBhcyBQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdFxuICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQXV0aG9yaXR5TW9kZSh2YWx1ZTogdW5rbm93bik6IFBlcm1pc3Npb25BdXRob3JpdHlNb2RlIHwgbnVsbCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIFBFUk1JU1NJT05fQVVUSE9SSVRZX01PREVTLmluY2x1ZGVzKHZhbHVlIGFzIFBlcm1pc3Npb25BdXRob3JpdHlNb2RlKVxuICAgID8gdmFsdWUgYXMgUGVybWlzc2lvbkF1dGhvcml0eU1vZGVcbiAgICA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGFzU3RyaW5nQXJyYXkodmFsdWU6IHVua25vd24pOiBzdHJpbmdbXSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLmZpbHRlcigoZW50cnkpOiBlbnRyeSBpcyBzdHJpbmcgPT4gdHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJykgOiBbXTtcbn1cbiJdfQ==
|
|
457
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvblJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93ZWIvcm91dGVzL3Blcm1pc3Npb25Sb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sT0FBbUIsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDeEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUNMLHlDQUF5QyxFQUN6QyxnQ0FBZ0MsRUFDaEMsNEJBQTRCLEVBQzVCLGdDQUFnQyxFQUNoQyw2QkFBNkIsRUFDN0IsNkJBQTZCLEdBQzlCLE1BQU0sZ0NBQWdDLENBQUM7QUFFeEMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDbkYsT0FBTyxFQUdMLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsNEJBQTRCLEVBQzVCLDBCQUEwQixHQUMzQixNQUFNLG9DQUFvQyxDQUFDO0FBeUQ1QyxNQUFNLG9DQUFvQyxHQUFHLEdBQUcsQ0FBQztBQUNqRCxNQUFNLHFDQUFxQyxHQUFHLE1BQU0sQ0FBQztBQUNyRCxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztBQWFqQyxNQUFNLGdDQUFnQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDNUUsTUFBTSxpQ0FBaUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUc1RSwwRUFBMEU7QUFDMUUsU0FBUyxhQUFhLENBQUMsR0FBNEIsRUFB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QyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3pHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBlcm1pc3Npb24gZXZhbHVhdGlvbiBIVFRQIHJvdXRlcyBhbmQgZGVjaXNpb24gdHJhY2tpbmcuXG4gKlxuICogUHJvdmlkZXM6XG4gKiAtIFBPU1QgL2V2YWx1YXRlX3Blcm1pc3Npb24g4oCUIGV2YWx1YXRlcyB0b29sIHBlcm1pc3Npb25zIHZpYSBNQ1AtQVFMXG4gKiAtIEdFVCAvcGVybWlzc2lvbnMvc3RhdHVzIOKAlCByZXR1cm5zIGN1cnJlbnQgcG9saWNpZXMgYW5kIHJlY2VudCBkZWNpc2lvbnNcbiAqIC0gRGVjaXNpb24gdHJhY2tpbmcgcmluZyBidWZmZXIgZm9yIHRoZSBsaXZlIGRhc2hib2FyZCBmZWVkXG4gKi9cblxuaW1wb3J0IGV4cHJlc3MsIHsgUm91dGVyIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBNQ1BBUUxIYW5kbGVyIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9NQ1BBUUxIYW5kbGVyLmpzJztcbmltcG9ydCB7IGZvcm1hdFBlcm1pc3Npb25SZXNwb25zZSB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvZXZhbHVhdGVQZXJtaXNzaW9uLmpzJztcbmltcG9ydCB7IGVuc3VyZUxhdGVzdFBvcnRGaWxlIH0gZnJvbSAnLi4vcG9ydERpc2NvdmVyeS5qcyc7XG5pbXBvcnQge1xuICBnZXRMYXN0UGVybWlzc2lvbkhvb2tTdGFydHVwUmVwYWlyU3VtbWFyeSxcbiAgZ2V0UGVybWlzc2lvbkhvb2tEaWFnbm9zdGljc1BhdGgsXG4gIGdldFBlcm1pc3Npb25Ib29rU3RhdHVzQXN5bmMsXG4gIHJlYWRMYXN0UGVybWlzc2lvbkhvb2tEaWFnbm9zdGljLFxuICByZWNvbmNpbGVQZXJtaXNzaW9uSG9va1N0YXR1cyxcbiAgc3VtbWFyaXplUGVybWlzc2lvbkhvb2tIZWFsdGgsXG59IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25Ib29rcy5qcyc7XG5cbmltcG9ydCB7IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlciB9IGZyb20gJy4uLy4uL3V0aWxzL1NsaWRpbmdXaW5kb3dSYXRlTGltaXRlci5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFBlcm1pc3Npb25BdXRob3JpdHlIb3N0LFxuICB0eXBlIFBlcm1pc3Npb25BdXRob3JpdHlNb2RlLFxuICBQRVJNSVNTSU9OX0FVVEhPUklUWV9IT1NUUyxcbiAgUEVSTUlTU0lPTl9BVVRIT1JJVFlfTU9ERVMsXG4gIHJlYWRQZXJtaXNzaW9uQXV0aG9yaXR5U3RhdGUsXG4gIHNldFBlcm1pc3Npb25BdXRob3JpdHlNb2RlLFxufSBmcm9tICcuLi8uLi91dGlscy9wZXJtaXNzaW9uQXV0aG9yaXR5LmpzJztcblxuLy8g4pSA4pSAIFBlcm1pc3Npb24gRGVjaXNpb24gVHJhY2tpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBSaW5nIGJ1ZmZlciBvZiByZWNlbnQgcGVybWlzc2lvbiBkZWNpc2lvbnMgZm9yIHRoZSBsaXZlIGRhc2hib2FyZCBmZWVkLlxuXG5pbnRlcmZhY2UgUGVybWlzc2lvbkRlY2lzaW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG4gIHNlc3Npb25faWQ/OiBzdHJpbmc7XG4gIHRvb2xfbmFtZTogc3RyaW5nO1xuICBjb21tYW5kPzogc3RyaW5nO1xuICBkZWNpc2lvbjogc3RyaW5nO1xuICByZWFzb24/OiBzdHJpbmc7XG4gIHBsYXRmb3JtPzogc3RyaW5nO1xuICB0YXJnZXQ/OiBzdHJpbmc7XG4gIHRhcmdldExhYmVsPzogc3RyaW5nO1xuICBkZXRhaWxzPzogUGVybWlzc2lvbkRlY2lzaW9uRGV0YWlsW107XG59XG5cbmludGVyZmFjZSBQZXJtaXNzaW9uRGVjaXNpb25EZXRhaWwge1xuICBsYWJlbDogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nO1xuICBtb25vc3BhY2U/OiBib29sZWFuO1xufVxuXG50eXBlIFBlcm1pc3Npb25EZWNpc2lvblRhcmdldEtleSA9XG4gIHwgJ2ZpbGVfcGF0aCdcbiAgfCAncGF0aCdcbiAgfCAndXJsJ1xuICB8ICdwYXR0ZXJuJ1xuICB8ICdxdWVyeSdcbiAgfCAnZWxlbWVudF9uYW1lJ1xuICB8ICdyZXF1ZXN0X2lkJztcblxuaW50ZXJmYWNlIFBlcm1pc3Npb25EZWNpc2lvbklucHV0IGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBjb21tYW5kPzogc3RyaW5nO1xuICBmaWxlX3BhdGg/OiBzdHJpbmc7XG4gIHBhdGg/OiBzdHJpbmc7XG4gIHVybD86IHN0cmluZztcbiAgcGF0dGVybj86IHN0cmluZztcbiAgcXVlcnk/OiBzdHJpbmc7XG4gIGVsZW1lbnRfbmFtZT86IHN0cmluZztcbiAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIFBlcm1pc3Npb25EZWNpc2lvblRhcmdldERlc2NyaXB0b3Ige1xuICBrZXk6IFBlcm1pc3Npb25EZWNpc2lvblRhcmdldEtleTtcbiAgbGFiZWw6IHN0cmluZztcbiAgbW9ub3NwYWNlPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEtub3duUG9saWN5U2Vzc2lvbiB7XG4gIHNlc3Npb25JZDogc3RyaW5nO1xuICBkaXNwbGF5TmFtZTogc3RyaW5nO1xuICBzb3VyY2U6ICdwb2xpY3knO1xufVxuXG5jb25zdCBQRVJNSVNTSU9OX1JPVVRFX1JBVEVfTElNSVRfUkVRVUVTVFMgPSAxMjA7XG5jb25zdCBQRVJNSVNTSU9OX1JPVVRFX1JBVEVfTElNSVRfV0lORE9XX01TID0gNjBfMDAwO1xuY29uc3QgREVDSVNJT05fQlVGRkVSX1NJWkUgPSAyMDA7XG5cbmludGVyZmFjZSBQZXJtaXNzaW9uRGVjaXNpb25UcmFja2VyIHtcbiAgdHJhY2tEZWNpc2lvbihcbiAgICBzZXNzaW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICB0b29sTmFtZTogc3RyaW5nLFxuICAgIGlucHV0OiBQZXJtaXNzaW9uRGVjaXNpb25JbnB1dCxcbiAgICByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHBsYXRmb3JtOiBzdHJpbmcsXG4gICk6IHZvaWQ7XG4gIGdldFJlY2VudERlY2lzaW9ucygpOiBQZXJtaXNzaW9uRGVjaXNpb25bXTtcbn1cblxuY29uc3QgQ0xBVURFX0NPTVBBVElCTEVfSE9PS19QTEFURk9STVMgPSBuZXcgU2V0KFsnY2xhdWRlX2NvZGUnLCAndnNjb2RlJ10pO1xuY29uc3QgTk9STUFMSVpBQkxFX1BFUk1JU1NJT05fREVDSVNJT05TID0gbmV3IFNldChbJ2FsbG93JywgJ2RlbnknLCAnYXNrJ10pO1xudHlwZSBOb3JtYWxpemFibGVQZXJtaXNzaW9uRGVjaXNpb24gPSAnYWxsb3cnIHwgJ2RlbnknIHwgJ2Fzayc7XG5cbi8qKiBFeHRyYWN0IGEgc3RyaW5nIGZpZWxkIGZyb20gYSByZWNvcmQsIHRyeWluZyBtdWx0aXBsZSBrZXlzIGluIG9yZGVyICovXG5mdW5jdGlvbiBleHRyYWN0U3RyaW5nKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGtleXM6IHN0cmluZ1tdLCBmYWxsYmFjazogc3RyaW5nKTogc3RyaW5nIHtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgIGNvbnN0IHZhbCA9IG9iaj8uW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSByZXR1cm4gdmFsO1xuICB9XG4gIHJldHVybiBmYWxsYmFjaztcbn1cblxuZnVuY3Rpb24gZXh0cmFjdERlY2lzaW9uKHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcge1xuICBjb25zdCBuZXN0ZWQgPSByZXN1bHQuaG9va1NwZWNpZmljT3V0cHV0O1xuICBpZiAobmVzdGVkICYmIHR5cGVvZiBuZXN0ZWQgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KG5lc3RlZCkpIHtcbiAgICBjb25zdCBuZXN0ZWREZWNpc2lvbiA9IChuZXN0ZWQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLnBlcm1pc3Npb25EZWNpc2lvbjtcbiAgICBpZiAodHlwZW9mIG5lc3RlZERlY2lzaW9uID09PSAnc3RyaW5nJykgcmV0dXJuIG5lc3RlZERlY2lzaW9uO1xuICB9XG5cbiAgaWYgKHR5cGVvZiByZXN1bHQucGVybWlzc2lvbiA9PT0gJ3N0cmluZycpIHJldHVybiByZXN1bHQucGVybWlzc2lvbjtcbiAgaWYgKHR5cGVvZiByZXN1bHQuZGVjaXNpb24gPT09ICdzdHJpbmcnKSByZXR1cm4gcmVzdWx0LmRlY2lzaW9uO1xuICBpZiAodHlwZW9mIHJlc3VsdC5iZWhhdmlvciA9PT0gJ3N0cmluZycpIHJldHVybiByZXN1bHQuYmVoYXZpb3I7XG4gIGlmICh0eXBlb2YgcmVzdWx0LmFsbG93ZWQgPT09ICdib29sZWFuJykgcmV0dXJuIHJlc3VsdC5hbGxvd2VkID8gJ2FsbG93JyA6ICdkZW55JztcbiAgcmV0dXJuICd1bmtub3duJztcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFJlYXNvbihyZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogc3RyaW5nIHtcbiAgY29uc3QgbmVzdGVkID0gcmVzdWx0Lmhvb2tTcGVjaWZpY091dHB1dDtcbiAgaWYgKG5lc3RlZCAmJiB0eXBlb2YgbmVzdGVkID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShuZXN0ZWQpKSB7XG4gICAgY29uc3QgbmVzdGVkUmVhc29uID0gKG5lc3RlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikucGVybWlzc2lvbkRlY2lzaW9uUmVhc29uO1xuICAgIGlmICh0eXBlb2YgbmVzdGVkUmVhc29uID09PSAnc3RyaW5nJykgcmV0dXJuIG5lc3RlZFJlYXNvbjtcbiAgfVxuXG4gIHJldHVybiBleHRyYWN0U3RyaW5nKHJlc3VsdCwgWydyZWFzb24nLCAnbWVzc2FnZSddLCAnJyk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZE5vcm1hbGl6ZUNsYXVkZUhvb2socGxhdGZvcm06IHN0cmluZyB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGxhdGZvcm0gIT09IHVuZGVmaW5lZCAmJiBDTEFVREVfQ09NUEFUSUJMRV9IT09LX1BMQVRGT1JNUy5oYXMocGxhdGZvcm0pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVQZXJtaXNzaW9uUmVzcG9uc2VGb3JQbGF0Zm9ybShcbiAgcGxhdGZvcm06IHN0cmluZyxcbiAgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAoIXNob3VsZE5vcm1hbGl6ZUNsYXVkZUhvb2socGxhdGZvcm0pKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGNvbnN0IG5lc3RlZCA9IHJlc3VsdC5ob29rU3BlY2lmaWNPdXRwdXQ7XG4gIGlmIChuZXN0ZWQgJiYgdHlwZW9mIG5lc3RlZCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkobmVzdGVkKSkge1xuICAgIGNvbnN0IG5lc3RlZERlY2lzaW9uID0gKG5lc3RlZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikucGVybWlzc2lvbkRlY2lzaW9uO1xuICAgIGlmICh0eXBlb2YgbmVzdGVkRGVjaXNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRlY2lzaW9uID0gZXh0cmFjdERlY2lzaW9uKHJlc3VsdCk7XG4gIGlmIChOT1JNQUxJWkFCTEVfUEVSTUlTU0lPTl9ERUNJU0lPTlMuaGFzKGRlY2lzaW9uKSkge1xuICAgIHJldHVybiBmb3JtYXRQZXJtaXNzaW9uUmVzcG9uc2UoXG4gICAgICBkZWNpc2lvbiBhcyBOb3JtYWxpemFibGVQZXJtaXNzaW9uRGVjaXNpb24sXG4gICAgICBwbGF0Zm9ybSxcbiAgICAgIGlucHV0LFxuICAgICAgZXh0cmFjdFJlYXNvbihyZXN1bHQpLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCBpbnB1dCk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRGVjaXNpb25EZXRhaWxzKFxuICB0b29sTmFtZTogc3RyaW5nLFxuICBpbnB1dDogUGVybWlzc2lvbkRlY2lzaW9uSW5wdXQsXG4gIHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBsYXRmb3JtOiBzdHJpbmcsXG4pOiB7IHRhcmdldD86IHN0cmluZzsgdGFyZ2V0TGFiZWw/OiBzdHJpbmc7IGRldGFpbHM6IFBlcm1pc3Npb25EZWNpc2lvbkRldGFpbFtdIH0ge1xuICBjb25zdCBkZXRhaWxzOiBQZXJtaXNzaW9uRGVjaXNpb25EZXRhaWxbXSA9IFtdO1xuXG4gIGlmIChwbGF0Zm9ybSkge1xuICAgIGRldGFpbHMucHVzaCh7IGxhYmVsOiAnUGxhdGZvcm0nLCB2YWx1ZTogcGxhdGZvcm0sIG1vbm9zcGFjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGlmICh0b29sTmFtZSA9PT0gJ0Jhc2gnICYmIHR5cGVvZiBpbnB1dC5jb21tYW5kID09PSAnc3RyaW5nJyAmJiBpbnB1dC5jb21tYW5kICE9PSAnJykge1xuICAgIGRldGFpbHMucHVzaCh7IGxhYmVsOiAnQ29tbWFuZCcsIHZhbHVlOiBpbnB1dC5jb21tYW5kLCBtb25vc3BhY2U6IHRydWUgfSk7XG4gIH1cblxuICBjb25zdCB0YXJnZXREZXNjcmlwdG9yczogUGVybWlzc2lvbkRlY2lzaW9uVGFyZ2V0RGVzY3JpcHRvcltdID0gW1xuICAgIHsga2V5OiAnZmlsZV9wYXRoJywgbGFiZWw6ICdGaWxlJywgbW9ub3NwYWNlOiB0cnVlIH0sXG4gICAgeyBrZXk6ICdwYXRoJywgbGFiZWw6ICdQYXRoJywgbW9ub3NwYWNlOiB0cnVlIH0sXG4gICAgeyBrZXk6ICd1cmwnLCBsYWJlbDogJ1VSTCcgfSxcbiAgICB7IGtleTogJ3BhdHRlcm4nLCBsYWJlbDogJ1BhdHRlcm4nLCBtb25vc3BhY2U6IHRydWUgfSxcbiAgICB7IGtleTogJ3F1ZXJ5JywgbGFiZWw6ICdRdWVyeScgfSxcbiAgICB7IGtleTogJ2VsZW1lbnRfbmFtZScsIGxhYmVsOiAnRWxlbWVudCcsIG1vbm9zcGFjZTogdHJ1ZSB9LFxuICAgIHsga2V5OiAncmVxdWVzdF9pZCcsIGxhYmVsOiAnUmVxdWVzdCcsIG1vbm9zcGFjZTogdHJ1ZSB9LFxuICBdO1xuXG4gIGxldCB0YXJnZXQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHRhcmdldExhYmVsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBkZXNjcmlwdG9yIG9mIHRhcmdldERlc2NyaXB0b3JzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBpbnB1dFtkZXNjcmlwdG9yLmtleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycgfHwgdmFsdWUgPT09ICcnKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0YXJnZXQgPSB2YWx1ZTtcbiAgICB0YXJnZXRMYWJlbCA9IGRlc2NyaXB0b3IubGFiZWw7XG4gICAgZGV0YWlscy5wdXNoKHsgbGFiZWw6IGRlc2NyaXB0b3IubGFiZWwsIHZhbHVlLCBtb25vc3BhY2U6IGRlc2NyaXB0b3IubW9ub3NwYWNlIH0pO1xuICAgIGJyZWFrO1xuICB9XG5cbiAgY29uc3QgbWF0Y2hlZFBhdHRlcm4gPSBleHRyYWN0U3RyaW5nKHJlc3VsdCwgWydtYXRjaGVkX3BhdHRlcm4nLCAnbWF0Y2hlZFBhdHRlcm4nXSwgJycpO1xuICBpZiAobWF0Y2hlZFBhdHRlcm4gIT09ICcnKSB7XG4gICAgZGV0YWlscy5wdXNoKHsgbGFiZWw6ICdNYXRjaGVkIFBhdHRlcm4nLCB2YWx1ZTogbWF0Y2hlZFBhdHRlcm4sIG1vbm9zcGFjZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIGNvbnN0IHBvbGljeVNvdXJjZSA9IGV4dHJhY3RTdHJpbmcocmVzdWx0LCBbJ3BvbGljeV9zb3VyY2UnLCAncG9saWN5U291cmNlJ10sICcnKTtcbiAgaWYgKHBvbGljeVNvdXJjZSAhPT0gJycpIHtcbiAgICBkZXRhaWxzLnB1c2goeyBsYWJlbDogJ1BvbGljeSBTb3VyY2UnLCB2YWx1ZTogcG9saWN5U291cmNlLCBtb25vc3BhY2U6IHRydWUgfSk7XG4gIH1cblxuICByZXR1cm4geyB0YXJnZXQsIHRhcmdldExhYmVsLCBkZXRhaWxzIH07XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVBlcm1pc3Npb25EZWNpc2lvblRyYWNrZXIoYnVmZmVyU2l6ZSA9IERFQ0lTSU9OX0JVRkZFUl9TSVpFKTogUGVybWlzc2lvbkRlY2lzaW9uVHJhY2tlciB7XG4gIGNvbnN0IHJlY2VudERlY2lzaW9uczogUGVybWlzc2lvbkRlY2lzaW9uW10gPSBbXTtcbiAgbGV0IGRlY2lzaW9uQ291bnRlciA9IDA7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFja0RlY2lzaW9uKFxuICAgICAgc2Vzc2lvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICB0b29sTmFtZTogc3RyaW5nLFxuICAgICAgaW5wdXQ6IFBlcm1pc3Npb25EZWNpc2lvbklucHV0LFxuICAgICAgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAgIHBsYXRmb3JtOiBzdHJpbmcsXG4gICAgKTogdm9pZCB7XG4gICAgICBjb25zdCBkZXRhaWxTdGF0ZSA9IGJ1aWxkRGVjaXNpb25EZXRhaWxzKHRvb2xOYW1lLCBpbnB1dCwgcmVzdWx0LCBwbGF0Zm9ybSk7XG4gICAgICBjb25zdCBlbnRyeTogUGVybWlzc2lvbkRlY2lzaW9uID0ge1xuICAgICAgICBpZDogYGQtJHsrK2RlY2lzaW9uQ291bnRlcn1gLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgLi4uKHNlc3Npb25JZCA/IHsgc2Vzc2lvbl9pZDogc2Vzc2lvbklkIH0gOiB7fSksXG4gICAgICAgIHRvb2xfbmFtZTogdG9vbE5hbWUsXG4gICAgICAgIGNvbW1hbmQ6IHRvb2xOYW1lID09PSAnQmFzaCcgJiYgdHlwZW9mIGlucHV0Py5jb21tYW5kID09PSAnc3RyaW5nJyA/IGlucHV0LmNvbW1hbmQgOiB1bmRlZmluZWQsXG4gICAgICAgIGRlY2lzaW9uOiBleHRyYWN0RGVjaXNpb24ocmVzdWx0KSxcbiAgICAgICAgcmVhc29uOiBleHRyYWN0UmVhc29uKHJlc3VsdCksXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgICB0YXJnZXQ6IGRldGFpbFN0YXRlLnRhcmdldCxcbiAgICAgICAgdGFyZ2V0TGFiZWw6IGRldGFpbFN0YXRlLnRhcmdldExhYmVsLFxuICAgICAgICBkZXRhaWxzOiBkZXRhaWxTdGF0ZS5kZXRhaWxzLFxuICAgICAgfTtcbiAgICAgIHJlY2VudERlY2lzaW9ucy51bnNoaWZ0KGVudHJ5KTtcbiAgICAgIGlmIChyZWNlbnREZWNpc2lvbnMubGVuZ3RoID4gYnVmZmVyU2l6ZSkge1xuICAgICAgICByZWNlbnREZWNpc2lvbnMubGVuZ3RoID0gYnVmZmVyU2l6ZTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGdldFJlY2VudERlY2lzaW9ucygpOiBQZXJtaXNzaW9uRGVjaXNpb25bXSB7XG4gICAgICByZXR1cm4gcmVjZW50RGVjaXNpb25zO1xuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIG1lcmdlUnVsZUFycmF5cyguLi5zb3VyY2VzOiB1bmtub3duW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IG1lcmdlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHNvdXJjZSBvZiBzb3VyY2VzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNvdXJjZSkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc291cmNlKSB7XG4gICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSAnc3RyaW5nJyAmJiBlbnRyeSAhPT0gJycpIHtcbiAgICAgICAgbWVyZ2VkLmFkZChlbnRyeSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBBcnJheS5mcm9tKG1lcmdlZCk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBvbGljeUVsZW1lbnRzKGVsZW1lbnRzOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICByZXR1cm4gZWxlbWVudHMubWFwKChlbGVtZW50KSA9PiAoe1xuICAgIC4uLmVsZW1lbnQsXG4gICAgZWxlbWVudF9uYW1lOiByZXNvbHZlRWxlbWVudE5hbWUoZWxlbWVudCksXG4gICAgYWxsb3dSdWxlczogbWVyZ2VSdWxlQXJyYXlzKGVsZW1lbnQuYWxsb3dQYXR0ZXJucywgZWxlbWVudC5hbGxvd09wZXJhdGlvbnMpLFxuICAgIGNvbmZpcm1SdWxlczogbWVyZ2VSdWxlQXJyYXlzKGVsZW1lbnQuY29uZmlybVBhdHRlcm5zLCBlbGVtZW50LmNvbmZpcm1PcGVyYXRpb25zKSxcbiAgICBkZW55UnVsZXM6IG1lcmdlUnVsZUFycmF5cyhlbGVtZW50LmRlbnlQYXR0ZXJucywgZWxlbWVudC5kZW55T3BlcmF0aW9ucyksXG4gICAgaW52YWxpZEdhdGVrZWVwZXJQb2xpY3k6ICEhZWxlbWVudC5pbnZhbGlkR2F0ZWtlZXBlclBvbGljeSxcbiAgICBpbnZhbGlkR2F0ZWtlZXBlck1lc3NhZ2U6IHR5cGVvZiBlbGVtZW50LmludmFsaWRHYXRla2VlcGVyTWVzc2FnZSA9PT0gJ3N0cmluZycgPyBlbGVtZW50LmludmFsaWRHYXRla2VlcGVyTWVzc2FnZSA6IHVuZGVmaW5lZCxcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlRWxlbWVudE5hbWUoZWxlbWVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcge1xuICBpZiAodHlwZW9mIGVsZW1lbnQuZWxlbWVudF9uYW1lID09PSAnc3RyaW5nJykgcmV0dXJuIGVsZW1lbnQuZWxlbWVudF9uYW1lO1xuICBpZiAodHlwZW9mIGVsZW1lbnQubmFtZSA9PT0gJ3N0cmluZycpIHJldHVybiBlbGVtZW50Lm5hbWU7XG4gIHJldHVybiAnJztcbn1cblxuLyoqIEhlbHBlciB0byBleHRyYWN0IHNpbmdsZSByZXN1bHQgZnJvbSBNQ1AtQVFMIGJhdGNoIHJlc3BvbnNlICovXG5mdW5jdGlvbiBhc1NpbmdsZVJlc3VsdChyZXN1bHRzOiB1bmtub3duKTogeyBzdWNjZXNzOiBib29sZWFuOyBkYXRhPzogdW5rbm93bjsgZXJyb3I/OiBzdHJpbmcgfSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHJlc3VsdHMpKSByZXR1cm4gcmVzdWx0c1swXSB8fCB7IHN1Y2Nlc3M6IGZhbHNlLCBlcnJvcjogJ0VtcHR5IHJlc3VsdCcgfTtcbiAgcmV0dXJuIHJlc3VsdHMgYXMgeyBzdWNjZXNzOiBib29sZWFuOyBkYXRhPzogdW5rbm93bjsgZXJyb3I/OiBzdHJpbmcgfTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEtub3duUG9saWN5U2Vzc2lvbnMoZWxlbWVudHM6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IEtub3duUG9saWN5U2Vzc2lvbltdIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBrbm93blNlc3Npb25zOiBLbm93blBvbGljeVNlc3Npb25bXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgIGNvbnN0IHNlc3Npb25JZHMgPSBBcnJheS5pc0FycmF5KGVsZW1lbnQuc2Vzc2lvbklkcykgPyBlbGVtZW50LnNlc3Npb25JZHMgOiBbXTtcbiAgICBmb3IgKGNvbnN0IHNlc3Npb25JZCBvZiBzZXNzaW9uSWRzKSB7XG4gICAgICBpZiAodHlwZW9mIHNlc3Npb25JZCAhPT0gJ3N0cmluZycgfHwgc2Vzc2lvbklkID09PSAnJyB8fCBzZWVuLmhhcyhzZXNzaW9uSWQpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBzZWVuLmFkZChzZXNzaW9uSWQpO1xuICAgICAga25vd25TZXNzaW9ucy5wdXNoKHtcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICBkaXNwbGF5TmFtZTogc2Vzc2lvbklkLFxuICAgICAgICBzb3VyY2U6ICdwb2xpY3knLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGtub3duU2Vzc2lvbnMuc29ydCgoYSwgYikgPT4gYS5zZXNzaW9uSWQubG9jYWxlQ29tcGFyZShiLnNlc3Npb25JZCkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZWxmSGVhbExhdGVzdFBlcm1pc3Npb25Qb3J0RmlsZShwb3J0OiBudW1iZXIgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHR5cGVvZiBwb3J0ICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzSW50ZWdlcihwb3J0KSB8fCBwb3J0IDw9IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IGVuc3VyZUxhdGVzdFBvcnRGaWxlKHBvcnQpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoJ1tXZWJVSS9HYXRld2F5XSBDb3VsZCBub3QgcmVmcmVzaCBwZXJtaXNzaW9uLXNlcnZlci5wb3J0Jywge1xuICAgICAgZXJyb3I6IGVyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKSxcbiAgICAgIHBvcnQsXG4gICAgfSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUluc3RhbGxlZFBlcm1pc3Npb25BdXRob3JpdHlIb3N0cyhcbiAgaG9tZURpcjogc3RyaW5nLFxuICBhdXRob3JpdHlTdGF0ZTogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiByZWFkUGVybWlzc2lvbkF1dGhvcml0eVN0YXRlPj4sXG4gIGF1dG9SZXBhaXJIb29rQXNzZXRzOiBib29sZWFuLFxuKTogUHJvbWlzZTxQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdFtdPiB7XG4gIGNvbnN0IGluc3RhbGxlZFN0YXR1c2VzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgUEVSTUlTU0lPTl9BVVRIT1JJVFlfSE9TVFMubWFwKGFzeW5jIChob3N0KSA9PiAoe1xuICAgICAgaG9zdCxcbiAgICAgIHN0YXR1czogYXdhaXQgcmVjb25jaWxlUGVybWlzc2lvbkhvb2tTdGF0dXMoaG9zdCwgeyBob21lRGlyLCBhdXRvUmVwYWlyOiBhdXRvUmVwYWlySG9va0Fzc2V0cyB9KSxcbiAgICB9KSksXG4gICk7XG5cbiAgY29uc3QgaW5zdGFsbGVkSG9zdHMgPSBpbnN0YWxsZWRTdGF0dXNlc1xuICAgIC5maWx0ZXIoKHsgc3RhdHVzIH0pID0+IHN0YXR1cy5pbnN0YWxsZWQpXG4gICAgLm1hcCgoeyBob3N0IH0pID0+IGhvc3QpO1xuXG4gIGNvbnN0IHBlcnNpc3RlZEhvc3RzID0gT2JqZWN0LmtleXMoYXV0aG9yaXR5U3RhdGUuaG9zdHMgfHwge30pLmZpbHRlcigoaG9zdCk6IGhvc3QgaXMgUGVybWlzc2lvbkF1dGhvcml0eUhvc3QgPT5cbiAgICAoUEVSTUlTU0lPTl9BVVRIT1JJVFlfSE9TVFMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKGhvc3QpLFxuICApO1xuXG4gIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQoaW5zdGFsbGVkSG9zdHMuY29uY2F0KHBlcnNpc3RlZEhvc3RzKSkpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHBlcm1pc3Npb24tcmVsYXRlZCByb3V0ZXMgb24gYSBnYXRld2F5IHJvdXRlci5cbiAqIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIE1DUC1BUUwgaGFuZGxlciBmb3IgcG9saWN5IGV2YWx1YXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0ZXJQZXJtaXNzaW9uUm91dGVzT3B0aW9ucyB7XG4gIGhvbWVEaXI/OiBzdHJpbmc7XG4gIGF1dG9SZXBhaXJIb29rQXNzZXRzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyUGVybWlzc2lvblJvdXRlcyhcbiAgcm91dGVyOiBSb3V0ZXIsXG4gIGhhbmRsZXI6IE1DUEFRTEhhbmRsZXIsXG4gIG9wdGlvbnM6IFJlZ2lzdGVyUGVybWlzc2lvblJvdXRlc09wdGlvbnMgPSB7fSxcbik6IHZvaWQge1xuICBjb25zdCBhdXRob3JpdHlIb21lRGlyID0gb3B0aW9ucy5ob21lRGlyID8/IGhvbWVkaXIoKTtcbiAgY29uc3QgYXV0b1JlcGFpckhvb2tBc3NldHMgPSBvcHRpb25zLmF1dG9SZXBhaXJIb29rQXNzZXRzID8/IHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSAndGVzdCc7XG4gIGNvbnN0IGRlY2lzaW9uVHJhY2tlciA9IGNyZWF0ZVBlcm1pc3Npb25EZWNpc2lvblRyYWNrZXIoKTtcbiAgLyoqXG4gICAqIFBPU1QgL2FwaS9ldmFsdWF0ZV9wZXJtaXNzaW9uXG4gICAqIFBlcm1pc3Npb24gZXZhbHVhdGlvbiBlbmRwb2ludCBmb3IgUHJlVG9vbFVzZSBob29rcy5cbiAgICogUm91dGVzIHRocm91Z2ggZXZhbHVhdGVfcGVybWlzc2lvbiBNQ1AtQVFMIFJFQUQgb3BlcmF0aW9uLlxuICAgKiBGYWlsLW9wZW46IHJldHVybnMgYWxsb3cgb24gYW55IGVycm9yIHRvIGF2b2lkIGJsb2NraW5nIHRoZSB1c2VyLlxuICAgKi9cbiAgY29uc3QgcGVybWlzc2lvbkxpbWl0ZXIgPSBuZXcgU2xpZGluZ1dpbmRvd1JhdGVMaW1pdGVyKFxuICAgIFBFUk1JU1NJT05fUk9VVEVfUkFURV9MSU1JVF9SRVFVRVNUUyxcbiAgICBQRVJNSVNTSU9OX1JPVVRFX1JBVEVfTElNSVRfV0lORE9XX01TLFxuICApO1xuICByb3V0ZXIucG9zdCgnL2V2YWx1YXRlX3Blcm1pc3Npb24nLCBleHByZXNzLmpzb24oKSwgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgYXdhaXQgc2VsZkhlYWxMYXRlc3RQZXJtaXNzaW9uUG9ydEZpbGUocmVxLnNvY2tldC5sb2NhbFBvcnQpO1xuXG4gICAgY29uc3QgYm9keSA9IHJlcS5ib2R5IGFzIHtcbiAgICAgIHRvb2xfbmFtZT86IHN0cmluZztcbiAgICAgIGlucHV0PzogUGVybWlzc2lvbkRlY2lzaW9uSW5wdXQ7XG4gICAgICBwbGF0Zm9ybT86IHN0cmluZztcbiAgICAgIHNlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgfTtcbiAgICBjb25zdCBwbGF0Zm9ybSA9IHR5cGVvZiBib2R5LnBsYXRmb3JtID09PSAnc3RyaW5nJyA/IGJvZHkucGxhdGZvcm0ubm9ybWFsaXplKCdORkMnKSA6ICdjbGF1ZGVfY29kZSc7XG5cbiAgICBpZiAoIXBlcm1pc3Npb25MaW1pdGVyLnRyeUFjcXVpcmUoKSkge1xuICAgICAgcmVzLmpzb24oZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCB7fSkpOyAvLyBmYWlsIG9wZW4gb24gcmF0ZSBsaW1pdFxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFVuaWNvZGUgbm9ybWFsaXphdGlvbiAoTkZDKSBvbiBzdHJpbmcgaW5wdXRzIHRvIHByZXZlbnQgaG9tb2dyYXBoIGF0dGFja3NcbiAgICBjb25zdCB0b29sX25hbWUgPSB0eXBlb2YgYm9keS50b29sX25hbWUgPT09ICdzdHJpbmcnID8gYm9keS50b29sX25hbWUubm9ybWFsaXplKCdORkMnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBzZXNzaW9uX2lkID0gdHlwZW9mIGJvZHkuc2Vzc2lvbl9pZCA9PT0gJ3N0cmluZycgPyBib2R5LnNlc3Npb25faWQubm9ybWFsaXplKCdORkMnKSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpbnB1dCA9IGJvZHkuaW5wdXQ7XG5cbiAgICBpZiAoIXRvb2xfbmFtZSkge1xuICAgICAgcmVzLmpzb24oZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCBpbnB1dCB8fCB7fSkpOyAvLyBmYWlsIG9wZW4gb24gYmFkIGlucHV0XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRNcyA9IERhdGUubm93KCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9wUmVzdWx0ID0gYXNTaW5nbGVSZXN1bHQoYXdhaXQgaGFuZGxlci5oYW5kbGVSZWFkKHtcbiAgICAgICAgb3BlcmF0aW9uOiAnZXZhbHVhdGVfcGVybWlzc2lvbicsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHRvb2xfbmFtZSxcbiAgICAgICAgICBpbnB1dDogaW5wdXQgfHwge30sXG4gICAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgICAgLi4uKHNlc3Npb25faWQgPyB7IHNlc3Npb25faWQgfSA6IHt9KSxcbiAgICAgICAgfSxcbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IGVsYXBzZWRNcyA9IERhdGUubm93KCkgLSBzdGFydE1zO1xuXG4gICAgICBpZiAoIW9wUmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oYFtXZWJVSS9HYXRld2F5XSBldmFsdWF0ZV9wZXJtaXNzaW9uIGZhaWxlZCAoJHtlbGFwc2VkTXN9bXMpOiAke29wUmVzdWx0LmVycm9yfWApO1xuICAgICAgICByZXMuanNvbihmb3JtYXRQZXJtaXNzaW9uUmVzcG9uc2UoJ2FsbG93JywgcGxhdGZvcm0sIGlucHV0IHx8IHt9KSk7IC8vIGZhaWwgb3BlblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJhd1Jlc3VsdCA9IG9wUmVzdWx0LmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSBub3JtYWxpemVQZXJtaXNzaW9uUmVzcG9uc2VGb3JQbGF0Zm9ybShcbiAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgIGlucHV0IHx8IHt9LFxuICAgICAgICByYXdSZXN1bHQsXG4gICAgICApO1xuICAgICAgY29uc3QgdHJhY2tlZFJlc3VsdCA9IHsgLi4ucmF3UmVzdWx0LCAuLi5yZXNwb25zZURhdGEgfTtcbiAgICAgIGNvbnN0IGRlY2lzaW9uID0gZXh0cmFjdERlY2lzaW9uKHJlc3BvbnNlRGF0YSk7XG4gICAgICBsb2dnZXIuZGVidWcoYFtXZWJVSS9HYXRld2F5XSBldmFsdWF0ZV9wZXJtaXNzaW9uOiAke3Rvb2xfbmFtZX0g4oaSICR7ZGVjaXNpb259ICgke2VsYXBzZWRNc31tcylgKTtcblxuICAgICAgLy8gVHJhY2sgZGVjaXNpb24gZm9yIGxpdmUgZGFzaGJvYXJkIGZlZWRcbiAgICAgIGRlY2lzaW9uVHJhY2tlci50cmFja0RlY2lzaW9uKHNlc3Npb25faWQsIHRvb2xfbmFtZSwgaW5wdXQgfHwge30sIHRyYWNrZWRSZXN1bHQsIHBsYXRmb3JtKTtcblxuICAgICAgcmVzLmpzb24ocmVzcG9uc2VEYXRhKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnN0IGVsYXBzZWRNcyA9IERhdGUubm93KCkgLSBzdGFydE1zO1xuICAgICAgbG9nZ2VyLmVycm9yKGBbV2ViVUkvR2F0ZXdheV0gZXZhbHVhdGVfcGVybWlzc2lvbiBlcnJvciAoJHtlbGFwc2VkTXN9bXMpOmAsIGVycik7XG4gICAgICByZXMuanNvbihmb3JtYXRQZXJtaXNzaW9uUmVzcG9uc2UoJ2FsbG93JywgcGxhdGZvcm0sIGlucHV0IHx8IHt9KSk7IC8vIGZhaWwgb3BlblxuICAgIH1cbiAgfSk7XG5cbiAgLyoqXG4gICAqIEdFVCAvYXBpL3Blcm1pc3Npb25zL3N0YXR1c1xuICAgKiBSZXR1cm5zIGN1cnJlbnQgcGVybWlzc2lvbiBwb2xpY2llcyBhbmQgcmVjZW50IGRlY2lzaW9uc1xuICAgKiBmb3IgdGhlIGxpdmUgcGVybWlzc2lvbnMgZGFzaGJvYXJkLlxuICAgKi9cbiAgcm91dGVyLmdldCgnL3Blcm1pc3Npb25zL3N0YXR1cycsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzZWxmSGVhbExhdGVzdFBlcm1pc3Npb25Qb3J0RmlsZShyZXEuc29ja2V0LmxvY2FsUG9ydCk7XG5cbiAgICAgIGNvbnN0IHNlc3Npb25JZCA9IHR5cGVvZiByZXEucXVlcnlbJ3Nlc3Npb25JZCddID09PSAnc3RyaW5nJyAmJiByZXEucXVlcnlbJ3Nlc3Npb25JZCddXG4gICAgICAgID8gcmVxLnF1ZXJ5WydzZXNzaW9uSWQnXVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgY29uc3Qgb3BSZXN1bHQgPSBhc1NpbmdsZVJlc3VsdChhd2FpdCBoYW5kbGVyLmhhbmRsZVJlYWQoe1xuICAgICAgICBvcGVyYXRpb246ICdnZXRfZWZmZWN0aXZlX2NsaV9wb2xpY2llcycsXG4gICAgICAgIHBhcmFtczoge1xuICAgICAgICAgIHJlcG9ydGluZ19zY29wZTogJ2Rhc2hib2FyZCcsXG4gICAgICAgICAgLi4uKHNlc3Npb25JZCA/IHsgc2Vzc2lvbl9pZDogc2Vzc2lvbklkIH0gOiB7fSksXG4gICAgICAgIH0sXG4gICAgICB9KSk7XG5cbiAgICAgIGlmICghb3BSZXN1bHQuc3VjY2Vzcykge1xuICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiBvcFJlc3VsdC5lcnJvciB8fCAnRmFpbGVkIHRvIGdldCBwb2xpY2llcycgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YSA9IG9wUmVzdWx0LmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCBhdXRob3JpdHlTdGF0ZSA9IGF3YWl0IHJlYWRQZXJtaXNzaW9uQXV0aG9yaXR5U3RhdGUoYXV0aG9yaXR5SG9tZURpcik7XG4gICAgICBjb25zdCBpbnN0YWxsZWRBdXRob3JpdHlIb3N0cyA9IGF3YWl0IHJlc29sdmVJbnN0YWxsZWRQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdHMoXG4gICAgICAgIGF1dGhvcml0eUhvbWVEaXIsXG4gICAgICAgIGF1dGhvcml0eVN0YXRlLFxuICAgICAgICBhdXRvUmVwYWlySG9va0Fzc2V0cyxcbiAgICAgICk7XG4gICAgICBjb25zdCBob29rSG9zdCA9IHR5cGVvZiBkYXRhLmhvb2tIb3N0ID09PSAnc3RyaW5nJyA/IGRhdGEuaG9va0hvc3QgOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBob29rU3RhdHVzID0gaG9va0hvc3RcbiAgICAgICAgPyBhd2FpdCByZWNvbmNpbGVQZXJtaXNzaW9uSG9va1N0YXR1cyhob29rSG9zdCwgeyBob21lRGlyOiBhdXRob3JpdHlIb21lRGlyLCBhdXRvUmVwYWlyOiBhdXRvUmVwYWlySG9va0Fzc2V0cyB9KVxuICAgICAgICA6IGF3YWl0IGdldFBlcm1pc3Npb25Ib29rU3RhdHVzQXN5bmMoYXV0aG9yaXR5SG9tZURpcik7XG4gICAgICBjb25zdCBlbGVtZW50cyA9IG5vcm1hbGl6ZVBvbGljeUVsZW1lbnRzKChkYXRhLmVsZW1lbnRzIHx8IFtdKSBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pO1xuXG4gICAgICBjb25zdCBkZW55UGF0dGVybnMgPSAoZGF0YS5jb21iaW5lZERlbnlQYXR0ZXJucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBhbGxvd1BhdHRlcm5zID0gKGRhdGEuY29tYmluZWRBbGxvd1BhdHRlcm5zIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKSA/PyBbXTtcbiAgICAgIGNvbnN0IGNvbmZpcm1QYXR0ZXJucyA9IChkYXRhLmNvbWJpbmVkQ29uZmlybVBhdHRlcm5zIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKSA/PyBbXTtcbiAgICAgIGNvbnN0IGRlbnlPcGVyYXRpb25zID0gKGRhdGEuY29tYmluZWREZW55T3BlcmF0aW9ucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBhbGxvd09wZXJhdGlvbnMgPSAoZGF0YS5jb21iaW5lZEFsbG93T3BlcmF0aW9ucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCkgPz8gW107XG4gICAgICBjb25zdCBjb25maXJtT3BlcmF0aW9ucyA9IChkYXRhLmNvbWJpbmVkQ29uZmlybU9wZXJhdGlvbnMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpID8/IFtdO1xuXG4gICAgICBjb25zdCBob29rU3RhcnR1cFJlcGFpciA9IGdldExhc3RQZXJtaXNzaW9uSG9va1N0YXJ0dXBSZXBhaXJTdW1tYXJ5KCk7XG4gICAgICBjb25zdCBob29rRGlhZ25vc3RpY3NQYXRoID0gZ2V0UGVybWlzc2lvbkhvb2tEaWFnbm9zdGljc1BhdGgoYXV0aG9yaXR5SG9tZURpcik7XG4gICAgICBjb25zdCBob29rTGFzdERpYWdub3N0aWMgPSBhd2FpdCByZWFkTGFzdFBlcm1pc3Npb25Ib29rRGlhZ25vc3RpYyhhdXRob3JpdHlIb21lRGlyKTtcbiAgICAgIGNvbnN0IGhvb2tIZWFsdGhIb3N0ID0gaG9va1N0YXR1cy5ob3N0ID8/IGhvb2tIb3N0ID8/ICdtYW5hZ2VkLWhvc3QnO1xuICAgICAgY29uc3QgaG9va0hlYWx0aCA9IHN1bW1hcml6ZVBlcm1pc3Npb25Ib29rSGVhbHRoKHtcbiAgICAgICAgaW5zdGFsbGVkSG9zdHM6IGhvb2tTdGF0dXMuaW5zdGFsbGVkIHx8IGhvb2tTdGF0dXMuYXNzZXRzUHJlcGFyZWQgPyBbaG9va0hlYWx0aEhvc3RdIDogW10sXG4gICAgICAgIGN1cnJlbnRIb3N0czogaG9va1N0YXR1cy5hc3NldHNDdXJyZW50ID8gW2hvb2tIZWFsdGhIb3N0XSA6IFtdLFxuICAgICAgICByZXBhaXJlZEhvc3RzOiBob29rU3RhdHVzLmF1dG9SZXBhaXJlZCA/IFtob29rSGVhbHRoSG9zdF0gOiBbXSxcbiAgICAgICAgbmVlZHNSZXBhaXJIb3N0czogaG9va1N0YXR1cy5uZWVkc1JlcGFpciA/IFtob29rSGVhbHRoSG9zdF0gOiBbXSxcbiAgICAgICAgZGlhZ25vc3RpY3NQYXRoOiBob29rRGlhZ25vc3RpY3NQYXRoLFxuICAgICAgICBsYXN0RGlhZ25vc3RpYzogaG9va0xhc3REaWFnbm9zdGljLFxuICAgICAgICBsYXN0U3RhcnR1cFJlcGFpcjogaG9va1N0YXJ0dXBSZXBhaXIsXG4gICAgICB9KTtcblxuICAgICAgcmVzLmpzb24oe1xuICAgICAgICAuLi4oc2Vzc2lvbklkID8geyBzZXNzaW9uSWQgfSA6IHt9KSxcbiAgICAgICAgYWN0aXZlRWxlbWVudENvdW50OiBkYXRhLmFjdGl2ZUVsZW1lbnRDb3VudCxcbiAgICAgICAgaGFzQWxsb3dsaXN0OiBkYXRhLmhhc0FsbG93bGlzdCxcbiAgICAgICAgZGVueVBhdHRlcm5zLFxuICAgICAgICBhbGxvd1BhdHRlcm5zLFxuICAgICAgICBjb25maXJtUGF0dGVybnMsXG4gICAgICAgIGRlbnlPcGVyYXRpb25zLFxuICAgICAgICBhbGxvd09wZXJhdGlvbnMsXG4gICAgICAgIGNvbmZpcm1PcGVyYXRpb25zLFxuICAgICAgICBkZW55UnVsZXM6IG1lcmdlUnVsZUFycmF5cyhkZW55UGF0dGVybnMsIGRlbnlPcGVyYXRpb25zKSxcbiAgICAgICAgYWxsb3dSdWxlczogbWVyZ2VSdWxlQXJyYXlzKGFsbG93UGF0dGVybnMsIGFsbG93T3BlcmF0aW9ucyksXG4gICAgICAgIGNvbmZpcm1SdWxlczogbWVyZ2VSdWxlQXJyYXlzKGNvbmZpcm1QYXR0ZXJucywgY29uZmlybU9wZXJhdGlvbnMpLFxuICAgICAgICBlbGVtZW50cyxcbiAgICAgICAga25vd25TZXNzaW9uczogZXh0cmFjdEtub3duUG9saWN5U2Vzc2lvbnMoZWxlbWVudHMpLFxuICAgICAgICBwZXJtaXNzaW9uUHJvbXB0QWN0aXZlOiBkYXRhLnBlcm1pc3Npb25Qcm9tcHRBY3RpdmUsXG4gICAgICAgIGhvb2tJbnN0YWxsZWQ6IGhvb2tTdGF0dXMuaW5zdGFsbGVkLFxuICAgICAgICBob29rSG9zdDogZGF0YS5ob29rSG9zdCxcbiAgICAgICAgaG9va0Fzc2V0c1ByZXBhcmVkOiBob29rU3RhdHVzLmFzc2V0c1ByZXBhcmVkLFxuICAgICAgICBob29rQXNzZXRzQ3VycmVudDogaG9va1N0YXR1cy5hc3NldHNDdXJyZW50LFxuICAgICAgICBob29rQXV0b1JlcGFpcmVkOiBob29rU3RhdHVzLmF1dG9SZXBhaXJlZCxcbiAgICAgICAgaG9va05lZWRzUmVwYWlyOiBob29rU3RhdHVzLm5lZWRzUmVwYWlyLFxuICAgICAgICBob29rUmVwYWlyRXJyb3I6IGhvb2tTdGF0dXMucmVwYWlyRXJyb3IsXG4gICAgICAgIGhvb2tIZWFsdGgsXG4gICAgICAgIGhvb2tTdGFydHVwUmVwYWlyLFxuICAgICAgICBob29rRGlhZ25vc3RpY3M6IHtcbiAgICAgICAgICBsb2dQYXRoOiBob29rRGlhZ25vc3RpY3NQYXRoLFxuICAgICAgICAgIGxhc3RFdmVudDogaG9va0xhc3REaWFnbm9zdGljLFxuICAgICAgICB9LFxuICAgICAgICBhdXRob3JpdHk6IGF1dGhvcml0eVN0YXRlLFxuICAgICAgICBhdXRob3JpdHlTdXBwb3J0ZWRIb3N0czogaW5zdGFsbGVkQXV0aG9yaXR5SG9zdHMsXG4gICAgICAgIGF1dGhvcml0eVN1cHBvcnRlZE1vZGVzOiBbLi4uUEVSTUlTU0lPTl9BVVRIT1JJVFlfTU9ERVNdLFxuICAgICAgICBhdXRob3JpdHlBaU11dGFibGU6IGZhbHNlLFxuICAgICAgICBlbmZvcmNlbWVudFJlYWR5OiBkYXRhLmVuZm9yY2VtZW50UmVhZHksXG4gICAgICAgIGludmFsaWRQb2xpY3lFbGVtZW50Q291bnQ6IGRhdGEuaW52YWxpZFBvbGljeUVsZW1lbnRDb3VudCA/PyAwLFxuICAgICAgICBhZHZpc29yeTogZGF0YS5hZHZpc29yeSxcbiAgICAgICAgcmVjZW50RGVjaXNpb25zOiBkZWNpc2lvblRyYWNrZXIuZ2V0UmVjZW50RGVjaXNpb25zKCksXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW1dlYlVJL0dhdGV3YXldIHBlcm1pc3Npb25zL3N0YXR1cyBlcnJvcjonLCBlcnIpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogJ0ZhaWxlZCB0byBnZXQgcGVybWlzc2lvbiBzdGF0dXMnIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcm91dGVyLmdldCgnL3Blcm1pc3Npb25zL2F1dGhvcml0eScsIGFzeW5jIChfcmVxLCByZXMpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgYXV0aG9yaXR5U3RhdGUgPSBhd2FpdCByZWFkUGVybWlzc2lvbkF1dGhvcml0eVN0YXRlKGF1dGhvcml0eUhvbWVEaXIpO1xuICAgICAgY29uc3QgaW5zdGFsbGVkQXV0aG9yaXR5SG9zdHMgPSBhd2FpdCByZXNvbHZlSW5zdGFsbGVkUGVybWlzc2lvbkF1dGhvcml0eUhvc3RzKFxuICAgICAgICBhdXRob3JpdHlIb21lRGlyLFxuICAgICAgICBhdXRob3JpdHlTdGF0ZSxcbiAgICAgICAgYXV0b1JlcGFpckhvb2tBc3NldHMsXG4gICAgICApO1xuICAgICAgcmVzLmpzb24oe1xuICAgICAgICAuLi5hdXRob3JpdHlTdGF0ZSxcbiAgICAgICAgc3VwcG9ydGVkSG9zdHM6IGluc3RhbGxlZEF1dGhvcml0eUhvc3RzLFxuICAgICAgICBzdXBwb3J0ZWRNb2RlczogWy4uLlBFUk1JU1NJT05fQVVUSE9SSVRZX01PREVTXSxcbiAgICAgICAgYWlNdXRhYmxlOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdbV2ViVUkvR2F0ZXdheV0gcGVybWlzc2lvbnMvYXV0aG9yaXR5IGVycm9yOicsIGVycik7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiAnRmFpbGVkIHRvIGdldCBwZXJtaXNzaW9uIGF1dGhvcml0eScgfSk7XG4gICAgfVxuICB9KTtcblxuICByb3V0ZXIucG9zdCgnL3Blcm1pc3Npb25zL2F1dGhvcml0eScsIGV4cHJlc3MuanNvbigpLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaG9zdCA9IG5vcm1hbGl6ZUF1dGhvcml0eUhvc3QocmVxLmJvZHk/Lmhvc3QpO1xuICAgICAgY29uc3QgbW9kZSA9IG5vcm1hbGl6ZUF1dGhvcml0eU1vZGUocmVxLmJvZHk/Lm1vZGUpO1xuICAgICAgY29uc3QgcmVhc29uID0gdHlwZW9mIHJlcS5ib2R5Py5yZWFzb24gPT09ICdzdHJpbmcnICYmIHJlcS5ib2R5LnJlYXNvbi50cmltKCkgIT09ICcnXG4gICAgICAgID8gcmVxLmJvZHkucmVhc29uLnRyaW0oKVxuICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKCFob3N0IHx8ICFtb2RlKSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDAwKS5qc29uKHtcbiAgICAgICAgICBlcnJvcjogJ2hvc3QgYW5kIG1vZGUgYXJlIHJlcXVpcmVkJyxcbiAgICAgICAgICBzdXBwb3J0ZWRIb3N0czogWy4uLlBFUk1JU1NJT05fQVVUSE9SSVRZX0hPU1RTXSxcbiAgICAgICAgICBzdXBwb3J0ZWRNb2RlczogWy4uLlBFUk1JU1NJT05fQVVUSE9SSVRZX01PREVTXSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgbGV0IHBvbGljaWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChtb2RlID09PSAnYXV0aG9yaXRhdGl2ZScpIHtcbiAgICAgICAgY29uc3QgcG9saWN5UmVzdWx0ID0gYXNTaW5nbGVSZXN1bHQoYXdhaXQgaGFuZGxlci5oYW5kbGVSZWFkKHtcbiAgICAgICAgICBvcGVyYXRpb246ICdnZXRfZWZmZWN0aXZlX2NsaV9wb2xpY2llcycsXG4gICAgICAgICAgcGFyYW1zOiB7IHJlcG9ydGluZ19zY29wZTogJ2Rhc2hib2FyZCcgfSxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIGlmICghcG9saWN5UmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiBwb2xpY3lSZXN1bHQuZXJyb3IgfHwgJ0ZhaWxlZCB0byBmZXRjaCBlZmZlY3RpdmUgcG9saWNpZXMnIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvbGljaWVzID0gcG9saWN5UmVzdWx0LmRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGF1dGhvcml0eVN0YXRlID0gYXdhaXQgc2V0UGVybWlzc2lvbkF1dGhvcml0eU1vZGUoe1xuICAgICAgICBob3N0LFxuICAgICAgICBtb2RlLFxuICAgICAgICByZWFzb24sXG4gICAgICAgIGhvbWVEaXI6IGF1dGhvcml0eUhvbWVEaXIsXG4gICAgICAgIHBvbGljaWVzOiBtb2RlID09PSAnYXV0aG9yaXRhdGl2ZSdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgIGNvbWJpbmVkQWxsb3dQYXR0ZXJuczogYXNTdHJpbmdBcnJheShwb2xpY2llcz8uY29tYmluZWRBbGxvd1BhdHRlcm5zKSxcbiAgICAgICAgICAgIGNvbWJpbmVkQ29uZmlybVBhdHRlcm5zOiBhc1N0cmluZ0FycmF5KHBvbGljaWVzPy5jb21iaW5lZENvbmZpcm1QYXR0ZXJucyksXG4gICAgICAgICAgICBjb21iaW5lZERlbnlQYXR0ZXJuczogYXNTdHJpbmdBcnJheShwb2xpY2llcz8uY29tYmluZWREZW55UGF0dGVybnMpLFxuICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIH0pO1xuXG4gICAgICByZXMuanNvbih7IHN1Y2Nlc3M6IHRydWUsIGF1dGhvcml0eTogYXV0aG9yaXR5U3RhdGUgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgIGBbV2ViVUkvR2F0ZXdheV0gcGVybWlzc2lvbnMvYXV0aG9yaXR5IHVwZGF0ZSBlcnJvciAoaG9zdD0ke1N0cmluZyhyZXEuYm9keT8uaG9zdCA/PyAnJyl9LCBtb2RlPSR7U3RyaW5nKHJlcS5ib2R5Py5tb2RlID8/ICcnKX0pOmAsXG4gICAgICAgIGVycixcbiAgICAgICk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7XG4gICAgICAgIGVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogJ0ZhaWxlZCB0byB1cGRhdGUgcGVybWlzc2lvbiBhdXRob3JpdHknLFxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplQXV0aG9yaXR5SG9zdCh2YWx1ZTogdW5rbm93bik6IFBlcm1pc3Npb25BdXRob3JpdHlIb3N0IHwgbnVsbCB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIFBFUk1JU1NJT05fQVVUSE9SSVRZX0hPU1RTLmluY2x1ZGVzKHZhbHVlIGFzIFBlcm1pc3Npb25BdXRob3JpdHlIb3N0KVxuICAgID8gdmFsdWUgYXMgUGVybWlzc2lvbkF1dGhvcml0eUhvc3RcbiAgICA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUF1dGhvcml0eU1vZGUodmFsdWU6IHVua25vd24pOiBQZXJtaXNzaW9uQXV0aG9yaXR5TW9kZSB8IG51bGwge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBQRVJNSVNTSU9OX0FVVEhPUklUWV9NT0RFUy5pbmNsdWRlcyh2YWx1ZSBhcyBQZXJtaXNzaW9uQXV0aG9yaXR5TW9kZSlcbiAgICA/IHZhbHVlIGFzIFBlcm1pc3Npb25BdXRob3JpdHlNb2RlXG4gICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBhc1N0cmluZ0FycmF5KHZhbHVlOiB1bmtub3duKTogc3RyaW5nW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZS5maWx0ZXIoKGVudHJ5KTogZW50cnkgaXMgc3RyaW5nID0+IHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZycpIDogW107XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dollhousemcp/mcp-server",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.31",
|
|
4
4
|
"description": "DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -25,6 +25,23 @@ PORT_FILE="$RUN_DIR/permission-server.port"
|
|
|
25
25
|
AUTHORITY_FILE="$RUN_DIR/permission-authority.json"
|
|
26
26
|
HOOK_PLATFORM="${DOLLHOUSE_HOOK_PLATFORM:-claude_code}"
|
|
27
27
|
permission_hook_load_runtime_config
|
|
28
|
+
DIAGNOSTICS_LOG="${DOLLHOUSE_HOOK_DIAGNOSTICS_LOG:-$RUN_DIR/permission-hook-diagnostics.jsonl}"
|
|
29
|
+
INVOCATION_ID="$(date +%s)-$$-${RANDOM:-0}"
|
|
30
|
+
|
|
31
|
+
INPUT=""
|
|
32
|
+
TOOL_NAME=""
|
|
33
|
+
TOOL_INPUT=""
|
|
34
|
+
AUTHORITY_HOST=""
|
|
35
|
+
AUTHORITY_MODE=""
|
|
36
|
+
PAYLOAD=""
|
|
37
|
+
RESPONSE=""
|
|
38
|
+
NORMALIZED_RESPONSE=""
|
|
39
|
+
EMITTED_RESPONSE=""
|
|
40
|
+
PORT=""
|
|
41
|
+
ENDPOINT=""
|
|
42
|
+
LAST_ATTEMPT="0"
|
|
43
|
+
LAST_CURL_EXIT=""
|
|
44
|
+
CURRENT_TIMEOUT="$INITIAL_TIMEOUT"
|
|
28
45
|
|
|
29
46
|
# Debug logging helper — writes to stderr so it doesn't pollute stdout
|
|
30
47
|
debug() {
|
|
@@ -34,22 +51,110 @@ debug() {
|
|
|
34
51
|
return 0
|
|
35
52
|
}
|
|
36
53
|
|
|
37
|
-
|
|
54
|
+
append_diagnostic_record() {
|
|
55
|
+
local event="$1"
|
|
56
|
+
local stage="$2"
|
|
57
|
+
local outcome="${3:-}"
|
|
58
|
+
local reason="${4:-}"
|
|
59
|
+
local diagnostic_json
|
|
60
|
+
|
|
61
|
+
mkdir -p "$(dirname "$DIAGNOSTICS_LOG")" 2>/dev/null || return 0
|
|
62
|
+
|
|
63
|
+
diagnostic_json=$(
|
|
64
|
+
jq -cn \
|
|
65
|
+
--arg timestamp "$(date -u +'%Y-%m-%dT%H:%M:%SZ')" \
|
|
66
|
+
--arg invocationId "$INVOCATION_ID" \
|
|
67
|
+
--arg event "$event" \
|
|
68
|
+
--arg platform "$HOOK_PLATFORM" \
|
|
69
|
+
--arg stage "$stage" \
|
|
70
|
+
--arg outcome "$outcome" \
|
|
71
|
+
--arg reason "$reason" \
|
|
72
|
+
--arg hookPath "$0" \
|
|
73
|
+
--arg diagnosticsLogPath "$DIAGNOSTICS_LOG" \
|
|
74
|
+
--arg sessionId "${DOLLHOUSE_SESSION_ID:-}" \
|
|
75
|
+
--arg toolName "${TOOL_NAME:-}" \
|
|
76
|
+
--arg toolInput "${TOOL_INPUT:-}" \
|
|
77
|
+
--arg rawInput "${INPUT:-}" \
|
|
78
|
+
--arg authorityHost "${AUTHORITY_HOST:-}" \
|
|
79
|
+
--arg authorityMode "${AUTHORITY_MODE:-}" \
|
|
80
|
+
--arg endpoint "${ENDPOINT:-}" \
|
|
81
|
+
--arg port "${PORT:-}" \
|
|
82
|
+
--arg payload "${PAYLOAD:-}" \
|
|
83
|
+
--arg response "${RESPONSE:-}" \
|
|
84
|
+
--arg normalizedResponse "${NORMALIZED_RESPONSE:-}" \
|
|
85
|
+
--arg emittedResponse "${EMITTED_RESPONSE:-}" \
|
|
86
|
+
--arg attempt "${LAST_ATTEMPT:-}" \
|
|
87
|
+
--arg maxRetries "${MAX_RETRIES:-}" \
|
|
88
|
+
--arg timeoutSeconds "${CURRENT_TIMEOUT:-}" \
|
|
89
|
+
--arg curlExit "${LAST_CURL_EXIT:-}" \
|
|
90
|
+
--argjson rawInputLength "${#INPUT}" \
|
|
91
|
+
--argjson normalizedResponseLength "${#NORMALIZED_RESPONSE}" \
|
|
92
|
+
--argjson emittedResponseLength "${#EMITTED_RESPONSE}" \
|
|
93
|
+
--argjson responseLength "${#RESPONSE}" \
|
|
94
|
+
'{
|
|
95
|
+
timestamp: $timestamp,
|
|
96
|
+
invocationId: $invocationId,
|
|
97
|
+
event: $event,
|
|
98
|
+
platform: $platform,
|
|
99
|
+
stage: $stage,
|
|
100
|
+
rawInputLength: $rawInputLength,
|
|
101
|
+
normalizedResponseLength: $normalizedResponseLength,
|
|
102
|
+
emittedResponseLength: $emittedResponseLength,
|
|
103
|
+
responseLength: $responseLength
|
|
104
|
+
}
|
|
105
|
+
+ (if $outcome != "" then { outcome: $outcome } else {} end)
|
|
106
|
+
+ (if $reason != "" then { reason: $reason } else {} end)
|
|
107
|
+
+ (if $hookPath != "" then { hookPath: $hookPath } else {} end)
|
|
108
|
+
+ (if $diagnosticsLogPath != "" then { diagnosticsLogPath: $diagnosticsLogPath } else {} end)
|
|
109
|
+
+ (if $sessionId != "" then { sessionId: $sessionId } else {} end)
|
|
110
|
+
+ (if $toolName != "" then { toolName: $toolName } else {} end)
|
|
111
|
+
+ (if $toolInput != "" then { toolInput: $toolInput } else {} end)
|
|
112
|
+
+ (if $rawInput != "" then { rawInput: $rawInput } else {} end)
|
|
113
|
+
+ (if $authorityHost != "" then { authorityHost: $authorityHost } else {} end)
|
|
114
|
+
+ (if $authorityMode != "" then { authorityMode: $authorityMode } else {} end)
|
|
115
|
+
+ (if $endpoint != "" then { endpoint: $endpoint } else {} end)
|
|
116
|
+
+ (if $port != "" then { port: $port } else {} end)
|
|
117
|
+
+ (if $payload != "" then { payload: $payload } else {} end)
|
|
118
|
+
+ (if $response != "" then { response: $response } else {} end)
|
|
119
|
+
+ (if $normalizedResponse != "" then { normalizedResponse: $normalizedResponse } else {} end)
|
|
120
|
+
+ (if $emittedResponse != "" then { emittedResponse: $emittedResponse } else {} end)
|
|
121
|
+
+ (if $attempt != "" then { attempt: $attempt } else {} end)
|
|
122
|
+
+ (if $maxRetries != "" then { maxRetries: $maxRetries } else {} end)
|
|
123
|
+
+ (if $timeoutSeconds != "" then { timeoutSeconds: $timeoutSeconds } else {} end)
|
|
124
|
+
+ (if $curlExit != "" then { curlExit: $curlExit } else {} end)'
|
|
125
|
+
) || return 0
|
|
126
|
+
|
|
127
|
+
printf '%s\n' "$diagnostic_json" >> "$DIAGNOSTICS_LOG" 2>/dev/null || true
|
|
128
|
+
return 0
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
emit_response() {
|
|
132
|
+
local response="$1"
|
|
133
|
+
|
|
134
|
+
EMITTED_RESPONSE="$response"
|
|
135
|
+
if [[ -n "$response" ]]; then
|
|
136
|
+
printf '%s\n' "$response"
|
|
137
|
+
fi
|
|
138
|
+
|
|
139
|
+
return 0
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
build_allow_response() {
|
|
38
143
|
case "$HOOK_PLATFORM" in
|
|
39
144
|
claude_code|vscode)
|
|
40
|
-
printf '%s
|
|
145
|
+
printf '%s' '{"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"allow"}}'
|
|
41
146
|
;;
|
|
42
147
|
codex)
|
|
43
|
-
printf '%s
|
|
148
|
+
printf '%s' ''
|
|
44
149
|
;;
|
|
45
150
|
cursor)
|
|
46
|
-
printf '%s
|
|
151
|
+
printf '%s' '{"permission":"allow"}'
|
|
47
152
|
;;
|
|
48
153
|
gemini)
|
|
49
|
-
printf '%s
|
|
154
|
+
printf '%s' '{"decision":"allow"}'
|
|
50
155
|
;;
|
|
51
156
|
*)
|
|
52
|
-
printf '%s
|
|
157
|
+
printf '%s' '{}'
|
|
53
158
|
;;
|
|
54
159
|
esac
|
|
55
160
|
|
|
@@ -57,9 +162,12 @@ emit_allow_response() {
|
|
|
57
162
|
}
|
|
58
163
|
|
|
59
164
|
fail_open() {
|
|
60
|
-
local
|
|
165
|
+
local stage="$1"
|
|
166
|
+
local message="$2"
|
|
61
167
|
debug "$message"
|
|
62
|
-
|
|
168
|
+
EMITTED_RESPONSE=$(build_allow_response)
|
|
169
|
+
append_diagnostic_record "complete" "$stage" "fail_open" "$message"
|
|
170
|
+
emit_response "$EMITTED_RESPONSE"
|
|
63
171
|
return 0
|
|
64
172
|
}
|
|
65
173
|
|
|
@@ -147,29 +255,28 @@ normalize_response() {
|
|
|
147
255
|
codex)
|
|
148
256
|
echo "$response" | jq -c '
|
|
149
257
|
if type == "object" and (keys | length) == 0 then
|
|
258
|
+
empty
|
|
259
|
+
elif (.hookSpecificOutput.permissionDecision? | type) == "string" and .hookSpecificOutput.permissionDecision == "deny" then
|
|
150
260
|
{
|
|
151
261
|
hookSpecificOutput: {
|
|
152
262
|
hookEventName: "PreToolUse",
|
|
153
|
-
permissionDecision: "
|
|
154
|
-
permissionDecisionReason: ""
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
elif (.hookSpecificOutput.permissionDecision? | type) == "string" then
|
|
158
|
-
{
|
|
159
|
-
hookSpecificOutput: {
|
|
160
|
-
hookEventName: "PreToolUse",
|
|
161
|
-
permissionDecision: (if .hookSpecificOutput.permissionDecision == "allow" then "allow" else "deny" end),
|
|
263
|
+
permissionDecision: "deny",
|
|
162
264
|
permissionDecisionReason: (.hookSpecificOutput.permissionDecisionReason // .hookSpecificOutput.reason // .reason // .message // "")
|
|
163
265
|
}
|
|
164
266
|
}
|
|
267
|
+
elif (.hookSpecificOutput.permissionDecision? | type) == "string" then
|
|
268
|
+
empty
|
|
165
269
|
elif (.decision? | type) == "string" and (.decision | IN("allow", "deny", "ask")) then
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
270
|
+
if .decision == "deny"
|
|
271
|
+
then {
|
|
272
|
+
hookSpecificOutput: {
|
|
273
|
+
hookEventName: "PreToolUse",
|
|
274
|
+
permissionDecision: "deny",
|
|
275
|
+
permissionDecisionReason: (.reason // .message // "")
|
|
276
|
+
}
|
|
171
277
|
}
|
|
172
|
-
|
|
278
|
+
else empty
|
|
279
|
+
end
|
|
173
280
|
else
|
|
174
281
|
empty
|
|
175
282
|
end
|
|
@@ -186,17 +293,9 @@ normalize_response() {
|
|
|
186
293
|
# shellcheck disable=SC1091 # Resolved at runtime via SCRIPT_DIR.
|
|
187
294
|
source "$SCRIPT_DIR/permission-port-discovery.sh"
|
|
188
295
|
|
|
189
|
-
# Discover the port from the shared file or the newest live PID-keyed file
|
|
190
|
-
if ! PORT=$(resolve_permission_port); then
|
|
191
|
-
fail_open "No usable permission server port file found — fail open"
|
|
192
|
-
exit 0
|
|
193
|
-
fi
|
|
194
|
-
|
|
195
|
-
ENDPOINT="http://127.0.0.1:${PORT}/api/evaluate_permission"
|
|
196
|
-
debug "Endpoint: $ENDPOINT"
|
|
197
|
-
|
|
198
296
|
# Read the hook input from stdin
|
|
199
297
|
INPUT=$(cat)
|
|
298
|
+
append_diagnostic_record "received_input" "received_input"
|
|
200
299
|
|
|
201
300
|
# Extract tool_name and tool_input from the hook payload
|
|
202
301
|
TOOL_NAME=$(echo "$INPUT" | jq -r '.tool_name // .toolName // .tool // .name // empty' 2>/dev/null)
|
|
@@ -204,10 +303,19 @@ TOOL_INPUT=$(echo "$INPUT" | jq -c '.tool_input // .toolInput // .input // {}' 2
|
|
|
204
303
|
|
|
205
304
|
# If we can't parse the input, fail open
|
|
206
305
|
if [[ -z "$TOOL_NAME" ]]; then
|
|
207
|
-
fail_open "Could not parse tool_name from input — fail open"
|
|
306
|
+
fail_open "parse_tool_name_failed" "Could not parse tool_name from input — fail open"
|
|
307
|
+
exit 0
|
|
308
|
+
fi
|
|
309
|
+
|
|
310
|
+
# Discover the port from the shared file or the newest live PID-keyed file
|
|
311
|
+
if ! PORT=$(resolve_permission_port); then
|
|
312
|
+
fail_open "port_discovery_failed" "No usable permission server port file found — fail open"
|
|
208
313
|
exit 0
|
|
209
314
|
fi
|
|
210
315
|
|
|
316
|
+
ENDPOINT="http://127.0.0.1:${PORT}/api/evaluate_permission"
|
|
317
|
+
debug "Endpoint: $ENDPOINT"
|
|
318
|
+
|
|
211
319
|
debug "Evaluating: $TOOL_NAME"
|
|
212
320
|
debug "Platform: $HOOK_PLATFORM"
|
|
213
321
|
|
|
@@ -216,7 +324,7 @@ AUTHORITY_MODE=$(resolve_authority_mode "$AUTHORITY_HOST")
|
|
|
216
324
|
debug "Authority mode for ${AUTHORITY_HOST:-unknown}: $AUTHORITY_MODE"
|
|
217
325
|
|
|
218
326
|
if [[ "$AUTHORITY_MODE" == "off" ]]; then
|
|
219
|
-
fail_open "Authority mode is off — hook no-op"
|
|
327
|
+
fail_open "authority_off" "Authority mode is off — hook no-op"
|
|
220
328
|
exit 0
|
|
221
329
|
fi
|
|
222
330
|
|
|
@@ -241,23 +349,31 @@ ATTEMPT=0
|
|
|
241
349
|
TIMEOUT=$INITIAL_TIMEOUT
|
|
242
350
|
|
|
243
351
|
while [[ $ATTEMPT -le $MAX_RETRIES ]]; do
|
|
352
|
+
LAST_ATTEMPT="$ATTEMPT"
|
|
353
|
+
CURRENT_TIMEOUT="$TIMEOUT"
|
|
244
354
|
RESPONSE=$(curl -s --max-time "$TIMEOUT" -X POST "$ENDPOINT" \
|
|
245
355
|
-H "Content-Type: application/json" \
|
|
246
356
|
-d "$PAYLOAD" \
|
|
247
357
|
2>/dev/null)
|
|
248
358
|
CURL_EXIT=$?
|
|
359
|
+
LAST_CURL_EXIT="$CURL_EXIT"
|
|
249
360
|
|
|
250
361
|
if [[ $CURL_EXIT -eq 0 ]] && [[ -n "$RESPONSE" ]]; then
|
|
251
362
|
debug "Response (attempt $((ATTEMPT+1))): $RESPONSE"
|
|
252
363
|
if ! echo "$RESPONSE" | jq -e . >/dev/null 2>&1; then
|
|
253
|
-
fail_open "Non-JSON response for platform $HOOK_PLATFORM — fail open"
|
|
364
|
+
fail_open "response_not_json" "Non-JSON response for platform $HOOK_PLATFORM — fail open"
|
|
254
365
|
exit 0
|
|
255
366
|
fi
|
|
256
367
|
NORMALIZED_RESPONSE=$(normalize_response "$RESPONSE")
|
|
257
368
|
if [[ -n "$NORMALIZED_RESPONSE" ]]; then
|
|
258
|
-
|
|
369
|
+
EMITTED_RESPONSE="$NORMALIZED_RESPONSE"
|
|
370
|
+
append_diagnostic_record "complete" "response_normalized" "success"
|
|
371
|
+
emit_response "$NORMALIZED_RESPONSE"
|
|
372
|
+
elif [[ "$HOOK_PLATFORM" == "codex" ]]; then
|
|
373
|
+
EMITTED_RESPONSE=""
|
|
374
|
+
append_diagnostic_record "complete" "response_allowed_without_output" "success"
|
|
259
375
|
else
|
|
260
|
-
fail_open "Malformed response for platform $HOOK_PLATFORM — fail open"
|
|
376
|
+
fail_open "response_malformed" "Malformed response for platform $HOOK_PLATFORM — fail open"
|
|
261
377
|
exit 0
|
|
262
378
|
fi
|
|
263
379
|
exit 0
|
|
@@ -266,12 +382,14 @@ while [[ $ATTEMPT -le $MAX_RETRIES ]]; do
|
|
|
266
382
|
ATTEMPT=$((ATTEMPT + 1))
|
|
267
383
|
if [[ $ATTEMPT -le $MAX_RETRIES ]]; then
|
|
268
384
|
BACKOFF=$((TIMEOUT * ATTEMPT))
|
|
269
|
-
|
|
385
|
+
RETRY_MESSAGE="Attempt $ATTEMPT failed (curl exit $CURL_EXIT) — retrying in ${BACKOFF}s (timeout ${TIMEOUT}s → $((TIMEOUT * 2))s)"
|
|
386
|
+
debug "$RETRY_MESSAGE"
|
|
387
|
+
append_diagnostic_record "retry" "curl_retry" "retrying" "$RETRY_MESSAGE"
|
|
270
388
|
sleep "$BACKOFF"
|
|
271
389
|
TIMEOUT=$((TIMEOUT * 2))
|
|
272
390
|
fi
|
|
273
391
|
done
|
|
274
392
|
|
|
275
393
|
# All retries exhausted — fail open
|
|
276
|
-
fail_open "All $((MAX_RETRIES + 1)) attempts failed — fail open"
|
|
394
|
+
fail_open "curl_attempts_exhausted" "All $((MAX_RETRIES + 1)) attempts failed — fail open"
|
|
277
395
|
exit 0
|
package/server.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "io.github.DollhouseMCP/mcp-server",
|
|
4
4
|
"title": "DollhouseMCP",
|
|
5
5
|
"description": "OSS to create Personas, Skills, Templates, Agents, and Memories to customize your AI experience.",
|
|
6
|
-
"version": "2.0.
|
|
6
|
+
"version": "2.0.31",
|
|
7
7
|
"homepage": "https://dollhousemcp.com",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
{
|
|
30
30
|
"registryType": "npm",
|
|
31
31
|
"identifier": "@dollhousemcp/mcp-server",
|
|
32
|
-
"version": "2.0.
|
|
32
|
+
"version": "2.0.31",
|
|
33
33
|
"transport": {
|
|
34
34
|
"type": "stdio"
|
|
35
35
|
}
|