@dollhousemcp/mcp-server 2.0.29 → 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.
Files changed (34) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/dist/generated/version.d.ts +2 -2
  3. package/dist/generated/version.js +3 -3
  4. package/dist/handlers/mcp-aql/OperationSchema.js +2 -2
  5. package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -1
  6. package/dist/handlers/mcp-aql/evaluatePermission.js +6 -3
  7. package/dist/services/BuildInfoService.d.ts +5 -0
  8. package/dist/services/BuildInfoService.d.ts.map +1 -1
  9. package/dist/services/BuildInfoService.js +44 -8
  10. package/dist/utils/permissionHookInstallers.d.ts +27 -0
  11. package/dist/utils/permissionHookInstallers.d.ts.map +1 -0
  12. package/dist/utils/permissionHookInstallers.js +465 -0
  13. package/dist/utils/permissionHookShared.d.ts +165 -0
  14. package/dist/utils/permissionHookShared.d.ts.map +1 -0
  15. package/dist/utils/permissionHookShared.js +425 -0
  16. package/dist/utils/permissionHookStatus.d.ts +10 -0
  17. package/dist/utils/permissionHookStatus.d.ts.map +1 -0
  18. package/dist/utils/permissionHookStatus.js +260 -0
  19. package/dist/utils/permissionHooks.d.ts +3 -91
  20. package/dist/utils/permissionHooks.d.ts.map +1 -1
  21. package/dist/utils/permissionHooks.js +4 -947
  22. package/dist/web/routes/healthRoutes.d.ts +3 -0
  23. package/dist/web/routes/healthRoutes.d.ts.map +1 -1
  24. package/dist/web/routes/healthRoutes.js +24 -2
  25. package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
  26. package/dist/web/routes/permissionRoutes.js +21 -2
  27. package/dist/web/server.d.ts.map +1 -1
  28. package/dist/web/server.js +9 -2
  29. package/package.json +3 -1
  30. package/scripts/permission-hook-config.sh +67 -0
  31. package/scripts/pretooluse-dollhouse.sh +185 -38
  32. package/scripts/pretooluse-vscode.sh +23 -10
  33. package/scripts/pretooluse-windsurf.sh +6 -6
  34. package/server.json +2 -2
@@ -6,11 +6,14 @@
6
6
  import { Router } from 'express';
7
7
  import type { MemoryLogSink } from '../../logging/sinks/MemoryLogSink.js';
8
8
  import type { MemoryMetricsSink } from '../../metrics/sinks/MemoryMetricsSink.js';
9
+ import { type PermissionHookAuditSummary } from '../../utils/permissionHooks.js';
9
10
  export interface HealthRoutesOptions {
10
11
  memorySink: MemoryLogSink;
11
12
  metricsSink?: MemoryMetricsSink;
12
13
  logClientCount: () => number;
13
14
  metricsClientCount: () => number;
15
+ permissionHooksHomeDir?: string;
16
+ getPermissionHookAuditSummaryFn?: (homeDir: string) => Promise<PermissionHookAuditSummary>;
14
17
  }
15
18
  export declare function createHealthRoutes(options: HealthRoutesOptions): Router;
16
19
  //# sourceMappingURL=healthRoutes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"healthRoutes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/healthRoutes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAElF,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,aAAa,CAAC;IAC1B,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,MAAM,CAAC;CAClC;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAyBvE"}
1
+ {"version":3,"file":"healthRoutes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/healthRoutes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,aAAa,CAAC;IAC1B,WAAW,CAAC,EAAE,iBAAiB,CAAC;IAChC,cAAc,EAAE,MAAM,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,MAAM,CAAC;IACjC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,+BAA+B,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,0BAA0B,CAAC,CAAC;CAC5F;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CA+CvE"}
@@ -4,10 +4,12 @@
4
4
  * GET /api/health — Aggregated health: uptime, sink stats, SSE client counts
5
5
  */
6
6
  import { Router } from 'express';
