@dollhousemcp/mcp-server 2.0.15 → 2.0.17

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 (53) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/README.md.backup +18 -0
  3. package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
  4. package/dist/elements/base/BaseElementManager.js +17 -1
  5. package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
  6. package/dist/elements/memories/MemoryManager.js +13 -2
  7. package/dist/generated/version.d.ts +2 -2
  8. package/dist/generated/version.js +3 -3
  9. package/dist/handlers/ElementCRUDHandler.d.ts.map +1 -1
  10. package/dist/handlers/ElementCRUDHandler.js +7 -3
  11. package/dist/handlers/element-crud/createElement.d.ts.map +1 -1
  12. package/dist/handlers/element-crud/createElement.js +6 -2
  13. package/dist/handlers/element-crud/editElement.d.ts.map +1 -1
  14. package/dist/handlers/element-crud/editElement.js +6 -2
  15. package/dist/handlers/element-crud/helpers.d.ts +2 -0
  16. package/dist/handlers/element-crud/helpers.d.ts.map +1 -1
  17. package/dist/handlers/element-crud/helpers.js +21 -2
  18. package/dist/handlers/mcp-aql/IntrospectionResolver.d.ts.map +1 -1
  19. package/dist/handlers/mcp-aql/IntrospectionResolver.js +34 -7
  20. package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
  21. package/dist/handlers/mcp-aql/MCPAQLHandler.js +51 -20
  22. package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
  23. package/dist/handlers/mcp-aql/OperationSchema.js +6 -4
  24. package/dist/handlers/mcp-aql/evaluatePermission.d.ts +2 -1
  25. package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -1
  26. package/dist/handlers/mcp-aql/evaluatePermission.js +23 -11
  27. package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts +8 -0
  28. package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts.map +1 -1
  29. package/dist/handlers/mcp-aql/policies/ElementPolicies.js +26 -1
  30. package/dist/handlers/strategies/BaseActivationStrategy.d.ts.map +1 -1
  31. package/dist/handlers/strategies/BaseActivationStrategy.js +12 -3
  32. package/dist/handlers/strategies/PersonaActivationStrategy.js +2 -2
  33. package/dist/utils/permissionHooks.d.ts +74 -0
  34. package/dist/utils/permissionHooks.d.ts.map +1 -0
  35. package/dist/utils/permissionHooks.js +771 -0
  36. package/dist/web/public/index.html +12 -6
  37. package/dist/web/public/permissions.css +11 -0
  38. package/dist/web/public/permissions.js +78 -35
  39. package/dist/web/public/setup.css +172 -1
  40. package/dist/web/public/setup.js +644 -38
  41. package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
  42. package/dist/web/routes/permissionRoutes.js +95 -27
  43. package/dist/web/routes/setupRoutes.d.ts +4 -0
  44. package/dist/web/routes/setupRoutes.d.ts.map +1 -1
  45. package/dist/web/routes/setupRoutes.js +122 -39
  46. package/package.json +8 -1
  47. package/scripts/pretooluse-codex.sh +6 -0
  48. package/scripts/pretooluse-cursor.sh +6 -0
  49. package/scripts/pretooluse-dollhouse.sh +110 -0
  50. package/scripts/pretooluse-gemini.sh +6 -0
  51. package/scripts/pretooluse-vscode.sh +163 -0
  52. package/scripts/pretooluse-windsurf.sh +168 -0
  53. package/server.json +2 -2
@@ -27,7 +27,7 @@ export interface EvaluatePermissionDeps {
27
27
  permissionPromptLimiter: RateLimiter;
28
28
  classifyTool: (toolName: string, toolInput: Record<string, unknown>) => ToolClassificationResult;
29
29
  evaluateCliToolPolicy: (toolName: string, toolInput: Record<string, unknown>, elements: ActiveElement[]) => CliToolPolicyResult;
30
- getActiveElements: () => Promise<ActiveElement[]>;
30
+ getActiveElements: (sessionId?: string) => Promise<ActiveElement[]>;
31
31
  }
32
32
  /** Known platform identifiers */
33
33
  export declare const SUPPORTED_PLATFORMS: string[];
@@ -49,5 +49,6 @@ export declare function evaluatePermission(params: {
49
49
  tool_name?: unknown;
50
50
  input?: unknown;
51
51
  platform?: unknown;
52
+ session_id?: unknown;
52
53
  }, deps: EvaluatePermissionDeps): Promise<Record<string, unknown>>;
53
54
  //# sourceMappingURL=evaluatePermission.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"evaluatePermission.d.ts","sourceRoot":"","sources":["../../../src/handlers/mcp-aql/evaluatePermission.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACtG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,wEAAwE;AACxE,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,SAAgB,KAAK,EAAE,YAAY,GAAG,gBAAgB,GAAG,QAAQ,GAAG,eAAe,CAAC;IACpF,SAAgB,QAAQ,EAAE,MAAM,CAAC;gBAG/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,YAAY,GAAG,gBAAgB,GAAG,QAAQ,GAAG,eAAe,EACnE,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,OAAO;CAOlB;AAED,+CAA+C;AAC/C,MAAM,WAAW,sBAAsB;IACrC,uBAAuB,EAAE,WAAW,CAAC;IACrC,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,wBAAwB,CAAC;IACjG,qBAAqB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,mBAAmB,CAAC;IAChI,iBAAiB,EAAE,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CACnD;AA2CD,iCAAiC;AACjC,eAAO,MAAM,mBAAmB,UAAkC,CAAC;AAEnE;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,EAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAczB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,EACpE,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CA8ClC"}
