@dollhousemcp/mcp-server 2.0.16 → 2.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md.backup +18 -0
- package/dist/elements/BaseElement.d.ts +1 -0
- package/dist/elements/BaseElement.d.ts.map +1 -1
- package/dist/elements/BaseElement.js +7 -1
- package/dist/elements/agents/AgentManager.js +2 -2
- package/dist/elements/base/BaseElementManager.d.ts.map +1 -1
- package/dist/elements/base/BaseElementManager.js +17 -1
- package/dist/elements/base/ElementFileOperations.js +2 -2
- package/dist/elements/ensembles/EnsembleManager.js +3 -3
- package/dist/elements/memories/MemoryManager.d.ts.map +1 -1
- package/dist/elements/memories/MemoryManager.js +14 -3
- package/dist/elements/skills/SkillManager.js +2 -2
- package/dist/elements/templates/TemplateManager.js +2 -2
- package/dist/generated/version.d.ts +2 -2
- package/dist/generated/version.js +3 -3
- package/dist/handlers/ElementCRUDHandler.d.ts.map +1 -1
- package/dist/handlers/ElementCRUDHandler.js +3 -2
- package/dist/handlers/element-crud/createElement.d.ts.map +1 -1
- package/dist/handlers/element-crud/createElement.js +6 -2
- package/dist/handlers/element-crud/editElement.d.ts.map +1 -1
- package/dist/handlers/element-crud/editElement.js +6 -2
- package/dist/handlers/element-crud/helpers.d.ts +2 -0
- package/dist/handlers/element-crud/helpers.d.ts.map +1 -1
- package/dist/handlers/element-crud/helpers.js +21 -2
- package/dist/handlers/mcp-aql/IntrospectionResolver.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/IntrospectionResolver.js +34 -7
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts +1 -0
- package/dist/handlers/mcp-aql/MCPAQLHandler.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/MCPAQLHandler.js +50 -14
- package/dist/handlers/mcp-aql/OperationSchema.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/OperationSchema.js +3 -2
- package/dist/handlers/mcp-aql/evaluatePermission.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/evaluatePermission.js +2 -1
- package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts +17 -1
- package/dist/handlers/mcp-aql/policies/ElementPolicies.d.ts.map +1 -1
- package/dist/handlers/mcp-aql/policies/ElementPolicies.js +88 -4
- package/dist/handlers/strategies/AgentActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/AgentActivationStrategy.js +5 -1
- package/dist/handlers/strategies/BaseActivationStrategy.d.ts +1 -0
- package/dist/handlers/strategies/BaseActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/BaseActivationStrategy.js +15 -1
- package/dist/handlers/strategies/EnsembleActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/EnsembleActivationStrategy.js +5 -1
- package/dist/handlers/strategies/MemoryActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/MemoryActivationStrategy.js +5 -1
- package/dist/handlers/strategies/PersonaActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/PersonaActivationStrategy.js +5 -1
- package/dist/handlers/strategies/SkillActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/SkillActivationStrategy.js +5 -1
- package/dist/handlers/strategies/TemplateActivationStrategy.d.ts.map +1 -1
- package/dist/handlers/strategies/TemplateActivationStrategy.js +7 -2
- package/dist/persona/PersonaElement.js +2 -2
- package/dist/services/SerializationService.d.ts.map +1 -1
- package/dist/services/SerializationService.js +7 -1
- package/dist/types/elements/IElement.d.ts +9 -0
- package/dist/types/elements/IElement.d.ts.map +1 -1
- package/dist/types/elements/IElement.js +1 -1
- package/dist/utils/permissionHooks.d.ts +39 -3
- package/dist/utils/permissionHooks.d.ts.map +1 -1
- package/dist/utils/permissionHooks.js +651 -74
- package/dist/web/public/permissions.css +190 -2
- package/dist/web/public/permissions.js +209 -56
- package/dist/web/public/setup.js +452 -108
- package/dist/web/routes/permissionRoutes.d.ts.map +1 -1
- package/dist/web/routes/permissionRoutes.js +108 -17
- package/dist/web/routes/setupRoutes.d.ts +1 -0
- package/dist/web/routes/setupRoutes.d.ts.map +1 -1
- package/dist/web/routes/setupRoutes.js +128 -42
- package/package.json +3 -1
- package/scripts/pretooluse-dollhouse.sh +39 -1
- package/scripts/pretooluse-vscode.sh +163 -0
- package/scripts/pretooluse-windsurf.sh +166 -4
- package/server.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [2.0.18] - 2026-04-16
|
|
4
|
+
|
|
5
|
+
- Expanded permission setup and support-matrix clarity across supported clients.
|
|
6
|
+
- Added stronger gatekeeper validation, activation diagnostics, and audit tooling.
|
|
7
|
+
- Fixed Claude Code hook response-shape compatibility and stabilized release CI tests.
|
|
8
|
+
|
|
9
|
+
## [2.0.17] - 2026-04-15
|
|
10
|
+
|
|
11
|
+
- Expanded client setup and permission integration support across more MCP hosts.
|
|
12
|
+
- Added stronger gatekeeper policy authoring guidance, examples, and introspection.
|
|
13
|
+
- Reject malformed gatekeeper policy structures during create/edit flows and raw YAML/frontmatter saves.
|
|
14
|
+
|
|
3
15
|
## [2.0.16] - 2026-04-14
|
|
4
16
|
|
|
5
17
|
- Version bump
|
package/README.md.backup
CHANGED
|
@@ -66,6 +66,20 @@ npx @dollhousemcp/mcp-server@latest --web
|
|
|
66
66
|
|
|
67
67
|
Opens a browser-based setup wizard with one-click install for Claude Desktop, Claude Code, Cursor, VS Code, Codex, Gemini CLI, Windsurf, Cline, and LM Studio. Detects existing installations, supports auto-updating and pinned versions.
|
|
68
68
|
|
|
69
|
+
**Permission hook support** in the setup wizard currently breaks down like this:
|
|
70
|
+
|
|
71
|
+
| Platform | Setup status | Permission hook status |
|
|
72
|
+
| --- | --- | --- |
|
|
73
|
+
| Claude Code | One-click install | Full native support |
|
|
74
|
+
| Cursor | One-click install | Partial native support |
|
|
75
|
+
| VS Code | One-click install | Partial native support |
|
|
76
|
+
| Codex | One-click install | Partial native support, Bash-only |
|
|
77
|
+
| Gemini CLI | One-click install | Partial native support |
|
|
78
|
+
| Windsurf | One-click install | Partial native support |
|
|
79
|
+
| Cline | One-click install | MCP setup only in this release |
|
|
80
|
+
| LM Studio | One-click install | MCP setup only in this release |
|
|
81
|
+
| Claude Desktop | One-click install | No native permission hook path in this release |
|
|
82
|
+
|
|
69
83
|
**Claude Code** (one command):
|
|
70
84
|
|
|
71
85
|
```bash
|
|
@@ -184,6 +198,10 @@ Every MCP-AQL operation passes through the Gatekeeper — a server-side permissi
|
|
|
184
198
|
|
|
185
199
|
**This works even if the MCP client has "Always Allow" enabled.** The Gatekeeper runs server-side — after the client approves the tool call, the Gatekeeper still enforces the active element's policies. A deny from any active element cannot be overridden by the LLM or the client.
|
|
186
200
|
|
|
201
|
+
Use the two gatekeeper surfaces differently:
|
|
202
|
+
- `allow` / `confirm` / `deny` are for MCP-AQL operation patterns like `read_*`, `edit_*`, `delete_element`, and `execute_agent`
|
|
203
|
+
- `externalRestrictions` is for external tool and hook patterns like `Read:*`, `Edit:*`, `Bash:git status*`, and `Bash:rm *`
|
|
204
|
+
|
|
187
205
|
### How Policy Resolution Works
|
|
188
206
|
|
|
189
207
|
```
|
|
@@ -21,6 +21,7 @@ import { MetadataService } from '../services/MetadataService.js';
|
|
|
21
21
|
*/
|
|
22
22
|
export declare function normalizeVersion(version: string): string;
|
|
23
23
|
export declare abstract class BaseElement implements IElement {
|
|
24
|
+
private static readonly TRANSIENT_METADATA_FIELDS;
|
|
24
25
|
id: string;
|
|
25
26
|
type: ElementType;
|
|
26
27
|
version: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseElement.d.ts","sourceRoot":"","sources":["../../src/elements/BaseElement.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,SAAS,EACT,uBAAuB,EAGvB,eAAe,EAEhB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAOpD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAiBxD;AAED,8BAAsB,WAAY,YAAW,QAAQ;
|
|
1
|
+
{"version":3,"file":"BaseElement.d.ts","sourceRoot":"","sources":["../../src/elements/BaseElement.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,SAAS,EACT,uBAAuB,EAGvB,eAAe,EAEhB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAOpD,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAiBxD;AAED,8BAAsB,WAAY,YAAW,QAAQ;IACnD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,yBAAyB,CAE9C;IAEI,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAGhB,QAAQ,EAAE,gBAAgB,CAAC;IAOlC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAM;IACrC,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAM;IAEhC,IAAW,YAAY,IAAI,MAAM,CAA+B;IAChE,IAAW,YAAY,CAAC,KAAK,EAAE,MAAM,EAAiC;IAEtE,IAAW,OAAO,IAAI,MAAM,CAA0B;IACtD,IAAW,OAAO,CAAC,KAAK,EAAE,MAAM,EAA4B;IAGrD,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,cAAc,CAAC;IAGhC,SAAS,CAAC,OAAO,EAAE,aAAa,CAA0B;IAC1D,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAS;IAGpC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAO;gBAG1C,IAAI,EAAE,WAAW,EACjB,QAAQ,EAAE,OAAO,CAAC,gBAAgB,CAAC,YAAK,EACxC,eAAe,EAAE,eAAe;IAkDlC;;;OAGG;IACH,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAW1C;;;OAGG;IACI,QAAQ,IAAI,uBAAuB;IA0F1C;;;OAGG;IACI,eAAe,IAAI,MAAM;IAchC;;;;;OAKG;IACI,SAAS,IAAI,MAAM;IAkE1B;;;OAGG;IACH,SAAS,CAAC,UAAU,CAAC,IAAI,MAAM;IAE/B;;;OAGG;IACH,OAAO,CAAC,eAAe;IA6BvB;;;OAGG;IACI,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IA0CtC;;OAEG;IACI,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI;IA6DzE;;;OAGG;IACH,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS;IAcjF;;;OAGG;IACH,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAyB3D;;OAEG;IACH,SAAS,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IA+BnD;;OAEG;IACI,SAAS,IAAI,aAAa;IAIjC;;OAEG;IACH,IAAW,MAAM,IAAI,aAAa,CAEjC;IAED;;OAEG;IACU,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAK/B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOxC;;OAEG;IACH,SAAS,CAAC,SAAS,IAAI,IAAI;IAK3B;;OAEG;IACI,OAAO,IAAI,OAAO;IAIzB;;OAEG;IACI,SAAS,IAAI,IAAI;CAGzB"}
|
|
@@ -38,6 +38,9 @@ export function normalizeVersion(version) {
|
|
|
38
38
|
return `${normalizedMajor}.${normalizedMinor}.${normalizedPatch}${suffix}`;
|
|
39
39
|
}
|
|
40
40
|
export class BaseElement {
|
|
41
|
+
static TRANSIENT_METADATA_FIELDS = new Set([
|
|
42
|
+
'gatekeeperDiagnostics',
|
|
43
|
+
]);
|
|
41
44
|
// Identity
|
|
42
45
|
id;
|
|
43
46
|
type;
|
|
@@ -302,6 +305,9 @@ export class BaseElement {
|
|
|
302
305
|
if (typeof obj === 'object') {
|
|
303
306
|
const cleaned = {};
|
|
304
307
|
for (const [key, value] of Object.entries(obj)) {
|
|
308
|
+
if (BaseElement.TRANSIENT_METADATA_FIELDS.has(key)) {
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
305
311
|
const cleanedValue = this.deepCleanObject(value);
|
|
306
312
|
if (cleanedValue !== undefined) {
|
|
307
313
|
cleaned[key] = cleanedValue;
|
|
@@ -543,4 +549,4 @@ export class BaseElement {
|
|
|
543
549
|
this._isDirty = false;
|
|
544
550
|
}
|
|
545
551
|
}
|
|
546
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUVsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZWxlbWVudHMvQmFzZUVsZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUdMLGFBQWEsRUFRZCxNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHbkU7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxPQUFlO0lBQzlDLHlEQUF5RDtJQUN6RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7SUFFeEUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsNkNBQTZDO1FBQzdDLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLEdBQUcsRUFBRSxLQUFLLEdBQUcsR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7SUFFL0QsZ0RBQWdEO0lBQ2hELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzlELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FB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SUVsZW1lbnQgaW50ZXJmYWNlLlxuICogUHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgdGhhdCBhbGwgZWxlbWVudCB0eXBlcyBjYW4gZXh0ZW5kLlxuICovXG5cbmltcG9ydCB7XG4gIElFbGVtZW50LFxuICBJRWxlbWVudE1ldGFkYXRhLFxuICBFbGVtZW50U3RhdHVzLFxuICBFbGVtZW50UmF0aW5ncyxcbiAgUmVmZXJlbmNlLFxuICBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCxcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBWYWxpZGF0aW9uV2FybmluZyxcbiAgRmVlZGJhY2tDb250ZXh0LFxuICBVc2VyRmVlZGJhY2tcbn0gZnJvbSAnLi4vdHlwZXMvZWxlbWVudHMvaW5kZXguanMnO1xuaW1wb3J0IHsgRWxlbWVudFR5cGUgfSBmcm9tICcuLi9wb3J0Zm9saW8vdHlwZXMuanMnO1xuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyLmpzJztcbmltcG9ydCB7IFVuaWNvZGVWYWxpZGF0b3IgfSBmcm9tICcuLi9zZWN1cml0eS92YWxpZGF0b3JzL3VuaWNvZGVWYWxpZGF0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJpdHlNb25pdG9yIH0gZnJvbSAnLi4vc2VjdXJpdHkvc2VjdXJpdHlNb25pdG9yLmpzJztcbmltcG9ydCB7IFNlY3VyZVlhbWxQYXJzZXIgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cmVZYW1sUGFyc2VyLmpzJztcbmltcG9ydCB7IE1ldGFkYXRhU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL01ldGFkYXRhU2VydmljZS5qcyc7XG5cbi8qKlxuICogTm9ybWFsaXplcyB2ZXJzaW9uIHN0cmluZ3MgdG8gZnVsbCBzZW12ZXIgZm9ybWF0IChYLlkuWilcbiAqIFRoaXMgaGVscHMgbWFpbnRhaW4gY29uc2lzdGVuY3kgd2hpbGUgYWNjZXB0aW5nIGZsZXhpYmxlIGlucHV0IGZvcm1hdHNcbiAqIFxuICogQHBhcmFtIHZlcnNpb24gLSBUaGUgdmVyc2lvbiBzdHJpbmcgdG8gbm9ybWFsaXplXG4gKiBAcmV0dXJucyBOb3JtYWxpemVkIHZlcnNpb24gc3RyaW5nIGluIFguWS5aIGZvcm1hdCB3aXRoIGxlYWRpbmcgemVyb3MgcmVtb3ZlZFxuICogXG4gKiBAZXhhbXBsZVxuICogbm9ybWFsaXplVmVyc2lvbihcIjFcIikgICAgICAgIC8vIFwiMS4wLjBcIlxuICogbm9ybWFsaXplVmVyc2lvbihcIjEuMlwiKSAgICAgIC8vIFwiMS4yLjBcIlxuICogbm9ybWFsaXplVmVyc2lvbihcIjEuMi4zXCIpICAgIC8vIFwiMS4yLjNcIlxuICogbm9ybWFsaXplVmVyc2lvbihcIjEuMC1iZXRhXCIpIC8vIFwiMS4wLjAtYmV0YVwiXG4gKiBub3JtYWxpemVWZXJzaW9uKFwiMDEuMDIuMDNcIikgLy8gXCIxLjIuM1wiIChzdHJpcHMgbGVhZGluZyB6ZXJvcylcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVZlcnNpb24odmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gRXh0cmFjdCBiYXNlIHZlcnNpb24gYW5kIGFueSBwcmVyZWxlYXNlL2J1aWxkIG1ldGFkYXRhXG4gIGNvbnN0IG1hdGNoID0gdmVyc2lvbi5tYXRjaCgvXihcXGQrKSg/OlxcLihcXGQrKSk/KD86XFwuKFxcZCspKT8oWy0rXS4rKT8kLyk7XG4gIFxuICBpZiAoIW1hdGNoKSB7XG4gICAgLy8gUmV0dXJuIGFzLWlzIGlmIG5vdCBhIHZhbGlkIHZlcnNpb24gZm9ybWF0XG4gICAgcmV0dXJuIHZlcnNpb247XG4gIH1cbiAgXG4gIGNvbnN0IFssIG1ham9yLCBtaW5vciA9ICcwJywgcGF0Y2ggPSAnMCcsIHN1ZmZpeCA9ICcnXSA9IG1hdGNoO1xuICBcbiAgLy8gU3RyaXAgbGVhZGluZyB6ZXJvcyBidXQgcHJlc2VydmUgXCIwXCIgYXMgdmFsaWRcbiAgY29uc3Qgbm9ybWFsaXplZE1ham9yID0gTnVtYmVyLnBhcnNlSW50KG1ham9yLCAxMCkudG9TdHJpbmcoKTtcbiAgY29uc3Qgbm9ybWFsaXplZE1pbm9yID0gTnVtYmVyLnBhcnNlSW50KG1pbm9yLCAxMCkudG9TdHJpbmcoKTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGNoID0gTnVtYmVyLnBhcnNlSW50KHBhdGNoLCAxMCkudG9TdHJpbmcoKTtcbiAgXG4gIHJldHVybiBgJHtub3JtYWxpemVkTWFqb3J9LiR7bm9ybWFsaXplZE1pbm9yfS4ke25vcm1hbGl6ZWRQYXRjaH0ke3N1ZmZpeH1gO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUVsZW1lbnQgaW1wbGVtZW50cyBJRWxlbWVudCB7XG4gIC8vIElkZW50aXR5XG4gIHB1YmxpYyBpZDogc3RyaW5nO1xuICBwdWJsaWMgdHlwZTogRWxlbWVudFR5cGU7XG4gIHB1YmxpYyB2ZXJzaW9uOiBzdHJpbmc7XG4gIFxuICAvLyBNZXRhZGF0YVxuICBwdWJsaWMgbWV0YWRhdGE6IElFbGVtZW50TWV0YWRhdGE7XG4gIFxuICAvLyBEdWFsLWZpZWxkIHNlbWFudGljIGFyY2hpdGVjdHVyZSAodjIuMClcbiAgLy8gQWxsIGVsZW1lbnQgdHlwZXMgaW5oZXJpdCB0aGVzZTsgc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgd2l0aCByaWNoZXIgYmVoYXZpb3IuXG4gIC8vIC0gaW5zdHJ1Y3Rpb25zOiBiZWhhdmlvcmFsIGRpcmVjdGl2ZXMgKGNvbW1hbmQgdm9pY2UsIGltcGVyYXRpdmVzIHRvIGZvbGxvdylcbiAgLy8gLSBjb250ZW50OiByZWZlcmVuY2UgbWF0ZXJpYWwgKGluZm9ybWF0aW9uYWwgZGF0YSB0byBkcmF3IGZyb20pXG4gIC8vIERlY2xhcmVkIGFzIGFjY2Vzc29yIHBhaXJzIHNvIHN1YmNsYXNzZXMgKGUuZy4sIE1lbW9yeSkgY2FuIG92ZXJyaWRlIHdpdGggY3VzdG9tIGdldHRlcnMuXG4gIHByb3RlY3RlZCBfaW5zdHJ1Y3Rpb25zOiBzdHJpbmcgPSAnJztcbiAgcHJvdGVjdGVkIF9jb250ZW50OiBzdHJpbmcgPSAnJztcblxuICBwdWJsaWMgZ2V0IGluc3RydWN0aW9ucygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5faW5zdHJ1Y3Rpb25zOyB9XG4gIHB1YmxpYyBzZXQgaW5zdHJ1Y3Rpb25zKHZhbHVlOiBzdHJpbmcpIHsgdGhpcy5faW5zdHJ1Y3Rpb25zID0gdmFsdWU7IH1cblxuICBwdWJsaWMgZ2V0IGNvbnRlbnQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2NvbnRlbnQ7IH1cbiAgcHVibGljIHNldCBjb250ZW50KHZhbHVlOiBzdHJpbmcpIHsgdGhpcy5fY29udGVudCA9IHZhbHVlOyB9XG5cbiAgLy8gRmVhdHVyZXNcbiAgcHVibGljIHJlZmVyZW5jZXM/OiBSZWZlcmVuY2VbXTtcbiAgcHVibGljIGV4dGVuc2lvbnM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICBwdWJsaWMgcmF0aW5ncz86IEVsZW1lbnRSYXRpbmdzO1xuICBcbiAgLy8gSW50ZXJuYWwgc3RhdGVcbiAgcHJvdGVjdGVkIF9zdGF0dXM6IEVsZW1lbnRTdGF0dXMgPSBFbGVtZW50U3RhdHVzLklOQUNUSVZFO1xuICBwcm90ZWN0ZWQgX2lzRGlydHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgXG4gIC8vIENvbnN0YW50c1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9GRUVEQkFDS19ISVNUT1JZID0gMTAwO1xuICBcbiAgY29uc3RydWN0b3IoXG4gICAgdHlwZTogRWxlbWVudFR5cGUsXG4gICAgbWV0YWRhdGE6IFBhcnRpYWw8SUVsZW1lbnRNZXRhZGF0YT4gPSB7fSxcbiAgICBtZXRhZGF0YVNlcnZpY2U6IE1ldGFkYXRhU2VydmljZSAgLy8gUmVxdWlyZWQgaW5qZWN0aW9uIGZvciBESVxuICApIHtcbiAgICAvLyBOb3JtYWxpemUgY29tbW9uIG1ldGFkYXRhIHZpYSBzZXJ2aWNlIChza2lwIHR5cGUtc3BlY2lmaWMgZGVmYXVsdHMpXG4gICAgY29uc3Qgbm9ybWFsaXplZCA9IG1ldGFkYXRhU2VydmljZS5ub3JtYWxpemVNZXRhZGF0YShtZXRhZGF0YSwgdHlwZSwge1xuICAgICAgc2tpcFR5cGVEZWZhdWx0czogdHJ1ZSAgLy8gTGV0IGVsZW1lbnQtc3BlY2lmaWMgY2xhc3NlcyBoYW5kbGUgdGhlaXIgb3duIGRlZmF1bHRzXG4gICAgfSk7XG5cbiAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgIHRoaXMuaWQgPSBtZXRhZGF0YS5uYW1lID8gdGhpcy5nZW5lcmF0ZUlkKG5vcm1hbGl6ZWQubmFtZSkgOiB1dWlkdjQoKTtcbiAgICB0aGlzLnZlcnNpb24gPSBub3JtYWxpemVkLnZlcnNpb24gfHwgJzEuMC4wJzsgIC8vIEd1YXJhbnRlZWQgYnkgbm9ybWFsaXplTWV0YWRhdGEsIGJ1dCBhZGQgZmFsbGJhY2sgZm9yIHR5cGUgc2FmZXR5XG5cbiAgICAvLyBTcHJlYWQgbm9ybWFsaXplZCBjb21tb24gbWV0YWRhdGFcbiAgICBjb25zdCBiYXNlTWV0YWRhdGE6IGFueSA9IHtcbiAgICAgIC4uLm5vcm1hbGl6ZWQsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUgIC8vIEVuc3VyZSB0eXBlIGZpZWxkIGlzIHNldCBjb3JyZWN0bHlcbiAgICB9O1xuXG4gICAgLy8gUHJlc2VydmUgZWxlbWVudC1zcGVjaWZpYyBmaWVsZHMgdGhhdCBNZXRhZGF0YVNlcnZpY2UgZG9lc24ndCBoYW5kbGVcbiAgICAvLyBUaGVzZSBhcmUgcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkIHZpYSB0aGUgc3ByZWFkIG9wZXJhdG9yIGluIE1ldGFkYXRhU2VydmljZVxuXG4gICAgLy8gUHJlc2VydmUgdHJpZ2dlcnMgKFBlcnNvbmEvTWVtb3J5LXNwZWNpZmljKVxuICAgIGlmICgndHJpZ2dlcnMnIGluIG1ldGFkYXRhICYmIEFycmF5LmlzQXJyYXkoKG1ldGFkYXRhIGFzIGFueSkudHJpZ2dlcnMpKSB7XG4gICAgICBiYXNlTWV0YWRhdGEudHJpZ2dlcnMgPSAobWV0YWRhdGEgYXMgYW55KS50cmlnZ2VycztcbiAgICB9XG5cbiAgICAvLyBGSVggIzE0MzA6IFByZXNlcnZlIE1lbW9yeS1zcGVjaWZpYyBtZXRhZGF0YSBmaWVsZHMgKGF1dG9Mb2FkLCBwcmlvcml0eSlcbiAgICAvLyBUaGVzZSBhcmUgZGVmaW5lZCBpbiBNZW1vcnlNZXRhZGF0YSBidXQgbmVlZCB0byBiZSBwcmVzZXJ2ZWQgaW4gYmFzZU1ldGFkYXRhXG4gICAgaWYgKCdhdXRvTG9hZCcgaW4gbWV0YWRhdGEpIHtcbiAgICAgIGJhc2VNZXRhZGF0YS5hdXRvTG9hZCA9IChtZXRhZGF0YSBhcyBhbnkpLmF1dG9Mb2FkO1xuICAgIH1cbiAgICBpZiAoJ3ByaW9yaXR5JyBpbiBtZXRhZGF0YSkge1xuICAgICAgYmFzZU1ldGFkYXRhLnByaW9yaXR5ID0gKG1ldGFkYXRhIGFzIGFueSkucHJpb3JpdHk7XG4gICAgfVxuXG4gICAgdGhpcy5tZXRhZGF0YSA9IGJhc2VNZXRhZGF0YTtcbiAgICBcbiAgICAvLyBJbml0aWFsaXplIG9wdGlvbmFsIGZlYXR1cmVzXG4gICAgdGhpcy5yZWZlcmVuY2VzID0gW107XG4gICAgdGhpcy5leHRlbnNpb25zID0ge307XG4gICAgdGhpcy5yYXRpbmdzID0ge1xuICAgICAgYWlSYXRpbmc6IDAsXG4gICAgICB1c2VyUmF0aW5nOiB1bmRlZmluZWQsXG4gICAgICByYXRpbmdDb3VudDogMCxcbiAgICAgIGxhc3RFdmFsdWF0ZWQ6IG5ldyBEYXRlKCksXG4gICAgICBjb25maWRlbmNlOiAwLFxuICAgICAgdHJlbmQ6ICdzdGFibGUnLFxuICAgICAgZmVlZGJhY2tIaXN0b3J5OiBbXVxuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHVuaXF1ZSBJRCBmb3IgdGhlIGVsZW1lbnQgYmFzZWQgb24gaXRzIG5hbWUgYW5kIHR5cGUuXG4gICAqIEZvcm1hdDogdHlwZV9uYW1lLXNsdWdfdGltZXN0YW1wXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2VuZXJhdGVJZChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHR5cGVTbHVnID0gdGhpcy50eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgbmFtZVNsdWcgPSBuYW1lXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2VBbGwoL1teYS16MC05XSsvZywgJy0nKSAgLy8gUmVwbGFjZSBub24tYWxwaGFudW1lcmljIGNoYXJzIHdpdGggaHlwaGVuc1xuICAgICAgLnJlcGxhY2VBbGwoLyheLSl8KC0kKS9nLCAnJyk7ICAgLy8gVHJpbSBsZWFkaW5nL3RyYWlsaW5nIGh5cGhlbnNcbiAgICBjb25zdCB0aW1lc3RhbXAgPSBEYXRlLm5vdygpO1xuICAgIFxuICAgIHJldHVybiBgJHt0eXBlU2x1Z31fJHtuYW1lU2x1Z31fJHt0aW1lc3RhbXB9YDtcbiAgfVxuICBcbiAgLyoqXG4gICAqIENvcmUgdmFsaWRhdGlvbiB0aGF0IGFsbCBlbGVtZW50cyBzaGFyZS5cbiAgICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgYW5kIGNhbGwgc3VwZXIudmFsaWRhdGUoKSBmaXJzdC5cbiAgICovXG4gIHB1YmxpYyB2YWxpZGF0ZSgpOiBFbGVtZW50VmFsaWRhdGlvblJlc3VsdCB7XG4gICAgY29uc3QgZXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JbXSA9IFtdO1xuICAgIGNvbnN0IHdhcm5pbmdzOiBWYWxpZGF0aW9uV2FybmluZ1tdID0gW107XG4gICAgY29uc3Qgc3VnZ2VzdGlvbnM6IHN0cmluZ1tdID0gW107XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzXG4gICAgaWYgKCF0aGlzLmlkKSB7XG4gICAgICBlcnJvcnMucHVzaCh7IGZpZWxkOiAnaWQnLCBtZXNzYWdlOiAnRWxlbWVudCBJRCBpcyByZXF1aXJlZCcgfSk7XG4gICAgfVxuICAgIFxuICAgIGlmICghdGhpcy5tZXRhZGF0YS5uYW1lIHx8IHRoaXMubWV0YWRhdGEubmFtZS50cmltKCkgPT09ICcnKSB7XG4gICAgICBlcnJvcnMucHVzaCh7IGZpZWxkOiAnbWV0YWRhdGEubmFtZScsIG1lc3NhZ2U6ICdFbGVtZW50IG5hbWUgaXMgcmVxdWlyZWQnIH0pO1xuICAgIH1cbiAgICBcbiAgICBpZiAoIXRoaXMubWV0YWRhdGEuZGVzY3JpcHRpb24gfHwgdGhpcy5tZXRhZGF0YS5kZXNjcmlwdGlvbi50cmltKCkgPT09ICcnKSB7XG4gICAgICB3YXJuaW5ncy5wdXNoKHsgXG4gICAgICAgIGZpZWxkOiAnbWV0YWRhdGEuZGVzY3JpcHRpb24nLCBcbiAgICAgICAgbWVzc2FnZTogJ0VsZW1lbnQgZGVzY3JpcHRpb24gaXMgcmVjb21tZW5kZWQnLFxuICAgICAgICBzZXZlcml0eTogJ21lZGl1bSdcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBWYWxpZGF0ZSB2ZXJzaW9uIGZvcm1hdCAtIG1vcmUgZmxleGlibGUgdG8gc3VwcG9ydCBMTE0tZ2VuZXJhdGVkIGNvbnRlbnRcbiAgICAvLyBGSVggZm9yIElzc3VlICM5MzU6IEFsbG93IGZsZXhpYmxlIHZlcnNpb24gZm9ybWF0cyBsaWtlIFwiMS4wXCIsIFwiMS4xXCIsIFwiMi4wLjBcIlxuICAgIC8vIFByZXZpb3VzbHk6IFN0cmljdCBzZW12ZXIgcmVnZXggcmVxdWlyaW5nIFguWS5aIGZvcm1hdCBjYXVzZWQgc2tpbGxzIGFjdGl2YXRpb24gZmFpbHVyZXNcbiAgICAvLyBOb3c6IEFjY2VwdCBjb21tb24gdmVyc2lvbiBwYXR0ZXJucyB0aGF0IExMTXMgYW5kIGh1bWFucyBuYXR1cmFsbHkgdXNlXG4gICAgLy8gTm90ZTogTGVhZGluZyB6ZXJvcyBhcmUgYWxsb3dlZCAoZS5nLiwgXCIwMS4wMi4wM1wiKSBidXQgd2lsbCBiZSBub3JtYWxpemVkIHRvIFwiMS4yLjNcIlxuICAgIC8vIFNlY3VyaXR5OiBObyBpbmplY3Rpb24gcmlzayBhcyB2ZXJzaW9uIGlzIGp1c3QgbWV0YWRhdGEsIG5vdCBleGVjdXRlZFxuICAgIGNvbnN0IGZsZXhpYmxlVmVyc2lvblJlZ2V4ID0gL15cXGQrKFxcLlxcZCspPyhcXC5cXGQrKT8oLVthLXpBLVowLTkuLV0rKT8oXFwrW2EtekEtWjAtOS4tXSspPyQvO1xuICAgIGlmICghZmxleGlibGVWZXJzaW9uUmVnZXgudGVzdCh0aGlzLnZlcnNpb24pKSB7XG4gICAgICBlcnJvcnMucHVzaCh7IFxuICAgICAgICBmaWVsZDogJ3ZlcnNpb24nLCBcbiAgICAgICAgbWVzc2FnZTogJ1ZlcnNpb24gbXVzdCBzdGFydCB3aXRoIG51bWJlcnMgaW4gZm9ybWF0OiBNQUpPUlsuTUlOT1JdWy5QQVRDSF1bLVBSRVJFTEVBU0VdWytCVUlMRF0uIFZhbGlkIGV4YW1wbGVzOiBcIjFcIiwgXCIxLjBcIiwgXCIxLjAuMFwiLCBcIjIuMVwiLCBcIjEuMC4wLWJldGFcIiwgXCIxLjAuMC1hbHBoYS4xXCIsIFwiMS4wLjArYnVpbGQxMjNcIi4gVGhlIG1ham9yIHZlcnNpb24gaXMgcmVxdWlyZWQsIG1pbm9yIGFuZCBwYXRjaCBhcmUgb3B0aW9uYWwuIE5vdGU6IExlYWRpbmcgemVyb3MgKGUuZy4sIFwiMDEuMDJcIikgYXJlIGFjY2VwdGVkIGJ1dCB3aWxsIGJlIG5vcm1hbGl6ZWQgdG8gXCIxLjJcIi4nLFxuICAgICAgICBjb2RlOiAnSU5WQUxJRF9WRVJTSU9OX0ZPUk1BVCdcbiAgICAgIH0pO1xuICAgIH1cbiAgICBcbiAgICAvLyBWYWxpZGF0ZSByZWZlcmVuY2VzXG4gICAgaWYgKHRoaXMucmVmZXJlbmNlcykge1xuICAgICAgdGhpcy5yZWZlcmVuY2VzLmZvckVhY2goKHJlZiwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKCFyZWYudXJpIHx8IHJlZi51cmkudHJpbSgpID09PSAnJykge1xuICAgICAgICAgIGVycm9ycy5wdXNoKHsgXG4gICAgICAgICAgICBmaWVsZDogYHJlZmVyZW5jZXNbJHtpbmRleH1dLnVyaWAsIFxuICAgICAgICAgICAgbWVzc2FnZTogJ1JlZmVyZW5jZSBVUkkgaXMgcmVxdWlyZWQnIFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcmVmLnRpdGxlIHx8IHJlZi50aXRsZS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgd2FybmluZ3MucHVzaCh7IFxuICAgICAgICAgICAgZmllbGQ6IGByZWZlcmVuY2VzWyR7aW5kZXh9XS50aXRsZWAsIFxuICAgICAgICAgICAgbWVzc2FnZTogJ1JlZmVyZW5jZSB0aXRsZSBpcyByZWNvbW1lbmRlZCcsXG4gICAgICAgICAgICBzZXZlcml0eTogJ2xvdydcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIFZhbGlkYXRlIHJhdGluZ3MgaWYgcHJlc2VudFxuICAgIGlmICh0aGlzLnJhdGluZ3MpIHtcbiAgICAgIGlmICh0aGlzLnJhdGluZ3MuYWlSYXRpbmcgPCAwIHx8IHRoaXMucmF0aW5ncy5haVJhdGluZyA+IDUpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBcbiAgICAgICAgICBmaWVsZDogJ3JhdGluZ3MuYWlSYXRpbmcnLCBcbiAgICAgICAgICBtZXNzYWdlOiAnQUkgcmF0aW5nIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA1JyBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yYXRpbmdzLnVzZXJSYXRpbmcgIT09IHVuZGVmaW5lZCAmJiBcbiAgICAgICAgICAodGhpcy5yYXRpbmdzLnVzZXJSYXRpbmcgPCAwIHx8IHRoaXMucmF0aW5ncy51c2VyUmF0aW5nID4gNSkpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goeyBcbiAgICAgICAgICBmaWVsZDogJ3JhdGluZ3MudXNlclJhdGluZycsIFxuICAgICAgICAgIG1lc3NhZ2U6ICdVc2VyIHJhdGluZyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNScgXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgc3VnZ2VzdGlvbnNcbiAgICBpZiAoIXRoaXMubWV0YWRhdGEudGFncyB8fCB0aGlzLm1ldGFkYXRhLnRhZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKCdDb25zaWRlciBhZGRpbmcgdGFncyB0byBpbXByb3ZlIGRpc2NvdmVyYWJpbGl0eScpO1xuICAgIH1cbiAgICBcbiAgICBpZiAoIXRoaXMubWV0YWRhdGEuYXV0aG9yKSB7XG4gICAgICBzdWdnZXN0aW9ucy5wdXNoKCdDb25zaWRlciBhZGRpbmcgYXV0aG9yIGluZm9ybWF0aW9uJyk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiB7XG4gICAgICB2YWxpZDogZXJyb3JzLmxlbmd0aCA9PT0gMCxcbiAgICAgIGVycm9yczogZXJyb3JzLmxlbmd0aCA+IDAgPyBlcnJvcnMgOiB1bmRlZmluZWQsXG4gICAgICB3YXJuaW5nczogd2FybmluZ3MubGVuZ3RoID4gMCA/IHdhcm5pbmdzIDogdW5kZWZpbmVkLFxuICAgICAgc3VnZ2VzdGlvbnM6IHN1Z2dlc3Rpb25zLmxlbmd0aCA+IDAgPyBzdWdnZXN0aW9ucyA6IHVuZGVmaW5lZFxuICAgIH07XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBTZXJpYWxpemUgdG8gSlNPTiBmb3JtYXQgZm9yIGludGVybmFsIHVzZSBhbmQgdGVzdGluZy5cbiAgICogTWFpbnRhaW5zIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyB0ZXN0cy5cbiAgICovXG4gIHB1YmxpYyBzZXJpYWxpemVUb0pTT04oKTogc3RyaW5nIHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sXG4gICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YSxcbiAgICAgIHJlZmVyZW5jZXM6IHRoaXMucmVmZXJlbmNlcyxcbiAgICAgIGV4dGVuc2lvbnM6IHRoaXMuZXh0ZW5zaW9ucyxcbiAgICAgIHJhdGluZ3M6IHRoaXMucmF0aW5nc1xuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGRhdGEsIG51bGwsIDIpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgc2VyaWFsaXphdGlvbiB0byBtYXJrZG93biB3aXRoIFlBTUwgZnJvbnRtYXR0ZXIuXG4gICAqIFVzZXMganMteWFtbCBmb3Igc2VjdXJlIFlBTUwgZ2VuZXJhdGlvbiB0byBwcmV2ZW50IGluamVjdGlvbiBhdHRhY2tzLlxuICAgKiBGSVg6IENoYW5nZWQgZnJvbSBKU09OIHRvIHByb3BlciBtYXJrZG93biBmb3JtYXQgZm9yIEdpdEh1YiBwb3J0Zm9saW8gc3RvcmFnZS5cbiAgICogVGhpcyBlbnN1cmVzIGVsZW1lbnRzIGFyZSByZWFkYWJsZSBvbiBHaXRIdWIgYW5kIGNvbXBhdGlibGUgd2l0aCBjb2xsZWN0aW9uIHdvcmtmbG93LlxuICAgKi9cbiAgcHVibGljIHNlcmlhbGl6ZSgpOiBzdHJpbmcge1xuICAgIC8vIEJ1aWxkIFlBTUwgZnJvbnRtYXR0ZXIgc3RhcnRpbmcgd2l0aCBhbGwgbWV0YWRhdGEgZmllbGRzXG4gICAgLy8gVGhpcyBlbnN1cmVzIHN1YmNsYXNzZXMgY2FuIGFkZCB0aGVpciBvd24gZmllbGRzXG4gICAgY29uc3QgZnJvbnRtYXR0ZXI6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7XG4gICAgICAuLi50aGlzLm1ldGFkYXRhLCAgLy8gSW5jbHVkZSBhbGwgbWV0YWRhdGEgZmllbGRzXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICB2ZXJzaW9uOiB0aGlzLnZlcnNpb25cbiAgICB9O1xuICAgIFxuICAgIC8vIE5vdGU6IG1ldGFkYXRhIGFscmVhZHkgaW5jbHVkZXMgbmFtZSwgZGVzY3JpcHRpb24sIGF1dGhvciwgY3JlYXRlZCwgbW9kaWZpZWRcbiAgICAvLyBhbmQgYW55IGFkZGl0aW9uYWwgZmllbGRzIGFkZGVkIGJ5IHN1YmNsYXNzZXNcbiAgICBpZiAodGhpcy5yZWZlcmVuY2VzICYmIHRoaXMucmVmZXJlbmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmcm9udG1hdHRlci5yZWZlcmVuY2VzID0gdGhpcy5yZWZlcmVuY2VzLm1hcChyZWYgPT4gKHtcbiAgICAgICAgdHlwZTogcmVmLnR5cGUsXG4gICAgICAgIHVyaTogcmVmLnVyaSxcbiAgICAgICAgdGl0bGU6IHJlZi50aXRsZVxuICAgICAgfSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5yYXRpbmdzICYmIHRoaXMucmF0aW5ncy5haVJhdGluZyA+IDApIHtcbiAgICAgIGZyb250bWF0dGVyLnJhdGluZ3MgPSB7XG4gICAgICAgIGFpUmF0aW5nOiB0aGlzLnJhdGluZ3MuYWlSYXRpbmcsXG4gICAgICAgIHVzZXJSYXRpbmc6IHRoaXMucmF0aW5ncy51c2VyUmF0aW5nLFxuICAgICAgICByYXRpbmdDb3VudDogdGhpcy5yYXRpbmdzLnJhdGluZ0NvdW50XG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBSZW1vdmUgdW5kZWZpbmVkL251bGwgdmFsdWVzIHJlY3Vyc2l2ZWx5XG4gICAgY29uc3QgY2xlYW5Gcm9udG1hdHRlciA9IHRoaXMuZGVlcENsZWFuT2JqZWN0KGZyb250bWF0dGVyKTtcbiAgICBcbiAgICAvLyBVc2UganMteWFtbCBmb3Igc2VjdXJlIFlBTUwgZ2VuZXJhdGlvblxuICAgIC8vIFRoaXMgcHJldmVudHMgWUFNTCBpbmplY3Rpb24gYXR0YWNrcyBhbmQgaGFuZGxlcyBzcGVjaWFsIGNoYXJhY3RlcnMgcHJvcGVybHlcbiAgICBsZXQgeWFtbEZyb250bWF0dGVyOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHlhbWxGcm9udG1hdHRlciA9IHlhbWwuZHVtcChjbGVhbkZyb250bWF0dGVyLCB7XG4gICAgICAgIG5vUmVmczogdHJ1ZSwgICAgICAgICAgLy8gRG9uJ3QgdXNlIFlBTUwgcmVmZXJlbmNlc1xuICAgICAgICBzb3J0S2V5czogZmFsc2UsICAgICAgIC8vIEtlZXAgb3VyIG9yZGVyXG4gICAgICAgIGxpbmVXaWR0aDogLTEsICAgICAgICAgLy8gRG9uJ3Qgd3JhcCBsaW5lc1xuICAgICAgICBxdW90aW5nVHlwZTogJ1wiJywgICAgICAvLyBVc2UgZG91YmxlIHF1b3RlcyB3aGVuIG5lZWRlZFxuICAgICAgICBmb3JjZVF1b3RlczogZmFsc2UsICAgIC8vIE9ubHkgcXVvdGUgd2hlbiBuZWNlc3NhcnlcbiAgICAgICAgc2tpcEludmFsaWQ6IGZhbHNlICAgICAvLyBEb24ndCBza2lwIGludmFsaWQgdmFsdWVzXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gSWYgWUFNTCBnZW5lcmF0aW9uIGZhaWxzLCBsb2cgYW5kIHRocm93IGEgbW9yZSBpbmZvcm1hdGl2ZSBlcnJvclxuICAgICAgbG9nZ2VyLmVycm9yKCdGYWlsZWQgdG8gZ2VuZXJhdGUgWUFNTCBmcm9udG1hdHRlcicsIHsgZXJyb3IsIGZyb250bWF0dGVyOiBjbGVhbkZyb250bWF0dGVyIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2VyaWFsaXplIGVsZW1lbnQgbWV0YWRhdGEgdG8gWUFNTDogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIGVycm9yJ31gKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgdGhlIGdlbmVyYXRlZCBZQU1MIGNhbiBiZSBwYXJzZWQgYmFjayB1c2luZyBTZWN1cmVZYW1sUGFyc2VyXG4gICAgLy8gSElHSCBTRVZFUklUWSBGSVg6IFVzZSBTZWN1cmVZYW1sUGFyc2VyIGluc3RlYWQgb2YgeWFtbC5sb2FkIHRvIHByZXZlbnQgY29kZSBleGVjdXRpb25cbiAgICB0cnkge1xuICAgICAgU2VjdXJlWWFtbFBhcnNlci5wYXJzZSh5YW1sRnJvbnRtYXR0ZXIsIHtcbiAgICAgICAgbWF4WWFtbFNpemU6IDY0ICogMTAyNCwgLy8gNjRLQiBsaW1pdCBmb3IgZnJvbnRtYXR0ZXJcbiAgICAgICAgdmFsaWRhdGVDb250ZW50OiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKCdHZW5lcmF0ZWQgaW52YWxpZCBZQU1MJywgeyBlcnJvciwgeWFtbDogeWFtbEZyb250bWF0dGVyIH0pO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBHZW5lcmF0ZWQgWUFNTCBpcyBpbnZhbGlkOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICAgIH1cbiAgICBcbiAgICAvLyBHZXQgY29udGVudCAtIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgdG8gcHJvdmlkZSBhY3R1YWwgY29udGVudFxuICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmdldENvbnRlbnQgPyB0aGlzLmdldENvbnRlbnQoKSA6IGAjICR7dGhpcy5tZXRhZGF0YS5uYW1lfVxcblxcbiR7dGhpcy5tZXRhZGF0YS5kZXNjcmlwdGlvbiB8fCAnJ31gO1xuICAgIFxuICAgIC8vIFRyaW0gdGhlIFlBTUwgdG8gcmVtb3ZlIHRyYWlsaW5nIG5ld2xpbmUgdGhhdCB5YW1sLmR1bXAgYWRkc1xuICAgIHJldHVybiBgLS0tXFxuJHt5YW1sRnJvbnRtYXR0ZXIudHJpbSgpfVxcbi0tLVxcblxcbiR7Y29udGVudH1gO1xuICB9XG4gIFxuICAvKipcbiAgICogR2V0IGVsZW1lbnQgY29udGVudCBmb3Igc2VyaWFsaXphdGlvbi5cbiAgICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyB0byBwcm92aWRlIHRoZWlyIHNwZWNpZmljIGNvbnRlbnQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0Q29udGVudD8oKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSZWN1cnNpdmVseSByZW1vdmUgdW5kZWZpbmVkIGFuZCBudWxsIHZhbHVlcyBmcm9tIGFuIG9iamVjdC5cbiAgICogVGhpcyBlbnN1cmVzIFlBTUwgc2VyaWFsaXphdGlvbiBkb2Vzbid0IGZhaWwgb24gdW5kZWZpbmVkIHZhbHVlcy5cbiAgICovXG4gIHByaXZhdGUgZGVlcENsZWFuT2JqZWN0KG9iajogYW55KTogYW55IHtcbiAgICBpZiAob2JqID09PSBudWxsIHx8IG9iaiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiBvYmpcbiAgICAgICAgLm1hcChpdGVtID0+IHRoaXMuZGVlcENsZWFuT2JqZWN0KGl0ZW0pKVxuICAgICAgICAuZmlsdGVyKGl0ZW0gPT4gaXRlbSAhPT0gdW5kZWZpbmVkKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IGNsZWFuZWQ6IGFueSA9IHt9O1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgICBjb25zdCBjbGVhbmVkVmFsdWUgPSB0aGlzLmRlZXBDbGVhbk9iamVjdCh2YWx1ZSk7XG4gICAgICAgIGlmIChjbGVhbmVkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNsZWFuZWRba2V5XSA9IGNsZWFuZWRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNsZWFuZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGRlc2VyaWFsaXphdGlvbiBmcm9tIEpTT04uXG4gICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGZvciBjdXN0b20gZm9ybWF0cy5cbiAgICovXG4gIHB1YmxpYyBkZXNlcmlhbGl6ZShkYXRhOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgLy8gTm9ybWFsaXplIFVuaWNvZGUgaW5wdXQgYmVmb3JlIHBhcnNpbmdcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShkYXRhKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodmFsaWRhdGlvblJlc3VsdC5ub3JtYWxpemVkQ29udGVudCk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIGZpZWxkc1xuICAgICAgaWYgKCFwYXJzZWQuaWQgfHwgIXBhcnNlZC50eXBlIHx8ICFwYXJzZWQubWV0YWRhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVsZW1lbnQgZGF0YTogbWlzc2luZyByZXF1aXJlZCBmaWVsZHMnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIHByb3BlcnRpZXNcbiAgICAgIHRoaXMuaWQgPSBwYXJzZWQuaWQ7XG4gICAgICB0aGlzLnR5cGUgPSBwYXJzZWQudHlwZTtcbiAgICAgIHRoaXMudmVyc2lvbiA9IG5vcm1hbGl6ZVZlcnNpb24oU3RyaW5nKHBhcnNlZC52ZXJzaW9uID8/ICcxLjAuMCcpKTtcbiAgICAgIHRoaXMubWV0YWRhdGEgPSBwYXJzZWQubWV0YWRhdGE7XG4gICAgICB0aGlzLnJlZmVyZW5jZXMgPSBwYXJzZWQucmVmZXJlbmNlcyB8fCBbXTtcbiAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHBhcnNlZC5leHRlbnNpb25zIHx8IHt9O1xuICAgICAgdGhpcy5yYXRpbmdzID0gcGFyc2VkLnJhdGluZ3M7XG4gICAgICBcbiAgICAgIHRoaXMuX2lzRGlydHkgPSBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRW5oYW5jZWQgZXJyb3IgY29udGV4dCBwcmVzZXJ2YXRpb25cbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGNvbnN0IGVycm9yU3RhY2sgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQ7XG4gICAgICBcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGRlc2VyaWFsaXplIGVsZW1lbnQnLCB7IFxuICAgICAgICBlcnJvcjogZXJyb3JNZXNzYWdlLFxuICAgICAgICBzdGFjazogZXJyb3JTdGFjayxcbiAgICAgICAgZGF0YVByZXZpZXc6IGRhdGEuc3Vic3RyaW5nKDAsIDIwMCksIC8vIEZpcnN0IDIwMCBjaGFycyBmb3IgY29udGV4dFxuICAgICAgICBlbGVtZW50VHlwZTogdGhpcy50eXBlXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIG5ldyBlcnJvciB3aXRoIG9yaWdpbmFsIGFzIGNhdXNlXG4gICAgICBjb25zdCBkZXNlcmlhbGl6ZUVycm9yID0gbmV3IEVycm9yKGBCYXNlRWxlbWVudCBkZXNlcmlhbGl6YXRpb24gZmFpbGVkOiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGRlc2VyaWFsaXplRXJyb3IuY2F1c2UgPSBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHRocm93IGRlc2VyaWFsaXplRXJyb3I7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogUHJvY2VzcyB1c2VyIGZlZWRiYWNrIGFuZCB1cGRhdGUgcmF0aW5ncy5cbiAgICovXG4gIHB1YmxpYyByZWNlaXZlRmVlZGJhY2soZmVlZGJhY2s6IHN0cmluZywgY29udGV4dD86IEZlZWRiYWNrQ29udGV4dCk6IHZvaWQge1xuICAgIC8vIE5vcm1hbGl6ZSBVbmljb2RlIGlucHV0IHRvIHByZXZlbnQgc2VjdXJpdHkgaXNzdWVzXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGZlZWRiYWNrKTtcbiAgICBjb25zdCBub3JtYWxpemVkRmVlZGJhY2sgPSB2YWxpZGF0aW9uUmVzdWx0Lm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIFxuICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3IgZmVlZGJhY2sgcHJvY2Vzc2luZ1xuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0Jhc2VFbGVtZW50LnJlY2VpdmVGZWVkYmFjaycsXG4gICAgICBkZXRhaWxzOiBgRmVlZGJhY2sgcHJvY2Vzc2VkIGZvciBlbGVtZW50ICR7dGhpcy50eXBlfToke3RoaXMuaWR9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IFxuICAgICAgICBlbGVtZW50VHlwZTogdGhpcy50eXBlLCBcbiAgICAgICAgZWxlbWVudElkOiB0aGlzLmlkLFxuICAgICAgICBmZWVkYmFja0xlbmd0aDogZmVlZGJhY2subGVuZ3RoLFxuICAgICAgICBoYXNVbmljb2RlSXNzdWVzOiAhdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkXG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgaWYgKCF0aGlzLnJhdGluZ3MpIHtcbiAgICAgIHRoaXMucmF0aW5ncyA9IHtcbiAgICAgICAgYWlSYXRpbmc6IDAsXG4gICAgICAgIHVzZXJSYXRpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgcmF0aW5nQ291bnQ6IDAsXG4gICAgICAgIGxhc3RFdmFsdWF0ZWQ6IG5ldyBEYXRlKCksXG4gICAgICAgIGNvbmZpZGVuY2U6IDAsXG4gICAgICAgIHRyZW5kOiAnc3RhYmxlJyxcbiAgICAgICAgZmVlZGJhY2tIaXN0b3J5OiBbXVxuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIGZlZWRiYWNrIGVudHJ5IHdpdGggbm9ybWFsaXplZCBjb250ZW50XG4gICAgY29uc3QgdXNlckZlZWRiYWNrOiBVc2VyRmVlZGJhY2sgPSB7XG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICBmZWVkYmFjazogbm9ybWFsaXplZEZlZWRiYWNrLFxuICAgICAgc2VudGltZW50OiB0aGlzLmFuYWx5emVTZW50aW1lbnQobm9ybWFsaXplZEZlZWRiYWNrKSxcbiAgICAgIGluZmVycmVkUmF0aW5nOiB0aGlzLmluZmVyUmF0aW5nKG5vcm1hbGl6ZWRGZWVkYmFjayksXG4gICAgICBjb250ZXh0LFxuICAgICAgZWxlbWVudFZlcnNpb246IHRoaXMudmVyc2lvblxuICAgIH07XG4gICAgXG4gICAgLy8gQWRkIHRvIGhpc3Rvcnkgd2l0aCBib3VuZHMgY2hlY2tpbmdcbiAgICBpZiAoIXRoaXMucmF0aW5ncy5mZWVkYmFja0hpc3RvcnkpIHtcbiAgICAgIHRoaXMucmF0aW5ncy5mZWVkYmFja0hpc3RvcnkgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5yYXRpbmdzLmZlZWRiYWNrSGlzdG9yeS5wdXNoKHVzZXJGZWVkYmFjayk7XG4gICAgXG4gICAgLy8gUHJldmVudCB1bmJvdW5kZWQgZ3Jvd3RoXG4gICAgaWYgKHRoaXMucmF0aW5ncy5mZWVkYmFja0hpc3RvcnkubGVuZ3RoID4gdGhpcy5NQVhfRkVFREJBQ0tfSElTVE9SWSkge1xuICAgICAgdGhpcy5yYXRpbmdzLmZlZWRiYWNrSGlzdG9yeSA9IHRoaXMucmF0aW5ncy5mZWVkYmFja0hpc3Rvcnkuc2xpY2UoLXRoaXMuTUFYX0ZFRURCQUNLX0hJU1RPUlkpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBGZWVkYmFjayBoaXN0b3J5IHRyaW1tZWQgdG8gJHt0aGlzLk1BWF9GRUVEQkFDS19ISVNUT1JZfSBlbnRyaWVzIGZvciBlbGVtZW50ICR7dGhpcy5pZH1gKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIHVzZXIgcmF0aW5nIGlmIHdlIGluZmVycmVkIG9uZVxuICAgIGlmICh1c2VyRmVlZGJhY2suaW5mZXJyZWRSYXRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy51cGRhdGVVc2VyUmF0aW5nKHVzZXJGZWVkYmFjay5pbmZlcnJlZFJhdGluZyk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuICB9XG4gIFxuICAvKipcbiAgICogU2ltcGxlIHNlbnRpbWVudCBhbmFseXNpcy5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgZm9yIG1vcmUgc29waGlzdGljYXRlZCBhbmFseXNpcy5cbiAgICovXG4gIHByb3RlY3RlZCBhbmFseXplU2VudGltZW50KGZlZWRiYWNrOiBzdHJpbmcpOiAncG9zaXRpdmUnIHwgJ25lZ2F0aXZlJyB8ICduZXV0cmFsJyB7XG4gICAgY29uc3QgbG93ZXIgPSBmZWVkYmFjay50b0xvd2VyQ2FzZSgpO1xuICAgIFxuICAgIGNvbnN0IHBvc2l0aXZlV29yZHMgPSBbJ2V4Y2VsbGVudCcsICdncmVhdCcsICdnb29kJywgJ2hlbHBmdWwnLCAndXNlZnVsJywgJ3BlcmZlY3QnLCAnYW1hemluZycsICdsb3ZlJ107XG4gICAgY29uc3QgbmVnYXRpdmVXb3JkcyA9IFsnYmFkJywgJ3Bvb3InLCAndGVycmlibGUnLCAndXNlbGVzcycsICdicm9rZW4nLCAnaGF0ZScsICdhd2Z1bCcsICdkaXNhcHBvaW50aW5nJ107XG4gICAgXG4gICAgY29uc3QgcG9zaXRpdmVDb3VudCA9IHBvc2l0aXZlV29yZHMuZmlsdGVyKHdvcmQgPT4gbG93ZXIuaW5jbHVkZXMod29yZCkpLmxlbmd0aDtcbiAgICBjb25zdCBuZWdhdGl2ZUNvdW50ID0gbmVnYXRpdmVXb3Jkcy5maWx0ZXIod29yZCA9PiBsb3dlci5pbmNsdWRlcyh3b3JkKSkubGVuZ3RoO1xuICAgIFxuICAgIGlmIChwb3NpdGl2ZUNvdW50ID4gbmVnYXRpdmVDb3VudCkgcmV0dXJuICdwb3NpdGl2ZSc7XG4gICAgaWYgKG5lZ2F0aXZlQ291bnQgPiBwb3NpdGl2ZUNvdW50KSByZXR1cm4gJ25lZ2F0aXZlJztcbiAgICByZXR1cm4gJ25ldXRyYWwnO1xuICB9XG4gIFxuICAvKipcbiAgICogU2ltcGxlIHJhdGluZyBpbmZlcmVuY2UgZnJvbSBmZWVkYmFjay5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgZm9yIG1vcmUgc29waGlzdGljYXRlZCBpbmZlcmVuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5mZXJSYXRpbmcoZmVlZGJhY2s6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2VudGltZW50ID0gdGhpcy5hbmFseXplU2VudGltZW50KGZlZWRiYWNrKTtcbiAgICBjb25zdCBsb3dlciA9IGZlZWRiYWNrLnRvTG93ZXJDYXNlKCk7XG4gICAgXG4gICAgLy8gTG9vayBmb3IgZXhwbGljaXQgcmF0aW5nc1xuICAgIGNvbnN0IHJhdGluZ01hdGNoID0gbG93ZXIubWF0Y2goLyhcXGQrKVxccyooc3RhcnM/fFxcLzV8b3V0IG9mIDUpLyk7XG4gICAgaWYgKHJhdGluZ01hdGNoKSB7XG4gICAgICBjb25zdCByYXRpbmcgPSBOdW1iZXIucGFyc2VJbnQocmF0aW5nTWF0Y2hbMV0pO1xuICAgICAgaWYgKHJhdGluZyA+PSAxICYmIHJhdGluZyA8PSA1KSByZXR1cm4gcmF0aW5nO1xuICAgIH1cbiAgICBcbiAgICAvLyBJbmZlciBmcm9tIHNlbnRpbWVudFxuICAgIGlmIChzZW50aW1lbnQgPT09ICdwb3NpdGl2ZScpIHtcbiAgICAgIGlmIChsb3dlci5pbmNsdWRlcygncGVyZmVjdCcpIHx8IGxvd2VyLmluY2x1ZGVzKCdleGNlbGxlbnQnKSkgcmV0dXJuIDU7XG4gICAgICBpZiAobG93ZXIuaW5jbHVkZXMoJ2dyZWF0JykgfHwgbG93ZXIuaW5jbHVkZXMoJ3ZlcnkgZ29vZCcpKSByZXR1cm4gNDtcbiAgICAgIHJldHVybiA0O1xuICAgIH0gZWxzZSBpZiAoc2VudGltZW50ID09PSAnbmVnYXRpdmUnKSB7XG4gICAgICBpZiAobG93ZXIuaW5jbHVkZXMoJ3RlcnJpYmxlJykgfHwgbG93ZXIuaW5jbHVkZXMoJ2F3ZnVsJykpIHJldHVybiAxO1xuICAgICAgaWYgKGxvd2VyLmluY2x1ZGVzKCdwb29yJykgfHwgbG93ZXIuaW5jbHVkZXMoJ2JhZCcpKSByZXR1cm4gMjtcbiAgICAgIHJldHVybiAyO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gMzsgLy8gTmV1dHJhbFxuICB9XG4gIFxuICAvKipcbiAgICogVXBkYXRlIHVzZXIgcmF0aW5nIHdpdGggYSBuZXcgdmFsdWUuXG4gICAqL1xuICBwcm90ZWN0ZWQgdXBkYXRlVXNlclJhdGluZyhuZXdSYXRpbmc6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5yYXRpbmdzKSByZXR1cm47XG4gICAgXG4gICAgaWYgKHRoaXMucmF0aW5ncy51c2VyUmF0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmF0aW5ncy51c2VyUmF0aW5nID0gbmV3UmF0aW5nO1xuICAgICAgdGhpcy5yYXRpbmdzLnJhdGluZ0NvdW50ID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FsY3VsYXRlIHJ1bm5pbmcgYXZlcmFnZVxuICAgICAgY29uc3QgdG90YWxSYXRpbmcgPSB0aGlzLnJhdGluZ3MudXNlclJhdGluZyAqIHRoaXMucmF0aW5ncy5yYXRpbmdDb3VudCArIG5ld1JhdGluZztcbiAgICAgIHRoaXMucmF0aW5ncy5yYXRpbmdDb3VudCsrO1xuICAgICAgdGhpcy5yYXRpbmdzLnVzZXJSYXRpbmcgPSB0b3RhbFJhdGluZyAvIHRoaXMucmF0aW5ncy5yYXRpbmdDb3VudDtcbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIGRlbHRhIGFuZCB0cmVuZFxuICAgIHRoaXMucmF0aW5ncy5yYXRpbmdEZWx0YSA9IHRoaXMucmF0aW5ncy51c2VyUmF0aW5nIC0gdGhpcy5yYXRpbmdzLmFpUmF0aW5nO1xuICAgIFxuICAgIC8vIFNpbXBsZSB0cmVuZCBjYWxjdWxhdGlvbiBiYXNlZCBvbiByZWNlbnQgZmVlZGJhY2tcbiAgICBjb25zdCByZWNlbnRGZWVkYmFjayA9IHRoaXMucmF0aW5ncy5mZWVkYmFja0hpc3Rvcnk/LnNsaWNlKC01KSB8fCBbXTtcbiAgICBjb25zdCByZWNlbnRTZW50aW1lbnRzID0gcmVjZW50RmVlZGJhY2subWFwKGYgPT4gZi5zZW50aW1lbnQpO1xuICAgIGNvbnN0IHBvc2l0aXZlQ291bnQgPSByZWNlbnRTZW50aW1lbnRzLmZpbHRlcihzID0+IHMgPT09ICdwb3NpdGl2ZScpLmxlbmd0aDtcbiAgICBjb25zdCBuZWdhdGl2ZUNvdW50ID0gcmVjZW50U2VudGltZW50cy5maWx0ZXIocyA9PiBzID09PSAnbmVnYXRpdmUnKS5sZW5ndGg7XG4gICAgXG4gICAgaWYgKHBvc2l0aXZlQ291bnQgPiBuZWdhdGl2ZUNvdW50ICsgMSkge1xuICAgICAgdGhpcy5yYXRpbmdzLnRyZW5kID0gJ2ltcHJvdmluZyc7XG4gICAgfSBlbHNlIGlmIChuZWdhdGl2ZUNvdW50ID4gcG9zaXRpdmVDb3VudCArIDEpIHtcbiAgICAgIHRoaXMucmF0aW5ncy50cmVuZCA9ICdkZWNsaW5pbmcnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJhdGluZ3MudHJlbmQgPSAnc3RhYmxlJztcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBlbGVtZW50IHN0YXR1cy5cbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0dXMoKTogRWxlbWVudFN0YXR1cyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0dXMgcHJvcGVydHkgZ2V0dGVyIGZvciBjb252ZW5pZW50IGFjY2Vzcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhdHVzKCk6IEVsZW1lbnRTdGF0dXMge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCBsaWZlY3ljbGUgbWV0aG9kcyAtIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lZWRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBiZWZvcmVBY3RpdmF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuZGVidWcoYFByZXBhcmluZyB0byBhY3RpdmF0ZSAke3RoaXMudHlwZX0gZWxlbWVudDogJHt0aGlzLm1ldGFkYXRhLm5hbWV9YCk7XG4gICAgdGhpcy5fc3RhdHVzID0gRWxlbWVudFN0YXR1cy5BQ1RJVkFUSU5HO1xuICB9XG4gIFxuICBwdWJsaWMgYXN5bmMgYWN0aXZhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX3N0YXR1cyAhPT0gRWxlbWVudFN0YXR1cy5BQ1RJVkUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBBY3RpdmF0aW5nICR7dGhpcy50eXBlfSBlbGVtZW50OiAke3RoaXMubWV0YWRhdGEubmFtZX1gKTtcbiAgICB9XG4gICAgLy8gUmUtYWN0aXZhdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudCBhcmUgc2lsZW50IOKAlCBubyB2YWx1ZSBpbiBsb2dnaW5nXG4gICAgdGhpcy5fc3RhdHVzID0gRWxlbWVudFN0YXR1cy5BQ1RJVkU7XG4gIH1cbiAgXG4gIHB1YmxpYyBhc3luYyBhZnRlckFjdGl2YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhgQ29tcGxldGVkIGFjdGl2YXRpb24gb2YgJHt0aGlzLnR5cGV9IGVsZW1lbnQ6ICR7dGhpcy5tZXRhZGF0YS5uYW1lfWApO1xuICB9XG4gIFxuICBwdWJsaWMgYXN5bmMgZGVhY3RpdmF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuaW5mbyhgRGVhY3RpdmF0aW5nICR7dGhpcy50eXBlfSBlbGVtZW50OiAke3RoaXMubWV0YWRhdGEubmFtZX1gKTtcbiAgICB0aGlzLl9zdGF0dXMgPSBFbGVtZW50U3RhdHVzLkRFQUNUSVZBVElORztcbiAgICAvLyBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgY2xlYW51cCBsb2dpY1xuICAgIHRoaXMuX3N0YXR1cyA9IEVsZW1lbnRTdGF0dXMuSU5BQ1RJVkU7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBNYXJrIGVsZW1lbnQgYXMgbW9kaWZpZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgbWFya0RpcnR5KCk6IHZvaWQge1xuICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuICAgIHRoaXMubWV0YWRhdGEubW9kaWZpZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbGVtZW50IGhhcyB1bnNhdmVkIGNoYW5nZXMuXG4gICAqL1xuICBwdWJsaWMgaXNEaXJ0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNEaXJ0eTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIE1hcmsgZWxlbWVudCBhcyBzYXZlZC5cbiAgICovXG4gIHB1YmxpYyBtYXJrQ2xlYW4oKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXJ0eSA9IGZhbHNlO1xuICB9XG59XG4iXX0=
|
|
552
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUVsZW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZWxlbWVudHMvQmFzZUVsZW1lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUdMLGFBQWEsRUFRZCxNQUFNLDRCQUE0QixDQUFDO0FBRXBDLE9BQU8sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDakUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFHbkU7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxPQUFlO0lBQzlDLHlEQUF5RDtJQUN6RCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7SUFFeEUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ1gsNkNBQTZDO1FBQzdDLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFRCxNQUFNLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLEdBQUcsRUFBRSxLQUFLLEdBQUcsR0FBRyxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7SUFFL0QsZ0RBQWdEO0lBQ2hELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzlELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FB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QUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNJLFNBQVM7UUFDZCxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCYXNlIGFic3RyYWN0IGNsYXNzIGltcGxlbWVudGluZyBJRWxlbWVudCBpbnRlcmZhY2UuXG4gKiBQcm92aWRlcyBjb21tb24gZnVuY3Rpb25hbGl0eSB0aGF0IGFsbCBlbGVtZW50IHR5cGVzIGNhbiBleHRlbmQuXG4gKi9cblxuaW1wb3J0IHtcbiAgSUVsZW1lbnQsXG4gIElFbGVtZW50TWV0YWRhdGEsXG4gIEVsZW1lbnRTdGF0dXMsXG4gIEVsZW1lbnRSYXRpbmdzLFxuICBSZWZlcmVuY2UsXG4gIEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0LFxuICBWYWxpZGF0aW9uRXJyb3IsXG4gIFZhbGlkYXRpb25XYXJuaW5nLFxuICBGZWVkYmFja0NvbnRleHQsXG4gIFVzZXJGZWVkYmFja1xufSBmcm9tICcuLi90eXBlcy9lbGVtZW50cy9pbmRleC5qcyc7XG5pbXBvcnQgeyBFbGVtZW50VHlwZSB9IGZyb20gJy4uL3BvcnRmb2xpby90eXBlcy5qcyc7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAnanMteWFtbCc7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi91dGlscy9sb2dnZXIuanMnO1xuaW1wb3J0IHsgVW5pY29kZVZhbGlkYXRvciB9IGZyb20gJy4uL3NlY3VyaXR5L3ZhbGlkYXRvcnMvdW5pY29kZVZhbGlkYXRvci5qcyc7XG5pbXBvcnQgeyBTZWN1cml0eU1vbml0b3IgfSBmcm9tICcuLi9zZWN1cml0eS9zZWN1cml0eU1vbml0b3IuanMnO1xuaW1wb3J0IHsgU2VjdXJlWWFtbFBhcnNlciB9IGZyb20gJy4uL3NlY3VyaXR5L3NlY3VyZVlhbWxQYXJzZXIuanMnO1xuaW1wb3J0IHsgTWV0YWRhdGFTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvTWV0YWRhdGFTZXJ2aWNlLmpzJztcblxuLyoqXG4gKiBOb3JtYWxpemVzIHZlcnNpb24gc3RyaW5ncyB0byBmdWxsIHNlbXZlciBmb3JtYXQgKFguWS5aKVxuICogVGhpcyBoZWxwcyBtYWludGFpbiBjb25zaXN0ZW5jeSB3aGlsZSBhY2NlcHRpbmcgZmxleGlibGUgaW5wdXQgZm9ybWF0c1xuICogXG4gKiBAcGFyYW0gdmVyc2lvbiAtIFRoZSB2ZXJzaW9uIHN0cmluZyB0byBub3JtYWxpemVcbiAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgdmVyc2lvbiBzdHJpbmcgaW4gWC5ZLlogZm9ybWF0IHdpdGggbGVhZGluZyB6ZXJvcyByZW1vdmVkXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBub3JtYWxpemVWZXJzaW9uKFwiMVwiKSAgICAgICAgLy8gXCIxLjAuMFwiXG4gKiBub3JtYWxpemVWZXJzaW9uKFwiMS4yXCIpICAgICAgLy8gXCIxLjIuMFwiXG4gKiBub3JtYWxpemVWZXJzaW9uKFwiMS4yLjNcIikgICAgLy8gXCIxLjIuM1wiXG4gKiBub3JtYWxpemVWZXJzaW9uKFwiMS4wLWJldGFcIikgLy8gXCIxLjAuMC1iZXRhXCJcbiAqIG5vcm1hbGl6ZVZlcnNpb24oXCIwMS4wMi4wM1wiKSAvLyBcIjEuMi4zXCIgKHN0cmlwcyBsZWFkaW5nIHplcm9zKVxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplVmVyc2lvbih2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAvLyBFeHRyYWN0IGJhc2UgdmVyc2lvbiBhbmQgYW55IHByZXJlbGVhc2UvYnVpbGQgbWV0YWRhdGFcbiAgY29uc3QgbWF0Y2ggPSB2ZXJzaW9uLm1hdGNoKC9eKFxcZCspKD86XFwuKFxcZCspKT8oPzpcXC4oXFxkKykpPyhbLStdLispPyQvKTtcbiAgXG4gIGlmICghbWF0Y2gpIHtcbiAgICAvLyBSZXR1cm4gYXMtaXMgaWYgbm90IGEgdmFsaWQgdmVyc2lvbiBmb3JtYXRcbiAgICByZXR1cm4gdmVyc2lvbjtcbiAgfVxuICBcbiAgY29uc3QgWywgbWFqb3IsIG1pbm9yID0gJzAnLCBwYXRjaCA9ICcwJywgc3VmZml4ID0gJyddID0gbWF0Y2g7XG4gIFxuICAvLyBTdHJpcCBsZWFkaW5nIHplcm9zIGJ1dCBwcmVzZXJ2ZSBcIjBcIiBhcyB2YWxpZFxuICBjb25zdCBub3JtYWxpemVkTWFqb3IgPSBOdW1iZXIucGFyc2VJbnQobWFqb3IsIDEwKS50b1N0cmluZygpO1xuICBjb25zdCBub3JtYWxpemVkTWlub3IgPSBOdW1iZXIucGFyc2VJbnQobWlub3IsIDEwKS50b1N0cmluZygpO1xuICBjb25zdCBub3JtYWxpemVkUGF0Y2ggPSBOdW1iZXIucGFyc2VJbnQocGF0Y2gsIDEwKS50b1N0cmluZygpO1xuICBcbiAgcmV0dXJuIGAke25vcm1hbGl6ZWRNYWpvcn0uJHtub3JtYWxpemVkTWlub3J9LiR7bm9ybWFsaXplZFBhdGNofSR7c3VmZml4fWA7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlRWxlbWVudCBpbXBsZW1lbnRzIElFbGVtZW50IHtcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVFJBTlNJRU5UX01FVEFEQVRBX0ZJRUxEUyA9IG5ldyBTZXQoW1xuICAgICdnYXRla2VlcGVyRGlhZ25vc3RpY3MnLFxuICBdKTtcbiAgLy8gSWRlbnRpdHlcbiAgcHVibGljIGlkOiBzdHJpbmc7XG4gIHB1YmxpYyB0eXBlOiBFbGVtZW50VHlwZTtcbiAgcHVibGljIHZlcnNpb246IHN0cmluZztcbiAgXG4gIC8vIE1ldGFkYXRhXG4gIHB1YmxpYyBtZXRhZGF0YTogSUVsZW1lbnRNZXRhZGF0YTtcbiAgXG4gIC8vIER1YWwtZmllbGQgc2VtYW50aWMgYXJjaGl0ZWN0dXJlICh2Mi4wKVxuICAvLyBBbGwgZWxlbWVudCB0eXBlcyBpbmhlcml0IHRoZXNlOyBzdWJjbGFzc2VzIG1heSBvdmVycmlkZSB3aXRoIHJpY2hlciBiZWhhdmlvci5cbiAgLy8gLSBpbnN0cnVjdGlvbnM6IGJlaGF2aW9yYWwgZGlyZWN0aXZlcyAoY29tbWFuZCB2b2ljZSwgaW1wZXJhdGl2ZXMgdG8gZm9sbG93KVxuICAvLyAtIGNvbnRlbnQ6IHJlZmVyZW5jZSBtYXRlcmlhbCAoaW5mb3JtYXRpb25hbCBkYXRhIHRvIGRyYXcgZnJvbSlcbiAgLy8gRGVjbGFyZWQgYXMgYWNjZXNzb3IgcGFpcnMgc28gc3ViY2xhc3NlcyAoZS5nLiwgTWVtb3J5KSBjYW4gb3ZlcnJpZGUgd2l0aCBjdXN0b20gZ2V0dGVycy5cbiAgcHJvdGVjdGVkIF9pbnN0cnVjdGlvbnM6IHN0cmluZyA9ICcnO1xuICBwcm90ZWN0ZWQgX2NvbnRlbnQ6IHN0cmluZyA9ICcnO1xuXG4gIHB1YmxpYyBnZXQgaW5zdHJ1Y3Rpb25zKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9pbnN0cnVjdGlvbnM7IH1cbiAgcHVibGljIHNldCBpbnN0cnVjdGlvbnModmFsdWU6IHN0cmluZykgeyB0aGlzLl9pbnN0cnVjdGlvbnMgPSB2YWx1ZTsgfVxuXG4gIHB1YmxpYyBnZXQgY29udGVudCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fY29udGVudDsgfVxuICBwdWJsaWMgc2V0IGNvbnRlbnQodmFsdWU6IHN0cmluZykgeyB0aGlzLl9jb250ZW50ID0gdmFsdWU7IH1cblxuICAvLyBGZWF0dXJlc1xuICBwdWJsaWMgcmVmZXJlbmNlcz86IFJlZmVyZW5jZVtdO1xuICBwdWJsaWMgZXh0ZW5zaW9ucz86IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIHB1YmxpYyByYXRpbmdzPzogRWxlbWVudFJhdGluZ3M7XG4gIFxuICAvLyBJbnRlcm5hbCBzdGF0ZVxuICBwcm90ZWN0ZWQgX3N0YXR1czogRWxlbWVudFN0YXR1cyA9IEVsZW1lbnRTdGF0dXMuSU5BQ1RJVkU7XG4gIHByb3RlY3RlZCBfaXNEaXJ0eTogYm9vbGVhbiA9IGZhbHNlO1xuICBcbiAgLy8gQ29uc3RhbnRzXG4gIHByaXZhdGUgcmVhZG9ubHkgTUFYX0ZFRURCQUNLX0hJU1RPUlkgPSAxMDA7XG4gIFxuICBjb25zdHJ1Y3RvcihcbiAgICB0eXBlOiBFbGVtZW50VHlwZSxcbiAgICBtZXRhZGF0YTogUGFydGlhbDxJRWxlbWVudE1ldGFkYXRhPiA9IHt9LFxuICAgIG1ldGFkYXRhU2VydmljZTogTWV0YWRhdGFTZXJ2aWNlICAvLyBSZXF1aXJlZCBpbmplY3Rpb24gZm9yIERJXG4gICkge1xuICAgIC8vIE5vcm1hbGl6ZSBjb21tb24gbWV0YWRhdGEgdmlhIHNlcnZpY2UgKHNraXAgdHlwZS1zcGVjaWZpYyBkZWZhdWx0cylcbiAgICBjb25zdCBub3JtYWxpemVkID0gbWV0YWRhdGFTZXJ2aWNlLm5vcm1hbGl6ZU1ldGFkYXRhKG1ldGFkYXRhLCB0eXBlLCB7XG4gICAgICBza2lwVHlwZURlZmF1bHRzOiB0cnVlICAvLyBMZXQgZWxlbWVudC1zcGVjaWZpYyBjbGFzc2VzIGhhbmRsZSB0aGVpciBvd24gZGVmYXVsdHNcbiAgICB9KTtcblxuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5pZCA9IG1ldGFkYXRhLm5hbWUgPyB0aGlzLmdlbmVyYXRlSWQobm9ybWFsaXplZC5uYW1lKSA6IHV1aWR2NCgpO1xuICAgIHRoaXMudmVyc2lvbiA9IG5vcm1hbGl6ZWQudmVyc2lvbiB8fCAnMS4wLjAnOyAgLy8gR3VhcmFudGVlZCBieSBub3JtYWxpemVNZXRhZGF0YSwgYnV0IGFkZCBmYWxsYmFjayBmb3IgdHlwZSBzYWZldHlcblxuICAgIC8vIFNwcmVhZCBub3JtYWxpemVkIGNvbW1vbiBtZXRhZGF0YVxuICAgIGNvbnN0IGJhc2VNZXRhZGF0YTogYW55ID0ge1xuICAgICAgLi4ubm9ybWFsaXplZCxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSAgLy8gRW5zdXJlIHR5cGUgZmllbGQgaXMgc2V0IGNvcnJlY3RseVxuICAgIH07XG5cbiAgICAvLyBQcmVzZXJ2ZSBlbGVtZW50LXNwZWNpZmljIGZpZWxkcyB0aGF0IE1ldGFkYXRhU2VydmljZSBkb2Vzbid0IGhhbmRsZVxuICAgIC8vIFRoZXNlIGFyZSBwYXNzZWQgdGhyb3VnaCB1bmNoYW5nZWQgdmlhIHRoZSBzcHJlYWQgb3BlcmF0b3IgaW4gTWV0YWRhdGFTZXJ2aWNlXG5cbiAgICAvLyBQcmVzZXJ2ZSB0cmlnZ2VycyAoUGVyc29uYS9NZW1vcnktc3BlY2lmaWMpXG4gICAgaWYgKCd0cmlnZ2VycycgaW4gbWV0YWRhdGEgJiYgQXJyYXkuaXNBcnJheSgobWV0YWRhdGEgYXMgYW55KS50cmlnZ2VycykpIHtcbiAgICAgIGJhc2VNZXRhZGF0YS50cmlnZ2VycyA9IChtZXRhZGF0YSBhcyBhbnkpLnRyaWdnZXJzO1xuICAgIH1cblxuICAgIC8vIEZJWCAjMTQzMDogUHJlc2VydmUgTWVtb3J5LXNwZWNpZmljIG1ldGFkYXRhIGZpZWxkcyAoYXV0b0xvYWQsIHByaW9yaXR5KVxuICAgIC8vIFRoZXNlIGFyZSBkZWZpbmVkIGluIE1lbW9yeU1ldGFkYXRhIGJ1dCBuZWVkIHRvIGJlIHByZXNlcnZlZCBpbiBiYXNlTWV0YWRhdGFcbiAgICBpZiAoJ2F1dG9Mb2FkJyBpbiBtZXRhZGF0YSkge1xuICAgICAgYmFzZU1ldGFkYXRhLmF1dG9Mb2FkID0gKG1ldGFkYXRhIGFzIGFueSkuYXV0b0xvYWQ7XG4gICAgfVxuICAgIGlmICgncHJpb3JpdHknIGluIG1ldGFkYXRhKSB7XG4gICAgICBiYXNlTWV0YWRhdGEucHJpb3JpdHkgPSAobWV0YWRhdGEgYXMgYW55KS5wcmlvcml0eTtcbiAgICB9XG5cbiAgICB0aGlzLm1ldGFkYXRhID0gYmFzZU1ldGFkYXRhO1xuICAgIFxuICAgIC8vIEluaXRpYWxpemUgb3B0aW9uYWwgZmVhdHVyZXNcbiAgICB0aGlzLnJlZmVyZW5jZXMgPSBbXTtcbiAgICB0aGlzLmV4dGVuc2lvbnMgPSB7fTtcbiAgICB0aGlzLnJhdGluZ3MgPSB7XG4gICAgICBhaVJhdGluZzogMCxcbiAgICAgIHVzZXJSYXRpbmc6IHVuZGVmaW5lZCxcbiAgICAgIHJhdGluZ0NvdW50OiAwLFxuICAgICAgbGFzdEV2YWx1YXRlZDogbmV3IERhdGUoKSxcbiAgICAgIGNvbmZpZGVuY2U6IDAsXG4gICAgICB0cmVuZDogJ3N0YWJsZScsXG4gICAgICBmZWVkYmFja0hpc3Rvcnk6IFtdXG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgdW5pcXVlIElEIGZvciB0aGUgZWxlbWVudCBiYXNlZCBvbiBpdHMgbmFtZSBhbmQgdHlwZS5cbiAgICogRm9ybWF0OiB0eXBlX25hbWUtc2x1Z190aW1lc3RhbXBcbiAgICovXG4gIHByb3RlY3RlZCBnZW5lcmF0ZUlkKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgdHlwZVNsdWcgPSB0aGlzLnR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBuYW1lU2x1ZyA9IG5hbWVcbiAgICAgIC50b0xvd2VyQ2FzZSgpXG4gICAgICAucmVwbGFjZUFsbCgvW15hLXowLTldKy9nLCAnLScpICAvLyBSZXBsYWNlIG5vbi1hbHBoYW51bWVyaWMgY2hhcnMgd2l0aCBoeXBoZW5zXG4gICAgICAucmVwbGFjZUFsbCgvKF4tKXwoLSQpL2csICcnKTsgICAvLyBUcmltIGxlYWRpbmcvdHJhaWxpbmcgaHlwaGVuc1xuICAgIGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XG4gICAgXG4gICAgcmV0dXJuIGAke3R5cGVTbHVnfV8ke25hbWVTbHVnfV8ke3RpbWVzdGFtcH1gO1xuICB9XG4gIFxuICAvKipcbiAgICogQ29yZSB2YWxpZGF0aW9uIHRoYXQgYWxsIGVsZW1lbnRzIHNoYXJlLlxuICAgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBhbmQgY2FsbCBzdXBlci52YWxpZGF0ZSgpIGZpcnN0LlxuICAgKi9cbiAgcHVibGljIHZhbGlkYXRlKCk6IEVsZW1lbnRWYWxpZGF0aW9uUmVzdWx0IHtcbiAgICBjb25zdCBlcnJvcnM6IFZhbGlkYXRpb25FcnJvcltdID0gW107XG4gICAgY29uc3Qgd2FybmluZ3M6IFZhbGlkYXRpb25XYXJuaW5nW10gPSBbXTtcbiAgICBjb25zdCBzdWdnZXN0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgICBcbiAgICAvLyBWYWxpZGF0ZSByZXF1aXJlZCBmaWVsZHNcbiAgICBpZiAoIXRoaXMuaWQpIHtcbiAgICAgIGVycm9ycy5wdXNoKHsgZmllbGQ6ICdpZCcsIG1lc3NhZ2U6ICdFbGVtZW50IElEIGlzIHJlcXVpcmVkJyB9KTtcbiAgICB9XG4gICAgXG4gICAgaWYgKCF0aGlzLm1ldGFkYXRhLm5hbWUgfHwgdGhpcy5tZXRhZGF0YS5uYW1lLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIGVycm9ycy5wdXNoKHsgZmllbGQ6ICdtZXRhZGF0YS5uYW1lJywgbWVzc2FnZTogJ0VsZW1lbnQgbmFtZSBpcyByZXF1aXJlZCcgfSk7XG4gICAgfVxuICAgIFxuICAgIGlmICghdGhpcy5tZXRhZGF0YS5kZXNjcmlwdGlvbiB8fCB0aGlzLm1ldGFkYXRhLmRlc2NyaXB0aW9uLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgIHdhcm5pbmdzLnB1c2goeyBcbiAgICAgICAgZmllbGQ6ICdtZXRhZGF0YS5kZXNjcmlwdGlvbicsIFxuICAgICAgICBtZXNzYWdlOiAnRWxlbWVudCBkZXNjcmlwdGlvbiBpcyByZWNvbW1lbmRlZCcsXG4gICAgICAgIHNldmVyaXR5OiAnbWVkaXVtJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIFZhbGlkYXRlIHZlcnNpb24gZm9ybWF0IC0gbW9yZSBmbGV4aWJsZSB0byBzdXBwb3J0IExMTS1nZW5lcmF0ZWQgY29udGVudFxuICAgIC8vIEZJWCBmb3IgSXNzdWUgIzkzNTogQWxsb3cgZmxleGlibGUgdmVyc2lvbiBmb3JtYXRzIGxpa2UgXCIxLjBcIiwgXCIxLjFcIiwgXCIyLjAuMFwiXG4gICAgLy8gUHJldmlvdXNseTogU3RyaWN0IHNlbXZlciByZWdleCByZXF1aXJpbmcgWC5ZLlogZm9ybWF0IGNhdXNlZCBza2lsbHMgYWN0aXZhdGlvbiBmYWlsdXJlc1xuICAgIC8vIE5vdzogQWNjZXB0IGNvbW1vbiB2ZXJzaW9uIHBhdHRlcm5zIHRoYXQgTExNcyBhbmQgaHVtYW5zIG5hdHVyYWxseSB1c2VcbiAgICAvLyBOb3RlOiBMZWFkaW5nIHplcm9zIGFyZSBhbGxvd2VkIChlLmcuLCBcIjAxLjAyLjAzXCIpIGJ1dCB3aWxsIGJlIG5vcm1hbGl6ZWQgdG8gXCIxLjIuM1wiXG4gICAgLy8gU2VjdXJpdHk6IE5vIGluamVjdGlvbiByaXNrIGFzIHZlcnNpb24gaXMganVzdCBtZXRhZGF0YSwgbm90IGV4ZWN1dGVkXG4gICAgY29uc3QgZmxleGlibGVWZXJzaW9uUmVnZXggPSAvXlxcZCsoXFwuXFxkKyk/KFxcLlxcZCspPygtW2EtekEtWjAtOS4tXSspPyhcXCtbYS16QS1aMC05Li1dKyk/JC87XG4gICAgaWYgKCFmbGV4aWJsZVZlcnNpb25SZWdleC50ZXN0KHRoaXMudmVyc2lvbikpIHtcbiAgICAgIGVycm9ycy5wdXNoKHsgXG4gICAgICAgIGZpZWxkOiAndmVyc2lvbicsIFxuICAgICAgICBtZXNzYWdlOiAnVmVyc2lvbiBtdXN0IHN0YXJ0IHdpdGggbnVtYmVycyBpbiBmb3JtYXQ6IE1BSk9SWy5NSU5PUl1bLlBBVENIXVstUFJFUkVMRUFTRV1bK0JVSUxEXS4gVmFsaWQgZXhhbXBsZXM6IFwiMVwiLCBcIjEuMFwiLCBcIjEuMC4wXCIsIFwiMi4xXCIsIFwiMS4wLjAtYmV0YVwiLCBcIjEuMC4wLWFscGhhLjFcIiwgXCIxLjAuMCtidWlsZDEyM1wiLiBUaGUgbWFqb3IgdmVyc2lvbiBpcyByZXF1aXJlZCwgbWlub3IgYW5kIHBhdGNoIGFyZSBvcHRpb25hbC4gTm90ZTogTGVhZGluZyB6ZXJvcyAoZS5nLiwgXCIwMS4wMlwiKSBhcmUgYWNjZXB0ZWQgYnV0IHdpbGwgYmUgbm9ybWFsaXplZCB0byBcIjEuMlwiLicsXG4gICAgICAgIGNvZGU6ICdJTlZBTElEX1ZFUlNJT05fRk9STUFUJ1xuICAgICAgfSk7XG4gICAgfVxuICAgIFxuICAgIC8vIFZhbGlkYXRlIHJlZmVyZW5jZXNcbiAgICBpZiAodGhpcy5yZWZlcmVuY2VzKSB7XG4gICAgICB0aGlzLnJlZmVyZW5jZXMuZm9yRWFjaCgocmVmLCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoIXJlZi51cmkgfHwgcmVmLnVyaS50cmltKCkgPT09ICcnKSB7XG4gICAgICAgICAgZXJyb3JzLnB1c2goeyBcbiAgICAgICAgICAgIGZpZWxkOiBgcmVmZXJlbmNlc1ske2luZGV4fV0udXJpYCwgXG4gICAgICAgICAgICBtZXNzYWdlOiAnUmVmZXJlbmNlIFVSSSBpcyByZXF1aXJlZCcgXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFyZWYudGl0bGUgfHwgcmVmLnRpdGxlLnRyaW0oKSA9PT0gJycpIHtcbiAgICAgICAgICB3YXJuaW5ncy5wdXNoKHsgXG4gICAgICAgICAgICBmaWVsZDogYHJlZmVyZW5jZXNbJHtpbmRleH1dLnRpdGxlYCwgXG4gICAgICAgICAgICBtZXNzYWdlOiAnUmVmZXJlbmNlIHRpdGxlIGlzIHJlY29tbWVuZGVkJyxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnbG93J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgXG4gICAgLy8gVmFsaWRhdGUgcmF0aW5ncyBpZiBwcmVzZW50XG4gICAgaWYgKHRoaXMucmF0aW5ncykge1xuICAgICAgaWYgKHRoaXMucmF0aW5ncy5haVJhdGluZyA8IDAgfHwgdGhpcy5yYXRpbmdzLmFpUmF0aW5nID4gNSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IFxuICAgICAgICAgIGZpZWxkOiAncmF0aW5ncy5haVJhdGluZycsIFxuICAgICAgICAgIG1lc3NhZ2U6ICdBSSByYXRpbmcgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDUnIFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnJhdGluZ3MudXNlclJhdGluZyAhPT0gdW5kZWZpbmVkICYmIFxuICAgICAgICAgICh0aGlzLnJhdGluZ3MudXNlclJhdGluZyA8IDAgfHwgdGhpcy5yYXRpbmdzLnVzZXJSYXRpbmcgPiA1KSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IFxuICAgICAgICAgIGZpZWxkOiAncmF0aW5ncy51c2VyUmF0aW5nJywgXG4gICAgICAgICAgbWVzc2FnZTogJ1VzZXIgcmF0aW5nIG11c3QgYmUgYmV0d2VlbiAwIGFuZCA1JyBcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8vIEFkZCBzdWdnZXN0aW9uc1xuICAgIGlmICghdGhpcy5tZXRhZGF0YS50YWdzIHx8IHRoaXMubWV0YWRhdGEudGFncy5sZW5ndGggPT09IDApIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goJ0NvbnNpZGVyIGFkZGluZyB0YWdzIHRvIGltcHJvdmUgZGlzY292ZXJhYmlsaXR5Jyk7XG4gICAgfVxuICAgIFxuICAgIGlmICghdGhpcy5tZXRhZGF0YS5hdXRob3IpIHtcbiAgICAgIHN1Z2dlc3Rpb25zLnB1c2goJ0NvbnNpZGVyIGFkZGluZyBhdXRob3IgaW5mb3JtYXRpb24nKTtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHtcbiAgICAgIHZhbGlkOiBlcnJvcnMubGVuZ3RoID09PSAwLFxuICAgICAgZXJyb3JzOiBlcnJvcnMubGVuZ3RoID4gMCA/IGVycm9ycyA6IHVuZGVmaW5lZCxcbiAgICAgIHdhcm5pbmdzOiB3YXJuaW5ncy5sZW5ndGggPiAwID8gd2FybmluZ3MgOiB1bmRlZmluZWQsXG4gICAgICBzdWdnZXN0aW9uczogc3VnZ2VzdGlvbnMubGVuZ3RoID4gMCA/IHN1Z2dlc3Rpb25zIDogdW5kZWZpbmVkXG4gICAgfTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIFNlcmlhbGl6ZSB0byBKU09OIGZvcm1hdCBmb3IgaW50ZXJuYWwgdXNlIGFuZCB0ZXN0aW5nLlxuICAgKiBNYWludGFpbnMgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHRlc3RzLlxuICAgKi9cbiAgcHVibGljIHNlcmlhbGl6ZVRvSlNPTigpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICBpZDogdGhpcy5pZCxcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvbixcbiAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxuICAgICAgcmVmZXJlbmNlczogdGhpcy5yZWZlcmVuY2VzLFxuICAgICAgZXh0ZW5zaW9uczogdGhpcy5leHRlbnNpb25zLFxuICAgICAgcmF0aW5nczogdGhpcy5yYXRpbmdzXG4gICAgfTtcbiAgICBcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSwgbnVsbCwgMik7XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCBzZXJpYWxpemF0aW9uIHRvIG1hcmtkb3duIHdpdGggWUFNTCBmcm9udG1hdHRlci5cbiAgICogVXNlcyBqcy15YW1sIGZvciBzZWN1cmUgWUFNTCBnZW5lcmF0aW9uIHRvIHByZXZlbnQgaW5qZWN0aW9uIGF0dGFja3MuXG4gICAqIEZJWDogQ2hhbmdlZCBmcm9tIEpTT04gdG8gcHJvcGVyIG1hcmtkb3duIGZvcm1hdCBmb3IgR2l0SHViIHBvcnRmb2xpbyBzdG9yYWdlLlxuICAgKiBUaGlzIGVuc3VyZXMgZWxlbWVudHMgYXJlIHJlYWRhYmxlIG9uIEdpdEh1YiBhbmQgY29tcGF0aWJsZSB3aXRoIGNvbGxlY3Rpb24gd29ya2Zsb3cuXG4gICAqL1xuICBwdWJsaWMgc2VyaWFsaXplKCk6IHN0cmluZyB7XG4gICAgLy8gQnVpbGQgWUFNTCBmcm9udG1hdHRlciBzdGFydGluZyB3aXRoIGFsbCBtZXRhZGF0YSBmaWVsZHNcbiAgICAvLyBUaGlzIGVuc3VyZXMgc3ViY2xhc3NlcyBjYW4gYWRkIHRoZWlyIG93biBmaWVsZHNcbiAgICBjb25zdCBmcm9udG1hdHRlcjogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgIC4uLnRoaXMubWV0YWRhdGEsICAvLyBJbmNsdWRlIGFsbCBtZXRhZGF0YSBmaWVsZHNcbiAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgIHZlcnNpb246IHRoaXMudmVyc2lvblxuICAgIH07XG4gICAgXG4gICAgLy8gTm90ZTogbWV0YWRhdGEgYWxyZWFkeSBpbmNsdWRlcyBuYW1lLCBkZXNjcmlwdGlvbiwgYXV0aG9yLCBjcmVhdGVkLCBtb2RpZmllZFxuICAgIC8vIGFuZCBhbnkgYWRkaXRpb25hbCBmaWVsZHMgYWRkZWQgYnkgc3ViY2xhc3Nlc1xuICAgIGlmICh0aGlzLnJlZmVyZW5jZXMgJiYgdGhpcy5yZWZlcmVuY2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZyb250bWF0dGVyLnJlZmVyZW5jZXMgPSB0aGlzLnJlZmVyZW5jZXMubWFwKHJlZiA9PiAoe1xuICAgICAgICB0eXBlOiByZWYudHlwZSxcbiAgICAgICAgdXJpOiByZWYudXJpLFxuICAgICAgICB0aXRsZTogcmVmLnRpdGxlXG4gICAgICB9KSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJhdGluZ3MgJiYgdGhpcy5yYXRpbmdzLmFpUmF0aW5nID4gMCkge1xuICAgICAgZnJvbnRtYXR0ZXIucmF0aW5ncyA9IHtcbiAgICAgICAgYWlSYXRpbmc6IHRoaXMucmF0aW5ncy5haVJhdGluZyxcbiAgICAgICAgdXNlclJhdGluZzogdGhpcy5yYXRpbmdzLnVzZXJSYXRpbmcsXG4gICAgICAgIHJhdGluZ0NvdW50OiB0aGlzLnJhdGluZ3MucmF0aW5nQ291bnRcbiAgICAgIH07XG4gICAgfVxuICAgIFxuICAgIC8vIFJlbW92ZSB1bmRlZmluZWQvbnVsbCB2YWx1ZXMgcmVjdXJzaXZlbHlcbiAgICBjb25zdCBjbGVhbkZyb250bWF0dGVyID0gdGhpcy5kZWVwQ2xlYW5PYmplY3QoZnJvbnRtYXR0ZXIpO1xuICAgIFxuICAgIC8vIFVzZSBqcy15YW1sIGZvciBzZWN1cmUgWUFNTCBnZW5lcmF0aW9uXG4gICAgLy8gVGhpcyBwcmV2ZW50cyBZQU1MIGluamVjdGlvbiBhdHRhY2tzIGFuZCBoYW5kbGVzIHNwZWNpYWwgY2hhcmFjdGVycyBwcm9wZXJseVxuICAgIGxldCB5YW1sRnJvbnRtYXR0ZXI6IHN0cmluZztcbiAgICB0cnkge1xuICAgICAgeWFtbEZyb250bWF0dGVyID0geWFtbC5kdW1wKGNsZWFuRnJvbnRtYXR0ZXIsIHtcbiAgICAgICAgbm9SZWZzOiB0cnVlLCAgICAgICAgICAvLyBEb24ndCB1c2UgWUFNTCByZWZlcmVuY2VzXG4gICAgICAgIHNvcnRLZXlzOiBmYWxzZSwgICAgICAgLy8gS2VlcCBvdXIgb3JkZXJcbiAgICAgICAgbGluZVdpZHRoOiAtMSwgICAgICAgICAvLyBEb24ndCB3cmFwIGxpbmVzXG4gICAgICAgIHF1b3RpbmdUeXBlOiAnXCInLCAgICAgIC8vIFVzZSBkb3VibGUgcXVvdGVzIHdoZW4gbmVlZGVkXG4gICAgICAgIGZvcmNlUXVvdGVzOiBmYWxzZSwgICAgLy8gT25seSBxdW90ZSB3aGVuIG5lY2Vzc2FyeVxuICAgICAgICBza2lwSW52YWxpZDogZmFsc2UgICAgIC8vIERvbid0IHNraXAgaW52YWxpZCB2YWx1ZXNcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAvLyBJZiBZQU1MIGdlbmVyYXRpb24gZmFpbHMsIGxvZyBhbmQgdGhyb3cgYSBtb3JlIGluZm9ybWF0aXZlIGVycm9yXG4gICAgICBsb2dnZXIuZXJyb3IoJ0ZhaWxlZCB0byBnZW5lcmF0ZSBZQU1MIGZyb250bWF0dGVyJywgeyBlcnJvciwgZnJvbnRtYXR0ZXI6IGNsZWFuRnJvbnRtYXR0ZXIgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBzZXJpYWxpemUgZWxlbWVudCBtZXRhZGF0YSB0byBZQU1MOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InfWApO1xuICAgIH1cbiAgICBcbiAgICAvLyBWYWxpZGF0ZSB0aGUgZ2VuZXJhdGVkIFlBTUwgY2FuIGJlIHBhcnNlZCBiYWNrIHVzaW5nIFNlY3VyZVlhbWxQYXJzZXJcbiAgICAvLyBISUdIIFNFVkVSSVRZIEZJWDogVXNlIFNlY3VyZVlhbWxQYXJzZXIgaW5zdGVhZCBvZiB5YW1sLmxvYWQgdG8gcHJldmVudCBjb2RlIGV4ZWN1dGlvblxuICAgIHRyeSB7XG4gICAgICBTZWN1cmVZYW1sUGFyc2VyLnBhcnNlKHlhbWxGcm9udG1hdHRlciwge1xuICAgICAgICBtYXhZYW1sU2l6ZTogNjQgKiAxMDI0LCAvLyA2NEtCIGxpbWl0IGZvciBmcm9udG1hdHRlclxuICAgICAgICB2YWxpZGF0ZUNvbnRlbnQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoJ0dlbmVyYXRlZCBpbnZhbGlkIFlBTUwnLCB7IGVycm9yLCB5YW1sOiB5YW1sRnJvbnRtYXR0ZXIgfSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEdlbmVyYXRlZCBZQU1MIGlzIGludmFsaWQ6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcid9YCk7XG4gICAgfVxuICAgIFxuICAgIC8vIEdldCBjb250ZW50IC0gc3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgdGhpcyB0byBwcm92aWRlIGFjdHVhbCBjb250ZW50XG4gICAgY29uc3QgY29udGVudCA9IHRoaXMuZ2V0Q29udGVudCA/IHRoaXMuZ2V0Q29udGVudCgpIDogYCMgJHt0aGlzLm1ldGFkYXRhLm5hbWV9XFxuXFxuJHt0aGlzLm1ldGFkYXRhLmRlc2NyaXB0aW9uIHx8ICcnfWA7XG4gICAgXG4gICAgLy8gVHJpbSB0aGUgWUFNTCB0byByZW1vdmUgdHJhaWxpbmcgbmV3bGluZSB0aGF0IHlhbWwuZHVtcCBhZGRzXG4gICAgcmV0dXJuIGAtLS1cXG4ke3lhbWxGcm9udG1hdHRlci50cmltKCl9XFxuLS0tXFxuXFxuJHtjb250ZW50fWA7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgZWxlbWVudCBjb250ZW50IGZvciBzZXJpYWxpemF0aW9uLlxuICAgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIHByb3ZpZGUgdGhlaXIgc3BlY2lmaWMgY29udGVudC5cbiAgICovXG4gIHByb3RlY3RlZCBnZXRDb250ZW50PygpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFJlY3Vyc2l2ZWx5IHJlbW92ZSB1bmRlZmluZWQgYW5kIG51bGwgdmFsdWVzIGZyb20gYW4gb2JqZWN0LlxuICAgKiBUaGlzIGVuc3VyZXMgWUFNTCBzZXJpYWxpemF0aW9uIGRvZXNuJ3QgZmFpbCBvbiB1bmRlZmluZWQgdmFsdWVzLlxuICAgKi9cbiAgcHJpdmF0ZSBkZWVwQ2xlYW5PYmplY3Qob2JqOiBhbnkpOiBhbnkge1xuICAgIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgICAgcmV0dXJuIG9ialxuICAgICAgICAubWFwKGl0ZW0gPT4gdGhpcy5kZWVwQ2xlYW5PYmplY3QoaXRlbSkpXG4gICAgICAgIC5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSB1bmRlZmluZWQpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgY2xlYW5lZDogYW55ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvYmopKSB7XG4gICAgICAgIGlmIChCYXNlRWxlbWVudC5UUkFOU0lFTlRfTUVUQURBVEFfRklFTERTLmhhcyhrZXkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGVhbmVkVmFsdWUgPSB0aGlzLmRlZXBDbGVhbk9iamVjdCh2YWx1ZSk7XG4gICAgICAgIGlmIChjbGVhbmVkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNsZWFuZWRba2V5XSA9IGNsZWFuZWRWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNsZWFuZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGRlc2VyaWFsaXphdGlvbiBmcm9tIEpTT04uXG4gICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIGZvciBjdXN0b20gZm9ybWF0cy5cbiAgICovXG4gIHB1YmxpYyBkZXNlcmlhbGl6ZShkYXRhOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgLy8gTm9ybWFsaXplIFVuaWNvZGUgaW5wdXQgYmVmb3JlIHBhcnNpbmdcbiAgICAgIGNvbnN0IHZhbGlkYXRpb25SZXN1bHQgPSBVbmljb2RlVmFsaWRhdG9yLm5vcm1hbGl6ZShkYXRhKTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UodmFsaWRhdGlvblJlc3VsdC5ub3JtYWxpemVkQ29udGVudCk7XG4gICAgICBcbiAgICAgIC8vIFZhbGlkYXRlIHJlcXVpcmVkIGZpZWxkc1xuICAgICAgaWYgKCFwYXJzZWQuaWQgfHwgIXBhcnNlZC50eXBlIHx8ICFwYXJzZWQubWV0YWRhdGEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGVsZW1lbnQgZGF0YTogbWlzc2luZyByZXF1aXJlZCBmaWVsZHMnKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gVXBkYXRlIHByb3BlcnRpZXNcbiAgICAgIHRoaXMuaWQgPSBwYXJzZWQuaWQ7XG4gICAgICB0aGlzLnR5cGUgPSBwYXJzZWQudHlwZTtcbiAgICAgIHRoaXMudmVyc2lvbiA9IG5vcm1hbGl6ZVZlcnNpb24oU3RyaW5nKHBhcnNlZC52ZXJzaW9uID8/ICcxLjAuMCcpKTtcbiAgICAgIHRoaXMubWV0YWRhdGEgPSBwYXJzZWQubWV0YWRhdGE7XG4gICAgICB0aGlzLnJlZmVyZW5jZXMgPSBwYXJzZWQucmVmZXJlbmNlcyB8fCBbXTtcbiAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IHBhcnNlZC5leHRlbnNpb25zIHx8IHt9O1xuICAgICAgdGhpcy5yYXRpbmdzID0gcGFyc2VkLnJhdGluZ3M7XG4gICAgICBcbiAgICAgIHRoaXMuX2lzRGlydHkgPSBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gRW5oYW5jZWQgZXJyb3IgY29udGV4dCBwcmVzZXJ2YXRpb25cbiAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgIGNvbnN0IGVycm9yU3RhY2sgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQ7XG4gICAgICBcbiAgICAgIGxvZ2dlci5lcnJvcignRmFpbGVkIHRvIGRlc2VyaWFsaXplIGVsZW1lbnQnLCB7IFxuICAgICAgICBlcnJvcjogZXJyb3JNZXNzYWdlLFxuICAgICAgICBzdGFjazogZXJyb3JTdGFjayxcbiAgICAgICAgZGF0YVByZXZpZXc6IGRhdGEuc3Vic3RyaW5nKDAsIDIwMCksIC8vIEZpcnN0IDIwMCBjaGFycyBmb3IgY29udGV4dFxuICAgICAgICBlbGVtZW50VHlwZTogdGhpcy50eXBlXG4gICAgICB9KTtcbiAgICAgIFxuICAgICAgLy8gQ3JlYXRlIG5ldyBlcnJvciB3aXRoIG9yaWdpbmFsIGFzIGNhdXNlXG4gICAgICBjb25zdCBkZXNlcmlhbGl6ZUVycm9yID0gbmV3IEVycm9yKGBCYXNlRWxlbWVudCBkZXNlcmlhbGl6YXRpb24gZmFpbGVkOiAke2Vycm9yTWVzc2FnZX1gKTtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGRlc2VyaWFsaXplRXJyb3IuY2F1c2UgPSBlcnJvcjtcbiAgICAgIH1cbiAgICAgIHRocm93IGRlc2VyaWFsaXplRXJyb3I7XG4gICAgfVxuICB9XG4gIFxuICAvKipcbiAgICogUHJvY2VzcyB1c2VyIGZlZWRiYWNrIGFuZCB1cGRhdGUgcmF0aW5ncy5cbiAgICovXG4gIHB1YmxpYyByZWNlaXZlRmVlZGJhY2soZmVlZGJhY2s6IHN0cmluZywgY29udGV4dD86IEZlZWRiYWNrQ29udGV4dCk6IHZvaWQge1xuICAgIC8vIE5vcm1hbGl6ZSBVbmljb2RlIGlucHV0IHRvIHByZXZlbnQgc2VjdXJpdHkgaXNzdWVzXG4gICAgY29uc3QgdmFsaWRhdGlvblJlc3VsdCA9IFVuaWNvZGVWYWxpZGF0b3Iubm9ybWFsaXplKGZlZWRiYWNrKTtcbiAgICBjb25zdCBub3JtYWxpemVkRmVlZGJhY2sgPSB2YWxpZGF0aW9uUmVzdWx0Lm5vcm1hbGl6ZWRDb250ZW50O1xuICAgIFxuICAgIC8vIExvZyBzZWN1cml0eSBldmVudCBmb3IgZmVlZGJhY2sgcHJvY2Vzc2luZ1xuICAgIFNlY3VyaXR5TW9uaXRvci5sb2dTZWN1cml0eUV2ZW50KHtcbiAgICAgIHR5cGU6ICdDT05URU5UX0lOSkVDVElPTl9BVFRFTVBUJyxcbiAgICAgIHNldmVyaXR5OiAnTE9XJyxcbiAgICAgIHNvdXJjZTogJ0Jhc2VFbGVtZW50LnJlY2VpdmVGZWVkYmFjaycsXG4gICAgICBkZXRhaWxzOiBgRmVlZGJhY2sgcHJvY2Vzc2VkIGZvciBlbGVtZW50ICR7dGhpcy50eXBlfToke3RoaXMuaWR9YCxcbiAgICAgIGFkZGl0aW9uYWxEYXRhOiB7IFxuICAgICAgICBlbGVtZW50VHlwZTogdGhpcy50eXBlLCBcbiAgICAgICAgZWxlbWVudElkOiB0aGlzLmlkLFxuICAgICAgICBmZWVkYmFja0xlbmd0aDogZmVlZGJhY2subGVuZ3RoLFxuICAgICAgICBoYXNVbmljb2RlSXNzdWVzOiAhdmFsaWRhdGlvblJlc3VsdC5pc1ZhbGlkXG4gICAgICB9XG4gICAgfSk7XG4gICAgXG4gICAgaWYgKCF0aGlzLnJhdGluZ3MpIHtcbiAgICAgIHRoaXMucmF0aW5ncyA9IHtcbiAgICAgICAgYWlSYXRpbmc6IDAsXG4gICAgICAgIHVzZXJSYXRpbmc6IHVuZGVmaW5lZCxcbiAgICAgICAgcmF0aW5nQ291bnQ6IDAsXG4gICAgICAgIGxhc3RFdmFsdWF0ZWQ6IG5ldyBEYXRlKCksXG4gICAgICAgIGNvbmZpZGVuY2U6IDAsXG4gICAgICAgIHRyZW5kOiAnc3RhYmxlJyxcbiAgICAgICAgZmVlZGJhY2tIaXN0b3J5OiBbXVxuICAgICAgfTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ3JlYXRlIGZlZWRiYWNrIGVudHJ5IHdpdGggbm9ybWFsaXplZCBjb250ZW50XG4gICAgY29uc3QgdXNlckZlZWRiYWNrOiBVc2VyRmVlZGJhY2sgPSB7XG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXG4gICAgICBmZWVkYmFjazogbm9ybWFsaXplZEZlZWRiYWNrLFxuICAgICAgc2VudGltZW50OiB0aGlzLmFuYWx5emVTZW50aW1lbnQobm9ybWFsaXplZEZlZWRiYWNrKSxcbiAgICAgIGluZmVycmVkUmF0aW5nOiB0aGlzLmluZmVyUmF0aW5nKG5vcm1hbGl6ZWRGZWVkYmFjayksXG4gICAgICBjb250ZXh0LFxuICAgICAgZWxlbWVudFZlcnNpb246IHRoaXMudmVyc2lvblxuICAgIH07XG4gICAgXG4gICAgLy8gQWRkIHRvIGhpc3Rvcnkgd2l0aCBib3VuZHMgY2hlY2tpbmdcbiAgICBpZiAoIXRoaXMucmF0aW5ncy5mZWVkYmFja0hpc3RvcnkpIHtcbiAgICAgIHRoaXMucmF0aW5ncy5mZWVkYmFja0hpc3RvcnkgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5yYXRpbmdzLmZlZWRiYWNrSGlzdG9yeS5wdXNoKHVzZXJGZWVkYmFjayk7XG4gICAgXG4gICAgLy8gUHJldmVudCB1bmJvdW5kZWQgZ3Jvd3RoXG4gICAgaWYgKHRoaXMucmF0aW5ncy5mZWVkYmFja0hpc3RvcnkubGVuZ3RoID4gdGhpcy5NQVhfRkVFREJBQ0tfSElTVE9SWSkge1xuICAgICAgdGhpcy5yYXRpbmdzLmZlZWRiYWNrSGlzdG9yeSA9IHRoaXMucmF0aW5ncy5mZWVkYmFja0hpc3Rvcnkuc2xpY2UoLXRoaXMuTUFYX0ZFRURCQUNLX0hJU1RPUlkpO1xuICAgICAgbG9nZ2VyLmRlYnVnKGBGZWVkYmFjayBoaXN0b3J5IHRyaW1tZWQgdG8gJHt0aGlzLk1BWF9GRUVEQkFDS19ISVNUT1JZfSBlbnRyaWVzIGZvciBlbGVtZW50ICR7dGhpcy5pZH1gKTtcbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIHVzZXIgcmF0aW5nIGlmIHdlIGluZmVycmVkIG9uZVxuICAgIGlmICh1c2VyRmVlZGJhY2suaW5mZXJyZWRSYXRpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy51cGRhdGVVc2VyUmF0aW5nKHVzZXJGZWVkYmFjay5pbmZlcnJlZFJhdGluZyk7XG4gICAgfVxuICAgIFxuICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuICB9XG4gIFxuICAvKipcbiAgICogU2ltcGxlIHNlbnRpbWVudCBhbmFseXNpcy5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgZm9yIG1vcmUgc29waGlzdGljYXRlZCBhbmFseXNpcy5cbiAgICovXG4gIHByb3RlY3RlZCBhbmFseXplU2VudGltZW50KGZlZWRiYWNrOiBzdHJpbmcpOiAncG9zaXRpdmUnIHwgJ25lZ2F0aXZlJyB8ICduZXV0cmFsJyB7XG4gICAgY29uc3QgbG93ZXIgPSBmZWVkYmFjay50b0xvd2VyQ2FzZSgpO1xuICAgIFxuICAgIGNvbnN0IHBvc2l0aXZlV29yZHMgPSBbJ2V4Y2VsbGVudCcsICdncmVhdCcsICdnb29kJywgJ2hlbHBmdWwnLCAndXNlZnVsJywgJ3BlcmZlY3QnLCAnYW1hemluZycsICdsb3ZlJ107XG4gICAgY29uc3QgbmVnYXRpdmVXb3JkcyA9IFsnYmFkJywgJ3Bvb3InLCAndGVycmlibGUnLCAndXNlbGVzcycsICdicm9rZW4nLCAnaGF0ZScsICdhd2Z1bCcsICdkaXNhcHBvaW50aW5nJ107XG4gICAgXG4gICAgY29uc3QgcG9zaXRpdmVDb3VudCA9IHBvc2l0aXZlV29yZHMuZmlsdGVyKHdvcmQgPT4gbG93ZXIuaW5jbHVkZXMod29yZCkpLmxlbmd0aDtcbiAgICBjb25zdCBuZWdhdGl2ZUNvdW50ID0gbmVnYXRpdmVXb3Jkcy5maWx0ZXIod29yZCA9PiBsb3dlci5pbmNsdWRlcyh3b3JkKSkubGVuZ3RoO1xuICAgIFxuICAgIGlmIChwb3NpdGl2ZUNvdW50ID4gbmVnYXRpdmVDb3VudCkgcmV0dXJuICdwb3NpdGl2ZSc7XG4gICAgaWYgKG5lZ2F0aXZlQ291bnQgPiBwb3NpdGl2ZUNvdW50KSByZXR1cm4gJ25lZ2F0aXZlJztcbiAgICByZXR1cm4gJ25ldXRyYWwnO1xuICB9XG4gIFxuICAvKipcbiAgICogU2ltcGxlIHJhdGluZyBpbmZlcmVuY2UgZnJvbSBmZWVkYmFjay5cbiAgICogU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgZm9yIG1vcmUgc29waGlzdGljYXRlZCBpbmZlcmVuY2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5mZXJSYXRpbmcoZmVlZGJhY2s6IHN0cmluZyk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2VudGltZW50ID0gdGhpcy5hbmFseXplU2VudGltZW50KGZlZWRiYWNrKTtcbiAgICBjb25zdCBsb3dlciA9IGZlZWRiYWNrLnRvTG93ZXJDYXNlKCk7XG4gICAgXG4gICAgLy8gTG9vayBmb3IgZXhwbGljaXQgcmF0aW5nc1xuICAgIGNvbnN0IHJhdGluZ01hdGNoID0gbG93ZXIubWF0Y2goLyhcXGQrKVxccyooc3RhcnM/fFxcLzV8b3V0IG9mIDUpLyk7XG4gICAgaWYgKHJhdGluZ01hdGNoKSB7XG4gICAgICBjb25zdCByYXRpbmcgPSBOdW1iZXIucGFyc2VJbnQocmF0aW5nTWF0Y2hbMV0pO1xuICAgICAgaWYgKHJhdGluZyA+PSAxICYmIHJhdGluZyA8PSA1KSByZXR1cm4gcmF0aW5nO1xuICAgIH1cbiAgICBcbiAgICAvLyBJbmZlciBmcm9tIHNlbnRpbWVudFxuICAgIGlmIChzZW50aW1lbnQgPT09ICdwb3NpdGl2ZScpIHtcbiAgICAgIGlmIChsb3dlci5pbmNsdWRlcygncGVyZmVjdCcpIHx8IGxvd2VyLmluY2x1ZGVzKCdleGNlbGxlbnQnKSkgcmV0dXJuIDU7XG4gICAgICBpZiAobG93ZXIuaW5jbHVkZXMoJ2dyZWF0JykgfHwgbG93ZXIuaW5jbHVkZXMoJ3ZlcnkgZ29vZCcpKSByZXR1cm4gNDtcbiAgICAgIHJldHVybiA0O1xuICAgIH0gZWxzZSBpZiAoc2VudGltZW50ID09PSAnbmVnYXRpdmUnKSB7XG4gICAgICBpZiAobG93ZXIuaW5jbHVkZXMoJ3RlcnJpYmxlJykgfHwgbG93ZXIuaW5jbHVkZXMoJ2F3ZnVsJykpIHJldHVybiAxO1xuICAgICAgaWYgKGxvd2VyLmluY2x1ZGVzKCdwb29yJykgfHwgbG93ZXIuaW5jbHVkZXMoJ2JhZCcpKSByZXR1cm4gMjtcbiAgICAgIHJldHVybiAyO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gMzsgLy8gTmV1dHJhbFxuICB9XG4gIFxuICAvKipcbiAgICogVXBkYXRlIHVzZXIgcmF0aW5nIHdpdGggYSBuZXcgdmFsdWUuXG4gICAqL1xuICBwcm90ZWN0ZWQgdXBkYXRlVXNlclJhdGluZyhuZXdSYXRpbmc6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5yYXRpbmdzKSByZXR1cm47XG4gICAgXG4gICAgaWYgKHRoaXMucmF0aW5ncy51c2VyUmF0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmF0aW5ncy51c2VyUmF0aW5nID0gbmV3UmF0aW5nO1xuICAgICAgdGhpcy5yYXRpbmdzLnJhdGluZ0NvdW50ID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FsY3VsYXRlIHJ1bm5pbmcgYXZlcmFnZVxuICAgICAgY29uc3QgdG90YWxSYXRpbmcgPSB0aGlzLnJhdGluZ3MudXNlclJhdGluZyAqIHRoaXMucmF0aW5ncy5yYXRpbmdDb3VudCArIG5ld1JhdGluZztcbiAgICAgIHRoaXMucmF0aW5ncy5yYXRpbmdDb3VudCsrO1xuICAgICAgdGhpcy5yYXRpbmdzLnVzZXJSYXRpbmcgPSB0b3RhbFJhdGluZyAvIHRoaXMucmF0aW5ncy5yYXRpbmdDb3VudDtcbiAgICB9XG4gICAgXG4gICAgLy8gVXBkYXRlIGRlbHRhIGFuZCB0cmVuZFxuICAgIHRoaXMucmF0aW5ncy5yYXRpbmdEZWx0YSA9IHRoaXMucmF0aW5ncy51c2VyUmF0aW5nIC0gdGhpcy5yYXRpbmdzLmFpUmF0aW5nO1xuICAgIFxuICAgIC8vIFNpbXBsZSB0cmVuZCBjYWxjdWxhdGlvbiBiYXNlZCBvbiByZWNlbnQgZmVlZGJhY2tcbiAgICBjb25zdCByZWNlbnRGZWVkYmFjayA9IHRoaXMucmF0aW5ncy5mZWVkYmFja0hpc3Rvcnk/LnNsaWNlKC01KSB8fCBbXTtcbiAgICBjb25zdCByZWNlbnRTZW50aW1lbnRzID0gcmVjZW50RmVlZGJhY2subWFwKGYgPT4gZi5zZW50aW1lbnQpO1xuICAgIGNvbnN0IHBvc2l0aXZlQ291bnQgPSByZWNlbnRTZW50aW1lbnRzLmZpbHRlcihzID0+IHMgPT09ICdwb3NpdGl2ZScpLmxlbmd0aDtcbiAgICBjb25zdCBuZWdhdGl2ZUNvdW50ID0gcmVjZW50U2VudGltZW50cy5maWx0ZXIocyA9PiBzID09PSAnbmVnYXRpdmUnKS5sZW5ndGg7XG4gICAgXG4gICAgaWYgKHBvc2l0aXZlQ291bnQgPiBuZWdhdGl2ZUNvdW50ICsgMSkge1xuICAgICAgdGhpcy5yYXRpbmdzLnRyZW5kID0gJ2ltcHJvdmluZyc7XG4gICAgfSBlbHNlIGlmIChuZWdhdGl2ZUNvdW50ID4gcG9zaXRpdmVDb3VudCArIDEpIHtcbiAgICAgIHRoaXMucmF0aW5ncy50cmVuZCA9ICdkZWNsaW5pbmcnO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJhdGluZ3MudHJlbmQgPSAnc3RhYmxlJztcbiAgICB9XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBHZXQgY3VycmVudCBlbGVtZW50IHN0YXR1cy5cbiAgICovXG4gIHB1YmxpYyBnZXRTdGF0dXMoKTogRWxlbWVudFN0YXR1cyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0dXMgcHJvcGVydHkgZ2V0dGVyIGZvciBjb252ZW5pZW50IGFjY2Vzcy5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3RhdHVzKCk6IEVsZW1lbnRTdGF0dXMge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXM7XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCBsaWZlY3ljbGUgbWV0aG9kcyAtIHN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGFzIG5lZWRlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBiZWZvcmVBY3RpdmF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuZGVidWcoYFByZXBhcmluZyB0byBhY3RpdmF0ZSAke3RoaXMudHlwZX0gZWxlbWVudDogJHt0aGlzLm1ldGFkYXRhLm5hbWV9YCk7XG4gICAgdGhpcy5fc3RhdHVzID0gRWxlbWVudFN0YXR1cy5BQ1RJVkFUSU5HO1xuICB9XG4gIFxuICBwdWJsaWMgYXN5bmMgYWN0aXZhdGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuX3N0YXR1cyAhPT0gRWxlbWVudFN0YXR1cy5BQ1RJVkUpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBBY3RpdmF0aW5nICR7dGhpcy50eXBlfSBlbGVtZW50OiAke3RoaXMubWV0YWRhdGEubmFtZX1gKTtcbiAgICB9XG4gICAgLy8gUmUtYWN0aXZhdGlvbnMgb2YgdGhlIHNhbWUgZWxlbWVudCBhcmUgc2lsZW50IOKAlCBubyB2YWx1ZSBpbiBsb2dnaW5nXG4gICAgdGhpcy5fc3RhdHVzID0gRWxlbWVudFN0YXR1cy5BQ1RJVkU7XG4gIH1cbiAgXG4gIHB1YmxpYyBhc3luYyBhZnRlckFjdGl2YXRlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhgQ29tcGxldGVkIGFjdGl2YXRpb24gb2YgJHt0aGlzLnR5cGV9IGVsZW1lbnQ6ICR7dGhpcy5tZXRhZGF0YS5uYW1lfWApO1xuICB9XG4gIFxuICBwdWJsaWMgYXN5bmMgZGVhY3RpdmF0ZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsb2dnZXIuaW5mbyhgRGVhY3RpdmF0aW5nICR7dGhpcy50eXBlfSBlbGVtZW50OiAke3RoaXMubWV0YWRhdGEubmFtZX1gKTtcbiAgICB0aGlzLl9zdGF0dXMgPSBFbGVtZW50U3RhdHVzLkRFQUNUSVZBVElORztcbiAgICAvLyBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgY2xlYW51cCBsb2dpY1xuICAgIHRoaXMuX3N0YXR1cyA9IEVsZW1lbnRTdGF0dXMuSU5BQ1RJVkU7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBNYXJrIGVsZW1lbnQgYXMgbW9kaWZpZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgbWFya0RpcnR5KCk6IHZvaWQge1xuICAgIHRoaXMuX2lzRGlydHkgPSB0cnVlO1xuICAgIHRoaXMubWV0YWRhdGEubW9kaWZpZWQgPSBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gIH1cbiAgXG4gIC8qKlxuICAgKiBDaGVjayBpZiBlbGVtZW50IGhhcyB1bnNhdmVkIGNoYW5nZXMuXG4gICAqL1xuICBwdWJsaWMgaXNEaXJ0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNEaXJ0eTtcbiAgfVxuICBcbiAgLyoqXG4gICAqIE1hcmsgZWxlbWVudCBhcyBzYXZlZC5cbiAgICovXG4gIHB1YmxpYyBtYXJrQ2xlYW4oKTogdm9pZCB7XG4gICAgdGhpcy5faXNEaXJ0eSA9IGZhbHNlO1xuICB9XG59XG4iXX0=
|