7
+ import { homedir } from 'node:os';
8
+ import { getPermissionHookAuditSummary, summarizePermissionHookHealth, } from '../../utils/permissionHooks.js';
7
9
  export function createHealthRoutes(options) {
8
10
  const router = Router();
9
11
  const startTime = Date.now();
10
- router.get('/health', (_req, res) => {
12
+ router.get('/health', async (_req, res) => {
11
13
  const health = {
12
14
  status: 'ok',
13
15
  uptime: Math.floor((Date.now() - startTime) / 1000),
@@ -22,8 +24,28 @@ export function createHealthRoutes(options) {
22
24
  sseClients: options.metricsClientCount(),
23
25
  };
24
26
  }
27
+ try {
28
+ const permissionHookAudit = await (options.getPermissionHookAuditSummaryFn ?? getPermissionHookAuditSummary)(options.permissionHooksHomeDir ?? homedir());
29
+ health['permissionHooks'] = {
30
+ ...summarizePermissionHookHealth(permissionHookAudit),
31
+ installedHosts: permissionHookAudit.installedHosts,
32
+ currentHosts: permissionHookAudit.currentHosts,
33
+ needsRepairHosts: permissionHookAudit.needsRepairHosts,
34
+ diagnosticsPath: permissionHookAudit.diagnosticsPath,
35
+ lastDiagnostic: permissionHookAudit.lastDiagnostic,
36
+ lastStartupRepair: permissionHookAudit.lastStartupRepair,
37
+ };
38
+ }
39
+ catch (error) {
40
+ const message = error instanceof Error ? error.message : String(error);
41
+ health['status'] = 'degraded';
42
+ health['permissionHooks'] = {
43
+ status: 'error',
44
+ message: `Failed to audit permission hook status: ${message}`,
45
+ };
46
+ }
25
47
  res.json(health);
26
48
  });
27
49
  return router;
28
50
  }
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoUm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dlYi9yb3V0ZXMvaGVhbHRoUm91dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBWWpDLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxPQUE0QjtJQUM3RCxNQUFNLE1BQU0sR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUN4QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7SUFFN0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFhLEVBQUUsR0FBYSxFQUFFLEVBQUU7UUFDckQsTUFBTSxNQUFNLEdBQTRCO1lBQ3RDLE1BQU0sRUFBRSxJQUFJO1lBQ1osTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ25ELElBQUksRUFBRTtnQkFDSixLQUFLLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3BDLFVBQVUsRUFBRSxPQUFPLENBQUMsY0FBYyxFQUFFO2FBQ3JDO1NBQ0YsQ0FBQztRQUVGLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRztnQkFDbEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFO2dCQUNyQyxVQUFVLEVBQUUsT0FBTyxDQUFDLGtCQUFrQixFQUFFO2FBQ3pDLENBQUM7UUFDSixDQUFDO1FBRUQsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQixDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEhlYWx0aCBBUEkgcm91dGUgZm9yIHRoZSB1bmlmaWVkIGRldiBjb25zb2xlLlxuICpcbiAqIEdFVCAvYXBpL2hlYWx0aCDigJQgQWdncmVnYXRlZCBoZWFsdGg6IHVwdGltZSwgc2luayBzdGF0cywgU1NFIGNsaWVudCBjb3VudHNcbiAqL1xuXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5TG9nU2luayB9IGZyb20gJy4uLy4uL2xvZ2dpbmcvc2lua3MvTWVtb3J5TG9nU2luay5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeU1ldHJpY3NTaW5rIH0gZnJvbSAnLi4vLi4vbWV0cmljcy9zaW5rcy9NZW1vcnlNZXRyaWNzU2luay5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoUm91dGVzT3B0aW9ucyB7XG4gIG1lbW9yeVNpbms6IE1lbW9yeUxvZ1Npbms7XG4gIG1ldHJpY3NTaW5rPzogTWVtb3J5TWV0cmljc1Npbms7XG4gIGxvZ0NsaWVudENvdW50OiAoKSA9PiBudW1iZXI7XG4gIG1ldHJpY3NDbGllbnRDb3VudDogKCkgPT4gbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSGVhbHRoUm91dGVzKG9wdGlvbnM6IEhlYWx0aFJvdXRlc09wdGlvbnMpOiBSb3V0ZXIge1xuICBjb25zdCByb3V0ZXIgPSBSb3V0ZXIoKTtcbiAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICByb3V0ZXIuZ2V0KCcvaGVhbHRoJywgKF9yZXE6IFJlcXVlc3QsIHJlczogUmVzcG9uc2UpID0+IHtcbiAgICBjb25zdCBoZWFsdGg6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgICAgc3RhdHVzOiAnb2snLFxuICAgICAgdXB0aW1lOiBNYXRoLmZsb29yKChEYXRlLm5vdygpIC0gc3RhcnRUaW1lKSAvIDEwMDApLFxuICAgICAgbG9nczoge1xuICAgICAgICBzdGF0czogb3B0aW9ucy5tZW1vcnlTaW5rLmdldFN0YXRzKCksXG4gICAgICAgIHNzZUNsaWVudHM6IG9wdGlvbnMubG9nQ2xpZW50Q291bnQoKSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGlmIChvcHRpb25zLm1ldHJpY3NTaW5rKSB7XG4gICAgICBoZWFsdGhbJ21ldHJpY3MnXSA9IHtcbiAgICAgICAgc3RhdHM6IG9wdGlvbnMubWV0cmljc1NpbmsuZ2V0U3RhdHMoKSxcbiAgICAgICAgc3NlQ2xpZW50czogb3B0aW9ucy5tZXRyaWNzQ2xpZW50Q291bnQoKSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmVzLmpzb24oaGVhbHRoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIHJvdXRlcjtcbn1cbiJdfQ==
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoUm91dGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3dlYi9yb3V0ZXMvaGVhbHRoUm91dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0dBSUc7QUFFSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWpDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFHbEMsT0FBTyxFQUNMLDZCQUE2QixFQUM3Qiw2QkFBNkIsR0FFOUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQVd4QyxNQUFNLFVBQVUsa0JBQWtCLENBQUMsT0FBNEI7SUFDN0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFDeEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRTdCLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFhLEVBQUUsR0FBYSxFQUFFLEVBQUU7UUFDM0QsTUFBTSxNQUFNLEdBQTRCO1lBQ3RDLE1BQU0sRUFBRSxJQUFJO1lBQ1osTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ25ELElBQUksRUFBRTtnQkFDSixLQUFLLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3BDLFVBQVUsRUFBRSxPQUFPLENBQUMsY0FBYyxFQUFFO2FBQ3JDO1NBQ0YsQ0FBQztRQUVGLElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3hCLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRztnQkFDbEIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxXQUFXLENBQUMsUUFBUSxFQUFFO2dCQUNyQyxVQUFVLEVBQUUsT0FBTyxDQUFDLGtCQUFrQixFQUFFO2FBQ3pDLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLCtCQUErQixJQUFJLDZCQUE2QixDQUFDLENBQzFHLE9BQU8sQ0FBQyxzQkFBc0IsSUFBSSxPQUFPLEVBQUUsQ0FDNUMsQ0FBQztZQUNGLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHO2dCQUMxQixHQUFHLDZCQUE2QixDQUFDLG1CQUFtQixDQUFDO2dCQUNyRCxjQUFjLEVBQUUsbUJBQW1CLENBQUMsY0FBYztnQkFDbEQsWUFBWSxFQUFFLG1CQUFtQixDQUFDLFlBQVk7Z0JBQzlDLGdCQUFnQixFQUFFLG1CQUFtQixDQUFDLGdCQUFnQjtnQkFDdEQsZUFBZSxFQUFFLG1CQUFtQixDQUFDLGVBQWU7Z0JBQ3BELGNBQWMsRUFBRSxtQkFBbUIsQ0FBQyxjQUFjO2dCQUNsRCxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FBQyxpQkFBaUI7YUFDekQsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxPQUFPLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxVQUFVLENBQUM7WUFDOUIsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUc7Z0JBQzFCLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE9BQU8sRUFBRSwyQ0FBMkMsT0FBTyxFQUFFO2FBQzlELENBQUM7UUFDSixDQUFDO1FBRUQsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQixDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEhlYWx0aCBBUEkgcm91dGUgZm9yIHRoZSB1bmlmaWVkIGRldiBjb25zb2xlLlxuICpcbiAqIEdFVCAvYXBpL2hlYWx0aCDigJQgQWdncmVnYXRlZCBoZWFsdGg6IHVwdGltZSwgc2luayBzdGF0cywgU1NFIGNsaWVudCBjb3VudHNcbiAqL1xuXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB0eXBlIHsgUmVxdWVzdCwgUmVzcG9uc2UgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdub2RlOm9zJztcbmltcG9ydCB0eXBlIHsgTWVtb3J5TG9nU2luayB9IGZyb20gJy4uLy4uL2xvZ2dpbmcvc2lua3MvTWVtb3J5TG9nU2luay5qcyc7XG5pbXBvcnQgdHlwZSB7IE1lbW9yeU1ldHJpY3NTaW5rIH0gZnJvbSAnLi4vLi4vbWV0cmljcy9zaW5rcy9NZW1vcnlNZXRyaWNzU2luay5qcyc7XG5pbXBvcnQge1xuICBnZXRQZXJtaXNzaW9uSG9va0F1ZGl0U3VtbWFyeSxcbiAgc3VtbWFyaXplUGVybWlzc2lvbkhvb2tIZWFsdGgsXG4gIHR5cGUgUGVybWlzc2lvbkhvb2tBdWRpdFN1bW1hcnksXG59IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25Ib29rcy5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGVhbHRoUm91dGVzT3B0aW9ucyB7XG4gIG1lbW9yeVNpbms6IE1lbW9yeUxvZ1Npbms7XG4gIG1ldHJpY3NTaW5rPzogTWVtb3J5TWV0cmljc1Npbms7XG4gIGxvZ0NsaWVudENvdW50OiAoKSA9PiBudW1iZXI7XG4gIG1ldHJpY3NDbGllbnRDb3VudDogKCkgPT4gbnVtYmVyO1xuICBwZXJtaXNzaW9uSG9va3NIb21lRGlyPzogc3RyaW5nO1xuICBnZXRQZXJtaXNzaW9uSG9va0F1ZGl0U3VtbWFyeUZuPzogKGhvbWVEaXI6IHN0cmluZykgPT4gUHJvbWlzZTxQZXJtaXNzaW9uSG9va0F1ZGl0U3VtbWFyeT47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVIZWFsdGhSb3V0ZXMob3B0aW9uczogSGVhbHRoUm91dGVzT3B0aW9ucyk6IFJvdXRlciB7XG4gIGNvbnN0IHJvdXRlciA9IFJvdXRlcigpO1xuICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gIHJvdXRlci5nZXQoJy9oZWFsdGgnLCBhc3luYyAoX3JlcTogUmVxdWVzdCwgcmVzOiBSZXNwb25zZSkgPT4ge1xuICAgIGNvbnN0IGhlYWx0aDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICBzdGF0dXM6ICdvaycsXG4gICAgICB1cHRpbWU6IE1hdGguZmxvb3IoKERhdGUubm93KCkgLSBzdGFydFRpbWUpIC8gMTAwMCksXG4gICAgICBsb2dzOiB7XG4gICAgICAgIHN0YXRzOiBvcHRpb25zLm1lbW9yeVNpbmsuZ2V0U3RhdHMoKSxcbiAgICAgICAgc3NlQ2xpZW50czogb3B0aW9ucy5sb2dDbGllbnRDb3VudCgpLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgaWYgKG9wdGlvbnMubWV0cmljc1NpbmspIHtcbiAgICAgIGhlYWx0aFsnbWV0cmljcyddID0ge1xuICAgICAgICBzdGF0czogb3B0aW9ucy5tZXRyaWNzU2luay5nZXRTdGF0cygpLFxuICAgICAgICBzc2VDbGllbnRzOiBvcHRpb25zLm1ldHJpY3NDbGllbnRDb3VudCgpLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGVybWlzc2lvbkhvb2tBdWRpdCA9IGF3YWl0IChvcHRpb25zLmdldFBlcm1pc3Npb25Ib29rQXVkaXRTdW1tYXJ5Rm4gPz8gZ2V0UGVybWlzc2lvbkhvb2tBdWRpdFN1bW1hcnkpKFxuICAgICAgICBvcHRpb25zLnBlcm1pc3Npb25Ib29rc0hvbWVEaXIgPz8gaG9tZWRpcigpLFxuICAgICAgKTtcbiAgICAgIGhlYWx0aFsncGVybWlzc2lvbkhvb2tzJ10gPSB7XG4gICAgICAgIC4uLnN1bW1hcml6ZVBlcm1pc3Npb25Ib29rSGVhbHRoKHBlcm1pc3Npb25Ib29rQXVkaXQpLFxuICAgICAgICBpbnN0YWxsZWRIb3N0czogcGVybWlzc2lvbkhvb2tBdWRpdC5pbnN0YWxsZWRIb3N0cyxcbiAgICAgICAgY3VycmVudEhvc3RzOiBwZXJtaXNzaW9uSG9va0F1ZGl0LmN1cnJlbnRIb3N0cyxcbiAgICAgICAgbmVlZHNSZXBhaXJIb3N0czogcGVybWlzc2lvbkhvb2tBdWRpdC5uZWVkc1JlcGFpckhvc3RzLFxuICAgICAgICBkaWFnbm9zdGljc1BhdGg6IHBlcm1pc3Npb25Ib29rQXVkaXQuZGlhZ25vc3RpY3NQYXRoLFxuICAgICAgICBsYXN0RGlhZ25vc3RpYzogcGVybWlzc2lvbkhvb2tBdWRpdC5sYXN0RGlhZ25vc3RpYyxcbiAgICAgICAgbGFzdFN0YXJ0dXBSZXBhaXI6IHBlcm1pc3Npb25Ib29rQXVkaXQubGFzdFN0YXJ0dXBSZXBhaXIsXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgICAgaGVhbHRoWydzdGF0dXMnXSA9ICdkZWdyYWRlZCc7XG4gICAgICBoZWFsdGhbJ3Blcm1pc3Npb25Ib29rcyddID0ge1xuICAgICAgICBzdGF0dXM6ICdlcnJvcicsXG4gICAgICAgIG1lc3NhZ2U6IGBGYWlsZWQgdG8gYXVkaXQgcGVybWlzc2lvbiBob29rIHN0YXR1czogJHttZXNzYWdlfWAsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJlcy5qc29uKGhlYWx0aCk7XG4gIH0pO1xuXG4gIHJldHVybiByb3V0ZXI7XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"permissionRoutes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/permissionRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAG1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAyV7E;;;GAGG;AACH,MAAM,WAAW,+BAA+B;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,+BAAoC,GAC5C,IAAI,CAiPN"}
1
+ {"version":3,"file":"permissionRoutes.d.ts","sourceRoot":"","sources":["../../../src/web/routes/permissionRoutes.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAgB,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAG1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAgW7E;;;GAGG;AACH,MAAM,WAAW,+BAA+B;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,aAAa,EACtB,OAAO,GAAE,+BAAoC,GAC5C,IAAI,CAqQN"}
@@ -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 { getPermissionHookStatusAsync, reconcilePermissionHookStatus } 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;
@@ -318,6 +318,19 @@ export function registerPermissionRoutes(router, handler, options = {}) {
318
318
  const denyOperations = data.combinedDenyOperations ?? [];
319
319
  const allowOperations = data.combinedAllowOperations ?? [];
320
320
  const confirmOperations = data.combinedConfirmOperations ?? [];
321
+ const hookStartupRepair = getLastPermissionHookStartupRepairSummary();
322
+ const hookDiagnosticsPath = getPermissionHookDiagnosticsPath(authorityHomeDir);
323
+ const hookLastDiagnostic = await readLastPermissionHookDiagnostic(authorityHomeDir);
324
+ const hookHealthHost = hookStatus.host ?? hookHost ?? 'managed-host';
325
+ const hookHealth = summarizePermissionHookHealth({
326
+ installedHosts: hookStatus.installed || hookStatus.assetsPrepared ? [hookHealthHost] : [],
327
+ currentHosts: hookStatus.assetsCurrent ? [hookHealthHost] : [],
328
+ repairedHosts: hookStatus.autoRepaired ? [hookHealthHost] : [],
329
+ needsRepairHosts: hookStatus.needsRepair ? [hookHealthHost] : [],
330
+ diagnosticsPath: hookDiagnosticsPath,
331
+ lastDiagnostic: hookLastDiagnostic,
332
+ lastStartupRepair: hookStartupRepair,
333
+ });
321
334
  res.json({
322
335
  ...(sessionId ? { sessionId } : {}),
323
336
  activeElementCount: data.activeElementCount,
@@ -341,6 +354,12 @@ export function registerPermissionRoutes(router, handler, options = {}) {
341
354
  hookAutoRepaired: hookStatus.autoRepaired,
342
355
  hookNeedsRepair: hookStatus.needsRepair,
343
356
  hookRepairError: hookStatus.repairError,
357
+ hookHealth,
358
+ hookStartupRepair,
359
+ hookDiagnostics: {
360
+ logPath: hookDiagnosticsPath,
361
+ lastEvent: hookLastDiagnostic,
362
+ },
344
363
  authority: authorityState,
345
364
  authoritySupportedHosts: installedAuthorityHosts,
346
365
  authoritySupportedModes: [...PERMISSION_AUTHORITY_MODES],
@@ -435,4 +454,4 @@ function normalizeAuthorityMode(value) {
435
454
  function asStringArray(value) {
436
455
  return Array.isArray(value) ? value.filter((entry) => typeof entry === 'string') : [];
437
456
  }
438
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvblJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy93ZWIvcm91dGVzL3Blcm1pc3Npb25Sb3V0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7R0FPRztBQUVILE9BQU8sT0FBbUIsTUFBTSxTQUFTLENBQUM7QUFDMUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFL0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sOENBQThDLENBQUM7QUFDeEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0QsT0FBTyxFQUFFLDRCQUE0QixFQUFFLDZCQUE2QixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFFN0csT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDbkYsT0FBTyxFQUdMLDBCQUEwQixFQUMxQiwwQkFBMEIsRUFDMUIsNEJBQTRCLEVBQzVCLDBCQUEwQixHQUMzQixNQUFNLG9DQUFvQyxDQUFDO0FBeUQ1QyxNQUFNLG9DQUFvQyxHQUFHLEdBQUcsQ0FBQztBQUNqRCxNQUFNLHFDQUFxQyxHQUFHLE1BQU0sQ0FBQztBQUNyRCxNQUFNLG9CQUFvQixHQUFHLEdBQUcsQ0FBQztBQWFqQyxNQUFNLGdDQUFnQyxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDNUUsTUFBTSxpQ0FBaUMsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUc1RSwwRUFBMEU7QUFDMUUsU0FBUyxhQUFhLENBQUMsR0FBNEIsRUFBRSxJQUFjLEVBQUUsUUFBZ0I7SUFDbkYsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUs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Q0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQW1CLEVBQUUsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ3pHLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFBlcm1pc3Npb24gZXZhbHVhdGlvbiBIVFRQIHJvdXRlcyBhbmQgZGVjaXNpb24gdHJhY2tpbmcuXG4gKlxuICogUHJvdmlkZXM6XG4gKiAtIFBPU1QgL2V2YWx1YXRlX3Blcm1pc3Npb24g4oCUIGV2YWx1YXRlcyB0b29sIHBlcm1pc3Npb25zIHZpYSBNQ1AtQVFMXG4gKiAtIEdFVCAvcGVybWlzc2lvbnMvc3RhdHVzIOKAlCByZXR1cm5zIGN1cnJlbnQgcG9saWNpZXMgYW5kIHJlY2VudCBkZWNpc2lvbnNcbiAqIC0gRGVjaXNpb24gdHJhY2tpbmcgcmluZyBidWZmZXIgZm9yIHRoZSBsaXZlIGRhc2hib2FyZCBmZWVkXG4gKi9cblxuaW1wb3J0IGV4cHJlc3MsIHsgUm91dGVyIH0gZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnbm9kZTpvcyc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBNQ1BBUUxIYW5kbGVyIH0gZnJvbSAnLi4vLi4vaGFuZGxlcnMvbWNwLWFxbC9NQ1BBUUxIYW5kbGVyLmpzJztcbmltcG9ydCB7IGZvcm1hdFBlcm1pc3Npb25SZXNwb25zZSB9IGZyb20gJy4uLy4uL2hhbmRsZXJzL21jcC1hcWwvZXZhbHVhdGVQZXJtaXNzaW9uLmpzJztcbmltcG9ydCB7IGVuc3VyZUxhdGVzdFBvcnRGaWxlIH0gZnJvbSAnLi4vcG9ydERpc2NvdmVyeS5qcyc7XG5pbXBvcnQgeyBnZXRQZXJtaXNzaW9uSG9va1N0YXR1c0FzeW5jLCByZWNvbmNpbGVQZXJtaXNzaW9uSG9va1N0YXR1cyB9IGZyb20gJy4uLy4uL3V0aWxzL3Blcm1pc3Npb25Ib29rcy5qcyc7XG5cbmltcG9ydCB7IFNsaWRpbmdXaW5kb3dSYXRlTGltaXRlciB9IGZyb20gJy4uLy4uL3V0aWxzL1NsaWRpbmdXaW5kb3dSYXRlTGltaXRlci5qcyc7XG5pbXBvcnQge1xuICB0eXBlIFBlcm1pc3Npb25BdXRob3JpdHlIb3N0LFxuICB0eXBlIFBlcm1pc3Npb25BdXRob3JpdHlNb2RlLFxuICBQRVJNSVNTSU9OX0FVVEhPUklUWV9IT1NUUyxcbiAgUEVSTUlTU0lPTl9BVVRIT1JJVFlfTU9ERVMsXG4gIHJlYWRQZXJtaXNzaW9uQXV0aG9yaXR5U3RhdGUsXG4gIHNldFBlcm1pc3Npb25BdXRob3JpdHlNb2RlLFxufSBmcm9tICcuLi8uLi91dGlscy9wZXJtaXNzaW9uQXV0aG9yaXR5LmpzJztcblxuLy8g4pSA4pSAIFBlcm1pc3Npb24gRGVjaXNpb24gVHJhY2tpbmcg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBSaW5nIGJ1ZmZlciBvZiByZWNlbnQgcGVybWlzc2lvbiBkZWNpc2lvbnMgZm9yIHRoZSBsaXZlIGRhc2hib2FyZCBmZWVkLlxuXG5pbnRlcmZhY2UgUGVybWlzc2lvbkRlY2lzaW9uIHtcbiAgaWQ6IHN0cmluZztcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG4gIHNlc3Npb25faWQ/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/IFtdO1xuXG4gICAgICByZXMuanNvbih7XG4gICAgICAgIC4uLihzZXNzaW9uSWQgPyB7IHNlc3Npb25JZCB9IDoge30pLFxuICAgICAgICBhY3RpdmVFbGVtZW50Q291bnQ6IGRhdGEuYWN0aXZlRWxlbWVudENvdW50LFxuICAgICAgICBoYXNBbGxvd2xpc3Q6IGRhdGEuaGFzQWxsb3dsaXN0LFxuICAgICAgICBkZW55UGF0dGVybnMsXG4gICAgICAgIGFsbG93UGF0dGVybnMsXG4gICAgICAgIGNvbmZpcm1QYXR0ZXJucyxcbiAgICAgICAgZGVueU9wZXJhdGlvbnMsXG4gICAgICAgIGFsbG93T3BlcmF0aW9ucyxcbiAgICAgICAgY29uZmlybU9wZXJhdGlvbnMsXG4gICAgICAgIGRlbnlSdWxlczogbWVyZ2VSdWxlQXJyYXlzKGRlbnlQYXR0ZXJucywgZGVueU9wZXJhdGlvbnMpLFxuICAgICAgICBhbGxvd1J1bGVzOiBtZXJnZVJ1bGVBcnJheXMoYWxsb3dQYXR0ZXJucywgYWxsb3dPcGVyYXRpb25zKSxcbiAgICAgICAgY29uZmlybVJ1bGVzOiBtZXJnZVJ1bGVBcnJheXMoY29uZmlybVBhdHRlcm5zLCBjb25maXJtT3BlcmF0aW9ucyksXG4gICAgICAgIGVsZW1lbnRzLFxuICAgICAgICBrbm93blNlc3Npb25zOiBleHRyYWN0S25vd25Qb2xpY3lTZXNzaW9ucyhlbGVtZW50cyksXG4gICAgICAgIHBlcm1pc3Npb25Qcm9tcHRBY3RpdmU6IGRhdGEucGVybWlzc2lvblByb21wdEFjdGl2ZSxcbiAgICAgICAgaG9va0luc3RhbGxlZDogaG9va1N0YXR1cy5pbnN0YWxsZWQsXG4gICAgICAgIGhvb2tIb3N0OiBkYXRhLmhvb2tIb3N0LFxuICAgICAgICBob29rQXNzZXRzUHJlcGFyZWQ6IGhvb2tTdGF0dXMuYXNzZXRzUHJlcGFyZWQsXG4gICAgICAgIGhvb2tBc3NldHNDdXJyZW50OiBob29rU3RhdHVzLmFzc2V0c0N1cnJlbnQsXG4gICAgICAgIGhvb2tBdXRvUmVwYWlyZWQ6IGhvb2tTdGF0dXMuYXV0b1JlcGFpcmVkLFxuICAgICAgICBob29rTmVlZHNSZXBhaXI6IGhvb2tTdGF0dXMubmVlZHNSZXBhaXIsXG4gICAgICAgIGhvb2tSZXBhaXJFcnJvcjogaG9va1N0YXR1cy5yZXBhaXJFcnJvcixcbiAgICAgICAgYXV0aG9yaXR5OiBhdXRob3JpdHlTdGF0ZSxcbiAgICAgICAgYXV0aG9yaXR5U3VwcG9ydGVkSG9zdHM6IGluc3RhbGxlZEF1dGhvcml0eUhvc3RzLFxuICAgICAgICBhdXRob3JpdHlTdXBwb3J0ZWRNb2RlczogWy4uLlBFUk1JU1NJT05fQVVUSE9SSVRZX01PREVTXSxcbiAgICAgICAgYXV0aG9yaXR5QWlNdXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZW5mb3JjZW1lbnRSZWFkeTogZGF0YS5lbmZvcmNlbWVudFJlYWR5LFxuICAgICAgICBpbnZhbGlkUG9saWN5RWxlbWVudENvdW50OiBkYXRhLmludmFsaWRQb2xpY3lFbGVtZW50Q291bnQgPz8gMCxcbiAgICAgICAgYWR2aXNvcnk6IGRhdGEuYWR2aXNvcnksXG4gICAgICAgIHJlY2VudERlY2lzaW9uczogZGVjaXNpb25UcmFja2VyLmdldFJlY2VudERlY2lzaW9ucygpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ1tXZWJVSS9HYXRld2F5XSBwZXJtaXNzaW9ucy9zdGF0dXMgZXJyb3I6JywgZXJyKTtcbiAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHsgZXJyb3I6ICdGYWlsZWQgdG8gZ2V0IHBlcm1pc3Npb24gc3RhdHVzJyB9KTtcbiAgICB9XG4gIH0pO1xuXG4gIHJvdXRlci5nZXQoJy9wZXJtaXNzaW9ucy9hdXRob3JpdHknLCBhc3luYyAoX3JlcSwgcmVzKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGF1dGhvcml0eVN0YXRlID0gYXdhaXQgcmVhZFBlcm1pc3Npb25BdXRob3JpdHlTdGF0ZShhdXRob3JpdHlIb21lRGlyKTtcbiAgICAgIGNvbnN0IGluc3RhbGxlZEF1dGhvcml0eUhvc3RzID0gYXdhaXQgcmVzb2x2ZUluc3RhbGxlZFBlcm1pc3Npb25BdXRob3JpdHlIb3N0cyhcbiAgICAgICAgYXV0aG9yaXR5SG9tZURpcixcbiAgICAgICAgYXV0aG9yaXR5U3RhdGUsXG4gICAgICAgIGF1dG9SZXBhaXJIb29rQXNzZXRzLFxuICAgICAgKTtcbiAgICAgIHJlcy5qc29uKHtcbiAgICAgICAgLi4uYXV0aG9yaXR5U3RhdGUsXG4gICAgICAgIHN1cHBvcnRlZEhvc3RzOiBpbnN0YWxsZWRBdXRob3JpdHlIb3N0cyxcbiAgICAgICAgc3VwcG9ydGVkTW9kZXM6IFsuLi5QRVJNSVNTSU9OX0FVVEhPUklUWV9NT0RFU10sXG4gICAgICAgIGFpTXV0YWJsZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZ2dlci5lcnJvcignW1dlYlVJL0dhdGV3YXldIHBlcm1pc3Npb25zL2F1dGhvcml0eSBlcnJvcjonLCBlcnIpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogJ0ZhaWxlZCB0byBnZXQgcGVybWlzc2lvbiBhdXRob3JpdHknIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgcm91dGVyLnBvc3QoJy9wZXJtaXNzaW9ucy9hdXRob3JpdHknLCBleHByZXNzLmpzb24oKSwgYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhvc3QgPSBub3JtYWxpemVBdXRob3JpdHlIb3N0KHJlcS5ib2R5Py5ob3N0KTtcbiAgICAgIGNvbnN0IG1vZGUgPSBub3JtYWxpemVBdXRob3JpdHlNb2RlKHJlcS5ib2R5Py5tb2RlKTtcbiAgICAgIGNvbnN0IHJlYXNvbiA9IHR5cGVvZiByZXEuYm9keT8ucmVhc29uID09PSAnc3RyaW5nJyAmJiByZXEuYm9keS5yZWFzb24udHJpbSgpICE9PSAnJ1xuICAgICAgICA/IHJlcS5ib2R5LnJlYXNvbi50cmltKClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICghaG9zdCB8fCAhbW9kZSkge1xuICAgICAgICByZXMuc3RhdHVzKDQwMCkuanNvbih7XG4gICAgICAgICAgZXJyb3I6ICdob3N0IGFuZCBtb2RlIGFyZSByZXF1aXJlZCcsXG4gICAgICAgICAgc3VwcG9ydGVkSG9zdHM6IFsuLi5QRVJNSVNTSU9OX0FVVEhPUklUWV9IT1NUU10sXG4gICAgICAgICAgc3VwcG9ydGVkTW9kZXM6IFsuLi5QRVJNSVNTSU9OX0FVVEhPUklUWV9NT0RFU10sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBwb2xpY2llczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAobW9kZSA9PT0gJ2F1dGhvcml0YXRpdmUnKSB7XG4gICAgICAgIGNvbnN0IHBvbGljeVJlc3VsdCA9IGFzU2luZ2xlUmVzdWx0KGF3YWl0IGhhbmRsZXIuaGFuZGxlUmVhZCh7XG4gICAgICAgICAgb3BlcmF0aW9uOiAnZ2V0X2VmZmVjdGl2ZV9jbGlfcG9saWNpZXMnLFxuICAgICAgICAgIHBhcmFtczogeyByZXBvcnRpbmdfc2NvcGU6ICdkYXNoYm9hcmQnIH0sXG4gICAgICAgIH0pKTtcblxuICAgICAgICBpZiAoIXBvbGljeVJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogcG9saWN5UmVzdWx0LmVycm9yIHx8ICdGYWlsZWQgdG8gZmV0Y2ggZWZmZWN0aXZlIHBvbGljaWVzJyB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwb2xpY2llcyA9IHBvbGljeVJlc3VsdC5kYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhdXRob3JpdHlTdGF0ZSA9IGF3YWl0IHNldFBlcm1pc3Npb25BdXRob3JpdHlNb2RlKHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgbW9kZSxcbiAgICAgICAgcmVhc29uLFxuICAgICAgICBob21lRGlyOiBhdXRob3JpdHlIb21lRGlyLFxuICAgICAgICBwb2xpY2llczogbW9kZSA9PT0gJ2F1dGhvcml0YXRpdmUnXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICBjb21iaW5lZEFsbG93UGF0dGVybnM6IGFzU3RyaW5nQXJyYXkocG9saWNpZXM/LmNvbWJpbmVkQWxsb3dQYXR0ZXJucyksXG4gICAgICAgICAgICBjb21iaW5lZENvbmZpcm1QYXR0ZXJuczogYXNTdHJpbmdBcnJheShwb2xpY2llcz8uY29tYmluZWRDb25maXJtUGF0dGVybnMpLFxuICAgICAgICAgICAgY29tYmluZWREZW55UGF0dGVybnM6IGFzU3RyaW5nQXJyYXkocG9saWNpZXM/LmNvbWJpbmVkRGVueVBhdHRlcm5zKSxcbiAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcblxuICAgICAgcmVzLmpzb24oeyBzdWNjZXNzOiB0cnVlLCBhdXRob3JpdHk6IGF1dGhvcml0eVN0YXRlIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICBgW1dlYlVJL0dhdGV3YXldIHBlcm1pc3Npb25zL2F1dGhvcml0eSB1cGRhdGUgZXJyb3IgKGhvc3Q9JHtTdHJpbmcocmVxLmJvZHk/Lmhvc3QgPz8gJycpfSwgbW9kZT0ke1N0cmluZyhyZXEuYm9keT8ubW9kZSA/PyAnJyl9KTpgLFxuICAgICAgICBlcnIsXG4gICAgICApO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe1xuICAgICAgICBlcnJvcjogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6ICdGYWlsZWQgdG8gdXBkYXRlIHBlcm1pc3Npb24gYXV0aG9yaXR5JyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZUF1dGhvcml0eUhvc3QodmFsdWU6IHVua25vd24pOiBQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdCB8IG51bGwge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiBQRVJNSVNTSU9OX0FVVEhPUklUWV9IT1NUUy5pbmNsdWRlcyh2YWx1ZSBhcyBQZXJtaXNzaW9uQXV0aG9yaXR5SG9zdClcbiAgICA/IHZhbHVlIGFzIFBlcm1pc3Npb25BdXRob3JpdHlIb3N0XG4gICAgOiBudWxsO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVBdXRob3JpdHlNb2RlKHZhbHVlOiB1bmtub3duKTogUGVybWlzc2lvbkF1dGhvcml0eU1vZGUgfCBudWxsIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgUEVSTUlTU0lPTl9BVVRIT1JJVFlfTU9ERVMuaW5jbHVkZXModmFsdWUgYXMgUGVybWlzc2lvbkF1dGhvcml0eU1vZGUpXG4gICAgPyB2YWx1ZSBhcyBQZXJtaXNzaW9uQXV0aG9yaXR5TW9kZVxuICAgIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gYXNTdHJpbmdBcnJheSh2YWx1ZTogdW5rbm93bik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuZmlsdGVyKChlbnRyeSk6IGVudHJ5IGlzIHN0cmluZyA9PiB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnKSA6IFtdO1xufVxuIl19
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=
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/web/server.ts"],"names":[],"mappings":"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"}