1
+ {"version":3,"file":"evaluatePermission.d.ts","sourceRoot":"","sources":["../../../src/handlers/mcp-aql/evaluatePermission.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,KAAK,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACtG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,wEAAwE;AACxE,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,SAAgB,KAAK,EAAE,YAAY,GAAG,gBAAgB,GAAG,QAAQ,GAAG,eAAe,CAAC;IACpF,SAAgB,QAAQ,EAAE,MAAM,CAAC;gBAG/B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,YAAY,GAAG,gBAAgB,GAAG,QAAQ,GAAG,eAAe,EACnE,QAAQ,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,OAAO;CAOlB;AAED,+CAA+C;AAC/C,MAAM,WAAW,sBAAsB;IACrC,uBAAuB,EAAE,WAAW,CAAC;IACrC,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,wBAAwB,CAAC;IACjG,qBAAqB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,mBAAmB,CAAC;IAChI,iBAAiB,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;CACrE;AA+CD,iCAAiC;AACjC,eAAO,MAAM,mBAAmB,UAAkC,CAAC;AAiBnE;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,EAClC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAYzB;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAE,EAC1F,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAiDlC"}
@@ -44,13 +44,14 @@ function formatWindsurf(decision, reason) {
44
44
  function formatCodex(decision, reason) {
45
45
  return { hookSpecificOutput: withReason({ permissionDecision: decision === 'ask' ? 'deny' : decision }, reason) };
46
46
  }
47
- /** Claude Code (default): uses 'decision' with 'message' for ask, 'reason' for deny */
47
+ /** Claude Code (default): uses hookSpecificOutput.permissionDecision for PreToolUse */
48
48
  function formatClaudeCode(decision, reason) {
49
- if (decision === 'allow')
50
- return { decision: 'allow' };
51
- if (decision === 'ask')
52
- return withReason({ decision: 'ask' }, reason, 'message');
53
- return withReason({ decision: 'deny' }, reason);
49
+ return {
50
+ hookSpecificOutput: withReason({
51
+ hookEventName: 'PreToolUse',
52
+ permissionDecision: decision,
53
+ }, reason, 'permissionDecisionReason'),
54
+ };
54
55
  }
55
56
  /** Platform formatter lookup */
56
57
  const platformFormatters = {
@@ -58,10 +59,20 @@ const platformFormatters = {
58
59
  cursor: formatCursor,
59
60
  windsurf: formatWindsurf,
60
61
  codex: formatCodex,
62
+ vscode: formatClaudeCode,
61
63
  claude_code: formatClaudeCode,
62
64
  };
63
65
  /** Known platform identifiers */
64
66
  export const SUPPORTED_PLATFORMS = Object.keys(platformFormatters);
67
+ function warnOnUnknownPlatform(platform) {
68
+ void import('../../utils/logger.js')
69
+ .then(({ logger }) => {
70
+ logger.warn(`[evaluatePermission] Unknown platform "${platform}", defaulting to claude_code format. Supported: ${SUPPORTED_PLATFORMS.join(', ')}`);
71
+ })
72
+ .catch((error) => {
73
+ console.warn(`[evaluatePermission] Failed to load logger while handling unknown platform "${platform}".`, error);
74
+ });
75
+ }
65
76
  /**
66
77
  * Format permission evaluation response for platform-specific hook scripts.
67
78
  * Each platform expects a different JSON shape from its hook response.
@@ -77,9 +88,7 @@ export function formatPermissionResponse(decision, platform, _input, reason) {
77
88
  case 'claude_code': return formatClaudeCode(decision, reason);
78
89
  default:
79
90
  // Import lazily to avoid circular dependency at module load time
80
- import('../../utils/logger.js').then(({ logger }) => {
81
- logger.warn(`[evaluatePermission] Unknown platform "${platform}", defaulting to claude_code format. Supported: ${SUPPORTED_PLATFORMS.join(', ')}`);
82
- }).catch(() => { });
91
+ warnOnUnknownPlatform(platform);
83
92
  return formatClaudeCode(decision, reason);
84
93
  }
85
94
  }
@@ -97,6 +106,9 @@ export async function evaluatePermission(params, deps) {
97
106
  ? inputRaw
98
107
  : {};
99
108
  const platform = typeof params.platform === 'string' ? params.platform : 'claude_code';
109
+ const sessionId = typeof params.session_id === 'string' && params.session_id.trim() !== ''
110
+ ? params.session_id
111
+ : undefined;
100
112
  // Rate limit
101
113
  const rateStatus = deps.permissionPromptLimiter.checkLimit();
102
114
  if (!rateStatus.allowed) {
@@ -114,7 +126,7 @@ export async function evaluatePermission(params, deps) {
114
126
  // Stage 2: Element policy evaluation
115
127
  let elements;
116
128
  try {
117
- elements = await deps.getActiveElements();
129
+ elements = await deps.getActiveElements(sessionId);
118
130
  }
119
131
  catch (err) {
120
132
  throw new PermissionEvaluationError(`Failed to fetch active elements for policy evaluation: ${err instanceof Error ? err.message : String(err)}`, 'element_fetch', toolName, err);
@@ -129,4 +141,4 @@ export async function evaluatePermission(params, deps) {
129
141
  // Default: allow
130
142
  return formatPermissionResponse('allow', platform, input);
131
143
  }
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdGVQZXJtaXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2hhbmRsZXJzL21jcC1hcWwvZXZhbHVhdGVQZXJtaXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBTUgsd0VBQXdFO0FBQ3hFLE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxLQUFLO0lBQ2xDLEtBQUssQ0FBK0Q7SUFDcEUsUUFBUSxDQUFTO0lBRWpDLFlBQ0UsT0FBZSxFQUNmLEtBQW1FLEVBQ25FLFFBQWdCLEVBQ2hCLEtBQWU7UUFFZixLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLElBQUksR0FBRywyQkFBMkIsQ0FBQztRQUN4QyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0NBQ0Y7QUFVRCxtRUFBbUU7QUFDbkUsU0FBUyxVQUFVLENBQUMsR0FBNEIsRUFBRSxNQUFlLEVBQUUsR0FBRyxHQUFHLFFBQVE7SUFDL0UsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ2xELENBQUM7QUFFRCw0REFBNEQ7QUFDNUQsU0FBUyxZQUFZLENBQUMsUUFBZ0IsRUFBRSxNQUFlO0lBQ3JELE9BQU8sVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDbEYsQ0FBQztBQUVELDREQUE0RDtBQUM1RCxTQUFT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QUMsQ0FBQztJQUNsRixDQUFDO0lBRUQscUNBQXFDO0lBQ3JDLElBQUksUUFBeUIsQ0FBQztJQUM5QixJQUFJLENBQUM7UUFDSCxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztJQUM1QyxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sSUFBSSx5QkFBeUIsQ0FDakMsMERBQTBELEdBQUcsWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUM1RyxlQUFlLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FDL0IsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztJQUV2RSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEtBQUssTUFBTSxFQUFFLENBQUM7UUFDakMsT0FBTyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUNELElBQUksUUFBUSxDQUFDLFFBQVEsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxPQUFPLHdCQUF3QixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUNwRCxRQUFRLENBQUMsT0FBTyxJQUFJLDBDQUEwQyxDQUFDLENBQUM7SUFDcEUsQ0FBQztJQUVELGlCQUFpQjtJQUNqQixPQUFPLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDNUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGVybWlzc2lvbiBldmFsdWF0aW9uIGZvciBQcmVUb29sVXNlIGhvb2tzIGFjcm9zcyBhbGwgQUkgcGxhdGZvcm1zLlxuICpcbiAqIFByb3ZpZGVzIHRoZSBgZXZhbHVhdGVfcGVybWlzc2lvbmAgTUNQLUFRTCBSRUFEIG9wZXJhdGlvbiwgZW5hYmxpbmdcbiAqIENsYXVkZSBDb2RlLCBDdXJzb3IsIEdlbWluaSBDTEksIFdpbmRzdXJmLCBhbmQgQ29kZXggdG8gdXNlXG4gKiBEb2xsaG91c2VNQ1AgYXMgdGhlaXIgcGVybWlzc2lvbiBldmFsdWF0aW9uIGJhY2tlbmQgdmlhIGhvb2tzLlxuICpcbiAqIFRocmVlLXN0YWdlIGV2YWx1YXRpb24gcGlwZWxpbmU6XG4gKiAxLiBSYXRlIGxpbWl0aW5nIOKAlCBwcmV2ZW50cyBhYnVzZVxuICogMi4gU3RhdGljIHRvb2wgY2xhc3NpZmljYXRpb24g4oCUIGJ1aWx0LWluIGFsbG93L2RlbnkgcnVsZXNcbiAqIDMuIEVsZW1lbnQgcG9saWN5IGV2YWx1YXRpb24g4oCUIGFjdGl2ZSBlbGVtZW50IGdhdGVrZWVwZXIgcG9saWNpZXNcbiAqXG4gKiBSZXR1cm5zIHBsYXRmb3JtLXNwZWNpZmljIHJlc3BvbnNlIGZvcm1hdHMgc28gZWFjaCBwbGF0Zm9ybSdzIGhvb2tcbiAqIHNjcmlwdCByZWNlaXZlcyB0aGUgSlNPTiBzaGFwZSBpdCBleHBlY3RzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmF0ZUxpbWl0ZXIgfSBmcm9tICcuLi8uLi91dGlscy9SYXRlTGltaXRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFRvb2xDbGFzc2lmaWNhdGlvblJlc3VsdCwgQ2xpVG9vbFBvbGljeVJlc3VsdCB9IGZyb20gJy4vcG9saWNpZXMvVG9vbENsYXNzaWZpY2F0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgQWN0aXZlRWxlbWVudCB9IGZyb20gJy4vcG9saWNpZXMvRWxlbWVudFBvbGljaWVzLmpzJztcblxuLyoqIEVycm9yIHRocm93biB3aGVuIHBlcm1pc3Npb24gZXZhbHVhdGlvbiBmYWlscyBhdCBhIHNwZWNpZmljIHN0YWdlICovXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbkV2YWx1YXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IHN0YWdlOiAncmF0ZV9saW1pdCcgfCAnY2xhc3NpZmljYXRpb24nIHwgJ3BvbGljeScgfCAnZWxlbWVudF9mZXRjaCc7XG4gIHB1YmxpYyByZWFkb25seSB0b29sTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBzdGFnZTogJ3JhdGVfbGltaXQnIHwgJ2NsYXNzaWZpY2F0aW9uJyB8ICdwb2xpY3knIHwgJ2VsZW1lbnRfZmV0Y2gnLFxuICAgIHRvb2xOYW1lOiBzdHJpbmcsXG4gICAgY2F1c2U/OiB1bmtub3duLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSA/IHsgY2F1c2UgfSA6IHVuZGVmaW5lZCk7XG4gICAgdGhpcy5uYW1lID0gJ1Blcm1pc3Npb25FdmFsdWF0aW9uRXJyb3InO1xuICAgIHRoaXMuc3RhZ2UgPSBzdGFnZTtcbiAgICB0aGlzLnRvb2xOYW1lID0gdG9vbE5hbWU7XG4gIH1cbn1cblxuLyoqIERlcGVuZGVuY2llcyBpbmplY3RlZCBmcm9tIE1DUEFRTEhhbmRsZXIgKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXZhbHVhdGVQZXJtaXNzaW9uRGVwcyB7XG4gIHBlcm1pc3Npb25Qcm9tcHRMaW1pdGVyOiBSYXRlTGltaXRlcjtcbiAgY2xhc3NpZnlUb29sOiAodG9vbE5hbWU6IHN0cmluZywgdG9vbElucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gVG9vbENsYXNzaWZpY2F0aW9uUmVzdWx0O1xuICBldmFsdWF0ZUNsaVRvb2xQb2xpY3k6ICh0b29sTmFtZTogc3RyaW5nLCB0b29sSW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBlbGVtZW50czogQWN0aXZlRWxlbWVudFtdKSA9PiBDbGlUb29sUG9saWN5UmVzdWx0O1xuICBnZXRBY3RpdmVFbGVtZW50czogKCkgPT4gUHJvbWlzZTxBY3RpdmVFbGVtZW50W10+O1xufVxuXG4vKiogT3B0aW9uYWwgcmVhc29uIGZpZWxkLCBvbmx5IGluY2x1ZGVkIHdoZW4gcmVhc29uIGlzIHByb3ZpZGVkICovXG5mdW5jdGlvbiB3aXRoUmVhc29uKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHJlYXNvbj86IHN0cmluZywga2V5ID0gJ3JlYXNvbicpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiByZWFzb24gPyB7IC4uLm9iaiwgW2tleV06IHJlYXNvbiB9IDogb2JqO1xufVxuXG4vKiogR2VtaW5pOiBtYXBzICdhc2snIHRvICdkZW55JyAobm8gaW50ZXJhY3RpdmUgc3VwcG9ydCkgKi9cbmZ1bmN0aW9uIGZvcm1hdEdlbWluaShkZWNpc2lvbjogc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB3aXRoUmVhc29uKHsgZGVjaXNpb246IGRlY2lzaW9uID09PSAnYXNrJyA/ICdkZW55JyA6IGRlY2lzaW9uIH0sIHJlYXNvbik7XG59XG5cbi8qKiBDdXJzb3I6IHVzZXMgJ3Blcm1pc3Npb24nIGZpZWxkIGluc3RlYWQgb2YgJ2RlY2lzaW9uJyAqL1xuZnVuY3Rpb24gZm9ybWF0Q3Vyc29yKGRlY2lzaW9uOiBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHdpdGhSZWFzb24oeyBwZXJtaXNzaW9uOiBkZWNpc2lvbiB9LCByZWFzb24pO1xufVxuXG4vKiogV2luZHN1cmY6IHVzZXMgYm9vbGVhbiAnYWxsb3dlZCcgZmllbGQgKi9cbmZ1bmN0aW9uIGZvcm1hdFdpbmRzdXJmKGRlY2lzaW9uOiBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHdpdGhSZWFzb24oeyBhbGxvd2VkOiBkZWNpc2lvbiA9PT0gJ2FsbG93JyB9LCByZWFzb24pO1xufVxuXG4vKiogQ29kZXg6IHdyYXBzIGluIGhvb2tTcGVjaWZpY091dHB1dCwgbWFwcyAnYXNrJyB0byAnZGVueScgKi9cbmZ1bmN0aW9uIGZvcm1hdENvZGV4KGRlY2lzaW9uOiBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHsgaG9va1NwZWNpZmljT3V0cHV0OiB3aXRoUmVhc29uKHsgcGVybWlzc2lvbkRlY2lzaW9uOiBkZWNpc2lvbiA9PT0gJ2FzaycgPyAnZGVueScgOiBkZWNpc2lvbiB9LCByZWFzb24pIH07XG59XG5cbi8qKiBDbGF1ZGUgQ29kZSAoZGVmYXVsdCk6IHVzZXMgJ2RlY2lzaW9uJyB3aXRoICdtZXNzYWdlJyBmb3IgYXNrLCAncmVhc29uJyBmb3IgZGVueSAqL1xuZnVuY3Rpb24gZm9ybWF0Q2xhdWRlQ29kZShkZWNpc2lvbjogc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmIChkZWNpc2lvbiA9PT0gJ2FsbG93JykgcmV0dXJuIHsgZGVjaXNpb246ICdhbGxvdycgfTtcbiAgaWYgKGRlY2lzaW9uID09PSAnYXNrJykgcmV0dXJuIHdpdGhSZWFzb24oeyBkZWNpc2lvbjogJ2FzaycgfSwgcmVhc29uLCAnbWVzc2FnZScpO1xuICByZXR1cm4gd2l0aFJlYXNvbih7IGRlY2lzaW9uOiAnZGVueScgfSwgcmVhc29uKTtcbn1cblxuLyoqIFBsYXRmb3JtIGZvcm1hdHRlciBsb29rdXAgKi9cbmNvbnN0IHBsYXRmb3JtRm9ybWF0dGVyczogUmVjb3JkPHN0cmluZywgKGRlY2lzaW9uOiBzdHJpbmcsIHJlYXNvbj86IHN0cmluZykgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj4+ID0ge1xuICBnZW1pbmk6IGZvcm1hdEdlbWluaSxcbiAgY3Vyc29yOiBmb3JtYXRDdXJzb3IsXG4gIHdpbmRzdXJmOiBmb3JtYXRXaW5kc3VyZixcbiAgY29kZXg6IGZvcm1hdENvZGV4LFxuICBjbGF1ZGVfY29kZTogZm9ybWF0Q2xhdWRlQ29kZSxcbn07XG5cbi8qKiBLbm93biBwbGF0Zm9ybSBpZGVudGlmaWVycyAqL1xuZXhwb3J0IGNvbnN0IFNVUFBPUlRFRF9QTEFURk9STVMgPSBPYmplY3Qua2V5cyhwbGF0Zm9ybUZvcm1hdHRlcnMpO1xuXG4vKipcbiAqIEZvcm1hdCBwZXJtaXNzaW9uIGV2YWx1YXRpb24gcmVzcG9uc2UgZm9yIHBsYXRmb3JtLXNwZWNpZmljIGhvb2sgc2NyaXB0cy5cbiAqIEVhY2ggcGxhdGZvcm0gZXhwZWN0cyBhIGRpZmZlcmVudCBKU09OIHNoYXBlIGZyb20gaXRzIGhvb2sgcmVzcG9uc2UuXG4gKlxuICogVW5rbm93biBwbGF0Zm9ybXMgZGVmYXVsdCB0byBjbGF1ZGVfY29kZSBmb3JtYXQgd2l0aCBhIHdhcm5pbmcgbG9nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKFxuICBkZWNpc2lvbjogJ2FsbG93JyB8ICdkZW55JyB8ICdhc2snLFxuICBwbGF0Zm9ybTogc3RyaW5nLFxuICBfaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICByZWFzb24/OiBzdHJpbmcsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICBjYXNlICdnZW1pbmknOiByZXR1cm4gZm9ybWF0R2VtaW5pKGRlY2lzaW9uLCByZWFzb24pO1xuICAgIGNhc2UgJ2N1cnNvcic6IHJldHVybiBmb3JtYXRDdXJzb3IoZGVjaXNpb24sIHJlYXNvbik7XG4gICAgY2FzZSAnd2luZHN1cmYnOiByZXR1cm4gZm9ybWF0V2luZHN1cmYoZGVjaXNpb24sIHJlYXNvbik7XG4gICAgY2FzZSAnY29kZXgnOiByZXR1cm4gZm9ybWF0Q29kZXgoZGVjaXNpb24sIHJlYXNvbik7XG4gICAgY2FzZSAnY2xhdWRlX2NvZGUnOiByZXR1cm4gZm9ybWF0Q2xhdWRlQ29kZShkZWNpc2lvbiwgcmVhc29uKTtcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gSW1wb3J0IGxhemlseSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5IGF0IG1vZHVsZSBsb2FkIHRpbWVcbiAgICAgIGltcG9ydCgnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJykudGhlbigoeyBsb2dnZXIgfSkgPT4ge1xuICAgICAgICBsb2dnZXIud2FybihgW2V2YWx1YXRlUGVybWlzc2lvbl0gVW5rbm93biBwbGF0Zm9ybSBcIiR7cGxhdGZvcm19XCIsIGRlZmF1bHRpbmcgdG8gY2xhdWRlX2NvZGUgZm9ybWF0LiBTdXBwb3J0ZWQ6ICR7U1VQUE9SVEVEX1BMQVRGT1JNUy5qb2luKCcsICcpfWApO1xuICAgICAgfSkuY2F0Y2goKCkgPT4geyAvKiBsb2dnZXIgbm90IGF2YWlsYWJsZSAqLyB9KTtcbiAgICAgIHJldHVybiBmb3JtYXRDbGF1ZGVDb2RlKGRlY2lzaW9uLCByZWFzb24pO1xuICB9XG59XG5cbi8qKlxuICogRXZhbHVhdGUgYSBDTEkgcGVybWlzc2lvbiByZXF1ZXN0IGZvciBQcmVUb29sVXNlIGhvb2tzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUb29sIG5hbWUsIGlucHV0LCBhbmQgdGFyZ2V0IHBsYXRmb3JtXG4gKiBAcGFyYW0gZGVwcyAtIEluamVjdGVkIGRlcGVuZGVuY2llcyBmcm9tIE1DUEFRTEhhbmRsZXJcbiAqIEByZXR1cm5zIFBsYXRmb3JtLWZvcm1hdHRlZCBwZXJtaXNzaW9uIGRlY2lzaW9uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmFsdWF0ZVBlcm1pc3Npb24oXG4gIHBhcmFtczogeyB0b29sX25hbWU/OiB1bmtub3duOyBpbnB1dD86IHVua25vd247IHBsYXRmb3JtPzogdW5rbm93biB9LFxuICBkZXBzOiBFdmFsdWF0ZVBlcm1pc3Npb25EZXBzLFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCB0b29sTmFtZSA9IHR5cGVvZiBwYXJhbXMudG9vbF9uYW1lID09PSAnc3RyaW5nJyA/IHBhcmFtcy50b29sX25hbWUgOiAnJztcbiAgY29uc3QgaW5wdXRSYXcgPSBwYXJhbXMuaW5wdXQ7XG4gIGNvbnN0IGlucHV0ID0gKGlucHV0UmF3ICYmIHR5cGVvZiBpbnB1dFJhdyA9PT0gJ29iamVjdCcpXG4gICAgPyBpbnB1dFJhdyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgIDoge307XG4gIGNvbnN0IHBsYXRmb3JtID0gdHlwZW9mIHBhcmFtcy5wbGF0Zm9ybSA9PT0gJ3N0cmluZycgPyBwYXJhbXMucGxhdGZvcm0gOiAnY2xhdWRlX2NvZGUnO1xuXG4gIC8vIFJhdGUgbGltaXRcbiAgY29uc3QgcmF0ZVN0YXR1cyA9IGRlcHMucGVybWlzc2lvblByb21wdExpbWl0ZXIuY2hlY2tMaW1pdCgpO1xuICBpZiAoIXJhdGVTdGF0dXMuYWxsb3dlZCkge1xuICAgIHJldHVybiBmb3JtYXRQZXJtaXNzaW9uUmVzcG9uc2UoJ2RlbnknLCBwbGF0Zm9ybSwgaW5wdXQsICdSYXRlIGxpbWl0IGV4Y2VlZGVkJyk7XG4gIH1cbiAgZGVwcy5wZXJtaXNzaW9uUHJvbXB0TGltaXRlci5jb25zdW1lVG9rZW4oKTtcblxuICAvLyBTdGFnZSAxOiBTdGF0aWMgY2xhc3NpZmljYXRpb25cbiAgY29uc3QgY2xhc3NpZmljYXRpb24gPSBkZXBzLmNsYXNzaWZ5VG9vbCh0b29sTmFtZSwgaW5wdXQpO1xuICBpZiAoY2xhc3NpZmljYXRpb24uYmVoYXZpb3IgPT09ICdhbGxvdycpIHtcbiAgICByZXR1cm4gZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCBpbnB1dCk7XG4gIH1cbiAgaWYgKGNsYXNzaWZpY2F0aW9uLmJlaGF2aW9yID09PSAnZGVueScpIHtcbiAgICByZXR1cm4gZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdkZW55JywgcGxhdGZvcm0sIGlucHV0LCBjbGFzc2lmaWNhdGlvbi5yZWFzb24pO1xuICB9XG5cbiAgLy8gU3RhZ2UgMjogRWxlbWVudCBwb2xpY3kgZXZhbHVhdGlvblxuICBsZXQgZWxlbWVudHM6IEFjdGl2ZUVsZW1lbnRbXTtcbiAgdHJ5IHtcbiAgICBlbGVtZW50cyA9IGF3YWl0IGRlcHMuZ2V0QWN0aXZlRWxlbWVudHMoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IFBlcm1pc3Npb25FdmFsdWF0aW9uRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGZldGNoIGFjdGl2ZSBlbGVtZW50cyBmb3IgcG9saWN5IGV2YWx1YXRpb246ICR7ZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpfWAsXG4gICAgICAnZWxlbWVudF9mZXRjaCcsIHRvb2xOYW1lLCBlcnIsXG4gICAgKTtcbiAgfVxuICBjb25zdCBkZWNpc2lvbiA9IGRlcHMuZXZhbHVhdGVDbGlUb29sUG9saWN5KHRvb2xOYW1lLCBpbnB1dCwgZWxlbWVudHMpO1xuXG4gIGlmIChkZWNpc2lvbi5iZWhhdmlvciA9PT0gJ2RlbnknKSB7XG4gICAgcmV0dXJuIGZvcm1hdFBlcm1pc3Npb25SZXNwb25zZSgnZGVueScsIHBsYXRmb3JtLCBpbnB1dCwgZGVjaXNpb24ubWVzc2FnZSk7XG4gIH1cbiAgaWYgKGRlY2lzaW9uLmJlaGF2aW9yID09PSAnY29uZmlybScpIHtcbiAgICByZXR1cm4gZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhc2snLCBwbGF0Zm9ybSwgaW5wdXQsXG4gICAgICBkZWNpc2lvbi5tZXNzYWdlIHx8ICdSZXF1aXJlcyBjb25maXJtYXRpb24gcGVyIGVsZW1lbnQgcG9saWN5Jyk7XG4gIH1cblxuICAvLyBEZWZhdWx0OiBhbGxvd1xuICByZXR1cm4gZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdhbGxvdycsIHBsYXRmb3JtLCBpbnB1dCk7XG59XG4iXX0=
144
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdGVQZXJtaXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2hhbmRsZXJzL21jcC1hcWwvZXZhbHVhdGVQZXJtaXNzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBTUgsd0VBQXdFO0FBQ3hFLE1BQU0sT0FBTyx5QkFBMEIsU0FBUSxLQUFLO0lBQ2xDLEtBQUssQ0FBK0Q7SUFDcEUsUUFBUSxDQUFTO0lBRWpDLFlBQ0UsT0FBZSxFQUNmLEtBQW1FLEVBQ25FLFFBQWdCLEVBQ2hCLEtBQWU7UUFFZixLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLElBQUksR0FBRywyQkFBMkIsQ0FBQztRQUN4QyxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0NBQ0Y7QUFVRCxtRUFBbUU7QUFDbkUsU0FBUyxVQUFVLENBQUMsR0FBNEIsRUFBRSxNQUFlLEVBQUUsR0FBRyxHQUFHLFFBQVE7SUFDL0UsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQ2xELENBQUM7QUFFRCw0REFBNEQ7QUFDNUQsU0FBUyxZQUFZLENBQUMsUUFBZ0IsRUFBRSxNQUFlO0lBQ3JELE9BQU8sVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLFFBQVEsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDbEYsQ0FBQztBQUVELDREQUE0RDtBQUM1RCxTQUFT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cEUsQ0FBQztJQUVELGlCQUFpQjtJQUNqQixPQUFPLHdCQUF3QixDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDNUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogUGVybWlzc2lvbiBldmFsdWF0aW9uIGZvciBQcmVUb29sVXNlIGhvb2tzIGFjcm9zcyBhbGwgQUkgcGxhdGZvcm1zLlxuICpcbiAqIFByb3ZpZGVzIHRoZSBgZXZhbHVhdGVfcGVybWlzc2lvbmAgTUNQLUFRTCBSRUFEIG9wZXJhdGlvbiwgZW5hYmxpbmdcbiAqIENsYXVkZSBDb2RlLCBDdXJzb3IsIEdlbWluaSBDTEksIFdpbmRzdXJmLCBhbmQgQ29kZXggdG8gdXNlXG4gKiBEb2xsaG91c2VNQ1AgYXMgdGhlaXIgcGVybWlzc2lvbiBldmFsdWF0aW9uIGJhY2tlbmQgdmlhIGhvb2tzLlxuICpcbiAqIFRocmVlLXN0YWdlIGV2YWx1YXRpb24gcGlwZWxpbmU6XG4gKiAxLiBSYXRlIGxpbWl0aW5nIOKAlCBwcmV2ZW50cyBhYnVzZVxuICogMi4gU3RhdGljIHRvb2wgY2xhc3NpZmljYXRpb24g4oCUIGJ1aWx0LWluIGFsbG93L2RlbnkgcnVsZXNcbiAqIDMuIEVsZW1lbnQgcG9saWN5IGV2YWx1YXRpb24g4oCUIGFjdGl2ZSBlbGVtZW50IGdhdGVrZWVwZXIgcG9saWNpZXNcbiAqXG4gKiBSZXR1cm5zIHBsYXRmb3JtLXNwZWNpZmljIHJlc3BvbnNlIGZvcm1hdHMgc28gZWFjaCBwbGF0Zm9ybSdzIGhvb2tcbiAqIHNjcmlwdCByZWNlaXZlcyB0aGUgSlNPTiBzaGFwZSBpdCBleHBlY3RzLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUmF0ZUxpbWl0ZXIgfSBmcm9tICcuLi8uLi91dGlscy9SYXRlTGltaXRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFRvb2xDbGFzc2lmaWNhdGlvblJlc3VsdCwgQ2xpVG9vbFBvbGljeVJlc3VsdCB9IGZyb20gJy4vcG9saWNpZXMvVG9vbENsYXNzaWZpY2F0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgQWN0aXZlRWxlbWVudCB9IGZyb20gJy4vcG9saWNpZXMvRWxlbWVudFBvbGljaWVzLmpzJztcblxuLyoqIEVycm9yIHRocm93biB3aGVuIHBlcm1pc3Npb24gZXZhbHVhdGlvbiBmYWlscyBhdCBhIHNwZWNpZmljIHN0YWdlICovXG5leHBvcnQgY2xhc3MgUGVybWlzc2lvbkV2YWx1YXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IHN0YWdlOiAncmF0ZV9saW1pdCcgfCAnY2xhc3NpZmljYXRpb24nIHwgJ3BvbGljeScgfCAnZWxlbWVudF9mZXRjaCc7XG4gIHB1YmxpYyByZWFkb25seSB0b29sTmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICBzdGFnZTogJ3JhdGVfbGltaXQnIHwgJ2NsYXNzaWZpY2F0aW9uJyB8ICdwb2xpY3knIHwgJ2VsZW1lbnRfZmV0Y2gnLFxuICAgIHRvb2xOYW1lOiBzdHJpbmcsXG4gICAgY2F1c2U/OiB1bmtub3duLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSA/IHsgY2F1c2UgfSA6IHVuZGVmaW5lZCk7XG4gICAgdGhpcy5uYW1lID0gJ1Blcm1pc3Npb25FdmFsdWF0aW9uRXJyb3InO1xuICAgIHRoaXMuc3RhZ2UgPSBzdGFnZTtcbiAgICB0aGlzLnRvb2xOYW1lID0gdG9vbE5hbWU7XG4gIH1cbn1cblxuLyoqIERlcGVuZGVuY2llcyBpbmplY3RlZCBmcm9tIE1DUEFRTEhhbmRsZXIgKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXZhbHVhdGVQZXJtaXNzaW9uRGVwcyB7XG4gIHBlcm1pc3Npb25Qcm9tcHRMaW1pdGVyOiBSYXRlTGltaXRlcjtcbiAgY2xhc3NpZnlUb29sOiAodG9vbE5hbWU6IHN0cmluZywgdG9vbElucHV0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gVG9vbENsYXNzaWZpY2F0aW9uUmVzdWx0O1xuICBldmFsdWF0ZUNsaVRvb2xQb2xpY3k6ICh0b29sTmFtZTogc3RyaW5nLCB0b29sSW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBlbGVtZW50czogQWN0aXZlRWxlbWVudFtdKSA9PiBDbGlUb29sUG9saWN5UmVzdWx0O1xuICBnZXRBY3RpdmVFbGVtZW50czogKHNlc3Npb25JZD86IHN0cmluZykgPT4gUHJvbWlzZTxBY3RpdmVFbGVtZW50W10+O1xufVxuXG4vKiogT3B0aW9uYWwgcmVhc29uIGZpZWxkLCBvbmx5IGluY2x1ZGVkIHdoZW4gcmVhc29uIGlzIHByb3ZpZGVkICovXG5mdW5jdGlvbiB3aXRoUmVhc29uKG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHJlYXNvbj86IHN0cmluZywga2V5ID0gJ3JlYXNvbicpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiByZWFzb24gPyB7IC4uLm9iaiwgW2tleV06IHJlYXNvbiB9IDogb2JqO1xufVxuXG4vKiogR2VtaW5pOiBtYXBzICdhc2snIHRvICdkZW55JyAobm8gaW50ZXJhY3RpdmUgc3VwcG9ydCkgKi9cbmZ1bmN0aW9uIGZvcm1hdEdlbWluaShkZWNpc2lvbjogc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB3aXRoUmVhc29uKHsgZGVjaXNpb246IGRlY2lzaW9uID09PSAnYXNrJyA/ICdkZW55JyA6IGRlY2lzaW9uIH0sIHJlYXNvbik7XG59XG5cbi8qKiBDdXJzb3I6IHVzZXMgJ3Blcm1pc3Npb24nIGZpZWxkIGluc3RlYWQgb2YgJ2RlY2lzaW9uJyAqL1xuZnVuY3Rpb24gZm9ybWF0Q3Vyc29yKGRlY2lzaW9uOiBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHdpdGhSZWFzb24oeyBwZXJtaXNzaW9uOiBkZWNpc2lvbiB9LCByZWFzb24pO1xufVxuXG4vKiogV2luZHN1cmY6IHVzZXMgYm9vbGVhbiAnYWxsb3dlZCcgZmllbGQgKi9cbmZ1bmN0aW9uIGZvcm1hdFdpbmRzdXJmKGRlY2lzaW9uOiBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHdpdGhSZWFzb24oeyBhbGxvd2VkOiBkZWNpc2lvbiA9PT0gJ2FsbG93JyB9LCByZWFzb24pO1xufVxuXG4vKiogQ29kZXg6IHdyYXBzIGluIGhvb2tTcGVjaWZpY091dHB1dCwgbWFwcyAnYXNrJyB0byAnZGVueScgKi9cbmZ1bmN0aW9uIGZvcm1hdENvZGV4KGRlY2lzaW9uOiBzdHJpbmcsIHJlYXNvbj86IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHsgaG9va1NwZWNpZmljT3V0cHV0OiB3aXRoUmVhc29uKHsgcGVybWlzc2lvbkRlY2lzaW9uOiBkZWNpc2lvbiA9PT0gJ2FzaycgPyAnZGVueScgOiBkZWNpc2lvbiB9LCByZWFzb24pIH07XG59XG5cbi8qKiBDbGF1ZGUgQ29kZSAoZGVmYXVsdCk6IHVzZXMgaG9va1NwZWNpZmljT3V0cHV0LnBlcm1pc3Npb25EZWNpc2lvbiBmb3IgUHJlVG9vbFVzZSAqL1xuZnVuY3Rpb24gZm9ybWF0Q2xhdWRlQ29kZShkZWNpc2lvbjogc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB7XG4gICAgaG9va1NwZWNpZmljT3V0cHV0OiB3aXRoUmVhc29uKHtcbiAgICAgIGhvb2tFdmVudE5hbWU6ICdQcmVUb29sVXNlJyxcbiAgICAgIHBlcm1pc3Npb25EZWNpc2lvbjogZGVjaXNpb24sXG4gICAgfSwgcmVhc29uLCAncGVybWlzc2lvbkRlY2lzaW9uUmVhc29uJyksXG4gIH07XG59XG5cbi8qKiBQbGF0Zm9ybSBmb3JtYXR0ZXIgbG9va3VwICovXG5jb25zdCBwbGF0Zm9ybUZvcm1hdHRlcnM6IFJlY29yZDxzdHJpbmcsIChkZWNpc2lvbjogc3RyaW5nLCByZWFzb24/OiBzdHJpbmcpID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+PiA9IHtcbiAgZ2VtaW5pOiBmb3JtYXRHZW1pbmksXG4gIGN1cnNvcjogZm9ybWF0Q3Vyc29yLFxuICB3aW5kc3VyZjogZm9ybWF0V2luZHN1cmYsXG4gIGNvZGV4OiBmb3JtYXRDb2RleCxcbiAgdnNjb2RlOiBmb3JtYXRDbGF1ZGVDb2RlLFxuICBjbGF1ZGVfY29kZTogZm9ybWF0Q2xhdWRlQ29kZSxcbn07XG5cbi8qKiBLbm93biBwbGF0Zm9ybSBpZGVudGlmaWVycyAqL1xuZXhwb3J0IGNvbnN0IFNVUFBPUlRFRF9QTEFURk9STVMgPSBPYmplY3Qua2V5cyhwbGF0Zm9ybUZvcm1hdHRlcnMpO1xuXG5mdW5jdGlvbiB3YXJuT25Vbmtub3duUGxhdGZvcm0ocGxhdGZvcm06IHN0cmluZyk6IHZvaWQge1xuICB2b2lkIGltcG9ydCgnLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJylcbiAgICAudGhlbigoeyBsb2dnZXIgfSkgPT4ge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGBbZXZhbHVhdGVQZXJtaXNzaW9uXSBVbmtub3duIHBsYXRmb3JtIFwiJHtwbGF0Zm9ybX1cIiwgZGVmYXVsdGluZyB0byBjbGF1ZGVfY29kZSBmb3JtYXQuIFN1cHBvcnRlZDogJHtTVVBQT1JURURfUExBVEZPUk1TLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfSlcbiAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZXZhbHVhdGVQZXJtaXNzaW9uXSBGYWlsZWQgdG8gbG9hZCBsb2dnZXIgd2hpbGUgaGFuZGxpbmcgdW5rbm93biBwbGF0Zm9ybSBcIiR7cGxhdGZvcm19XCIuYCxcbiAgICAgICAgZXJyb3IsXG4gICAgICApO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEZvcm1hdCBwZXJtaXNzaW9uIGV2YWx1YXRpb24gcmVzcG9uc2UgZm9yIHBsYXRmb3JtLXNwZWNpZmljIGhvb2sgc2NyaXB0cy5cbiAqIEVhY2ggcGxhdGZvcm0gZXhwZWN0cyBhIGRpZmZlcmVudCBKU09OIHNoYXBlIGZyb20gaXRzIGhvb2sgcmVzcG9uc2UuXG4gKlxuICogVW5rbm93biBwbGF0Zm9ybXMgZGVmYXVsdCB0byBjbGF1ZGVfY29kZSBmb3JtYXQgd2l0aCBhIHdhcm5pbmcgbG9nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKFxuICBkZWNpc2lvbjogJ2FsbG93JyB8ICdkZW55JyB8ICdhc2snLFxuICBwbGF0Zm9ybTogc3RyaW5nLFxuICBfaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICByZWFzb24/OiBzdHJpbmcsXG4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHN3aXRjaCAocGxhdGZvcm0pIHtcbiAgICBjYXNlICdnZW1pbmknOiByZXR1cm4gZm9ybWF0R2VtaW5pKGRlY2lzaW9uLCByZWFzb24pO1xuICAgIGNhc2UgJ2N1cnNvcic6IHJldHVybiBmb3JtYXRDdXJzb3IoZGVjaXNpb24sIHJlYXNvbik7XG4gICAgY2FzZSAnd2luZHN1cmYnOiByZXR1cm4gZm9ybWF0V2luZHN1cmYoZGVjaXNpb24sIHJlYXNvbik7XG4gICAgY2FzZSAnY29kZXgnOiByZXR1cm4gZm9ybWF0Q29kZXgoZGVjaXNpb24sIHJlYXNvbik7XG4gICAgY2FzZSAnY2xhdWRlX2NvZGUnOiByZXR1cm4gZm9ybWF0Q2xhdWRlQ29kZShkZWNpc2lvbiwgcmVhc29uKTtcbiAgICBkZWZhdWx0OlxuICAgICAgLy8gSW1wb3J0IGxhemlseSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5IGF0IG1vZHVsZSBsb2FkIHRpbWVcbiAgICAgIHdhcm5PblVua25vd25QbGF0Zm9ybShwbGF0Zm9ybSk7XG4gICAgICByZXR1cm4gZm9ybWF0Q2xhdWRlQ29kZShkZWNpc2lvbiwgcmVhc29uKTtcbiAgfVxufVxuXG4vKipcbiAqIEV2YWx1YXRlIGEgQ0xJIHBlcm1pc3Npb24gcmVxdWVzdCBmb3IgUHJlVG9vbFVzZSBob29rcy5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVG9vbCBuYW1lLCBpbnB1dCwgYW5kIHRhcmdldCBwbGF0Zm9ybVxuICogQHBhcmFtIGRlcHMgLSBJbmplY3RlZCBkZXBlbmRlbmNpZXMgZnJvbSBNQ1BBUUxIYW5kbGVyXG4gKiBAcmV0dXJucyBQbGF0Zm9ybS1mb3JtYXR0ZWQgcGVybWlzc2lvbiBkZWNpc2lvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXZhbHVhdGVQZXJtaXNzaW9uKFxuICBwYXJhbXM6IHsgdG9vbF9uYW1lPzogdW5rbm93bjsgaW5wdXQ/OiB1bmtub3duOyBwbGF0Zm9ybT86IHVua25vd247IHNlc3Npb25faWQ/OiB1bmtub3duIH0sXG4gIGRlcHM6IEV2YWx1YXRlUGVybWlzc2lvbkRlcHMsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IHRvb2xOYW1lID0gdHlwZW9mIHBhcmFtcy50b29sX25hbWUgPT09ICdzdHJpbmcnID8gcGFyYW1zLnRvb2xfbmFtZSA6ICcnO1xuICBjb25zdCBpbnB1dFJhdyA9IHBhcmFtcy5pbnB1dDtcbiAgY29uc3QgaW5wdXQgPSAoaW5wdXRSYXcgJiYgdHlwZW9mIGlucHV0UmF3ID09PSAnb2JqZWN0JylcbiAgICA/IGlucHV0UmF3IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gICAgOiB7fTtcbiAgY29uc3QgcGxhdGZvcm0gPSB0eXBlb2YgcGFyYW1zLnBsYXRmb3JtID09PSAnc3RyaW5nJyA/IHBhcmFtcy5wbGF0Zm9ybSA6ICdjbGF1ZGVfY29kZSc7XG4gIGNvbnN0IHNlc3Npb25JZCA9IHR5cGVvZiBwYXJhbXMuc2Vzc2lvbl9pZCA9PT0gJ3N0cmluZycgJiYgcGFyYW1zLnNlc3Npb25faWQudHJpbSgpICE9PSAnJ1xuICAgID8gcGFyYW1zLnNlc3Npb25faWRcbiAgICA6IHVuZGVmaW5lZDtcblxuICAvLyBSYXRlIGxpbWl0XG4gIGNvbnN0IHJhdGVTdGF0dXMgPSBkZXBzLnBlcm1pc3Npb25Qcm9tcHRMaW1pdGVyLmNoZWNrTGltaXQoKTtcbiAgaWYgKCFyYXRlU3RhdHVzLmFsbG93ZWQpIHtcbiAgICByZXR1cm4gZm9ybWF0UGVybWlzc2lvblJlc3BvbnNlKCdkZW55JywgcGxhdGZvcm0sIGlucHV0LCAnUmF0ZSBsaW1pdCBleGNlZWRlZCcpO1xuICB9XG4gIGRlcHMucGVybWlzc2lvblByb21wdExpbWl0ZXIuY29uc3VtZVRva2VuKCk7XG5cbiAgLy8gU3RhZ2UgMTogU3RhdGljIGNsYXNzaWZpY2F0aW9uXG4gIGNvbnN0IGNsYXNzaWZpY2F0aW9uID0gZGVwcy5jbGFzc2lmeVRvb2wodG9vbE5hbWUsIGlucHV0KTtcbiAgaWYgKGNsYXNzaWZpY2F0aW9uLmJlaGF2aW9yID09PSAnYWxsb3cnKSB7XG4gICAgcmV0dXJuIGZvcm1hdFBlcm1pc3Npb25SZXNwb25zZSgnYWxsb3cnLCBwbGF0Zm9ybSwgaW5wdXQpO1xuICB9XG4gIGlmIChjbGFzc2lmaWNhdGlvbi5iZWhhdmlvciA9PT0gJ2RlbnknKSB7XG4gICAgcmV0dXJuIGZvcm1hdFBlcm1pc3Npb25SZXNwb25zZSgnZGVueScsIHBsYXRmb3JtLCBpbnB1dCwgY2xhc3NpZmljYXRpb24ucmVhc29uKTtcbiAgfVxuXG4gIC8vIFN0YWdlIDI6IEVsZW1lbnQgcG9saWN5IGV2YWx1YXRpb25cbiAgbGV0IGVsZW1lbnRzOiBBY3RpdmVFbGVtZW50W107XG4gIHRyeSB7XG4gICAgZWxlbWVudHMgPSBhd2FpdCBkZXBzLmdldEFjdGl2ZUVsZW1lbnRzKHNlc3Npb25JZCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBQZXJtaXNzaW9uRXZhbHVhdGlvbkVycm9yKFxuICAgICAgYEZhaWxlZCB0byBmZXRjaCBhY3RpdmUgZWxlbWVudHMgZm9yIHBvbGljeSBldmFsdWF0aW9uOiAke2VyciBpbnN0YW5jZW9mIEVycm9yID8gZXJyLm1lc3NhZ2UgOiBTdHJpbmcoZXJyKX1gLFxuICAgICAgJ2VsZW1lbnRfZmV0Y2gnLCB0b29sTmFtZSwgZXJyLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZGVjaXNpb24gPSBkZXBzLmV2YWx1YXRlQ2xpVG9vbFBvbGljeSh0b29sTmFtZSwgaW5wdXQsIGVsZW1lbnRzKTtcblxuICBpZiAoZGVjaXNpb24uYmVoYXZpb3IgPT09ICdkZW55Jykge1xuICAgIHJldHVybiBmb3JtYXRQZXJtaXNzaW9uUmVzcG9uc2UoJ2RlbnknLCBwbGF0Zm9ybSwgaW5wdXQsIGRlY2lzaW9uLm1lc3NhZ2UpO1xuICB9XG4gIGlmIChkZWNpc2lvbi5iZWhhdmlvciA9PT0gJ2NvbmZpcm0nKSB7XG4gICAgcmV0dXJuIGZvcm1hdFBlcm1pc3Npb25SZXNwb25zZSgnYXNrJywgcGxhdGZvcm0sIGlucHV0LFxuICAgICAgZGVjaXNpb24ubWVzc2FnZSB8fCAnUmVxdWlyZXMgY29uZmlybWF0aW9uIHBlciBlbGVtZW50IHBvbGljeScpO1xuICB9XG5cbiAgLy8gRGVmYXVsdDogYWxsb3dcbiAgcmV0dXJuIGZvcm1hdFBlcm1pc3Npb25SZXNwb25zZSgnYWxsb3cnLCBwbGF0Zm9ybSwgaW5wdXQpO1xufVxuIl19
@@ -81,6 +81,14 @@ export declare function createDecisionFromPolicy(operation: string, result: Elem
81
81
  * @throws Error if the policy is malformed
82
82
  */
83
83
  export declare function parseElementPolicy(metadata: unknown): ElementGatekeeperPolicy | undefined;
84
+ /**
85
+ * Validate authored gatekeeper input before save.
86
+ *
87
+ * Authoring-time validation is stricter than load-time sanitization: it should
88
+ * reject misplaced policy blocks instead of silently saving an element that
89
+ * later appears active but has non-enforceable external restrictions.
90
+ */
91
+ export declare function getGatekeeperAuthoringErrors(record: Record<string, unknown> | undefined): string[];
84
92
  /**
85
93
  * Analyze externalRestrictions patterns for common mistakes and suspicious syntax.
86
94
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ElementPolicies.d.ts","sourceRoot":"","sources":["../../../../src/handlers/mcp-aql/policies/ElementPolicies.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,eAAe,EACf,KAAK,uBAAuB,EAE5B,KAAK,kBAAkB,EAExB,MAAM,uBAAuB,CAAC;AAM/B;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,yBAAyB,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,eAAe,EAAE,eAAe,CAAC;IACjC,oDAAoD;IACpD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,mBAAmB,CAAC;IACnE,8DAA8D;IAC9D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC;CAC7E;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,aAAa,EAAE,EAC/B,iBAAiB,CAAC,EAAE,MAAM,GACzB,mBAAmB,CAgGrB;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,mBAAmB,EAC3B,iBAAiB,CAAC,EAAE,MAAM,GACzB,kBAAkB,CA2EpB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,OAAO,GAChB,uBAAuB,GAAG,SAAS,CAmHrC;AAgED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,EAAE,MAAM,GAChB,MAAM,EAAE,CAMV;AA+HD;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAErE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,GACvF;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAS5C;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,GACvF,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAUvC;AAwCD,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,OAAO,EAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,uBAAuB,GAAG,SAAS,CAkCrC"}
1
+ {"version":3,"file":"ElementPolicies.d.ts","sourceRoot":"","sources":["../../../../src/handlers/mcp-aql/policies/ElementPolicies.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EACL,eAAe,EACf,KAAK,uBAAuB,EAE5B,KAAK,kBAAkB,EAExB,MAAM,uBAAuB,CAAC;AAM/B;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,uBAAuB,CAAC;IACrC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,yBAAyB,CAAC;CACrC;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,kEAAkE;IAClE,eAAe,EAAE,eAAe,CAAC;IACjC,oDAAoD;IACpD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,aAAa,CAAC,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,mBAAmB,CAAC;IACnE,8DAA8D;IAC9D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC;CAC7E;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,aAAa,EAAE,EAC/B,iBAAiB,CAAC,EAAE,MAAM,GACzB,mBAAmB,CAgGrB;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,mBAAmB,EAC3B,iBAAiB,CAAC,EAAE,MAAM,GACzB,kBAAkB,CA2EpB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,OAAO,GAChB,uBAAuB,GAAG,SAAS,CAmHrC;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAC1C,MAAM,EAAE,CAsBV;AAgED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,EAAE,EAClB,SAAS,EAAE,MAAM,GAChB,MAAM,EAAE,CAMV;AA+HD;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAErE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,cAAc,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,GACvF;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAS5C;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,CAAC,GACvF,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAUvC;AAwCD,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,OAAO,EAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,uBAAuB,GAAG,SAAS,CAkCrC"}
@@ -304,6 +304,31 @@ export function parseElementPolicy(metadata) {
304
304
  externalRestrictions,
305
305
  };
306
306
  }
307
+ /**
308
+ * Validate authored gatekeeper input before save.
309
+ *
310
+ * Authoring-time validation is stricter than load-time sanitization: it should
311
+ * reject misplaced policy blocks instead of silently saving an element that
312
+ * later appears active but has non-enforceable external restrictions.
313
+ */
314
+ export function getGatekeeperAuthoringErrors(record) {
315
+ if (!record || typeof record !== 'object') {
316
+ return [];
317
+ }
318
+ const errors = [];
319
+ if (Object.hasOwn(record, 'externalRestrictions')) {
320
+ errors.push('Invalid gatekeeper policy: externalRestrictions must be nested under gatekeeper.externalRestrictions');
321
+ }
322
+ if (record.gatekeeper !== undefined) {
323
+ try {
324
+ parseElementPolicy({ gatekeeper: record.gatekeeper });
325
+ }
326
+ catch (error) {
327
+ errors.push(error instanceof Error ? error.message : String(error));
328
+ }
329
+ }
330
+ return errors;
331
+ }
307
332
  /**
308
333
  * Validate that a value is an array of strings.
309
334
  *
@@ -573,4 +598,4 @@ export function sanitizeGatekeeperPolicy(rawPolicy, elementName, elementType) {
573
598
  return undefined;
574
599
  }
575
600
  }
576
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudFBvbGljaWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2hhbmRsZXJzL21jcC1hcWwvcG9saWNpZXMvRWxlbWVudFBvbGljaWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFDTCxlQUFlLEVBSWYsbUJBQW1CLEdBQ3BCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0csT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQTRDM0U7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLFNBQWlCLEVBQ2pCLGNBQStCLEVBQy9CLGlCQUEwQjtJQUUxQixvREFBb0Q7SUFDcEQsSUFBSSxjQUFjLEdBQUcseUJBQXlCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUQsSUFBSSxhQUFpQyxDQUFDO0lBQ3RDLElBQUksYUFBbUQsQ0FBQztJQUN4RCxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDekIsOEZBQThGO0lBQzlGLGdGQUFnRjtJQUNoRixJQUFJLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUMvQixzRkFBc0Y7SUFDdEYsTUFBTSxtQkFBbUIsR0FBMEQsRUFBRSxDQUFDO0lBRXRGLDhDQUE4QztJQUM5QyxLQUFLLE1BQU0sT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLFNBQVM7UUFD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LDZDQUE2QyxXQUFXLEtBQUssV0FBVyxNQUFNLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDckcsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVsZW1lbnQgUG9saWNpZXNcbiAqXG4gKiBIYW5kbGVzIGVsZW1lbnQtYmFzZWQgYWNjZXNzIGNvbnRyb2wgZm9yIHRoZSBHYXRla2VlcGVyLlxuICogQWxsb3dzIEFOWSBEb2xsaG91c2VNQ1AgZWxlbWVudCB0byBkZWZpbmUgcG9saWNpZXMgaW4gaXRzIG1ldGFkYXRhXG4gKiB0aGF0IG92ZXJyaWRlIG9yIHJlc3RyaWN0IHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBwb2xpY2llcy5cbiAqXG4gKiBQb2xpY3kgUmVzb2x1dGlvbiBPcmRlcjpcbiAqIDEuIEFjdGl2ZSBlbGVtZW50IGRlbnkgbGlzdCAoaGlnaGVzdCBwcmlvcml0eSAtIGJsb2NrcyBvcGVyYXRpb24pXG4gKiAyLiBBY3RpdmUgZWxlbWVudCBjb25maXJtIGxpc3QgKHJlcXVpcmVzIGNvbmZpcm1hdGlvbilcbiAqIDMuIEFjdGl2ZSBlbGVtZW50IGFsbG93IGxpc3QgKGF1dG8tYXBwcm92ZXMpXG4gKiA0LiBPcGVyYXRpb24gZGVmYXVsdCBwZXJtaXNzaW9uIChmYWxsYmFjaylcbiAqL1xuXG5pbXBvcnQge1xuICBQZXJtaXNzaW9uTGV2ZWwsXG4gIHR5cGUgRWxlbWVudEdhdGVrZWVwZXJQb2xpY3ksXG4gIHR5cGUgQ2xpQXBwcm92YWxQb2xpY3ksXG4gIHR5cGUgR2F0ZWtlZXBlckRlY2lzaW9uLFxuICBHYXRla2VlcGVyRXJyb3JDb2RlLFxufSBmcm9tICcuLi9HYXRla2VlcGVyVHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdFBlcm1pc3Npb25MZXZlbCwgY2FuT3BlcmF0aW9uQmVFbGV2YXRlZCwgZ2V0T3BlcmF0aW9uUG9saWN5IH0gZnJvbSAnLi9PcGVyYXRpb25Qb2xpY2llcy5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IE1BWF9HTE9CX1BBVFRFUk5fTEVOR1RIIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvcGF0dGVybk1hdGNoZXIuanMnO1xuXG4vKipcbiAqIE1ldGFkYXRhIHN0cnVjdHVyZSBmb3IgZWxlbWVudHMgd2l0aCBHYXRla2VlcGVyIHBvbGljaWVzLlxuICogVGhlICdnYXRla2VlcGVyJyBmaWVsZCBpcyBvcHRpb25hbCBhbmQgY29udGFpbnMgcG9saWN5IGRlZmluaXRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRNZXRhZGF0YVdpdGhQb2xpY3kge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBnYXRla2VlcGVyPzogRWxlbWVudEdhdGVrZWVwZXJQb2xpY3k7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbi8qKlxuICogQWN0aXZlIGVsZW1lbnQgZm9yIHBvbGljeSBldmFsdWF0aW9uLlxuICogUmVwcmVzZW50cyBhbiBlbGVtZW50IGN1cnJlbnRseSBhY3RpdmUgaW4gdGhlIHNlc3Npb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZlRWxlbWVudCB7XG4gIHR5cGU6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBtZXRhZGF0YTogRWxlbWVudE1ldGFkYXRhV2l0aFBvbGljeTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgZWxlbWVudCBwb2xpY3kgcmVzb2x1dGlvbi5cbiAqIENvbnRhaW5zIHRoZSBlZmZlY3RpdmUgcGVybWlzc2lvbiBsZXZlbCBhbmQgcG9saWN5IHNvdXJjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50UG9saWN5UmVzdWx0IHtcbiAgLyoqIEVmZmVjdGl2ZSBwZXJtaXNzaW9uIGxldmVsIGFmdGVyIGVsZW1lbnQgcG9saWN5IGFwcGxpY2F0aW9uICovXG4gIHBlcm1pc3Npb25MZXZlbDogUGVybWlzc2lvbkxldmVsO1xuICAvKiogV2hpY2ggZWxlbWVudCdzIHBvbGljeSBkZXRlcm1pbmVkIHRoaXMgcmVzdWx0ICovXG4gIHNvdXJjZUVsZW1lbnQ/OiBzdHJpbmc7XG4gIC8qKiBUaGUgc3BlY2lmaWMgcG9saWN5IGZpZWxkIHRoYXQgbWF0Y2hlZCAoYWxsb3cvY29uZmlybS9kZW55KSAqL1xuICBtYXRjaGVkUG9saWN5PzogJ2FsbG93JyB8ICdjb25maXJtJyB8ICdkZW55JyB8ICdzY29wZV9yZXN0cmljdGlvbic7XG4gIC8qKiBXaGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIGJsb2NrZWQgYnkgc2NvcGUgcmVzdHJpY3Rpb25zICovXG4gIHNjb3BlQmxvY2tlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFbGVtZW50cyB0aGF0IHdhbnRlZCB0byBhdXRvLWFwcHJvdmUgdGhpcyBvcGVyYXRpb24gYnV0IHdlcmUgb3ZlcnJpZGRlblxuICAgKiBieSBhIGhpZ2hlci1wcmlvcml0eSBjb25maXJtIG9yIGRlbnkgcG9saWN5IGZyb20gYW5vdGhlciBlbGVtZW50LlxuICAgKiBJc3N1ZSAjNjc0OiBhbGxvdyBjYW5ub3Qgb3ZlcnJpZGUgY29uZmlybS5cbiAgICovXG4gIGNvbmZsaWN0aW5nRWxlbWVudHM/OiBBcnJheTx7IG5hbWU6IHN0cmluZzsgd2FudGVkTGV2ZWw6IFBlcm1pc3Npb25MZXZlbCB9Pjtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBlZmZlY3RpdmUgcGVybWlzc2lvbiBsZXZlbCBmb3IgYW4gb3BlcmF0aW9uXG4gKiBjb25zaWRlcmluZyBhbGwgYWN0aXZlIGVsZW1lbnRzIGFuZCB0aGVpciBwb2xpY2llcy5cbiAqXG4gKiBAcGFyYW0gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiB0byBjaGVja1xuICogQHBhcmFtIGFjdGl2ZUVsZW1lbnRzIC0gQ3VycmVudGx5IGFjdGl2ZSBlbGVtZW50cyB3aXRoIHRoZWlyIG1ldGFkYXRhXG4gKiBAcGFyYW0gdGFyZ2V0RWxlbWVudFR5cGUgLSBPcHRpb25hbCBlbGVtZW50IHR5cGUgYmVpbmcgb3BlcmF0ZWQgb25cbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBwb2xpY3kgcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRWxlbWVudFBvbGljeShcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gIGFjdGl2ZUVsZW1lbnRzOiBBY3RpdmVFbGVtZW50W10sXG4gIHRhcmdldEVsZW1lbnRUeXBlPzogc3RyaW5nXG4pOiBFbGVtZW50UG9saWN5UmVzdWx0IHtcbiAgLy8gU3RhcnQgd2l0aCB0aGUgZGVmYXVsdCBvcGVyYXRpb24gcGVybWlzc2lvbiBsZXZlbFxuICBsZXQgZWZmZWN0aXZlTGV2ZWwgPSBnZXREZWZhdWx0UGVybWlzc2lvbkxldmVsKG9wZXJhdGlvbik7XG4gIGxldCBzb3VyY2VFbGVtZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBtYXRjaGVkUG9saWN5OiBFbGVtZW50UG9saWN5UmVzdWx0WydtYXRjaGVkUG9saWN5J107XG4gIGxldCBzY29wZUJsb2NrZWQgPSBmYWxzZTtcbiAgLy8gSXNzdWUgIzY3NDogVHJhY2sgd2hldGhlciBDT05GSVJNIHdhcyBzZXQgYnkgYW4gZWxlbWVudCBwb2xpY3kgKG5vdCBqdXN0IHRoZSByb3V0ZSBkZWZhdWx0KVxuICAvLyBhbGxvdyBjYW4gb3ZlcnJpZGUgdGhlIHJvdXRlIGRlZmF1bHQgYnV0IE5PVCBhbm90aGVyIGVsZW1lbnQncyBjb25maXJtIHBvbGljeVxuICBsZXQgY29uZmlybWVkQnlFbGVtZW50ID0gZmFsc2U7XG4gIC8vIFRyYWNrIGVsZW1lbnRzIHRoYXQgd2FudGVkIGFsbG93IGJ1dCB3ZXJlIG92ZXJyaWRkZW4gYnkgYW4gZWxlbWVudC1zZXQgY29uZmlybS9kZW55XG4gIGNvbnN0IGNvbmZsaWN0aW5nRWxlbWVudHM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyB3YW50ZWRMZXZlbDogUGVybWlzc2lvbkxldmVsIH0+ID0gW107XG5cbiAgLy8gQ2hlY2sgZWFjaCBhY3RpdmUgZWxlbWVudCdzIHBvbGljeSBpbiBvcmRlclxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYWN0aXZlRWxlbWVudHMpIHtcbiAgICBjb25zdCBwb2xpY3kgPSBlbGVtZW50Lm1ldGFkYXRhLmdhdGVrZWVwZXI7XG4gICAgaWYgKCFwb2xpY3kpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIDEuIENoZWNrIGRlbnkgbGlzdCBmaXJzdCAoaGlnaGVzdCBwcmlvcml0eSlcbiAgICBpZiAocG9saWN5LmRlbnk/LmluY2x1ZGVzKG9wZXJhdGlvbikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBlcm1pc3Npb25MZXZlbDogUGVybWlzc2lvbkxldmVsLkRFTlksXG4gICAgICAgIHNvdXJjZUVsZW1lbnQ6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgbWF0Y2hlZFBvbGljeTogJ2RlbnknLFxuICAgICAgICBjb25mbGljdGluZ0VsZW1lbnRzOiBjb25mbGljdGluZ0VsZW1lbnRzLmxlbmd0aCA+IDAgPyBjb25mbGljdGluZ0VsZW1lbnRzIDogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAyLiBDaGVjayBzY29wZSByZXN0cmljdGlvbnNcbiAgICBpZiAodGFyZ2V0RWxlbWVudFR5cGUgJiYgcG9saWN5LnNjb3BlUmVzdHJpY3Rpb25zKSB7XG4gICAgICBjb25zdCB7IGFsbG93ZWRUeXBlcywgYmxvY2tlZFR5cGVzIH0gPSBwb2xpY3kuc2NvcGVSZXN0cmljdGlvbnM7XG5cbiAgICAgIC8vIElmIGFsbG93ZWRUeXBlcyBpcyBzcGVjaWZpZWQsIHRhcmdldCBtdXN0IGJlIGluIHRoZSBsaXN0XG4gICAgICBpZiAoYWxsb3dlZFR5cGVzICYmICFhbGxvd2VkVHlwZXMuaW5jbHVkZXModGFyZ2V0RWxlbWVudFR5cGUpKSB7XG4gICAgICAgIHNjb3BlQmxvY2tlZCA9IHRydWU7XG4gICAgICAgIHNvdXJjZUVsZW1lbnQgPSBlbGVtZW50Lm5hbWU7XG4gICAgICAgIG1hdGNoZWRQb2xpY3kgPSAnc2NvcGVfcmVzdHJpY3Rpb24nO1xuICAgICAgICBjb250aW51ZTsgLy8gQ2hlY2sgb3RoZXIgZWxlbWVudHMsIG1pZ2h0IGhhdmUgZGlmZmVyZW50IHBvbGljeVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBibG9ja2VkVHlwZXMgaXMgc3BlY2lmaWVkLCB0YXJnZXQgbXVzdCBOT1QgYmUgaW4gdGhlIGxpc3RcbiAgICAgIGlmIChibG9ja2VkVHlwZXM/LmluY2x1ZGVzKHRhcmdldEVsZW1lbnRUeXBlKSkge1xuICAgICAgICBzY29wZUJsb2NrZWQgPSB0cnVlO1xuICAgICAgICBzb3VyY2VFbGVtZW50ID0gZWxlbWVudC5uYW1lO1xuICAgICAgICBtYXRjaGVkUG9saWN5ID0gJ3Njb3BlX3Jlc3RyaWN0aW9uJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMy4gQ2hlY2sgY29uZmlybSBsaXN0IChyZXF1aXJlcyBjb25maXJtYXRpb24pXG4gICAgaWYgKHBvbGljeS5jb25maXJtPy5pbmNsdWRlcyhvcGVyYXRpb24pKSB7XG4gICAgICAvLyBEb24ndCBkb3duZ3JhZGUgZnJvbSBERU5ZIG9yIENPTkZJUk1fU0lOR0xFX1VTRVxuICAgICAgaWYgKGVmZmVjdGl2ZUxldmVsICE9PSBQZXJtaXNzaW9uTGV2ZWwuREVOWSkge1xuICAgICAgICBlZmZlY3RpdmVMZXZlbCA9IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NFU1NJT047XG4gICAgICAgIGNvbmZpcm1lZEJ5RWxlbWVudCA9IHRydWU7XG4gICAgICAgIHNvdXJjZUVsZW1lbnQgPSBlbGVtZW50Lm5hbWU7XG4gICAgICAgIG1hdGNoZWRQb2xpY3kgPSAnY29uZmlybSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNC4gQ2hlY2sgYWxsb3cgbGlzdCAoYXV0by1hcHByb3ZlcylcbiAgICAvLyBJc3N1ZSAjNjc0OiBhbGxvdyBDQU4gb3ZlcnJpZGUgdGhlIHJvdXRlIGRlZmF1bHQsIGJ1dCBOT1QgYW5vdGhlciBlbGVtZW50J3MgY29uZmlybSBwb2xpY3kuXG4gICAgLy8gUHJpb3JpdHkgaGllcmFyY2h5OiBlbGVtZW50IGRlbnkgPiBlbGVtZW50IGNvbmZpcm0gPiBlbGVtZW50IGFsbG93ID4gcm91dGUgZGVmYXVsdFxuICAgIGlmIChwb2xpY3kuYWxsb3c/LmluY2x1ZGVzKG9wZXJhdGlvbikpIHtcbiAgICAgIC8vIE9ubHkgZWxldmF0ZSBpZiB0aGUgb3BlcmF0aW9uIGFsbG93cyBlbGV2YXRpb25cbiAgICAgIGlmIChjYW5PcGVyYXRpb25CZUVsZXZhdGVkKG9wZXJhdGlvbikpIHtcbiAgICAgICAgaWYgKCFjb25maXJtZWRCeUVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBObyBlbGVtZW50IGhhcyBjb25maXJtZWQgdGhpcyDigJQgc2FmZSB0byBlbGV2YXRlIChvdmVycmlkZXMgcm91dGUgZGVmYXVsdClcbiAgICAgICAgICBlZmZlY3RpdmVMZXZlbCA9IFBlcm1pc3Npb25MZXZlbC5BVVRPX0FQUFJPVkU7XG4gICAgICAgICAgc291cmNlRWxlbWVudCA9IGVsZW1lbnQubmFtZTtcbiAgICAgICAgICBtYXRjaGVkUG9saWN5ID0gJ2FsbG93JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBbm90aGVyIGVsZW1lbnQncyBjb25maXJtIHBvbGljeSB0YWtlcyBwcmlvcml0eSBvdmVyIHRoaXMgYWxsb3dcbiAgICAgICAgICBjb25mbGljdGluZ0VsZW1lbnRzLnB1c2goeyBuYW1lOiBlbGVtZW50Lm5hbWUsIHdhbnRlZExldmVsOiBQZXJtaXNzaW9uTGV2ZWwuQVVUT19BUFBST1ZFIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSWYgc2NvcGUgd2FzIGJsb2NrZWQgYnkgYWxsIGVsZW1lbnRzIHdpdGggcmVzdHJpY3Rpb25zXG4gIGlmIChzY29wZUJsb2NrZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGVybWlzc2lvbkxldmVsOiBQZXJtaXNzaW9uTGV2ZWwuREVOWSxcbiAgICAgIHNvdXJjZUVsZW1lbnQsXG4gICAgICBtYXRjaGVkUG9saWN5OiAnc2NvcGVfcmVzdHJpY3Rpb24nLFxuICAgICAgc2NvcGVCbG9ja2VkOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBlcm1pc3Npb25MZXZlbDogZWZmZWN0aXZlTGV2ZWwsXG4gICAgc291cmNlRWxlbWVudCxcbiAgICBtYXRjaGVkUG9saWN5LFxuICAgIGNvbmZsaWN0aW5nRWxlbWVudHM6IGNvbmZsaWN0aW5nRWxlbWVudHMubGVuZ3RoID4gMCA/IGNvbmZsaWN0aW5nRWxlbWVudHMgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgR2F0ZWtlZXBlciBkZWNpc2lvbiBmcm9tIGVsZW1lbnQgcG9saWN5IHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24gdGhhdCB3YXMgY2hlY2tlZFxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSBlbGVtZW50IHBvbGljeSByZXNvbHV0aW9uIHJlc3VsdFxuICogQHBhcmFtIHRhcmdldEVsZW1lbnRUeXBlIC0gT3B0aW9uYWwgZWxlbWVudCB0eXBlIGJlaW5nIG9wZXJhdGVkIG9uXG4gKiBAcmV0dXJucyBBIEdhdGVrZWVwZXJEZWNpc2lvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlY2lzaW9uRnJvbVBvbGljeShcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gIHJlc3VsdDogRWxlbWVudFBvbGljeVJlc3VsdCxcbiAgdGFyZ2V0RWxlbWVudFR5cGU/OiBzdHJpbmdcbik6IEdhdGVrZWVwZXJEZWNpc2lvbiB7XG4gIGNvbnN0IHsgcGVybWlzc2lvbkxldmVsLCBzb3VyY2VFbGVtZW50LCBzY29wZUJsb2NrZWQsIGNvbmZsaWN0aW5nRWxlbWVudHMgfSA9IHJlc3VsdDtcblxuICAvLyBIYW5kbGUgREVOWVxuICBpZiAocGVybWlzc2lvbkxldmVsID09PSBQZXJtaXNzaW9uTGV2ZWwuREVOWSkge1xuICAgIGlmIChzY29wZUJsb2NrZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFsbG93ZWQ6IGZhbHNlLFxuICAgICAgICBwZXJtaXNzaW9uTGV2ZWwsXG4gICAgICAgIGVycm9yQ29kZTogR2F0ZWtlZXBlckVycm9yQ29kZS5TQ09QRV9SRVNUUklDVElPTixcbiAgICAgICAgcmVhc29uOiBgT3BlcmF0aW9uIFwiJHtvcGVyYXRpb259XCIgaXMgbm90IGFsbG93ZWQgb24gZWxlbWVudCB0eXBlIFwiJHt0YXJnZXRFbGVtZW50VHlwZX1cIiBkdWUgdG8gc2NvcGUgcmVzdHJpY3Rpb25zIGluIGFjdGl2ZSBlbGVtZW50IFwiJHtzb3VyY2VFbGVtZW50fVwiYCxcbiAgICAgICAgc3VnZ2VzdGlvbjogYERlYWN0aXZhdGUgdGhlIGVsZW1lbnQgXCIke3NvdXJjZUVsZW1lbnR9XCIgb3IgdXNlIGEgZGlmZmVyZW50IGVsZW1lbnQgdHlwZWAsXG4gICAgICAgIHBvbGljeVNvdXJjZTogJ2VsZW1lbnRfcG9saWN5JyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93ZWQ6IGZhbHNlLFxuICAgICAgcGVybWlzc2lvbkxldmVsLFxuICAgICAgZXJyb3JDb2RlOiBHYXRla2VlcGVyRXJyb3JDb2RlLkVMRU1FTlRfUE9MSUNZX1ZJT0xBVElPTixcbiAgICAgIHJlYXNvbjogYE9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiIGlzIGJsb2NrZWQgYnkgYWN0aXZlIGVsZW1lbnQgXCIke3NvdXJjZUVsZW1lbnR9XCIncyBkZW55IHBvbGljeWAsXG4gICAgICBzdWdnZXN0aW9uOiBgRGVhY3RpdmF0ZSB0aGUgZWxlbWVudCBcIiR7c291cmNlRWxlbWVudH1cIiB0byBwcm9jZWVkIHdpdGggdGhpcyBvcGVyYXRpb25gLFxuICAgICAgcG9saWN5U291cmNlOiAnZWxlbWVudF9wb2xpY3knLFxuICAgIH07XG4gIH1cblxuICAvLyBIYW5kbGUgY29uZmlybWF0aW9uIHJlcXVpcmVkXG4gIGlmIChcbiAgICBwZXJtaXNzaW9uTGV2ZWwgPT09IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NFU1NJT04gfHxcbiAgICBwZXJtaXNzaW9uTGV2ZWwgPT09IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NJTkdMRV9VU0VcbiAgKSB7XG4gICAgLy8gQnVpbGQgaHVtYW4tcmVhZGFibGUgcmF0aW9uYWxlIGV4cGxhaW5pbmcgV0hZIGNvbmZpcm1hdGlvbiBpcyBuZWVkZWRcbiAgICBjb25zdCBwb2xpY3kgPSBnZXRPcGVyYXRpb25Qb2xpY3kob3BlcmF0aW9uKTtcbiAgICBjb25zdCBsZXZlbExhYmVsID0gcGVybWlzc2lvbkxldmVsID09PSBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TSU5HTEVfVVNFXG4gICAgICA/ICdyZXF1aXJlcyBjb25maXJtYXRpb24gZWFjaCB0aW1lJ1xuICAgICAgOiAncmVxdWlyZXMgY29uZmlybWF0aW9uIG9uY2UgcGVyIHNlc3Npb24nO1xuXG4gICAgbGV0IHJhdGlvbmFsZTogc3RyaW5nO1xuICAgIGlmIChzb3VyY2VFbGVtZW50ICYmIHJlc3VsdC5tYXRjaGVkUG9saWN5ID09PSAnY29uZmlybScpIHtcbiAgICAgIC8vIEVsZW1lbnQgcG9saWN5IGVsZXZhdGVkIHRoaXMgb3BlcmF0aW9uJ3MgY29uZmlybWF0aW9uIHJlcXVpcmVtZW50XG4gICAgICBjb25zdCBwb2xpY3lEZXRhaWwgPSBwb2xpY3k/LnJhdGlvbmFsZSA/IGAgJHtwb2xpY3kucmF0aW9uYWxlfWAgOiAnJztcbiAgICAgIHJhdGlvbmFsZSA9IGBBY3RpdmUgZWxlbWVudCBcIiR7c291cmNlRWxlbWVudH1cIiBwb2xpY3kgcmVxdWlyZXMgY29uZmlybWF0aW9uIGZvciB0aGlzIG9wZXJhdGlvbi4ke3BvbGljeURldGFpbH1gO1xuICAgIH0gZWxzZSBpZiAocG9saWN5Py5yYXRpb25hbGUpIHtcbiAgICAgIC8vIFJvdXRlLWxldmVsIGRlZmF1bHQgd2l0aCBkb2N1bWVudGVkIHJhdGlvbmFsZVxuICAgICAgcmF0aW9uYWxlID0gcG9saWN5LnJhdGlvbmFsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRW5kcG9pbnQtbGV2ZWwgZGVmYXVsdCwgbm8gc3BlY2lmaWMgcmF0aW9uYWxlXG4gICAgICByYXRpb25hbGUgPSAnVGhpcyBvcGVyYXRpb24gbW9kaWZpZXMgZGF0YSBhbmQgcmVxdWlyZXMgaHVtYW4gYXBwcm92YWwgYmVmb3JlIHByb2NlZWRpbmcnO1xuICAgIH1cblxuICAgIC8vIElzc3VlICM2NzQ6IFN1cmZhY2UgZWxlbWVudHMgdGhhdCB3YW50ZWQgdG8gYXV0by1hcHByb3ZlIGJ1dCB3ZXJlIG92ZXJyaWRkZW5cbiAgICBjb25zdCBjb25mbGljdE5vdGUgPSBjb25mbGljdGluZ0VsZW1lbnRzICYmIGNvbmZsaWN0aW5nRWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgPyBgIChOb3RlOiAke2NvbmZsaWN0aW5nRWxlbWVudHMubWFwKGUgPT4gYFwiJHtlLm5hbWV9XCJgKS5qb2luKCcsICcpfSB3b3VsZCBhdXRvLWFwcHJvdmUgdGhpcyBidXQgJHtjb25mbGljdGluZ0VsZW1lbnRzLmxlbmd0aCA9PT0gMSA/ICdpcycgOiAnYXJlJ30gb3ZlcnJpZGRlbiBieSB0aGUgY29uZmlybSBwb2xpY3kuKWBcbiAgICAgIDogJyc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWxsb3dlZDogZmFsc2UsXG4gICAgICBwZXJtaXNzaW9uTGV2ZWwsXG4gICAgICBlcnJvckNvZGU6IEdhdGVrZWVwZXJFcnJvckNvZGUuQ09ORklSTUFUSU9OX1JFUVVJUkVELFxuICAgICAgcmVhc29uOiBgT3BlcmF0aW9uIFwiJHtvcGVyYXRpb259XCIgJHtsZXZlbExhYmVsfS4gJHtyYXRpb25hbGV9JHtjb25mbGljdE5vdGV9YCxcbiAgICAgIHN1Z2dlc3Rpb246ICdVc2UgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cgdG8gYXBwcm92ZSB0aGlzIG9wZXJhdGlvbicsXG4gICAgICBjb25maXJtYXRpb25QZW5kaW5nOiB0cnVlLFxuICAgICAgcG9saWN5U291cmNlOiBzb3VyY2VFbGVtZW50ID8gJ2VsZW1lbnRfcG9saWN5JyA6ICdvcGVyYXRpb25fZGVmYXVsdCcsXG4gICAgfTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBBVVRPX0FQUFJPVkVcbiAgcmV0dXJuIHtcbiAgICBhbGxvd2VkOiB0cnVlLFxuICAgIHBlcm1pc3Npb25MZXZlbCxcbiAgICByZWFzb246IHNvdXJjZUVsZW1lbnRcbiAgICAgID8gYE9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiIGF1dG8tYXBwcm92ZWQgYnkgZWxlbWVudCBcIiR7c291cmNlRWxlbWVudH1cImBcbiAgICAgIDogYE9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiIGF1dG8tYXBwcm92ZWQgYnkgZGVmYXVsdCBwb2xpY3lgLFxuICAgIHBvbGljeVNvdXJjZTogc291cmNlRWxlbWVudCA/ICdlbGVtZW50X3BvbGljeScgOiAnb3BlcmF0aW9uX2RlZmF1bHQnLFxuICB9O1xufVxuXG4vKipcbiAqIFBhcnNlIGFuZCB2YWxpZGF0ZSBhIEdhdGVrZWVwZXIgcG9saWN5IGZyb20gZWxlbWVudCBtZXRhZGF0YS5cbiAqXG4gKiBAcGFyYW0gbWV0YWRhdGEgLSBUaGUgZWxlbWVudCBtZXRhZGF0YSB0byBwYXJzZVxuICogQHJldHVybnMgVGhlIHBhcnNlZCBwb2xpY3ksIG9yIHVuZGVmaW5lZCBpZiBubyBwb2xpY3kgaXMgZGVmaW5lZFxuICogQHRocm93cyBFcnJvciBpZiB0aGUgcG9saWN5IGlzIG1hbGZvcm1lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFbGVtZW50UG9saWN5KFxuICBtZXRhZGF0YTogdW5rbm93blxuKTogRWxlbWVudEdhdGVrZWVwZXJQb2xpY3kgfCB1bmRlZmluZWQge1xuICBpZiAoIW1ldGFkYXRhIHx8IHR5cGVvZiBtZXRhZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgbWV0YSA9IG1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBnYXRla2VlcGVyID0gbWV0YS5nYXRla2VlcGVyO1xuXG4gIGlmICghZ2F0ZWtlZXBlcikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHlwZW9mIGdhdGVrZWVwZXIgIT09ICdvYmplY3QnIHx8IGdhdGVrZWVwZXIgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZ2F0ZWtlZXBlciBwb2xpY3k6IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICBjb25zdCBwb2xpY3kgPSBnYXRla2VlcGVyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8vIFZhbGlkYXRlIGFuZCBleHRyYWN0IGFsbG93IGxpc3RcbiAgY29uc3QgYWxsb3cgPSB2YWxpZGF0ZVN0cmluZ0FycmF5KHBvbGljeS5hbGxvdywgJ2FsbG93Jyk7XG4gIGNvbnN0IGNvbmZpcm0gPSB2YWxpZGF0ZVN0cmluZ0FycmF5KHBvbGljeS5jb25maXJtLCAnY29uZmlybScpO1xuICBjb25zdCBkZW55ID0gdmFsaWRhdGVTdHJpbmdBcnJheShwb2xpY3kuZGVueSwgJ2RlbnknKTtcblxuICAvLyBWYWxpZGF0ZSBzY29wZSByZXN0cmljdGlvbnNcbiAgbGV0IHNjb3BlUmVzdHJpY3Rpb25zOiBFbGVtZW50R2F0ZWtlZXBlclBvbGljeVsnc2NvcGVSZXN0cmljdGlvbnMnXTtcbiAgaWYgKHBvbGljeS5zY29wZVJlc3RyaWN0aW9ucykge1xuICAgIGlmICh0eXBlb2YgcG9saWN5LnNjb3BlUmVzdHJpY3Rpb25zICE9PSAnb2JqZWN0JyB8fCBwb2xpY3kuc2NvcGVSZXN0cmljdGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogc2NvcGVSZXN0cmljdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG4gICAgY29uc3Qgc3IgPSBwb2xpY3kuc2NvcGVSZXN0cmljdGlvbnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgc2NvcGVSZXN0cmljdGlvbnMgPSB7XG4gICAgICBhbGxvd2VkVHlwZXM6IHZhbGlkYXRlU3RyaW5nQXJyYXkoc3IuYWxsb3dlZFR5cGVzLCAnc2NvcGVSZXN0cmljdGlvbnMuYWxsb3dlZFR5cGVzJyksXG4gICAgICBibG9ja2VkVHlwZXM6IHZhbGlkYXRlU3RyaW5nQXJyYXkoc3IuYmxvY2tlZFR5cGVzLCAnc2NvcGVSZXN0cmljdGlvbnMuYmxvY2tlZFR5cGVzJyksXG4gICAgfTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGV4dGVybmFsIHJlc3RyaWN0aW9ucyAoSXNzdWUgIzYyNSBQaGFzZSAyKVxuICBsZXQgZXh0ZXJuYWxSZXN0cmljdGlvbnM6IEVsZW1lbnRHYXRla2VlcGVyUG9saWN5WydleHRlcm5hbFJlc3RyaWN0aW9ucyddO1xuICBpZiAocG9saWN5LmV4dGVybmFsUmVzdHJpY3Rpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBwb2xpY3kuZXh0ZXJuYWxSZXN0cmljdGlvbnMgIT09ICdvYmplY3QnIHx8IHBvbGljeS5leHRlcm5hbFJlc3RyaWN0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cbiAgICBjb25zdCBlciA9IHBvbGljeS5leHRlcm5hbFJlc3RyaWN0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoIWVyLmRlc2NyaXB0aW9uIHx8IHR5cGVvZiBlci5kZXNjcmlwdGlvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogZXh0ZXJuYWxSZXN0cmljdGlvbnMuZGVzY3JpcHRpb24gaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuICAgIGNvbnN0IGRlbnlQYXR0ZXJucyA9IHZhbGlkYXRlU3RyaW5nQXJyYXkoZXIuZGVueVBhdHRlcm5zLCAnZXh0ZXJuYWxSZXN0cmljdGlvbnMuZGVueVBhdHRlcm5zJyk7XG4gICAgY29uc3QgY29uZmlybVBhdHRlcm5zID0gdmFsaWRhdGVTdHJpbmdBcnJheShlci5jb25maXJtUGF0dGVybnMsICdleHRlcm5hbFJlc3RyaWN0aW9ucy5jb25maXJtUGF0dGVybnMnKTtcbiAgICBjb25zdCBhbGxvd1BhdHRlcm5zID0gdmFsaWRhdGVTdHJpbmdBcnJheShlci5hbGxvd1BhdHRlcm5zLCAnZXh0ZXJuYWxSZXN0cmljdGlvbnMuYWxsb3dQYXR0ZXJucycpO1xuICAgIGlmIChkZW55UGF0dGVybnMpIHZhbGlkYXRlUGF0dGVyblN0cmluZ3MoZGVueVBhdHRlcm5zLCAnZXh0ZXJuYWxSZXN0cmljdGlvbnMuZGVueVBhdHRlcm5zJyk7XG4gICAgaWYgKGNvbmZpcm1QYXR0ZXJucykgdmFsaWRhdGVQYXR0ZXJuU3RyaW5ncyhjb25maXJtUGF0dGVybnMsICdleHRlcm5hbFJlc3RyaWN0aW9ucy5jb25maXJtUGF0dGVybnMnKTtcbiAgICBpZiAoYWxsb3dQYXR0ZXJucykgdmFsaWRhdGVQYXR0ZXJuU3RyaW5ncyhhbGxvd1BhdHRlcm5zLCAnZXh0ZXJuYWxSZXN0cmljdGlvbnMuYWxsb3dQYXR0ZXJucycpO1xuICAgIC8vIFZhbGlkYXRlIGFwcHJvdmFsUG9saWN5IChJc3N1ZSAjNjI1IFBoYXNlIDMpXG4gICAgbGV0IGFwcHJvdmFsUG9saWN5OiBDbGlBcHByb3ZhbFBvbGljeSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoZXIuYXBwcm92YWxQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBlci5hcHByb3ZhbFBvbGljeSAhPT0gJ29iamVjdCcgfHwgZXIuYXBwcm92YWxQb2xpY3kgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgYXAgPSBlci5hcHByb3ZhbFBvbGljeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgLy8gVmFsaWRhdGUgcmVxdWlyZUFwcHJvdmFsXG4gICAgICBsZXQgcmVxdWlyZUFwcHJvdmFsOiAoJ21vZGVyYXRlJyB8ICdkYW5nZXJvdXMnKVtdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGFwLnJlcXVpcmVBcHByb3ZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcC5yZXF1aXJlQXBwcm92YWwpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeS5yZXF1aXJlQXBwcm92YWwgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbGlkTGV2ZWxzID0gbmV3IFNldChbJ21vZGVyYXRlJywgJ2Rhbmdlcm91cyddKTtcbiAgICAgICAgZm9yIChjb25zdCBsZXZlbCBvZiBhcC5yZXF1aXJlQXBwcm92YWwpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGxldmVsICE9PSAnc3RyaW5nJyB8fCAhdmFsaWRMZXZlbHMuaGFzKGxldmVsKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeS5yZXF1aXJlQXBwcm92YWwgY29udGFpbnMgaW52YWxpZCB2YWx1ZSBcIiR7bGV2ZWx9XCIuIE11c3QgYmUgXCJtb2RlcmF0ZVwiIG9yIFwiZGFuZ2Vyb3VzXCIuYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlcXVpcmVBcHByb3ZhbCA9IGFwLnJlcXVpcmVBcHByb3ZhbCBhcyAoJ21vZGVyYXRlJyB8ICdkYW5nZXJvdXMnKVtdO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBkZWZhdWx0U2NvcGVcbiAgICAgIGxldCBkZWZhdWx0U2NvcGU6ICdzaW5nbGUnIHwgJ3Rvb2xfc2Vzc2lvbicgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoYXAuZGVmYXVsdFNjb3BlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFwLmRlZmF1bHRTY29wZSAhPT0gJ3NpbmdsZScgJiYgYXAuZGVmYXVsdFNjb3BlICE9PSAndG9vbF9zZXNzaW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogZXh0ZXJuYWxSZXN0cmljdGlvbnMuYXBwcm92YWxQb2xpY3kuZGVmYXVsdFNjb3BlIG11c3QgYmUgXCJzaW5nbGVcIiBvciBcInRvb2xfc2Vzc2lvblwiLCBnb3QgXCIke2FwLmRlZmF1bHRTY29wZX1cImApO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHRTY29wZSA9IGFwLmRlZmF1bHRTY29wZTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgdHRsU2Vjb25kc1xuICAgICAgbGV0IHR0bFNlY29uZHM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChhcC50dGxTZWNvbmRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhcC50dGxTZWNvbmRzICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzRmluaXRlKGFwLnR0bFNlY29uZHMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeS50dGxTZWNvbmRzIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXAudHRsU2Vjb25kcyA8IDMwIHx8IGFwLnR0bFNlY29uZHMgPiAzNjAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeS50dGxTZWNvbmRzIG11c3QgYmUgYmV0d2VlbiAzMCBhbmQgMzYwMCwgZ290ICR7YXAudHRsU2Vjb25kc31gKTtcbiAgICAgICAgfVxuICAgICAgICB0dGxTZWNvbmRzID0gYXAudHRsU2Vjb25kcztcbiAgICAgIH1cblxuICAgICAgYXBwcm92YWxQb2xpY3kgPSB7IHJlcXVpcmVBcHByb3ZhbCwgZGVmYXVsdFNjb3BlLCB0dGxTZWNvbmRzIH07XG4gICAgfVxuXG4gICAgZXh0ZXJuYWxSZXN0cmljdGlvbnMgPSB7XG4gICAgICBkZXNjcmlwdGlvbjogZXIuZGVzY3JpcHRpb24gYXMgc3RyaW5nLFxuICAgICAgZGVueVBhdHRlcm5zLFxuICAgICAgY29uZmlybVBhdHRlcm5zLFxuICAgICAgYWxsb3dQYXR0ZXJucyxcbiAgICAgIGFwcHJvdmFsUG9saWN5LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFsbG93LFxuICAgIGNvbmZpcm0sXG4gICAgZGVueSxcbiAgICBzY29wZVJlc3RyaWN0aW9ucyxcbiAgICBleHRlcm5hbFJlc3RyaWN0aW9ucyxcbiAgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGEgdmFsdWUgaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gdmFsaWRhdGVcbiAqIEBwYXJhbSBmaWVsZE5hbWUgLSBUaGUgZmllbGQgbmFtZSBmb3IgZXJyb3IgbWVzc2FnZXNcbiAqIEByZXR1cm5zIFRoZSB2YWxpZGF0ZWQgYXJyYXksIG9yIHVuZGVmaW5lZFxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVN0cmluZ0FycmF5KFxuICB2YWx1ZTogdW5rbm93bixcbiAgZmllbGROYW1lOiBzdHJpbmdcbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogJHtmaWVsZE5hbWV9IG11c3QgYmUgYW4gYXJyYXlgKTtcbiAgfVxuXG4gIGlmICghdmFsdWUuZXZlcnkoKGl0ZW0pOiBpdGVtIGlzIHN0cmluZyA9PiB0eXBlb2YgaXRlbSA9PT0gJ3N0cmluZycpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiAke2ZpZWxkTmFtZX0gbXVzdCBjb250YWluIG9ubHkgc3RyaW5nc2ApO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHBhdHRlcm4gc3RyaW5ncyBmb3IgbGVuZ3RoIGFuZCBub24tZW1wdGluZXNzLlxuICpcbiAqIEBwYXJhbSBwYXR0ZXJucyAtIEFycmF5IG9mIHBhdHRlcm4gc3RyaW5ncyB0byB2YWxpZGF0ZVxuICogQHBhcmFtIGZpZWxkTmFtZSAtIEZpZWxkIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzXG4gKiBAdGhyb3dzIEVycm9yIGlmIGFueSBwYXR0ZXJuIGlzIGVtcHR5IG9yIGV4Y2VlZHMgTUFYX0dMT0JfUEFUVEVSTl9MRU5HVEhcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVQYXR0ZXJuU3RyaW5ncyhcbiAgcGF0dGVybnM6IHN0cmluZ1tdLFxuICBmaWVsZE5hbWU6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgIGlmICghcGF0dGVybikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiAke2ZpZWxkTmFtZX0gY29udGFpbnMgYW4gZW1wdHkgcGF0dGVybiBzdHJpbmdgKTtcbiAgICB9XG4gICAgaWYgKHBhdHRlcm4ubGVuZ3RoID4gTUFYX0dMT0JfUEFUVEVSTl9MRU5HVEgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogJHtmaWVsZE5hbWV9IHBhdHRlcm4gZXhjZWVkcyBtYXhpbXVtIGxlbmd0aCBvZiAke01BWF9HTE9CX1BBVFRFUk5fTEVOR1RIfSBjaGFyYWN0ZXJzYCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogS25vd24gQ0xJIHRvb2wgbmFtZXMgdXNlZCBpbiBleHRlcm5hbFJlc3RyaWN0aW9ucyBwYXR0ZXJucy5cbiAqIFBhdHRlcm5zIHNob3VsZCBzdGFydCB3aXRoIG9uZSBvZiB0aGVzZSBmb2xsb3dlZCBieSAnOicgdG8gYmUgZWZmZWN0aXZlLlxuICovXG5jb25zdCBLTk9XTl9UT09MX1BSRUZJWEVTID0gbmV3IFNldChbXG4gICdCYXNoJywgJ0VkaXQnLCAnV3JpdGUnLCAnUmVhZCcsICdHbG9iJywgJ0dyZXAnLFxuICAnV2ViRmV0Y2gnLCAnV2ViU2VhcmNoJywgJ05vdGVib29rRWRpdCcsXG5dKTtcblxuLyoqXG4gKiBSZWdleCBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBubyBtZWFuaW5nIGluIGdsb2Igc3ludGF4LlxuICogVXNlcnMgd2hvIGluY2x1ZGUgdGhlc2UgbGlrZWx5IGludGVuZCByZWdleCBidXQgdGhlIG1hdGNoZXIgb25seSBzdXBwb3J0cyAqIGFuZCA/LlxuICovXG5jb25zdCBSRUdFWF9TWU5UQVhfUEFUVEVSTiA9IC9bfCgpe31bXFxdXFxcXCteJF0vO1xuXG4vKipcbiAqIEFuYWx5emUgZXh0ZXJuYWxSZXN0cmljdGlvbnMgcGF0dGVybnMgZm9yIGNvbW1vbiBtaXN0YWtlcyBhbmQgc3VzcGljaW91cyBzeW50YXguXG4gKlxuICogUmV0dXJucyBub24tZmF0YWwgd2FybmluZ3MgdG8gaGVscCBMTE1zIGFuZCB1c2VycyB3cml0ZSBlZmZlY3RpdmUgcGF0dGVybnMuXG4gKiBEb2VzIE5PVCB0aHJvdyDigJQgdmFsaWRhdGlvbiBlcnJvcnMgYXJlIGhhbmRsZWQgYnkge0BsaW5rIHZhbGlkYXRlUGF0dGVyblN0cmluZ3N9LlxuICpcbiAqIENoZWNrcyBwZXJmb3JtZWQgKElzc3VlICMxNjY0KTpcbiAqIC0gTWlzc2luZyB0b29sIHByZWZpeCAocGF0dGVybiBkb2Vzbid0IHN0YXJ0IHdpdGggVG9vbE5hbWU6KVxuICogLSBPdmVybHkgYnJvYWQgcGF0dGVybnMgKGJhcmUgYCpgIG9yIGBUb29sTmFtZToqYClcbiAqIC0gUmVnZXggc3ludGF4IHRoYXQgd29uJ3Qgd29yayBpbiBnbG9iIG1hdGNoaW5nXG4gKiAtIExlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZVxuICpcbiAqIEBwYXJhbSBwYXR0ZXJucyAtIEFycmF5IG9mIHBhdHRlcm4gc3RyaW5ncyB0byBhbmFseXplXG4gKiBAcGFyYW0gZmllbGROYW1lIC0gRmllbGQgbmFtZSBmb3Igd2FybmluZyBtZXNzYWdlc1xuICogQHJldHVybnMgQXJyYXkgb2Ygd2FybmluZyBtZXNzYWdlcyAoZW1wdHkgaWYgbm8gaXNzdWVzIGZvdW5kKVxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5hbHl6ZVBhdHRlcm5TeW50YXgoXG4gIHBhdHRlcm5zOiBzdHJpbmdbXSxcbiAgZmllbGROYW1lOiBzdHJpbmdcbik6IHN0cmluZ1tdIHtcbiAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBwYXR0ZXJucykge1xuICAgIGFuYWx5emVPbmVQYXR0ZXJuKHBhdHRlcm4sIGZpZWxkTmFtZSwgd2FybmluZ3MpO1xuICB9XG4gIHJldHVybiB3YXJuaW5ncztcbn1cblxuLyoqXG4gKiBBbmFseXplIGEgc2luZ2xlIHBhdHRlcm4gc3RyaW5nIGFuZCBhcHBlbmQgYW55IHdhcm5pbmdzIGZvdW5kLlxuICogRXh0cmFjdGVkIGZyb20ge0BsaW5rIGFuYWx5emVQYXR0ZXJuU3ludGF4fSB0byByZWR1Y2UgY29nbml0aXZlIGNvbXBsZXhpdHkuXG4gKi9cbmZ1bmN0aW9uIGFuYWx5emVPbmVQYXR0ZXJuKFxuICBwYXR0ZXJuOiBzdHJpbmcsXG4gIGZpZWxkTmFtZTogc3RyaW5nLFxuICB3YXJuaW5nczogc3RyaW5nW11cbik6IHZvaWQge1xuICAvLyBDaGVjayBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2VcbiAgaWYgKHBhdHRlcm4gIT09IHBhdHRlcm4udHJpbSgpKSB7XG4gICAgd2FybmluZ3MucHVzaChcbiAgICAgIGAke2ZpZWxkTmFtZX0gcGF0dGVybiAnJHtwYXR0ZXJufScgaGFzIGxlYWRpbmcvdHJhaWxpbmcgd2hpdGVzcGFjZSDigJQgdGhpcyBtYXkgcHJldmVudCBleHBlY3RlZCBtYXRjaGVzYFxuICAgICk7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgYmFyZSB3aWxkY2FyZCAobWF0Y2hlcyBldmVyeXRoaW5nKVxuICBpZiAocGF0dGVybiA9PT0gJyonKSB7XG4gICAgd2FybmluZ3MucHVzaChcbiAgICAgIGAke2ZpZWxkTmFtZX0gcGF0dGVybiAnKicgbWF0Y2hlcyBldmVyeXRoaW5nIOKAlCB0aGlzIGlzIGxpa2VseSB1bmludGVudGlvbmFsYFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIHRvb2wgcHJlZml4IGFuZCByZWxhdGVkIGlzc3Vlc1xuICBjb25zdCBjb2xvbkluZGV4ID0gcGF0dGVybi5pbmRleE9mKCc6Jyk7XG4gIGlmIChjb2xvbkluZGV4ID09PSAtMSkge1xuICAgIHdhcm5pbmdzLnB1c2goXG4gICAgICBgJHtmaWVsZE5hbWV9IHBhdHRlcm4gJyR7cGF0dGVybn0nIGhhcyBubyB0b29sIHByZWZpeCAoZS5nLiwgJ0Jhc2g6JywgJ0VkaXQ6JykuIGAgK1xuICAgICAgYFBhdHRlcm5zIGFyZSBtYXRjaGVkIGFnYWluc3QgJ1Rvb2xOYW1lOmlucHV0JyBzdHJpbmdzIGFuZCB3aWxsIG5vdCBtYXRjaCB3aXRob3V0IGEgcHJlZml4LmBcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIGNoZWNrVG9vbFByZWZpeChwYXR0ZXJuLCBjb2xvbkluZGV4LCBmaWVsZE5hbWUsIHdhcm5pbmdzKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciByZWdleCBzeW50YXggdGhhdCB3b24ndCB3b3JrIGluIGdsb2JcbiAgY29uc3QgcmVnZXhDaGFycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IGNoIG9mIHBhdHRlcm4pIHtcbiAgICBpZiAoUkVHRVhfU1lOVEFYX1BBVFRFUk4udGVzdChjaCkpIHJlZ2V4Q2hhcnMuYWRkKGNoKTtcbiAgfVxuICBpZiAocmVnZXhDaGFycy5zaXplID4gMCkge1xuICAgIHdhcm5pbmdzLnB1c2goXG4gICAgICBgJHtmaWVsZE5hbWV9IHBhdHRlcm4gJyR7cGF0dGVybn0nIGNvbnRhaW5zIHJlZ2V4IHN5bnRheCAnJHtbLi4ucmVnZXhDaGFyc10uam9pbignLCAnKX0nIOKAlCBgICtcbiAgICAgIGBvbmx5IGdsb2Igd2lsZGNhcmRzICgqIGFuZCA/KSBhcmUgc3VwcG9ydGVkYFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayB0b29sIHByZWZpeCB2YWxpZGl0eSBhbmQgYnJvYWRuZXNzIGZvciBhIHBhdHRlcm4gdGhhdCBjb250YWlucyAnOicuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrVG9vbFByZWZpeChcbiAgcGF0dGVybjogc3RyaW5nLFxuICBjb2xvbkluZGV4OiBudW1iZXIsXG4gIGZpZWxkTmFtZTogc3RyaW5nLFxuICB3YXJuaW5nczogc3RyaW5nW11cbik6IHZvaWQge1xuICBjb25zdCBwcmVmaXggPSBwYXR0ZXJuLnNsaWNlKDAsIGNvbG9uSW5kZXgpO1xuICBjb25zdCBhZnRlckNvbG9uID0gcGF0dGVybi5zbGljZShjb2xvbkluZGV4ICsgMSk7XG5cbiAgLy8gQ2hlY2sgZm9yIHVua25vd24gdG9vbCBwcmVmaXhcbiAgaWYgKCFLTk9XTl9UT09MX1BSRUZJWEVTLmhhcyhwcmVmaXgpICYmICFwcmVmaXguc3RhcnRzV2l0aCgnbWNwXycpKSB7XG4gICAgd2FybmluZ3MucHVzaChcbiAgICAgIGAke2ZpZWxkTmFtZX0gcGF0dGVybiAnJHtwYXR0ZXJufScgdXNlcyB1bmtub3duIHRvb2wgcHJlZml4ICcke3ByZWZpeH0nLiBgICtcbiAgICAgIGBLbm93biBwcmVmaXhlczogJHtbLi4uS05PV05fVE9PTF9QUkVGSVhFU10uam9pbignLCAnKX0uIE1DUCB0b29scyB1c2UgJ21jcF8nIHByZWZpeC5gXG4gICAgKTtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciBvdmVybHkgYnJvYWQgVG9vbE5hbWU6KiBwYXR0ZXJuXG4gIGlmIChhZnRlckNvbG9uID09PSAnKicpIHtcbiAgICB3YXJuaW5ncy5wdXNoKFxuICAgICAgYCR7ZmllbGROYW1lfSBwYXR0ZXJuICcke3BhdHRlcm59JyBtYXRjaGVzIEFMTCAke3ByZWZpeH0gb3BlcmF0aW9ucyDigJQgdmVyaWZ5IHRoaXMgaXMgaW50ZW50aW9uYWxgXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlIGFuZCBzYW5pdGl6ZSBhIGdhdGVrZWVwZXIgcG9saWN5IGR1cmluZyBlbGVtZW50IGRlc2VyaWFsaXphdGlvbi5cbiAqXG4gKiBSZXR1cm5zIGEgdmFsaWRhdGVkIHtAbGluayBFbGVtZW50R2F0ZWtlZXBlclBvbGljeX0gaWYgdGhlIHJhdyBkYXRhIGlzXG4gKiBzdHJ1Y3R1cmFsbHkgdmFsaWQsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBkYXRhIGlzIGFic2VudCwgZmFsc3ksIG9yXG4gKiBtYWxmb3JtZWQuIE1hbGZvcm1lZCBwb2xpY2llcyBhcmUgbG9nZ2VkIGFzIHNlY3VyaXR5IGV2ZW50cyBhbmQgc3RyaXBwZWRcbiAqIHNvIHRoZXkgbmV2ZXIgcmVhY2ggdGhlIGVuZm9yY2VtZW50IHBpcGVsaW5lLlxuICpcbiAqIFVzZSB0aGlzIGF0IGV2ZXJ5IGRlc2VyaWFsaXphdGlvbiBib3VuZGFyeSAobWFuYWdlciBgcGFyc2VNZXRhZGF0YWAgL1xuICogYHNhbml0aXplTWV0YWRhdGFgIC8gYHBhcnNlTWVtb3J5RmlsZWApIHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgd2VsbC1mb3JtZWRcbiAqIHBvbGljaWVzIHN1cnZpdmUgbG9hZGluZy5cbiAqXG4gKiBAcGFyYW0gcmF3UG9saWN5IC0gVGhlIHJhdyBnYXRla2VlcGVyIHZhbHVlIGZyb20gcGFyc2VkIFlBTUwvSlNPTlxuICogQHBhcmFtIGVsZW1lbnROYW1lIC0gRWxlbWVudCBuYW1lIGZvciBkaWFnbm9zdGljIGxvZ2dpbmdcbiAqIEBwYXJhbSBlbGVtZW50VHlwZSAtIEVsZW1lbnQgdHlwZSBmb3IgZGlhZ25vc3RpYyBsb2dnaW5nXG4gKiBAcmV0dXJucyBWYWxpZGF0ZWQgcG9saWN5IG9yIHVuZGVmaW5lZFxuICpcbiAqIEBzaW5jZSBJc3N1ZSAjNTI0IOKAlCBSdW50aW1lIHZhbGlkYXRpb24gZm9yIGFsbCBlbGVtZW50IHR5cGVzXG4gKi9cbi8qKlxuICogR2F0ZWtlZXBlciBpbmZyYXN0cnVjdHVyZSBvcGVyYXRpb25zIOKAlCB0d28gcmVsYXRlZCBzZXRzIHdpdGggZGlzdGluY3QgcHVycG9zZXMuXG4gKlxuICogVU5HQVRBQkxFX09QRVJBVElPTlM6IE9wZXJhdGlvbnMgdGhhdCBtdXN0IE5FVkVSIGFwcGVhciBpbiBlbGVtZW50IHBvbGljeSBsaXN0cy5cbiAqIFRoZXNlIGFyZSBwdXJlIGludGVybmFsIHBsdW1iaW5nIOKAlCBnYXRpbmcgdGhlbSBzZXJ2ZXMgbm8gc2VjdXJpdHkgcHVycG9zZSBhbmRcbiAqIGJyZWFrcyBjcml0aWNhbCBmbG93cyAodmVyaWZpY2F0aW9uLCBDTEkgYXBwcm92YWwsIHBlcm1pc3Npb24gZXZhbHVhdGlvbikuXG4gKiBTdHJpcHBlZCBmcm9tIEFMTCBwb2xpY3kgbGlzdHMgKGFsbG93LCBjb25maXJtLCBkZW55KSBkdXJpbmcgc2FuaXRpemF0aW9uLlxuICpcbiAqIEdBVEVLRUVQRVJfSU5GUkFfT1BFUkFUSU9OUzogT3BlcmF0aW9ucyB0aGF0IHNraXAgTGF5ZXIgMiAoZWxlbWVudCBwb2xpY3lcbiAqIHJlc29sdXRpb24pIGR1cmluZyBwcmltYXJ5IGVuZm9yY2VtZW50LiBUaGlzIGlzIGEgU1VQRVJTRVQgb2YgVU5HQVRBQkxFX09QRVJBVElPTlNcbiAqIOKAlCBpdCBhZGRzIGNvbmZpcm1fb3BlcmF0aW9uLCB3aGljaCBJUyBhIHZhbGlkIHBvbGljeSB0YXJnZXQgKGRlbnkgPSBudWNsZWFyIHNhbmRib3gpXG4gKiBidXQgbXVzdCBub3QgYmUgZ2F0ZWQgdGhyb3VnaCB0aGUgbm9ybWFsIGVuZm9yY2UoKSBwYXRoICh0aGF0IGNyZWF0ZXMgdGhlXG4gKiBjYXNjYWRpbmcgY29uZmlybWF0aW9uIGxvb3AgZnJvbSBJc3N1ZSAjNzU4KS4gY29uZmlybV9vcGVyYXRpb24ncyBlbGVtZW50IHBvbGljaWVzXG4gKiBhcmUgZW5mb3JjZWQgdGhyb3VnaCBhIHNlcGFyYXRlIGNoZWNrIGluIHRoZSBjb25maXJtIGhhbmRsZXIgaW5zdGVhZC5cbiAqXG4gKiBSZWxhdGlvbnNoaXA6IEdBVEVLRUVQRVJfSU5GUkFfT1BFUkFUSU9OUyA9IFVOR0FUQUJMRV9PUEVSQVRJT05TICsgY29uZmlybV9vcGVyYXRpb25cbiAqIFRoaXMgZGVyaXZhdGlvbiBpcyBleHBsaWNpdCBpbiBjb2RlIHRvIHByZXZlbnQgdGhlIHNldHMgZnJvbSBkcmlmdGluZyBhcGFydC5cbiAqL1xuY29uc3QgVU5HQVRBQkxFX09QRVJBVElPTlMgPSBuZXcgU2V0KFtcbiAgJ3ZlcmlmeV9jaGFsbGVuZ2UnLFxuICAnYXBwcm92ZV9jbGlfcGVybWlzc2lvbicsXG4gICdwZXJtaXNzaW9uX3Byb21wdCcsXG5dKTtcblxuLyoqIERlcml2ZWQgZnJvbSBVTkdBVEFCTEVfT1BFUkFUSU9OUyArIGNvbmZpcm1fb3BlcmF0aW9uLiBTZWUgYmxvY2sgY29tbWVudCBhYm92ZS4gKi9cbmNvbnN0IEdBVEVLRUVQRVJfSU5GUkFfT1BFUkFUSU9OUyA9IG5ldyBTZXQoW1xuICAuLi5VTkdBVEFCTEVfT1BFUkFUSU9OUyxcbiAgJ2NvbmZpcm1fb3BlcmF0aW9uJyxcbl0pO1xuXG4vKipcbiAqIENoZWNrIGlmIGFuIG9wZXJhdGlvbiBpcyBhIGdhdGVrZWVwZXIgaW5mcmFzdHJ1Y3R1cmUgb3BlcmF0aW9uIHRoYXQgc2hvdWxkXG4gKiBza2lwIGVsZW1lbnQgcG9saWN5IGV2YWx1YXRpb24gaW4gdGhlIHByaW1hcnkgZW5mb3JjZW1lbnQgcGF0aC5cbiAqIEV4cG9ydGVkIGZvciB1c2UgYnkgTUNQQVFMSGFuZGxlci4gSXNzdWUgIzc1OC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2F0ZWtlZXBlckluZnJhT3BlcmF0aW9uKG9wZXJhdGlvbjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBHQVRFS0VFUEVSX0lORlJBX09QRVJBVElPTlMuaGFzKG9wZXJhdGlvbik7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYW55IGFjdGl2ZSBlbGVtZW50cyBkZW55IGNvbmZpcm1fb3BlcmF0aW9uIChudWNsZWFyIHNhbmRib3gpLlxuICogUmV0dXJucyB0aGUgZGVueWluZyBlbGVtZW50IG5hbWUgaWYgZm91bmQsIHVuZGVmaW5lZCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29uZmlybURlbnlpbmdFbGVtZW50KFxuICBhY3RpdmVFbGVtZW50czogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+XG4pOiB7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYWN0aXZlRWxlbWVudHMpIHtcbiAgICBjb25zdCBnYXRla2VlcGVyID0gZWxlbWVudC5tZXRhZGF0YT8uZ2F0ZWtlZXBlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkZW55TGlzdCA9IGdhdGVrZWVwZXI/LmRlbnk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZGVueUxpc3QpICYmIGRlbnlMaXN0LmluY2x1ZGVzKCdjb25maXJtX29wZXJhdGlvbicpKSB7XG4gICAgICByZXR1cm4geyBuYW1lOiBlbGVtZW50Lm5hbWUsIHR5cGU6IGVsZW1lbnQudHlwZSB9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFueSBhY3RpdmUgZWxlbWVudHMgaGF2ZSBjb25maXJtX29wZXJhdGlvbiBpbiB0aGVpciBjb25maXJtIGxpc3QgKGFkdmlzb3J5KS5cbiAqIFJldHVybnMgdGhlIGVsZW1lbnQgbmFtZXMgdGhhdCByZXF1ZXN0IGFkZGl0aW9uYWwgc2NydXRpbnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQ29uZmlybUFkdmlzb3J5RWxlbWVudHMoXG4gIGFjdGl2ZUVsZW1lbnRzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nOyBtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT5cbik6IEFycmF5PHsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmcgfT4ge1xuICBjb25zdCBhZHZpc29yaWVzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0+ID0gW107XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhY3RpdmVFbGVtZW50cykge1xuICAgIGNvbnN0IGdhdGVrZWVwZXIgPSBlbGVtZW50Lm1ldGFkYXRhPy5nYXRla2VlcGVyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbmZpcm1MaXN0ID0gZ2F0ZWtlZXBlcj8uY29uZmlybTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShjb25maXJtTGlzdCkgJiYgY29uZmlybUxpc3QuaW5jbHVkZXMoJ2NvbmZpcm1fb3BlcmF0aW9uJykpIHtcbiAgICAgIGFkdmlzb3JpZXMucHVzaCh7IG5hbWU6IGVsZW1lbnQubmFtZSwgdHlwZTogZWxlbWVudC50eXBlIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYWR2aXNvcmllcztcbn1cblxuLyoqXG4gKiBTdHJpcCB1bmdhdGFibGUgb3BlcmF0aW9ucyBmcm9tIGEgcG9saWN5IGxpc3QgYW5kIGxvZyB3YXJuaW5ncy5cbiAqIFJldHVybnMgdGhlIGZpbHRlcmVkIGxpc3QgKG1heSBiZSBlbXB0eSkuXG4gKlxuICogTm90ZTogY29uZmlybV9vcGVyYXRpb24gaXMgTk9UIHN0cmlwcGVkIGZyb20gZGVueSBsaXN0cyDigJQgaXQncyBhIGxlZ2l0aW1hdGVcbiAqIHNhbmRib3ggbWVjaGFuaXNtLiBJdCBJUyBzdHJpcHBlZCBmcm9tIGFsbG93L2NvbmZpcm0gbGlzdHMgc2luY2UgdGhvc2UgYXJlXG4gKiBoYW5kbGVkIHRocm91Z2ggYWR2aXNvcnkgbWVzc2FnaW5nLCBub3QgdGhyb3VnaCBlbmZvcmNlKCkuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwVW5nYXRhYmxlKFxuICBvcGVyYXRpb25zOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCxcbiAgbGlzdE5hbWU6IHN0cmluZyxcbiAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgZWxlbWVudFR5cGU6IHN0cmluZyxcbik6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFvcGVyYXRpb25zPy5sZW5ndGgpIHJldHVybiBvcGVyYXRpb25zO1xuXG4gIC8vIGNvbmZpcm1fb3BlcmF0aW9uIGluIGRlbnkgbGlzdHMgPSBudWNsZWFyIHNhbmRib3ggKHByZXNlcnZlKVxuICAvLyBjb25maXJtX29wZXJhdGlvbiBpbiBjb25maXJtIGxpc3RzID0gYWR2aXNvcnkgbWFya2VyIChwcmVzZXJ2ZSDigJQgaW5lcnQgaW4gZW5mb3JjZSBwYXRoLFxuICAvLyAgIHJlYWQgYXQgcnVudGltZSBieSBmaW5kQ29uZmlybUFkdmlzb3J5RWxlbWVudHMoKS4gU2FmZSBiZWNhdXNlIHNraXBFbGVtZW50UG9saWNpZXNcbiAgLy8gICBwcmV2ZW50cyByZXNvbHZlRWxlbWVudFBvbGljeSgpIGZyb20gZXZlciBldmFsdWF0aW5nIGNvbmZpcm1fb3BlcmF0aW9uIGFzIGFuIG9wZXJhdGlvbi4pXG4gIC8vIGNvbmZpcm1fb3BlcmF0aW9uIGluIGFsbG93IGxpc3RzID0gcmVkdW5kYW50IHdpdGggcm91dGUgZGVmYXVsdCBBVVRPX0FQUFJPVkUgKHN0cmlwKVxuICBjb25zdCBvcHNUb1N0cmlwID0gbGlzdE5hbWUgPT09ICdhbGxvdydcbiAgICA/IG5ldyBTZXQoWy4uLlVOR0FUQUJMRV9PUEVSQVRJT05TLCAnY29uZmlybV9vcGVyYXRpb24nXSlcbiAgICA6IFVOR0FUQUJMRV9PUEVSQVRJT05TO1xuXG4gIGNvbnN0IHN0cmlwcGVkID0gb3BlcmF0aW9ucy5maWx0ZXIob3AgPT4ge1xuICAgIGlmIChvcHNUb1N0cmlwLmhhcyhvcCkpIHtcbiAgICAgIGxvZ2dlci53YXJuKFxuICAgICAgICBgW0dhdGVrZWVwZXJdIFN0cmlwcGVkIFwiJHtvcH1cIiBmcm9tICR7bGlzdE5hbWV9IGxpc3QgaW4gJHtlbGVtZW50VHlwZX0gXCIke2VsZW1lbnROYW1lfVwiIOKAlCBgICtcbiAgICAgICAgYGdhdGVrZWVwZXIgaW5mcmFzdHJ1Y3R1cmUgb3BlcmF0aW9ucyBjYW5ub3QgYmUgZ2F0ZWQgYnkgZWxlbWVudCBwb2xpY2llcyAoSXNzdWUgIzc1OClgXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiBzdHJpcHBlZC5sZW5ndGggPiAwID8gc3RyaXBwZWQgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZUdhdGVrZWVwZXJQb2xpY3koXG4gIHJhd1BvbGljeTogdW5rbm93bixcbiAgZWxlbWVudE5hbWU6IHN0cmluZyxcbiAgZWxlbWVudFR5cGU6IHN0cmluZyxcbik6IEVsZW1lbnRHYXRla2VlcGVyUG9saWN5IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFyYXdQb2xpY3kgfHwgdHlwZW9mIHJhd1BvbGljeSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBXcmFwIGluIGEgbWV0YWRhdGEgZW52ZWxvcGUgc28gcGFyc2VFbGVtZW50UG9saWN5IGNhbiBleHRyYWN0IGl0XG4gICAgY29uc3QgdmFsaWRhdGVkID0gcGFyc2VFbGVtZW50UG9saWN5KHsgZ2F0ZWtlZXBlcjogcmF3UG9saWN5IH0pO1xuICAgIGlmICh2YWxpZGF0ZWQpIHtcbiAgICAgIC8vIElzc3VlICM3NTg6IFN0cmlwIGdhdGVrZWVwZXIgaW5mcmFzdHJ1Y3R1cmUgb3BlcmF0aW9ucyBmcm9tIGVsZW1lbnQgcG9saWNpZXNcbiAgICAgIC8vIHRvIHByZXZlbnQgY2FzY2FkaW5nIGNvbmZpcm1hdGlvbiBsb29wc1xuICAgICAgdmFsaWRhdGVkLmFsbG93ID0gc3RyaXBVbmdhdGFibGUodmFsaWRhdGVkLmFsbG93LCAnYWxsb3cnLCBlbGVtZW50TmFtZSwgZWxlbWVudFR5cGUpO1xuICAgICAgdmFsaWRhdGVkLmNvbmZpcm0gPSBzdHJpcFVuZ2F0YWJsZSh2YWxpZGF0ZWQuY29uZmlybSwgJ2NvbmZpcm0nLCBlbGVtZW50TmFtZSwgZWxlbWVudFR5cGUpO1xuICAgICAgdmFsaWRhdGVkLmRlbnkgPSBzdHJpcFVuZ2F0YWJsZSh2YWxpZGF0ZWQuZGVueSwgJ2RlbnknLCBlbGVtZW50TmFtZSwgZWxlbWVudFR5cGUpO1xuXG4gICAgICBsb2dnZXIuZGVidWcoYExvYWRlZCBnYXRla2VlcGVyIHBvbGljeSBmb3IgJHtlbGVtZW50VHlwZX0gXCIke2VsZW1lbnROYW1lfVwiYCwge1xuICAgICAgICBhbGxvdzogdmFsaWRhdGVkLmFsbG93Py5sZW5ndGggPz8gMCxcbiAgICAgICAgY29uZmlybTogdmFsaWRhdGVkLmNvbmZpcm0/Lmxlbmd0aCA/PyAwLFxuICAgICAgICBkZW55OiB2YWxpZGF0ZWQuZGVueT8ubGVuZ3RoID8/IDAsXG4gICAgICAgIGhhc1Njb3BlUmVzdHJpY3Rpb25zOiAhIXZhbGlkYXRlZC5zY29wZVJlc3RyaWN0aW9ucyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmFsaWRhdGVkO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG4gICAgU2VjdXJpdHlNb25pdG9yLmxvZ1NlY3VyaXR5RXZlbnQoe1xuICAgICAgdHlwZTogJ1lBTUxfUEFSU0lOR19XQVJOSU5HJyxcbiAgICAgIHNldmVyaXR5OiAnTUVESVVNJyxcbiAgICAgIHNvdXJjZTogYCR7ZWxlbWVudFR5cGV9LmRlc2VyaWFsaXplYCxcbiAgICAgIGRldGFpbHM6IGBNYWxmb3JtZWQgZ2F0ZWtlZXBlciBwb2xpY3kgaW4gXCIke2VsZW1lbnROYW1lfVwiIHN0cmlwcGVkIGR1cmluZyBsb2FkOiAke21lc3NhZ2V9YCxcbiAgICB9KTtcbiAgICBsb2dnZXIud2FybihgU3RyaXBwZWQgbWFsZm9ybWVkIGdhdGVrZWVwZXIgcG9saWN5IGZyb20gJHtlbGVtZW50VHlwZX0gXCIke2VsZW1lbnROYW1lfVwiOiAke21lc3NhZ2V9YCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
601
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWxlbWVudFBvbGljaWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2hhbmRsZXJzL21jcC1hcWwvcG9saWNpZXMvRWxlbWVudFBvbGljaWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFDTCxlQUFlLEVBSWYsbUJBQW1CLEdBQ3BCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLHlCQUF5QixFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0csT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQTRDM0U7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLFNBQWlCLEVBQ2pCLGNBQStCLEVBQy9CLGlCQUEwQjtJQUUxQixvREFBb0Q7SUFDcEQsSUFBSSxjQUFjLEdBQUcseUJBQXlCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUQsSUFBSSxhQUFpQyxDQUFDO0lBQ3RDLElBQUksYUFBbUQsQ0FBQztJQUN4RCxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDekIsOEZBQThGO0lBQzlGLGdGQUFnRjtJQUNoRixJQUFJLGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUMvQixzRkFBc0Y7SUFDdEYsTUFBTSxtQkFBbUIsR0FBMEQsRUFBRSxDQUFDO0lBRXRGLDhDQUE4QztJQUM5QyxLQUFLLE1BQU0sT0FBTyxJQUFJLGNBQWMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLFNBQVM7UUFD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Z0NBQWdDLFdBQVcsS0FBSyxXQUFXLEdBQUcsRUFBRTtnQkFDM0UsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxJQUFJLENBQUM7Z0JBQ25DLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO2dCQUN2QyxJQUFJLEVBQUUsU0FBUyxDQUFDLElBQUksRUFBRSxNQUFNLElBQUksQ0FBQztnQkFDakMsb0JBQW9CLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxpQkFBaUI7YUFDcEQsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxPQUFPLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZFLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQztZQUMvQixJQUFJLEVBQUUsc0JBQXNCO1lBQzVCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLE1BQU0sRUFBRSxHQUFHLFdBQVcsY0FBYztZQUNwQyxPQUFPLEVBQUUsbUNBQW1DLFdBQVcsMkJBQTJCLE9BQU8sRUFBRTtTQUM1RixDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxXQUFXLEtBQUssV0FBVyxNQUFNLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDckcsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEVsZW1lbnQgUG9saWNpZXNcbiAqXG4gKiBIYW5kbGVzIGVsZW1lbnQtYmFzZWQgYWNjZXNzIGNvbnRyb2wgZm9yIHRoZSBHYXRla2VlcGVyLlxuICogQWxsb3dzIEFOWSBEb2xsaG91c2VNQ1AgZWxlbWVudCB0byBkZWZpbmUgcG9saWNpZXMgaW4gaXRzIG1ldGFkYXRhXG4gKiB0aGF0IG92ZXJyaWRlIG9yIHJlc3RyaWN0IHRoZSBkZWZhdWx0IG9wZXJhdGlvbiBwb2xpY2llcy5cbiAqXG4gKiBQb2xpY3kgUmVzb2x1dGlvbiBPcmRlcjpcbiAqIDEuIEFjdGl2ZSBlbGVtZW50IGRlbnkgbGlzdCAoaGlnaGVzdCBwcmlvcml0eSAtIGJsb2NrcyBvcGVyYXRpb24pXG4gKiAyLiBBY3RpdmUgZWxlbWVudCBjb25maXJtIGxpc3QgKHJlcXVpcmVzIGNvbmZpcm1hdGlvbilcbiAqIDMuIEFjdGl2ZSBlbGVtZW50IGFsbG93IGxpc3QgKGF1dG8tYXBwcm92ZXMpXG4gKiA0LiBPcGVyYXRpb24gZGVmYXVsdCBwZXJtaXNzaW9uIChmYWxsYmFjaylcbiAqL1xuXG5pbXBvcnQge1xuICBQZXJtaXNzaW9uTGV2ZWwsXG4gIHR5cGUgRWxlbWVudEdhdGVrZWVwZXJQb2xpY3ksXG4gIHR5cGUgQ2xpQXBwcm92YWxQb2xpY3ksXG4gIHR5cGUgR2F0ZWtlZXBlckRlY2lzaW9uLFxuICBHYXRla2VlcGVyRXJyb3JDb2RlLFxufSBmcm9tICcuLi9HYXRla2VlcGVyVHlwZXMuanMnO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdFBlcm1pc3Npb25MZXZlbCwgY2FuT3BlcmF0aW9uQmVFbGV2YXRlZCwgZ2V0T3BlcmF0aW9uUG9saWN5IH0gZnJvbSAnLi9PcGVyYXRpb25Qb2xpY2llcy5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi8uLi8uLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IE1BWF9HTE9CX1BBVFRFUk5fTEVOR1RIIH0gZnJvbSAnLi4vLi4vLi4vdXRpbHMvcGF0dGVybk1hdGNoZXIuanMnO1xuXG4vKipcbiAqIE1ldGFkYXRhIHN0cnVjdHVyZSBmb3IgZWxlbWVudHMgd2l0aCBHYXRla2VlcGVyIHBvbGljaWVzLlxuICogVGhlICdnYXRla2VlcGVyJyBmaWVsZCBpcyBvcHRpb25hbCBhbmQgY29udGFpbnMgcG9saWN5IGRlZmluaXRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVsZW1lbnRNZXRhZGF0YVdpdGhQb2xpY3kge1xuICBuYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBnYXRla2VlcGVyPzogRWxlbWVudEdhdGVrZWVwZXJQb2xpY3k7XG4gIFtrZXk6IHN0cmluZ106IHVua25vd247XG59XG5cbi8qKlxuICogQWN0aXZlIGVsZW1lbnQgZm9yIHBvbGljeSBldmFsdWF0aW9uLlxuICogUmVwcmVzZW50cyBhbiBlbGVtZW50IGN1cnJlbnRseSBhY3RpdmUgaW4gdGhlIHNlc3Npb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZlRWxlbWVudCB7XG4gIHR5cGU6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBtZXRhZGF0YTogRWxlbWVudE1ldGFkYXRhV2l0aFBvbGljeTtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgZWxlbWVudCBwb2xpY3kgcmVzb2x1dGlvbi5cbiAqIENvbnRhaW5zIHRoZSBlZmZlY3RpdmUgcGVybWlzc2lvbiBsZXZlbCBhbmQgcG9saWN5IHNvdXJjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbGVtZW50UG9saWN5UmVzdWx0IHtcbiAgLyoqIEVmZmVjdGl2ZSBwZXJtaXNzaW9uIGxldmVsIGFmdGVyIGVsZW1lbnQgcG9saWN5IGFwcGxpY2F0aW9uICovXG4gIHBlcm1pc3Npb25MZXZlbDogUGVybWlzc2lvbkxldmVsO1xuICAvKiogV2hpY2ggZWxlbWVudCdzIHBvbGljeSBkZXRlcm1pbmVkIHRoaXMgcmVzdWx0ICovXG4gIHNvdXJjZUVsZW1lbnQ/OiBzdHJpbmc7XG4gIC8qKiBUaGUgc3BlY2lmaWMgcG9saWN5IGZpZWxkIHRoYXQgbWF0Y2hlZCAoYWxsb3cvY29uZmlybS9kZW55KSAqL1xuICBtYXRjaGVkUG9saWN5PzogJ2FsbG93JyB8ICdjb25maXJtJyB8ICdkZW55JyB8ICdzY29wZV9yZXN0cmljdGlvbic7XG4gIC8qKiBXaGV0aGVyIHRoZSBvcGVyYXRpb24gd2FzIGJsb2NrZWQgYnkgc2NvcGUgcmVzdHJpY3Rpb25zICovXG4gIHNjb3BlQmxvY2tlZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFbGVtZW50cyB0aGF0IHdhbnRlZCB0byBhdXRvLWFwcHJvdmUgdGhpcyBvcGVyYXRpb24gYnV0IHdlcmUgb3ZlcnJpZGRlblxuICAgKiBieSBhIGhpZ2hlci1wcmlvcml0eSBjb25maXJtIG9yIGRlbnkgcG9saWN5IGZyb20gYW5vdGhlciBlbGVtZW50LlxuICAgKiBJc3N1ZSAjNjc0OiBhbGxvdyBjYW5ub3Qgb3ZlcnJpZGUgY29uZmlybS5cbiAgICovXG4gIGNvbmZsaWN0aW5nRWxlbWVudHM/OiBBcnJheTx7IG5hbWU6IHN0cmluZzsgd2FudGVkTGV2ZWw6IFBlcm1pc3Npb25MZXZlbCB9Pjtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBlZmZlY3RpdmUgcGVybWlzc2lvbiBsZXZlbCBmb3IgYW4gb3BlcmF0aW9uXG4gKiBjb25zaWRlcmluZyBhbGwgYWN0aXZlIGVsZW1lbnRzIGFuZCB0aGVpciBwb2xpY2llcy5cbiAqXG4gKiBAcGFyYW0gb3BlcmF0aW9uIC0gVGhlIG9wZXJhdGlvbiB0byBjaGVja1xuICogQHBhcmFtIGFjdGl2ZUVsZW1lbnRzIC0gQ3VycmVudGx5IGFjdGl2ZSBlbGVtZW50cyB3aXRoIHRoZWlyIG1ldGFkYXRhXG4gKiBAcGFyYW0gdGFyZ2V0RWxlbWVudFR5cGUgLSBPcHRpb25hbCBlbGVtZW50IHR5cGUgYmVpbmcgb3BlcmF0ZWQgb25cbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBwb2xpY3kgcmVzdWx0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRWxlbWVudFBvbGljeShcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gIGFjdGl2ZUVsZW1lbnRzOiBBY3RpdmVFbGVtZW50W10sXG4gIHRhcmdldEVsZW1lbnRUeXBlPzogc3RyaW5nXG4pOiBFbGVtZW50UG9saWN5UmVzdWx0IHtcbiAgLy8gU3RhcnQgd2l0aCB0aGUgZGVmYXVsdCBvcGVyYXRpb24gcGVybWlzc2lvbiBsZXZlbFxuICBsZXQgZWZmZWN0aXZlTGV2ZWwgPSBnZXREZWZhdWx0UGVybWlzc2lvbkxldmVsKG9wZXJhdGlvbik7XG4gIGxldCBzb3VyY2VFbGVtZW50OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBtYXRjaGVkUG9saWN5OiBFbGVtZW50UG9saWN5UmVzdWx0WydtYXRjaGVkUG9saWN5J107XG4gIGxldCBzY29wZUJsb2NrZWQgPSBmYWxzZTtcbiAgLy8gSXNzdWUgIzY3NDogVHJhY2sgd2hldGhlciBDT05GSVJNIHdhcyBzZXQgYnkgYW4gZWxlbWVudCBwb2xpY3kgKG5vdCBqdXN0IHRoZSByb3V0ZSBkZWZhdWx0KVxuICAvLyBhbGxvdyBjYW4gb3ZlcnJpZGUgdGhlIHJvdXRlIGRlZmF1bHQgYnV0IE5PVCBhbm90aGVyIGVsZW1lbnQncyBjb25maXJtIHBvbGljeVxuICBsZXQgY29uZmlybWVkQnlFbGVtZW50ID0gZmFsc2U7XG4gIC8vIFRyYWNrIGVsZW1lbnRzIHRoYXQgd2FudGVkIGFsbG93IGJ1dCB3ZXJlIG92ZXJyaWRkZW4gYnkgYW4gZWxlbWVudC1zZXQgY29uZmlybS9kZW55XG4gIGNvbnN0IGNvbmZsaWN0aW5nRWxlbWVudHM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyB3YW50ZWRMZXZlbDogUGVybWlzc2lvbkxldmVsIH0+ID0gW107XG5cbiAgLy8gQ2hlY2sgZWFjaCBhY3RpdmUgZWxlbWVudCdzIHBvbGljeSBpbiBvcmRlclxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYWN0aXZlRWxlbWVudHMpIHtcbiAgICBjb25zdCBwb2xpY3kgPSBlbGVtZW50Lm1ldGFkYXRhLmdhdGVrZWVwZXI7XG4gICAgaWYgKCFwb2xpY3kpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIDEuIENoZWNrIGRlbnkgbGlzdCBmaXJzdCAoaGlnaGVzdCBwcmlvcml0eSlcbiAgICBpZiAocG9saWN5LmRlbnk/LmluY2x1ZGVzKG9wZXJhdGlvbikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHBlcm1pc3Npb25MZXZlbDogUGVybWlzc2lvbkxldmVsLkRFTlksXG4gICAgICAgIHNvdXJjZUVsZW1lbnQ6IGVsZW1lbnQubmFtZSxcbiAgICAgICAgbWF0Y2hlZFBvbGljeTogJ2RlbnknLFxuICAgICAgICBjb25mbGljdGluZ0VsZW1lbnRzOiBjb25mbGljdGluZ0VsZW1lbnRzLmxlbmd0aCA+IDAgPyBjb25mbGljdGluZ0VsZW1lbnRzIDogdW5kZWZpbmVkLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAyLiBDaGVjayBzY29wZSByZXN0cmljdGlvbnNcbiAgICBpZiAodGFyZ2V0RWxlbWVudFR5cGUgJiYgcG9saWN5LnNjb3BlUmVzdHJpY3Rpb25zKSB7XG4gICAgICBjb25zdCB7IGFsbG93ZWRUeXBlcywgYmxvY2tlZFR5cGVzIH0gPSBwb2xpY3kuc2NvcGVSZXN0cmljdGlvbnM7XG5cbiAgICAgIC8vIElmIGFsbG93ZWRUeXBlcyBpcyBzcGVjaWZpZWQsIHRhcmdldCBtdXN0IGJlIGluIHRoZSBsaXN0XG4gICAgICBpZiAoYWxsb3dlZFR5cGVzICYmICFhbGxvd2VkVHlwZXMuaW5jbHVkZXModGFyZ2V0RWxlbWVudFR5cGUpKSB7XG4gICAgICAgIHNjb3BlQmxvY2tlZCA9IHRydWU7XG4gICAgICAgIHNvdXJjZUVsZW1lbnQgPSBlbGVtZW50Lm5hbWU7XG4gICAgICAgIG1hdGNoZWRQb2xpY3kgPSAnc2NvcGVfcmVzdHJpY3Rpb24nO1xuICAgICAgICBjb250aW51ZTsgLy8gQ2hlY2sgb3RoZXIgZWxlbWVudHMsIG1pZ2h0IGhhdmUgZGlmZmVyZW50IHBvbGljeVxuICAgICAgfVxuXG4gICAgICAvLyBJZiBibG9ja2VkVHlwZXMgaXMgc3BlY2lmaWVkLCB0YXJnZXQgbXVzdCBOT1QgYmUgaW4gdGhlIGxpc3RcbiAgICAgIGlmIChibG9ja2VkVHlwZXM/LmluY2x1ZGVzKHRhcmdldEVsZW1lbnRUeXBlKSkge1xuICAgICAgICBzY29wZUJsb2NrZWQgPSB0cnVlO1xuICAgICAgICBzb3VyY2VFbGVtZW50ID0gZWxlbWVudC5uYW1lO1xuICAgICAgICBtYXRjaGVkUG9saWN5ID0gJ3Njb3BlX3Jlc3RyaWN0aW9uJztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gMy4gQ2hlY2sgY29uZmlybSBsaXN0IChyZXF1aXJlcyBjb25maXJtYXRpb24pXG4gICAgaWYgKHBvbGljeS5jb25maXJtPy5pbmNsdWRlcyhvcGVyYXRpb24pKSB7XG4gICAgICAvLyBEb24ndCBkb3duZ3JhZGUgZnJvbSBERU5ZIG9yIENPTkZJUk1fU0lOR0xFX1VTRVxuICAgICAgaWYgKGVmZmVjdGl2ZUxldmVsICE9PSBQZXJtaXNzaW9uTGV2ZWwuREVOWSkge1xuICAgICAgICBlZmZlY3RpdmVMZXZlbCA9IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NFU1NJT047XG4gICAgICAgIGNvbmZpcm1lZEJ5RWxlbWVudCA9IHRydWU7XG4gICAgICAgIHNvdXJjZUVsZW1lbnQgPSBlbGVtZW50Lm5hbWU7XG4gICAgICAgIG1hdGNoZWRQb2xpY3kgPSAnY29uZmlybSc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gNC4gQ2hlY2sgYWxsb3cgbGlzdCAoYXV0by1hcHByb3ZlcylcbiAgICAvLyBJc3N1ZSAjNjc0OiBhbGxvdyBDQU4gb3ZlcnJpZGUgdGhlIHJvdXRlIGRlZmF1bHQsIGJ1dCBOT1QgYW5vdGhlciBlbGVtZW50J3MgY29uZmlybSBwb2xpY3kuXG4gICAgLy8gUHJpb3JpdHkgaGllcmFyY2h5OiBlbGVtZW50IGRlbnkgPiBlbGVtZW50IGNvbmZpcm0gPiBlbGVtZW50IGFsbG93ID4gcm91dGUgZGVmYXVsdFxuICAgIGlmIChwb2xpY3kuYWxsb3c/LmluY2x1ZGVzKG9wZXJhdGlvbikpIHtcbiAgICAgIC8vIE9ubHkgZWxldmF0ZSBpZiB0aGUgb3BlcmF0aW9uIGFsbG93cyBlbGV2YXRpb25cbiAgICAgIGlmIChjYW5PcGVyYXRpb25CZUVsZXZhdGVkKG9wZXJhdGlvbikpIHtcbiAgICAgICAgaWYgKCFjb25maXJtZWRCeUVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBObyBlbGVtZW50IGhhcyBjb25maXJtZWQgdGhpcyDigJQgc2FmZSB0byBlbGV2YXRlIChvdmVycmlkZXMgcm91dGUgZGVmYXVsdClcbiAgICAgICAgICBlZmZlY3RpdmVMZXZlbCA9IFBlcm1pc3Npb25MZXZlbC5BVVRPX0FQUFJPVkU7XG4gICAgICAgICAgc291cmNlRWxlbWVudCA9IGVsZW1lbnQubmFtZTtcbiAgICAgICAgICBtYXRjaGVkUG9saWN5ID0gJ2FsbG93JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBBbm90aGVyIGVsZW1lbnQncyBjb25maXJtIHBvbGljeSB0YWtlcyBwcmlvcml0eSBvdmVyIHRoaXMgYWxsb3dcbiAgICAgICAgICBjb25mbGljdGluZ0VsZW1lbnRzLnB1c2goeyBuYW1lOiBlbGVtZW50Lm5hbWUsIHdhbnRlZExldmVsOiBQZXJtaXNzaW9uTGV2ZWwuQVVUT19BUFBST1ZFIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSWYgc2NvcGUgd2FzIGJsb2NrZWQgYnkgYWxsIGVsZW1lbnRzIHdpdGggcmVzdHJpY3Rpb25zXG4gIGlmIChzY29wZUJsb2NrZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcGVybWlzc2lvbkxldmVsOiBQZXJtaXNzaW9uTGV2ZWwuREVOWSxcbiAgICAgIHNvdXJjZUVsZW1lbnQsXG4gICAgICBtYXRjaGVkUG9saWN5OiAnc2NvcGVfcmVzdHJpY3Rpb24nLFxuICAgICAgc2NvcGVCbG9ja2VkOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBlcm1pc3Npb25MZXZlbDogZWZmZWN0aXZlTGV2ZWwsXG4gICAgc291cmNlRWxlbWVudCxcbiAgICBtYXRjaGVkUG9saWN5LFxuICAgIGNvbmZsaWN0aW5nRWxlbWVudHM6IGNvbmZsaWN0aW5nRWxlbWVudHMubGVuZ3RoID4gMCA/IGNvbmZsaWN0aW5nRWxlbWVudHMgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgR2F0ZWtlZXBlciBkZWNpc2lvbiBmcm9tIGVsZW1lbnQgcG9saWN5IHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIG9wZXJhdGlvbiAtIFRoZSBvcGVyYXRpb24gdGhhdCB3YXMgY2hlY2tlZFxuICogQHBhcmFtIHJlc3VsdCAtIFRoZSBlbGVtZW50IHBvbGljeSByZXNvbHV0aW9uIHJlc3VsdFxuICogQHBhcmFtIHRhcmdldEVsZW1lbnRUeXBlIC0gT3B0aW9uYWwgZWxlbWVudCB0eXBlIGJlaW5nIG9wZXJhdGVkIG9uXG4gKiBAcmV0dXJucyBBIEdhdGVrZWVwZXJEZWNpc2lvbiBvYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlY2lzaW9uRnJvbVBvbGljeShcbiAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gIHJlc3VsdDogRWxlbWVudFBvbGljeVJlc3VsdCxcbiAgdGFyZ2V0RWxlbWVudFR5cGU/OiBzdHJpbmdcbik6IEdhdGVrZWVwZXJEZWNpc2lvbiB7XG4gIGNvbnN0IHsgcGVybWlzc2lvbkxldmVsLCBzb3VyY2VFbGVtZW50LCBzY29wZUJsb2NrZWQsIGNvbmZsaWN0aW5nRWxlbWVudHMgfSA9IHJlc3VsdDtcblxuICAvLyBIYW5kbGUgREVOWVxuICBpZiAocGVybWlzc2lvbkxldmVsID09PSBQZXJtaXNzaW9uTGV2ZWwuREVOWSkge1xuICAgIGlmIChzY29wZUJsb2NrZWQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGFsbG93ZWQ6IGZhbHNlLFxuICAgICAgICBwZXJtaXNzaW9uTGV2ZWwsXG4gICAgICAgIGVycm9yQ29kZTogR2F0ZWtlZXBlckVycm9yQ29kZS5TQ09QRV9SRVNUUklDVElPTixcbiAgICAgICAgcmVhc29uOiBgT3BlcmF0aW9uIFwiJHtvcGVyYXRpb259XCIgaXMgbm90IGFsbG93ZWQgb24gZWxlbWVudCB0eXBlIFwiJHt0YXJnZXRFbGVtZW50VHlwZX1cIiBkdWUgdG8gc2NvcGUgcmVzdHJpY3Rpb25zIGluIGFjdGl2ZSBlbGVtZW50IFwiJHtzb3VyY2VFbGVtZW50fVwiYCxcbiAgICAgICAgc3VnZ2VzdGlvbjogYERlYWN0aXZhdGUgdGhlIGVsZW1lbnQgXCIke3NvdXJjZUVsZW1lbnR9XCIgb3IgdXNlIGEgZGlmZmVyZW50IGVsZW1lbnQgdHlwZWAsXG4gICAgICAgIHBvbGljeVNvdXJjZTogJ2VsZW1lbnRfcG9saWN5JyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFsbG93ZWQ6IGZhbHNlLFxuICAgICAgcGVybWlzc2lvbkxldmVsLFxuICAgICAgZXJyb3JDb2RlOiBHYXRla2VlcGVyRXJyb3JDb2RlLkVMRU1FTlRfUE9MSUNZX1ZJT0xBVElPTixcbiAgICAgIHJlYXNvbjogYE9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiIGlzIGJsb2NrZWQgYnkgYWN0aXZlIGVsZW1lbnQgXCIke3NvdXJjZUVsZW1lbnR9XCIncyBkZW55IHBvbGljeWAsXG4gICAgICBzdWdnZXN0aW9uOiBgRGVhY3RpdmF0ZSB0aGUgZWxlbWVudCBcIiR7c291cmNlRWxlbWVudH1cIiB0byBwcm9jZWVkIHdpdGggdGhpcyBvcGVyYXRpb25gLFxuICAgICAgcG9saWN5U291cmNlOiAnZWxlbWVudF9wb2xpY3knLFxuICAgIH07XG4gIH1cblxuICAvLyBIYW5kbGUgY29uZmlybWF0aW9uIHJlcXVpcmVkXG4gIGlmIChcbiAgICBwZXJtaXNzaW9uTGV2ZWwgPT09IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NFU1NJT04gfHxcbiAgICBwZXJtaXNzaW9uTGV2ZWwgPT09IFBlcm1pc3Npb25MZXZlbC5DT05GSVJNX1NJTkdMRV9VU0VcbiAgKSB7XG4gICAgLy8gQnVpbGQgaHVtYW4tcmVhZGFibGUgcmF0aW9uYWxlIGV4cGxhaW5pbmcgV0hZIGNvbmZpcm1hdGlvbiBpcyBuZWVkZWRcbiAgICBjb25zdCBwb2xpY3kgPSBnZXRPcGVyYXRpb25Qb2xpY3kob3BlcmF0aW9uKTtcbiAgICBjb25zdCBsZXZlbExhYmVsID0gcGVybWlzc2lvbkxldmVsID09PSBQZXJtaXNzaW9uTGV2ZWwuQ09ORklSTV9TSU5HTEVfVVNFXG4gICAgICA/ICdyZXF1aXJlcyBjb25maXJtYXRpb24gZWFjaCB0aW1lJ1xuICAgICAgOiAncmVxdWlyZXMgY29uZmlybWF0aW9uIG9uY2UgcGVyIHNlc3Npb24nO1xuXG4gICAgbGV0IHJhdGlvbmFsZTogc3RyaW5nO1xuICAgIGlmIChzb3VyY2VFbGVtZW50ICYmIHJlc3VsdC5tYXRjaGVkUG9saWN5ID09PSAnY29uZmlybScpIHtcbiAgICAgIC8vIEVsZW1lbnQgcG9saWN5IGVsZXZhdGVkIHRoaXMgb3BlcmF0aW9uJ3MgY29uZmlybWF0aW9uIHJlcXVpcmVtZW50XG4gICAgICBjb25zdCBwb2xpY3lEZXRhaWwgPSBwb2xpY3k/LnJhdGlvbmFsZSA/IGAgJHtwb2xpY3kucmF0aW9uYWxlfWAgOiAnJztcbiAgICAgIHJhdGlvbmFsZSA9IGBBY3RpdmUgZWxlbWVudCBcIiR7c291cmNlRWxlbWVudH1cIiBwb2xpY3kgcmVxdWlyZXMgY29uZmlybWF0aW9uIGZvciB0aGlzIG9wZXJhdGlvbi4ke3BvbGljeURldGFpbH1gO1xuICAgIH0gZWxzZSBpZiAocG9saWN5Py5yYXRpb25hbGUpIHtcbiAgICAgIC8vIFJvdXRlLWxldmVsIGRlZmF1bHQgd2l0aCBkb2N1bWVudGVkIHJhdGlvbmFsZVxuICAgICAgcmF0aW9uYWxlID0gcG9saWN5LnJhdGlvbmFsZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRW5kcG9pbnQtbGV2ZWwgZGVmYXVsdCwgbm8gc3BlY2lmaWMgcmF0aW9uYWxlXG4gICAgICByYXRpb25hbGUgPSAnVGhpcyBvcGVyYXRpb24gbW9kaWZpZXMgZGF0YSBhbmQgcmVxdWlyZXMgaHVtYW4gYXBwcm92YWwgYmVmb3JlIHByb2NlZWRpbmcnO1xuICAgIH1cblxuICAgIC8vIElzc3VlICM2NzQ6IFN1cmZhY2UgZWxlbWVudHMgdGhhdCB3YW50ZWQgdG8gYXV0by1hcHByb3ZlIGJ1dCB3ZXJlIG92ZXJyaWRkZW5cbiAgICBjb25zdCBjb25mbGljdE5vdGUgPSBjb25mbGljdGluZ0VsZW1lbnRzICYmIGNvbmZsaWN0aW5nRWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgPyBgIChOb3RlOiAke2NvbmZsaWN0aW5nRWxlbWVudHMubWFwKGUgPT4gYFwiJHtlLm5hbWV9XCJgKS5qb2luKCcsICcpfSB3b3VsZCBhdXRvLWFwcHJvdmUgdGhpcyBidXQgJHtjb25mbGljdGluZ0VsZW1lbnRzLmxlbmd0aCA9PT0gMSA/ICdpcycgOiAnYXJlJ30gb3ZlcnJpZGRlbiBieSB0aGUgY29uZmlybSBwb2xpY3kuKWBcbiAgICAgIDogJyc7XG5cbiAgICByZXR1cm4ge1xuICAgICAgYWxsb3dlZDogZmFsc2UsXG4gICAgICBwZXJtaXNzaW9uTGV2ZWwsXG4gICAgICBlcnJvckNvZGU6IEdhdGVrZWVwZXJFcnJvckNvZGUuQ09ORklSTUFUSU9OX1JFUVVJUkVELFxuICAgICAgcmVhc29uOiBgT3BlcmF0aW9uIFwiJHtvcGVyYXRpb259XCIgJHtsZXZlbExhYmVsfS4gJHtyYXRpb25hbGV9JHtjb25mbGljdE5vdGV9YCxcbiAgICAgIHN1Z2dlc3Rpb246ICdVc2UgdGhlIGNvbmZpcm1hdGlvbiBkaWFsb2cgdG8gYXBwcm92ZSB0aGlzIG9wZXJhdGlvbicsXG4gICAgICBjb25maXJtYXRpb25QZW5kaW5nOiB0cnVlLFxuICAgICAgcG9saWN5U291cmNlOiBzb3VyY2VFbGVtZW50ID8gJ2VsZW1lbnRfcG9saWN5JyA6ICdvcGVyYXRpb25fZGVmYXVsdCcsXG4gICAgfTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBBVVRPX0FQUFJPVkVcbiAgcmV0dXJuIHtcbiAgICBhbGxvd2VkOiB0cnVlLFxuICAgIHBlcm1pc3Npb25MZXZlbCxcbiAgICByZWFzb246IHNvdXJjZUVsZW1lbnRcbiAgICAgID8gYE9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiIGF1dG8tYXBwcm92ZWQgYnkgZWxlbWVudCBcIiR7c291cmNlRWxlbWVudH1cImBcbiAgICAgIDogYE9wZXJhdGlvbiBcIiR7b3BlcmF0aW9ufVwiIGF1dG8tYXBwcm92ZWQgYnkgZGVmYXVsdCBwb2xpY3lgLFxuICAgIHBvbGljeVNvdXJjZTogc291cmNlRWxlbWVudCA/ICdlbGVtZW50X3BvbGljeScgOiAnb3BlcmF0aW9uX2RlZmF1bHQnLFxuICB9O1xufVxuXG4vKipcbiAqIFBhcnNlIGFuZCB2YWxpZGF0ZSBhIEdhdGVrZWVwZXIgcG9saWN5IGZyb20gZWxlbWVudCBtZXRhZGF0YS5cbiAqXG4gKiBAcGFyYW0gbWV0YWRhdGEgLSBUaGUgZWxlbWVudCBtZXRhZGF0YSB0byBwYXJzZVxuICogQHJldHVybnMgVGhlIHBhcnNlZCBwb2xpY3ksIG9yIHVuZGVmaW5lZCBpZiBubyBwb2xpY3kgaXMgZGVmaW5lZFxuICogQHRocm93cyBFcnJvciBpZiB0aGUgcG9saWN5IGlzIG1hbGZvcm1lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VFbGVtZW50UG9saWN5KFxuICBtZXRhZGF0YTogdW5rbm93blxuKTogRWxlbWVudEdhdGVrZWVwZXJQb2xpY3kgfCB1bmRlZmluZWQge1xuICBpZiAoIW1ldGFkYXRhIHx8IHR5cGVvZiBtZXRhZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgY29uc3QgbWV0YSA9IG1ldGFkYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBnYXRla2VlcGVyID0gbWV0YS5nYXRla2VlcGVyO1xuXG4gIGlmICghZ2F0ZWtlZXBlcikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHlwZW9mIGdhdGVrZWVwZXIgIT09ICdvYmplY3QnIHx8IGdhdGVrZWVwZXIgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgZ2F0ZWtlZXBlciBwb2xpY3k6IG11c3QgYmUgYW4gb2JqZWN0Jyk7XG4gIH1cblxuICBjb25zdCBwb2xpY3kgPSBnYXRla2VlcGVyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIC8vIFZhbGlkYXRlIGFuZCBleHRyYWN0IGFsbG93IGxpc3RcbiAgY29uc3QgYWxsb3cgPSB2YWxpZGF0ZVN0cmluZ0FycmF5KHBvbGljeS5hbGxvdywgJ2FsbG93Jyk7XG4gIGNvbnN0IGNvbmZpcm0gPSB2YWxpZGF0ZVN0cmluZ0FycmF5KHBvbGljeS5jb25maXJtLCAnY29uZmlybScpO1xuICBjb25zdCBkZW55ID0gdmFsaWRhdGVTdHJpbmdBcnJheShwb2xpY3kuZGVueSwgJ2RlbnknKTtcblxuICAvLyBWYWxpZGF0ZSBzY29wZSByZXN0cmljdGlvbnNcbiAgbGV0IHNjb3BlUmVzdHJpY3Rpb25zOiBFbGVtZW50R2F0ZWtlZXBlclBvbGljeVsnc2NvcGVSZXN0cmljdGlvbnMnXTtcbiAgaWYgKHBvbGljeS5zY29wZVJlc3RyaWN0aW9ucykge1xuICAgIGlmICh0eXBlb2YgcG9saWN5LnNjb3BlUmVzdHJpY3Rpb25zICE9PSAnb2JqZWN0JyB8fCBwb2xpY3kuc2NvcGVSZXN0cmljdGlvbnMgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogc2NvcGVSZXN0cmljdGlvbnMgbXVzdCBiZSBhbiBvYmplY3QnKTtcbiAgICB9XG4gICAgY29uc3Qgc3IgPSBwb2xpY3kuc2NvcGVSZXN0cmljdGlvbnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgc2NvcGVSZXN0cmljdGlvbnMgPSB7XG4gICAgICBhbGxvd2VkVHlwZXM6IHZhbGlkYXRlU3RyaW5nQXJyYXkoc3IuYWxsb3dlZFR5cGVzLCAnc2NvcGVSZXN0cmljdGlvbnMuYWxsb3dlZFR5cGVzJyksXG4gICAgICBibG9ja2VkVHlwZXM6IHZhbGlkYXRlU3RyaW5nQXJyYXkoc3IuYmxvY2tlZFR5cGVzLCAnc2NvcGVSZXN0cmljdGlvbnMuYmxvY2tlZFR5cGVzJyksXG4gICAgfTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGV4dGVybmFsIHJlc3RyaWN0aW9ucyAoSXNzdWUgIzYyNSBQaGFzZSAyKVxuICBsZXQgZXh0ZXJuYWxSZXN0cmljdGlvbnM6IEVsZW1lbnRHYXRla2VlcGVyUG9saWN5WydleHRlcm5hbFJlc3RyaWN0aW9ucyddO1xuICBpZiAocG9saWN5LmV4dGVybmFsUmVzdHJpY3Rpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBwb2xpY3kuZXh0ZXJuYWxSZXN0cmljdGlvbnMgIT09ICdvYmplY3QnIHx8IHBvbGljeS5leHRlcm5hbFJlc3RyaWN0aW9ucyA9PT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucyBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgIH1cbiAgICBjb25zdCBlciA9IHBvbGljeS5leHRlcm5hbFJlc3RyaWN0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoIWVyLmRlc2NyaXB0aW9uIHx8IHR5cGVvZiBlci5kZXNjcmlwdGlvbiAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogZXh0ZXJuYWxSZXN0cmljdGlvbnMuZGVzY3JpcHRpb24gaXMgcmVxdWlyZWQgYW5kIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nJyk7XG4gICAgfVxuICAgIGNvbnN0IGRlbnlQYXR0ZXJucyA9IHZhbGlkYXRlU3RyaW5nQXJyYXkoZXIuZGVueVBhdHRlcm5zLCAnZXh0ZXJuYWxSZXN0cmljdGlvbnMuZGVueVBhdHRlcm5zJyk7XG4gICAgY29uc3QgY29uZmlybVBhdHRlcm5zID0gdmFsaWRhdGVTdHJpbmdBcnJheShlci5jb25maXJtUGF0dGVybnMsICdleHRlcm5hbFJlc3RyaWN0aW9ucy5jb25maXJtUGF0dGVybnMnKTtcbiAgICBjb25zdCBhbGxvd1BhdHRlcm5zID0gdmFsaWRhdGVTdHJpbmdBcnJheShlci5hbGxvd1BhdHRlcm5zLCAnZXh0ZXJuYWxSZXN0cmljdGlvbnMuYWxsb3dQYXR0ZXJucycpO1xuICAgIGlmIChkZW55UGF0dGVybnMpIHZhbGlkYXRlUGF0dGVyblN0cmluZ3MoZGVueVBhdHRlcm5zLCAnZXh0ZXJuYWxSZXN0cmljdGlvbnMuZGVueVBhdHRlcm5zJyk7XG4gICAgaWYgKGNvbmZpcm1QYXR0ZXJucykgdmFsaWRhdGVQYXR0ZXJuU3RyaW5ncyhjb25maXJtUGF0dGVybnMsICdleHRlcm5hbFJlc3RyaWN0aW9ucy5jb25maXJtUGF0dGVybnMnKTtcbiAgICBpZiAoYWxsb3dQYXR0ZXJucykgdmFsaWRhdGVQYXR0ZXJuU3RyaW5ncyhhbGxvd1BhdHRlcm5zLCAnZXh0ZXJuYWxSZXN0cmljdGlvbnMuYWxsb3dQYXR0ZXJucycpO1xuICAgIC8vIFZhbGlkYXRlIGFwcHJvdmFsUG9saWN5IChJc3N1ZSAjNjI1IFBoYXNlIDMpXG4gICAgbGV0IGFwcHJvdmFsUG9saWN5OiBDbGlBcHByb3ZhbFBvbGljeSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAoZXIuYXBwcm92YWxQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKHR5cGVvZiBlci5hcHByb3ZhbFBvbGljeSAhPT0gJ29iamVjdCcgfHwgZXIuYXBwcm92YWxQb2xpY3kgPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeSBtdXN0IGJlIGFuIG9iamVjdCcpO1xuICAgICAgfVxuICAgICAgY29uc3QgYXAgPSBlci5hcHByb3ZhbFBvbGljeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAgICAgLy8gVmFsaWRhdGUgcmVxdWlyZUFwcHJvdmFsXG4gICAgICBsZXQgcmVxdWlyZUFwcHJvdmFsOiAoJ21vZGVyYXRlJyB8ICdkYW5nZXJvdXMnKVtdIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGFwLnJlcXVpcmVBcHByb3ZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcC5yZXF1aXJlQXBwcm92YWwpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeS5yZXF1aXJlQXBwcm92YWwgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbGlkTGV2ZWxzID0gbmV3IFNldChbJ21vZGVyYXRlJywgJ2Rhbmdlcm91cyddKTtcbiAgICAgICAgZm9yIChjb25zdCBsZXZlbCBvZiBhcC5yZXF1aXJlQXBwcm92YWwpIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGxldmVsICE9PSAnc3RyaW5nJyB8fCAhdmFsaWRMZXZlbHMuaGFzKGxldmVsKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeS5yZXF1aXJlQXBwcm92YWwgY29udGFpbnMgaW52YWxpZCB2YWx1ZSBcIiR7bGV2ZWx9XCIuIE11c3QgYmUgXCJtb2RlcmF0ZVwiIG9yIFwiZGFuZ2Vyb3VzXCIuYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJlcXVpcmVBcHByb3ZhbCA9IGFwLnJlcXVpcmVBcHByb3ZhbCBhcyAoJ21vZGVyYXRlJyB8ICdkYW5nZXJvdXMnKVtdO1xuICAgICAgfVxuXG4gICAgICAvLyBWYWxpZGF0ZSBkZWZhdWx0U2NvcGVcbiAgICAgIGxldCBkZWZhdWx0U2NvcGU6ICdzaW5nbGUnIHwgJ3Rvb2xfc2Vzc2lvbicgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoYXAuZGVmYXVsdFNjb3BlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKGFwLmRlZmF1bHRTY29wZSAhPT0gJ3NpbmdsZScgJiYgYXAuZGVmYXVsdFNjb3BlICE9PSAndG9vbF9zZXNzaW9uJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogZXh0ZXJuYWxSZXN0cmljdGlvbnMuYXBwcm92YWxQb2xpY3kuZGVmYXVsdFNjb3BlIG11c3QgYmUgXCJzaW5nbGVcIiBvciBcInRvb2xfc2Vzc2lvblwiLCBnb3QgXCIke2FwLmRlZmF1bHRTY29wZX1cImApO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHRTY29wZSA9IGFwLmRlZmF1bHRTY29wZTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgdHRsU2Vjb25kc1xuICAgICAgbGV0IHR0bFNlY29uZHM6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIGlmIChhcC50dGxTZWNvbmRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBhcC50dGxTZWNvbmRzICE9PSAnbnVtYmVyJyB8fCAhTnVtYmVyLmlzRmluaXRlKGFwLnR0bFNlY29uZHMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeS50dGxTZWNvbmRzIG11c3QgYmUgYSBudW1iZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXAudHRsU2Vjb25kcyA8IDMwIHx8IGFwLnR0bFNlY29uZHMgPiAzNjAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGdhdGVrZWVwZXIgcG9saWN5OiBleHRlcm5hbFJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeS50dGxTZWNvbmRzIG11c3QgYmUgYmV0d2VlbiAzMCBhbmQgMzYwMCwgZ290ICR7YXAudHRsU2Vjb25kc31gKTtcbiAgICAgICAgfVxuICAgICAgICB0dGxTZWNvbmRzID0gYXAudHRsU2Vjb25kcztcbiAgICAgIH1cblxuICAgICAgYXBwcm92YWxQb2xpY3kgPSB7IHJlcXVpcmVBcHByb3ZhbCwgZGVmYXVsdFNjb3BlLCB0dGxTZWNvbmRzIH07XG4gICAgfVxuXG4gICAgZXh0ZXJuYWxSZXN0cmljdGlvbnMgPSB7XG4gICAgICBkZXNjcmlwdGlvbjogZXIuZGVzY3JpcHRpb24gYXMgc3RyaW5nLFxuICAgICAgZGVueVBhdHRlcm5zLFxuICAgICAgY29uZmlybVBhdHRlcm5zLFxuICAgICAgYWxsb3dQYXR0ZXJucyxcbiAgICAgIGFwcHJvdmFsUG9saWN5LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFsbG93LFxuICAgIGNvbmZpcm0sXG4gICAgZGVueSxcbiAgICBzY29wZVJlc3RyaWN0aW9ucyxcbiAgICBleHRlcm5hbFJlc3RyaWN0aW9ucyxcbiAgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhdXRob3JlZCBnYXRla2VlcGVyIGlucHV0IGJlZm9yZSBzYXZlLlxuICpcbiAqIEF1dGhvcmluZy10aW1lIHZhbGlkYXRpb24gaXMgc3RyaWN0ZXIgdGhhbiBsb2FkLXRpbWUgc2FuaXRpemF0aW9uOiBpdCBzaG91bGRcbiAqIHJlamVjdCBtaXNwbGFjZWQgcG9saWN5IGJsb2NrcyBpbnN0ZWFkIG9mIHNpbGVudGx5IHNhdmluZyBhbiBlbGVtZW50IHRoYXRcbiAqIGxhdGVyIGFwcGVhcnMgYWN0aXZlIGJ1dCBoYXMgbm9uLWVuZm9yY2VhYmxlIGV4dGVybmFsIHJlc3RyaWN0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEdhdGVrZWVwZXJBdXRob3JpbmdFcnJvcnMoXG4gIHJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWRcbik6IHN0cmluZ1tdIHtcbiAgaWYgKCFyZWNvcmQgfHwgdHlwZW9mIHJlY29yZCAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBlcnJvcnM6IHN0cmluZ1tdID0gW107XG5cbiAgaWYgKE9iamVjdC5oYXNPd24ocmVjb3JkLCAnZXh0ZXJuYWxSZXN0cmljdGlvbnMnKSkge1xuICAgIGVycm9ycy5wdXNoKFxuICAgICAgJ0ludmFsaWQgZ2F0ZWtlZXBlciBwb2xpY3k6IGV4dGVybmFsUmVzdHJpY3Rpb25zIG11c3QgYmUgbmVzdGVkIHVuZGVyIGdhdGVrZWVwZXIuZXh0ZXJuYWxSZXN0cmljdGlvbnMnXG4gICAgKTtcbiAgfVxuXG4gIGlmIChyZWNvcmQuZ2F0ZWtlZXBlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIHBhcnNlRWxlbWVudFBvbGljeSh7IGdhdGVrZWVwZXI6IHJlY29yZC5nYXRla2VlcGVyIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBlcnJvcnMucHVzaChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBlcnJvcnM7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgdGhhdCBhIHZhbHVlIGlzIGFuIGFycmF5IG9mIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIHZhbGlkYXRlXG4gKiBAcGFyYW0gZmllbGROYW1lIC0gVGhlIGZpZWxkIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzXG4gKiBAcmV0dXJucyBUaGUgdmFsaWRhdGVkIGFycmF5LCBvciB1bmRlZmluZWRcbiAqL1xuZnVuY3Rpb24gdmFsaWRhdGVTdHJpbmdBcnJheShcbiAgdmFsdWU6IHVua25vd24sXG4gIGZpZWxkTmFtZTogc3RyaW5nXG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZ2F0ZWtlZXBlciBwb2xpY3k6ICR7ZmllbGROYW1lfSBtdXN0IGJlIGFuIGFycmF5YCk7XG4gIH1cblxuICBpZiAoIXZhbHVlLmV2ZXJ5KChpdGVtKTogaXRlbSBpcyBzdHJpbmcgPT4gdHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogJHtmaWVsZE5hbWV9IG11c3QgY29udGFpbiBvbmx5IHN0cmluZ3NgKTtcbiAgfVxuXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBwYXR0ZXJuIHN0cmluZ3MgZm9yIGxlbmd0aCBhbmQgbm9uLWVtcHRpbmVzcy5cbiAqXG4gKiBAcGFyYW0gcGF0dGVybnMgLSBBcnJheSBvZiBwYXR0ZXJuIHN0cmluZ3MgdG8gdmFsaWRhdGVcbiAqIEBwYXJhbSBmaWVsZE5hbWUgLSBGaWVsZCBuYW1lIGZvciBlcnJvciBtZXNzYWdlc1xuICogQHRocm93cyBFcnJvciBpZiBhbnkgcGF0dGVybiBpcyBlbXB0eSBvciBleGNlZWRzIE1BWF9HTE9CX1BBVFRFUk5fTEVOR1RIXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUGF0dGVyblN0cmluZ3MoXG4gIHBhdHRlcm5zOiBzdHJpbmdbXSxcbiAgZmllbGROYW1lOiBzdHJpbmdcbik6IHZvaWQge1xuICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICBpZiAoIXBhdHRlcm4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBnYXRla2VlcGVyIHBvbGljeTogJHtmaWVsZE5hbWV9IGNvbnRhaW5zIGFuIGVtcHR5IHBhdHRlcm4gc3RyaW5nYCk7XG4gICAgfVxuICAgIGlmIChwYXR0ZXJuLmxlbmd0aCA+IE1BWF9HTE9CX1BBVFRFUk5fTEVOR1RIKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZ2F0ZWtlZXBlciBwb2xpY3k6ICR7ZmllbGROYW1lfSBwYXR0ZXJuIGV4Y2VlZHMgbWF4aW11bSBsZW5ndGggb2YgJHtNQVhfR0xPQl9QQVRURVJOX0xFTkdUSH0gY2hhcmFjdGVyc2ApO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEtub3duIENMSSB0b29sIG5hbWVzIHVzZWQgaW4gZXh0ZXJuYWxSZXN0cmljdGlvbnMgcGF0dGVybnMuXG4gKiBQYXR0ZXJucyBzaG91bGQgc3RhcnQgd2l0aCBvbmUgb2YgdGhlc2UgZm9sbG93ZWQgYnkgJzonIHRvIGJlIGVmZmVjdGl2ZS5cbiAqL1xuY29uc3QgS05PV05fVE9PTF9QUkVGSVhFUyA9IG5ldyBTZXQoW1xuICAnQmFzaCcsICdFZGl0JywgJ1dyaXRlJywgJ1JlYWQnLCAnR2xvYicsICdHcmVwJyxcbiAgJ1dlYkZldGNoJywgJ1dlYlNlYXJjaCcsICdOb3RlYm9va0VkaXQnLFxuXSk7XG5cbi8qKlxuICogUmVnZXggY2hhcmFjdGVycyB0aGF0IGhhdmUgbm8gbWVhbmluZyBpbiBnbG9iIHN5bnRheC5cbiAqIFVzZXJzIHdobyBpbmNsdWRlIHRoZXNlIGxpa2VseSBpbnRlbmQgcmVnZXggYnV0IHRoZSBtYXRjaGVyIG9ubHkgc3VwcG9ydHMgKiBhbmQgPy5cbiAqL1xuY29uc3QgUkVHRVhfU1lOVEFYX1BBVFRFUk4gPSAvW3woKXt9W1xcXVxcXFwrXiRdLztcblxuLyoqXG4gKiBBbmFseXplIGV4dGVybmFsUmVzdHJpY3Rpb25zIHBhdHRlcm5zIGZvciBjb21tb24gbWlzdGFrZXMgYW5kIHN1c3BpY2lvdXMgc3ludGF4LlxuICpcbiAqIFJldHVybnMgbm9uLWZhdGFsIHdhcm5pbmdzIHRvIGhlbHAgTExNcyBhbmQgdXNlcnMgd3JpdGUgZWZmZWN0aXZlIHBhdHRlcm5zLlxuICogRG9lcyBOT1QgdGhyb3cg4oCUIHZhbGlkYXRpb24gZXJyb3JzIGFyZSBoYW5kbGVkIGJ5IHtAbGluayB2YWxpZGF0ZVBhdHRlcm5TdHJpbmdzfS5cbiAqXG4gKiBDaGVja3MgcGVyZm9ybWVkIChJc3N1ZSAjMTY2NCk6XG4gKiAtIE1pc3NpbmcgdG9vbCBwcmVmaXggKHBhdHRlcm4gZG9lc24ndCBzdGFydCB3aXRoIFRvb2xOYW1lOilcbiAqIC0gT3Zlcmx5IGJyb2FkIHBhdHRlcm5zIChiYXJlIGAqYCBvciBgVG9vbE5hbWU6KmApXG4gKiAtIFJlZ2V4IHN5bnRheCB0aGF0IHdvbid0IHdvcmsgaW4gZ2xvYiBtYXRjaGluZ1xuICogLSBMZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2VcbiAqXG4gKiBAcGFyYW0gcGF0dGVybnMgLSBBcnJheSBvZiBwYXR0ZXJuIHN0cmluZ3MgdG8gYW5hbHl6ZVxuICogQHBhcmFtIGZpZWxkTmFtZSAtIEZpZWxkIG5hbWUgZm9yIHdhcm5pbmcgbWVzc2FnZXNcbiAqIEByZXR1cm5zIEFycmF5IG9mIHdhcm5pbmcgbWVzc2FnZXMgKGVtcHR5IGlmIG5vIGlzc3VlcyBmb3VuZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuYWx5emVQYXR0ZXJuU3ludGF4KFxuICBwYXR0ZXJuczogc3RyaW5nW10sXG4gIGZpZWxkTmFtZTogc3RyaW5nXG4pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICBhbmFseXplT25lUGF0dGVybihwYXR0ZXJuLCBmaWVsZE5hbWUsIHdhcm5pbmdzKTtcbiAgfVxuICByZXR1cm4gd2FybmluZ3M7XG59XG5cbi8qKlxuICogQW5hbHl6ZSBhIHNpbmdsZSBwYXR0ZXJuIHN0cmluZyBhbmQgYXBwZW5kIGFueSB3YXJuaW5ncyBmb3VuZC5cbiAqIEV4dHJhY3RlZCBmcm9tIHtAbGluayBhbmFseXplUGF0dGVyblN5bnRheH0gdG8gcmVkdWNlIGNvZ25pdGl2ZSBjb21wbGV4aXR5LlxuICovXG5mdW5jdGlvbiBhbmFseXplT25lUGF0dGVybihcbiAgcGF0dGVybjogc3RyaW5nLFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgd2FybmluZ3M6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgLy8gQ2hlY2sgbGVhZGluZy90cmFpbGluZyB3aGl0ZXNwYWNlXG4gIGlmIChwYXR0ZXJuICE9PSBwYXR0ZXJuLnRyaW0oKSkge1xuICAgIHdhcm5pbmdzLnB1c2goXG4gICAgICBgJHtmaWVsZE5hbWV9IHBhdHRlcm4gJyR7cGF0dGVybn0nIGhhcyBsZWFkaW5nL3RyYWlsaW5nIHdoaXRlc3BhY2Ug4oCUIHRoaXMgbWF5IHByZXZlbnQgZXhwZWN0ZWQgbWF0Y2hlc2BcbiAgICApO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIGJhcmUgd2lsZGNhcmQgKG1hdGNoZXMgZXZlcnl0aGluZylcbiAgaWYgKHBhdHRlcm4gPT09ICcqJykge1xuICAgIHdhcm5pbmdzLnB1c2goXG4gICAgICBgJHtmaWVsZE5hbWV9IHBhdHRlcm4gJyonIG1hdGNoZXMgZXZlcnl0aGluZyDigJQgdGhpcyBpcyBsaWtlbHkgdW5pbnRlbnRpb25hbGBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIENoZWNrIGZvciB0b29sIHByZWZpeCBhbmQgcmVsYXRlZCBpc3N1ZXNcbiAgY29uc3QgY29sb25JbmRleCA9IHBhdHRlcm4uaW5kZXhPZignOicpO1xuICBpZiAoY29sb25JbmRleCA9PT0gLTEpIHtcbiAgICB3YXJuaW5ncy5wdXNoKFxuICAgICAgYCR7ZmllbGROYW1lfSBwYXR0ZXJuICcke3BhdHRlcm59JyBoYXMgbm8gdG9vbCBwcmVmaXggKGUuZy4sICdCYXNoOicsICdFZGl0OicpLiBgICtcbiAgICAgIGBQYXR0ZXJucyBhcmUgbWF0Y2hlZCBhZ2FpbnN0ICdUb29sTmFtZTppbnB1dCcgc3RyaW5ncyBhbmQgd2lsbCBub3QgbWF0Y2ggd2l0aG91dCBhIHByZWZpeC5gXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICBjaGVja1Rvb2xQcmVmaXgocGF0dGVybiwgY29sb25JbmRleCwgZmllbGROYW1lLCB3YXJuaW5ncyk7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgcmVnZXggc3ludGF4IHRoYXQgd29uJ3Qgd29yayBpbiBnbG9iXG4gIGNvbnN0IHJlZ2V4Q2hhcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBjaCBvZiBwYXR0ZXJuKSB7XG4gICAgaWYgKFJFR0VYX1NZTlRBWF9QQVRURVJOLnRlc3QoY2gpKSByZWdleENoYXJzLmFkZChjaCk7XG4gIH1cbiAgaWYgKHJlZ2V4Q2hhcnMuc2l6ZSA+IDApIHtcbiAgICB3YXJuaW5ncy5wdXNoKFxuICAgICAgYCR7ZmllbGROYW1lfSBwYXR0ZXJuICcke3BhdHRlcm59JyBjb250YWlucyByZWdleCBzeW50YXggJyR7Wy4uLnJlZ2V4Q2hhcnNdLmpvaW4oJywgJyl9JyDigJQgYCArXG4gICAgICBgb25seSBnbG9iIHdpbGRjYXJkcyAoKiBhbmQgPykgYXJlIHN1cHBvcnRlZGBcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgdG9vbCBwcmVmaXggdmFsaWRpdHkgYW5kIGJyb2FkbmVzcyBmb3IgYSBwYXR0ZXJuIHRoYXQgY29udGFpbnMgJzonLlxuICovXG5mdW5jdGlvbiBjaGVja1Rvb2xQcmVmaXgoXG4gIHBhdHRlcm46IHN0cmluZyxcbiAgY29sb25JbmRleDogbnVtYmVyLFxuICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgd2FybmluZ3M6IHN0cmluZ1tdXG4pOiB2b2lkIHtcbiAgY29uc3QgcHJlZml4ID0gcGF0dGVybi5zbGljZSgwLCBjb2xvbkluZGV4KTtcbiAgY29uc3QgYWZ0ZXJDb2xvbiA9IHBhdHRlcm4uc2xpY2UoY29sb25JbmRleCArIDEpO1xuXG4gIC8vIENoZWNrIGZvciB1bmtub3duIHRvb2wgcHJlZml4XG4gIGlmICghS05PV05fVE9PTF9QUkVGSVhFUy5oYXMocHJlZml4KSAmJiAhcHJlZml4LnN0YXJ0c1dpdGgoJ21jcF8nKSkge1xuICAgIHdhcm5pbmdzLnB1c2goXG4gICAgICBgJHtmaWVsZE5hbWV9IHBhdHRlcm4gJyR7cGF0dGVybn0nIHVzZXMgdW5rbm93biB0b29sIHByZWZpeCAnJHtwcmVmaXh9Jy4gYCArXG4gICAgICBgS25vd24gcHJlZml4ZXM6ICR7Wy4uLktOT1dOX1RPT0xfUFJFRklYRVNdLmpvaW4oJywgJyl9LiBNQ1AgdG9vbHMgdXNlICdtY3BfJyBwcmVmaXguYFxuICAgICk7XG4gIH1cblxuICAvLyBDaGVjayBmb3Igb3Zlcmx5IGJyb2FkIFRvb2xOYW1lOiogcGF0dGVyblxuICBpZiAoYWZ0ZXJDb2xvbiA9PT0gJyonKSB7XG4gICAgd2FybmluZ3MucHVzaChcbiAgICAgIGAke2ZpZWxkTmFtZX0gcGF0dGVybiAnJHtwYXR0ZXJufScgbWF0Y2hlcyBBTEwgJHtwcmVmaXh9IG9wZXJhdGlvbnMg4oCUIHZlcmlmeSB0aGlzIGlzIGludGVudGlvbmFsYFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSBhbmQgc2FuaXRpemUgYSBnYXRla2VlcGVyIHBvbGljeSBkdXJpbmcgZWxlbWVudCBkZXNlcmlhbGl6YXRpb24uXG4gKlxuICogUmV0dXJucyBhIHZhbGlkYXRlZCB7QGxpbmsgRWxlbWVudEdhdGVrZWVwZXJQb2xpY3l9IGlmIHRoZSByYXcgZGF0YSBpc1xuICogc3RydWN0dXJhbGx5IHZhbGlkLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgZGF0YSBpcyBhYnNlbnQsIGZhbHN5LCBvclxuICogbWFsZm9ybWVkLiBNYWxmb3JtZWQgcG9saWNpZXMgYXJlIGxvZ2dlZCBhcyBzZWN1cml0eSBldmVudHMgYW5kIHN0cmlwcGVkXG4gKiBzbyB0aGV5IG5ldmVyIHJlYWNoIHRoZSBlbmZvcmNlbWVudCBwaXBlbGluZS5cbiAqXG4gKiBVc2UgdGhpcyBhdCBldmVyeSBkZXNlcmlhbGl6YXRpb24gYm91bmRhcnkgKG1hbmFnZXIgYHBhcnNlTWV0YWRhdGFgIC9cbiAqIGBzYW5pdGl6ZU1ldGFkYXRhYCAvIGBwYXJzZU1lbW9yeUZpbGVgKSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IHdlbGwtZm9ybWVkXG4gKiBwb2xpY2llcyBzdXJ2aXZlIGxvYWRpbmcuXG4gKlxuICogQHBhcmFtIHJhd1BvbGljeSAtIFRoZSByYXcgZ2F0ZWtlZXBlciB2YWx1ZSBmcm9tIHBhcnNlZCBZQU1ML0pTT05cbiAqIEBwYXJhbSBlbGVtZW50TmFtZSAtIEVsZW1lbnQgbmFtZSBmb3IgZGlhZ25vc3RpYyBsb2dnaW5nXG4gKiBAcGFyYW0gZWxlbWVudFR5cGUgLSBFbGVtZW50IHR5cGUgZm9yIGRpYWdub3N0aWMgbG9nZ2luZ1xuICogQHJldHVybnMgVmFsaWRhdGVkIHBvbGljeSBvciB1bmRlZmluZWRcbiAqXG4gKiBAc2luY2UgSXNzdWUgIzUyNCDigJQgUnVudGltZSB2YWxpZGF0aW9uIGZvciBhbGwgZWxlbWVudCB0eXBlc1xuICovXG4vKipcbiAqIEdhdGVrZWVwZXIgaW5mcmFzdHJ1Y3R1cmUgb3BlcmF0aW9ucyDigJQgdHdvIHJlbGF0ZWQgc2V0cyB3aXRoIGRpc3RpbmN0IHB1cnBvc2VzLlxuICpcbiAqIFVOR0FUQUJMRV9PUEVSQVRJT05TOiBPcGVyYXRpb25zIHRoYXQgbXVzdCBORVZFUiBhcHBlYXIgaW4gZWxlbWVudCBwb2xpY3kgbGlzdHMuXG4gKiBUaGVzZSBhcmUgcHVyZSBpbnRlcm5hbCBwbHVtYmluZyDigJQgZ2F0aW5nIHRoZW0gc2VydmVzIG5vIHNlY3VyaXR5IHB1cnBvc2UgYW5kXG4gKiBicmVha3MgY3JpdGljYWwgZmxvd3MgKHZlcmlmaWNhdGlvbiwgQ0xJIGFwcHJvdmFsLCBwZXJtaXNzaW9uIGV2YWx1YXRpb24pLlxuICogU3RyaXBwZWQgZnJvbSBBTEwgcG9saWN5IGxpc3RzIChhbGxvdywgY29uZmlybSwgZGVueSkgZHVyaW5nIHNhbml0aXphdGlvbi5cbiAqXG4gKiBHQVRFS0VFUEVSX0lORlJBX09QRVJBVElPTlM6IE9wZXJhdGlvbnMgdGhhdCBza2lwIExheWVyIDIgKGVsZW1lbnQgcG9saWN5XG4gKiByZXNvbHV0aW9uKSBkdXJpbmcgcHJpbWFyeSBlbmZvcmNlbWVudC4gVGhpcyBpcyBhIFNVUEVSU0VUIG9mIFVOR0FUQUJMRV9PUEVSQVRJT05TXG4gKiDigJQgaXQgYWRkcyBjb25maXJtX29wZXJhdGlvbiwgd2hpY2ggSVMgYSB2YWxpZCBwb2xpY3kgdGFyZ2V0IChkZW55ID0gbnVjbGVhciBzYW5kYm94KVxuICogYnV0IG11c3Qgbm90IGJlIGdhdGVkIHRocm91Z2ggdGhlIG5vcm1hbCBlbmZvcmNlKCkgcGF0aCAodGhhdCBjcmVhdGVzIHRoZVxuICogY2FzY2FkaW5nIGNvbmZpcm1hdGlvbiBsb29wIGZyb20gSXNzdWUgIzc1OCkuIGNvbmZpcm1fb3BlcmF0aW9uJ3MgZWxlbWVudCBwb2xpY2llc1xuICogYXJlIGVuZm9yY2VkIHRocm91Z2ggYSBzZXBhcmF0ZSBjaGVjayBpbiB0aGUgY29uZmlybSBoYW5kbGVyIGluc3RlYWQuXG4gKlxuICogUmVsYXRpb25zaGlwOiBHQVRFS0VFUEVSX0lORlJBX09QRVJBVElPTlMgPSBVTkdBVEFCTEVfT1BFUkFUSU9OUyArIGNvbmZpcm1fb3BlcmF0aW9uXG4gKiBUaGlzIGRlcml2YXRpb24gaXMgZXhwbGljaXQgaW4gY29kZSB0byBwcmV2ZW50IHRoZSBzZXRzIGZyb20gZHJpZnRpbmcgYXBhcnQuXG4gKi9cbmNvbnN0IFVOR0FUQUJMRV9PUEVSQVRJT05TID0gbmV3IFNldChbXG4gICd2ZXJpZnlfY2hhbGxlbmdlJyxcbiAgJ2FwcHJvdmVfY2xpX3Blcm1pc3Npb24nLFxuICAncGVybWlzc2lvbl9wcm9tcHQnLFxuXSk7XG5cbi8qKiBEZXJpdmVkIGZyb20gVU5HQVRBQkxFX09QRVJBVElPTlMgKyBjb25maXJtX29wZXJhdGlvbi4gU2VlIGJsb2NrIGNvbW1lbnQgYWJvdmUuICovXG5jb25zdCBHQVRFS0VFUEVSX0lORlJBX09QRVJBVElPTlMgPSBuZXcgU2V0KFtcbiAgLi4uVU5HQVRBQkxFX09QRVJBVElPTlMsXG4gICdjb25maXJtX29wZXJhdGlvbicsXG5dKTtcblxuLyoqXG4gKiBDaGVjayBpZiBhbiBvcGVyYXRpb24gaXMgYSBnYXRla2VlcGVyIGluZnJhc3RydWN0dXJlIG9wZXJhdGlvbiB0aGF0IHNob3VsZFxuICogc2tpcCBlbGVtZW50IHBvbGljeSBldmFsdWF0aW9uIGluIHRoZSBwcmltYXJ5IGVuZm9yY2VtZW50IHBhdGguXG4gKiBFeHBvcnRlZCBmb3IgdXNlIGJ5IE1DUEFRTEhhbmRsZXIuIElzc3VlICM3NTguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0dhdGVrZWVwZXJJbmZyYU9wZXJhdGlvbihvcGVyYXRpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gR0FURUtFRVBFUl9JTkZSQV9PUEVSQVRJT05TLmhhcyhvcGVyYXRpb24pO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGFueSBhY3RpdmUgZWxlbWVudHMgZGVueSBjb25maXJtX29wZXJhdGlvbiAobnVjbGVhciBzYW5kYm94KS5cbiAqIFJldHVybnMgdGhlIGRlbnlpbmcgZWxlbWVudCBuYW1lIGlmIGZvdW5kLCB1bmRlZmluZWQgb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZENvbmZpcm1EZW55aW5nRWxlbWVudChcbiAgYWN0aXZlRWxlbWVudHM6IEFycmF5PHsgbmFtZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB9PlxuKTogeyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFjdGl2ZUVsZW1lbnRzKSB7XG4gICAgY29uc3QgZ2F0ZWtlZXBlciA9IGVsZW1lbnQubWV0YWRhdGE/LmdhdGVrZWVwZXIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGVueUxpc3QgPSBnYXRla2VlcGVyPy5kZW55O1xuICAgIGlmIChBcnJheS5pc0FycmF5KGRlbnlMaXN0KSAmJiBkZW55TGlzdC5pbmNsdWRlcygnY29uZmlybV9vcGVyYXRpb24nKSkge1xuICAgICAgcmV0dXJuIHsgbmFtZTogZWxlbWVudC5uYW1lLCB0eXBlOiBlbGVtZW50LnR5cGUgfTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbnkgYWN0aXZlIGVsZW1lbnRzIGhhdmUgY29uZmlybV9vcGVyYXRpb24gaW4gdGhlaXIgY29uZmlybSBsaXN0IChhZHZpc29yeSkuXG4gKiBSZXR1cm5zIHRoZSBlbGVtZW50IG5hbWVzIHRoYXQgcmVxdWVzdCBhZGRpdGlvbmFsIHNjcnV0aW55LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZENvbmZpcm1BZHZpc29yeUVsZW1lbnRzKFxuICBhY3RpdmVFbGVtZW50czogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZzsgbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0+XG4pOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nIH0+IHtcbiAgY29uc3QgYWR2aXNvcmllczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9PiA9IFtdO1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYWN0aXZlRWxlbWVudHMpIHtcbiAgICBjb25zdCBnYXRla2VlcGVyID0gZWxlbWVudC5tZXRhZGF0YT8uZ2F0ZWtlZXBlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBjb25maXJtTGlzdCA9IGdhdGVrZWVwZXI/LmNvbmZpcm07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlybUxpc3QpICYmIGNvbmZpcm1MaXN0LmluY2x1ZGVzKCdjb25maXJtX29wZXJhdGlvbicpKSB7XG4gICAgICBhZHZpc29yaWVzLnB1c2goeyBuYW1lOiBlbGVtZW50Lm5hbWUsIHR5cGU6IGVsZW1lbnQudHlwZSB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFkdmlzb3JpZXM7XG59XG5cbi8qKlxuICogU3RyaXAgdW5nYXRhYmxlIG9wZXJhdGlvbnMgZnJvbSBhIHBvbGljeSBsaXN0IGFuZCBsb2cgd2FybmluZ3MuXG4gKiBSZXR1cm5zIHRoZSBmaWx0ZXJlZCBsaXN0IChtYXkgYmUgZW1wdHkpLlxuICpcbiAqIE5vdGU6IGNvbmZpcm1fb3BlcmF0aW9uIGlzIE5PVCBzdHJpcHBlZCBmcm9tIGRlbnkgbGlzdHMg4oCUIGl0J3MgYSBsZWdpdGltYXRlXG4gKiBzYW5kYm94IG1lY2hhbmlzbS4gSXQgSVMgc3RyaXBwZWQgZnJvbSBhbGxvdy9jb25maXJtIGxpc3RzIHNpbmNlIHRob3NlIGFyZVxuICogaGFuZGxlZCB0aHJvdWdoIGFkdmlzb3J5IG1lc3NhZ2luZywgbm90IHRocm91Z2ggZW5mb3JjZSgpLlxuICovXG5mdW5jdGlvbiBzdHJpcFVuZ2F0YWJsZShcbiAgb3BlcmF0aW9uczogc3RyaW5nW10gfCB1bmRlZmluZWQsXG4gIGxpc3ROYW1lOiBzdHJpbmcsXG4gIGVsZW1lbnROYW1lOiBzdHJpbmcsXG4gIGVsZW1lbnRUeXBlOiBzdHJpbmcsXG4pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIGlmICghb3BlcmF0aW9ucz8ubGVuZ3RoKSByZXR1cm4gb3BlcmF0aW9ucztcblxuICAvLyBjb25maXJtX29wZXJhdGlvbiBpbiBkZW55IGxpc3RzID0gbnVjbGVhciBzYW5kYm94IChwcmVzZXJ2ZSlcbiAgLy8gY29uZmlybV9vcGVyYXRpb24gaW4gY29uZmlybSBsaXN0cyA9IGFkdmlzb3J5IG1hcmtlciAocHJlc2VydmUg4oCUIGluZXJ0IGluIGVuZm9yY2UgcGF0aCxcbiAgLy8gICByZWFkIGF0IHJ1bnRpbWUgYnkgZmluZENvbmZpcm1BZHZpc29yeUVsZW1lbnRzKCkuIFNhZmUgYmVjYXVzZSBza2lwRWxlbWVudFBvbGljaWVzXG4gIC8vICAgcHJldmVudHMgcmVzb2x2ZUVsZW1lbnRQb2xpY3koKSBmcm9tIGV2ZXIgZXZhbHVhdGluZyBjb25maXJtX29wZXJhdGlvbiBhcyBhbiBvcGVyYXRpb24uKVxuICAvLyBjb25maXJtX29wZXJhdGlvbiBpbiBhbGxvdyBsaXN0cyA9IHJlZHVuZGFudCB3aXRoIHJvdXRlIGRlZmF1bHQgQVVUT19BUFBST1ZFIChzdHJpcClcbiAgY29uc3Qgb3BzVG9TdHJpcCA9IGxpc3ROYW1lID09PSAnYWxsb3cnXG4gICAgPyBuZXcgU2V0KFsuLi5VTkdBVEFCTEVfT1BFUkFUSU9OUywgJ2NvbmZpcm1fb3BlcmF0aW9uJ10pXG4gICAgOiBVTkdBVEFCTEVfT1BFUkFUSU9OUztcblxuICBjb25zdCBzdHJpcHBlZCA9IG9wZXJhdGlvbnMuZmlsdGVyKG9wID0+IHtcbiAgICBpZiAob3BzVG9TdHJpcC5oYXMob3ApKSB7XG4gICAgICBsb2dnZXIud2FybihcbiAgICAgICAgYFtHYXRla2VlcGVyXSBTdHJpcHBlZCBcIiR7b3B9XCIgZnJvbSAke2xpc3ROYW1lfSBsaXN0IGluICR7ZWxlbWVudFR5cGV9IFwiJHtlbGVtZW50TmFtZX1cIiDigJQgYCArXG4gICAgICAgIGBnYXRla2VlcGVyIGluZnJhc3RydWN0dXJlIG9wZXJhdGlvbnMgY2Fubm90IGJlIGdhdGVkIGJ5IGVsZW1lbnQgcG9saWNpZXMgKElzc3VlICM3NTgpYFxuICAgICAgKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xuICByZXR1cm4gc3RyaXBwZWQubGVuZ3RoID4gMCA/IHN0cmlwcGVkIDogdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemVHYXRla2VlcGVyUG9saWN5KFxuICByYXdQb2xpY3k6IHVua25vd24sXG4gIGVsZW1lbnROYW1lOiBzdHJpbmcsXG4gIGVsZW1lbnRUeXBlOiBzdHJpbmcsXG4pOiBFbGVtZW50R2F0ZWtlZXBlclBvbGljeSB8IHVuZGVmaW5lZCB7XG4gIGlmICghcmF3UG9saWN5IHx8IHR5cGVvZiByYXdQb2xpY3kgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gV3JhcCBpbiBhIG1ldGFkYXRhIGVudmVsb3BlIHNvIHBhcnNlRWxlbWVudFBvbGljeSBjYW4gZXh0cmFjdCBpdFxuICAgIGNvbnN0IHZhbGlkYXRlZCA9IHBhcnNlRWxlbWVudFBvbGljeSh7IGdhdGVrZWVwZXI6IHJhd1BvbGljeSB9KTtcbiAgICBpZiAodmFsaWRhdGVkKSB7XG4gICAgICAvLyBJc3N1ZSAjNzU4OiBTdHJpcCBnYXRla2VlcGVyIGluZnJhc3RydWN0dXJlIG9wZXJhdGlvbnMgZnJvbSBlbGVtZW50IHBvbGljaWVzXG4gICAgICAvLyB0byBwcmV2ZW50IGNhc2NhZGluZyBjb25maXJtYXRpb24gbG9vcHNcbiAgICAgIHZhbGlkYXRlZC5hbGxvdyA9IHN0cmlwVW5nYXRhYmxlKHZhbGlkYXRlZC5hbGxvdywgJ2FsbG93JywgZWxlbWVudE5hbWUsIGVsZW1lbnRUeXBlKTtcbiAgICAgIHZhbGlkYXRlZC5jb25maXJtID0gc3RyaXBVbmdhdGFibGUodmFsaWRhdGVkLmNvbmZpcm0sICdjb25maXJtJywgZWxlbWVudE5hbWUsIGVsZW1lbnRUeXBlKTtcbiAgICAgIHZhbGlkYXRlZC5kZW55ID0gc3RyaXBVbmdhdGFibGUodmFsaWRhdGVkLmRlbnksICdkZW55JywgZWxlbWVudE5hbWUsIGVsZW1lbnRUeXBlKTtcblxuICAgICAgbG9nZ2VyLmRlYnVnKGBMb2FkZWQgZ2F0ZWtlZXBlciBwb2xpY3kgZm9yICR7ZWxlbWVudFR5cGV9IFwiJHtlbGVtZW50TmFtZX1cImAsIHtcbiAgICAgICAgYWxsb3c6IHZhbGlkYXRlZC5hbGxvdz8ubGVuZ3RoID8/IDAsXG4gICAgICAgIGNvbmZpcm06IHZhbGlkYXRlZC5jb25maXJtPy5sZW5ndGggPz8gMCxcbiAgICAgICAgZGVueTogdmFsaWRhdGVkLmRlbnk/Lmxlbmd0aCA/PyAwLFxuICAgICAgICBoYXNTY29wZVJlc3RyaWN0aW9uczogISF2YWxpZGF0ZWQuc2NvcGVSZXN0cmljdGlvbnMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRlZDtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdZQU1MX1BBUlNJTkdfV0FSTklORycsXG4gICAgICBzZXZlcml0eTogJ01FRElVTScsXG4gICAgICBzb3VyY2U6IGAke2VsZW1lbnRUeXBlfS5kZXNlcmlhbGl6ZWAsXG4gICAgICBkZXRhaWxzOiBgTWFsZm9ybWVkIGdhdGVrZWVwZXIgcG9saWN5IGluIFwiJHtlbGVtZW50TmFtZX1cIiBzdHJpcHBlZCBkdXJpbmcgbG9hZDogJHttZXNzYWdlfWAsXG4gICAgfSk7XG4gICAgbG9nZ2VyLndhcm4oYFN0cmlwcGVkIG1hbGZvcm1lZCBnYXRla2VlcGVyIHBvbGljeSBmcm9tICR7ZWxlbWVudFR5cGV9IFwiJHtlbGVtZW50TmFtZX1cIjogJHttZXNzYWdlfWApO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
@@ -1 +1 @@
1
- {"version":3,"file":"BaseActivationStrategy.d.ts","sourceRoot":"","sources":["../../../src/handlers/strategies/BaseActivationStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D;;GAEG;AACH,8BAAsB,sBAAsB;IAC1C;;;;;OAKG;cACa,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAInF;;;;OAIG;IACH,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;IAS3D;;;;OAIG;IACH,SAAS,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;IAS7D;;;;;;;;;;OAUG;IACH,SAAS,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK;IAI/D;;;;OAIG;IACH,SAAS,CAAC,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW;IAKzE;;;;;;;;OAQG;IACH,SAAS,CAAC,wBAAwB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;CA4B9E"}
1
+ {"version":3,"file":"BaseActivationStrategy.d.ts","sourceRoot":"","sources":["../../../src/handlers/strategies/BaseActivationStrategy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAG7D;;GAEG;AACH,8BAAsB,sBAAsB;IAC1C;;;;;OAKG;cACa,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC;IAInF;;;;OAIG;IACH,SAAS,CAAC,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;IAS3D;;;;OAIG;IACH,SAAS,CAAC,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;IAS7D;;;;;;;;;;OAUG;IACH,SAAS,CAAC,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK;IAI/D;;;;OAIG;IACH,SAAS,CAAC,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW;IAKzE;;;;;;;;OAQG;IACH,SAAS,CAAC,wBAAwB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;CAsC9E"}
@@ -7,6 +7,7 @@
7
7
  */
8
8
  import { findElementFlexibly as findHelper } from '../element-crud/helpers.js';
9
9
  import { ElementNotFoundError } from '../../utils/ErrorHandler.js';
10
+ import { getPermissionHookStatus } from '../../utils/permissionHooks.js';
10
11
  /**
11
12
  * Base class with shared utilities for activation strategies
12
13
  */
@@ -83,7 +84,10 @@ export class BaseActivationStrategy {
83
84
  const restrictions = gatekeeper?.externalRestrictions;
84
85
  if (!restrictions)
85
86
  return '';
86
- const parts = ['\n---\n**CLI Restrictions Active:**'];
87
+ const hookStatus = getPermissionHookStatus();
88
+ const parts = [hookStatus.installed
89
+ ? '\n---\n**CLI Policies Loaded:**'
90
+ : '\n---\n**CLI Policies Loaded (Hook Not Detected):**'];
87
91
  if (restrictions.description) {
88
92
  parts.push(`> ${restrictions.description}`);
89
93
  }
@@ -103,8 +107,13 @@ export class BaseActivationStrategy {
103
107
  parts.push(`> Requires approval for: ${requireApproval.join(', ')} risk tools`);
104
108
  }
105
109
  parts.push('> Use `get_effective_cli_policies` to see combined policy state.');
106
- parts.push('> NOTE: These restrictions require the CLI client to be launched with `--permission-prompt-tool` to be enforced.');
110
+ if (hookStatus.installed) {
111
+ parts.push(`> Permission hook detected for ${hookStatus.host ?? 'this client'}. Enforcement depends on using that client configuration.`);
112
+ }
113
+ else {
114
+ parts.push('> No permission hook detected. These policies are not automatically enforced unless the CLI is launched with `--permission-prompt-tool`.', '> Run `open_setup` and reinstall to wire automatic enforcement.');
115
+ }
107
116
  return parts.join('\n');
108
117
  }
109
118
  }
110
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUFjdGl2YXRpb25TdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oYW5kbGVycy9zdHJhdGVnaWVzL0Jhc2VBY3RpdmF0aW9uU3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixJQUFJLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBR25FOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixzQkFBc0I7SUFDMUM7Ozs7O09BS0c7SUFDTyxLQUFLLENBQUMsbUJBQW1CLENBQUMsSUFBWSxFQUFFLFdBQWtCO1FBQ2xFLE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLG1CQUFtQixDQUFDLE9BQWU7UUFDM0MsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDO29CQUNSLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxPQUFPO2lCQUNkLENBQUM7U0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDTyxxQkFBcUIsQ0FBQyxPQUFlO1FBQzdDLE9BQU87WUFDTCxPQUFPLEVBQUUsQ0FBQztvQkFDUixJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsT0FBTztpQkFDZCxDQUFDO1NBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ08sa0JBQWtCLENBQUMsSUFBWSxFQUFFLElBQVk7UUFDckQsTUFBTSxJQUFJLG9CQUFvQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLHNCQUFzQixDQUFDLElBQVksRUFBRSxJQUFZO1FBQ3pELHNGQUFzRjtRQUN0RixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLElBQUksS0FBSyxJQUFJLGFBQWEsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNPLHdCQUF3QixDQUFDLFFBQWlDO1FBQ2xFLE1BQU0sVUFBVSxHQUFHLFFBQVEsRUFBRSxVQUFpRCxDQUFDO1FBQy9FLE1BQU0sWUFBWSxHQUFHLFVBQVUsRUFBRSxvQkFBMkQsQ0FBQztRQUM3RixJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRTdCLE1BQU0sS0FBSyxHQUFhLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUNoRSxJQUFJLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM3QixLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxZQUFvQyxDQUFDO1FBQ3ZFLElBQUksWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsS0FBSyxHQUFHLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDMUUsQ0FBQztRQUNELE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxhQUFxQyxDQUFDO1FBQ3pFLElBQUksYUFBYSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQzFCLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuRCxLQUFLLENBQUMsSUFBSSxDQUFDLG1CQUFtQixLQUFLLEdBQUcsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqRixDQUFDO1FBQ0QsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLGNBQXFELENBQUM7UUFDMUYsTUFBTSxlQUFlLEdBQUcsY0FBYyxFQUFFLGVBQXVDLENBQUM7UUFDaEYsSUFBSSxlQUFlLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDNUIsS0FBSyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsZUFBZSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbEYsQ0FBQztRQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsa0VBQWtFLENBQUMsQ0FBQztRQUMvRSxLQUFLLENBQUMsSUFBSSxDQUFDLGtIQUFrSCxDQUFDLENBQUM7UUFDL0gsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmFzZUFjdGl2YXRpb25TdHJhdGVneSAtIFNoYXJlZCBmdW5jdGlvbmFsaXR5IGZvciBhbGwgYWN0aXZhdGlvbiBzdHJhdGVnaWVzXG4gKlxuICogUHJvdmlkZXMgY29tbW9uIGhlbHBlciBtZXRob2RzIHVzZWQgYnkgbXVsdGlwbGUgc3RyYXRlZ3kgaW1wbGVtZW50YXRpb25zOlxuICogLSBGbGV4aWJsZSBlbGVtZW50IGZpbmRpbmcgKGJ5IG5hbWUgb3IgZmlsZW5hbWUpXG4gKiAtIEVycm9yIHJlc3BvbnNlIGZvcm1hdHRpbmdcbiAqL1xuXG5pbXBvcnQgeyBmaW5kRWxlbWVudEZsZXhpYmx5IGFzIGZpbmRIZWxwZXIgfSBmcm9tICcuLi9lbGVtZW50LWNydWQvaGVscGVycy5qcyc7XG5pbXBvcnQgeyBFbGVtZW50Tm90Rm91bmRFcnJvciB9IGZyb20gJy4uLy4uL3V0aWxzL0Vycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgeyBNQ1BSZXNwb25zZSB9IGZyb20gJy4vRWxlbWVudEFjdGl2YXRpb25TdHJhdGVneS5qcyc7XG5cbi8qKlxuICogQmFzZSBjbGFzcyB3aXRoIHNoYXJlZCB1dGlsaXRpZXMgZm9yIGFjdGl2YXRpb24gc3RyYXRlZ2llc1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUFjdGl2YXRpb25TdHJhdGVneSB7XG4gIC8qKlxuICAgKiBGaW5kIGFuIGVsZW1lbnQgYnkgbmFtZSwgc3VwcG9ydGluZyBib3RoIGV4YWN0IGRpc3BsYXkgbmFtZSBhbmQgZmlsZW5hbWUgKHNsdWcpIG1hdGNoaW5nXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb3IgZmlsZW5hbWUgdG8gc2VhcmNoIGZvclxuICAgKiBAcGFyYW0gZWxlbWVudExpc3QgLSBMaXN0IG9mIGVsZW1lbnRzIHRvIHNlYXJjaCB0aHJvdWdoXG4gICAqIEByZXR1cm5zIFRoZSBmb3VuZCBlbGVtZW50IG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGZpbmRFbGVtZW50RmxleGlibHkobmFtZTogc3RyaW5nLCBlbGVtZW50TGlzdDogYW55W10pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiBmaW5kSGVscGVyKG5hbWUsIGVsZW1lbnRMaXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzdGFuZGFyZCBlcnJvciByZXNwb25zZVxuICAgKiBAcGFyYW0gbWVzc2FnZSAtIFRoZSBlcnJvciBtZXNzYWdlXG4gICAqIEByZXR1cm5zIE1DUC1mb3JtYXR0ZWQgZXJyb3IgcmVzcG9uc2VcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVFcnJvclJlc3BvbnNlKG1lc3NhZ2U6IHN0cmluZyk6IE1DUFJlc3BvbnNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3tcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgIHRleHQ6IG1lc3NhZ2VcbiAgICAgIH1dXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBzdGFuZGFyZCBzdWNjZXNzIHJlc3BvbnNlXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIHN1Y2Nlc3MgbWVzc2FnZVxuICAgKiBAcmV0dXJucyBNQ1AtZm9ybWF0dGVkIHN1Y2Nlc3MgcmVzcG9uc2VcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVTdWNjZXNzUmVzcG9uc2UobWVzc2FnZTogc3RyaW5nKTogTUNQUmVzcG9uc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbe1xuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgdGV4dDogbWVzc2FnZVxuICAgICAgfV1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93IGFuIEVsZW1lbnROb3RGb3VuZEVycm9yIGZvciBtaXNzaW5nIGVsZW1lbnRzLlxuICAgKlxuICAgKiBUaGlzIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBjcmVhdGVOb3RGb3VuZFJlc3BvbnNlIHdoaWNoIHJldHVybmVkIGEgc3VjY2Vzc1xuICAgKiByZXNwb25zZSB3aXRoIGVycm9yIHRleHQuIE5vdyB3ZSB0aHJvdyB0byBlbnN1cmUgTUNQLUFRTCByZXR1cm5zIHN1Y2Nlc3M9ZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdGhhdCB3YXNuJ3QgZm91bmRcbiAgICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiBlbGVtZW50IChmb3IgZXJyb3IgbWVzc2FnZSlcbiAgICogQHRocm93cyB7RWxlbWVudE5vdEZvdW5kRXJyb3J9IEFsd2F5cyB0aHJvd3NcbiAgICogQHNlZSBJc3N1ZSAjMjc1IC0gSGFuZGxlcnMgcmV0dXJuIHN1Y2Nlc3M9dHJ1ZSBmb3IgbWlzc2luZyBlbGVtZW50c1xuICAgKi9cbiAgcHJvdGVjdGVkIHRocm93Tm90Rm91bmRFcnJvcihuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgRWxlbWVudE5vdEZvdW5kRXJyb3IodHlwZSwgbmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgVXNlIHRocm93Tm90Rm91bmRFcnJvciBpbnN0ZWFkIHRvIGVuc3VyZSBwcm9wZXIgZXJyb3IgaGFuZGxpbmcuXG4gICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzdWNjZXNzIHJlc3BvbnNlIHdoaWNoIGNhdXNlcyBNQ1AtQVFMIHRvIHJldHVybiBzdWNjZXNzPXRydWUuXG4gICAqIEBzZWUgSXNzdWUgIzI3NSAtIEhhbmRsZXJzIHJldHVybiBzdWNjZXNzPXRydWUgZm9yIG1pc3NpbmcgZWxlbWVudHNcbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVOb3RGb3VuZFJlc3BvbnNlKG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKTogTUNQUmVzcG9uc2Uge1xuICAgIC8vIEtlZXAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgYnV0IHN0cmF0ZWdpZXMgc2hvdWxkIG1pZ3JhdGUgdG8gdGhyb3dOb3RGb3VuZEVycm9yXG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlRXJyb3JSZXNwb25zZShg4p2MICR7dHlwZX0gJyR7bmFtZX0nIG5vdCBmb3VuZGApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBhIGZhaWwtc2FmZSB3YXJuaW5nIGZvciBlbGVtZW50cyB3aXRoIENMSSBleHRlcm5hbCByZXN0cmljdGlvbnMuXG4gICAqIEFwcGVuZGVkIHRvIGFjdGl2YXRpb24gdGV4dCBzbyB1c2VycyBhcmUgYXdhcmUgb2YgcmVzdHJpY3Rpb25zIGV2ZW4gd2hlblxuICAgKiBwZXJtaXNzaW9uX3Byb21wdCBpcyBub3QgYXZhaWxhYmxlIChub24tQ2xhdWRlLUNvZGUgY2xpZW50cykuXG4gICAqXG4gICAqIEBwYXJhbSBtZXRhZGF0YSAtIEVsZW1lbnQgbWV0YWRhdGEgKG1heSBjb250YWluIGdhdGVrZWVwZXIuZXh0ZXJuYWxSZXN0cmljdGlvbnMpXG4gICAqIEByZXR1cm5zIFdhcm5pbmcgdGV4dCBvciBlbXB0eSBzdHJpbmcgaWYgbm8gcmVzdHJpY3Rpb25zXG4gICAqIEBzZWUgSXNzdWUgIzY0MiDigJQgRmFpbC1zYWZlIGVuZm9yY2VtZW50IGZvciBleHRlcm5hbFJlc3RyaWN0aW9uc1xuICAgKi9cbiAgcHJvdGVjdGVkIGZvcm1hdFJlc3RyaWN0aW9uV2FybmluZyhtZXRhZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBzdHJpbmcge1xuICAgIGNvbnN0IGdhdGVrZWVwZXIgPSBtZXRhZGF0YT8uZ2F0ZWtlZXBlciBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXN0cmljdGlvbnMgPSBnYXRla2VlcGVyPy5leHRlcm5hbFJlc3RyaWN0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIXJlc3RyaWN0aW9ucykgcmV0dXJuICcnO1xuXG4gICAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gWydcXG4tLS1cXG4qKkNMSSBSZXN0cmljdGlvbnMgQWN0aXZlOioqJ107XG4gICAgaWYgKHJlc3RyaWN0aW9ucy5kZXNjcmlwdGlvbikge1xuICAgICAgcGFydHMucHVzaChgPiAke3Jlc3RyaWN0aW9ucy5kZXNjcmlwdGlvbn1gKTtcbiAgICB9XG4gICAgY29uc3QgZGVueVBhdHRlcm5zID0gcmVzdHJpY3Rpb25zLmRlbnlQYXR0ZXJucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZGVueVBhdHRlcm5zPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHNob3duID0gZGVueVBhdHRlcm5zLnNsaWNlKDAsIDUpLmpvaW4oJywgJyk7XG4gICAgICBwYXJ0cy5wdXNoKGA+IERlbmllZDogJHtzaG93bn0ke2RlbnlQYXR0ZXJucy5sZW5ndGggPiA1ID8gJy4uLicgOiAnJ31gKTtcbiAgICB9XG4gICAgY29uc3QgYWxsb3dQYXR0ZXJucyA9IHJlc3RyaWN0aW9ucy5hbGxvd1BhdHRlcm5zIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgIGlmIChhbGxvd1BhdHRlcm5zPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHNob3duID0gYWxsb3dQYXR0ZXJucy5zbGljZSgwLCA1KS5qb2luKCcsICcpO1xuICAgICAgcGFydHMucHVzaChgPiBBbGxvd2VkIG9ubHk6ICR7c2hvd259JHthbGxvd1BhdHRlcm5zLmxlbmd0aCA+IDUgPyAnLi4uJyA6ICcnfWApO1xuICAgIH1cbiAgICBjb25zdCBhcHByb3ZhbFBvbGljeSA9IHJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXF1aXJlQXBwcm92YWwgPSBhcHByb3ZhbFBvbGljeT8ucmVxdWlyZUFwcHJvdmFsIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZXF1aXJlQXBwcm92YWw/Lmxlbmd0aCkge1xuICAgICAgcGFydHMucHVzaChgPiBSZXF1aXJlcyBhcHByb3ZhbCBmb3I6ICR7cmVxdWlyZUFwcHJvdmFsLmpvaW4oJywgJyl9IHJpc2sgdG9vbHNgKTtcbiAgICB9XG4gICAgcGFydHMucHVzaCgnPiBVc2UgYGdldF9lZmZlY3RpdmVfY2xpX3BvbGljaWVzYCB0byBzZWUgY29tYmluZWQgcG9saWN5IHN0YXRlLicpO1xuICAgIHBhcnRzLnB1c2goJz4gTk9URTogVGhlc2UgcmVzdHJpY3Rpb25zIHJlcXVpcmUgdGhlIENMSSBjbGllbnQgdG8gYmUgbGF1bmNoZWQgd2l0aCBgLS1wZXJtaXNzaW9uLXByb21wdC10b29sYCB0byBiZSBlbmZvcmNlZC4nKTtcbiAgICByZXR1cm4gcGFydHMuam9pbignXFxuJyk7XG4gIH1cbn1cbiJdfQ==
119
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUFjdGl2YXRpb25TdHJhdGVneS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9oYW5kbGVycy9zdHJhdGVnaWVzL0Jhc2VBY3RpdmF0aW9uU3RyYXRlZ3kudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLG1CQUFtQixJQUFJLFVBQVUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9FLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRW5FLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXpFOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixzQkFBc0I7SUFDMUM7Ozs7O09BS0c7SUFDTyxLQUFLLENBQUMsbUJBQW1CLENBQUMsSUFBWSxFQUFFLFdBQWtCO1FBQ2xFLE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLG1CQUFtQixDQUFDLE9BQWU7UUFDM0MsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDO29CQUNSLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSxPQUFPO2lCQUNkLENBQUM7U0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDTyxxQkFBcUIsQ0FBQyxPQUFlO1FBQzdDLE9BQU87WUFDTCxPQUFPLEVBQUUsQ0FBQztvQkFDUixJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsT0FBTztpQkFDZCxDQUFDO1NBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7OztPQVVHO0lBQ08sa0JBQWtCLENBQUMsSUFBWSxFQUFFLElBQVk7UUFDckQsTUFBTSxJQUFJLG9CQUFvQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLHNCQUFzQixDQUFDLElBQVksRUFBRSxJQUFZO1FBQ3pELHNGQUFzRjtRQUN0RixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLElBQUksS0FBSyxJQUFJLGFBQWEsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNPLHdCQUF3QixDQUFDLFFBQWlDO1FBQ2xFLE1BQU0sVUFBVSxHQUFHLFFBQVEsRUFBRSxVQUFpRCxDQUFDO1FBQy9FLE1BQU0sWUFBWSxHQUFHLFVBQVUsRUFBRSxvQkFBMkQsQ0FBQztRQUM3RixJQUFJLENBQUMsWUFBWTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBRTdCLE1BQU0sVUFBVSxHQUFHLHVCQUF1QixFQUFFLENBQUM7UUFDN0MsTUFBTSxLQUFLLEdBQWEsQ0FBQyxVQUFVLENBQUMsU0FBUztnQkFDM0MsQ0FBQyxDQUFDLGlDQUFpQztnQkFDbkMsQ0FBQyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7UUFDM0QsSUFBSSxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLENBQUM7UUFDRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsWUFBb0MsQ0FBQztRQUN2RSxJQUFJLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUN6QixNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbEQsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLEtBQUssR0FBRyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFDRCxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsYUFBcUMsQ0FBQztRQUN6RSxJQUFJLGFBQWEsRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUMxQixNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkQsS0FBSyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakYsQ0FBQztRQUNELE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxjQUFxRCxDQUFDO1FBQzFGLE1BQU0sZUFBZSxHQUFHLGNBQWMsRUFBRSxlQUF1QyxDQUFDO1FBQ2hGLElBQUksZUFBZSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQzVCLEtBQUssQ0FBQyxJQUFJLENBQUMsNEJBQTRCLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2xGLENBQUM7UUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLGtFQUFrRSxDQUFDLENBQUM7UUFDL0UsSUFBSSxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDekIsS0FBSyxDQUFDLElBQUksQ0FBQyxrQ0FBa0MsVUFBVSxDQUFDLElBQUksSUFBSSxhQUFhLDJEQUEyRCxDQUFDLENBQUM7UUFDNUksQ0FBQzthQUFNLENBQUM7WUFDTixLQUFLLENBQUMsSUFBSSxDQUNSLDBJQUEwSSxFQUMxSSxpRUFBaUUsQ0FDbEUsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCYXNlQWN0aXZhdGlvblN0cmF0ZWd5IC0gU2hhcmVkIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBhY3RpdmF0aW9uIHN0cmF0ZWdpZXNcbiAqXG4gKiBQcm92aWRlcyBjb21tb24gaGVscGVyIG1ldGhvZHMgdXNlZCBieSBtdWx0aXBsZSBzdHJhdGVneSBpbXBsZW1lbnRhdGlvbnM6XG4gKiAtIEZsZXhpYmxlIGVsZW1lbnQgZmluZGluZyAoYnkgbmFtZSBvciBmaWxlbmFtZSlcbiAqIC0gRXJyb3IgcmVzcG9uc2UgZm9ybWF0dGluZ1xuICovXG5cbmltcG9ydCB7IGZpbmRFbGVtZW50RmxleGlibHkgYXMgZmluZEhlbHBlciB9IGZyb20gJy4uL2VsZW1lbnQtY3J1ZC9oZWxwZXJzLmpzJztcbmltcG9ydCB7IEVsZW1lbnROb3RGb3VuZEVycm9yIH0gZnJvbSAnLi4vLi4vdXRpbHMvRXJyb3JIYW5kbGVyLmpzJztcbmltcG9ydCB7IE1DUFJlc3BvbnNlIH0gZnJvbSAnLi9FbGVtZW50QWN0aXZhdGlvblN0cmF0ZWd5LmpzJztcbmltcG9ydCB7IGdldFBlcm1pc3Npb25Ib29rU3RhdHVzIH0gZnJvbSAnLi4vLi4vdXRpbHMvcGVybWlzc2lvbkhvb2tzLmpzJztcblxuLyoqXG4gKiBCYXNlIGNsYXNzIHdpdGggc2hhcmVkIHV0aWxpdGllcyBmb3IgYWN0aXZhdGlvbiBzdHJhdGVnaWVzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQWN0aXZhdGlvblN0cmF0ZWd5IHtcbiAgLyoqXG4gICAqIEZpbmQgYW4gZWxlbWVudCBieSBuYW1lLCBzdXBwb3J0aW5nIGJvdGggZXhhY3QgZGlzcGxheSBuYW1lIGFuZCBmaWxlbmFtZSAoc2x1ZykgbWF0Y2hpbmdcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvciBmaWxlbmFtZSB0byBzZWFyY2ggZm9yXG4gICAqIEBwYXJhbSBlbGVtZW50TGlzdCAtIExpc3Qgb2YgZWxlbWVudHMgdG8gc2VhcmNoIHRocm91Z2hcbiAgICogQHJldHVybnMgVGhlIGZvdW5kIGVsZW1lbnQgb3IgdW5kZWZpbmVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZmluZEVsZW1lbnRGbGV4aWJseShuYW1lOiBzdHJpbmcsIGVsZW1lbnRMaXN0OiBhbnlbXSk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGZpbmRIZWxwZXIobmFtZSwgZWxlbWVudExpc3QpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0YW5kYXJkIGVycm9yIHJlc3BvbnNlXG4gICAqIEBwYXJhbSBtZXNzYWdlIC0gVGhlIGVycm9yIG1lc3NhZ2VcbiAgICogQHJldHVybnMgTUNQLWZvcm1hdHRlZCBlcnJvciByZXNwb25zZVxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZUVycm9yUmVzcG9uc2UobWVzc2FnZTogc3RyaW5nKTogTUNQUmVzcG9uc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbe1xuICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgdGV4dDogbWVzc2FnZVxuICAgICAgfV1cbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIHN0YW5kYXJkIHN1Y2Nlc3MgcmVzcG9uc2VcbiAgICogQHBhcmFtIG1lc3NhZ2UgLSBUaGUgc3VjY2VzcyBtZXNzYWdlXG4gICAqIEByZXR1cm5zIE1DUC1mb3JtYXR0ZWQgc3VjY2VzcyByZXNwb25zZVxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZVN1Y2Nlc3NSZXNwb25zZShtZXNzYWdlOiBzdHJpbmcpOiBNQ1BSZXNwb25zZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7XG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICB0ZXh0OiBtZXNzYWdlXG4gICAgICB9XVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVGhyb3cgYW4gRWxlbWVudE5vdEZvdW5kRXJyb3IgZm9yIG1pc3NpbmcgZWxlbWVudHMuXG4gICAqXG4gICAqIFRoaXMgcmVwbGFjZXMgdGhlIHByZXZpb3VzIGNyZWF0ZU5vdEZvdW5kUmVzcG9uc2Ugd2hpY2ggcmV0dXJuZWQgYSBzdWNjZXNzXG4gICAqIHJlc3BvbnNlIHdpdGggZXJyb3IgdGV4dC4gTm93IHdlIHRocm93IHRvIGVuc3VyZSBNQ1AtQVFMIHJldHVybnMgc3VjY2Vzcz1mYWxzZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0aGF0IHdhc24ndCBmb3VuZFxuICAgKiBAcGFyYW0gdHlwZSAtIFRoZSB0eXBlIG9mIGVsZW1lbnQgKGZvciBlcnJvciBtZXNzYWdlKVxuICAgKiBAdGhyb3dzIHtFbGVtZW50Tm90Rm91bmRFcnJvcn0gQWx3YXlzIHRocm93c1xuICAgKiBAc2VlIElzc3VlICMyNzUgLSBIYW5kbGVycyByZXR1cm4gc3VjY2Vzcz10cnVlIGZvciBtaXNzaW5nIGVsZW1lbnRzXG4gICAqL1xuICBwcm90ZWN0ZWQgdGhyb3dOb3RGb3VuZEVycm9yKG5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nKTogbmV2ZXIge1xuICAgIHRocm93IG5ldyBFbGVtZW50Tm90Rm91bmRFcnJvcih0eXBlLCBuYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCBVc2UgdGhyb3dOb3RGb3VuZEVycm9yIGluc3RlYWQgdG8gZW5zdXJlIHByb3BlciBlcnJvciBoYW5kbGluZy5cbiAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHN1Y2Nlc3MgcmVzcG9uc2Ugd2hpY2ggY2F1c2VzIE1DUC1BUUwgdG8gcmV0dXJuIHN1Y2Nlc3M9dHJ1ZS5cbiAgICogQHNlZSBJc3N1ZSAjMjc1IC0gSGFuZGxlcnMgcmV0dXJuIHN1Y2Nlc3M9dHJ1ZSBmb3IgbWlzc2luZyBlbGVtZW50c1xuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZU5vdEZvdW5kUmVzcG9uc2UobmFtZTogc3RyaW5nLCB0eXBlOiBzdHJpbmcpOiBNQ1BSZXNwb25zZSB7XG4gICAgLy8gS2VlcCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBidXQgc3RyYXRlZ2llcyBzaG91bGQgbWlncmF0ZSB0byB0aHJvd05vdEZvdW5kRXJyb3JcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVFcnJvclJlc3BvbnNlKGDinYwgJHt0eXBlfSAnJHtuYW1lfScgbm90IGZvdW5kYCk7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0IGEgZmFpbC1zYWZlIHdhcm5pbmcgZm9yIGVsZW1lbnRzIHdpdGggQ0xJIGV4dGVybmFsIHJlc3RyaWN0aW9ucy5cbiAgICogQXBwZW5kZWQgdG8gYWN0aXZhdGlvbiB0ZXh0IHNvIHVzZXJzIGFyZSBhd2FyZSBvZiByZXN0cmljdGlvbnMgZXZlbiB3aGVuXG4gICAqIHBlcm1pc3Npb25fcHJvbXB0IGlzIG5vdCBhdmFpbGFibGUgKG5vbi1DbGF1ZGUtQ29kZSBjbGllbnRzKS5cbiAgICpcbiAgICogQHBhcmFtIG1ldGFkYXRhIC0gRWxlbWVudCBtZXRhZGF0YSAobWF5IGNvbnRhaW4gZ2F0ZWtlZXBlci5leHRlcm5hbFJlc3RyaWN0aW9ucylcbiAgICogQHJldHVybnMgV2FybmluZyB0ZXh0IG9yIGVtcHR5IHN0cmluZyBpZiBubyByZXN0cmljdGlvbnNcbiAgICogQHNlZSBJc3N1ZSAjNjQyIOKAlCBGYWlsLXNhZmUgZW5mb3JjZW1lbnQgZm9yIGV4dGVybmFsUmVzdHJpY3Rpb25zXG4gICAqL1xuICBwcm90ZWN0ZWQgZm9ybWF0UmVzdHJpY3Rpb25XYXJuaW5nKG1ldGFkYXRhOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHN0cmluZyB7XG4gICAgY29uc3QgZ2F0ZWtlZXBlciA9IG1ldGFkYXRhPy5nYXRla2VlcGVyIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlc3RyaWN0aW9ucyA9IGdhdGVrZWVwZXI/LmV4dGVybmFsUmVzdHJpY3Rpb25zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmICghcmVzdHJpY3Rpb25zKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCBob29rU3RhdHVzID0gZ2V0UGVybWlzc2lvbkhvb2tTdGF0dXMoKTtcbiAgICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbaG9va1N0YXR1cy5pbnN0YWxsZWRcbiAgICAgID8gJ1xcbi0tLVxcbioqQ0xJIFBvbGljaWVzIExvYWRlZDoqKidcbiAgICAgIDogJ1xcbi0tLVxcbioqQ0xJIFBvbGljaWVzIExvYWRlZCAoSG9vayBOb3QgRGV0ZWN0ZWQpOioqJ107XG4gICAgaWYgKHJlc3RyaWN0aW9ucy5kZXNjcmlwdGlvbikge1xuICAgICAgcGFydHMucHVzaChgPiAke3Jlc3RyaWN0aW9ucy5kZXNjcmlwdGlvbn1gKTtcbiAgICB9XG4gICAgY29uc3QgZGVueVBhdHRlcm5zID0gcmVzdHJpY3Rpb25zLmRlbnlQYXR0ZXJucyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICBpZiAoZGVueVBhdHRlcm5zPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHNob3duID0gZGVueVBhdHRlcm5zLnNsaWNlKDAsIDUpLmpvaW4oJywgJyk7XG4gICAgICBwYXJ0cy5wdXNoKGA+IERlbmllZDogJHtzaG93bn0ke2RlbnlQYXR0ZXJucy5sZW5ndGggPiA1ID8gJy4uLicgOiAnJ31gKTtcbiAgICB9XG4gICAgY29uc3QgYWxsb3dQYXR0ZXJucyA9IHJlc3RyaWN0aW9ucy5hbGxvd1BhdHRlcm5zIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgIGlmIChhbGxvd1BhdHRlcm5zPy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IHNob3duID0gYWxsb3dQYXR0ZXJucy5zbGljZSgwLCA1KS5qb2luKCcsICcpO1xuICAgICAgcGFydHMucHVzaChgPiBBbGxvd2VkIG9ubHk6ICR7c2hvd259JHthbGxvd1BhdHRlcm5zLmxlbmd0aCA+IDUgPyAnLi4uJyA6ICcnfWApO1xuICAgIH1cbiAgICBjb25zdCBhcHByb3ZhbFBvbGljeSA9IHJlc3RyaWN0aW9ucy5hcHByb3ZhbFBvbGljeSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXF1aXJlQXBwcm92YWwgPSBhcHByb3ZhbFBvbGljeT8ucmVxdWlyZUFwcHJvdmFsIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICAgIGlmIChyZXF1aXJlQXBwcm92YWw/Lmxlbmd0aCkge1xuICAgICAgcGFydHMucHVzaChgPiBSZXF1aXJlcyBhcHByb3ZhbCBmb3I6ICR7cmVxdWlyZUFwcHJvdmFsLmpvaW4oJywgJyl9IHJpc2sgdG9vbHNgKTtcbiAgICB9XG4gICAgcGFydHMucHVzaCgnPiBVc2UgYGdldF9lZmZlY3RpdmVfY2xpX3BvbGljaWVzYCB0byBzZWUgY29tYmluZWQgcG9saWN5IHN0YXRlLicpO1xuICAgIGlmIChob29rU3RhdHVzLmluc3RhbGxlZCkge1xuICAgICAgcGFydHMucHVzaChgPiBQZXJtaXNzaW9uIGhvb2sgZGV0ZWN0ZWQgZm9yICR7aG9va1N0YXR1cy5ob3N0ID8/ICd0aGlzIGNsaWVudCd9LiBFbmZvcmNlbWVudCBkZXBlbmRzIG9uIHVzaW5nIHRoYXQgY2xpZW50IGNvbmZpZ3VyYXRpb24uYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhcnRzLnB1c2goXG4gICAgICAgICc+IE5vIHBlcm1pc3Npb24gaG9vayBkZXRlY3RlZC4gVGhlc2UgcG9saWNpZXMgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IGVuZm9yY2VkIHVubGVzcyB0aGUgQ0xJIGlzIGxhdW5jaGVkIHdpdGggYC0tcGVybWlzc2lvbi1wcm9tcHQtdG9vbGAuJyxcbiAgICAgICAgJz4gUnVuIGBvcGVuX3NldHVwYCBhbmQgcmVpbnN0YWxsIHRvIHdpcmUgYXV0b21hdGljIGVuZm9yY2VtZW50LicsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcGFydHMuam9pbignXFxuJyk7XG4gIH1cbn1cbiJdfQ==