@workflow/core 5.0.0-beta.44 → 5.0.0-beta.46
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/dist/attribute-changes.d.ts +3 -5
- package/dist/attribute-changes.d.ts.map +1 -1
- package/dist/attribute-changes.js +2 -2
- package/dist/capabilities.d.ts +2 -2
- package/dist/capabilities.js +4 -4
- package/dist/events-consumer.d.ts +1 -1
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +3 -2
- package/dist/flushable-stream.js +2 -2
- package/dist/global.d.ts +3 -1
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +8 -5
- package/dist/private.d.ts +9 -7
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +11 -1
- package/dist/runtime/helpers.d.ts +3 -3
- package/dist/runtime/helpers.js +1 -1
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -1
- package/dist/runtime/quickjs-entrypoint.js +8 -1
- package/dist/runtime/quickjs-runtime.js +7 -1
- package/dist/runtime/resume-hook.d.ts +27 -12
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +182 -182
- package/dist/runtime/resume-latency.d.ts +16 -6
- package/dist/runtime/resume-latency.d.ts.map +1 -1
- package/dist/runtime/resume-latency.js +4 -2
- package/dist/runtime/run.d.ts +1 -1
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +3 -2
- package/dist/runtime/start.js +3 -3
- package/dist/runtime/step-latency.d.ts +31 -14
- package/dist/runtime/step-latency.d.ts.map +1 -1
- package/dist/runtime/step-latency.js +19 -13
- package/dist/runtime/suspension-handler.d.ts +9 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +41 -41
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +133 -66
- package/dist/serialization/hardened.d.ts +5 -4
- package/dist/serialization/hardened.d.ts.map +1 -1
- package/dist/serialization/hardened.js +7 -1
- package/dist/serialization-format.js +2 -2
- package/dist/serialization.d.ts +5 -6
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +19 -12
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +3 -11
- package/dist/telemetry/semantic-conventions.d.ts +14 -5
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +13 -4
- package/dist/version.d.ts +1 -1
- package/dist/version.js +2 -2
- package/dist/workflow/attribute-dispatcher.d.ts.map +1 -1
- package/dist/workflow/attribute-dispatcher.js +3 -6
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +6 -15
- package/dist/workflow.js +7 -8
- package/package.json +4 -4
|
@@ -67,14 +67,15 @@ export interface GuestCodeExecution {
|
|
|
67
67
|
detail?: string;
|
|
68
68
|
}
|
|
69
69
|
/**
|
|
70
|
-
* Mutable sink recording
|
|
71
|
-
*
|
|
72
|
-
* the
|
|
73
|
-
* that the VM state may have been perturbed by serialization.
|
|
70
|
+
* Mutable sink recording workflow-code execution serialization could not
|
|
71
|
+
* avoid. `executions` contains the first five samples and `totalExecutions`
|
|
72
|
+
* is the exact count.
|
|
74
73
|
*/
|
|
75
74
|
export interface GuestCodeStats {
|
|
76
75
|
executions: GuestCodeExecution[];
|
|
76
|
+
totalExecutions?: number;
|
|
77
77
|
}
|
|
78
|
+
export declare const GUEST_CODE_EXECUTION_SAMPLE_LIMIT = 5;
|
|
78
79
|
/**
|
|
79
80
|
* Runs `fn` (synchronously) with `stats` as the active guest-code sink.
|
|
80
81
|
* Nested calls stack correctly; a `null`/`undefined` sink disables
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hardened.d.ts","sourceRoot":"","sources":["../../src/serialization/hardened.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAKnD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;;;;;;;;;OAcG;IACH,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpC,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED
|
|
1
|
+
{"version":3,"file":"hardened.d.ts","sourceRoot":"","sources":["../../src/serialization/hardened.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAIH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAKnD;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;;;;;;;;;;;;OAcG;IACH,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;IACpC,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,eAAO,MAAM,iCAAiC,IAAI,CAAC;AAUnD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAClC,KAAK,EAAE,cAAc,GAAG,SAAS,EACjC,EAAE,EAAE,MAAM,CAAC,GACV,CAAC,CAWH;AAyBD,2DAA2D;AAC3D,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAG/D;AAED,+DAA+D;AAC/D,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO,CAEvD;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,EAChC,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,CAUN;AAwCD,yDAAyD;AACzD,eAAO,MAAM,WAAW,8BAAsC,CAAC;AAC/D,gCAAgC;AAChC,eAAO,MAAM,WAAW,8BAAsC,CAAC;AAC/D,oCAAoC;AACpC,eAAO,MAAM,eAAe,8BAA0C,CAAC;AACvE,wCAAwC;AACxC,eAAO,MAAM,YAAY,UAlBd,OAAO,WAkByD,CAAC;AAC5E,uCAAuC;AACvC,eAAO,MAAM,WAAW,UApBb,OAAO,WAoBuD,CAAC;AAC1E,sEAAsE;AACtE,eAAO,MAAM,qBAAqB,UAtBvB,OAAO,WAyBjB,CAAC;AAiGF;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAiCtE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,WAAW,GAAG,OAAO,CAsBrE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAWT;AASD,mCAAmC;AACnC,wBAAgB,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,MAAM,CAM1C;AAED,oEAAoE;AACpE,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAMtE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAMnE;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,GAC3B,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAEtB;AAED,gCAAgC;AAChC,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,OAAO,EAAE,CAE1D;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG;IAChD,MAAM,EAAE,eAAe,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB,CAaA;AAyFD,eAAO,MAAM,2BAA2B,EAAE,OAAO,CAAC,mBAAmB,CAgFpE,CAAC"}
|
|
@@ -45,6 +45,7 @@
|
|
|
45
45
|
import { types } from 'node:util';
|
|
46
46
|
import { globalSingleton } from '@workflow/utils';
|
|
47
47
|
import { defaultStringifyOperations } from 'devalue';
|
|
48
|
+
export const GUEST_CODE_EXECUTION_SAMPLE_LIMIT = 5;
|
|
48
49
|
// per-copy-ok: both are set and cleared by `withGuestCodeStats` around a single
|
|
49
50
|
// synchronous call, so the sink is only ever read by the same copy that armed
|
|
50
51
|
// it. A shared slot would let two copies recording concurrently clobber each
|
|
@@ -100,6 +101,11 @@ export function isUseStepClosureFn(fn) {
|
|
|
100
101
|
export function recordGuestCode(kind, detail) {
|
|
101
102
|
if (!activeStats)
|
|
102
103
|
return;
|
|
104
|
+
activeStats.totalExecutions =
|
|
105
|
+
(activeStats.totalExecutions ?? activeStats.executions.length) + 1;
|
|
106
|
+
if (activeStats.executions.length >= GUEST_CODE_EXECUTION_SAMPLE_LIMIT) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
103
109
|
const execution = { kind };
|
|
104
110
|
if (detail !== undefined)
|
|
105
111
|
execution.detail = detail;
|
|
@@ -529,4 +535,4 @@ export const hardenedStringifyOperations = {
|
|
|
529
535
|
},
|
|
530
536
|
get: (value, key) => readProperty(value, key),
|
|
531
537
|
};
|
|
532
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFyZGVuZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VyaWFsaXphdGlvbi9oYXJkZW5lZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJDRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWxELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQXNDckQsZ0ZBQWdGO0FBQ2hGLDhFQUE4RTtBQUM5RSw2RUFBNkU7QUFDN0UsZ0JBQWdCO0FBQ2hCLElBQUksV0FBVyxHQUEwQixJQUFJLENBQUM7QUFDOUMsOEVBQThFO0FBQzlFLElBQUksZUFBZSxHQUEyQixJQUFJLENBQUM7QUFFbkQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FDaEMsS0FBaUMsRUFDakMsRUFBVztJQUVYLE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQztJQUNsQyxNQUFNLGVBQWUsR0FBRyxlQUFlLENBQUM7SUFDeEMsV0FBVyxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUM7SUFDNUIsZUFBZSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQy9DLElBQUksQ0FBQztRQUNILE9BQU8sRUFBRSxFQUFFLENBQUM7SUFDZCxDQUFDO1lBQVMsQ0FBQztRQUNULFdBQVcsR0FBRyxhQUFhLENBQUM7UUFDNUIsZUFBZSxHQUFHLGVBQWUsQ0FBQztJQUNwQyxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxpRkFBaUY7QUFDakYsZ0ZBQWdGO0FBQ2hGLDhCQUE4QjtBQUM5QixNQUFNLGVBQWUsR0FBRyxlQUFlLENBQ3JDLHFDQUFxQyxFQUNyQyxDQUFDLEVBQ0QsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLE9BQU8sRUFBVSxFQUFFLENBQUMsQ0FDdkMsQ0FBQztBQUVGLDJEQUEyRDtBQUMzRCxNQUFNLFVBQVUsb0JBQW9CLENBQW1CLEVBQUs7SUFDMUQsZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDNUIsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDO0FBRUQsK0RBQStEO0FBQy9ELE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxFQUFXO0lBQzVDLE9BQU8sT0FBTyxFQUFFLEtBQUssVUFBVSxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQVksQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUM3QixJQUFnQyxFQUNoQyxNQUFlO0lBRWYsSUFBSSxDQUFDLFdBQVc7UUFBRSxPQUFPO0lBQ3pCLE1BQU0sU0FBUyxHQUF1QixFQUFFLElBQUksRUFBRSxDQUFDO0lBQy9DLElBQUksTUFBTSxLQUFLLFNBQVM7UUFBRSxTQUFTLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztJQUNwRCxXQUFXLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLFNBQVMsV0FBVyxDQUFDLEtBQWE7SUFDaEMsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLGVBQWU7UUFBRSxPQUFPO0lBQzdDLElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPO0lBQ3ZDLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRCxnRkFBZ0Y7QUFDaEYsRUFBRTtBQUNGLDBFQUEwRTtBQUMxRSw0RUFBNEU7QUFDNUUsNEVBQTRFO0FBQzVFLDZFQUE2RTtBQUM3RSxpRUFBaUU7QUFFakUsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQU10QyxDQUFDO0FBRW5DLFNBQVMsV0FBVyxDQUNsQixTQUFpQixFQUNqQixHQUFnQjtJQUVoQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQztJQUNwRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLDZCQUE2QixNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFDRCxPQUFPLFdBQVcsQ0FBQyxNQUFNLENBQTBCLENBQUM7QUFDdEQsQ0FBQztBQUVELHlFQUF5RTtBQUN6RSx3RUFBd0U7QUFFeEUseURBQXlEO0FBQ3pELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUMvRCxnQ0FBZ0M7QUFDaEMsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9ELG9DQUFvQztBQUNwQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDdkUsd0NBQXdDO0FBQ3hDLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxXQUFXLENBQVMsTUFBTSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM1RSx1Q0FBdUM7QUFDdkMsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBUyxNQUFNLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzFFLHNFQUFzRTtBQUN0RSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxXQUFXLENBQzlDLFdBQVcsQ0FBQyxTQUFTLEVBQ3JCLFlBQVksQ0FDYixDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDdEQsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDcEQsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDNUQsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDNUQsTUFBTSxjQUFjLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDOUQsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUMvQixNQUFNLENBQUMsU0FBUyxDQUFDLE9BQW9DLENBQ3RELENBQUM7QUFFRixNQUFNLG1CQUFtQixHQUFXLE1BQU0sQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ2hGLE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FDL0IsbUJBQW1CLEVBQ25CLE1BQU0sQ0FBQyxXQUFXLENBQ25CLENBQUM7QUFDRixNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FDbEMsbUJBQW1CLEVBQ25CLFFBQVEsQ0FDVCxDQUFDO0FBQ0YsTUFBTSxvQkFBb0IsR0FBRyxXQUFXLENBQ3RDLG1CQUFtQixFQUNuQixZQUFZLENBQ2IsQ0FBQztBQUNGLE1BQU0sb0JBQW9CLEdBQUcsV0FBVyxDQUN0QyxtQkFBbUIsRUFDbkIsWUFBWSxDQUNiLENBQUM7QUFDRixNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBUyxtQkFBbUIsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM1RSxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQ2hDLFFBQVEsQ0FBQyxTQUFTLEVBQ2xCLFFBQVEsQ0FDVCxDQUFDO0FBQ0YsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQ3BDLFFBQVEsQ0FBQyxTQUFTLEVBQ2xCLFlBQVksQ0FDYixDQUFDO0FBQ0YsTUFBTSxrQkFBa0IsR0FBRyxXQUFXLENBQ3BDLFFBQVEsQ0FBQyxTQUFTLEVBQ2xCLFlBQVksQ0FDYixDQUFDO0FBQ0YsTUFBTSwyQkFBMkIsR0FBRyxXQUFXLENBQzdDLGlCQUFpQixDQUFDLFNBQVMsRUFDM0IsWUFBWSxDQUNiLENBQUM7QUFFRixvRUFBb0U7QUFDcEUsa0VBQWtFO0FBQ2xFLHlFQUF5RTtBQUN6RSxvREFBb0Q7QUFDcEQsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDeEUsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFTLEdBQUcsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDakUsTUFBTSw2QkFBNkIsR0FBRyxXQUFXLENBQy9DLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUNuQyxDQUFDO0FBRUYsZ0ZBQWdGO0FBRWhGLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUM7QUFFMUIsTUFBTSxnQkFBZ0IsR0FBRyxXQUFXLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVsRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLE1BQWM7SUFDdEMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDbEMsdUVBQXVFO0lBQ3ZFLGtFQUFrRTtJQUNsRSx1RUFBdUU7SUFDdkUsc0VBQXNFO0lBQ3RFLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDO0lBQ3BFLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDeEUsT0FBTyxDQUNMLGdCQUFnQixDQUFDLE1BQXVCLENBQUMsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7UUFDdkUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxRQUFRLENBQUMsU0FBUyxDQUN0RCxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFjLEVBQUUsR0FBZ0I7SUFDM0QsSUFDRSxLQUFLLEtBQUssSUFBSTtRQUNkLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQyxFQUMxRCxDQUFDO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkIsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLE9BQVEsS0FBc0MsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsSUFBSSxPQUFPLEdBQWtCLEtBQUssQ0FBQztJQUNuQyxPQUFPLE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN4QixJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3JCLDhEQUE4RDtZQUM5RCxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckIsT0FBUSxLQUFzQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2pFLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixJQUFJLE9BQU8sSUFBSSxVQUFVO2dCQUFFLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQztZQUNuRCxJQUFJLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN0QyxlQUFlLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN6QyxDQUFDO2dCQUNELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDcEMsQ0FBQztZQUNELE9BQU8sU0FBUyxDQUFDLENBQUMsdUJBQXVCO1FBQzNDLENBQUM7UUFDRCxPQUFPLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBYyxFQUFFLEdBQWdCO0lBQzFELElBQ0UsS0FBSyxLQUFLLElBQUk7UUFDZCxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxVQUFVLENBQUMsRUFDMUQsQ0FBQztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUNELElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkIsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLE9BQU8sR0FBRyxJQUFLLEtBQWdCLENBQUM7SUFDbEMsQ0FBQztJQUVELElBQUksT0FBTyxHQUFrQixLQUFLLENBQUM7SUFDbkMsT0FBTyxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDeEIsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNyQixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDckIsT0FBTyxHQUFHLElBQUssS0FBZ0IsQ0FBQztRQUNsQyxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsd0JBQXdCLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQy9ELE9BQU8sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLEtBQWMsRUFDZCxTQUE2QjtJQUU3QixJQUFJLENBQUMsU0FBUztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzdCLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUQsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLElBQUksT0FBTyxHQUFrQixPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNELE9BQU8sT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksT0FBTyxLQUFLLFNBQVM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN2QyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUM7WUFBRSxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDM0MsT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixFQUFFO0FBQ0YsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSw2RUFBNkU7QUFDN0UsMkRBQTJEO0FBRTNELG1DQUFtQztBQUNuQyxNQUFNLFVBQVUsT0FBTyxDQUFDLEtBQVU7SUFDaEMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuQixXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFDRCxPQUFPLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5QixDQUFDO0FBRUQsb0VBQW9FO0FBQ3BFLE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxLQUFzQjtJQUM1RCxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ25CLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBQ0QsT0FBTyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQWM7SUFDN0MsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuQixXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBdUIsQ0FBQztJQUNqRCxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUF1QixDQUFDO0FBQzNELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FDMUIsS0FBNEI7SUFFNUIsT0FBTyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUVELGdDQUFnQztBQUNoQyxNQUFNLFVBQVUsV0FBVyxDQUFDLEtBQW1CO0lBQzdDLE9BQU8sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUFzQjtJQUs3QyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM1QixPQUFPO1lBQ0wsTUFBTSxFQUFFLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFDN0IsVUFBVSxFQUFFLGtCQUFrQixDQUFDLEtBQUssQ0FBQztZQUNyQyxVQUFVLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxDQUFDO1NBQ3RDLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTztRQUNMLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUM7UUFDL0IsVUFBVSxFQUFFLG9CQUFvQixDQUFDLEtBQUssQ0FBQztRQUN2QyxVQUFVLEVBQUUsb0JBQW9CLENBQUMsS0FBSyxDQUFDO0tBQ3hDLENBQUM7QUFDSixDQUFDO0FBRUQsaUZBQWlGO0FBQ2pGLEVBQUU7QUFDRiwyRUFBMkU7QUFDM0UsMEVBQTBFO0FBQzFFLHlFQUF5RTtBQUN6RSxvREFBb0Q7QUFFcEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDOUIsV0FBVztJQUNYLFlBQVk7SUFDWixtQkFBbUI7SUFDbkIsWUFBWTtJQUNaLGFBQWE7SUFDYixjQUFjO0lBQ2QsWUFBWTtJQUNaLGFBQWE7SUFDYixjQUFjO0lBQ2QsY0FBYztJQUNkLGVBQWU7SUFDZixnQkFBZ0I7Q0FDakIsQ0FBQyxDQUFDO0FBRUg7Ozs7Ozs7R0FPRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDakMsTUFBTTtJQUNOLFFBQVE7SUFDUixLQUFLO0lBQ0wsS0FBSztJQUNMLE9BQU87SUFDUCxVQUFVO0lBQ1YsYUFBYTtJQUNiLG1CQUFtQjtJQUNuQixRQUFRO0lBQ1IsUUFBUTtJQUNSLFNBQVM7SUFDVCxRQUFRO0lBQ1IsS0FBSztJQUNMLGlCQUFpQjtJQUNqQixHQUFHLGVBQWU7Q0FDbkIsQ0FBQyxDQUFDO0FBRUg7OztHQUdHO0FBQ0gsU0FBUyxPQUFPLENBQUMsS0FBYTtJQUM1QixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFDdkMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQzNDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNyQyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDckMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sT0FBTyxDQUFDO0lBQ3pDLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzlCLE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqQyxPQUFPLEdBQUcsS0FBSyxTQUFTLElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDekUsQ0FBQztJQUNELElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFVBQVUsQ0FBQztJQUMvQyxJQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxhQUFhLENBQUM7SUFDckQsSUFBSSxLQUFLLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxtQkFBbUIsQ0FBQztJQUNqRSxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDakQsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sUUFBUSxDQUFDO0lBQ2pELElBQUksS0FBSyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNuRCxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDakQsSUFBSSxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzlELElBQUkscUJBQXFCLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1FBQzVELE9BQU8saUJBQWlCLENBQUM7SUFDM0IsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsZUFBZSxDQUFDLEtBQWE7SUFDcEMsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDcEQsT0FBTyxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ25ELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBaUM7SUFDdkUsS0FBSyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUU7UUFDdkIsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuQixrRUFBa0U7WUFDbEUsNERBQTREO1lBQzVELHNDQUFzQztZQUN0QyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkIsT0FBTywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QixJQUFJLEtBQUssS0FBSyxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDdEMsMEVBQTBFO1FBQzFFLHFFQUFxRTtRQUNyRSxnREFBZ0Q7UUFDaEQsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLElBQUksR0FBRyxLQUFLLFNBQVMsSUFBSSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxRQUFRLENBQUM7UUFDdEUsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsVUFBVSxFQUFFLENBQUMsS0FBeUIsRUFBRSxFQUFFO1FBQ3hDLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUN4QyxPQUFPLE9BQU8sWUFBWSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxVQUFVLENBQUM7SUFDM0QsQ0FBQztJQUVELEtBQUssRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFO1FBQ3ZCLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RCxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0QsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9ELE9BQU8sYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxXQUFXLEVBQUUsQ0FBQyxJQUFVLEVBQUUsRUFBRSxDQUMxQixNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7SUFFOUQsYUFBYSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUU7UUFDL0IscUVBQXFFO1FBQ3JFLCtEQUErRDtRQUMvRCxvRUFBb0U7UUFDcEUsOENBQThDO1FBQzlDLElBQUkscUJBQXFCLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ2hELE9BQU8sT0FBTyxDQUFDLEtBQVksQ0FBQyxDQUFDO1FBQy9CLENBQUM7UUFDRCxJQUFJLHFCQUFxQixDQUFDLEtBQUssRUFBRSxlQUFlLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxPQUFPLHVCQUF1QixDQUFDLEtBQXdCLENBQUMsQ0FBQztRQUMzRCxDQUFDO1FBQ0QsZUFBZSxDQUNiLFFBQVEsRUFDUixhQUFhLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxTQUFTLEdBQUcsQ0FDcEQsQ0FBQztRQUNGLE9BQVEsS0FBZ0MsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUN0RCxDQUFDO0lBRUQsVUFBVSxFQUFFLENBQUMsTUFBYyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDO1FBQzVCLEtBQUssRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDO0tBQzNCLENBQUM7SUFFRixRQUFRLEVBQUUsQ0FBQyxHQUFpQixFQUFFLEVBQUUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDO0lBQ2pELFNBQVMsRUFBRSxDQUFDLEdBQTBCLEVBQUUsRUFBRSxDQUN4QyxZQUFZLENBQUMsR0FBRyxDQUF5QjtJQUUzQyxRQUFRLEVBQUUsQ0FBQyxJQUFxQixFQUFFLEVBQUU7UUFDbEMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLE9BQU87WUFDTCxHQUFHLElBQUk7WUFDUCxpRUFBaUU7WUFDakUsMENBQTBDO1lBQzFDLE1BQU0sRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQztZQUMzRCxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDdEQsQ0FBQyxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7Z0JBQzFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQ3ZDLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUU7UUFDekIsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDO1lBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sMEJBQTBCLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxHQUFHLEVBQUUsQ0FBQyxLQUFhLEVBQUUsR0FBb0IsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7Q0FDdkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogSGFyZGVuZWQgaW50cm9zcGVjdGlvbiBmb3Igc2VyaWFsaXppbmcgdmFsdWVzIHRoYXQgbWF5IG9yaWdpbmF0ZSBpbnNpZGUgYVxuICogd29ya2Zsb3cgVk0gKGBub2RlOnZtYCkgc2FuZGJveCByZWFsbS5cbiAqXG4gKiBTZXJpYWxpemF0aW9uIHJ1bnMgb24gdGhlIGhvc3QsIGJ1dCB0aGUgdmFsdWVzIGl0IGluc3BlY3RzIHdlcmVcbiAqIGNvbnN0cnVjdGVkIGJ5IHdvcmtmbG93IGNvZGUsIHNvIGEgbmFpdmUgZHluYW1pYyBvcGVyYXRpb24gbGlrZVxuICogYHZhbHVlLnRvSVNPU3RyaW5nKClgLCBgQXJyYXkuZnJvbShtYXApYCwgb3IgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgXG4gKiBkaXNwYXRjaGVzIGludG8gdGhlIHNhbmRib3ggcmVhbG0gYW5kIGV4ZWN1dGVzIHdvcmtmbG93IGNvZGUgKHBhdGNoZWRcbiAqIHByb3RvdHlwZSBtZXRob2RzLCBnZXR0ZXJzLCBwcm94eSB0cmFwcywgYFN5bWJvbC50b1N0cmluZ1RhZ2AgYWNjZXNzb3JzKS5cbiAqIFRoYXQgaXMgYSBkZXRlcm1pbmlzbSBoYXphcmQ6IHNlcmlhbGl6YXRpb24gaGFwcGVucyBleGFjdGx5IG9uY2UgcGVyXG4gKiBwYXlsb2FkIChuZXZlciBhZ2FpbiBvbiByZXBsYXkpLCBzbyBhbnkgd29ya2Zsb3ctdmlzaWJsZSBzaWRlIGVmZmVjdCBpdFxuICogdHJpZ2dlcnMgZXhpc3RzIG9ubHkgb24gdGhlIGxpdmUgZXhlY3V0aW9uIHBhdGggYW5kIGRpdmVyZ2VzIGZyb20gcmVwbGF5LlxuICpcbiAqIFRoaXMgbW9kdWxlIG1ha2VzIHNlcmlhbGl6YXRpb24gc2lkZS1lZmZlY3QgZnJlZSB3aGVyZXZlciB0aGUgZGF0YSBhbGxvd3NcbiAqIGl0LCBhbmQgKm9ic2VydmFibGUqIHdoZXJlIGl0IGRvZXMgbm90OlxuICpcbiAqIC0gKipDbGFzc2lmaWNhdGlvbioqIHVzZXMgZW5naW5lLWxldmVsIGJyYW5kIGNoZWNrcyAoYG5vZGU6dXRpbGAgYHR5cGVzYCxcbiAqICAgaW50ZXJuYWwtc2xvdCBwcm9iZXMpIGluc3RlYWQgb2YgYGluc3RhbmNlb2ZgIC8gYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgLFxuICogICB3aGljaCBtYWtlcyBpdCBpbW11bmUgdG8gYFN5bWJvbC5oYXNJbnN0YW5jZWAsIGBTeW1ib2wudG9TdHJpbmdUYWdgLCBhbmRcbiAqICAgcmVhc3NpZ25lZCBnbG9iYWxzLlxuICogLSAqKkV4dHJhY3Rpb24qKiBnb2VzIHRocm91Z2ggaW50cmluc2ljcyBjYXB0dXJlZCBhdCBtb2R1bGUgbG9hZCAoaG9zdFxuICogICBib290LCBiZWZvcmUgYW55IHdvcmtmbG93IGNvZGUgcnVucykuIEludGVybmFsIHNsb3RzIGFyZSByZWFsbS1hZ25vc3RpYyxcbiAqICAgc28gaG9zdCBpbnRyaW5zaWNzIHJlYWQgVk0tcmVhbG0gb2JqZWN0cyB3aXRob3V0IHRvdWNoaW5nIHRoZSBzYW5kYm94J3NcbiAqICAgKHBhdGNoYWJsZSkgcHJvdG90eXBlcy5cbiAqIC0gKipQcm9wZXJ0eSBhY2Nlc3MqKiByZWFkcyB0aHJvdWdoIGRlc2NyaXB0b3JzLCBzbyBwbGFpbiBkYXRhIG5ldmVyXG4gKiAgIGludm9rZXMgYW55dGhpbmcuIFdoZXJlIHdvcmtmbG93IGNvZGUgKm11c3QqIHJ1biBiZWNhdXNlIHRoZSBkYXRhIGl0c2VsZlxuICogICBsaXZlcyBiZWhpbmQgaXQgKGdldHRlcnMsIHByb3hpZXMsIGN1c3RvbSBgW1dPUktGTE9XX1NFUklBTElaRV1gXG4gKiAgIG1ldGhvZHMsIGB0b1N0cmluZygpYCBvbiB0b1N0cmluZ1RhZy1icmFuZGVkIG9iamVjdHMgc3VjaCBhcyBUZW1wb3JhbFxuICogICBwb2x5ZmlsbHMpLCB0aGUgZXhlY3V0aW9uIGlzIHByZXNlcnZlZCBmb3IgY29tcGF0aWJpbGl0eSBhbmQgcmVjb3JkZWRcbiAqICAgaW4gdGhlIGFjdGl2ZSB7QGxpbmsgR3Vlc3RDb2RlU3RhdHN9IHNpbmssIHNvIGNhbGxlcnMgKGUuZy4gYSByZXRhaW5lZC1WTVxuICogICBnYXRlKSBjYW4gcmVhY3QuXG4gKlxuICogKipSZWNvcmRpbmcgaXMgbm90IHByZXZlbnRpb24uKiogRm9yIHRoZSByZWNvcmRlZCBjYXNlcyB0aGUgZGV0ZXJtaW5pc21cbiAqIGhhemFyZCBpcyBzdGlsbCBsaXZlOiBhIGdldHRlciB0aGF0IGNhbGxzIGBNYXRoLnJhbmRvbSgpYCBhZHZhbmNlcyB0aGVcbiAqIHJ1bidzIHNlZWRlZCBQUk5HIGR1cmluZyBzZXJpYWxpemF0aW9uLCBhbmQgYmVjYXVzZSBzZXJpYWxpemF0aW9uIGhhcHBlbnNcbiAqIGV4YWN0bHkgb25jZSBhbmQgaXMgbmV2ZXIgcmVwbGF5ZWQsIGV2ZXJ5IHN1YnNlcXVlbnQgZHJhdyAoaW5jbHVkaW5nIHRoZVxuICogY29ycmVsYXRpb24gaWRzIGRlcml2ZWQgZnJvbSB0aGF0IHN0cmVhbSkgc2hpZnRzIHJlbGF0aXZlIHRvIHJlcGxheS4gVGhlXG4gKiByZXBvcnQgaXMgdGhlIG9ubHkgdHJhY2Ugb2YgdGhhdDsgYWN0aW5nIG9uIGl0ICh3YXJuaW5nLCBkZW1vdGluZyBhXG4gKiByZXRhaW5lZCBWTSB0byByZXBsYXkpIGlzIGxlZnQgdG8gdGhlIGNhbGxlci5cbiAqXG4gKiBUaGUgcmVjb3JkZXIgaXMgYW1iaWVudCBtb2R1bGUgc3RhdGUsIHNldCBmb3IgdGhlIGR1cmF0aW9uIG9mIGFcbiAqIHN5bmNocm9ub3VzIGBzdHJpbmdpZnlgIGNhbGwgdmlhIHtAbGluayB3aXRoR3Vlc3RDb2RlU3RhdHN9LiBkZXZhbHVlJ3NcbiAqIGBzdHJpbmdpZnlgIGlzIGZ1bGx5IHN5bmNocm9ub3VzLCBzbyB0aGlzIGlzIHNhZmUgd2l0aG91dCBhc3luYyBjb250ZXh0LlxuICovXG5cbmltcG9ydCB7IHR5cGVzIH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7IGdsb2JhbFNpbmdsZXRvbiB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFN0cmluZ2lmeU9wZXJhdGlvbnMgfSBmcm9tICdkZXZhbHVlJztcbmltcG9ydCB7IGRlZmF1bHRTdHJpbmdpZnlPcGVyYXRpb25zIH0gZnJvbSAnZGV2YWx1ZSc7XG5cbi8vIC0tLS0gR3Vlc3QgY29kZSBvYnNlcnZhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQSBzaW5nbGUgaW5zdGFuY2Ugb2Ygd29ya2Zsb3cgKGd1ZXN0KSBjb2RlIGV4ZWN1dGluZyBkdXJpbmcgc2VyaWFsaXphdGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHdWVzdENvZGVFeGVjdXRpb24ge1xuICAvKipcbiAgICogV2hhdCBmb3JjZWQgdGhlIGV4ZWN1dGlvbjpcbiAgICogLSBgZ2V0dGVyYDogYW4gYWNjZXNzb3IgcHJvcGVydHkgd2FzIGludm9rZWQgdG8gcmVhZCBkYXRhXG4gICAqIC0gYHByb3h5YDogYSBwcm94eSB3YXMgaW50cm9zcGVjdGVkLCBmaXJpbmcgaXRzIHRyYXBzLiBOb3RlIHRoaXMgYWxzb1xuICAgKiAgIGltcGxpZXMgYSAqKnNoYXBlIGNoYW5nZSoqOiBicmFuZCBjaGVja3MgYW5zd2VyIFwibm90IHRoYXQgdHlwZVwiIGZvciBhXG4gICAqICAgcHJveHksIHNvIGEgcHJveGllZCBgTWFwYCBzZXJpYWxpemVzIGFzIGEgcGxhaW4gb2JqZWN0IHJhdGhlciB0aGFuIGFzIGFcbiAgICogICBgTWFwYCwgYW5kIHRoaXMgcmVwb3J0IGlzIHRoZSBvbmx5IGV2aWRlbmNlIG9mIGl0LiAoU3VjaCB2YWx1ZXMgd2VyZVxuICAgKiAgIG5ldmVyIHNlcmlhbGl6YWJsZSBiZWZvcmUsIHNpbmNlIHRoZSBpbnRlcm5hbC1zbG90IHJlYWRzIGluIHRoZSBwcmV2aW91c1xuICAgKiAgIGltcGxlbWVudGF0aW9uIHRocmV3IG9uIHRoZW0sIHNvIHRoZSBzaGFwZSBjaGFuZ2UgcmVwbGFjZXMgYSBjcmFzaCxcbiAgICogICBidXQgaXQgaXMgc2lsZW50LilcbiAgICogLSBgbWV0aG9kYDogYSB3b3JrZmxvdy1kZWZpbmVkIGZ1bmN0aW9uIHdhcyBpbnZva2VkIChlLmcuIGEgY3VzdG9tXG4gICAqICAgYFtXT1JLRkxPV19TRVJJQUxJWkVdYCBzZXJpYWxpemVyLCBgdG9TdHJpbmcoKWAgb24gYVxuICAgKiAgIGBTeW1ib2wudG9TdHJpbmdUYWdgLWJyYW5kZWQgb2JqZWN0LCBhIGR1Y2stdHlwZWQgYGdldFRpbWUoKWAsIG9yIGFcbiAgICogICBgX19jbG9zdXJlVmFyc0ZuYCB0aGlzIHBhY2thZ2UgZGlkIG5vdCBnZW5lcmF0ZSlcbiAgICovXG4gIGtpbmQ6ICdnZXR0ZXInIHwgJ3Byb3h5JyB8ICdtZXRob2QnO1xuICAvKiogQmVzdC1lZmZvcnQgY29udGV4dDogdGhlIHByb3BlcnR5IGtleSwgbWV0aG9kIG5hbWUsIG9yIHRhZyBpbnZvbHZlZC4gKi9cbiAgZGV0YWlsPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE11dGFibGUgc2luayByZWNvcmRpbmcgZXZlcnkgd29ya2Zsb3ctY29kZSBleGVjdXRpb24gc2VyaWFsaXphdGlvbiBjb3VsZFxuICogbm90IGF2b2lkLiBQYXNzIHZpYSBgQ29kZWNPcHRpb25zLmd1ZXN0Q29kZVN0YXRzYDsgY29uc3VtZXJzIHRoYXQgcmV0YWluXG4gKiB0aGUgVk0gYWNyb3NzIHN0ZXBzIGNhbiB1c2UgYSBub24tZW1wdHkgYGV4ZWN1dGlvbnNgIGFycmF5IGFzIGEgc2lnbmFsXG4gKiB0aGF0IHRoZSBWTSBzdGF0ZSBtYXkgaGF2ZSBiZWVuIHBlcnR1cmJlZCBieSBzZXJpYWxpemF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEd1ZXN0Q29kZVN0YXRzIHtcbiAgZXhlY3V0aW9uczogR3Vlc3RDb2RlRXhlY3V0aW9uW107XG59XG5cbi8vIHBlci1jb3B5LW9rOiBib3RoIGFyZSBzZXQgYW5kIGNsZWFyZWQgYnkgYHdpdGhHdWVzdENvZGVTdGF0c2AgYXJvdW5kIGEgc2luZ2xlXG4vLyBzeW5jaHJvbm91cyBjYWxsLCBzbyB0aGUgc2luayBpcyBvbmx5IGV2ZXIgcmVhZCBieSB0aGUgc2FtZSBjb3B5IHRoYXQgYXJtZWRcbi8vIGl0LiBBIHNoYXJlZCBzbG90IHdvdWxkIGxldCB0d28gY29waWVzIHJlY29yZGluZyBjb25jdXJyZW50bHkgY2xvYmJlciBlYWNoXG4vLyBvdGhlcidzIHNpbmsuXG5sZXQgYWN0aXZlU3RhdHM6IEd1ZXN0Q29kZVN0YXRzIHwgbnVsbCA9IG51bGw7XG4vLyBwZXItY29weS1vazogc2FtZSBzY29wZSBhcyBgYWN0aXZlU3RhdHNgIGFib3ZlLCBhcm1lZCBhbmQgY2xlYXJlZCB0b2dldGhlci5cbmxldCByZXBvcnRlZFByb3hpZXM6IFdlYWtTZXQ8b2JqZWN0PiB8IG51bGwgPSBudWxsO1xuXG4vKipcbiAqIFJ1bnMgYGZuYCAoc3luY2hyb25vdXNseSkgd2l0aCBgc3RhdHNgIGFzIHRoZSBhY3RpdmUgZ3Vlc3QtY29kZSBzaW5rLlxuICogTmVzdGVkIGNhbGxzIHN0YWNrIGNvcnJlY3RseTsgYSBgbnVsbGAvYHVuZGVmaW5lZGAgc2luayBkaXNhYmxlc1xuICogcmVjb3JkaW5nIHdpdGhvdXQgZGlzYWJsaW5nIGhhcmRlbmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhHdWVzdENvZGVTdGF0czxUPihcbiAgc3RhdHM6IEd1ZXN0Q29kZVN0YXRzIHwgdW5kZWZpbmVkLFxuICBmbjogKCkgPT4gVFxuKTogVCB7XG4gIGNvbnN0IHByZXZpb3VzU3RhdHMgPSBhY3RpdmVTdGF0cztcbiAgY29uc3QgcHJldmlvdXNQcm94aWVzID0gcmVwb3J0ZWRQcm94aWVzO1xuICBhY3RpdmVTdGF0cyA9IHN0YXRzID8/IG51bGw7XG4gIHJlcG9ydGVkUHJveGllcyA9IHN0YXRzID8gbmV3IFdlYWtTZXQoKSA6IG51bGw7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZlU3RhdHMgPSBwcmV2aW91c1N0YXRzO1xuICAgIHJlcG9ydGVkUHJveGllcyA9IHByZXZpb3VzUHJveGllcztcbiAgfVxufVxuXG4vKipcbiAqIENsb3N1cmUtdmFyaWFibGUgZnVuY3Rpb25zIHRoYXQgYXJyaXZlZCB0aHJvdWdoIGB1c2VTdGVwYCB3aGVuIGEgc3RlcFxuICogcHJveHkgd2FzIGJ1aWx0LiBUaGUgc3RlcC1mdW5jdGlvbiByZWR1Y2VyIG11c3QgaW52b2tlIGBfX2Nsb3N1cmVWYXJzRm5gLFxuICogYW5kIHRoZSBjb21waWxlci1nZW5lcmF0ZWQgZnVuY3Rpb24gaXMgYSBwdXJlIHNlcXVlbmNlIG9mIGxleGljYWwgcmVhZHMuXG4gKiBCdXQgdGhlICpwcm9wZXJ0eSogaXMgcmVhY2hhYmxlIGZyb20gd29ya2Zsb3cgY29kZSwgd2hpY2ggY2FuIHJlcGxhY2UgaXRcbiAqIHdpdGggYW4gYXJiaXRyYXJ5IGZ1bmN0aW9uLiBUaGUgcmVkdWNlciBjaGVja3MgbWVtYmVyc2hpcCBoZXJlIGluc3RlYWQgb2ZcbiAqIGFzc3VtaW5nIHByb3ZlbmFuY2UsIGFuZCByZXBvcnRzIGFueXRoaW5nIGl0IGRvZXMgbm90IHJlY29nbml6ZS5cbiAqXG4gKiBNZW1iZXJzaGlwIHByb3ZlcyB0aGUgZnVuY3Rpb24gd2FzIHBhc3NlZCB0byBgdXNlU3RlcGAsIG5vdCB0aGF0IHRoZVxuICogY29tcGlsZXIgZ2VuZXJhdGVkIGl0OiB3b3JrZmxvdyBjb2RlIGNhbiBjYWxsIGB1c2VTdGVwYCBkaXJlY3RseSBhbmRcbiAqIGxhdW5kZXIgYSBzaWRlLWVmZmVjdGZ1bCBmdW5jdGlvbiBwYXN0IHRoZSByZXBvcnQuIFRoYXQgY29zdHMgYSBtaXNzaW5nXG4gKiByZXBvcnQgZW50cnksIG5ldmVyIGluY29ycmVjdCBvdXRwdXQ7IGNsb3NpbmcgaXQgbWVhbnMgYnJhbmRpbmcgYXQgdGhlXG4gKiBjb21waWxlciwgd2hpY2ggZG9lcyBub3QgYmVsb25nIGhlcmUuXG4gKi9cbi8vIE9uIGBnbG9iYWxUaGlzYCAoc2VlIGBnbG9iYWxTaW5nbGV0b25gKTogZnVuY3Rpb25zIGNyb3NzIG1vZHVsZSBjb3BpZXMgZnJlZWx5LFxuLy8gc28gYSBjbG9zdXJlIG1hcmtlZCBieSBvbmUgY29weSB3b3VsZCBub3QgYmUgcmVjb2duaXplZCBieSBhbm90aGVyLCBjb3N0aW5nIGFcbi8vIHJlcG9ydCBlbnRyeSBmb3Igbm8gcmVhc29uLlxuY29uc3QgdXNlU3RlcENsb3N1cmVzID0gZ2xvYmFsU2luZ2xldG9uKFxuICAnQHdvcmtmbG93L2NvcmUvL3VzZVN0ZXBDbG9zdXJlcy5mbnMnLFxuICAxLFxuICAoKSA9PiAoeyBmbnM6IG5ldyBXZWFrU2V0PG9iamVjdD4oKSB9KVxuKTtcblxuLyoqIE1hcmtzIGEgZnVuY3Rpb24gYXMgaGF2aW5nIGJlZW4gcGFzc2VkIHRvIGB1c2VTdGVwYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrVXNlU3RlcENsb3N1cmVGbjxUIGV4dGVuZHMgb2JqZWN0PihmbjogVCk6IFQge1xuICB1c2VTdGVwQ2xvc3VyZXMuZm5zLmFkZChmbik7XG4gIHJldHVybiBmbjtcbn1cblxuLyoqIFdoZXRoZXIgYGZuYCB3YXMgbWFya2VkIGJ5IHtAbGluayBtYXJrVXNlU3RlcENsb3N1cmVGbn0uICovXG5leHBvcnQgZnVuY3Rpb24gaXNVc2VTdGVwQ2xvc3VyZUZuKGZuOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgJiYgdXNlU3RlcENsb3N1cmVzLmZucy5oYXMoZm4gYXMgb2JqZWN0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEd1ZXN0Q29kZShcbiAga2luZDogR3Vlc3RDb2RlRXhlY3V0aW9uWydraW5kJ10sXG4gIGRldGFpbD86IHN0cmluZ1xuKTogdm9pZCB7XG4gIGlmICghYWN0aXZlU3RhdHMpIHJldHVybjtcbiAgY29uc3QgZXhlY3V0aW9uOiBHdWVzdENvZGVFeGVjdXRpb24gPSB7IGtpbmQgfTtcbiAgaWYgKGRldGFpbCAhPT0gdW5kZWZpbmVkKSBleGVjdXRpb24uZGV0YWlsID0gZGV0YWlsO1xuICBhY3RpdmVTdGF0cy5leGVjdXRpb25zLnB1c2goZXhlY3V0aW9uKTtcbn1cblxuLyoqIFJlY29yZHMgYSBwcm94eSBvbmNlIHBlciBzZXJpYWxpemF0aW9uIHBhc3MgKHByb3hpZXMgZmlyZSBtYW55IHRyYXBzKS4gKi9cbmZ1bmN0aW9uIHJlY29yZFByb3h5KHZhbHVlOiBvYmplY3QpOiB2b2lkIHtcbiAgaWYgKCFhY3RpdmVTdGF0cyB8fCAhcmVwb3J0ZWRQcm94aWVzKSByZXR1cm47XG4gIGlmIChyZXBvcnRlZFByb3hpZXMuaGFzKHZhbHVlKSkgcmV0dXJuO1xuICByZXBvcnRlZFByb3hpZXMuYWRkKHZhbHVlKTtcbiAgcmVjb3JkR3Vlc3RDb2RlKCdwcm94eScpO1xufVxuXG4vLyAtLS0tIENhcHR1cmVkIGludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy9cbi8vIENhcHR1cmVkIGF0IG1vZHVsZSBsb2FkIChob3N0IGJvb3QsIGJlZm9yZSBhbnkgd29ya2Zsb3cgYnVuZGxlIGNhbiBydW4pXG4vLyBhbmQgaW52b2tlZCB3aXRoIGV4cGxpY2l0IHJlY2VpdmVycywgc28gbm8gbG9va3VwIGV2ZXIgcmVzb2x2ZXMgdGhyb3VnaCBhXG4vLyBzYW5kYm94LXJlYWNoYWJsZSBwcm90b3R5cGUuIEV2ZXJ5IG1lbWJlciBiZWxvdyBleGlzdHMgb24gZXZlcnkgc3VwcG9ydGVkXG4vLyBlbmdpbmUgKE5vZGUgMTgrKSwgc28gYSBtaXNzaW5nIG9uZSBpcyBhIGJ1ZyBpbiB0aGlzIHRhYmxlOiBmYWlsIGF0IGltcG9ydFxuLy8gcmF0aGVyIHRoYW4gc2VyaWFsaXplIHRocm91Z2ggYSBsaXZlIChwYXRjaGFibGUpIGxvb2t1cCBsYXRlci5cblxuY29uc3QgdW5jdXJyeVRoaXMgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5iaW5kKEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsKSBhcyA8XG4gIFQsXG4gIEEgZXh0ZW5kcyB1bmtub3duW10sXG4gIFIsXG4+KFxuICBmbjogKHRoaXM6IFQsIC4uLmFyZ3M6IEEpID0+IFJcbikgPT4gKHRoaXNBcmc6IFQsIC4uLmFyZ3M6IEEpID0+IFI7XG5cbmZ1bmN0aW9uIHByb3RvR2V0dGVyPFQ+KFxuICBwcm90b3R5cGU6IG9iamVjdCxcbiAga2V5OiBQcm9wZXJ0eUtleVxuKTogKHZhbHVlOiB1bmtub3duKSA9PiBUIHtcbiAgY29uc3QgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIGtleSk/LmdldDtcbiAgaWYgKCFnZXR0ZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgaW50cmluc2ljIGdldHRlcjogJHtTdHJpbmcoa2V5KX1gKTtcbiAgfVxuICByZXR1cm4gdW5jdXJyeVRoaXMoZ2V0dGVyKSBhcyAodmFsdWU6IHVua25vd24pID0+IFQ7XG59XG5cbi8vIEVDTUFTY3JpcHQgaW50cmluc2ljcy4gQWxsIHJlYWQgaW50ZXJuYWwgc2xvdHMsIHNvIHRoZXkgd29yayBvbiB2YWx1ZXNcbi8vIGZyb20gYW55IHJlYWxtIGFuZCBhcmUgdW5hZmZlY3RlZCBieSBwcm90b3R5cGUgcGF0Y2hpbmcgaW4gYW55IHJlYWxtLlxuXG4vKiogYERhdGUucHJvdG90eXBlLmdldERhdGVgLCBmb3IgaW52YWxpZC1kYXRlIGNoZWNrcy4gKi9cbmV4cG9ydCBjb25zdCBkYXRlR2V0RGF0ZSA9IHVuY3VycnlUaGlzKERhdGUucHJvdG90eXBlLmdldERhdGUpO1xuLyoqIGBEYXRlLnByb3RvdHlwZS5nZXRUaW1lYC4gKi9cbmV4cG9ydCBjb25zdCBkYXRlR2V0VGltZSA9IHVuY3VycnlUaGlzKERhdGUucHJvdG90eXBlLmdldFRpbWUpO1xuLyoqIGBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZ2AuICovXG5leHBvcnQgY29uc3QgZGF0ZVRvSVNPU3RyaW5nID0gdW5jdXJyeVRoaXMoRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcpO1xuLyoqIGBSZWdFeHAucHJvdG90eXBlLnNvdXJjZWAgZ2V0dGVyLiAqL1xuZXhwb3J0IGNvbnN0IHJlZ0V4cFNvdXJjZSA9IHByb3RvR2V0dGVyPHN0cmluZz4oUmVnRXhwLnByb3RvdHlwZSwgJ3NvdXJjZScpO1xuLyoqIGBSZWdFeHAucHJvdG90eXBlLmZsYWdzYCBnZXR0ZXIuICovXG5leHBvcnQgY29uc3QgcmVnRXhwRmxhZ3MgPSBwcm90b0dldHRlcjxzdHJpbmc+KFJlZ0V4cC5wcm90b3R5cGUsICdmbGFncycpO1xuLyoqIGBBcnJheUJ1ZmZlci5wcm90b3R5cGUuYnl0ZUxlbmd0aGAgZ2V0dGVyIChpbnRlcm5hbCBzbG90IHJlYWQpLiAqL1xuZXhwb3J0IGNvbnN0IGFycmF5QnVmZmVyQnl0ZUxlbmd0aCA9IHByb3RvR2V0dGVyPG51bWJlcj4oXG4gIEFycmF5QnVmZmVyLnByb3RvdHlwZSxcbiAgJ2J5dGVMZW5ndGgnXG4pO1xuXG5jb25zdCBtYXBFbnRyaWVzID0gdW5jdXJyeVRoaXMoTWFwLnByb3RvdHlwZS5lbnRyaWVzKTtcbmNvbnN0IHNldFZhbHVlcyA9IHVuY3VycnlUaGlzKFNldC5wcm90b3R5cGUudmFsdWVzKTtcbmNvbnN0IG51bWJlclZhbHVlT2YgPSB1bmN1cnJ5VGhpcyhOdW1iZXIucHJvdG90eXBlLnZhbHVlT2YpO1xuY29uc3Qgc3RyaW5nVmFsdWVPZiA9IHVuY3VycnlUaGlzKFN0cmluZy5wcm90b3R5cGUudmFsdWVPZik7XG5jb25zdCBib29sZWFuVmFsdWVPZiA9IHVuY3VycnlUaGlzKEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YpO1xuY29uc3QgYmlnSW50VmFsdWVPZiA9IHVuY3VycnlUaGlzKFxuICBCaWdJbnQucHJvdG90eXBlLnZhbHVlT2YgYXMgKHRoaXM6IHVua25vd24pID0+IGJpZ2ludFxuKTtcblxuY29uc3QgVHlwZWRBcnJheVByb3RvdHlwZTogb2JqZWN0ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUYWcgPSBwcm90b0dldHRlcjxzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBUeXBlZEFycmF5UHJvdG90eXBlLFxuICBTeW1ib2wudG9TdHJpbmdUYWdcbik7XG5jb25zdCB0eXBlZEFycmF5QnVmZmVyID0gcHJvdG9HZXR0ZXI8QXJyYXlCdWZmZXJMaWtlPihcbiAgVHlwZWRBcnJheVByb3RvdHlwZSxcbiAgJ2J1ZmZlcidcbik7XG5jb25zdCB0eXBlZEFycmF5Qnl0ZU9mZnNldCA9IHByb3RvR2V0dGVyPG51bWJlcj4oXG4gIFR5cGVkQXJyYXlQcm90b3R5cGUsXG4gICdieXRlT2Zmc2V0J1xuKTtcbmNvbnN0IHR5cGVkQXJyYXlCeXRlTGVuZ3RoID0gcHJvdG9HZXR0ZXI8bnVtYmVyPihcbiAgVHlwZWRBcnJheVByb3RvdHlwZSxcbiAgJ2J5dGVMZW5ndGgnXG4pO1xuY29uc3QgdHlwZWRBcnJheUxlbmd0aCA9IHByb3RvR2V0dGVyPG51bWJlcj4oVHlwZWRBcnJheVByb3RvdHlwZSwgJ2xlbmd0aCcpO1xuY29uc3QgZGF0YVZpZXdCdWZmZXIgPSBwcm90b0dldHRlcjxBcnJheUJ1ZmZlckxpa2U+KFxuICBEYXRhVmlldy5wcm90b3R5cGUsXG4gICdidWZmZXInXG4pO1xuY29uc3QgZGF0YVZpZXdCeXRlT2Zmc2V0ID0gcHJvdG9HZXR0ZXI8bnVtYmVyPihcbiAgRGF0YVZpZXcucHJvdG90eXBlLFxuICAnYnl0ZU9mZnNldCdcbik7XG5jb25zdCBkYXRhVmlld0J5dGVMZW5ndGggPSBwcm90b0dldHRlcjxudW1iZXI+KFxuICBEYXRhVmlldy5wcm90b3R5cGUsXG4gICdieXRlTGVuZ3RoJ1xuKTtcbmNvbnN0IHNoYXJlZEFycmF5QnVmZmVyQnl0ZUxlbmd0aCA9IHByb3RvR2V0dGVyPG51bWJlcj4oXG4gIFNoYXJlZEFycmF5QnVmZmVyLnByb3RvdHlwZSxcbiAgJ2J5dGVMZW5ndGgnXG4pO1xuXG4vLyBIb3N0IChXSEFUV0cpIGNsYXNzZXMuIEluamVjdGVkIGludG8gdGhlIHNhbmRib3ggYnkgcmVmZXJlbmNlLCBzb1xuLy8gaW5zdGFuY2VzIGZyb20gYW55IHJlYWxtIGNhcnJ5IHRoZXNlIHByb3RvdHlwZXMsIGFuZCB0aGUgc2hhcmVkXG4vLyBwcm90b3R5cGVzIGFyZSByZWFjaGFibGUgZnJvbSB3b3JrZmxvdyBjb2RlLCB3aGljaCBtYWtlcyB0aGUgYm9vdC10aW1lXG4vLyBjYXB0dXJlIChyYXRoZXIgdGhhbiBhIGxpdmUgbG9va3VwKSBsb2FkLWJlYXJpbmcuXG5jb25zdCBoZWFkZXJzSXRlcmF0b3IgPSB1bmN1cnJ5VGhpcyhIZWFkZXJzLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdKTtcbmNvbnN0IHVybEhyZWZHZXR0ZXIgPSBwcm90b0dldHRlcjxzdHJpbmc+KFVSTC5wcm90b3R5cGUsICdocmVmJyk7XG5jb25zdCB1cmxTZWFyY2hQYXJhbXNUb1N0cmluZ01ldGhvZCA9IHVuY3VycnlUaGlzKFxuICBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnRvU3RyaW5nXG4pO1xuXG4vLyAtLS0tIFNhZmUgYWNjZXNzIHByaW1pdGl2ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCB7IGlzUHJveHkgfSA9IHR5cGVzO1xuXG5jb25zdCBmdW5jdGlvblRvU3RyaW5nID0gdW5jdXJyeVRoaXMoRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nKTtcblxuLyoqXG4gKiBXaGV0aGVyIGFuIGFjY2Vzc29yIGlzIHByb3ZpZGVkIGJ5IHRoZSBlbmdpbmUgb3IgdGhlIGhvc3QsIHJhdGhlciB0aGFuXG4gKiBkZWZpbmVkIGJ5IHdvcmtmbG93IGNvZGUuIFNlcmlhbGl6YXRpb24gbXVzdCByZWFkIHNvbWUgcHJvcGVydGllcyB0aGF0IGFyZVxuICogYWNjZXNzb3JzIGJ5IGNvbnN0cnVjdGlvbiAoVjggZGVmaW5lcyBgc3RhY2tgIGFzIGFuIG93biBhY2Nlc3NvciBvbiBldmVyeVxuICogRXJyb3IgaW5zdGFuY2U7IE5vZGUgaW1wbGVtZW50cyBgRE9NRXhjZXB0aW9uLnByb3RvdHlwZS5tZXNzYWdlYCBpblxuICogSmF2YVNjcmlwdCksIGFuZCByZXBvcnRpbmcgdGhvc2Ugd291bGQgZHJvd24gdGhlIHNpZ25hbCBpbiBub2lzZS5cbiAqXG4gKiAtIEVuZ2luZSBhY2Nlc3NvcnMgYXJlIG5hdGl2ZSBjb2RlLCBkZXRlY3RlZCB2aWEgdGhlIGNhcHR1cmVkIGhvc3RcbiAqICAgYEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZ2AgKGNyb3NzLXJlYWxtLCB1bmludGVyY2VwdGFibGUpLiBCb3VuZFxuICogICBmdW5jdGlvbnMgYW5kIGNhbGxhYmxlIFByb3hpZXMgYWxzbyBwcmVzZW50IGFzIG5hdGl2ZSBjb2RlIGJ1dCBydW5cbiAqICAgd29ya2Zsb3cgY29kZSwgc28gYm90aCBhcmUgZXhjbHVkZWQgZmlyc3QuXG4gKiAtIEhvc3QgYnVpbHRpbnMgaW1wbGVtZW50ZWQgaW4gSmF2YVNjcmlwdCBhcmUgb3JkaW5hcnkgZnVuY3Rpb25zLCBidXQgdGhleVxuICogICBiZWxvbmcgdG8gdGhlIGhvc3QgcmVhbG0sIGRldGVjdGVkIGJ5IGNvbXBhcmluZyB0aGUgZnVuY3Rpb24nc1xuICogICBwcm90b3R5cGUgYWdhaW5zdCB0aGUgaG9zdCBgRnVuY3Rpb24ucHJvdG90eXBlYC4gV29ya2Zsb3cgY29kZSB0aGF0XG4gKiAgIHJlYWNoZXMgYSBob3N0IGZ1bmN0aW9uIGNhbiBgc2V0UHJvdG90eXBlT2ZgIGl0cyBvd24gZ2V0dGVyIHRvXG4gKiAgIGltcGVyc29uYXRlIHRoaXM7IHRoYXQgY29zdHMgYSBtaXNzaW5nIHJlcG9ydCBlbnRyeSwgbmV2ZXIgaW5jb3JyZWN0XG4gKiAgIG91dHB1dC5cbiAqXG4gKiBWOCdzIG5hdGl2ZSBgc3RhY2tgIGdldHRlciBjYW4gaXRzZWxmIGludm9rZSBhIHdvcmtmbG93LWRlZmluZWRcbiAqIGBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZWA7IHRoYXQgaW5kaXJlY3Rpb24gaXMgbm90IGRldGVjdGVkIGhlcmUuXG4gKi9cbmZ1bmN0aW9uIGlzRW5naW5lQWNjZXNzb3IoZ2V0dGVyOiBvYmplY3QpOiBib29sZWFuIHtcbiAgaWYgKGlzUHJveHkoZ2V0dGVyKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBBIGJvdW5kIGZ1bmN0aW9uIHN0cmluZ2lmaWVzIGFzIG5hdGl2ZSBjb2RlIGJ1dCBydW5zIGl0cyB0YXJnZXQuIFRoZVxuICAvLyBvbmUgcGFzc2l2ZSBkaXN0aW5ndWlzaGVyIFY4IGV4cG9zZXMgaXMgdGhlIGBuYW1lYCBvd24gcHJvcGVydHlcbiAgLy8gKGBcImJvdW5kIGZuXCJgKS4gV29ya2Zsb3cgY29kZSBjYW4gcmVkZWZpbmUgdGhlIG5hbWUgdG8gaGlkZSBpdDsgdGhhdFxuICAvLyBjb3N0cyBhIG1pc3NpbmcgcmVwb3J0IGVudHJ5LCBsaWtlIHRoZSBvdGhlciBpbXBlcnNvbmF0aW9uIGNhdmVhdHMuXG4gIGNvbnN0IG5hbWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdldHRlciwgJ25hbWUnKT8udmFsdWU7XG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgJiYgbmFtZS5zdGFydHNXaXRoKCdib3VuZCAnKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKFxuICAgIGZ1bmN0aW9uVG9TdHJpbmcoZ2V0dGVyIGFzICgpID0+IHVua25vd24pLmVuZHNXaXRoKCd7IFtuYXRpdmUgY29kZV0gfScpIHx8XG4gICAgUmVmbGVjdC5nZXRQcm90b3R5cGVPZihnZXR0ZXIpID09PSBGdW5jdGlvbi5wcm90b3R5cGVcbiAgKTtcbn1cblxuLyoqXG4gKiBSZWFkcyBgdmFsdWVba2V5XWAgd2l0aCBgW1tHZXRdXWAgc2VtYW50aWNzLCBidXQgdGhyb3VnaCBkZXNjcmlwdG9yczpcbiAqIHBsYWluIGRhdGEgcHJvcGVydGllcyBuZXZlciBpbnZva2UgYW55dGhpbmc7IGFjY2Vzc29yIHByb3BlcnRpZXMgYXJlXG4gKiBpbnZva2VkICh0aGUgZGF0YSBsaXZlcyBiZWhpbmQgdGhlbSkgYW5kIHJlY29yZGVkOyBwcm94aWVzIGZhbGwgYmFjayB0b1xuICogYSBwbGFpbiByZWFkICh0aGVpciB0cmFwcyBhcmUgdGhlIG9ubHkgYWNjZXNzIHBhdGgpIGFuZCBhcmUgcmVjb3JkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkUHJvcGVydHkodmFsdWU6IHVua25vd24sIGtleTogUHJvcGVydHlLZXkpOiB1bmtub3duIHtcbiAgaWYgKFxuICAgIHZhbHVlID09PSBudWxsIHx8XG4gICAgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKVxuICApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmIChpc1Byb3h5KHZhbHVlKSkge1xuICAgIHJlY29yZFByb3h5KHZhbHVlKTtcbiAgICByZXR1cm4gKHZhbHVlIGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pW2tleV07XG4gIH1cblxuICBsZXQgY3VycmVudDogb2JqZWN0IHwgbnVsbCA9IHZhbHVlO1xuICB3aGlsZSAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIGlmIChpc1Byb3h5KGN1cnJlbnQpKSB7XG4gICAgICAvLyBhIHByb3h5IGluIHRoZSBwcm90b3R5cGUgY2hhaW46IGl0cyB0cmFwcyBhbnN3ZXIgdGhlIGxvb2t1cFxuICAgICAgcmVjb3JkUHJveHkoY3VycmVudCk7XG4gICAgICByZXR1cm4gKHZhbHVlIGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pW2tleV07XG4gICAgfVxuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGN1cnJlbnQsIGtleSk7XG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIHJldHVybiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgICAgaWYgKGRlc2NyaXB0b3IuZ2V0KSB7XG4gICAgICAgIGlmICghaXNFbmdpbmVBY2Nlc3NvcihkZXNjcmlwdG9yLmdldCkpIHtcbiAgICAgICAgICByZWNvcmRHdWVzdENvZGUoJ2dldHRlcicsIFN0cmluZyhrZXkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5nZXQuY2FsbCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBzZXR0ZXItb25seSBwcm9wZXJ0eVxuICAgIH1cbiAgICBjdXJyZW50ID0gUmVmbGVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIGBrZXkgaW4gdmFsdWVgIHNlbWFudGljcyB3aXRob3V0IGZpcmluZyBwcm94eSB0cmFwcyBmb3Igb3JkaW5hcnlcbiAqIG9iamVjdHMuIFByb3hpZXMgZmFsbCBiYWNrIHRvIHRoZSBgaW5gIG9wZXJhdG9yIGFuZCBhcmUgcmVjb3JkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNQcm9wZXJ0eSh2YWx1ZTogdW5rbm93biwga2V5OiBQcm9wZXJ0eUtleSk6IGJvb2xlYW4ge1xuICBpZiAoXG4gICAgdmFsdWUgPT09IG51bGwgfHxcbiAgICAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoaXNQcm94eSh2YWx1ZSkpIHtcbiAgICByZWNvcmRQcm94eSh2YWx1ZSk7XG4gICAgcmV0dXJuIGtleSBpbiAodmFsdWUgYXMgb2JqZWN0KTtcbiAgfVxuXG4gIGxldCBjdXJyZW50OiBvYmplY3QgfCBudWxsID0gdmFsdWU7XG4gIHdoaWxlIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgaWYgKGlzUHJveHkoY3VycmVudCkpIHtcbiAgICAgIHJlY29yZFByb3h5KGN1cnJlbnQpO1xuICAgICAgcmV0dXJuIGtleSBpbiAodmFsdWUgYXMgb2JqZWN0KTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY3VycmVudCwga2V5KSkgcmV0dXJuIHRydWU7XG4gICAgY3VycmVudCA9IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIGB2YWx1ZSBpbnN0YW5jZW9mIENgIHNlbWFudGljcyBmb3IgYSBrbm93biBgQy5wcm90b3R5cGVgLCB3aXRob3V0XG4gKiBjb25zdWx0aW5nIGBTeW1ib2wuaGFzSW5zdGFuY2VgICh3aGljaCB3b3JrZmxvdyBjb2RlIGNhbiBkZWZpbmUpLiBVc2VkXG4gKiBmb3IgaG9zdCBjbGFzc2VzIHRoYXQgYXJlIGluamVjdGVkIGludG8gdGhlIHNhbmRib3ggKEhlYWRlcnMsIFVSTCxcbiAqIFVSTFNlYXJjaFBhcmFtcywgRE9NRXhjZXB0aW9uKSwgd2hlcmUgdGhlIGluc3RhbmNlcyAoZnJvbSBhbnkgcmVhbG0gdGhlXG4gKiBob3N0IGhhbmRlZCB0aGUgY2xhc3MgdG8pIGNhcnJ5IHRoZSBob3N0IHByb3RvdHlwZSBpbiB0aGVpciBjaGFpbi5cbiAqXG4gKiBQcm94aWVzIGFyZSB3YWxrZWQgcmF0aGVyIHRoYW4gcmVqZWN0ZWQ6IGBSZWZsZWN0LmdldFByb3RvdHlwZU9mYCBmaXJlc1xuICogdGhlIHByb3h5J3MgYGdldFByb3RvdHlwZU9mYCB0cmFwLCBtYXRjaGluZyBgaW5zdGFuY2VvZmAgc2VtYW50aWNzLCBhbmRcbiAqIHJlYWwgdmFsdWVzIGRlcGVuZCBvbiB0aGF0OiBOZXh0LmpzIGhhbmRzIHRoZSBydW50aW1lIGEgcHJveGllZFxuICogYE5leHRSZXF1ZXN0YCwgYW5kIGFuc3dlcmluZyBcIm5vdCBhIFJlcXVlc3RcIiBmb3IgaXQgd291bGQgc2lsZW50bHkgYnJlYWtcbiAqIHdlYmhvb2tzLiBUaGUgdHJhcHMgYXJlIGd1ZXN0LW9ic2VydmFibGUsIHNvIHRoZSBwcm94eSBpcyByZWNvcmRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5zdGFuY2VPZlByb3RvdHlwZShcbiAgdmFsdWU6IHVua25vd24sXG4gIHByb3RvdHlwZTogb2JqZWN0IHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKCFwcm90b3R5cGUpIHJldHVybiBmYWxzZTtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlzUHJveHkodmFsdWUpKSByZWNvcmRQcm94eSh2YWx1ZSk7XG4gIGxldCBjdXJyZW50OiBvYmplY3QgfCBudWxsID0gUmVmbGVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIHdoaWxlIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IHByb3RvdHlwZSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzUHJveHkoY3VycmVudCkpIHJlY29yZFByb3h5KGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8gLS0tLSBJbnRyaW5zaWMtYmFja2VkIGV4dHJhY3Rpb24gaGVscGVycyAodXNlZCBieSB0aGUgcmVkdWNlcnMpIC0tLS0tLS0tLS0tLS1cbi8vXG4vLyBJbnRyaW5zaWNzIHJlYWQgaW50ZXJuYWwgc2xvdHMsIHdoaWNoIGEgUHJveHkgZG9lcyBub3QgaGF2ZTogaW52b2tpbmcgb25lXG4vLyB3aXRoIGEgcHJveHkgcmVjZWl2ZXIgdGhyb3dzLCB3aGVyZSB0aGUgcHJlLWV4aXN0aW5nIGR5bmFtaWMgcmVhZCBmb3J3YXJkZWRcbi8vIHRocm91Z2ggdGhlIHRyYXAuIEZvciB0aGUgKHJhcmUpIHByb3h5IGNhc2UsIGZhbGwgYmFjayB0byB0aGUgZHluYW1pYyByZWFkXG4vLyBzbyBiZWhhdmlvciBpcyB1bmNoYW5nZWQsIGFuZCByZWNvcmQgdGhhdCB0aGUgdHJhcHMgcmFuLlxuXG4vKiogYFVSTC5wcm90b3R5cGUuaHJlZmAgZ2V0dGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybEhyZWYodmFsdWU6IFVSTCk6IHN0cmluZyB7XG4gIGlmIChpc1Byb3h5KHZhbHVlKSkge1xuICAgIHJlY29yZFByb3h5KHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWUuaHJlZjtcbiAgfVxuICByZXR1cm4gdXJsSHJlZkdldHRlcih2YWx1ZSk7XG59XG5cbi8qKiBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS50b1N0cmluZ2A6IHJldHVybnMgYCcnYCBpZmYgZW1wdHkuICovXG5leHBvcnQgZnVuY3Rpb24gdXJsU2VhcmNoUGFyYW1zVG9TdHJpbmcodmFsdWU6IFVSTFNlYXJjaFBhcmFtcyk6IHN0cmluZyB7XG4gIGlmIChpc1Byb3h5KHZhbHVlKSkge1xuICAgIHJlY29yZFByb3h5KHZhbHVlKTtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gdXJsU2VhcmNoUGFyYW1zVG9TdHJpbmdNZXRob2QodmFsdWUpO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIGEgSGVhZGVycyBpbnN0YW5jZSB0aHJvdWdoIHRoZSBjYXB0dXJlZCBob3N0IGl0ZXJhdG9yLCBzbyB0aGVcbiAqIGl0ZXJhdG9yIG9iamVjdCwgYW5kIGl0cyBgbmV4dGAsIGFyZSBob3N0LXJlYWxtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGVhZGVyc1RvRW50cmllcyh2YWx1ZTogSGVhZGVycyk6IFtzdHJpbmcsIHN0cmluZ11bXSB7XG4gIGlmIChpc1Byb3h5KHZhbHVlKSkge1xuICAgIHJlY29yZFByb3h5KHZhbHVlKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh2YWx1ZSkgYXMgW3N0cmluZywgc3RyaW5nXVtdO1xuICB9XG4gIHJldHVybiBbLi4uaGVhZGVyc0l0ZXJhdG9yKHZhbHVlKV0gYXMgW3N0cmluZywgc3RyaW5nXVtdO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIGEgZ2VudWluZSBNYXAncyBlbnRyaWVzIGVudGlyZWx5IHRocm91Z2ggaG9zdCBpbnRyaW5zaWNzOiB0aGVcbiAqIGl0ZXJhdG9yIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHRoZSBob3N0IGBNYXAucHJvdG90eXBlLmVudHJpZXNgLCBzbyBpdHNcbiAqIHJlYWxtLCBhbmQgdGhlcmVmb3JlIGl0cyBgbmV4dGAsIGlzIHRoZSBob3N0J3MsIG5vdCB0aGUgc2FuZGJveCdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9FbnRyaWVzKFxuICB2YWx1ZTogTWFwPHVua25vd24sIHVua25vd24+XG4pOiBbdW5rbm93biwgdW5rbm93bl1bXSB7XG4gIHJldHVybiBbLi4ubWFwRW50cmllcyh2YWx1ZSldO1xufVxuXG4vKiogU2VlIHtAbGluayBtYXBUb0VudHJpZXN9LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRvVmFsdWVzKHZhbHVlOiBTZXQ8dW5rbm93bj4pOiB1bmtub3duW10ge1xuICByZXR1cm4gWy4uLnNldFZhbHVlcyh2YWx1ZSldO1xufVxuXG4vKipcbiAqIFRoZSBieXRlcyBvZiBhbiBgQXJyYXlCdWZmZXJWaWV3YCwgcmVhZCB2aWEgaW50ZXJuYWwtc2xvdCBnZXR0ZXJzLCBzb1xuICogb3duLXByb3BlcnR5IHNoYWRvd2luZyBhbmQgcHJvdG90eXBlIHBhdGNoZXMgY2Fubm90IGNoYW5nZSB3aGljaCBieXRlc1xuICogYXJlIHNlcmlhbGl6ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2aWV3SW5mbyh2YWx1ZTogQXJyYXlCdWZmZXJWaWV3KToge1xuICBidWZmZXI6IEFycmF5QnVmZmVyTGlrZTtcbiAgYnl0ZU9mZnNldDogbnVtYmVyO1xuICBieXRlTGVuZ3RoOiBudW1iZXI7XG59IHtcbiAgaWYgKHR5cGVzLmlzRGF0YVZpZXcodmFsdWUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1ZmZlcjogZGF0YVZpZXdCdWZmZXIodmFsdWUpLFxuICAgICAgYnl0ZU9mZnNldDogZGF0YVZpZXdCeXRlT2Zmc2V0KHZhbHVlKSxcbiAgICAgIGJ5dGVMZW5ndGg6IGRhdGFWaWV3Qnl0ZUxlbmd0aCh2YWx1ZSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGJ1ZmZlcjogdHlwZWRBcnJheUJ1ZmZlcih2YWx1ZSksXG4gICAgYnl0ZU9mZnNldDogdHlwZWRBcnJheUJ5dGVPZmZzZXQodmFsdWUpLFxuICAgIGJ5dGVMZW5ndGg6IHR5cGVkQXJyYXlCeXRlTGVuZ3RoKHZhbHVlKSxcbiAgfTtcbn1cblxuLy8gLS0tLSBIYXJkZW5lZCBkZXZhbHVlIG9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL1xuLy8gVGhlIHdvcmtmbG93IHJlZHVjZXJzIGNsYWltIG1vc3Qgc3BlY2lhbCB0eXBlcyBiZWZvcmUgZGV2YWx1ZSdzIGJ1aWx0LWluXG4vLyBoYW5kbGluZyBydW5zLCBzbyB0aGVzZSBvcGVyYXRpb25zIG1haW5seSBnb3Zlcm4gcGxhaW4gb2JqZWN0cywgYXJyYXlzLFxuLy8gYm94ZWQgcHJpbWl0aXZlcywgdGhlbmFibGUgcHJvYmVzLCBhbmQgY2xhc3NpZmljYXRpb24gKGB0YWdPZmApLCB3aGljaFxuLy8gcnVucyBmb3IgZXZlcnkgb2JqZWN0IHRoZSByZWR1Y2VycyBkaWQgbm90IGNsYWltLlxuXG5jb25zdCBLTk9XTl9WSUVXX1RBR1MgPSBuZXcgU2V0KFtcbiAgJ0ludDhBcnJheScsXG4gICdVaW50OEFycmF5JyxcbiAgJ1VpbnQ4Q2xhbXBlZEFycmF5JyxcbiAgJ0ludDE2QXJyYXknLFxuICAnVWludDE2QXJyYXknLFxuICAnRmxvYXQxNkFycmF5JyxcbiAgJ0ludDMyQXJyYXknLFxuICAnVWludDMyQXJyYXknLFxuICAnRmxvYXQzMkFycmF5JyxcbiAgJ0Zsb2F0NjRBcnJheScsXG4gICdCaWdJbnQ2NEFycmF5JyxcbiAgJ0JpZ1VpbnQ2NEFycmF5Jyxcbl0pO1xuXG4vKipcbiAqIFRhZ3MgdGhhdCB7QGxpbmsgYnJhbmRPZn0gZGVjaWRlcyBhdXRob3JpdGF0aXZlbHkuIElmIHRoZSBicmFuZCBjaGVjayBzYWlkXG4gKiBcIm5vdCBvbmUgb2YgdGhlc2VcIiB0aGVuIGEgYFN5bWJvbC50b1N0cmluZ1RhZ2AgY2xhaW1pbmcgb25lIGlzIGEgc3Bvb2YsIGFuZFxuICogaG9ub3VyaW5nIGl0IHdvdWxkIHJvdXRlIHRoZSB2YWx1ZSBpbnRvIGFuIGV4dHJhY3RvciB0aGF0IHJlcXVpcmVzIHRoZSByZWFsXG4gKiBpbnRlcm5hbCBzbG90IChgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2Agc2VtYW50aWNzIGxldCBhbnkgb2JqZWN0IGNsYWltXG4gKiBgW29iamVjdCBEYXRlXWApLiBVbmJyYW5kZWQgdmFsdWVzIHRoYXQgY2xhaW0gb25lIG9mIHRoZXNlIGFyZSBjbGFzc2lmaWVkXG4gKiBhcyBwbGFpbiBvYmplY3RzIGluc3RlYWQuXG4gKi9cbmNvbnN0IEJSQU5EX0RFQ0lERURfVEFHUyA9IG5ldyBTZXQoW1xuICAnRGF0ZScsXG4gICdSZWdFeHAnLFxuICAnTWFwJyxcbiAgJ1NldCcsXG4gICdBcnJheScsXG4gICdEYXRhVmlldycsXG4gICdBcnJheUJ1ZmZlcicsXG4gICdTaGFyZWRBcnJheUJ1ZmZlcicsXG4gICdOdW1iZXInLFxuICAnU3RyaW5nJyxcbiAgJ0Jvb2xlYW4nLFxuICAnQmlnSW50JyxcbiAgJ1VSTCcsXG4gICdVUkxTZWFyY2hQYXJhbXMnLFxuICAuLi5LTk9XTl9WSUVXX1RBR1MsXG5dKTtcblxuLyoqXG4gKiBDbGFzc2lmaWVzIGEgdmFsdWUgYnkgZW5naW5lIGJyYW5kLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIG5vIGJyYW5kXG4gKiBtYXRjaGVzICh0aGUgY2FsbGVyIGZhbGxzIGJhY2sgdG8gYFN5bWJvbC50b1N0cmluZ1RhZ2Agc2VtYW50aWNzKS5cbiAqL1xuZnVuY3Rpb24gYnJhbmRPZih2YWx1ZTogb2JqZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVzLmlzRGF0ZSh2YWx1ZSkpIHJldHVybiAnRGF0ZSc7XG4gIGlmICh0eXBlcy5pc1JlZ0V4cCh2YWx1ZSkpIHJldHVybiAnUmVnRXhwJztcbiAgaWYgKHR5cGVzLmlzTWFwKHZhbHVlKSkgcmV0dXJuICdNYXAnO1xuICBpZiAodHlwZXMuaXNTZXQodmFsdWUpKSByZXR1cm4gJ1NldCc7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuICdBcnJheSc7XG4gIGlmICh0eXBlcy5pc1R5cGVkQXJyYXkodmFsdWUpKSB7XG4gICAgY29uc3QgdGFnID0gdHlwZWRBcnJheVRhZyh2YWx1ZSk7XG4gICAgcmV0dXJuIHRhZyAhPT0gdW5kZWZpbmVkICYmIEtOT1dOX1ZJRVdfVEFHUy5oYXModGFnKSA/IHRhZyA6IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodHlwZXMuaXNEYXRhVmlldyh2YWx1ZSkpIHJldHVybiAnRGF0YVZpZXcnO1xuICBpZiAodHlwZXMuaXNBcnJheUJ1ZmZlcih2YWx1ZSkpIHJldHVybiAnQXJyYXlCdWZmZXInO1xuICBpZiAodHlwZXMuaXNTaGFyZWRBcnJheUJ1ZmZlcih2YWx1ZSkpIHJldHVybiAnU2hhcmVkQXJyYXlCdWZmZXInO1xuICBpZiAodHlwZXMuaXNOdW1iZXJPYmplY3QodmFsdWUpKSByZXR1cm4gJ051bWJlcic7XG4gIGlmICh0eXBlcy5pc1N0cmluZ09iamVjdCh2YWx1ZSkpIHJldHVybiAnU3RyaW5nJztcbiAgaWYgKHR5cGVzLmlzQm9vbGVhbk9iamVjdCh2YWx1ZSkpIHJldHVybiAnQm9vbGVhbic7XG4gIGlmICh0eXBlcy5pc0JpZ0ludE9iamVjdCh2YWx1ZSkpIHJldHVybiAnQmlnSW50JztcbiAgaWYgKGlzSW5zdGFuY2VPZlByb3RvdHlwZSh2YWx1ZSwgVVJMLnByb3RvdHlwZSkpIHJldHVybiAnVVJMJztcbiAgaWYgKGlzSW5zdGFuY2VPZlByb3RvdHlwZSh2YWx1ZSwgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZSkpIHtcbiAgICByZXR1cm4gJ1VSTFNlYXJjaFBhcmFtcyc7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZWFkcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB0aGUgd2F5IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCB3b3VsZCxcbiAqIGJ1dCB0aHJvdWdoIGRlc2NyaXB0b3JzOiBhIGRhdGEtcHJvcGVydHkgdGFnICh0aGUgY29tbW9uIGNhc2UsIGUuZy5cbiAqIFRlbXBvcmFsIHBvbHlmaWxscykgY29zdHMgbm8gd29ya2Zsb3ctY29kZSBleGVjdXRpb247IGFuIGFjY2Vzc29yIHRhZyBpc1xuICogaW52b2tlZCAoY29tcGF0KSBhbmQgcmVjb3JkZWQuXG4gKi9cbmZ1bmN0aW9uIHJlYWRUb1N0cmluZ1RhZyh2YWx1ZTogb2JqZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdGFnID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTeW1ib2wudG9TdHJpbmdUYWcpO1xuICByZXR1cm4gdHlwZW9mIHRhZyA9PT0gJ3N0cmluZycgPyB0YWcgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBoYXJkZW5lZFN0cmluZ2lmeU9wZXJhdGlvbnM6IFBhcnRpYWw8U3RyaW5naWZ5T3BlcmF0aW9ucz4gPSB7XG4gIHRhZ09mOiAodmFsdWU6IG9iamVjdCkgPT4ge1xuICAgIGlmIChpc1Byb3h5KHZhbHVlKSkge1xuICAgICAgLy8gQSBwcm94eSdzIGNsYXNzaWZpY2F0aW9uIGlzIGFuc3dlcmVkIGJ5IGl0cyB0cmFwcywgd2hpY2ggaXMgdGhlXG4gICAgICAvLyBvbmx5IGFjY2VzcyBwYXRoIHRoZXJlIGlzLiBSZWNvcmQgaXQgYW5kIHByZXNlcnZlIHRvZGF5J3NcbiAgICAgIC8vIGJlaGF2aW9yIGZvciBldmVyeXRoaW5nIGRvd25zdHJlYW0uXG4gICAgICByZWNvcmRQcm94eSh2YWx1ZSk7XG4gICAgICByZXR1cm4gZGVmYXVsdFN0cmluZ2lmeU9wZXJhdGlvbnMudGFnT2YodmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBicmFuZCA9IGJyYW5kT2YodmFsdWUpO1xuICAgIGlmIChicmFuZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYnJhbmQ7XG4gICAgLy8gTm8gZW5naW5lIGJyYW5kIG1hdGNoZWQuIEEgYFN5bWJvbC50b1N0cmluZ1RhZ2AgaXMgc3RpbGwgbWVhbmluZ2Z1bCBmb3JcbiAgICAvLyB0eXBlcyBkZXZhbHVlIGlkZW50aWZpZXMgdGhhdCB3YXkgKGBUZW1wb3JhbC4qYCksIGJ1dCBvbmUgbmFtaW5nIGFcbiAgICAvLyBicmFuZC1kZWNpZGVkIHR5cGUgaXMgYSBzcG9vZiBhbmQgaXMgaWdub3JlZC5cbiAgICBjb25zdCB0YWcgPSByZWFkVG9TdHJpbmdUYWcodmFsdWUpO1xuICAgIGlmICh0YWcgPT09IHVuZGVmaW5lZCB8fCBCUkFORF9ERUNJREVEX1RBR1MuaGFzKHRhZykpIHJldHVybiAnT2JqZWN0JztcbiAgICByZXR1cm4gdGFnO1xuICB9LFxuXG4gIGlzVGhlbmFibGU6ICh2YWx1ZTogeyB0aGVuPzogdW5rbm93biB9KSA9PiB7XG4gICAgaWYgKHR5cGVzLmlzUHJvbWlzZSh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0eXBlb2YgcmVhZFByb3BlcnR5KHZhbHVlLCAndGhlbicpID09PSAnZnVuY3Rpb24nO1xuICB9LFxuXG4gIHVuYm94OiAoYm94ZWQ6IG9iamVjdCkgPT4ge1xuICAgIGlmICh0eXBlcy5pc051bWJlck9iamVjdChib3hlZCkpIHJldHVybiBudW1iZXJWYWx1ZU9mKGJveGVkKTtcbiAgICBpZiAodHlwZXMuaXNTdHJpbmdPYmplY3QoYm94ZWQpKSByZXR1cm4gc3RyaW5nVmFsdWVPZihib3hlZCk7XG4gICAgaWYgKHR5cGVzLmlzQm9vbGVhbk9iamVjdChib3hlZCkpIHJldHVybiBib29sZWFuVmFsdWVPZihib3hlZCk7XG4gICAgcmV0dXJuIGJpZ0ludFZhbHVlT2YoYm94ZWQpO1xuICB9LFxuXG4gIHRvSVNPU3RyaW5nOiAoZGF0ZTogRGF0ZSkgPT5cbiAgICBOdW1iZXIuaXNOYU4oZGF0ZUdldERhdGUoZGF0ZSkpID8gJycgOiBkYXRlVG9JU09TdHJpbmcoZGF0ZSksXG5cbiAgdG9TdHJpbmdWYWx1ZTogKHZhbHVlOiBvYmplY3QpID0+IHtcbiAgICAvLyBSZWFjaGVkIGZvciBVUkwgLyBVUkxTZWFyY2hQYXJhbXMgKHdoZW4gdGhlIHJlZHVjZXJzIGRpZCBub3QgY2xhaW1cbiAgICAvLyB0aGVtLCBlLmcuIGluc3RhbmNlcyBvZiBhIGRpZmZlcmVudCByZWFsbSdzIGNsYXNzZXMpIGFuZCBmb3JcbiAgICAvLyB0b1N0cmluZ1RhZy1icmFuZGVkIG9iamVjdHMgbGlrZSBUZW1wb3JhbCBwb2x5ZmlsbHMsIHdob3NlIHN0cmluZ1xuICAgIC8vIGZvcm0gb25seSB0aGVpciBvd24gdG9TdHJpbmcoKSBjYW4gcHJvZHVjZS5cbiAgICBpZiAoaXNJbnN0YW5jZU9mUHJvdG90eXBlKHZhbHVlLCBVUkwucHJvdG90eXBlKSkge1xuICAgICAgcmV0dXJuIHVybEhyZWYodmFsdWUgYXMgVVJMKTtcbiAgICB9XG4gICAgaWYgKGlzSW5zdGFuY2VPZlByb3RvdHlwZSh2YWx1ZSwgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZSkpIHtcbiAgICAgIHJldHVybiB1cmxTZWFyY2hQYXJhbXNUb1N0cmluZyh2YWx1ZSBhcyBVUkxTZWFyY2hQYXJhbXMpO1xuICAgIH1cbiAgICByZWNvcmRHdWVzdENvZGUoXG4gICAgICAnbWV0aG9kJyxcbiAgICAgIGB0b1N0cmluZyAoJHtyZWFkVG9TdHJpbmdUYWcodmFsdWUpID8/ICd1bmtub3duJ30pYFxuICAgICk7XG4gICAgcmV0dXJuICh2YWx1ZSBhcyB7IHRvU3RyaW5nKCk6IHN0cmluZyB9KS50b1N0cmluZygpO1xuICB9LFxuXG4gIHJlZ0V4cEluZm86IChyZWdleHA6IFJlZ0V4cCkgPT4gKHtcbiAgICBzb3VyY2U6IHJlZ0V4cFNvdXJjZShyZWdleHApLFxuICAgIGZsYWdzOiByZWdFeHBGbGFncyhyZWdleHApLFxuICB9KSxcblxuICB2YWx1ZXNPZjogKHNldDogU2V0PHVua25vd24+KSA9PiBzZXRUb1ZhbHVlcyhzZXQpLFxuICBlbnRyaWVzT2Y6IChtYXA6IE1hcDx1bmtub3duLCB1bmtub3duPikgPT5cbiAgICBtYXBUb0VudHJpZXMobWFwKSBhcyBbdW5rbm93biwgdW5rbm93bl1bXSxcblxuICB2aWV3SW5mbzogKHZpZXc6IEFycmF5QnVmZmVyVmlldykgPT4ge1xuICAgIGNvbnN0IGluZm8gPSB2aWV3SW5mbyh2aWV3KTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uaW5mbyxcbiAgICAgIC8vIGRldmFsdWUgb25seSByZWFkcyBgbGVuZ3RoYCBmb3IgdHlwZWQtYXJyYXkgc3Vidmlld3M7IERhdGFWaWV3XG4gICAgICAvLyBzdWJ2aWV3cyBhcmUgZW5jb2RlZCBmcm9tIGBieXRlTGVuZ3RoYC5cbiAgICAgIGxlbmd0aDogdHlwZXMuaXNEYXRhVmlldyh2aWV3KSA/IDAgOiB0eXBlZEFycmF5TGVuZ3RoKHZpZXcpLFxuICAgICAgYnVmZmVyQnl0ZUxlbmd0aDogdHlwZXMuaXNTaGFyZWRBcnJheUJ1ZmZlcihpbmZvLmJ1ZmZlcilcbiAgICAgICAgPyBzaGFyZWRBcnJheUJ1ZmZlckJ5dGVMZW5ndGgoaW5mby5idWZmZXIpXG4gICAgICAgIDogYXJyYXlCdWZmZXJCeXRlTGVuZ3RoKGluZm8uYnVmZmVyKSxcbiAgICB9O1xuICB9LFxuXG4gIHNoYXBlT2Y6ICh2YWx1ZTogb2JqZWN0KSA9PiB7XG4gICAgaWYgKGlzUHJveHkodmFsdWUpKSByZWNvcmRQcm94eSh2YWx1ZSk7XG4gICAgcmV0dXJuIGRlZmF1bHRTdHJpbmdpZnlPcGVyYXRpb25zLnNoYXBlT2YodmFsdWUpO1xuICB9LFxuXG4gIGdldDogKHZhbHVlOiBvYmplY3QsIGtleTogc3RyaW5nIHwgbnVtYmVyKSA9PiByZWFkUHJvcGVydHkodmFsdWUsIGtleSksXG59O1xuIl19
|
|
538
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFyZGVuZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2VyaWFsaXphdGlvbi9oYXJkZW5lZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJDRztBQUVILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWxELE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQXNDckQsTUFBTSxDQUFDLE1BQU0saUNBQWlDLEdBQUcsQ0FBQyxDQUFDO0FBRW5ELGdGQUFnRjtBQUNoRiw4RUFBOEU7QUFDOUUsNkVBQTZFO0FBQzdFLGdCQUFnQjtBQUNoQixJQUFJLFdBQVcsR0FBMEIsSUFBSSxDQUFDO0FBQzlDLDhFQUE4RTtBQUM5RSxJQUFJLGVBQWUsR0FBMkIsSUFBSSxDQUFDO0FBRW5EOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLEtBQWlDLEVBQ2pDLEVBQVc7SUFFWCxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUM7SUFDbEMsTUFBTSxlQUFlLEdBQUcsZUFBZSxDQUFDO0lBQ3hDLFdBQVcsR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDO0lBQzVCLGVBQWUsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUMvQyxJQUFJLENBQUM7UUFDSCxPQUFPLEVBQUUsRUFBRSxDQUFDO0lBQ2QsQ0FBQztZQUFTLENBQUM7UUFDVCxXQUFXLEdBQUcsYUFBYSxDQUFDO1FBQzVCLGVBQWUsR0FBRyxlQUFlLENBQUM7SUFDcEMsQ0FBQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsaUZBQWlGO0FBQ2pGLGdGQUFnRjtBQUNoRiw4QkFBOEI7QUFDOUIsTUFBTSxlQUFlLEdBQUcsZUFBZSxDQUNyQyxxQ0FBcUMsRUFDckMsQ0FBQyxFQUNELEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxPQUFPLEVBQVUsRUFBRSxDQUFDLENBQ3ZDLENBQUM7QUFFRiwyREFBMkQ7QUFDM0QsTUFBTSxVQUFVLG9CQUFvQixDQUFtQixFQUFLO0lBQzFELGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUVELCtEQUErRDtBQUMvRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsRUFBVztJQUM1QyxPQUFPLE9BQU8sRUFBRSxLQUFLLFVBQVUsSUFBSSxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFZLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FDN0IsSUFBZ0MsRUFDaEMsTUFBZTtJQUVmLElBQUksQ0FBQyxXQUFXO1FBQUUsT0FBTztJQUN6QixXQUFXLENBQUMsZUFBZTtRQUN6QixDQUFDLFdBQVcsQ0FBQyxlQUFlLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDckUsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxpQ0FBaUMsRUFBRSxDQUFDO1FBQ3ZFLE9BQU87SUFDVCxDQUFDO0lBQ0QsTUFBTSxTQUFTLEdBQXVCLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDL0MsSUFBSSxNQUFNLEtBQUssU0FBUztRQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3BELFdBQVcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsU0FBUyxXQUFXLENBQUMsS0FBYTtJQUNoQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsZUFBZTtRQUFFLE9BQU87SUFDN0MsSUFBSSxlQUFlLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU87SUFDdkMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQixlQUFlLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDM0IsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixFQUFFO0FBQ0YsMEVBQTBFO0FBQzFFLDRFQUE0RTtBQUM1RSw0RUFBNEU7QUFDNUUsNkVBQTZFO0FBQzdFLGlFQUFpRTtBQUVqRSxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBTXRDLENBQUM7QUFFbkMsU0FBUyxXQUFXLENBQ2xCLFNBQWlCLEVBQ2pCLEdBQWdCO0lBRWhCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDO0lBQ3BFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUNELE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBMEIsQ0FBQztBQUN0RCxDQUFDO0FBRUQseUVBQXlFO0FBQ3pFLHdFQUF3RTtBQUV4RSx5REFBeUQ7QUFDekQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQy9ELGdDQUFnQztBQUNoQyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDL0Qsb0NBQW9DO0FBQ3BDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUN2RSx3Q0FBd0M7QUFDeEMsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBUyxNQUFNLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzVFLHVDQUF1QztBQUN2QyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFTLE1BQU0sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDMUUsc0VBQXNFO0FBQ3RFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLFdBQVcsQ0FDOUMsV0FBVyxDQUFDLFNBQVMsRUFDckIsWUFBWSxDQUNiLENBQUM7QUFFRixNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUN0RCxNQUFNLFNBQVMsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUNwRCxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1RCxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM1RCxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUM5RCxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQy9CLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBb0MsQ0FDdEQsQ0FBQztBQUVGLE1BQU0sbUJBQW1CLEdBQVcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDaEYsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUMvQixtQkFBbUIsRUFDbkIsTUFBTSxDQUFDLFdBQVcsQ0FDbkIsQ0FBQztBQUNGLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUNsQyxtQkFBbUIsRUFDbkIsUUFBUSxDQUNULENBQUM7QUFDRixNQUFNLG9CQUFvQixHQUFHLFdBQVcsQ0FDdEMsbUJBQW1CLEVBQ25CLFlBQVksQ0FDYixDQUFDO0FBQ0YsTUFBTSxvQkFBb0IsR0FBRyxXQUFXLENBQ3RDLG1CQUFtQixFQUNuQixZQUFZLENBQ2IsQ0FBQztBQUNGLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFTLG1CQUFtQixFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzVFLE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FDaEMsUUFBUSxDQUFDLFNBQVMsRUFDbEIsUUFBUSxDQUNULENBQUM7QUFDRixNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FDcEMsUUFBUSxDQUFDLFNBQVMsRUFDbEIsWUFBWSxDQUNiLENBQUM7QUFDRixNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FDcEMsUUFBUSxDQUFDLFNBQVMsRUFDbEIsWUFBWSxDQUNiLENBQUM7QUFDRixNQUFNLDJCQUEyQixHQUFHLFdBQVcsQ0FDN0MsaUJBQWlCLENBQUMsU0FBUyxFQUMzQixZQUFZLENBQ2IsQ0FBQztBQUVGLG9FQUFvRTtBQUNwRSxrRUFBa0U7QUFDbEUseUVBQXlFO0FBQ3pFLG9EQUFvRDtBQUNwRCxNQUFNLGVBQWUsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUN4RSxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQVMsR0FBRyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNqRSxNQUFNLDZCQUE2QixHQUFHLFdBQVcsQ0FDL0MsZUFBZSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQ25DLENBQUM7QUFFRixnRkFBZ0Y7QUFFaEYsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEtBQUssQ0FBQztBQUUxQixNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRWxFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILFNBQVMsZ0JBQWdCLENBQUMsTUFBYztJQUN0QyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNsQyx1RUFBdUU7SUFDdkUsa0VBQWtFO0lBQ2xFLHVFQUF1RTtJQUN2RSxzRUFBc0U7SUFDdEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUM7SUFDcEUsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUN4RSxPQUFPLENBQ0wsZ0JBQWdCLENBQUMsTUFBdUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQztRQUN2RSxPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxTQUFTLENBQ3RELENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQWMsRUFBRSxHQUFnQjtJQUMzRCxJQUNFLEtBQUssS0FBSyxJQUFJO1FBQ2QsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxDQUFDLEVBQzFELENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuQixXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkIsT0FBUSxLQUFzQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFJLE9BQU8sR0FBa0IsS0FBSyxDQUFDO0lBQ25DLE9BQU8sT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3hCLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDckIsOERBQThEO1lBQzlELFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyQixPQUFRLEtBQXNDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakUsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLElBQUksT0FBTyxJQUFJLFVBQVU7Z0JBQUUsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDO1lBQ25ELElBQUksVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUNuQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ3RDLGVBQWUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLENBQUM7Z0JBQ0QsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQyxDQUFDO1lBQ0QsT0FBTyxTQUFTLENBQUMsQ0FBQyx1QkFBdUI7UUFDM0MsQ0FBQztRQUNELE9BQU8sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxLQUFjLEVBQUUsR0FBZ0I7SUFDMUQsSUFDRSxLQUFLLEtBQUssSUFBSTtRQUNkLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLE9BQU8sS0FBSyxLQUFLLFVBQVUsQ0FBQyxFQUMxRCxDQUFDO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuQixXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkIsT0FBTyxHQUFHLElBQUssS0FBZ0IsQ0FBQztJQUNsQyxDQUFDO0lBRUQsSUFBSSxPQUFPLEdBQWtCLEtBQUssQ0FBQztJQUNuQyxPQUFPLE9BQU8sS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN4QixJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ3JCLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNyQixPQUFPLEdBQUcsSUFBSyxLQUFnQixDQUFDO1FBQ2xDLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDL0QsT0FBTyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsS0FBYyxFQUNkLFNBQTZCO0lBRTdCLElBQUksQ0FBQyxTQUFTO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDN0IsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUM5RCxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkMsSUFBSSxPQUFPLEdBQWtCLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0QsT0FBTyxPQUFPLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDeEIsSUFBSSxPQUFPLEtBQUssU0FBUztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3ZDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQztZQUFFLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQyxPQUFPLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsZ0ZBQWdGO0FBQ2hGLEVBQUU7QUFDRiw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLDZFQUE2RTtBQUM3RSwyREFBMkQ7QUFFM0QsbUNBQW1DO0FBQ25DLE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBVTtJQUNoQyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ25CLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFDcEIsQ0FBQztJQUNELE9BQU8sYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRCxvRUFBb0U7QUFDcEUsTUFBTSxVQUFVLHVCQUF1QixDQUFDLEtBQXNCO0lBQzVELElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbkIsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25CLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxPQUFPLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsS0FBYztJQUM3QyxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ25CLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUF1QixDQUFDO0lBQ2pELENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQXVCLENBQUM7QUFDM0QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUMxQixLQUE0QjtJQUU1QixPQUFPLENBQUMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQsZ0NBQWdDO0FBQ2hDLE1BQU0sVUFBVSxXQUFXLENBQUMsS0FBbUI7SUFDN0MsT0FBTyxDQUFDLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLEtBQXNCO0lBSzdDLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzVCLE9BQU87WUFDTCxNQUFNLEVBQUUsY0FBYyxDQUFDLEtBQUssQ0FBQztZQUM3QixVQUFVLEVBQUUsa0JBQWtCLENBQUMsS0FBSyxDQUFDO1lBQ3JDLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7U0FDdEMsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPO1FBQ0wsTUFBTSxFQUFFLGdCQUFnQixDQUFDLEtBQUssQ0FBQztRQUMvQixVQUFVLEVBQUUsb0JBQW9CLENBQUMsS0FBSyxDQUFDO1FBQ3ZDLFVBQVUsRUFBRSxvQkFBb0IsQ0FBQyxLQUFLLENBQUM7S0FDeEMsQ0FBQztBQUNKLENBQUM7QUFFRCxpRkFBaUY7QUFDakYsRUFBRTtBQUNGLDJFQUEyRTtBQUMzRSwwRUFBMEU7QUFDMUUseUVBQXlFO0FBQ3pFLG9EQUFvRDtBQUVwRCxNQUFNLGVBQWUsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUM5QixXQUFXO0lBQ1gsWUFBWTtJQUNaLG1CQUFtQjtJQUNuQixZQUFZO0lBQ1osYUFBYTtJQUNiLGNBQWM7SUFDZCxZQUFZO0lBQ1osYUFBYTtJQUNiLGNBQWM7SUFDZCxjQUFjO0lBQ2QsZUFBZTtJQUNmLGdCQUFnQjtDQUNqQixDQUFDLENBQUM7QUFFSDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNqQyxNQUFNO0lBQ04sUUFBUTtJQUNSLEtBQUs7SUFDTCxLQUFLO0lBQ0wsT0FBTztJQUNQLFVBQVU7SUFDVixhQUFhO0lBQ2IsbUJBQW1CO0lBQ25CLFFBQVE7SUFDUixRQUFRO0lBQ1IsU0FBUztJQUNULFFBQVE7SUFDUixLQUFLO0lBQ0wsaUJBQWlCO0lBQ2pCLEdBQUcsZUFBZTtDQUNuQixDQUFDLENBQUM7QUFFSDs7O0dBR0c7QUFDSCxTQUFTLE9BQU8sQ0FBQyxLQUFhO0lBQzVCLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLE1BQU0sQ0FBQztJQUN2QyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDM0MsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQ3JDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUNyQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDekMsSUFBSSxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDOUIsTUFBTSxHQUFHLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sR0FBRyxLQUFLLFNBQVMsSUFBSSxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN6RSxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sVUFBVSxDQUFDO0lBQy9DLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLGFBQWEsQ0FBQztJQUNyRCxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLG1CQUFtQixDQUFDO0lBQ2pFLElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUNqRCxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFDakQsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ25ELElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUNqRCxJQUFJLHFCQUFxQixDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDOUQsSUFBSSxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsZUFBZSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDNUQsT0FBTyxpQkFBaUIsQ0FBQztJQUMzQixDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxlQUFlLENBQUMsS0FBYTtJQUNwQyxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNwRCxPQUFPLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDbkQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFpQztJQUN2RSxLQUFLLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRTtRQUN2QixJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ25CLGtFQUFrRTtZQUNsRSw0REFBNEQ7WUFDNUQsc0NBQXNDO1lBQ3RDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQixPQUFPLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNqRCxDQUFDO1FBQ0QsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLElBQUksS0FBSyxLQUFLLFNBQVM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUN0QywwRUFBMEU7UUFDMUUscUVBQXFFO1FBQ3JFLGdEQUFnRDtRQUNoRCxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbkMsSUFBSSxHQUFHLEtBQUssU0FBUyxJQUFJLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFBRSxPQUFPLFFBQVEsQ0FBQztRQUN0RSxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxVQUFVLEVBQUUsQ0FBQyxLQUF5QixFQUFFLEVBQUU7UUFDeEMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3hDLE9BQU8sT0FBTyxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsQ0FBQztJQUMzRCxDQUFDO0lBRUQsS0FBSyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUU7UUFDdkIsSUFBSSxLQUFLLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztZQUFFLE9BQU8sYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdELElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUM7WUFBRSxPQUFPLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RCxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDO1lBQUUsT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0QsT0FBTyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELFdBQVcsRUFBRSxDQUFDLElBQVUsRUFBRSxFQUFFLENBQzFCLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQztJQUU5RCxhQUFhLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRTtRQUMvQixxRUFBcUU7UUFDckUsK0RBQStEO1FBQy9ELG9FQUFvRTtRQUNwRSw4Q0FBOEM7UUFDOUMsSUFBSSxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDaEQsT0FBTyxPQUFPLENBQUMsS0FBWSxDQUFDLENBQUM7UUFDL0IsQ0FBQztRQUNELElBQUkscUJBQXFCLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzVELE9BQU8sdUJBQXVCLENBQUMsS0FBd0IsQ0FBQyxDQUFDO1FBQzNELENBQUM7UUFDRCxlQUFlLENBQ2IsUUFBUSxFQUNSLGFBQWEsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLFNBQVMsR0FBRyxDQUNwRCxDQUFDO1FBQ0YsT0FBUSxLQUFnQyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRCxVQUFVLEVBQUUsQ0FBQyxNQUFjLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDL0IsTUFBTSxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDNUIsS0FBSyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUM7S0FDM0IsQ0FBQztJQUVGLFFBQVEsRUFBRSxDQUFDLEdBQWlCLEVBQUUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUM7SUFDakQsU0FBUyxFQUFFLENBQUMsR0FBMEIsRUFBRSxFQUFFLENBQ3hDLFlBQVksQ0FBQyxHQUFHLENBQXlCO0lBRTNDLFFBQVEsRUFBRSxDQUFDLElBQXFCLEVBQUUsRUFBRTtRQUNsQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsT0FBTztZQUNMLEdBQUcsSUFBSTtZQUNQLGlFQUFpRTtZQUNqRSwwQ0FBMEM7WUFDMUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1lBQzNELGdCQUFnQixFQUFFLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2dCQUN0RCxDQUFDLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQztnQkFDMUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7U0FDdkMsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRTtRQUN6QixJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsT0FBTywwQkFBMEIsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELEdBQUcsRUFBRSxDQUFDLEtBQWEsRUFBRSxHQUFvQixFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQztDQUN2RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBIYXJkZW5lZCBpbnRyb3NwZWN0aW9uIGZvciBzZXJpYWxpemluZyB2YWx1ZXMgdGhhdCBtYXkgb3JpZ2luYXRlIGluc2lkZSBhXG4gKiB3b3JrZmxvdyBWTSAoYG5vZGU6dm1gKSBzYW5kYm94IHJlYWxtLlxuICpcbiAqIFNlcmlhbGl6YXRpb24gcnVucyBvbiB0aGUgaG9zdCwgYnV0IHRoZSB2YWx1ZXMgaXQgaW5zcGVjdHMgd2VyZVxuICogY29uc3RydWN0ZWQgYnkgd29ya2Zsb3cgY29kZSwgc28gYSBuYWl2ZSBkeW5hbWljIG9wZXJhdGlvbiBsaWtlXG4gKiBgdmFsdWUudG9JU09TdHJpbmcoKWAsIGBBcnJheS5mcm9tKG1hcClgLCBvciBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2BcbiAqIGRpc3BhdGNoZXMgaW50byB0aGUgc2FuZGJveCByZWFsbSBhbmQgZXhlY3V0ZXMgd29ya2Zsb3cgY29kZSAocGF0Y2hlZFxuICogcHJvdG90eXBlIG1ldGhvZHMsIGdldHRlcnMsIHByb3h5IHRyYXBzLCBgU3ltYm9sLnRvU3RyaW5nVGFnYCBhY2Nlc3NvcnMpLlxuICogVGhhdCBpcyBhIGRldGVybWluaXNtIGhhemFyZDogc2VyaWFsaXphdGlvbiBoYXBwZW5zIGV4YWN0bHkgb25jZSBwZXJcbiAqIHBheWxvYWQgKG5ldmVyIGFnYWluIG9uIHJlcGxheSksIHNvIGFueSB3b3JrZmxvdy12aXNpYmxlIHNpZGUgZWZmZWN0IGl0XG4gKiB0cmlnZ2VycyBleGlzdHMgb25seSBvbiB0aGUgbGl2ZSBleGVjdXRpb24gcGF0aCBhbmQgZGl2ZXJnZXMgZnJvbSByZXBsYXkuXG4gKlxuICogVGhpcyBtb2R1bGUgbWFrZXMgc2VyaWFsaXphdGlvbiBzaWRlLWVmZmVjdCBmcmVlIHdoZXJldmVyIHRoZSBkYXRhIGFsbG93c1xuICogaXQsIGFuZCAqb2JzZXJ2YWJsZSogd2hlcmUgaXQgZG9lcyBub3Q6XG4gKlxuICogLSAqKkNsYXNzaWZpY2F0aW9uKiogdXNlcyBlbmdpbmUtbGV2ZWwgYnJhbmQgY2hlY2tzIChgbm9kZTp1dGlsYCBgdHlwZXNgLFxuICogICBpbnRlcm5hbC1zbG90IHByb2JlcykgaW5zdGVhZCBvZiBgaW5zdGFuY2VvZmAgLyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AsXG4gKiAgIHdoaWNoIG1ha2VzIGl0IGltbXVuZSB0byBgU3ltYm9sLmhhc0luc3RhbmNlYCwgYFN5bWJvbC50b1N0cmluZ1RhZ2AsIGFuZFxuICogICByZWFzc2lnbmVkIGdsb2JhbHMuXG4gKiAtICoqRXh0cmFjdGlvbioqIGdvZXMgdGhyb3VnaCBpbnRyaW5zaWNzIGNhcHR1cmVkIGF0IG1vZHVsZSBsb2FkIChob3N0XG4gKiAgIGJvb3QsIGJlZm9yZSBhbnkgd29ya2Zsb3cgY29kZSBydW5zKS4gSW50ZXJuYWwgc2xvdHMgYXJlIHJlYWxtLWFnbm9zdGljLFxuICogICBzbyBob3N0IGludHJpbnNpY3MgcmVhZCBWTS1yZWFsbSBvYmplY3RzIHdpdGhvdXQgdG91Y2hpbmcgdGhlIHNhbmRib3gnc1xuICogICAocGF0Y2hhYmxlKSBwcm90b3R5cGVzLlxuICogLSAqKlByb3BlcnR5IGFjY2VzcyoqIHJlYWRzIHRocm91Z2ggZGVzY3JpcHRvcnMsIHNvIHBsYWluIGRhdGEgbmV2ZXJcbiAqICAgaW52b2tlcyBhbnl0aGluZy4gV2hlcmUgd29ya2Zsb3cgY29kZSAqbXVzdCogcnVuIGJlY2F1c2UgdGhlIGRhdGEgaXRzZWxmXG4gKiAgIGxpdmVzIGJlaGluZCBpdCAoZ2V0dGVycywgcHJveGllcywgY3VzdG9tIGBbV09SS0ZMT1dfU0VSSUFMSVpFXWBcbiAqICAgbWV0aG9kcywgYHRvU3RyaW5nKClgIG9uIHRvU3RyaW5nVGFnLWJyYW5kZWQgb2JqZWN0cyBzdWNoIGFzIFRlbXBvcmFsXG4gKiAgIHBvbHlmaWxscyksIHRoZSBleGVjdXRpb24gaXMgcHJlc2VydmVkIGZvciBjb21wYXRpYmlsaXR5IGFuZCByZWNvcmRlZFxuICogICBpbiB0aGUgYWN0aXZlIHtAbGluayBHdWVzdENvZGVTdGF0c30gc2luaywgc28gY2FsbGVycyAoZS5nLiBhIHJldGFpbmVkLVZNXG4gKiAgIGdhdGUpIGNhbiByZWFjdC5cbiAqXG4gKiAqKlJlY29yZGluZyBpcyBub3QgcHJldmVudGlvbi4qKiBGb3IgdGhlIHJlY29yZGVkIGNhc2VzIHRoZSBkZXRlcm1pbmlzbVxuICogaGF6YXJkIGlzIHN0aWxsIGxpdmU6IGEgZ2V0dGVyIHRoYXQgY2FsbHMgYE1hdGgucmFuZG9tKClgIGFkdmFuY2VzIHRoZVxuICogcnVuJ3Mgc2VlZGVkIFBSTkcgZHVyaW5nIHNlcmlhbGl6YXRpb24sIGFuZCBiZWNhdXNlIHNlcmlhbGl6YXRpb24gaGFwcGVuc1xuICogZXhhY3RseSBvbmNlIGFuZCBpcyBuZXZlciByZXBsYXllZCwgZXZlcnkgc3Vic2VxdWVudCBkcmF3IChpbmNsdWRpbmcgdGhlXG4gKiBjb3JyZWxhdGlvbiBpZHMgZGVyaXZlZCBmcm9tIHRoYXQgc3RyZWFtKSBzaGlmdHMgcmVsYXRpdmUgdG8gcmVwbGF5LiBUaGVcbiAqIHJlcG9ydCBpcyB0aGUgb25seSB0cmFjZSBvZiB0aGF0OyBhY3Rpbmcgb24gaXQgKHdhcm5pbmcsIGRlbW90aW5nIGFcbiAqIHJldGFpbmVkIFZNIHRvIHJlcGxheSkgaXMgbGVmdCB0byB0aGUgY2FsbGVyLlxuICpcbiAqIFRoZSByZWNvcmRlciBpcyBhbWJpZW50IG1vZHVsZSBzdGF0ZSwgc2V0IGZvciB0aGUgZHVyYXRpb24gb2YgYVxuICogc3luY2hyb25vdXMgYHN0cmluZ2lmeWAgY2FsbCB2aWEge0BsaW5rIHdpdGhHdWVzdENvZGVTdGF0c30uIGRldmFsdWUnc1xuICogYHN0cmluZ2lmeWAgaXMgZnVsbHkgc3luY2hyb25vdXMsIHNvIHRoaXMgaXMgc2FmZSB3aXRob3V0IGFzeW5jIGNvbnRleHQuXG4gKi9cblxuaW1wb3J0IHsgdHlwZXMgfSBmcm9tICdub2RlOnV0aWwnO1xuaW1wb3J0IHsgZ2xvYmFsU2luZ2xldG9uIH0gZnJvbSAnQHdvcmtmbG93L3V0aWxzJztcbmltcG9ydCB0eXBlIHsgU3RyaW5naWZ5T3BlcmF0aW9ucyB9IGZyb20gJ2RldmFsdWUnO1xuaW1wb3J0IHsgZGVmYXVsdFN0cmluZ2lmeU9wZXJhdGlvbnMgfSBmcm9tICdkZXZhbHVlJztcblxuLy8gLS0tLSBHdWVzdCBjb2RlIG9ic2VydmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBBIHNpbmdsZSBpbnN0YW5jZSBvZiB3b3JrZmxvdyAoZ3Vlc3QpIGNvZGUgZXhlY3V0aW5nIGR1cmluZyBzZXJpYWxpemF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEd1ZXN0Q29kZUV4ZWN1dGlvbiB7XG4gIC8qKlxuICAgKiBXaGF0IGZvcmNlZCB0aGUgZXhlY3V0aW9uOlxuICAgKiAtIGBnZXR0ZXJgOiBhbiBhY2Nlc3NvciBwcm9wZXJ0eSB3YXMgaW52b2tlZCB0byByZWFkIGRhdGFcbiAgICogLSBgcHJveHlgOiBhIHByb3h5IHdhcyBpbnRyb3NwZWN0ZWQsIGZpcmluZyBpdHMgdHJhcHMuIE5vdGUgdGhpcyBhbHNvXG4gICAqICAgaW1wbGllcyBhICoqc2hhcGUgY2hhbmdlKio6IGJyYW5kIGNoZWNrcyBhbnN3ZXIgXCJub3QgdGhhdCB0eXBlXCIgZm9yIGFcbiAgICogICBwcm94eSwgc28gYSBwcm94aWVkIGBNYXBgIHNlcmlhbGl6ZXMgYXMgYSBwbGFpbiBvYmplY3QgcmF0aGVyIHRoYW4gYXMgYVxuICAgKiAgIGBNYXBgLCBhbmQgdGhpcyByZXBvcnQgaXMgdGhlIG9ubHkgZXZpZGVuY2Ugb2YgaXQuIChTdWNoIHZhbHVlcyB3ZXJlXG4gICAqICAgbmV2ZXIgc2VyaWFsaXphYmxlIGJlZm9yZSwgc2luY2UgdGhlIGludGVybmFsLXNsb3QgcmVhZHMgaW4gdGhlIHByZXZpb3VzXG4gICAqICAgaW1wbGVtZW50YXRpb24gdGhyZXcgb24gdGhlbSwgc28gdGhlIHNoYXBlIGNoYW5nZSByZXBsYWNlcyBhIGNyYXNoLFxuICAgKiAgIGJ1dCBpdCBpcyBzaWxlbnQuKVxuICAgKiAtIGBtZXRob2RgOiBhIHdvcmtmbG93LWRlZmluZWQgZnVuY3Rpb24gd2FzIGludm9rZWQgKGUuZy4gYSBjdXN0b21cbiAgICogICBgW1dPUktGTE9XX1NFUklBTElaRV1gIHNlcmlhbGl6ZXIsIGB0b1N0cmluZygpYCBvbiBhXG4gICAqICAgYFN5bWJvbC50b1N0cmluZ1RhZ2AtYnJhbmRlZCBvYmplY3QsIGEgZHVjay10eXBlZCBgZ2V0VGltZSgpYCwgb3IgYVxuICAgKiAgIGBfX2Nsb3N1cmVWYXJzRm5gIHRoaXMgcGFja2FnZSBkaWQgbm90IGdlbmVyYXRlKVxuICAgKi9cbiAga2luZDogJ2dldHRlcicgfCAncHJveHknIHwgJ21ldGhvZCc7XG4gIC8qKiBCZXN0LWVmZm9ydCBjb250ZXh0OiB0aGUgcHJvcGVydHkga2V5LCBtZXRob2QgbmFtZSwgb3IgdGFnIGludm9sdmVkLiAqL1xuICBkZXRhaWw/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogTXV0YWJsZSBzaW5rIHJlY29yZGluZyB3b3JrZmxvdy1jb2RlIGV4ZWN1dGlvbiBzZXJpYWxpemF0aW9uIGNvdWxkIG5vdFxuICogYXZvaWQuIGBleGVjdXRpb25zYCBjb250YWlucyB0aGUgZmlyc3QgZml2ZSBzYW1wbGVzIGFuZCBgdG90YWxFeGVjdXRpb25zYFxuICogaXMgdGhlIGV4YWN0IGNvdW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEd1ZXN0Q29kZVN0YXRzIHtcbiAgZXhlY3V0aW9uczogR3Vlc3RDb2RlRXhlY3V0aW9uW107XG4gIHRvdGFsRXhlY3V0aW9ucz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IEdVRVNUX0NPREVfRVhFQ1VUSU9OX1NBTVBMRV9MSU1JVCA9IDU7XG5cbi8vIHBlci1jb3B5LW9rOiBib3RoIGFyZSBzZXQgYW5kIGNsZWFyZWQgYnkgYHdpdGhHdWVzdENvZGVTdGF0c2AgYXJvdW5kIGEgc2luZ2xlXG4vLyBzeW5jaHJvbm91cyBjYWxsLCBzbyB0aGUgc2luayBpcyBvbmx5IGV2ZXIgcmVhZCBieSB0aGUgc2FtZSBjb3B5IHRoYXQgYXJtZWRcbi8vIGl0LiBBIHNoYXJlZCBzbG90IHdvdWxkIGxldCB0d28gY29waWVzIHJlY29yZGluZyBjb25jdXJyZW50bHkgY2xvYmJlciBlYWNoXG4vLyBvdGhlcidzIHNpbmsuXG5sZXQgYWN0aXZlU3RhdHM6IEd1ZXN0Q29kZVN0YXRzIHwgbnVsbCA9IG51bGw7XG4vLyBwZXItY29weS1vazogc2FtZSBzY29wZSBhcyBgYWN0aXZlU3RhdHNgIGFib3ZlLCBhcm1lZCBhbmQgY2xlYXJlZCB0b2dldGhlci5cbmxldCByZXBvcnRlZFByb3hpZXM6IFdlYWtTZXQ8b2JqZWN0PiB8IG51bGwgPSBudWxsO1xuXG4vKipcbiAqIFJ1bnMgYGZuYCAoc3luY2hyb25vdXNseSkgd2l0aCBgc3RhdHNgIGFzIHRoZSBhY3RpdmUgZ3Vlc3QtY29kZSBzaW5rLlxuICogTmVzdGVkIGNhbGxzIHN0YWNrIGNvcnJlY3RseTsgYSBgbnVsbGAvYHVuZGVmaW5lZGAgc2luayBkaXNhYmxlc1xuICogcmVjb3JkaW5nIHdpdGhvdXQgZGlzYWJsaW5nIGhhcmRlbmluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhHdWVzdENvZGVTdGF0czxUPihcbiAgc3RhdHM6IEd1ZXN0Q29kZVN0YXRzIHwgdW5kZWZpbmVkLFxuICBmbjogKCkgPT4gVFxuKTogVCB7XG4gIGNvbnN0IHByZXZpb3VzU3RhdHMgPSBhY3RpdmVTdGF0cztcbiAgY29uc3QgcHJldmlvdXNQcm94aWVzID0gcmVwb3J0ZWRQcm94aWVzO1xuICBhY3RpdmVTdGF0cyA9IHN0YXRzID8/IG51bGw7XG4gIHJlcG9ydGVkUHJveGllcyA9IHN0YXRzID8gbmV3IFdlYWtTZXQoKSA6IG51bGw7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgYWN0aXZlU3RhdHMgPSBwcmV2aW91c1N0YXRzO1xuICAgIHJlcG9ydGVkUHJveGllcyA9IHByZXZpb3VzUHJveGllcztcbiAgfVxufVxuXG4vKipcbiAqIENsb3N1cmUtdmFyaWFibGUgZnVuY3Rpb25zIHRoYXQgYXJyaXZlZCB0aHJvdWdoIGB1c2VTdGVwYCB3aGVuIGEgc3RlcFxuICogcHJveHkgd2FzIGJ1aWx0LiBUaGUgc3RlcC1mdW5jdGlvbiByZWR1Y2VyIG11c3QgaW52b2tlIGBfX2Nsb3N1cmVWYXJzRm5gLFxuICogYW5kIHRoZSBjb21waWxlci1nZW5lcmF0ZWQgZnVuY3Rpb24gaXMgYSBwdXJlIHNlcXVlbmNlIG9mIGxleGljYWwgcmVhZHMuXG4gKiBCdXQgdGhlICpwcm9wZXJ0eSogaXMgcmVhY2hhYmxlIGZyb20gd29ya2Zsb3cgY29kZSwgd2hpY2ggY2FuIHJlcGxhY2UgaXRcbiAqIHdpdGggYW4gYXJiaXRyYXJ5IGZ1bmN0aW9uLiBUaGUgcmVkdWNlciBjaGVja3MgbWVtYmVyc2hpcCBoZXJlIGluc3RlYWQgb2ZcbiAqIGFzc3VtaW5nIHByb3ZlbmFuY2UsIGFuZCByZXBvcnRzIGFueXRoaW5nIGl0IGRvZXMgbm90IHJlY29nbml6ZS5cbiAqXG4gKiBNZW1iZXJzaGlwIHByb3ZlcyB0aGUgZnVuY3Rpb24gd2FzIHBhc3NlZCB0byBgdXNlU3RlcGAsIG5vdCB0aGF0IHRoZVxuICogY29tcGlsZXIgZ2VuZXJhdGVkIGl0OiB3b3JrZmxvdyBjb2RlIGNhbiBjYWxsIGB1c2VTdGVwYCBkaXJlY3RseSBhbmRcbiAqIGxhdW5kZXIgYSBzaWRlLWVmZmVjdGZ1bCBmdW5jdGlvbiBwYXN0IHRoZSByZXBvcnQuIFRoYXQgY29zdHMgYSBtaXNzaW5nXG4gKiByZXBvcnQgZW50cnksIG5ldmVyIGluY29ycmVjdCBvdXRwdXQ7IGNsb3NpbmcgaXQgbWVhbnMgYnJhbmRpbmcgYXQgdGhlXG4gKiBjb21waWxlciwgd2hpY2ggZG9lcyBub3QgYmVsb25nIGhlcmUuXG4gKi9cbi8vIE9uIGBnbG9iYWxUaGlzYCAoc2VlIGBnbG9iYWxTaW5nbGV0b25gKTogZnVuY3Rpb25zIGNyb3NzIG1vZHVsZSBjb3BpZXMgZnJlZWx5LFxuLy8gc28gYSBjbG9zdXJlIG1hcmtlZCBieSBvbmUgY29weSB3b3VsZCBub3QgYmUgcmVjb2duaXplZCBieSBhbm90aGVyLCBjb3N0aW5nIGFcbi8vIHJlcG9ydCBlbnRyeSBmb3Igbm8gcmVhc29uLlxuY29uc3QgdXNlU3RlcENsb3N1cmVzID0gZ2xvYmFsU2luZ2xldG9uKFxuICAnQHdvcmtmbG93L2NvcmUvL3VzZVN0ZXBDbG9zdXJlcy5mbnMnLFxuICAxLFxuICAoKSA9PiAoeyBmbnM6IG5ldyBXZWFrU2V0PG9iamVjdD4oKSB9KVxuKTtcblxuLyoqIE1hcmtzIGEgZnVuY3Rpb24gYXMgaGF2aW5nIGJlZW4gcGFzc2VkIHRvIGB1c2VTdGVwYC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXJrVXNlU3RlcENsb3N1cmVGbjxUIGV4dGVuZHMgb2JqZWN0PihmbjogVCk6IFQge1xuICB1c2VTdGVwQ2xvc3VyZXMuZm5zLmFkZChmbik7XG4gIHJldHVybiBmbjtcbn1cblxuLyoqIFdoZXRoZXIgYGZuYCB3YXMgbWFya2VkIGJ5IHtAbGluayBtYXJrVXNlU3RlcENsb3N1cmVGbn0uICovXG5leHBvcnQgZnVuY3Rpb24gaXNVc2VTdGVwQ2xvc3VyZUZuKGZuOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgJiYgdXNlU3RlcENsb3N1cmVzLmZucy5oYXMoZm4gYXMgb2JqZWN0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZEd1ZXN0Q29kZShcbiAga2luZDogR3Vlc3RDb2RlRXhlY3V0aW9uWydraW5kJ10sXG4gIGRldGFpbD86IHN0cmluZ1xuKTogdm9pZCB7XG4gIGlmICghYWN0aXZlU3RhdHMpIHJldHVybjtcbiAgYWN0aXZlU3RhdHMudG90YWxFeGVjdXRpb25zID1cbiAgICAoYWN0aXZlU3RhdHMudG90YWxFeGVjdXRpb25zID8/IGFjdGl2ZVN0YXRzLmV4ZWN1dGlvbnMubGVuZ3RoKSArIDE7XG4gIGlmIChhY3RpdmVTdGF0cy5leGVjdXRpb25zLmxlbmd0aCA+PSBHVUVTVF9DT0RFX0VYRUNVVElPTl9TQU1QTEVfTElNSVQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgZXhlY3V0aW9uOiBHdWVzdENvZGVFeGVjdXRpb24gPSB7IGtpbmQgfTtcbiAgaWYgKGRldGFpbCAhPT0gdW5kZWZpbmVkKSBleGVjdXRpb24uZGV0YWlsID0gZGV0YWlsO1xuICBhY3RpdmVTdGF0cy5leGVjdXRpb25zLnB1c2goZXhlY3V0aW9uKTtcbn1cblxuLyoqIFJlY29yZHMgYSBwcm94eSBvbmNlIHBlciBzZXJpYWxpemF0aW9uIHBhc3MgKHByb3hpZXMgZmlyZSBtYW55IHRyYXBzKS4gKi9cbmZ1bmN0aW9uIHJlY29yZFByb3h5KHZhbHVlOiBvYmplY3QpOiB2b2lkIHtcbiAgaWYgKCFhY3RpdmVTdGF0cyB8fCAhcmVwb3J0ZWRQcm94aWVzKSByZXR1cm47XG4gIGlmIChyZXBvcnRlZFByb3hpZXMuaGFzKHZhbHVlKSkgcmV0dXJuO1xuICByZXBvcnRlZFByb3hpZXMuYWRkKHZhbHVlKTtcbiAgcmVjb3JkR3Vlc3RDb2RlKCdwcm94eScpO1xufVxuXG4vLyAtLS0tIENhcHR1cmVkIGludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy9cbi8vIENhcHR1cmVkIGF0IG1vZHVsZSBsb2FkIChob3N0IGJvb3QsIGJlZm9yZSBhbnkgd29ya2Zsb3cgYnVuZGxlIGNhbiBydW4pXG4vLyBhbmQgaW52b2tlZCB3aXRoIGV4cGxpY2l0IHJlY2VpdmVycywgc28gbm8gbG9va3VwIGV2ZXIgcmVzb2x2ZXMgdGhyb3VnaCBhXG4vLyBzYW5kYm94LXJlYWNoYWJsZSBwcm90b3R5cGUuIEV2ZXJ5IG1lbWJlciBiZWxvdyBleGlzdHMgb24gZXZlcnkgc3VwcG9ydGVkXG4vLyBlbmdpbmUgKE5vZGUgMTgrKSwgc28gYSBtaXNzaW5nIG9uZSBpcyBhIGJ1ZyBpbiB0aGlzIHRhYmxlOiBmYWlsIGF0IGltcG9ydFxuLy8gcmF0aGVyIHRoYW4gc2VyaWFsaXplIHRocm91Z2ggYSBsaXZlIChwYXRjaGFibGUpIGxvb2t1cCBsYXRlci5cblxuY29uc3QgdW5jdXJyeVRoaXMgPSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZC5iaW5kKEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsKSBhcyA8XG4gIFQsXG4gIEEgZXh0ZW5kcyB1bmtub3duW10sXG4gIFIsXG4+KFxuICBmbjogKHRoaXM6IFQsIC4uLmFyZ3M6IEEpID0+IFJcbikgPT4gKHRoaXNBcmc6IFQsIC4uLmFyZ3M6IEEpID0+IFI7XG5cbmZ1bmN0aW9uIHByb3RvR2V0dGVyPFQ+KFxuICBwcm90b3R5cGU6IG9iamVjdCxcbiAga2V5OiBQcm9wZXJ0eUtleVxuKTogKHZhbHVlOiB1bmtub3duKSA9PiBUIHtcbiAgY29uc3QgZ2V0dGVyID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90b3R5cGUsIGtleSk/LmdldDtcbiAgaWYgKCFnZXR0ZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgaW50cmluc2ljIGdldHRlcjogJHtTdHJpbmcoa2V5KX1gKTtcbiAgfVxuICByZXR1cm4gdW5jdXJyeVRoaXMoZ2V0dGVyKSBhcyAodmFsdWU6IHVua25vd24pID0+IFQ7XG59XG5cbi8vIEVDTUFTY3JpcHQgaW50cmluc2ljcy4gQWxsIHJlYWQgaW50ZXJuYWwgc2xvdHMsIHNvIHRoZXkgd29yayBvbiB2YWx1ZXNcbi8vIGZyb20gYW55IHJlYWxtIGFuZCBhcmUgdW5hZmZlY3RlZCBieSBwcm90b3R5cGUgcGF0Y2hpbmcgaW4gYW55IHJlYWxtLlxuXG4vKiogYERhdGUucHJvdG90eXBlLmdldERhdGVgLCBmb3IgaW52YWxpZC1kYXRlIGNoZWNrcy4gKi9cbmV4cG9ydCBjb25zdCBkYXRlR2V0RGF0ZSA9IHVuY3VycnlUaGlzKERhdGUucHJvdG90eXBlLmdldERhdGUpO1xuLyoqIGBEYXRlLnByb3RvdHlwZS5nZXRUaW1lYC4gKi9cbmV4cG9ydCBjb25zdCBkYXRlR2V0VGltZSA9IHVuY3VycnlUaGlzKERhdGUucHJvdG90eXBlLmdldFRpbWUpO1xuLyoqIGBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZ2AuICovXG5leHBvcnQgY29uc3QgZGF0ZVRvSVNPU3RyaW5nID0gdW5jdXJyeVRoaXMoRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcpO1xuLyoqIGBSZWdFeHAucHJvdG90eXBlLnNvdXJjZWAgZ2V0dGVyLiAqL1xuZXhwb3J0IGNvbnN0IHJlZ0V4cFNvdXJjZSA9IHByb3RvR2V0dGVyPHN0cmluZz4oUmVnRXhwLnByb3RvdHlwZSwgJ3NvdXJjZScpO1xuLyoqIGBSZWdFeHAucHJvdG90eXBlLmZsYWdzYCBnZXR0ZXIuICovXG5leHBvcnQgY29uc3QgcmVnRXhwRmxhZ3MgPSBwcm90b0dldHRlcjxzdHJpbmc+KFJlZ0V4cC5wcm90b3R5cGUsICdmbGFncycpO1xuLyoqIGBBcnJheUJ1ZmZlci5wcm90b3R5cGUuYnl0ZUxlbmd0aGAgZ2V0dGVyIChpbnRlcm5hbCBzbG90IHJlYWQpLiAqL1xuZXhwb3J0IGNvbnN0IGFycmF5QnVmZmVyQnl0ZUxlbmd0aCA9IHByb3RvR2V0dGVyPG51bWJlcj4oXG4gIEFycmF5QnVmZmVyLnByb3RvdHlwZSxcbiAgJ2J5dGVMZW5ndGgnXG4pO1xuXG5jb25zdCBtYXBFbnRyaWVzID0gdW5jdXJyeVRoaXMoTWFwLnByb3RvdHlwZS5lbnRyaWVzKTtcbmNvbnN0IHNldFZhbHVlcyA9IHVuY3VycnlUaGlzKFNldC5wcm90b3R5cGUudmFsdWVzKTtcbmNvbnN0IG51bWJlclZhbHVlT2YgPSB1bmN1cnJ5VGhpcyhOdW1iZXIucHJvdG90eXBlLnZhbHVlT2YpO1xuY29uc3Qgc3RyaW5nVmFsdWVPZiA9IHVuY3VycnlUaGlzKFN0cmluZy5wcm90b3R5cGUudmFsdWVPZik7XG5jb25zdCBib29sZWFuVmFsdWVPZiA9IHVuY3VycnlUaGlzKEJvb2xlYW4ucHJvdG90eXBlLnZhbHVlT2YpO1xuY29uc3QgYmlnSW50VmFsdWVPZiA9IHVuY3VycnlUaGlzKFxuICBCaWdJbnQucHJvdG90eXBlLnZhbHVlT2YgYXMgKHRoaXM6IHVua25vd24pID0+IGJpZ2ludFxuKTtcblxuY29uc3QgVHlwZWRBcnJheVByb3RvdHlwZTogb2JqZWN0ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUYWcgPSBwcm90b0dldHRlcjxzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBUeXBlZEFycmF5UHJvdG90eXBlLFxuICBTeW1ib2wudG9TdHJpbmdUYWdcbik7XG5jb25zdCB0eXBlZEFycmF5QnVmZmVyID0gcHJvdG9HZXR0ZXI8QXJyYXlCdWZmZXJMaWtlPihcbiAgVHlwZWRBcnJheVByb3RvdHlwZSxcbiAgJ2J1ZmZlcidcbik7XG5jb25zdCB0eXBlZEFycmF5Qnl0ZU9mZnNldCA9IHByb3RvR2V0dGVyPG51bWJlcj4oXG4gIFR5cGVkQXJyYXlQcm90b3R5cGUsXG4gICdieXRlT2Zmc2V0J1xuKTtcbmNvbnN0IHR5cGVkQXJyYXlCeXRlTGVuZ3RoID0gcHJvdG9HZXR0ZXI8bnVtYmVyPihcbiAgVHlwZWRBcnJheVByb3RvdHlwZSxcbiAgJ2J5dGVMZW5ndGgnXG4pO1xuY29uc3QgdHlwZWRBcnJheUxlbmd0aCA9IHByb3RvR2V0dGVyPG51bWJlcj4oVHlwZWRBcnJheVByb3RvdHlwZSwgJ2xlbmd0aCcpO1xuY29uc3QgZGF0YVZpZXdCdWZmZXIgPSBwcm90b0dldHRlcjxBcnJheUJ1ZmZlckxpa2U+KFxuICBEYXRhVmlldy5wcm90b3R5cGUsXG4gICdidWZmZXInXG4pO1xuY29uc3QgZGF0YVZpZXdCeXRlT2Zmc2V0ID0gcHJvdG9HZXR0ZXI8bnVtYmVyPihcbiAgRGF0YVZpZXcucHJvdG90eXBlLFxuICAnYnl0ZU9mZnNldCdcbik7XG5jb25zdCBkYXRhVmlld0J5dGVMZW5ndGggPSBwcm90b0dldHRlcjxudW1iZXI+KFxuICBEYXRhVmlldy5wcm90b3R5cGUsXG4gICdieXRlTGVuZ3RoJ1xuKTtcbmNvbnN0IHNoYXJlZEFycmF5QnVmZmVyQnl0ZUxlbmd0aCA9IHByb3RvR2V0dGVyPG51bWJlcj4oXG4gIFNoYXJlZEFycmF5QnVmZmVyLnByb3RvdHlwZSxcbiAgJ2J5dGVMZW5ndGgnXG4pO1xuXG4vLyBIb3N0IChXSEFUV0cpIGNsYXNzZXMuIEluamVjdGVkIGludG8gdGhlIHNhbmRib3ggYnkgcmVmZXJlbmNlLCBzb1xuLy8gaW5zdGFuY2VzIGZyb20gYW55IHJlYWxtIGNhcnJ5IHRoZXNlIHByb3RvdHlwZXMsIGFuZCB0aGUgc2hhcmVkXG4vLyBwcm90b3R5cGVzIGFyZSByZWFjaGFibGUgZnJvbSB3b3JrZmxvdyBjb2RlLCB3aGljaCBtYWtlcyB0aGUgYm9vdC10aW1lXG4vLyBjYXB0dXJlIChyYXRoZXIgdGhhbiBhIGxpdmUgbG9va3VwKSBsb2FkLWJlYXJpbmcuXG5jb25zdCBoZWFkZXJzSXRlcmF0b3IgPSB1bmN1cnJ5VGhpcyhIZWFkZXJzLnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdKTtcbmNvbnN0IHVybEhyZWZHZXR0ZXIgPSBwcm90b0dldHRlcjxzdHJpbmc+KFVSTC5wcm90b3R5cGUsICdocmVmJyk7XG5jb25zdCB1cmxTZWFyY2hQYXJhbXNUb1N0cmluZ01ldGhvZCA9IHVuY3VycnlUaGlzKFxuICBVUkxTZWFyY2hQYXJhbXMucHJvdG90eXBlLnRvU3RyaW5nXG4pO1xuXG4vLyAtLS0tIFNhZmUgYWNjZXNzIHByaW1pdGl2ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCB7IGlzUHJveHkgfSA9IHR5cGVzO1xuXG5jb25zdCBmdW5jdGlvblRvU3RyaW5nID0gdW5jdXJyeVRoaXMoRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nKTtcblxuLyoqXG4gKiBXaGV0aGVyIGFuIGFjY2Vzc29yIGlzIHByb3ZpZGVkIGJ5IHRoZSBlbmdpbmUgb3IgdGhlIGhvc3QsIHJhdGhlciB0aGFuXG4gKiBkZWZpbmVkIGJ5IHdvcmtmbG93IGNvZGUuIFNlcmlhbGl6YXRpb24gbXVzdCByZWFkIHNvbWUgcHJvcGVydGllcyB0aGF0IGFyZVxuICogYWNjZXNzb3JzIGJ5IGNvbnN0cnVjdGlvbiAoVjggZGVmaW5lcyBgc3RhY2tgIGFzIGFuIG93biBhY2Nlc3NvciBvbiBldmVyeVxuICogRXJyb3IgaW5zdGFuY2U7IE5vZGUgaW1wbGVtZW50cyBgRE9NRXhjZXB0aW9uLnByb3RvdHlwZS5tZXNzYWdlYCBpblxuICogSmF2YVNjcmlwdCksIGFuZCByZXBvcnRpbmcgdGhvc2Ugd291bGQgZHJvd24gdGhlIHNpZ25hbCBpbiBub2lzZS5cbiAqXG4gKiAtIEVuZ2luZSBhY2Nlc3NvcnMgYXJlIG5hdGl2ZSBjb2RlLCBkZXRlY3RlZCB2aWEgdGhlIGNhcHR1cmVkIGhvc3RcbiAqICAgYEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZ2AgKGNyb3NzLXJlYWxtLCB1bmludGVyY2VwdGFibGUpLiBCb3VuZFxuICogICBmdW5jdGlvbnMgYW5kIGNhbGxhYmxlIFByb3hpZXMgYWxzbyBwcmVzZW50IGFzIG5hdGl2ZSBjb2RlIGJ1dCBydW5cbiAqICAgd29ya2Zsb3cgY29kZSwgc28gYm90aCBhcmUgZXhjbHVkZWQgZmlyc3QuXG4gKiAtIEhvc3QgYnVpbHRpbnMgaW1wbGVtZW50ZWQgaW4gSmF2YVNjcmlwdCBhcmUgb3JkaW5hcnkgZnVuY3Rpb25zLCBidXQgdGhleVxuICogICBiZWxvbmcgdG8gdGhlIGhvc3QgcmVhbG0sIGRldGVjdGVkIGJ5IGNvbXBhcmluZyB0aGUgZnVuY3Rpb24nc1xuICogICBwcm90b3R5cGUgYWdhaW5zdCB0aGUgaG9zdCBgRnVuY3Rpb24ucHJvdG90eXBlYC4gV29ya2Zsb3cgY29kZSB0aGF0XG4gKiAgIHJlYWNoZXMgYSBob3N0IGZ1bmN0aW9uIGNhbiBgc2V0UHJvdG90eXBlT2ZgIGl0cyBvd24gZ2V0dGVyIHRvXG4gKiAgIGltcGVyc29uYXRlIHRoaXM7IHRoYXQgY29zdHMgYSBtaXNzaW5nIHJlcG9ydCBlbnRyeSwgbmV2ZXIgaW5jb3JyZWN0XG4gKiAgIG91dHB1dC5cbiAqXG4gKiBWOCdzIG5hdGl2ZSBgc3RhY2tgIGdldHRlciBjYW4gaXRzZWxmIGludm9rZSBhIHdvcmtmbG93LWRlZmluZWRcbiAqIGBFcnJvci5wcmVwYXJlU3RhY2tUcmFjZWA7IHRoYXQgaW5kaXJlY3Rpb24gaXMgbm90IGRldGVjdGVkIGhlcmUuXG4gKi9cbmZ1bmN0aW9uIGlzRW5naW5lQWNjZXNzb3IoZ2V0dGVyOiBvYmplY3QpOiBib29sZWFuIHtcbiAgaWYgKGlzUHJveHkoZ2V0dGVyKSkgcmV0dXJuIGZhbHNlO1xuICAvLyBBIGJvdW5kIGZ1bmN0aW9uIHN0cmluZ2lmaWVzIGFzIG5hdGl2ZSBjb2RlIGJ1dCBydW5zIGl0cyB0YXJnZXQuIFRoZVxuICAvLyBvbmUgcGFzc2l2ZSBkaXN0aW5ndWlzaGVyIFY4IGV4cG9zZXMgaXMgdGhlIGBuYW1lYCBvd24gcHJvcGVydHlcbiAgLy8gKGBcImJvdW5kIGZuXCJgKS4gV29ya2Zsb3cgY29kZSBjYW4gcmVkZWZpbmUgdGhlIG5hbWUgdG8gaGlkZSBpdDsgdGhhdFxuICAvLyBjb3N0cyBhIG1pc3NpbmcgcmVwb3J0IGVudHJ5LCBsaWtlIHRoZSBvdGhlciBpbXBlcnNvbmF0aW9uIGNhdmVhdHMuXG4gIGNvbnN0IG5hbWUgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdldHRlciwgJ25hbWUnKT8udmFsdWU7XG4gIGlmICh0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgJiYgbmFtZS5zdGFydHNXaXRoKCdib3VuZCAnKSkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKFxuICAgIGZ1bmN0aW9uVG9TdHJpbmcoZ2V0dGVyIGFzICgpID0+IHVua25vd24pLmVuZHNXaXRoKCd7IFtuYXRpdmUgY29kZV0gfScpIHx8XG4gICAgUmVmbGVjdC5nZXRQcm90b3R5cGVPZihnZXR0ZXIpID09PSBGdW5jdGlvbi5wcm90b3R5cGVcbiAgKTtcbn1cblxuLyoqXG4gKiBSZWFkcyBgdmFsdWVba2V5XWAgd2l0aCBgW1tHZXRdXWAgc2VtYW50aWNzLCBidXQgdGhyb3VnaCBkZXNjcmlwdG9yczpcbiAqIHBsYWluIGRhdGEgcHJvcGVydGllcyBuZXZlciBpbnZva2UgYW55dGhpbmc7IGFjY2Vzc29yIHByb3BlcnRpZXMgYXJlXG4gKiBpbnZva2VkICh0aGUgZGF0YSBsaXZlcyBiZWhpbmQgdGhlbSkgYW5kIHJlY29yZGVkOyBwcm94aWVzIGZhbGwgYmFjayB0b1xuICogYSBwbGFpbiByZWFkICh0aGVpciB0cmFwcyBhcmUgdGhlIG9ubHkgYWNjZXNzIHBhdGgpIGFuZCBhcmUgcmVjb3JkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkUHJvcGVydHkodmFsdWU6IHVua25vd24sIGtleTogUHJvcGVydHlLZXkpOiB1bmtub3duIHtcbiAgaWYgKFxuICAgIHZhbHVlID09PSBudWxsIHx8XG4gICAgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nKVxuICApIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGlmIChpc1Byb3h5KHZhbHVlKSkge1xuICAgIHJlY29yZFByb3h5KHZhbHVlKTtcbiAgICByZXR1cm4gKHZhbHVlIGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pW2tleV07XG4gIH1cblxuICBsZXQgY3VycmVudDogb2JqZWN0IHwgbnVsbCA9IHZhbHVlO1xuICB3aGlsZSAoY3VycmVudCAhPT0gbnVsbCkge1xuICAgIGlmIChpc1Byb3h5KGN1cnJlbnQpKSB7XG4gICAgICAvLyBhIHByb3h5IGluIHRoZSBwcm90b3R5cGUgY2hhaW46IGl0cyB0cmFwcyBhbnN3ZXIgdGhlIGxvb2t1cFxuICAgICAgcmVjb3JkUHJveHkoY3VycmVudCk7XG4gICAgICByZXR1cm4gKHZhbHVlIGFzIFJlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj4pW2tleV07XG4gICAgfVxuICAgIGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGN1cnJlbnQsIGtleSk7XG4gICAgaWYgKGRlc2NyaXB0b3IpIHtcbiAgICAgIGlmICgndmFsdWUnIGluIGRlc2NyaXB0b3IpIHJldHVybiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgICAgaWYgKGRlc2NyaXB0b3IuZ2V0KSB7XG4gICAgICAgIGlmICghaXNFbmdpbmVBY2Nlc3NvcihkZXNjcmlwdG9yLmdldCkpIHtcbiAgICAgICAgICByZWNvcmRHdWVzdENvZGUoJ2dldHRlcicsIFN0cmluZyhrZXkpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5nZXQuY2FsbCh2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkOyAvLyBzZXR0ZXItb25seSBwcm9wZXJ0eVxuICAgIH1cbiAgICBjdXJyZW50ID0gUmVmbGVjdC5nZXRQcm90b3R5cGVPZihjdXJyZW50KTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIGBrZXkgaW4gdmFsdWVgIHNlbWFudGljcyB3aXRob3V0IGZpcmluZyBwcm94eSB0cmFwcyBmb3Igb3JkaW5hcnlcbiAqIG9iamVjdHMuIFByb3hpZXMgZmFsbCBiYWNrIHRvIHRoZSBgaW5gIG9wZXJhdG9yIGFuZCBhcmUgcmVjb3JkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNQcm9wZXJ0eSh2YWx1ZTogdW5rbm93biwga2V5OiBQcm9wZXJ0eUtleSk6IGJvb2xlYW4ge1xuICBpZiAoXG4gICAgdmFsdWUgPT09IG51bGwgfHxcbiAgICAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsdWUgIT09ICdmdW5jdGlvbicpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoaXNQcm94eSh2YWx1ZSkpIHtcbiAgICByZWNvcmRQcm94eSh2YWx1ZSk7XG4gICAgcmV0dXJuIGtleSBpbiAodmFsdWUgYXMgb2JqZWN0KTtcbiAgfVxuXG4gIGxldCBjdXJyZW50OiBvYmplY3QgfCBudWxsID0gdmFsdWU7XG4gIHdoaWxlIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgaWYgKGlzUHJveHkoY3VycmVudCkpIHtcbiAgICAgIHJlY29yZFByb3h5KGN1cnJlbnQpO1xuICAgICAgcmV0dXJuIGtleSBpbiAodmFsdWUgYXMgb2JqZWN0KTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY3VycmVudCwga2V5KSkgcmV0dXJuIHRydWU7XG4gICAgY3VycmVudCA9IFJlZmxlY3QuZ2V0UHJvdG90eXBlT2YoY3VycmVudCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIGB2YWx1ZSBpbnN0YW5jZW9mIENgIHNlbWFudGljcyBmb3IgYSBrbm93biBgQy5wcm90b3R5cGVgLCB3aXRob3V0XG4gKiBjb25zdWx0aW5nIGBTeW1ib2wuaGFzSW5zdGFuY2VgICh3aGljaCB3b3JrZmxvdyBjb2RlIGNhbiBkZWZpbmUpLiBVc2VkXG4gKiBmb3IgaG9zdCBjbGFzc2VzIHRoYXQgYXJlIGluamVjdGVkIGludG8gdGhlIHNhbmRib3ggKEhlYWRlcnMsIFVSTCxcbiAqIFVSTFNlYXJjaFBhcmFtcywgRE9NRXhjZXB0aW9uKSwgd2hlcmUgdGhlIGluc3RhbmNlcyAoZnJvbSBhbnkgcmVhbG0gdGhlXG4gKiBob3N0IGhhbmRlZCB0aGUgY2xhc3MgdG8pIGNhcnJ5IHRoZSBob3N0IHByb3RvdHlwZSBpbiB0aGVpciBjaGFpbi5cbiAqXG4gKiBQcm94aWVzIGFyZSB3YWxrZWQgcmF0aGVyIHRoYW4gcmVqZWN0ZWQ6IGBSZWZsZWN0LmdldFByb3RvdHlwZU9mYCBmaXJlc1xuICogdGhlIHByb3h5J3MgYGdldFByb3RvdHlwZU9mYCB0cmFwLCBtYXRjaGluZyBgaW5zdGFuY2VvZmAgc2VtYW50aWNzLCBhbmRcbiAqIHJlYWwgdmFsdWVzIGRlcGVuZCBvbiB0aGF0OiBOZXh0LmpzIGhhbmRzIHRoZSBydW50aW1lIGEgcHJveGllZFxuICogYE5leHRSZXF1ZXN0YCwgYW5kIGFuc3dlcmluZyBcIm5vdCBhIFJlcXVlc3RcIiBmb3IgaXQgd291bGQgc2lsZW50bHkgYnJlYWtcbiAqIHdlYmhvb2tzLiBUaGUgdHJhcHMgYXJlIGd1ZXN0LW9ic2VydmFibGUsIHNvIHRoZSBwcm94eSBpcyByZWNvcmRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW5zdGFuY2VPZlByb3RvdHlwZShcbiAgdmFsdWU6IHVua25vd24sXG4gIHByb3RvdHlwZTogb2JqZWN0IHwgdW5kZWZpbmVkXG4pOiBib29sZWFuIHtcbiAgaWYgKCFwcm90b3R5cGUpIHJldHVybiBmYWxzZTtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgaWYgKGlzUHJveHkodmFsdWUpKSByZWNvcmRQcm94eSh2YWx1ZSk7XG4gIGxldCBjdXJyZW50OiBvYmplY3QgfCBudWxsID0gUmVmbGVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIHdoaWxlIChjdXJyZW50ICE9PSBudWxsKSB7XG4gICAgaWYgKGN1cnJlbnQgPT09IHByb3RvdHlwZSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGlzUHJveHkoY3VycmVudCkpIHJlY29yZFByb3h5KGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBSZWZsZWN0LmdldFByb3RvdHlwZU9mKGN1cnJlbnQpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8gLS0tLSBJbnRyaW5zaWMtYmFja2VkIGV4dHJhY3Rpb24gaGVscGVycyAodXNlZCBieSB0aGUgcmVkdWNlcnMpIC0tLS0tLS0tLS0tLS1cbi8vXG4vLyBJbnRyaW5zaWNzIHJlYWQgaW50ZXJuYWwgc2xvdHMsIHdoaWNoIGEgUHJveHkgZG9lcyBub3QgaGF2ZTogaW52b2tpbmcgb25lXG4vLyB3aXRoIGEgcHJveHkgcmVjZWl2ZXIgdGhyb3dzLCB3aGVyZSB0aGUgcHJlLWV4aXN0aW5nIGR5bmFtaWMgcmVhZCBmb3J3YXJkZWRcbi8vIHRocm91Z2ggdGhlIHRyYXAuIEZvciB0aGUgKHJhcmUpIHByb3h5IGNhc2UsIGZhbGwgYmFjayB0byB0aGUgZHluYW1pYyByZWFkXG4vLyBzbyBiZWhhdmlvciBpcyB1bmNoYW5nZWQsIGFuZCByZWNvcmQgdGhhdCB0aGUgdHJhcHMgcmFuLlxuXG4vKiogYFVSTC5wcm90b3R5cGUuaHJlZmAgZ2V0dGVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVybEhyZWYodmFsdWU6IFVSTCk6IHN0cmluZyB7XG4gIGlmIChpc1Byb3h5KHZhbHVlKSkge1xuICAgIHJlY29yZFByb3h5KHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWUuaHJlZjtcbiAgfVxuICByZXR1cm4gdXJsSHJlZkdldHRlcih2YWx1ZSk7XG59XG5cbi8qKiBgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZS50b1N0cmluZ2A6IHJldHVybnMgYCcnYCBpZmYgZW1wdHkuICovXG5leHBvcnQgZnVuY3Rpb24gdXJsU2VhcmNoUGFyYW1zVG9TdHJpbmcodmFsdWU6IFVSTFNlYXJjaFBhcmFtcyk6IHN0cmluZyB7XG4gIGlmIChpc1Byb3h5KHZhbHVlKSkge1xuICAgIHJlY29yZFByb3h5KHZhbHVlKTtcbiAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgfVxuICByZXR1cm4gdXJsU2VhcmNoUGFyYW1zVG9TdHJpbmdNZXRob2QodmFsdWUpO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIGEgSGVhZGVycyBpbnN0YW5jZSB0aHJvdWdoIHRoZSBjYXB0dXJlZCBob3N0IGl0ZXJhdG9yLCBzbyB0aGVcbiAqIGl0ZXJhdG9yIG9iamVjdCwgYW5kIGl0cyBgbmV4dGAsIGFyZSBob3N0LXJlYWxtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGVhZGVyc1RvRW50cmllcyh2YWx1ZTogSGVhZGVycyk6IFtzdHJpbmcsIHN0cmluZ11bXSB7XG4gIGlmIChpc1Byb3h5KHZhbHVlKSkge1xuICAgIHJlY29yZFByb3h5KHZhbHVlKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh2YWx1ZSkgYXMgW3N0cmluZywgc3RyaW5nXVtdO1xuICB9XG4gIHJldHVybiBbLi4uaGVhZGVyc0l0ZXJhdG9yKHZhbHVlKV0gYXMgW3N0cmluZywgc3RyaW5nXVtdO1xufVxuXG4vKipcbiAqIEl0ZXJhdGVzIGEgZ2VudWluZSBNYXAncyBlbnRyaWVzIGVudGlyZWx5IHRocm91Z2ggaG9zdCBpbnRyaW5zaWNzOiB0aGVcbiAqIGl0ZXJhdG9yIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHRoZSBob3N0IGBNYXAucHJvdG90eXBlLmVudHJpZXNgLCBzbyBpdHNcbiAqIHJlYWxtLCBhbmQgdGhlcmVmb3JlIGl0cyBgbmV4dGAsIGlzIHRoZSBob3N0J3MsIG5vdCB0aGUgc2FuZGJveCdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9FbnRyaWVzKFxuICB2YWx1ZTogTWFwPHVua25vd24sIHVua25vd24+XG4pOiBbdW5rbm93biwgdW5rbm93bl1bXSB7XG4gIHJldHVybiBbLi4ubWFwRW50cmllcyh2YWx1ZSldO1xufVxuXG4vKiogU2VlIHtAbGluayBtYXBUb0VudHJpZXN9LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFRvVmFsdWVzKHZhbHVlOiBTZXQ8dW5rbm93bj4pOiB1bmtub3duW10ge1xuICByZXR1cm4gWy4uLnNldFZhbHVlcyh2YWx1ZSldO1xufVxuXG4vKipcbiAqIFRoZSBieXRlcyBvZiBhbiBgQXJyYXlCdWZmZXJWaWV3YCwgcmVhZCB2aWEgaW50ZXJuYWwtc2xvdCBnZXR0ZXJzLCBzb1xuICogb3duLXByb3BlcnR5IHNoYWRvd2luZyBhbmQgcHJvdG90eXBlIHBhdGNoZXMgY2Fubm90IGNoYW5nZSB3aGljaCBieXRlc1xuICogYXJlIHNlcmlhbGl6ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2aWV3SW5mbyh2YWx1ZTogQXJyYXlCdWZmZXJWaWV3KToge1xuICBidWZmZXI6IEFycmF5QnVmZmVyTGlrZTtcbiAgYnl0ZU9mZnNldDogbnVtYmVyO1xuICBieXRlTGVuZ3RoOiBudW1iZXI7XG59IHtcbiAgaWYgKHR5cGVzLmlzRGF0YVZpZXcodmFsdWUpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJ1ZmZlcjogZGF0YVZpZXdCdWZmZXIodmFsdWUpLFxuICAgICAgYnl0ZU9mZnNldDogZGF0YVZpZXdCeXRlT2Zmc2V0KHZhbHVlKSxcbiAgICAgIGJ5dGVMZW5ndGg6IGRhdGFWaWV3Qnl0ZUxlbmd0aCh2YWx1ZSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGJ1ZmZlcjogdHlwZWRBcnJheUJ1ZmZlcih2YWx1ZSksXG4gICAgYnl0ZU9mZnNldDogdHlwZWRBcnJheUJ5dGVPZmZzZXQodmFsdWUpLFxuICAgIGJ5dGVMZW5ndGg6IHR5cGVkQXJyYXlCeXRlTGVuZ3RoKHZhbHVlKSxcbiAgfTtcbn1cblxuLy8gLS0tLSBIYXJkZW5lZCBkZXZhbHVlIG9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vL1xuLy8gVGhlIHdvcmtmbG93IHJlZHVjZXJzIGNsYWltIG1vc3Qgc3BlY2lhbCB0eXBlcyBiZWZvcmUgZGV2YWx1ZSdzIGJ1aWx0LWluXG4vLyBoYW5kbGluZyBydW5zLCBzbyB0aGVzZSBvcGVyYXRpb25zIG1haW5seSBnb3Zlcm4gcGxhaW4gb2JqZWN0cywgYXJyYXlzLFxuLy8gYm94ZWQgcHJpbWl0aXZlcywgdGhlbmFibGUgcHJvYmVzLCBhbmQgY2xhc3NpZmljYXRpb24gKGB0YWdPZmApLCB3aGljaFxuLy8gcnVucyBmb3IgZXZlcnkgb2JqZWN0IHRoZSByZWR1Y2VycyBkaWQgbm90IGNsYWltLlxuXG5jb25zdCBLTk9XTl9WSUVXX1RBR1MgPSBuZXcgU2V0KFtcbiAgJ0ludDhBcnJheScsXG4gICdVaW50OEFycmF5JyxcbiAgJ1VpbnQ4Q2xhbXBlZEFycmF5JyxcbiAgJ0ludDE2QXJyYXknLFxuICAnVWludDE2QXJyYXknLFxuICAnRmxvYXQxNkFycmF5JyxcbiAgJ0ludDMyQXJyYXknLFxuICAnVWludDMyQXJyYXknLFxuICAnRmxvYXQzMkFycmF5JyxcbiAgJ0Zsb2F0NjRBcnJheScsXG4gICdCaWdJbnQ2NEFycmF5JyxcbiAgJ0JpZ1VpbnQ2NEFycmF5Jyxcbl0pO1xuXG4vKipcbiAqIFRhZ3MgdGhhdCB7QGxpbmsgYnJhbmRPZn0gZGVjaWRlcyBhdXRob3JpdGF0aXZlbHkuIElmIHRoZSBicmFuZCBjaGVjayBzYWlkXG4gKiBcIm5vdCBvbmUgb2YgdGhlc2VcIiB0aGVuIGEgYFN5bWJvbC50b1N0cmluZ1RhZ2AgY2xhaW1pbmcgb25lIGlzIGEgc3Bvb2YsIGFuZFxuICogaG9ub3VyaW5nIGl0IHdvdWxkIHJvdXRlIHRoZSB2YWx1ZSBpbnRvIGFuIGV4dHJhY3RvciB0aGF0IHJlcXVpcmVzIHRoZSByZWFsXG4gKiBpbnRlcm5hbCBzbG90IChgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2Agc2VtYW50aWNzIGxldCBhbnkgb2JqZWN0IGNsYWltXG4gKiBgW29iamVjdCBEYXRlXWApLiBVbmJyYW5kZWQgdmFsdWVzIHRoYXQgY2xhaW0gb25lIG9mIHRoZXNlIGFyZSBjbGFzc2lmaWVkXG4gKiBhcyBwbGFpbiBvYmplY3RzIGluc3RlYWQuXG4gKi9cbmNvbnN0IEJSQU5EX0RFQ0lERURfVEFHUyA9IG5ldyBTZXQoW1xuICAnRGF0ZScsXG4gICdSZWdFeHAnLFxuICAnTWFwJyxcbiAgJ1NldCcsXG4gICdBcnJheScsXG4gICdEYXRhVmlldycsXG4gICdBcnJheUJ1ZmZlcicsXG4gICdTaGFyZWRBcnJheUJ1ZmZlcicsXG4gICdOdW1iZXInLFxuICAnU3RyaW5nJyxcbiAgJ0Jvb2xlYW4nLFxuICAnQmlnSW50JyxcbiAgJ1VSTCcsXG4gICdVUkxTZWFyY2hQYXJhbXMnLFxuICAuLi5LTk9XTl9WSUVXX1RBR1MsXG5dKTtcblxuLyoqXG4gKiBDbGFzc2lmaWVzIGEgdmFsdWUgYnkgZW5naW5lIGJyYW5kLiBSZXR1cm5zIHVuZGVmaW5lZCB3aGVuIG5vIGJyYW5kXG4gKiBtYXRjaGVzICh0aGUgY2FsbGVyIGZhbGxzIGJhY2sgdG8gYFN5bWJvbC50b1N0cmluZ1RhZ2Agc2VtYW50aWNzKS5cbiAqL1xuZnVuY3Rpb24gYnJhbmRPZih2YWx1ZTogb2JqZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVzLmlzRGF0ZSh2YWx1ZSkpIHJldHVybiAnRGF0ZSc7XG4gIGlmICh0eXBlcy5pc1JlZ0V4cCh2YWx1ZSkpIHJldHVybiAnUmVnRXhwJztcbiAgaWYgKHR5cGVzLmlzTWFwKHZhbHVlKSkgcmV0dXJuICdNYXAnO1xuICBpZiAodHlwZXMuaXNTZXQodmFsdWUpKSByZXR1cm4gJ1NldCc7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuICdBcnJheSc7XG4gIGlmICh0eXBlcy5pc1R5cGVkQXJyYXkodmFsdWUpKSB7XG4gICAgY29uc3QgdGFnID0gdHlwZWRBcnJheVRhZyh2YWx1ZSk7XG4gICAgcmV0dXJuIHRhZyAhPT0gdW5kZWZpbmVkICYmIEtOT1dOX1ZJRVdfVEFHUy5oYXModGFnKSA/IHRhZyA6IHVuZGVmaW5lZDtcbiAgfVxuICBpZiAodHlwZXMuaXNEYXRhVmlldyh2YWx1ZSkpIHJldHVybiAnRGF0YVZpZXcnO1xuICBpZiAodHlwZXMuaXNBcnJheUJ1ZmZlcih2YWx1ZSkpIHJldHVybiAnQXJyYXlCdWZmZXInO1xuICBpZiAodHlwZXMuaXNTaGFyZWRBcnJheUJ1ZmZlcih2YWx1ZSkpIHJldHVybiAnU2hhcmVkQXJyYXlCdWZmZXInO1xuICBpZiAodHlwZXMuaXNOdW1iZXJPYmplY3QodmFsdWUpKSByZXR1cm4gJ051bWJlcic7XG4gIGlmICh0eXBlcy5pc1N0cmluZ09iamVjdCh2YWx1ZSkpIHJldHVybiAnU3RyaW5nJztcbiAgaWYgKHR5cGVzLmlzQm9vbGVhbk9iamVjdCh2YWx1ZSkpIHJldHVybiAnQm9vbGVhbic7XG4gIGlmICh0eXBlcy5pc0JpZ0ludE9iamVjdCh2YWx1ZSkpIHJldHVybiAnQmlnSW50JztcbiAgaWYgKGlzSW5zdGFuY2VPZlByb3RvdHlwZSh2YWx1ZSwgVVJMLnByb3RvdHlwZSkpIHJldHVybiAnVVJMJztcbiAgaWYgKGlzSW5zdGFuY2VPZlByb3RvdHlwZSh2YWx1ZSwgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZSkpIHtcbiAgICByZXR1cm4gJ1VSTFNlYXJjaFBhcmFtcyc7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZWFkcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB0aGUgd2F5IGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCB3b3VsZCxcbiAqIGJ1dCB0aHJvdWdoIGRlc2NyaXB0b3JzOiBhIGRhdGEtcHJvcGVydHkgdGFnICh0aGUgY29tbW9uIGNhc2UsIGUuZy5cbiAqIFRlbXBvcmFsIHBvbHlmaWxscykgY29zdHMgbm8gd29ya2Zsb3ctY29kZSBleGVjdXRpb247IGFuIGFjY2Vzc29yIHRhZyBpc1xuICogaW52b2tlZCAoY29tcGF0KSBhbmQgcmVjb3JkZWQuXG4gKi9cbmZ1bmN0aW9uIHJlYWRUb1N0cmluZ1RhZyh2YWx1ZTogb2JqZWN0KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdGFnID0gcmVhZFByb3BlcnR5KHZhbHVlLCBTeW1ib2wudG9TdHJpbmdUYWcpO1xuICByZXR1cm4gdHlwZW9mIHRhZyA9PT0gJ3N0cmluZycgPyB0YWcgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBoYXJkZW5lZFN0cmluZ2lmeU9wZXJhdGlvbnM6IFBhcnRpYWw8U3RyaW5naWZ5T3BlcmF0aW9ucz4gPSB7XG4gIHRhZ09mOiAodmFsdWU6IG9iamVjdCkgPT4ge1xuICAgIGlmIChpc1Byb3h5KHZhbHVlKSkge1xuICAgICAgLy8gQSBwcm94eSdzIGNsYXNzaWZpY2F0aW9uIGlzIGFuc3dlcmVkIGJ5IGl0cyB0cmFwcywgd2hpY2ggaXMgdGhlXG4gICAgICAvLyBvbmx5IGFjY2VzcyBwYXRoIHRoZXJlIGlzLiBSZWNvcmQgaXQgYW5kIHByZXNlcnZlIHRvZGF5J3NcbiAgICAgIC8vIGJlaGF2aW9yIGZvciBldmVyeXRoaW5nIGRvd25zdHJlYW0uXG4gICAgICByZWNvcmRQcm94eSh2YWx1ZSk7XG4gICAgICByZXR1cm4gZGVmYXVsdFN0cmluZ2lmeU9wZXJhdGlvbnMudGFnT2YodmFsdWUpO1xuICAgIH1cbiAgICBjb25zdCBicmFuZCA9IGJyYW5kT2YodmFsdWUpO1xuICAgIGlmIChicmFuZCAhPT0gdW5kZWZpbmVkKSByZXR1cm4gYnJhbmQ7XG4gICAgLy8gTm8gZW5naW5lIGJyYW5kIG1hdGNoZWQuIEEgYFN5bWJvbC50b1N0cmluZ1RhZ2AgaXMgc3RpbGwgbWVhbmluZ2Z1bCBmb3JcbiAgICAvLyB0eXBlcyBkZXZhbHVlIGlkZW50aWZpZXMgdGhhdCB3YXkgKGBUZW1wb3JhbC4qYCksIGJ1dCBvbmUgbmFtaW5nIGFcbiAgICAvLyBicmFuZC1kZWNpZGVkIHR5cGUgaXMgYSBzcG9vZiBhbmQgaXMgaWdub3JlZC5cbiAgICBjb25zdCB0YWcgPSByZWFkVG9TdHJpbmdUYWcodmFsdWUpO1xuICAgIGlmICh0YWcgPT09IHVuZGVmaW5lZCB8fCBCUkFORF9ERUNJREVEX1RBR1MuaGFzKHRhZykpIHJldHVybiAnT2JqZWN0JztcbiAgICByZXR1cm4gdGFnO1xuICB9LFxuXG4gIGlzVGhlbmFibGU6ICh2YWx1ZTogeyB0aGVuPzogdW5rbm93biB9KSA9PiB7XG4gICAgaWYgKHR5cGVzLmlzUHJvbWlzZSh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiB0eXBlb2YgcmVhZFByb3BlcnR5KHZhbHVlLCAndGhlbicpID09PSAnZnVuY3Rpb24nO1xuICB9LFxuXG4gIHVuYm94OiAoYm94ZWQ6IG9iamVjdCkgPT4ge1xuICAgIGlmICh0eXBlcy5pc051bWJlck9iamVjdChib3hlZCkpIHJldHVybiBudW1iZXJWYWx1ZU9mKGJveGVkKTtcbiAgICBpZiAodHlwZXMuaXNTdHJpbmdPYmplY3QoYm94ZWQpKSByZXR1cm4gc3RyaW5nVmFsdWVPZihib3hlZCk7XG4gICAgaWYgKHR5cGVzLmlzQm9vbGVhbk9iamVjdChib3hlZCkpIHJldHVybiBib29sZWFuVmFsdWVPZihib3hlZCk7XG4gICAgcmV0dXJuIGJpZ0ludFZhbHVlT2YoYm94ZWQpO1xuICB9LFxuXG4gIHRvSVNPU3RyaW5nOiAoZGF0ZTogRGF0ZSkgPT5cbiAgICBOdW1iZXIuaXNOYU4oZGF0ZUdldERhdGUoZGF0ZSkpID8gJycgOiBkYXRlVG9JU09TdHJpbmcoZGF0ZSksXG5cbiAgdG9TdHJpbmdWYWx1ZTogKHZhbHVlOiBvYmplY3QpID0+IHtcbiAgICAvLyBSZWFjaGVkIGZvciBVUkwgLyBVUkxTZWFyY2hQYXJhbXMgKHdoZW4gdGhlIHJlZHVjZXJzIGRpZCBub3QgY2xhaW1cbiAgICAvLyB0aGVtLCBlLmcuIGluc3RhbmNlcyBvZiBhIGRpZmZlcmVudCByZWFsbSdzIGNsYXNzZXMpIGFuZCBmb3JcbiAgICAvLyB0b1N0cmluZ1RhZy1icmFuZGVkIG9iamVjdHMgbGlrZSBUZW1wb3JhbCBwb2x5ZmlsbHMsIHdob3NlIHN0cmluZ1xuICAgIC8vIGZvcm0gb25seSB0aGVpciBvd24gdG9TdHJpbmcoKSBjYW4gcHJvZHVjZS5cbiAgICBpZiAoaXNJbnN0YW5jZU9mUHJvdG90eXBlKHZhbHVlLCBVUkwucHJvdG90eXBlKSkge1xuICAgICAgcmV0dXJuIHVybEhyZWYodmFsdWUgYXMgVVJMKTtcbiAgICB9XG4gICAgaWYgKGlzSW5zdGFuY2VPZlByb3RvdHlwZSh2YWx1ZSwgVVJMU2VhcmNoUGFyYW1zLnByb3RvdHlwZSkpIHtcbiAgICAgIHJldHVybiB1cmxTZWFyY2hQYXJhbXNUb1N0cmluZyh2YWx1ZSBhcyBVUkxTZWFyY2hQYXJhbXMpO1xuICAgIH1cbiAgICByZWNvcmRHdWVzdENvZGUoXG4gICAgICAnbWV0aG9kJyxcbiAgICAgIGB0b1N0cmluZyAoJHtyZWFkVG9TdHJpbmdUYWcodmFsdWUpID8/ICd1bmtub3duJ30pYFxuICAgICk7XG4gICAgcmV0dXJuICh2YWx1ZSBhcyB7IHRvU3RyaW5nKCk6IHN0cmluZyB9KS50b1N0cmluZygpO1xuICB9LFxuXG4gIHJlZ0V4cEluZm86IChyZWdleHA6IFJlZ0V4cCkgPT4gKHtcbiAgICBzb3VyY2U6IHJlZ0V4cFNvdXJjZShyZWdleHApLFxuICAgIGZsYWdzOiByZWdFeHBGbGFncyhyZWdleHApLFxuICB9KSxcblxuICB2YWx1ZXNPZjogKHNldDogU2V0PHVua25vd24+KSA9PiBzZXRUb1ZhbHVlcyhzZXQpLFxuICBlbnRyaWVzT2Y6IChtYXA6IE1hcDx1bmtub3duLCB1bmtub3duPikgPT5cbiAgICBtYXBUb0VudHJpZXMobWFwKSBhcyBbdW5rbm93biwgdW5rbm93bl1bXSxcblxuICB2aWV3SW5mbzogKHZpZXc6IEFycmF5QnVmZmVyVmlldykgPT4ge1xuICAgIGNvbnN0IGluZm8gPSB2aWV3SW5mbyh2aWV3KTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uaW5mbyxcbiAgICAgIC8vIGRldmFsdWUgb25seSByZWFkcyBgbGVuZ3RoYCBmb3IgdHlwZWQtYXJyYXkgc3Vidmlld3M7IERhdGFWaWV3XG4gICAgICAvLyBzdWJ2aWV3cyBhcmUgZW5jb2RlZCBmcm9tIGBieXRlTGVuZ3RoYC5cbiAgICAgIGxlbmd0aDogdHlwZXMuaXNEYXRhVmlldyh2aWV3KSA/IDAgOiB0eXBlZEFycmF5TGVuZ3RoKHZpZXcpLFxuICAgICAgYnVmZmVyQnl0ZUxlbmd0aDogdHlwZXMuaXNTaGFyZWRBcnJheUJ1ZmZlcihpbmZvLmJ1ZmZlcilcbiAgICAgICAgPyBzaGFyZWRBcnJheUJ1ZmZlckJ5dGVMZW5ndGgoaW5mby5idWZmZXIpXG4gICAgICAgIDogYXJyYXlCdWZmZXJCeXRlTGVuZ3RoKGluZm8uYnVmZmVyKSxcbiAgICB9O1xuICB9LFxuXG4gIHNoYXBlT2Y6ICh2YWx1ZTogb2JqZWN0KSA9PiB7XG4gICAgaWYgKGlzUHJveHkodmFsdWUpKSByZWNvcmRQcm94eSh2YWx1ZSk7XG4gICAgcmV0dXJuIGRlZmF1bHRTdHJpbmdpZnlPcGVyYXRpb25zLnNoYXBlT2YodmFsdWUpO1xuICB9LFxuXG4gIGdldDogKHZhbHVlOiBvYmplY3QsIGtleTogc3RyaW5nIHwgbnVtYmVyKSA9PiByZWFkUHJvcGVydHkodmFsdWUsIGtleSksXG59O1xuIl19
|