@workflow/core 5.0.0-beta.47 → 5.0.0-beta.49

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/classify-error.d.ts.map +1 -1
  2. package/dist/classify-error.js +13 -3
  3. package/dist/describe-error.d.ts.map +1 -1
  4. package/dist/describe-error.js +16 -1
  5. package/dist/private.d.ts +2 -4
  6. package/dist/private.d.ts.map +1 -1
  7. package/dist/private.js +1 -1
  8. package/dist/runtime/constants.d.ts +9 -7
  9. package/dist/runtime/constants.d.ts.map +1 -1
  10. package/dist/runtime/constants.js +10 -8
  11. package/dist/runtime/helpers.d.ts +13 -0
  12. package/dist/runtime/helpers.d.ts.map +1 -1
  13. package/dist/runtime/helpers.js +14 -1
  14. package/dist/runtime/quickjs-serde.d.ts.map +1 -1
  15. package/dist/runtime/quickjs-serde.js +62 -1
  16. package/dist/runtime/run.d.ts +42 -0
  17. package/dist/runtime/run.d.ts.map +1 -1
  18. package/dist/runtime/run.js +102 -17
  19. package/dist/runtime/runs.d.ts.map +1 -1
  20. package/dist/runtime/runs.js +8 -4
  21. package/dist/runtime/start.d.ts +31 -1
  22. package/dist/runtime/start.d.ts.map +1 -1
  23. package/dist/runtime/start.js +38 -6
  24. package/dist/runtime/suspension-handler.d.ts +54 -1
  25. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  26. package/dist/runtime/suspension-handler.js +83 -20
  27. package/dist/runtime.d.ts +1 -1
  28. package/dist/runtime.d.ts.map +1 -1
  29. package/dist/runtime.js +174 -61
  30. package/dist/serialization/reducers/common-vm.d.ts.map +1 -1
  31. package/dist/serialization/reducers/common-vm.js +38 -1
  32. package/dist/serialization/reducers/common.d.ts.map +1 -1
  33. package/dist/serialization/reducers/common.js +26 -2
  34. package/dist/serialization/types.d.ts +7 -0
  35. package/dist/serialization/types.d.ts.map +1 -1
  36. package/dist/serialization/types.js +1 -1
  37. package/dist/serialization.d.ts +46 -2
  38. package/dist/serialization.d.ts.map +1 -1
  39. package/dist/serialization.js +249 -75
  40. package/dist/version.d.ts +1 -1
  41. package/dist/version.js +2 -2
  42. package/dist/workflow/sleep.d.ts.map +1 -1
  43. package/dist/workflow/sleep.js +3 -6
  44. package/dist/workflow.js +6 -6
  45. package/docs/foundations/streaming.mdx +28 -0
  46. package/docs/how-it-works/understanding-directives.mdx +1 -1
  47. package/package.json +10 -10
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const version = "5.0.0-beta.47";
1
+ export declare const version = "5.0.0-beta.49";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,3 +1,3 @@
1
1
  // Generated by genversion.
2
- export const version = '5.0.0-beta.47';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR2VuZXJhdGVkIGJ5IGdlbnZlcnNpb24uXG5leHBvcnQgY29uc3QgdmVyc2lvbiA9ICc1LjAuMC1iZXRhLjQ3J1xuIl19
2
+ export const version = '5.0.0-beta.49';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDJCQUEyQjtBQUMzQixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR2VuZXJhdGVkIGJ5IGdlbnZlcnNpb24uXG5leHBvcnQgY29uc3QgdmVyc2lvbiA9ICc1LjAuMC1iZXRhLjQ5J1xuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../src/workflow/sleep.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAGtC,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,eAAe,CAAC;AAEvB,wBAAgB,WAAW,CAAC,GAAG,EAAE,2BAA2B,IAExD,OAAO,WAAW,GAAG,IAAI,GAAG,MAAM,KACjC,OAAO,CAAC,IAAI,CAAC,CAoIjB"}
1
+ {"version":3,"file":"sleep.d.ts","sourceRoot":"","sources":["../../src/workflow/sleep.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAGtC,OAAO,EAIL,KAAK,2BAA2B,EACjC,MAAM,eAAe,CAAC;AAEvB,wBAAgB,WAAW,CAAC,GAAG,EAAE,2BAA2B,IAExD,OAAO,WAAW,GAAG,IAAI,GAAG,MAAM,KACjC,OAAO,CAAC,IAAI,CAAC,CAgIjB"}
@@ -1,8 +1,7 @@
1
1
  import { ReplayDivergenceError } from '@workflow/errors';
2
2
  import { parseDurationToDate, withResolvers } from '@workflow/utils';
3
3
  import { EventConsumerResult } from '../events-consumer.js';
4
- import { WorkflowSuspension } from '../global.js';
5
- import { awaitEarlierDeliveries, registerDeliveryBarrier, scheduleWhenIdle, } from '../private.js';
4
+ import { awaitEarlierDeliveries, registerDeliveryBarrier, scheduleWorkflowSuspension, } from '../private.js';
6
5
  export function createSleep(ctx) {
7
6
  return async function sleepImpl(param) {
8
7
  const { promise, resolve } = withResolvers();
@@ -20,9 +19,7 @@ export function createSleep(ctx) {
20
19
  // If there are no events and we're waiting for wait_completed,
21
20
  // suspend the workflow until the wait fires
22
21
  if (!event) {
23
- scheduleWhenIdle(ctx, () => {
24
- ctx.onWorkflowError(new WorkflowSuspension(ctx.invocationsQueue, ctx.globalThis));
25
- });
22
+ scheduleWorkflowSuspension(ctx);
26
23
  return EventConsumerResult.NotConsumed;
27
24
  }
28
25
  if (event.correlationId !== correlationId) {
@@ -109,4 +106,4 @@ export function createSleep(ctx) {
109
106
  return promise;
110
107
  };
111
108
  }
112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xlZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvc2xlZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBZ0Msa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDaEYsT0FBTyxFQUNMLHNCQUFzQixFQUN0Qix1QkFBdUIsRUFDdkIsZ0JBQWdCLEdBRWpCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE1BQU0sVUFBVSxXQUFXLENBQUMsR0FBZ0M7SUFDMUQsT0FBTyxLQUFLLFVBQVUsU0FBUyxDQUM3QixLQUFrQztRQUVsQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLGFBQWEsRUFBUSxDQUFDO1FBQ25ELE1BQU0sYUFBYSxHQUFHLFFBQVEsR0FBRyxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7UUFFbkQsNEJBQTRCO1FBQzVCLE1BQU0sUUFBUSxHQUFHLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTVDLGdFQUFnRTtRQUNoRSxNQUFNLFFBQVEsR0FBNEI7WUFDeEMsSUFBSSxFQUFFLE1BQU07WUFDWixhQUFhO1lBQ2IsUUFBUTtTQUNULENBQUM7UUFDRixHQUFHLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVsRCxHQUFHLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3JDLCtEQUErRDtZQUMvRCw0Q0FBNEM7WUFDNUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNYLGdCQUFnQixDQUFDLEdBQUcsRUFB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LENBQUMsQ0FBQztZQUNILE9BQU8sbUJBQW1CLENBQUMsUUFBUSxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFJlcGxheURpdmVyZ2VuY2VFcnJvciB9IGZyb20gJ0B3b3JrZmxvdy9lcnJvcnMnO1xuaW1wb3J0IHsgcGFyc2VEdXJhdGlvblRvRGF0ZSwgd2l0aFJlc29sdmVycyB9IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgdHlwZSB7IFN0cmluZ1ZhbHVlIH0gZnJvbSAnbXMnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCB9IGZyb20gJy4uL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgeyB0eXBlIFdhaXRJbnZvY2F0aW9uUXVldWVJdGVtLCBXb3JrZmxvd1N1c3BlbnNpb24gfSBmcm9tICcuLi9nbG9iYWwuanMnO1xuaW1wb3J0IHtcbiAgYXdhaXRFYXJsaWVyRGVsaXZlcmllcyxcbiAgcmVnaXN0ZXJEZWxpdmVyeUJhcnJpZXIsXG4gIHNjaGVkdWxlV2hlbklkbGUsXG4gIHR5cGUgV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxufSBmcm9tICcuLi9wcml2YXRlLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNsZWVwKGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KSB7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiBzbGVlcEltcGwoXG4gICAgcGFyYW06IFN0cmluZ1ZhbHVlIHwgRGF0ZSB8IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHByb21pc2UsIHJlc29sdmUgfSA9IHdpdGhSZXNvbHZlcnM8dm9pZD4oKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gYHdhaXRfJHtjdHguZ2VuZXJhdGVVbGlkKCl9YDtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgcmVzdW1lIHRpbWVcbiAgICBjb25zdCByZXN1bWVBdCA9IHBhcnNlRHVyYXRpb25Ub0RhdGUocGFyYW0pO1xuXG4gICAgLy8gQWRkIHdhaXQgdG8gaW52b2NhdGlvbnMgcXVldWUgKHVzaW5nIE1hcCBmb3IgTygxKSBvcGVyYXRpb25zKVxuICAgIGNvbnN0IHdhaXRJdGVtOiBXYWl0SW52b2NhdGlvblF1ZXVlSXRlbSA9IHtcbiAgICAgIHR5cGU6ICd3YWl0JyxcbiAgICAgIGNvcnJlbGF0aW9uSWQsXG4gICAgICByZXN1bWVBdCxcbiAgICB9O1xuICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLnNldChjb3JyZWxhdGlvbklkLCB3YWl0SXRlbSk7XG5cbiAgICBjdHguZXZlbnRzQ29uc3VtZXIuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGV2ZW50cyBhbmQgd2UncmUgd2FpdGluZyBmb3Igd2FpdF9jb21wbGV0ZWQsXG4gICAgICAvLyBzdXNwZW5kIHRoZSB3b3JrZmxvdyB1bnRpbCB0aGUgd2FpdCBmaXJlc1xuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICBzY2hlZHVsZVdoZW5JZGxlKGN0eCwgKCkgPT4ge1xuICAgICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgICBuZXcgV29ya2Zsb3dTdXNwZW5zaW9uKGN0eC5pbnZvY2F0aW9uc1F1ZXVlLCBjdHguZ2xvYmFsVGhpcylcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmIChldmVudC5jb3JyZWxhdGlvbklkICE9PSBjb3JyZWxhdGlvbklkKSB7XG4gICAgICAgIC8vIFdlJ3JlIG5vdCBpbnRlcmVzdGVkIGluIHRoaXMgZXZlbnQgLSB0aGUgY29ycmVsYXRpb25JZCBiZWxvbmdzIHRvIGEgZGlmZmVyZW50IGVudGl0eVxuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgZm9yIHdhaXRfY3JlYXRlZCBldmVudCB0byBtYXJrIHRoaXMgd2FpdCBhcyBoYXZpbmcgdGhlIGV2ZW50IGNyZWF0ZWRcbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICd3YWl0X2NyZWF0ZWQnKSB7XG4gICAgICAgIC8vIE1hcmsgdGhpcyB3YWl0IGFzIGhhdmluZyB0aGUgY3JlYXRlZCBldmVudCwgYnV0IGtlZXAgaXQgaW4gdGhlIHF1ZXVlXG4gICAgICAgIC8vIE8oMSkgbG9va3VwIHVzaW5nIE1hcFxuICAgICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICAgIGlmIChxdWV1ZUl0ZW0gJiYgcXVldWVJdGVtLnR5cGUgPT09ICd3YWl0Jykge1xuICAgICAgICAgIHF1ZXVlSXRlbS5oYXNDcmVhdGVkRXZlbnQgPSB0cnVlO1xuICAgICAgICAgIHF1ZXVlSXRlbS5yZXN1bWVBdCA9IGV2ZW50LmV2ZW50RGF0YS5yZXN1bWVBdDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgZm9yIHdhaXRfY29tcGxldGVkIGV2ZW50XG4gICAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAnd2FpdF9jb21wbGV0ZWQnKSB7XG4gICAgICAgIGNvbnN0IGV2ZW50UmVzdW1lQXQgPSBldmVudC5ldmVudERhdGE/LnJlc3VtZUF0O1xuICAgICAgICBpZiAoZXZlbnRSZXN1bWVBdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgcXVldWVJdGVtID0gY3R4Lmludm9jYXRpb25zUXVldWUuZ2V0KGNvcnJlbGF0aW9uSWQpO1xuICAgICAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdW1lQXQgPVxuICAgICAgICAgICAgcXVldWVJdGVtICYmIHF1ZXVlSXRlbS50eXBlID09PSAnd2FpdCdcbiAgICAgICAgICAgICAgPyBxdWV1ZUl0ZW0ucmVzdW1lQXRcbiAgICAgICAgICAgICAgOiByZXN1bWVBdDtcbiAgICAgICAgICBjb25zdCBldmVudFJlc3VtZUF0RGF0ZSA9IG5ldyBEYXRlKGV2ZW50UmVzdW1lQXQpO1xuICAgICAgICAgIGNvbnN0IGV2ZW50UmVzdW1lQXRNcyA9IGV2ZW50UmVzdW1lQXREYXRlLmdldFRpbWUoKTtcbiAgICAgICAgICBjb25zdCBleHBlY3RlZFJlc3VtZUF0TXMgPSBleHBlY3RlZFJlc3VtZUF0LmdldFRpbWUoKTtcbiAgICAgICAgICBjb25zdCBldmVudFJlc3VtZUF0Rm9yTWVzc2FnZSA9IE51bWJlci5pc0Zpbml0ZShldmVudFJlc3VtZUF0TXMpXG4gICAgICAgICAgICA/IGV2ZW50UmVzdW1lQXREYXRlLnRvSVNPU3RyaW5nKClcbiAgICAgICAgICAgIDogU3RyaW5nKGV2ZW50UmVzdW1lQXQpO1xuXG4gICAgICAgICAgaWYgKGV2ZW50UmVzdW1lQXRNcyAhPT0gZXhwZWN0ZWRSZXN1bWVBdE1zKSB7XG4gICAgICAgICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgICAgICAgICAgYFJlcGxheSBkaXZlcmdlbmNlOiB3YWl0X2NvbXBsZXRlZCBldmVudCBmb3IgJHtjb3JyZWxhdGlvbklkfSBoYXMgcmVzdW1lQXQgXCIke2V2ZW50UmVzdW1lQXRGb3JNZXNzYWdlfVwiLCBidXQgdGhlIGN1cnJlbnQgd2FpdCBjb25zdW1lciBleHBlY3RzIFwiJHtleHBlY3RlZFJlc3VtZUF0LnRvSVNPU3RyaW5nKCl9XCJgLFxuICAgICAgICAgICAgICAgICAgeyBldmVudElkOiBldmVudC5ldmVudElkIH1cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aGlzIHdhaXQgZnJvbSB0aGUgaW52b2NhdGlvbnMgcXVldWUgKE8oMSkgZGVsZXRlIHVzaW5nIE1hcClcbiAgICAgICAgY3R4Lmludm9jYXRpb25zUXVldWUuZGVsZXRlKGNvcnJlbGF0aW9uSWQpO1xuXG4gICAgICAgIC8vIFRoaXMgYHdhaXRfY29tcGxldGVkYCBpcyBhIGJyYW5jaC1kZWNpZGluZyByZXNvbHV0aW9uIHRoZSB3b3JrZmxvd1xuICAgICAgICAvLyBtYXkgYFByb21pc2UucmFjZWAgYWdhaW5zdCBhIGhvb2sgcGF5bG9hZCwgb3IgYXdhaXQgb24gYSBicmFuY2hcbiAgICAgICAgLy8gcGFyYWxsZWwgdG8gb25lIGF3YWl0aW5nIGEgc3RlcC4gT3JkZXIgaXQgZGV0ZXJtaW5pc3RpY2FsbHkgYnlcbiAgICAgICAgLy8gZXZlbnQtbG9nIHBvc2l0aW9uIChzZWUgYHBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzYCk6XG4gICAgICAgIC8vICAtIFJlZ2lzdGVyIGEgJ3dhaXQnIGJhcnJpZXIgYXQgdGhpcyBldmVudCdzIGluZGV4IHNvIGEgTEFURVItaW4tbG9nXG4gICAgICAgIC8vICAgIGhvb2sgcGF5bG9hZCBvciBzdGVwIHJlc3VsdCBpcyBkZWxpdmVyZWQgb25seSBhZnRlciB0aGlzIHdhaXQuXG4gICAgICAgIC8vICAtIEJlZm9yZSByZXNvbHZpbmcsIGRlZmVyIGJlaGluZCBldmVyeSBFQVJMSUVSLWluLWxvZyBIT09LIGFuZCBTVEVQXG4gICAgICAgIC8vICAgIGRlbGl2ZXJ5IHNvIHRoaXMgd2FpdCBkb2VzIG5vdCBwcmVlbXB0IG9uZSB0aGUgY29tbWl0dGVkIGxvZ1xuICAgICAgICAvLyAgICBvcmRlcmVkIGZpcnN0LiBUaGVuIG1hcmsgdGhpcyB3YWl0IGRlbGl2ZXJlZCB0byByZWxlYXNlIHRoZSBsYXRlclxuICAgICAgICAvLyAgICBkZWxpdmVyaWVzIGdhdGVkIG9uIGl0LlxuICAgICAgICBjb25zdCBldmVudEluZGV4ID0gY3R4LmV2ZW50c0NvbnN1bWVyLmV2ZW50SW5kZXg7XG4gICAgICAgIGNvbnN0IGJhcnJpZXIgPSByZWdpc3RlckRlbGl2ZXJ5QmFycmllcihjdHgsIGV2ZW50SW5kZXgsICd3YWl0Jyk7XG4gICAgICAgIC8vIFRoZSBkZWZlcnJhbCBpcyBjYXB0dXJlZCBIRVJFLCB3aGlsZSBjb25zdW1pbmcgdGhlIGV2ZW50LCBhbmQgbm90XG4gICAgICAgIC8vIGFmdGVyIHRoZSBxdWV1ZSB0YWlsIGJlbG93OiBzYW1lIHJlYXNvbmluZyBhcyBzdGVwLnRzLiBBbiBlYXJsaWVyXG4gICAgICAgIC8vIHN0ZXAgb3IgaG9vayB3aG9zZSBoeWRyYXRpb24gc2xvdCBzaXRzIGluIHRoYXQgdGFpbCBoYXMgdXN1YWxseVxuICAgICAgICAvLyBkZWxpdmVyZWQsIGFuZCBzbyBkZXJlZ2lzdGVyZWQgaXRzIGJhcnJpZXIsIGJ5IHRoZSB0aW1lIHRoZSB0YWlsXG4gICAgICAgIC8vIHJlc29sdmVzLiBSZWFkIHRoZW4sIGl0IHdvdWxkIGJlIGludmlzaWJsZSBhbmQgdGhpcyB3YWl0IHdvdWxkIHNraXBcbiAgICAgICAgLy8gYm90aCB0aGUgZ2F0ZSBBTkQgYGF3YWl0RWFybGllckRlbGl2ZXJpZXNgJyBtYWNyb3Rhc2sgeWllbGQsIGxldHRpbmdcbiAgICAgICAgLy8gaXQgb3ZlcnRha2UgdGhlIGJyYW5jaCB0aGF0IGVhcmxpZXIgZGVsaXZlcnkganVzdCB3b2tlLiBFdmVyeSBldmVudFxuICAgICAgICAvLyBpbiBvbmUgZHJhaW4gd2luZG93IGlzIGNvbnN1bWVkIGJlZm9yZSBhbnkgc2xvdCBydW5zLCBzbyBjYXB0dXJpbmdcbiAgICAgICAgLy8gYXQgY29uc3VtcHRpb24gdGltZSBzZWVzIGFsbCBvZiB0aGVtLlxuICAgICAgICBjb25zdCBlYXJsaWVyRGVsaXZlcmVkID0gYXdhaXRFYXJsaWVyRGVsaXZlcmllcyhcbiAgICAgICAgICBjdHgsXG4gICAgICAgICAgZXZlbnRJbmRleCxcbiAgICAgICAgICAnd2FpdCdcbiAgICAgICAgKTtcbiAgICAgICAgLy8gRGVmZXIgKyByZXNvbHZlIGluIGEgREVUQUNIRUQgcHJvbWlzZSAobm90IGNoYWluZWQgb250byB0aGUgc2VyaWFsXG4gICAgICAgIC8vIGBwcm9taXNlUXVldWVgKS4gYGF3YWl0RWFybGllckRlbGl2ZXJpZXNgIG1heSB3YWl0IG9uIGFuIGVhcmxpZXJcbiAgICAgICAgLy8gaG9vayBvciBzdGVwIGRlbGl2ZXJ5IHdob3NlIG93biByZXNvbHV0aW9uIGlzIGl0c2VsZiBkcml2ZW4gYnkgdGhlXG4gICAgICAgIC8vIHByb21pc2VRdWV1ZTsgYmxvY2tpbmcgYSBxdWV1ZSBzbG90IG9uIGl0IHdvdWxkIGRlYWRsb2NrIHRoZSBzZXJpYWxcbiAgICAgICAgLy8gcXVldWUuIFdlIHN0aWxsIGFuY2hvciB0byB0aGUgcXVldWUgdGFpbCBmaXJzdCBzbyBwcmlvciBxdWV1ZWRcbiAgICAgICAgLy8gaHlkcmF0aW9uL29yZGVyaW5nIHdvcmsgcnVucyBpbiBldmVudC1sb2cgb3JkZXIuXG4gICAgICAgIGNvbnN0IHF1ZXVlQXRDb21wbGV0aW9uID0gY3R4LnByb21pc2VRdWV1ZTtcbiAgICAgICAgdm9pZCBxdWV1ZUF0Q29tcGxldGlvblxuICAgICAgICAgIC50aGVuKCgpID0+IGVhcmxpZXJEZWxpdmVyZWQpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgYmFycmllci5tYXJrRGVsaXZlcmVkKCk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkZpbmlzaGVkO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGlzIHJlcGxheSBpbnN0YWxsZWQgYSBkaWZmZXJlbnQgY29uc3VtZXIgdGhhbiB0aGUgc3RvcmVkIGV2ZW50IG5lZWRzLlxuICAgICAgY3R4LnByb21pc2VRdWV1ZSA9IGN0eC5wcm9taXNlUXVldWUudGhlbigoKSA9PiB7XG4gICAgICAgIGN0eC5vbldvcmtmbG93RXJyb3IoXG4gICAgICAgICAgbmV3IFJlcGxheURpdmVyZ2VuY2VFcnJvcihcbiAgICAgICAgICAgIGBSZXBsYXkgZGl2ZXJnZW5jZTogVW5leHBlY3RlZCBldmVudCB0eXBlIGZvciB3YWl0ICR7Y29ycmVsYXRpb25JZH0gXCIke2V2ZW50LmV2ZW50VHlwZX1cImAsXG4gICAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfTtcbn1cbiJdfQ==
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xlZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd29ya2Zsb3cvc2xlZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTVELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLDBCQUEwQixHQUUzQixNQUFNLGVBQWUsQ0FBQztBQUV2QixNQUFNLFVBQVUsV0FBVyxDQUFDLEdBQWdDO0lBQzFELE9BQU8sS0FBSyxVQUFVLFNBQVMsQ0FDN0IsS0FBa0M7UUFFbEMsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxhQUFhLEVBQVEsQ0FBQztRQUNuRCxNQUFNLGFBQWEsR0FBRyxRQUFRLEdBQUcsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1FBRW5ELDRCQUE0QjtRQUM1QixNQUFNLFFBQVEsR0FBRyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU1QyxnRUFBZ0U7UUFDaEUsTUFBTSxRQUFRLEdBQTRCO1lBQ3hDLElBQUksRUFBRSxNQUFNO1lBQ1osYUFBYTtZQUNiLFFBQVE7U0FDVCxDQUFDO1FBQ0YsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFbEQsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNyQywrREFBK0Q7WUFDL0QsNENBQTRDO1lBQzVDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDWCwwQkFBMEIsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDaEMsT0FBTyxtQkFBbUIsQ0FBQyxXQUFXLENBQUM7WUFD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ICdAd29ya2Zsb3cvZXJyb3JzJztcbmltcG9ydCB7IHBhcnNlRHVyYXRpb25Ub0RhdGUsIHdpdGhSZXNvbHZlcnMgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMnO1xuaW1wb3J0IHR5cGUgeyBTdHJpbmdWYWx1ZSB9IGZyb20gJ21zJztcbmltcG9ydCB7IEV2ZW50Q29uc3VtZXJSZXN1bHQgfSBmcm9tICcuLi9ldmVudHMtY29uc3VtZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBXYWl0SW52b2NhdGlvblF1ZXVlSXRlbSB9IGZyb20gJy4uL2dsb2JhbC5qcyc7XG5pbXBvcnQge1xuICBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzLFxuICByZWdpc3RlckRlbGl2ZXJ5QmFycmllcixcbiAgc2NoZWR1bGVXb3JrZmxvd1N1c3BlbnNpb24sXG4gIHR5cGUgV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0LFxufSBmcm9tICcuLi9wcml2YXRlLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNsZWVwKGN0eDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0KSB7XG4gIHJldHVybiBhc3luYyBmdW5jdGlvbiBzbGVlcEltcGwoXG4gICAgcGFyYW06IFN0cmluZ1ZhbHVlIHwgRGF0ZSB8IG51bWJlclxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHByb21pc2UsIHJlc29sdmUgfSA9IHdpdGhSZXNvbHZlcnM8dm9pZD4oKTtcbiAgICBjb25zdCBjb3JyZWxhdGlvbklkID0gYHdhaXRfJHtjdHguZ2VuZXJhdGVVbGlkKCl9YDtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgcmVzdW1lIHRpbWVcbiAgICBjb25zdCByZXN1bWVBdCA9IHBhcnNlRHVyYXRpb25Ub0RhdGUocGFyYW0pO1xuXG4gICAgLy8gQWRkIHdhaXQgdG8gaW52b2NhdGlvbnMgcXVldWUgKHVzaW5nIE1hcCBmb3IgTygxKSBvcGVyYXRpb25zKVxuICAgIGNvbnN0IHdhaXRJdGVtOiBXYWl0SW52b2NhdGlvblF1ZXVlSXRlbSA9IHtcbiAgICAgIHR5cGU6ICd3YWl0JyxcbiAgICAgIGNvcnJlbGF0aW9uSWQsXG4gICAgICByZXN1bWVBdCxcbiAgICB9O1xuICAgIGN0eC5pbnZvY2F0aW9uc1F1ZXVlLnNldChjb3JyZWxhdGlvbklkLCB3YWl0SXRlbSk7XG5cbiAgICBjdHguZXZlbnRzQ29uc3VtZXIuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGV2ZW50cyBhbmQgd2UncmUgd2FpdGluZyBmb3Igd2FpdF9jb21wbGV0ZWQsXG4gICAgICAvLyBzdXNwZW5kIHRoZSB3b3JrZmxvdyB1bnRpbCB0aGUgd2FpdCBmaXJlc1xuICAgICAgaWYgKCFldmVudCkge1xuICAgICAgICBzY2hlZHVsZVdvcmtmbG93U3VzcGVuc2lvbihjdHgpO1xuICAgICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Ob3RDb25zdW1lZDtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LmNvcnJlbGF0aW9uSWQgIT09IGNvcnJlbGF0aW9uSWQpIHtcbiAgICAgICAgLy8gV2UncmUgbm90IGludGVyZXN0ZWQgaW4gdGhpcyBldmVudCAtIHRoZSBjb3JyZWxhdGlvbklkIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgZW50aXR5XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3Igd2FpdF9jcmVhdGVkIGV2ZW50IHRvIG1hcmsgdGhpcyB3YWl0IGFzIGhhdmluZyB0aGUgZXZlbnQgY3JlYXRlZFxuICAgICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3dhaXRfY3JlYXRlZCcpIHtcbiAgICAgICAgLy8gTWFyayB0aGlzIHdhaXQgYXMgaGF2aW5nIHRoZSBjcmVhdGVkIGV2ZW50LCBidXQga2VlcCBpdCBpbiB0aGUgcXVldWVcbiAgICAgICAgLy8gTygxKSBsb29rdXAgdXNpbmcgTWFwXG4gICAgICAgIGNvbnN0IHF1ZXVlSXRlbSA9IGN0eC5pbnZvY2F0aW9uc1F1ZXVlLmdldChjb3JyZWxhdGlvbklkKTtcbiAgICAgICAgaWYgKHF1ZXVlSXRlbSAmJiBxdWV1ZUl0ZW0udHlwZSA9PT0gJ3dhaXQnKSB7XG4gICAgICAgICAgcXVldWVJdGVtLmhhc0NyZWF0ZWRFdmVudCA9IHRydWU7XG4gICAgICAgICAgcXVldWVJdGVtLnJlc3VtZUF0ID0gZXZlbnQuZXZlbnREYXRhLnJlc3VtZUF0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBmb3Igd2FpdF9jb21wbGV0ZWQgZXZlbnRcbiAgICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICd3YWl0X2NvbXBsZXRlZCcpIHtcbiAgICAgICAgY29uc3QgZXZlbnRSZXN1bWVBdCA9IGV2ZW50LmV2ZW50RGF0YT8ucmVzdW1lQXQ7XG4gICAgICAgIGlmIChldmVudFJlc3VtZUF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCBxdWV1ZUl0ZW0gPSBjdHguaW52b2NhdGlvbnNRdWV1ZS5nZXQoY29ycmVsYXRpb25JZCk7XG4gICAgICAgICAgY29uc3QgZXhwZWN0ZWRSZXN1bWVBdCA9XG4gICAgICAgICAgICBxdWV1ZUl0ZW0gJiYgcXVldWVJdGVtLnR5cGUgPT09ICd3YWl0J1xuICAgICAgICAgICAgICA/IHF1ZXVlSXRlbS5yZXN1bWVBdFxuICAgICAgICAgICAgICA6IHJlc3VtZUF0O1xuICAgICAgICAgIGNvbnN0IGV2ZW50UmVzdW1lQXREYXRlID0gbmV3IERhdGUoZXZlbnRSZXN1bWVBdCk7XG4gICAgICAgICAgY29uc3QgZXZlbnRSZXN1bWVBdE1zID0gZXZlbnRSZXN1bWVBdERhdGUuZ2V0VGltZSgpO1xuICAgICAgICAgIGNvbnN0IGV4cGVjdGVkUmVzdW1lQXRNcyA9IGV4cGVjdGVkUmVzdW1lQXQuZ2V0VGltZSgpO1xuICAgICAgICAgIGNvbnN0IGV2ZW50UmVzdW1lQXRGb3JNZXNzYWdlID0gTnVtYmVyLmlzRmluaXRlKGV2ZW50UmVzdW1lQXRNcylcbiAgICAgICAgICAgID8gZXZlbnRSZXN1bWVBdERhdGUudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgOiBTdHJpbmcoZXZlbnRSZXN1bWVBdCk7XG5cbiAgICAgICAgICBpZiAoZXZlbnRSZXN1bWVBdE1zICE9PSBleHBlY3RlZFJlc3VtZUF0TXMpIHtcbiAgICAgICAgICAgIGN0eC5wcm9taXNlUXVldWUgPSBjdHgucHJvbWlzZVF1ZXVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICBjdHgub25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICAgICAgICAgIG5ldyBSZXBsYXlEaXZlcmdlbmNlRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgUmVwbGF5IGRpdmVyZ2VuY2U6IHdhaXRfY29tcGxldGVkIGV2ZW50IGZvciAke2NvcnJlbGF0aW9uSWR9IGhhcyByZXN1bWVBdCBcIiR7ZXZlbnRSZXN1bWVBdEZvck1lc3NhZ2V9XCIsIGJ1dCB0aGUgY3VycmVudCB3YWl0IGNvbnN1bWVyIGV4cGVjdHMgXCIke2V4cGVjdGVkUmVzdW1lQXQudG9JU09TdHJpbmcoKX1cImAsXG4gICAgICAgICAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRoaXMgd2FpdCBmcm9tIHRoZSBpbnZvY2F0aW9ucyBxdWV1ZSAoTygxKSBkZWxldGUgdXNpbmcgTWFwKVxuICAgICAgICBjdHguaW52b2NhdGlvbnNRdWV1ZS5kZWxldGUoY29ycmVsYXRpb25JZCk7XG5cbiAgICAgICAgLy8gVGhpcyBgd2FpdF9jb21wbGV0ZWRgIGlzIGEgYnJhbmNoLWRlY2lkaW5nIHJlc29sdXRpb24gdGhlIHdvcmtmbG93XG4gICAgICAgIC8vIG1heSBgUHJvbWlzZS5yYWNlYCBhZ2FpbnN0IGEgaG9vayBwYXlsb2FkLCBvciBhd2FpdCBvbiBhIGJyYW5jaFxuICAgICAgICAvLyBwYXJhbGxlbCB0byBvbmUgYXdhaXRpbmcgYSBzdGVwLiBPcmRlciBpdCBkZXRlcm1pbmlzdGljYWxseSBieVxuICAgICAgICAvLyBldmVudC1sb2cgcG9zaXRpb24gKHNlZSBgcGVuZGluZ0RlbGl2ZXJ5QmFycmllcnNgKTpcbiAgICAgICAgLy8gIC0gUmVnaXN0ZXIgYSAnd2FpdCcgYmFycmllciBhdCB0aGlzIGV2ZW50J3MgaW5kZXggc28gYSBMQVRFUi1pbi1sb2dcbiAgICAgICAgLy8gICAgaG9vayBwYXlsb2FkIG9yIHN0ZXAgcmVzdWx0IGlzIGRlbGl2ZXJlZCBvbmx5IGFmdGVyIHRoaXMgd2FpdC5cbiAgICAgICAgLy8gIC0gQmVmb3JlIHJlc29sdmluZywgZGVmZXIgYmVoaW5kIGV2ZXJ5IEVBUkxJRVItaW4tbG9nIEhPT0sgYW5kIFNURVBcbiAgICAgICAgLy8gICAgZGVsaXZlcnkgc28gdGhpcyB3YWl0IGRvZXMgbm90IHByZWVtcHQgb25lIHRoZSBjb21taXR0ZWQgbG9nXG4gICAgICAgIC8vICAgIG9yZGVyZWQgZmlyc3QuIFRoZW4gbWFyayB0aGlzIHdhaXQgZGVsaXZlcmVkIHRvIHJlbGVhc2UgdGhlIGxhdGVyXG4gICAgICAgIC8vICAgIGRlbGl2ZXJpZXMgZ2F0ZWQgb24gaXQuXG4gICAgICAgIGNvbnN0IGV2ZW50SW5kZXggPSBjdHguZXZlbnRzQ29uc3VtZXIuZXZlbnRJbmRleDtcbiAgICAgICAgY29uc3QgYmFycmllciA9IHJlZ2lzdGVyRGVsaXZlcnlCYXJyaWVyKGN0eCwgZXZlbnRJbmRleCwgJ3dhaXQnKTtcbiAgICAgICAgLy8gVGhlIGRlZmVycmFsIGlzIGNhcHR1cmVkIEhFUkUsIHdoaWxlIGNvbnN1bWluZyB0aGUgZXZlbnQsIGFuZCBub3RcbiAgICAgICAgLy8gYWZ0ZXIgdGhlIHF1ZXVlIHRhaWwgYmVsb3c6IHNhbWUgcmVhc29uaW5nIGFzIHN0ZXAudHMuIEFuIGVhcmxpZXJcbiAgICAgICAgLy8gc3RlcCBvciBob29rIHdob3NlIGh5ZHJhdGlvbiBzbG90IHNpdHMgaW4gdGhhdCB0YWlsIGhhcyB1c3VhbGx5XG4gICAgICAgIC8vIGRlbGl2ZXJlZCwgYW5kIHNvIGRlcmVnaXN0ZXJlZCBpdHMgYmFycmllciwgYnkgdGhlIHRpbWUgdGhlIHRhaWxcbiAgICAgICAgLy8gcmVzb2x2ZXMuIFJlYWQgdGhlbiwgaXQgd291bGQgYmUgaW52aXNpYmxlIGFuZCB0aGlzIHdhaXQgd291bGQgc2tpcFxuICAgICAgICAvLyBib3RoIHRoZSBnYXRlIEFORCBgYXdhaXRFYXJsaWVyRGVsaXZlcmllc2AnIG1hY3JvdGFzayB5aWVsZCwgbGV0dGluZ1xuICAgICAgICAvLyBpdCBvdmVydGFrZSB0aGUgYnJhbmNoIHRoYXQgZWFybGllciBkZWxpdmVyeSBqdXN0IHdva2UuIEV2ZXJ5IGV2ZW50XG4gICAgICAgIC8vIGluIG9uZSBkcmFpbiB3aW5kb3cgaXMgY29uc3VtZWQgYmVmb3JlIGFueSBzbG90IHJ1bnMsIHNvIGNhcHR1cmluZ1xuICAgICAgICAvLyBhdCBjb25zdW1wdGlvbiB0aW1lIHNlZXMgYWxsIG9mIHRoZW0uXG4gICAgICAgIGNvbnN0IGVhcmxpZXJEZWxpdmVyZWQgPSBhd2FpdEVhcmxpZXJEZWxpdmVyaWVzKFxuICAgICAgICAgIGN0eCxcbiAgICAgICAgICBldmVudEluZGV4LFxuICAgICAgICAgICd3YWl0J1xuICAgICAgICApO1xuICAgICAgICAvLyBEZWZlciArIHJlc29sdmUgaW4gYSBERVRBQ0hFRCBwcm9taXNlIChub3QgY2hhaW5lZCBvbnRvIHRoZSBzZXJpYWxcbiAgICAgICAgLy8gYHByb21pc2VRdWV1ZWApLiBgYXdhaXRFYXJsaWVyRGVsaXZlcmllc2AgbWF5IHdhaXQgb24gYW4gZWFybGllclxuICAgICAgICAvLyBob29rIG9yIHN0ZXAgZGVsaXZlcnkgd2hvc2Ugb3duIHJlc29sdXRpb24gaXMgaXRzZWxmIGRyaXZlbiBieSB0aGVcbiAgICAgICAgLy8gcHJvbWlzZVF1ZXVlOyBibG9ja2luZyBhIHF1ZXVlIHNsb3Qgb24gaXQgd291bGQgZGVhZGxvY2sgdGhlIHNlcmlhbFxuICAgICAgICAvLyBxdWV1ZS4gV2Ugc3RpbGwgYW5jaG9yIHRvIHRoZSBxdWV1ZSB0YWlsIGZpcnN0IHNvIHByaW9yIHF1ZXVlZFxuICAgICAgICAvLyBoeWRyYXRpb24vb3JkZXJpbmcgd29yayBydW5zIGluIGV2ZW50LWxvZyBvcmRlci5cbiAgICAgICAgY29uc3QgcXVldWVBdENvbXBsZXRpb24gPSBjdHgucHJvbWlzZVF1ZXVlO1xuICAgICAgICB2b2lkIHF1ZXVlQXRDb21wbGV0aW9uXG4gICAgICAgICAgLnRoZW4oKCkgPT4gZWFybGllckRlbGl2ZXJlZClcbiAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBiYXJyaWVyLm1hcmtEZWxpdmVyZWQoKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuRmluaXNoZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoaXMgcmVwbGF5IGluc3RhbGxlZCBhIGRpZmZlcmVudCBjb25zdW1lciB0aGFuIHRoZSBzdG9yZWQgZXZlbnQgbmVlZHMuXG4gICAgICBjdHgucHJvbWlzZVF1ZXVlID0gY3R4LnByb21pc2VRdWV1ZS50aGVuKCgpID0+IHtcbiAgICAgICAgY3R4Lm9uV29ya2Zsb3dFcnJvcihcbiAgICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgICAgYFJlcGxheSBkaXZlcmdlbmNlOiBVbmV4cGVjdGVkIGV2ZW50IHR5cGUgZm9yIHdhaXQgJHtjb3JyZWxhdGlvbklkfSBcIiR7ZXZlbnQuZXZlbnRUeXBlfVwiYCxcbiAgICAgICAgICAgIHsgZXZlbnRJZDogZXZlbnQuZXZlbnRJZCB9XG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5GaW5pc2hlZDtcbiAgICB9KTtcblxuICAgIHJldHVybiBwcm9taXNlO1xuICB9O1xufVxuIl19
package/dist/workflow.js CHANGED
@@ -246,17 +246,17 @@ async function createWorkflowSessionInner({ workflowCode, workflowRun, events, e
246
246
  state = WorkflowSuspension.is(error)
247
247
  ? { type: 'suspended', suspension: error }
248
248
  : { type: 'replay' };
249
- // Step, hook, and attribute consumers can schedule the same suspension.
250
- // The first signal advances the generation so the rest no-op.
249
+ // Step, hook, wait, and attribute consumers can schedule the same
250
+ // suspension. The first signal advances the generation so the rest
251
+ // no-op.
251
252
  workflowContext.suspensionGeneration++;
252
253
  interruption.reject(error);
253
254
  return;
254
255
  }
255
256
  case 'suspended':
256
257
  // Same-boundary duplicates were staled by the generation bump above,
257
- // so anything landing here is out-of-band an unguarded sleep signal
258
- // or a divergence. Those boundaries are unretainable (the runtime
259
- // demotes them too), so fall back to replay.
258
+ // so anything landing here is out-of-band or a divergence. Fall back
259
+ // to replay rather than resuming a potentially inconsistent session.
260
260
  state = { type: 'replay' };
261
261
  return;
262
262
  case 'replay':
@@ -986,4 +986,4 @@ async function createWorkflowSessionInner({ workflowCode, workflowRun, events, e
986
986
  execution,
987
987
  };
988
988
  }
989
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUNMLFdBQVcsRUFDWCxxQkFBcUIsRUFDckIsMEJBQTBCLEVBQzFCLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFFckIsYUFBYSxHQUNkLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFL0QsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakYsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUzRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU5QyxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHdCQUF3QixHQUN6QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxhQUFh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QUFDLG9CQUFvQixFQUFFLENBQUM7b0JBQ3ZDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUMvQixjQUFjLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQzVELE9BQU8sZ0JBQWdCLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUN0RCxDQUFDO2dCQUNELEtBQUssUUFBUTtvQkFDWCxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixLQUFLLFdBQVcsQ0FBQztnQkFDakIsS0FBSyxTQUFTO29CQUNaLE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsaUJBQWlCLEtBQUssQ0FBQyxJQUFJLGNBQWMsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUM5RCxDQUFDO1lBQ04sQ0FBQztZQUNELEtBQXFCLENBQUM7UUFDeEIsQ0FBQztLQUNGLENBQUM7SUFFRiwwRUFBMEU7SUFDMUUsNkVBQTZFO0lBQzdFLDJFQUEyRTtJQUMzRSxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUN0RSxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFdkQsT0FBTztRQUNMLE9BQU87UUFDUCxTQUFTO0tBQ1YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNjcmlwdCB9IGZyb20gJ25vZGU6dm0nO1xuaW1wb3J0IHR5cGUgeyBTcGFuIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcbmltcG9ydCB7XG4gIEVSUk9SX1NMVUdTLFxuICBSZXBsYXlEaXZlcmdlbmNlRXJyb3IsXG4gIFdvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQge1xuICBjcmVhdGVXb3JrZmxvd0Jhc2VVcmwsXG4gIHR5cGUgUHJvbWlzZVdpdGhSZXNvbHZlcnMsXG4gIHdpdGhSZXNvbHZlcnMsXG59IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgeyBwYXJzZVdvcmtmbG93TmFtZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB0eXBlIHsgRXZlbnQsIFdvcmtmbG93UnVuLCBXb3JsZENhcGFiaWxpdGllcyB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04gfSBmcm9tICdAd29ya2Zsb3cvd29ybGQvc3BlYy12ZXJzaW9uJztcbmltcG9ydCAqIGFzIG5hbm9pZCBmcm9tICduYW5vaWQnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCwgRXZlbnRzQ29uc3VtZXIgfSBmcm9tICcuL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1ZXVlSXRlbSB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IEVOT1RTVVAsIFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCB9IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQgeyBpc0RlbGl2ZXJ5SWRsZSB9IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQgeyBSZXBsYXlQYXlsb2FkQ2FjaGUgfSBmcm9tICcuL3JlcGxheS1wYXlsb2FkLWNhY2hlLmpzJztcbmltcG9ydCB7IGdldFBvcnRMYXp5IH0gZnJvbSAnLi9ydW50aW1lL2dldC1wb3J0LWxhenkuanMnO1xuaW1wb3J0IHsgcnVuSWRDcmVhdGVkQXQgfSBmcm9tICcuL3J1bnRpbWUvcnVuLWlkLXRpbWUuanMnO1xuaW1wb3J0IHsgaGFuZGxlU3VzcGVuc2lvbiB9IGZyb20gJy4vcnVudGltZS9zdXNwZW5zaW9uLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgZ2V0V29ybGQgfSBmcm9tICcuL3J1bnRpbWUvd29ybGQuanMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkS2V5IH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZSxcbiAgaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgY3JlYXRlVXNlU3RlcCB9IGZyb20gJy4vc3RlcC5qcyc7XG5pbXBvcnQge1xuICBCT0RZX0lOSVRfU1lNQk9MLFxuICBTVEFCTEVfVUxJRCxcbiAgV09SS0ZMT1dfQ1JFQVRFX0hPT0ssXG4gIFdPUktGTE9XX0dFVF9TVFJFQU1fSUQsXG4gIFdPUktGTE9XX1NFVF9BVFRSSUJVVEVTLFxuICBXT1JLRkxPV19TTEVFUCxcbiAgV09SS0ZMT1dfVVNFX1NURVAsXG59IGZyb20gJy4vc3ltYm9scy5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHtcbiAgYXBwbHlXb3JrZmxvd1N1c3BlbnNpb25Ub1NwYW4sXG4gIGNyZWF0ZVJlZnJlc2hhYmxlVHJhY2VDb250ZXh0LFxuICBzdGFydFRyYWNlU3BhbixcbiAgdHJhY2UsXG59IGZyb20gJy4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93UnVuU3RyZWFtSWQgfSBmcm9tICcuL3V0aWwuanMnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJy4vdm0vaW5kZXguanMnO1xuaW1wb3J0IHsgZ2V0Q2FjaGVkV29ya2Zsb3dTY3JpcHQgfSBmcm9tICcuL3ZtL3NjcmlwdC1jYWNoZS5qcyc7XG5pbXBvcnQge1xuICBjcmVhdGVBYm9ydFNpZ25hbFN0YXRpY3MsXG4gIGNyZWF0ZUNyZWF0ZUFib3J0Q29udHJvbGxlcixcbn0gZnJvbSAnLi93b3JrZmxvdy9hYm9ydC1jb250cm9sbGVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZVNldEF0dHJpYnV0ZXMgfSBmcm9tICcuL3dvcmtmbG93L2F0dHJpYnV0ZS1kaXNwYXRjaGVyLmpzJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dNZXRhZGF0YSB9IGZyb20gJy4vd29ya2Zsb3cvZ2V0LXdvcmtmbG93LW1ldGFkYXRhLmpzJztcbmltcG9ydCB7IFdPUktGTE9XX0NPTlRFWFRfU1lNQk9MIH0gZnJvbSAnLi93b3JrZmxvdy9nZXQtd29ya2Zsb3ctbWV0YWRhdGEuanMnO1xuaW1wb3J0IHsgY3JlYXRlQ3JlYXRlSG9vayB9IGZyb20gJy4vd29ya2Zsb3cvaG9vay5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTbGVlcCB9IGZyb20gJy4vd29ya2Zsb3cvc2xlZXAuanMnO1xuXG4vKipcbiAqIERyYWluIHBlbmRpbmcgcXVldWUgaXRlbXMgYXQgd29ya2Zsb3cgY29tcGxldGlvbiAoc3VjY2VzcyBvciBmYWlsdXJlKS5cbiAqXG4gKiBUcmVhdHMgY29tcGxldGlvbiBhcyBhIGZpbmFsIHN1c3BlbnNpb24gc28gdW5hd2FpdGVkIGhvb2ssIHdhaXQsIGFuZFxuICogYXR0cmlidXRlIG9wZXJhdGlvbnMgYXJlIHJlY29yZGVkIGJlZm9yZSB0aGUgcnVuIGJlY29tZXMgdGVybWluYWwuIFRoaXNcbiAqIGFsc28gbGV0cyBhIGZpbmFsIGBjb250cm9sbGVyLmFib3J0KClgIHJlYWNoIGluLWZsaWdodCBzdGVwcy5cbiAqXG4gKiBJdCByZWNvcmRzIGAqX2NyZWF0ZWRgIGFuZCBuYXRpdmUgYXR0cmlidXRlIGV2ZW50cywgYnV0IG5ldmVyIGV4ZWN1dGVzIHN0ZXBcbiAqIGJvZGllczogYHN0ZXBfc3RhcnRlZGAgaXMgcmVqZWN0ZWQgYWZ0ZXIgdGhlIHJ1biBiZWNvbWVzIHRlcm1pbmFsLiBBXG4gKiBmaXJlLWFuZC1mb3JnZXQgc3RlcCB0aGVyZWZvcmUgbmVlZHMgYSBsYXRlciBzdXNwZW5zaW9uIHRvIGJlIHNjaGVkdWxlZC5cbiAqXG4gKiBEcmFpbiBmYWlsdXJlcyBkbyBub3QgY2hhbmdlIHRoZSB3b3JrZmxvdydzIHRlcm1pbmFsIG91dGNvbWUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRyYWluUGVuZGluZ1F1ZXVlSXRlbXMoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIHBlbmRpbmdRdWV1ZTogTWFwPHN0cmluZywgUXVldWVJdGVtPixcbiAgdm1HbG9iYWxUaGlzOiB0eXBlb2YgZ2xvYmFsVGhpcyxcbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuLFxuICBvdXRjb21lOiAnY29tcGxldGVkJyB8ICdmYWlsZWQnLFxuICAvKipcbiAgICogSW4gdHVyYm8gbW9kZSwgZ2F0ZXMgZmluYWwgYCpfY3JlYXRlZGAgd3JpdGVzIG9uIGJhY2tncm91bmRlZFxuICAgKiBgcnVuX3N0YXJ0ZWRgLiBVbmRlZmluZWQgd2hlbiBgcnVuX3N0YXJ0ZWRgIGlzIGF3YWl0ZWQuXG4gICAqL1xuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHBlbmRpbmdRdWV1ZS5zaXplID09PSAwKSByZXR1cm47XG4gIC8vIEltcGxpY2l0bHkgZGlzcG9zZSBhbnkgYWJvcnQgaG9va3MgKHN5c3RlbSBob29rcykgdGhhdCBhcmUgc3RpbGwgYWxpdmUgYXRcbiAgLy8gd29ya2Zsb3cgY29tcGxldGlvbiBzbyB0aGV5IGRvbid0IGxlYWsgcm93cyBpbiB0aGUgaG9va3MgdGFibGUgZm9yIHRoZVxuICAvLyBydW4ncyBsaWZldGltZS4gU2tpcCBob29rcyB0aGF0IGFscmVhZHkgaGF2ZSBhbiBhYm9ydCBpbiBmbGlnaHQ7IHRob3NlXG4gIC8vIHdpbGwgZW1pdCBob29rX3JlY2VpdmVkIHZpYSB0aGUgYWJvcnQgcHJvY2Vzc2luZyBwYXRoLiBVc2VyIGhvb2tzXG4gIC8vIChpc1N5c3RlbSAhPT0gdHJ1ZSkgYXJlIGludGVudGlvbmFsbHkgbGVmdCBhbG9uZTogdGhlaXIgbGlmZXRpbWUgaXNcbiAgLy8gbWFuYWdlZCBieSB0aGUgdXNlcidzIGNvZGUsIG5vdCB0aGUgcnVudGltZS5cbiAgZm9yIChjb25zdCBpdGVtIG9mIHBlbmRpbmdRdWV1ZS52YWx1ZXMoKSkge1xuICAgIGlmIChcbiAgICAgIGl0ZW0udHlwZSA9PT0gJ2hvb2snICYmXG4gICAgICBpdGVtLmlzU3lzdGVtICYmXG4gICAgICAhaXRlbS5kaXNwb3NlZCAmJlxuICAgICAgIWl0ZW0uYWJvcnRSZXF1ZXN0ZWRcbiAgICApIHtcbiAgICAgIGl0ZW0uZGlzcG9zZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcbiAgICBjb25zdCBzeW50aGVzaXplZCA9IG5ldyBXb3JrZmxvd1N1c3BlbnNpb24ocGVuZGluZ1F1ZXVlLCB2bUdsb2JhbFRoaXMpO1xuICAgIGF3YWl0IGhhbmRsZVN1c3BlbnNpb24oe1xuICAgICAgc3VzcGVuc2lvbjogc3ludGhlc2l6ZWQsXG4gICAgICB3b3JsZCxcbiAgICAgIHJ1bjogd29ya2Zsb3dSdW4sXG4gICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgIGBGYWlsZWQgdG8gZHJhaW4gcGVuZGluZyBxdWV1ZSBpdGVtcyBmb3IgJHtvdXRjb21lfSB3b3JrZmxvdyBydW5gLFxuICAgICAge1xuICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgbWVzc2FnZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuLyoqIEV2ZXJ5dGhpbmcgbmVlZGVkIHRvIGNvbGQtc3RhcnQgYSB3b3JrZmxvdyBWTSBvdmVyIGFuIGV2ZW50IGxvZy4gKi9cbmludGVyZmFjZSBXb3JrZmxvd1Nlc3Npb25PcHRpb25zIHtcbiAgcmVhZG9ubHkgd29ya2Zsb3dDb2RlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bjtcbiAgcmVhZG9ubHkgZXZlbnRzOiBFdmVudFtdO1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkO1xuICByZWFkb25seSByZXBsYXlQYXlsb2FkQ2FjaGU6IFJlcGxheVBheWxvYWRDYWNoZTtcbiAgcmVhZG9ubHkgY29tcGlsZWRXb3JrZmxvd1NjcmlwdHM/OiBDb21waWxlZFdvcmtmbG93U2NyaXB0cztcbiAgcmVhZG9ubHkgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPjtcbiAgcmVhZG9ubHkgd29ybGRDYXBhYmlsaXRpZXM/OiBXb3JsZENhcGFiaWxpdGllcztcbn1cblxuLyoqIENvbnRleHQtaW5kZXBlbmRlbnQgVjggc2NyaXB0cyB0aGF0IGNhbiBiZSBldmFsdWF0ZWQgaW4gYW55IGZyZXNoIFZNLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21waWxlZFdvcmtmbG93U2NyaXB0cyB7XG4gIHJlYWRvbmx5IGJ1bmRsZVNjcmlwdDogU2NyaXB0O1xuICByZWFkb25seSB3b3JrZmxvd0xvb2t1cFNjcmlwdDogU2NyaXB0O1xufVxuXG4vKipcbiAqIENvbXBpbGUgdGhlIHdvcmtmbG93IGJ1bmRsZSBiZWZvcmUgaXRzIHJ1biBzbmFwc2hvdCBpcyBhdmFpbGFibGUuXG4gKlxuICogQ29tcGlsYXRpb24gZGVwZW5kcyBvbmx5IG9uIHRoZSByb3V0ZSdzIGJ1bmRsZSBzdHJpbmcgYW5kIHRoZSB3b3JrZmxvdyBuYW1lXG4gKiBwZXJzaXN0ZWQgb24gdGhlIHJ1biwgbm90IHRoZSBldmVudCBsb2cgb3IgVk0gY29udGV4dC4gVGhlIHJ1bnRpbWUgc3RhcnRzXG4gKiB0aGlzIHByb21pc2Ugd2hpbGUgYHJ1bl9zdGFydGVkYCBsb2FkcyB0aGUgcmVwbGF5IHNuYXBzaG90LCB0aGVuIGV2YWx1YXRlc1xuICogdGhlIHNjcmlwdHMgb25seSBhZnRlciBpdCBoYXMgY3JlYXRlZCB0aGUgZnJlc2ggY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVXb3JrZmxvd0J1bmRsZShcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gIHdvcmtmbG93TmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPENvbXBpbGVkV29ya2Zsb3dTY3JpcHRzPiB7XG4gIGNvbnN0IHBhcnNlZE5hbWUgPSBwYXJzZVdvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpO1xuICBjb25zdCBmaWxlbmFtZSA9IHBhcnNlZE5hbWU/Lm1vZHVsZVNwZWNpZmllciB8fCB3b3JrZmxvd05hbWU7XG4gIGNvbnN0IHdvcmtmbG93TG9va3VwQ29kZSA9IGBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3M/LmdldCgke0pTT04uc3RyaW5naWZ5KHdvcmtmbG93TmFtZSl9KWA7XG5cbiAgcmV0dXJuIHRyYWNlKCd3b3JrZmxvdy5idW5kbGUuY29tcGlsZScsIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgY29uc3QgYnVuZGxlID0gZ2V0Q2FjaGVkV29ya2Zsb3dTY3JpcHQod29ya2Zsb3dDb2RlLCBmaWxlbmFtZSk7XG4gICAgY29uc3QgbG9va3VwID0gZ2V0Q2FjaGVkV29ya2Zsb3dTY3JpcHQod29ya2Zsb3dMb29rdXBDb2RlLCBmaWxlbmFtZSk7XG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAvLyBUaGlzIGF0dHJpYnV0ZSBpbnRlbnRpb25hbGx5IGRlc2NyaWJlcyB0aGUgd29ya2Zsb3cgYnVuZGxlLiBUaGUgdGlueVxuICAgICAgLy8gbG9va3VwIHNjcmlwdCBtYXkgbWlzcyB3aGVuIGFub3RoZXIgd29ya2Zsb3cgZnJvbSB0aGUgc2FtZSBzb3VyY2UgZmlsZVxuICAgICAgLy8gcnVucywgYnV0IHRoYXQgZG9lcyBub3QgbWVhbiBWOCByZWNvbXBpbGVkIHRoZSBhcHBsaWNhdGlvbiBidW5kbGUuXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dCdW5kbGVDb21waWxlQ2FjaGVIaXQoYnVuZGxlLmNhY2hlSGl0KSxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgYnVuZGxlU2NyaXB0OiBidW5kbGUuc2NyaXB0LFxuICAgICAgd29ya2Zsb3dMb29rdXBTY3JpcHQ6IGxvb2t1cC5zY3JpcHQsXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogQSBsaXZlIHdvcmtmbG93IFZNLCBwYXJrZWQgYXQgYSBzdXNwZW5zaW9uIGJvdW5kYXJ5LiBgcmVzdW1lYCBhZHZhbmNlcyBpdFxuICogYnkgYXBwZW5kaW5nIGV2ZW50cyBpbnN0ZWFkIG9mIHJlcGxheWluZyBmcm9tIHNjcmF0Y2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dTZXNzaW9uIHtcbiAgcmVhZG9ubHkgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICByZWFkb25seSBhcmd1bWVudENvdW50OiBudW1iZXI7XG4gIHJlc3VtZShldmVudHM6IEV2ZW50W10pOiBQcm9taXNlPFdvcmtmbG93UmVzdW1lUmVzdWx0Pjtcbn1cblxuLyoqIEEgZmluaXNoZWQgZXhlY3V0aW9uIGF0dGVtcHQ6IHRoZSB3b3JrZmxvdydzIG91dHB1dCBvciBhIGxpdmUgYm91bmRhcnkuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1Jlc3VsdCA9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ2NvbXBsZXRlZCc7XG4gICAgICByZWFkb25seSBvdXRwdXQ6IHVua25vd247XG4gICAgICAvKiogYHR5cGVvZmAgdGhlIHJhdyByZXR1cm4gdmFsdWUsIGZvciB0ZWxlbWV0cnkuICovXG4gICAgICByZWFkb25seSByZXN1bHRUeXBlOiBzdHJpbmc7XG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6ICdzdXNwZW5kZWQnO1xuICAgICAgcmVhZG9ubHkgc3VzcGVuc2lvbjogV29ya2Zsb3dTdXNwZW5zaW9uO1xuICAgICAgcmVhZG9ubHkgc2Vzc2lvbjogV29ya2Zsb3dTZXNzaW9uO1xuICAgICAgLyoqXG4gICAgICAgKiBFdmVudHMgdGhlIHJlcGxheSB3YWxrZWQgcGFzdCB1bmNsYWltZWQgYW5kIGlzIHN0aWxsIGhvbGRpbmcsIGlmIGFueS5cbiAgICAgICAqIE9yZGluYXJ5IG9uIGEgc3VzcGVuc2lvbiwgYW5kIG9ubHkgYWN0aW9uYWJsZSBhY3Jvc3MgYSBydW4nc1xuICAgICAgICogc3VzcGVuc2lvbnMsIHNvIGl0IGlzIHJlcG9ydGVkIGZvciB0ZWxlbWV0cnkgcmF0aGVyIHRoYW4gYWN0ZWQgb24gaGVyZS5cbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgcGFya2VkPzoge1xuICAgICAgICByZWFkb25seSBjb3VudDogbnVtYmVyO1xuICAgICAgICByZWFkb25seSBldmVudElkOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IGV2ZW50VHlwZTogc3RyaW5nO1xuICAgICAgfTtcbiAgICB9O1xuXG4vKipcbiAqIGByZXN1bWVgIGNhbiBhZGRpdGlvbmFsbHkgZGVjbGluZTogYHsgdHlwZTogJ3JlcGxheScgfWAgbWVhbnMgXCJ0aGlzXG4gKiBzZXNzaW9uIGlzIHVudXNhYmxlLCBjb2xkLXJlcGxheSBpbnN0ZWFkXCIuIEEgZnJlc2ggcmVwbGF5IG5ldmVyIGRlY2xpbmVzLlxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1Jlc3VtZVJlc3VsdCA9IFdvcmtmbG93UmVzdWx0IHwgeyByZWFkb25seSB0eXBlOiAncmVwbGF5JyB9O1xuXG4vKiogVGhlIHNlc3Npb24ncyBwcml2YXRlIHN0YXRlIG1hY2hpbmUuICovXG50eXBlIFdvcmtmbG93U2Vzc2lvblN0YXRlID1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAncnVubmluZyc7XG4gICAgICByZWFkb25seSBpbnRlcnJ1cHRpb246IFByb21pc2VXaXRoUmVzb2x2ZXJzPG5ldmVyPjtcbiAgICB9XG4gIHwgeyByZWFkb25seSB0eXBlOiAnc3VzcGVuZGVkJzsgcmVhZG9ubHkgc3VzcGVuc2lvbjogV29ya2Zsb3dTdXNwZW5zaW9uIH1cbiAgfCB7IHJlYWRvbmx5IHR5cGU6ICdyZXBsYXknIH1cbiAgfCB7IHJlYWRvbmx5IHR5cGU6ICdjb21wbGV0ZWQnIH07XG5cbi8qKiBDb2xkLXN0YXJ0OiBidWlsZCBhIGZyZXNoIFZNIHNlc3Npb24gYW5kIHJlcGxheSBpdCBvdmVyIGBldmVudHNgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGxheVdvcmtmbG93KFxuICBvcHRpb25zOiBXb3JrZmxvd1Nlc3Npb25PcHRpb25zXG4pOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0PiB7XG4gIHJldHVybiB0cmFjZUV4ZWN1dGlvbihcbiAgICAncmVwbGF5JyxcbiAgICBvcHRpb25zLndvcmtmbG93UnVuLFxuICAgIG9wdGlvbnMuZXZlbnRzLFxuICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb24sIGV4ZWN1dGlvbiB9ID0gYXdhaXQgY3JlYXRlV29ya2Zsb3dTZXNzaW9uKG9wdGlvbnMpO1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0FyZ3VtZW50c0NvdW50KHNlc3Npb24uYXJndW1lbnRDb3VudCksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZWNvcmRSZXN1bHQoYXdhaXQgZXhlY3V0aW9uLCBzcGFuKTtcbiAgICB9XG4gICk7XG59XG5cbi8qKiBXYXJtLXN0YXJ0OiBhZHZhbmNlIGEgcmV0YWluZWQgc2Vzc2lvbiBieSBhcHBlbmRpbmcgZXZlbnRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3VtZVdvcmtmbG93KFxuICBzZXNzaW9uOiBXb3JrZmxvd1Nlc3Npb24sXG4gIGV2ZW50czogRXZlbnRbXVxuKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VtZVJlc3VsdD4ge1xuICByZXR1cm4gdHJhY2VFeGVjdXRpb24oXG4gICAgJ3JldGFpbmVkJyxcbiAgICBzZXNzaW9uLndvcmtmbG93UnVuLFxuICAgIGV2ZW50cyxcbiAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0FyZ3VtZW50c0NvdW50KHNlc3Npb24uYXJndW1lbnRDb3VudCksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlc3Npb24ucmVzdW1lKGV2ZW50cyk7XG4gICAgICByZXR1cm4gcmVzdWx0LnR5cGUgPT09ICdyZXBsYXknID8gcmVzdWx0IDogcmVjb3JkUmVzdWx0KHJlc3VsdCwgc3Bhbik7XG4gICAgfVxuICApO1xufVxuXG5mdW5jdGlvbiB0cmFjZUV4ZWN1dGlvbjxUPihcbiAgbW9kZTogJ3JlcGxheScgfCAncmV0YWluZWQnLFxuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4sXG4gIGV2ZW50czogRXZlbnRbXSxcbiAgZm46IChzcGFuOiBTcGFuIHwgdW5kZWZpbmVkKSA9PiBQcm9taXNlPFQ+XG4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIHRyYWNlKGB3b3JrZmxvdy5ydW4gJHt3b3JrZmxvd1J1bi53b3JrZmxvd05hbWV9YCwgKHNwYW4pID0+IHtcbiAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKHdvcmtmbG93UnVuLnJ1bklkKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyh3b3JrZmxvd1J1bi5zdGF0dXMpLFxuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXZlbnRzQ291bnQoZXZlbnRzLmxlbmd0aCksXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFeGVjdXRpb25Nb2RlKG1vZGUpLFxuICAgIH0pO1xuICAgIHJldHVybiBmbihzcGFuKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlY29yZFJlc3VsdChcbiAgcmVzdWx0OiBXb3JrZmxvd1Jlc3VsdCxcbiAgc3BhbjogU3BhbiB8IHVuZGVmaW5lZFxuKTogV29ya2Zsb3dSZXN1bHQge1xuICBpZiAocmVzdWx0LnR5cGUgPT09ICdjb21wbGV0ZWQnKSB7XG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSZXN1bHRUeXBlKHJlc3VsdC5yZXN1bHRUeXBlKSxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChzcGFuKSB7XG4gICAgYXBwbHlXb3JrZmxvd1N1c3BlbnNpb25Ub1NwYW4ocmVzdWx0LnN1c3BlbnNpb24sIHNwYW4pO1xuICAgIC8vIEV2ZW50cyB0aGlzIHBhc3Mgd2Fsa2VkIHBhc3QgdW5jbGFpbWVkIGFuZCBpcyBzdGlsbCBob2xkaW5nLiBPcmRpbmFyeSBvblxuICAgIC8vIGEgc3VzcGVuc2lvbjogYW4gb3V0LW9mLWJhbmQgZGVsaXZlcnkgdGhhdCBsYW5kZWQgYWhlYWQgb2YgdGhlIGNvZGUgdGhhdFxuICAgIC8vIHJlYWRzIGl0IHdhaXRzIGZvciB0aGUgcGFzcyB0aGF0IHJlYWNoZXMgdGhhdCBjb2RlLCBhbmQgZmFpbGluZyBoZXJlXG4gICAgLy8gd291bGQgZmFpbCBleGFjdGx5IHRoZSBydW5zIHRoYXQgdG9sZXJhbmNlIGV4aXN0cyBmb3IuIFRoZSBjYXNlIHRoYXQgaXNcbiAgICAvLyBub3Qgb3JkaW5hcnkgKHRoZSBzYW1lIGV2ZW50IHN0aWxsIGhlbGQgcGFzcyBhZnRlciBwYXNzKSBpcyBhIHNoYXBlXG4gICAgLy8gYWNyb3NzIHRoZXNlIHNwYW5zLCB3aGljaCBpcyB3aHkgdGhlIGV2ZW50SWQgaXMgb24gZWFjaCBvbmUgYW5kIG5vIHBhc3NcbiAgICAvLyB0cmllcyB0byBydWxlIG9uIGl0IGFsb25lLlxuICAgIGlmIChyZXN1bHQucGFya2VkKSB7XG4gICAgICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dQYXJrZWRFdmVudHNDb3VudChyZXN1bHQucGFya2VkLmNvdW50KSxcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UGFya2VkRXZlbnRJZChyZXN1bHQucGFya2VkLmV2ZW50SWQpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dQYXJrZWRFdmVudFR5cGUocmVzdWx0LnBhcmtlZC5ldmVudFR5cGUpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU2luZ2xlLXNob3QgcmVwbGF5OiBleGVjdXRlIHRoZSB3b3JrZmxvdyBvdmVyIGBldmVudHNgIGFuZCBlaXRoZXIgcmV0dXJuXG4gKiBpdHMgb3V0cHV0IG9yIHRocm93IGl0cyBzdXNwZW5zaW9uLiBLZXB0IGZvciB0aGUgZXh0ZW5zaXZlIGV4aXN0aW5nIHRlc3RcbiAqIHN1aXRlczsgcHJvZHVjdGlvbiBjb2RlIGdvZXMgdGhyb3VnaCBgcmVwbGF5V29ya2Zsb3dgL2ByZXN1bWVXb3JrZmxvd2AuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Xb3JrZmxvdyhcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bixcbiAgZXZlbnRzOiBFdmVudFtdLFxuICBlbmNyeXB0aW9uS2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICAvKipcbiAgICogT3B0aW9uYWwgcGVyLXJ1biBjYWNoZSBmb3IgcmVwbGF5IHBheWxvYWQgcHJlcGFyYXRpb24gYW5kIGltbXV0YWJsZSBmaW5hbFxuICAgKiB2YWx1ZXMuIE93bmVkIGJ5IHRoZSBpbmxpbmUgZXhlY3V0aW9uIGxvb3AgZm9yIHRoaXMgaW52b2NhdGlvbi5cbiAgICovXG4gIHJlcGxheVBheWxvYWRDYWNoZTogUmVwbGF5UGF5bG9hZENhY2hlID0gbmV3IFJlcGxheVBheWxvYWRDYWNoZShcbiAgICBlbmNyeXB0aW9uS2V5XG4gICksXG4gIC8qKlxuICAgKiBUdXJibyBtb2RlIG9ubHk6IHJlc29sdmVzIG9uY2UgdGhlIGJhY2tncm91bmRlZCBgcnVuX3N0YXJ0ZWRgIGhhcyBsYW5kZWQuXG4gICAqIFRocmVhZGVkIGludG8gdGhlIGVuZC1vZi1ydW4gZHJhaW4gc28gZmlyZS1hbmQtZm9yZ2V0IGAqX2NyZWF0ZWRgIHdyaXRlc1xuICAgKiBjb21taXR0ZWQgYXQgd29ya2Zsb3cgY29tcGxldGlvbiBvcmRlciBhZnRlciB0aGUgcnVuJ3MgY3JlYXRpb24uIFVuZGVmaW5lZFxuICAgKiBvdXRzaWRlIHR1cmJvLCB3aGVyZSBgcnVuX3N0YXJ0ZWRgIGlzIGF3YWl0ZWQgdXAgZnJvbnQuXG4gICAqL1xuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+LFxuICAvKipcbiAgICogRmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBXb3JsZCBleGVjdXRpbmcgdGhpcyB3b3JrZmxvdy4gTWlzc2luZ1xuICAgKiBjYXBhYmlsaXRpZXMgYXJlIHRyZWF0ZWQgYXMgdW5zdXBwb3J0ZWQuXG4gICAqL1xuICB3b3JsZENhcGFiaWxpdGllcz86IFdvcmxkQ2FwYWJpbGl0aWVzXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcGxheVdvcmtmbG93KHtcbiAgICB3b3JrZmxvd0NvZGUsXG4gICAgd29ya2Zsb3dSdW4sXG4gICAgZXZlbnRzLFxuICAgIGVuY3J5cHRpb25LZXksXG4gICAgcmVwbGF5UGF5bG9hZENhY2hlLFxuICAgIHJ1blJlYWR5QmFycmllcixcbiAgICB3b3JsZENhcGFiaWxpdGllcyxcbiAgfSk7XG4gIGlmIChyZXN1bHQudHlwZSA9PT0gJ3N1c3BlbmRlZCcpIHRocm93IHJlc3VsdC5zdXNwZW5zaW9uO1xuICByZXR1cm4gcmVzdWx0Lm91dHB1dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlV29ya2Zsb3dTZXNzaW9uKG9wdGlvbnM6IFdvcmtmbG93U2Vzc2lvbk9wdGlvbnMpIHtcbiAgY29uc3Qgdm1UcmFjZSA9IGF3YWl0IHN0YXJ0VHJhY2VTcGFuKCd3b3JrZmxvdy52bS5jcmVhdGVfY29udGV4dCcpO1xuICByZXR1cm4gY3JlYXRlV29ya2Zsb3dTZXNzaW9uSW5uZXIob3B0aW9ucywgdm1UcmFjZS5lbmQpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgIHZtVHJhY2UuZmFpbChlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVXb3JrZmxvd1Nlc3Npb25Jbm5lcihcbiAge1xuICAgIHdvcmtmbG93Q29kZSxcbiAgICB3b3JrZmxvd1J1bixcbiAgICBldmVudHMsXG4gICAgZW5jcnlwdGlvbktleSxcbiAgICByZXBsYXlQYXlsb2FkQ2FjaGUsXG4gICAgY29tcGlsZWRXb3JrZmxvd1NjcmlwdHMsXG4gICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgIHdvcmxkQ2FwYWJpbGl0aWVzLFxuICB9OiBXb3JrZmxvd1Nlc3Npb25PcHRpb25zLFxuICBlbmRWbVRyYWNlOiAoKSA9PiB2b2lkXG4pOiBQcm9taXNlPHtcbiAgc2Vzc2lvbjogV29ya2Zsb3dTZXNzaW9uO1xuICBleGVjdXRpb246IFByb21pc2U8V29ya2Zsb3dSZXN1bHQ+O1xufT4ge1xuICBjb25zdCBzdGFydGVkQXQgPSB3b3JrZmxvd1J1bi5zdGFydGVkQXQ7XG4gIGlmICghc3RhcnRlZEF0KSB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgYFdvcmtmbG93IHJ1biBcIiR7d29ya2Zsb3dSdW4ucnVuSWR9XCIgaGFzIG5vIFwic3RhcnRlZEF0XCIgdGltZXN0YW1wIChzaG91bGQgbm90IGhhcHBlbilgXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNlZWQgYW5kIGluaXRpYWwgY2xvY2sgbXVzdCBiZSBhdmFpbGFibGUgYmVmb3JlIEkvTyBhbmQgcmVtYWluIHN0YWJsZSBvblxuICAvLyByZXBsYXkuIEFmdGVyIHRoZSBmaXJzdCBldmVudCwgRXZlbnRzQ29uc3VtZXIgYWR2YW5jZXMgdGhlIFZNIGNsb2NrIGZyb21cbiAgLy8gZWFjaCBldmVudCdzIGBjcmVhdGVkQXRgLlxuICBjb25zdCBmaXhlZFRpbWVzdGFtcCA9XG4gICAgcnVuSWRDcmVhdGVkQXQod29ya2Zsb3dSdW4ucnVuSWQpID8/ICt3b3JrZmxvd1J1bi5jcmVhdGVkQXQ7XG5cbiAgLy8gVHJ1dGhpbmVzcywgbm90IHByZXNlbmNlOiBgdmVyY2VsIGVudiBwdWxsYCB3cml0ZXMgYFZFUkNFTF9VUkw9XCJcImAgaW50b1xuICAvLyBgLmVudi5sb2NhbGAsIGFuZCBhIGZyYW1ld29yayB0aGF0IGxvYWRzIHRoYXQgZmlsZSBsb2NhbGx5IHdvdWxkIG90aGVyd2lzZVxuICAvLyBwdXQgdXMgb24gdGhlIFZlcmNlbCBicmFuY2ggd2l0aCBub3RoaW5nIHRvIGJ1aWxkIGEgaG9zdCBmcm9tLCBtYWtpbmdcbiAgLy8gYGh0dHBzOi8vYCB0aGUgYmFzZSBVUkwgb2YgZXZlcnkgcnVuLlxuICBjb25zdCBpc1ZlcmNlbCA9IEJvb2xlYW4ocHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTCk7XG4gIC8vIExvYWQgZ2V0UG9ydCBsYXppbHkgdG8gcHJldmVudCBUdXJib3BhY2sgZnJvbSB0cmFjaW5nIGdldC1wb3J0J3NcbiAgLy8gZnMgb3BzIChyZWFkZGlyLCByZWFkRmlsZSkgaW50byB0aGUgZmxvdyByb3V0ZSBidW5kbGUuIFRoZSByZXNvbHZlZFxuICAvLyBwb3J0IGlzIGNhY2hlZCBwZXIgcHJvY2VzcyAoc2VlIGdldC1wb3J0LWxhenkudHMpLCBzbyB0aGlzIGlzIGNoZWFwXG4gIC8vIG9uIHJlcGxheXMgYWZ0ZXIgdGhlIGZpcnN0LlxuICBjb25zdCB3b3JrZmxvd0Jhc2VVcmwgPSBjcmVhdGVXb3JrZmxvd0Jhc2VVcmwoXG4gICAgaXNWZXJjZWxcbiAgICAgID8gYGh0dHBzOi8vJHtwcm9jZXNzLmVudi5WRVJDRUxfVVJMfWBcbiAgICAgIDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHsoYXdhaXQgZ2V0UG9ydExhenkoKSkgPz8gMzAwMH1gXG4gICk7XG4gIC8vIEluY2x1ZGUgYm90aCBub2RlOnZtJ3MgY29udGV4dCBjcmVhdGlvbiBhbmQgdGhlIGhvc3Qtc2lkZSBzYW5kYm94IHdpcmluZ1xuICAvLyBiZWxvdy4gTW9zdCBvZiB0aGUgYm9vdHN0cmFwIGxpdmVzIGluIHRoaXMgZnVuY3Rpb24gKEV2ZW50c0NvbnN1bWVyLFxuICAvLyB3b3JrZmxvdyBnbG9iYWxzLCBXZWIgQVBJIHNoaW1zKSwgc28gdHJhY2luZyBjcmVhdGVDb250ZXh0KCkgYWxvbmUgd291bGRcbiAgLy8gbWF0ZXJpYWxseSB1bmRlci1yZXBvcnQgVk0gc3RhcnR1cC5cbiAgY29uc3Qge1xuICAgIGNvbnRleHQsXG4gICAgZ2xvYmFsVGhpczogdm1HbG9iYWxUaGlzLFxuICAgIHVwZGF0ZVRpbWVzdGFtcCxcbiAgfSA9IGNyZWF0ZUNvbnRleHQoe1xuICAgIHNlZWQ6IGAke3dvcmtmbG93UnVuLnJ1bklkfToke3dvcmtmbG93UnVuLndvcmtmbG93TmFtZX06JHt3b3JrZmxvd1J1bi5kZXBsb3ltZW50SWR9YCxcbiAgICBmaXhlZFRpbWVzdGFtcCxcbiAgfSk7XG5cbiAgY29uc3QgaW5pdGlhbEludGVycnVwdGlvbiA9IHdpdGhSZXNvbHZlcnM8bmV2ZXI+KCk7XG4gIGxldCBzdGF0ZTogV29ya2Zsb3dTZXNzaW9uU3RhdGUgPSB7XG4gICAgdHlwZTogJ3J1bm5pbmcnLFxuICAgIGludGVycnVwdGlvbjogaW5pdGlhbEludGVycnVwdGlvbixcbiAgfTtcblxuICBjb25zdCBvbldvcmtmbG93RXJyb3IgPSAoZXJyb3I6IEVycm9yKTogdm9pZCA9PiB7XG4gICAgc3dpdGNoIChzdGF0ZS50eXBlKSB7XG4gICAgICBjYXNlICdydW5uaW5nJzoge1xuICAgICAgICBjb25zdCB7IGludGVycnVwdGlvbiB9ID0gc3RhdGU7XG4gICAgICAgIHN0YXRlID0gV29ya2Zsb3dTdXNwZW5zaW9uLmlzKGVycm9yKVxuICAgICAgICAgID8geyB0eXBlOiAnc3VzcGVuZGVkJywgc3VzcGVuc2lvbjogZXJyb3IgfVxuICAgICAgICAgIDogeyB0eXBlOiAncmVwbGF5JyB9O1xuICAgICAgICAvLyBTdGVwLCBob29rLCBhbmQgYXR0cmlidXRlIGNvbnN1bWVycyBjYW4gc2NoZWR1bGUgdGhlIHNhbWUgc3VzcGVuc2lvbi5cbiAgICAgICAgLy8gVGhlIGZpcnN0IHNpZ25hbCBhZHZhbmNlcyB0aGUgZ2VuZXJhdGlvbiBzbyB0aGUgcmVzdCBuby1vcC5cbiAgICAgICAgd29ya2Zsb3dDb250ZXh0LnN1c3BlbnNpb25HZW5lcmF0aW9uKys7XG4gICAgICAgIGludGVycnVwdGlvbi5yZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlICdzdXNwZW5kZWQnOlxuICAgICAgICAvLyBTYW1lLWJvdW5kYXJ5IGR1cGxpY2F0ZXMgd2VyZSBzdGFsZWQgYnkgdGhlIGdlbmVyYXRpb24gYnVtcCBhYm92ZSxcbiAgICAgICAgLy8gc28gYW55dGhpbmcgbGFuZGluZyBoZXJlIGlzIG91dC1vZi1iYW5kIOKAlCBhbiB1bmd1YXJkZWQgc2xlZXAgc2lnbmFsXG4gICAgICAgIC8vIG9yIGEgZGl2ZXJnZW5jZS4gVGhvc2UgYm91bmRhcmllcyBhcmUgdW5yZXRhaW5hYmxlICh0aGUgcnVudGltZVxuICAgICAgICAvLyBkZW1vdGVzIHRoZW0gdG9vKSwgc28gZmFsbCBiYWNrIHRvIHJlcGxheS5cbiAgICAgICAgc3RhdGUgPSB7IHR5cGU6ICdyZXBsYXknIH07XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgJ3JlcGxheSc6XG4gICAgICBjYXNlICdjb21wbGV0ZWQnOlxuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHN0YXRlIHNhdGlzZmllcyBuZXZlcjtcbiAgfTtcblxuICBjb25zdCB1bGlkID0gbW9ub3RvbmljRmFjdG9yeSgoKSA9PiB2bUdsb2JhbFRoaXMuTWF0aC5yYW5kb20oKSk7XG4gIC8vIENvcnJlbGF0aW9uIElEcyBtdXN0IGJlIHJlcGxheS1zdGFibGUuIGBzdGFydGVkQXRgIGRpZmZlcnMgYmV0d2VlbiBhIHR1cmJvXG4gIC8vIGRlbGl2ZXJ5IGFuZCBhIGxhdGVyIHNlcnZlci1iYWNrZWQgcmVwbGF5LCBzbyB1c2UgZml4ZWRUaW1lc3RhbXAuXG4gIC8vIFRoZSBkcmF3IGNvdW50ZXIgaXMgdGhlIHByb2dyZXNzIG1ldHJpYyBmb3IgYHF1aWVzY2VFYXJsaWVyQ2FzY2FkZXNgXG4gIC8vIChXT1JLRkxPV19MT0dfT1JERVJfRFJBV1MpOiBhIHF1aWV0IHR1cm4gaXMgb25lIHRoYXQgZHJldyBub3RoaW5nLiBJdFxuICAvLyBjb3VudHMgRVZFUlkgZHJhdyBmcm9tIHRoaXMgc2VxdWVuY2UuIFRoaXMgc2FtZSBmdW5jdGlvbiBpcyBpbnN0YWxsZWQgYXNcbiAgLy8gdGhlIGBTVEFCTEVfVUxJRGAgZ2xvYmFsIGJlbG93LCB3aGljaCBzZXJpYWxpemF0aW9uIGRyYXdzIHN0cmVhbSBpZHNcbiAgLy8gZnJvbSBkdXJpbmcgZGVoeWRyYXRpb24uIFRoaXMgaXMgZGVsaWJlcmF0ZSBiZWNhdXNlIHF1aWVzY2VuY2UgbXVzdCBhbHNvXG4gIC8vIHdhaXQgb3V0IHNlcmlhbGl6YXRpb24tZHJpdmVuIGRyYXdzLCBhbmQgY291bnRpbmcgZXh0cmEgZHJhd3Mgb25seSBleHRlbmRzXG4gIC8vIHRoZSB3YWl0IChzZWUgdGhlIHRlcm1pbmF0aW9uIG5vdGUgb24gYHF1aWVzY2VFYXJsaWVyQ2FzY2FkZXNgKS5cbiAgbGV0IG1pbnRDb3VudCA9IDA7XG4gIGNvbnN0IGdlbmVyYXRlVWxpZCA9ICgpID0+IHtcbiAgICBtaW50Q291bnQgKz0gMTtcbiAgICByZXR1cm4gdWxpZChmaXhlZFRpbWVzdGFtcCk7XG4gIH07XG4gIGNvbnN0IGdlbmVyYXRlTmFub2lkID0gbmFub2lkLmN1c3RvbVJhbmRvbShuYW5vaWQudXJsQWxwaGFiZXQsIDIxLCAoc2l6ZSkgPT5cbiAgICBuZXcgVWludDhBcnJheShzaXplKS5tYXAoKCkgPT4gMjU2ICogdm1HbG9iYWxUaGlzLk1hdGgucmFuZG9tKCkpXG4gICk7XG5cbiAgLy8gQ3JlYXRlIGEgbXV0YWJsZSBob2xkZXIgZm9yIHRoZSBwcm9taXNlIHF1ZXVlIHNvIHRoZSBFdmVudHNDb25zdW1lclxuICAvLyBjYW4gYWNjZXNzIHRoZSBjdXJyZW50IHF1ZXVlIHN0YXRlIHZpYSBhIGdldHRlci4gVGhlIHF1ZXVlIGlzIG11dGF0ZWRcbiAgLy8gYnkgc3RlcC9ob29rL3NsZWVwIGNhbGxiYWNrcyBhcyBldmVudHMgYXJlIHByb2Nlc3NlZC5cbiAgY29uc3QgcHJvbWlzZVF1ZXVlSG9sZGVyID0geyBjdXJyZW50OiBQcm9taXNlLnJlc29sdmUoKSB9O1xuXG4gIC8vIFNhbWUgcmVhc29uIGFzIHRoZSBxdWV1ZSBob2xkZXI6IHRoZSBjb25zdW1lciBpcyBidWlsdCBiZWZvcmUgdGhlIGNvbnRleHRcbiAgLy8gd2hvc2UgZGVsaXZlcnkgc3RhdGUgaXQgaGFzIHRvIHJlYWQuIElkbGUgdW50aWwgdGhlIGNvbnRleHQgZXhpc3RzLCB3aGljaFxuICAvLyBpcyBiZWZvcmUgYW55IGRlbGl2ZXJ5IGNhbiBiZSByZWdpc3RlcmVkIGFnYWluc3QgaXQuXG4gIGNvbnN0IGRlbGl2ZXJ5SWRsZUhvbGRlciA9IHsgY3VycmVudDogKCk6IGJvb2xlYW4gPT4gdHJ1ZSB9O1xuXG4gIC8vIFRoZSBWTSBjbG9jayBvbmx5IGV2ZXIgbW92ZXMgZm9yd2FyZC4gQ29uc3VtcHRpb24gb3JkZXIgaXMgbG9nIG9yZGVyIGZvclxuICAvLyBldmVyeXRoaW5nIHdob3NlIG9yZGVyIHRoZSByZXBsYXkgZGVjaWRlcywgYnV0IGFuIGV2ZW50IHRoZSBjb25zdW1lclxuICAvLyBwYXJrZWQgaXMgZGVsaXZlcmVkIGFmdGVyIHRoZSB3YWxrIGhhcyBhbHJlYWR5IHBhc3NlZCBldmVudHMgd3JpdHRlbiBhZnRlclxuICAvLyBpdCwgYW5kIGxldHRpbmcgaXRzIGBjcmVhdGVkQXRgIHNldCB0aGUgY2xvY2sgd291bGQgbWFrZSBgRGF0ZS5ub3coKWAgZ29cbiAgLy8gYmFja3dhcmRzIGluc2lkZSBhIHNpbmdsZSByZXBsYXkuXG4gIGxldCBjbG9jayA9IGZpeGVkVGltZXN0YW1wO1xuXG4gIGNvbnN0IGV2ZW50c0NvbnN1bWVyID0gbmV3IEV2ZW50c0NvbnN1bWVyKGV2ZW50cywge1xuICAgIG9uQ29uc3VtZWRFdmVudDogKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBhdCA9ICtldmVudC5jcmVhdGVkQXQ7XG4gICAgICBpZiAoYXQgPiBjbG9jaykge1xuICAgICAgICBjbG9jayA9IGF0O1xuICAgICAgICB1cGRhdGVUaW1lc3RhbXAoYXQpO1xuICAgICAgfVxuICAgIH0sXG4gICAgb25VbmNvbnN1bWVkRXZlbnQ6IChldmVudCkgPT4ge1xuICAgICAgb25Xb3JrZmxvd0Vycm9yKFxuICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgIGBSZXBsYXkgY291bGQgbm90IGNvbnN1bWUgZXZlbnQ6IGV2ZW50VHlwZT0ke2V2ZW50LmV2ZW50VHlwZX0sIGNvcnJlbGF0aW9uSWQ9JHtldmVudC5jb3JyZWxhdGlvbklkfSwgZXZlbnRJZD0ke2V2ZW50LmV2ZW50SWR9LmAsXG4gICAgICAgICAgeyBldmVudElkOiBldmVudC5ldmVudElkIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9LFxuICAgIC8vIEJvdGggYnJhbmNoZXMgbG9nIGF0IGBkZWJ1Z2AsIHNvIG5laXRoZXIgcmVhY2hlcyB0aGUgY29uc29sZSB1bmxlc3NcbiAgICAvLyBgREVCVUdgIG1hdGNoZXMuIEEgZHVwbGljYXRlIGlzIGEgcGVybWFuZW50IGZlYXR1cmUgb2YgdGhlIGxvZzogZXZlcnlcbiAgICAvLyBsYXRlciByZXBsYXkgcmUtcmVhZHMgaXQgYW5kIGxhbmRzIGhlcmUgYWdhaW4sIHNvIGFueXRoaW5nIHRoZSBsb2dnZXJcbiAgICAvLyBwcmludHMgdW5jb25kaXRpb25hbGx5IHdvdWxkIHByaW50IG9uY2UgcGVyIHJlcGxheSBmb3IgdGhlIGxpZmUgb2YgdGhlXG4gICAgLy8gcnVuLiBUaGVyZSBpcyBhbHNvIG5vdGhpbmcgdG8gYWN0IG9uLiBJZ25vcmluZyB0aGUgZXZlbnQgaXMgdGhlIGNvcnJlY3RcbiAgICAvLyBvdXRjb21lLCBub3QgYSBkZWdyYWRlZCBvbmUsIGFuZCBubyB1c2VyIGNoYW5nZSBtYWtlcyB0aGUgc3RyYWdnbGVyIGdvXG4gICAgLy8gYXdheS4gV2hhdCB0aGUgbGV2ZWxzIGFyZSBmb3IgaXMgZGlhZ25vc2lzIGFmdGVyIHRoZSBmYWN0LCB3aGljaCBpc1xuICAgIC8vIGV4YWN0bHkgd2hhdCBgREVCVUc9d29ya2Zsb3c6cnVudGltZTpkZWJ1Z2AgaXMgZm9yLlxuICAgIG9uRHVwbGljYXRlRXZlbnQ6IChldmVudCwgZmlyc3RFdmVudFR5cGUpID0+IHtcbiAgICAgIGNvbnN0IGRldGFpbHMgPSB7XG4gICAgICAgIHdvcmtmbG93UnVuSWQ6IHdvcmtmbG93UnVuLnJ1bklkLFxuICAgICAgICBldmVudElkOiBldmVudC5ldmVudElkLFxuICAgICAgICBldmVudFR5cGU6IGV2ZW50LmV2ZW50VHlwZSxcbiAgICAgICAgZmlyc3RFdmVudFR5cGUsXG4gICAgICAgIGNvcnJlbGF0aW9uSWQ6IGV2ZW50LmNvcnJlbGF0aW9uSWQsXG4gICAgICB9O1xuICAgICAgaWYgKGZpcnN0RXZlbnRUeXBlICE9PSBldmVudC5ldmVudFR5cGUpIHtcbiAgICAgICAgLy8gVHdvIHdyaXRlcnMgcmVhY2hlZCBvcHBvc2l0ZSBjb25jbHVzaW9ucyBhYm91dCBvbmUgZW50aXR5OiBhXG4gICAgICAgIC8vIGBzdGVwX2ZhaWxlZGAgYmVoaW5kIGEgYHN0ZXBfY29tcGxldGVkYCwgb3IgdGhlIHJldmVyc2UuIElnbm9yaW5nIGl0XG4gICAgICAgIC8vIGlzIHN0aWxsIGNvcnJlY3QgYW5kIHN0aWxsIGRldGVybWluaXN0aWMgKHJlcGxheSByZWFkcyB0aGUgZmlyc3Qgb25lXG4gICAgICAgIC8vIGF0IHRoZSBzYW1lIHBvc2l0aW9uIGV2ZXJ5IHRpbWUpLCBidXQgdW5saWtlIGEgcmUtY29tbWl0IG9mIHRoZSBzYW1lXG4gICAgICAgIC8vIG91dGNvbWUgdGhlcmUgaXMgbm8gcmVhZGluZyBvZiB0aGlzIHdoZXJlIGJvdGggd3JpdGVycyB3ZXJlIHJpZ2h0LFxuICAgICAgICAvLyBzbyB0aGUgZGlzY2FyZGVkIG91dGNvbWUgZ2V0cyBpdHMgb3duIG1lc3NhZ2UuXG4gICAgICAgIHJ1bnRpbWVMb2dnZXIuZGVidWcoXG4gICAgICAgICAgJ0lnbm9yaW5nIGluZXJ0IGV2ZW50IHRoYXQgZGVjaWRlcyBhbiBhbHJlYWR5LWRlY2lkZWQgb3V0Y29tZSBkaWZmZXJlbnRseScsXG4gICAgICAgICAgZGV0YWlsc1xuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBUaGUgZmlyc3QgZXZlbnQgb2YgdGhpcyBjbGFzcyBkZWNpZGVkIHRoZSBvdXRjb21lIGF0IGEgbG93ZXIgbG9nXG4gICAgICAvLyBwb3NpdGlvbiBhbmQgcmVwbGF5IHJlYWRzIHRoYXQgb25lLiBSZWNvcmRlZCBiZWNhdXNlIGEgc3RyYWdnbGVyIGlzXG4gICAgICAvLyBzdGlsbCBldmlkZW5jZSBvZiB0d28gcmVwbGF5cyB3cml0aW5nIGZvciB0aGUgc2FtZSBlbnRpdHksIHdoaWNoIGlzXG4gICAgICAvLyB3b3J0aCBzZWVpbmcgd2hlbiBkaWFnbm9zaW5nIGEgcnVuLlxuICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgJ0lnbm9yaW5nIGluZXJ0IGV2ZW50IHRoYXQgcmVwZWF0cyBhIGNsYXNzIGFscmVhZHkgaW4gdGhlIGV2ZW50IGxvZycsXG4gICAgICAgIGRldGFpbHNcbiAgICAgICk7XG4gICAgfSxcbiAgICBnZXRQcm9taXNlUXVldWU6ICgpID0+IHByb21pc2VRdWV1ZUhvbGRlci5jdXJyZW50LFxuICAgIGlzRGVsaXZlcnlJZGxlOiAoKSA9PiBkZWxpdmVyeUlkbGVIb2xkZXIuY3VycmVudCgpLFxuICB9KTtcblxuICBjb25zdCB3b3JrZmxvd0NvbnRleHQ6IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCA9IHtcbiAgICBydW5JZDogd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgZW5jcnlwdGlvbktleSxcbiAgICB3b3JsZENhcGFiaWxpdGllcyxcbiAgICBnbG9iYWxUaGlzOiB2bUdsb2JhbFRoaXMsXG4gICAgb25Xb3JrZmxvd0Vycm9yLFxuICAgIGV2ZW50c0NvbnN1bWVyLFxuICAgIGdlbmVyYXRlVWxpZCxcbiAgICBnZW5lcmF0ZU5hbm9pZCxcbiAgICBnZXQgbWludENvdW50KCkge1xuICAgICAgcmV0dXJuIG1pbnRDb3VudDtcbiAgICB9LFxuICAgIGludm9jYXRpb25zUXVldWU6IG5ldyBNYXAoKSxcbiAgICAvLyBVc2UgZ2V0dGVyL3NldHRlciBzbyB0aGUgRXZlbnRzQ29uc3VtZXIncyBnZXRQcm9taXNlUXVldWUoKSBhbHdheXNcbiAgICAvLyBzZWVzIHRoZSBsYXRlc3QgcXVldWUgc3RhdGUgYXMgaXQncyBtdXRhdGVkIGJ5IHN0ZXAvaG9vay9zbGVlcCBjYWxsYmFja3MuXG4gICAgZ2V0IHByb21pc2VRdWV1ZSgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlUXVldWVIb2xkZXIuY3VycmVudDtcbiAgICB9LFxuICAgIHNldCBwcm9taXNlUXVldWUodmFsdWU6IFByb21pc2U8dm9pZD4pIHtcbiAgICAgIHByb21pc2VRdWV1ZUhvbGRlci5jdXJyZW50ID0gdmFsdWU7XG4gICAgfSxcbiAgICBwZW5kaW5nRGVsaXZlcmllczogMCxcbiAgICBzdXNwZW5zaW9uR2VuZXJhdGlvbjogMCxcbiAgICBwZW5kaW5nRGVsaXZlcnlCYXJyaWVyczogbmV3IE1hcCgpLFxuICAgIHJlcGxheVBheWxvYWRDYWNoZSxcbiAgfTtcblxuICBkZWxpdmVyeUlkbGVIb2xkZXIuY3VycmVudCA9ICgpID0+IGlzRGVsaXZlcnlJZGxlKHdvcmtmbG93Q29udGV4dCk7XG5cbiAgLy8gQ29uc3VtZSBydW4gbGlmZWN5Y2xlIGV2ZW50cyAtIHRoZXNlIGFyZSBzdHJ1Y3R1cmFsIGV2ZW50cyB0aGF0IGRvbid0XG4gIC8vIG5lZWQgc3BlY2lhbCBoYW5kbGluZyBpbiB0aGUgd29ya2Zsb3csIGJ1dCBtdXN0IGJlIGNvbnN1bWVkIHRvIGFkdmFuY2VcbiAgLy8gcGFzdCB0aGVtIGluIHRoZSBldmVudCBsb2dcbiAgbGV0IGNvbnN1bWVkUnVuU3RhcnRlZCA9IGZhbHNlO1xuICB3b3JrZmxvd0NvbnRleHQuZXZlbnRzQ29uc3VtZXIuc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgIGlmICghZXZlbnQpIHtcbiAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgIH1cblxuICAgIC8vIENvbnN1bWUgcnVuX2NyZWF0ZWQgLSBldmVyeSBydW4gaGFzIGV4YWN0bHkgb25lXG4gICAgaWYgKGV2ZW50LmV2ZW50VHlwZSA9PT0gJ3J1bl9jcmVhdGVkJykge1xuICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgfVxuXG4gICAgLy8gQ29uc3VtZSB0aGUgZmlyc3QgcnVuX3N0YXJ0ZWQuIFR3byByZXBsYXlzIGNhbiBlYWNoIHdyaXRlIG9uZSAodGhlXG4gICAgLy8gY3JlYXRlIGlzIGlkZW1wb3RlbnQgZm9yIGEgcnVuIGFscmVhZHkgcnVubmluZywgd2hpY2ggbWFrZXMgdGhlIHdyaXRlXG4gICAgLy8gc2FmZSwgbm90IHNpbmdsZS1zaG90KTsgdGhlIGZpcnN0IGlzIHRoZSBvbmUgdGhlIHJlcGxheSBvYnNlcnZlcywgYW5kXG4gICAgLy8gdGhlIGNvbnN1bWVyIHNraXBzIHRoZSByZXN0IHJhdGhlciB0aGFuIGFkdmFuY2luZyB0aGUgd29ya2Zsb3cgY2xvY2tcbiAgICAvLyB0d2ljZS5cbiAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAncnVuX3N0YXJ0ZWQnKSB7XG4gICAgICBpZiAoY29uc3VtZWRSdW5TdGFydGVkKSB7XG4gICAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICAgICAgfVxuICAgICAgY29uc3VtZWRSdW5TdGFydGVkID0gdHJ1ZTtcbiAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgIH1cblxuICAgIC8vIEF0dHJpYnV0ZSB3cml0ZXMgcGVyZm9ybWVkIGZyb20gYSBzdGVwIGhhdmUgbm8gd29ya2Zsb3ctYm9keSBjYWxsIHRvXG4gICAgLy8gY29uc3VtZSB0aGVtIGR1cmluZyByZXBsYXk7IHRoZXkgYXJlIGFscmVhZHkgcmVmbGVjdGVkIGluIHRoZSBydW5cbiAgICAvLyBzbmFwc2hvdCBhbmQgcmVtYWluIHN0cnVjdHVyYWwgdW50aWwgYSByZWFkIEFQSSBpcyBpbnRyb2R1Y2VkLlxuICAgIGlmIChcbiAgICAgIGV2ZW50LmV2ZW50VHlwZSA9PT0gJ2F0dHJfc2V0JyAmJlxuICAgICAgZXZlbnQuZXZlbnREYXRhLndyaXRlci50eXBlID09PSAnc3RlcCdcbiAgICApIHtcbiAgICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0LkNvbnN1bWVkO1xuICAgIH1cblxuICAgIHJldHVybiBFdmVudENvbnN1bWVyUmVzdWx0Lk5vdENvbnN1bWVkO1xuICB9KTtcblxuICBjb25zdCB1c2VTdGVwID0gY3JlYXRlVXNlU3RlcCh3b3JrZmxvd0NvbnRleHQpO1xuICBjb25zdCBjcmVhdGVIb29rID0gY3JlYXRlQ3JlYXRlSG9vayh3b3JrZmxvd0NvbnRleHQpO1xuICBjb25zdCBzbGVlcCA9IGNyZWF0ZVNsZWVwKHdvcmtmbG93Q29udGV4dCk7XG4gIGNvbnN0IHNldEF0dHJpYnV0ZXMgPSBjcmVhdGVTZXRBdHRyaWJ1dGVzKHdvcmtmbG93Q29udGV4dCk7XG5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gIHZtR2xvYmFsVGhpc1tXT1JLRkxPV19VU0VfU1RFUF0gPSB1c2VTdGVwO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgdm1HbG9iYWxUaGlzW1dPUktGTE9XX1NFVF9BVFRSSUJVVEVTXSA9IHNldEF0dHJpYnV0ZXM7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICB2bUdsb2JhbFRoaXNbV09SS0ZMT1dfQ1JFQVRFX0hPT0tdID0gY3JlYXRlSG9vaztcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gIHZtR2xvYmFsVGhpc1tXT1JLRkxPV19TTEVFUF0gPSBzbGVlcDtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gIHZtR2xvYmFsVGhpc1tXT1JLRkxPV19HRVRfU1RSRUFNX0lEXSA9IChuYW1lc3BhY2U/OiBzdHJpbmcpID0+XG4gICAgZ2V0V29ya2Zsb3dSdW5TdHJlYW1JZCh3b3JrZmxvd1J1bi5ydW5JZCwgbmFtZXNwYWNlKTtcblxuICAvLyBGb3IgdGhlIHdvcmtmbG93IFZNLCB3ZSBzdG9yZSB0aGUgY29udGV4dCBpbiBhIHN5bWJvbCBvbiB0aGUgYGdsb2JhbFRoaXNgIG9iamVjdFxuICBjb25zdCBjdHg6IFdvcmtmbG93TWV0YWRhdGEgPSB7XG4gICAgd29ya2Zsb3dOYW1lOiB3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUsXG4gICAgd29ya2Zsb3dSdW5JZDogd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgd29ya2Zsb3dTdGFydGVkQXQ6IG5ldyB2bUdsb2JhbFRoaXMuRGF0ZSgrc3RhcnRlZEF0KSxcbiAgICB1cmw6IHdvcmtmbG93QmFzZVVybCxcbiAgICBmZWF0dXJlczogeyBlbmNyeXB0aW9uOiAhIWVuY3J5cHRpb25LZXkgfSxcbiAgfTtcblxuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgdm1HbG9iYWxUaGlzW1dPUktGTE9XX0NPTlRFWFRfU1lNQk9MXSA9IGN0eDtcbiAgLy8gU2VyaWFsaXphdGlvbiBtaW50cyBzdHJlYW0gaWRzIHRocm91Z2ggdGhpcyBzeW1ib2wsIGFuZCBjYWxscyBpdCB3aXRoIG5vXG4gIC8vIHNlZWQgdGltZS4gYG1vbm90b25pY0ZhY3RvcnlgIHJldHVybnMgYGVuY29kZVRpbWUobGFzdFRpbWUpYCBvbiBpdHNcbiAgLy8gaW5jcmVtZW50IGJyYW5jaCwgc28gb25lIHN1Y2ggY2FsbCBsYXRjaGVzIHRoZSAqaG9zdCogd2FsbCBjbG9jayBpbnRvXG4gIC8vIGBsYXN0VGltZWAsIGFuZCBldmVyeSBpZCB0aGUgcnVuIG1pbnRzIGFmdGVyd2FyZHMgY2FycmllcyB0aGF0IHRpbWVzdGFtcFxuICAvLyBpbnN0ZWFkIG9mIGBmaXhlZFRpbWVzdGFtcGAsIGEgdmFsdWUgdGhhdCBkaWZmZXJzIG9uIGV2ZXJ5IHJlcGxheS4gQmluZGluZ1xuICAvLyB0aGUgc2VlZCB0aW1lIGhlcmUga2VlcHMgdGhlIHdob2xlIHJ1biBvbiBvbmUgcmVwbGF5LXN0YWJsZSBjbG9jay5cbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gIHZtR2xvYmFsVGhpc1tTVEFCTEVfVUxJRF0gPSBnZW5lcmF0ZVVsaWQ7XG5cbiAgLy8gV29ya2Zsb3cgY29kZSBtdXN0IGltcG9ydCB0aGUgZGV0ZXJtaW5pc3RpYyBgZmV0Y2hgIHN0ZXAgZnJvbSBgd29ya2Zsb3dgLlxuICB2bUdsb2JhbFRoaXMuZmV0Y2ggPSAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IHZtR2xvYmFsVGhpcy5FcnJvcihcbiAgICAgIGBHbG9iYWwgXCJmZXRjaFwiIGlzIHVuYXZhaWxhYmxlIGluIHdvcmtmbG93IGZ1bmN0aW9ucy4gVXNlIHRoZSBcImZldGNoXCIgc3RlcCBmdW5jdGlvbiBmcm9tIFwid29ya2Zsb3dcIiB0byBtYWtlIEhUVFAgcmVxdWVzdHMuXFxuXFxuTGVhcm4gbW9yZTogaHR0cHM6Ly93b3JrZmxvdy1zZGsuZGV2L2Vyci8ke0VSUk9SX1NMVUdTLkZFVENIX0lOX1dPUktGTE9XX0ZVTkNUSU9OfWBcbiAgICApO1xuICB9O1xuXG4gIC8vIE92ZXJyaWRlIHRpbWVvdXQvaW50ZXJ2YWwgZnVuY3Rpb25zIHRvIHRocm93IGhlbHBmdWwgZXJyb3JzXG4gIC8vIFRoZXNlIGFyZSBub3Qgc3VwcG9ydGVkIGluIHdvcmtmbG93IGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgcmVseSBvblxuICAvLyBhc3luY2hyb25vdXMgc2NoZWR1bGluZyB3aGljaCBicmVha3MgZGV0ZXJtaW5pc3RpYyByZXBsYXlcbiAgY29uc3QgdGltZW91dEVycm9yTWVzc2FnZSA9XG4gICAgJ1RpbWVvdXQgZnVuY3Rpb25zIGxpa2UgXCJzZXRUaW1lb3V0XCIgYW5kIFwic2V0SW50ZXJ2YWxcIiBhcmUgbm90IHN1cHBvcnRlZCBpbiB3b3JrZmxvdyBmdW5jdGlvbnMuIFVzZSB0aGUgXCJzbGVlcFwiIGZ1bmN0aW9uIGZyb20gXCJ3b3JrZmxvd1wiIGZvciB0aW1lLWJhc2VkIGRlbGF5cy4nO1xuXG4gICh2bUdsb2JhbFRoaXMgYXMgYW55KS5zZXRUaW1lb3V0ID0gKCkgPT4ge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICB9KTtcbiAgfTtcbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLnNldEludGVydmFsID0gKCkgPT4ge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICB9KTtcbiAgfTtcbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLmNsZWFyVGltZW91dCA9ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IodGltZW91dEVycm9yTWVzc2FnZSwge1xuICAgICAgc2x1ZzogRVJST1JfU0xVR1MuVElNRU9VVF9GVU5DVElPTlNfSU5fV09SS0ZMT1csXG4gICAgfSk7XG4gIH07XG4gICh2bUdsb2JhbFRoaXMgYXMgYW55KS5jbGVhckludGVydmFsID0gKCkgPT4ge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICB9KTtcbiAgfTtcbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLnNldEltbWVkaWF0ZSA9ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IodGltZW91dEVycm9yTWVzc2FnZSwge1xuICAgICAgc2x1ZzogRVJST1JfU0xVR1MuVElNRU9VVF9GVU5DVElPTlNfSU5fV09SS0ZMT1csXG4gICAgfSk7XG4gIH07XG4gICh2bUdsb2JhbFRoaXMgYXMgYW55KS5jbGVhckltbWVkaWF0ZSA9ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IodGltZW91dEVycm9yTWVzc2FnZSwge1xuICAgICAgc2x1ZzogRVJST1JfU0xVR1MuVElNRU9VVF9GVU5DVElPTlNfSU5fV09SS0ZMT1csXG4gICAgfSk7XG4gIH07XG5cbiAgLy8gYEFib3J0Q29udHJvbGxlcmAgYW5kIGBBYm9ydFNpZ25hbGAgaW4gdGhlIHdvcmtmbG93IFZNIGFyZSBob29rLWJhY2tlZFxuICAvLyBmb3IgZGV0ZXJtaW5pc3RpYyByZXBsYXkuIFRoZSBjb250cm9sbGVyJ3MgYWJvcnQoKSBxdWV1ZXMgYSBob29rIHJlc3VtcHRpb24sXG4gIC8vIGFuZCBzaWduYWwuYWJvcnRlZCBpcyB1cGRhdGVkIHdoZW4gdGhlIGhvb2sgZXZlbnQgaXMgcHJvY2Vzc2VkIGR1cmluZyByZXBsYXkuXG4gICh2bUdsb2JhbFRoaXMgYXMgYW55KS5BYm9ydENvbnRyb2xsZXIgPVxuICAgIGNyZWF0ZUNyZWF0ZUFib3J0Q29udHJvbGxlcih3b3JrZmxvd0NvbnRleHQpO1xuICBjb25zdCBhYm9ydFNpZ25hbFN0YXRpY3MgPSBjcmVhdGVBYm9ydFNpZ25hbFN0YXRpY3MoKTtcbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLkFib3J0U2lnbmFsID0ge1xuICAgIGFib3J0OiBhYm9ydFNpZ25hbFN0YXRpY3MuYWJvcnQsXG4gICAgYW55OiBhYm9ydFNpZ25hbFN0YXRpY3MuYW55LFxuICAgIHRpbWVvdXQ6IGFib3J0U2lnbmFsU3RhdGljcy50aW1lb3V0LFxuICB9O1xuXG4gIC8vIGBSZXF1ZXN0YCBhbmQgYFJlc3BvbnNlYCBhcmUgc3BlY2lhbCBidWlsdC1pbiBjbGFzc2VzIHRoYXQgaW52b2tlIHN0ZXBzXG4gIC8vIGZvciB0aGUgYGpzb24oKWAsIGB0ZXh0KClgIGFuZCBgYXJyYXlCdWZmZXIoKWAgaW5zdGFuY2UgbWV0aG9kc1xuICBjbGFzcyBSZXF1ZXN0IGltcGxlbWVudHMgZ2xvYmFsVGhpcy5SZXF1ZXN0IHtcbiAgICBjYWNoZSE6IGdsb2JhbFRoaXMuUmVxdWVzdFsnY2FjaGUnXTtcbiAgICBjcmVkZW50aWFscyE6IGdsb2JhbFRoaXMuUmVxdWVzdFsnY3JlZGVudGlhbHMnXTtcbiAgICBkZXN0aW5hdGlvbiE6IGdsb2JhbFRoaXMuUmVxdWVzdFsnZGVzdGluYXRpb24nXTtcbiAgICBoZWFkZXJzITogSGVhZGVycztcbiAgICBpbnRlZ3JpdHkhOiBzdHJpbmc7XG4gICAgbWV0aG9kITogc3RyaW5nO1xuICAgIG1vZGUhOiBnbG9iYWxUaGlzLlJlcXVlc3RbJ21vZGUnXTtcbiAgICByZWRpcmVjdCE6IGdsb2JhbFRoaXMuUmVxdWVzdFsncmVkaXJlY3QnXTtcbiAgICByZWZlcnJlciE6IHN0cmluZztcbiAgICByZWZlcnJlclBvbGljeSE6IGdsb2JhbFRoaXMuUmVxdWVzdFsncmVmZXJyZXJQb2xpY3knXTtcbiAgICB1cmwhOiBzdHJpbmc7XG4gICAga2VlcGFsaXZlITogYm9vbGVhbjtcbiAgICBzaWduYWwhOiBBYm9ydFNpZ25hbDtcbiAgICBkdXBsZXghOiAnaGFsZic7XG4gICAgYm9keSE6IFJlYWRhYmxlU3RyZWFtPGFueT4gfCBudWxsO1xuXG4gICAgY29uc3RydWN0b3IoaW5wdXQ6IGFueSwgaW5pdD86IFJlcXVlc3RJbml0KSB7XG4gICAgICAvLyBIYW5kbGUgVVJMIGlucHV0XG4gICAgICBpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCBpbnB1dCBpbnN0YW5jZW9mIHZtR2xvYmFsVGhpcy5VUkwpIHtcbiAgICAgICAgY29uc3QgdXJsU3RyaW5nID0gU3RyaW5nKGlucHV0KTtcbiAgICAgICAgLy8gVmFsaWRhdGUgVVJMIGZvcm1hdFxuICAgICAgICB0cnkge1xuICAgICAgICAgIG5ldyB2bUdsb2JhbFRoaXMuVVJMKHVybFN0cmluZyk7XG4gICAgICAgICAgdGhpcy51cmwgPSB1cmxTdHJpbmc7XG4gICAgICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgRmFpbGVkIHRvIHBhcnNlIFVSTCBmcm9tICR7dXJsU3RyaW5nfWAsIHtcbiAgICAgICAgICAgIGNhdXNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJbnB1dCBpcyBhIFJlcXVlc3Qgb2JqZWN0IC0gY2xvbmUgaXRzIHByb3BlcnRpZXNcbiAgICAgICAgdGhpcy51cmwgPSBpbnB1dC51cmw7XG4gICAgICAgIGlmICghaW5pdCkge1xuICAgICAgICAgIHRoaXMubWV0aG9kID0gaW5wdXQubWV0aG9kO1xuICAgICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycyhpbnB1dC5oZWFkZXJzKTtcbiAgICAgICAgICB0aGlzLmJvZHkgPSBpbnB1dC5ib2R5O1xuICAgICAgICAgIHRoaXMubW9kZSA9IGlucHV0Lm1vZGU7XG4gICAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzO1xuICAgICAgICAgIHRoaXMuY2FjaGUgPSBpbnB1dC5jYWNoZTtcbiAgICAgICAgICB0aGlzLnJlZGlyZWN0ID0gaW5wdXQucmVkaXJlY3Q7XG4gICAgICAgICAgdGhpcy5yZWZlcnJlciA9IGlucHV0LnJlZmVycmVyO1xuICAgICAgICAgIHRoaXMucmVmZXJyZXJQb2xpY3kgPSBpbnB1dC5yZWZlcnJlclBvbGljeTtcbiAgICAgICAgICB0aGlzLmludGVncml0eSA9IGlucHV0LmludGVncml0eTtcbiAgICAgICAgICB0aGlzLmtlZXBhbGl2ZSA9IGlucHV0LmtlZXBhbGl2ZTtcbiAgICAgICAgICB0aGlzLnNpZ25hbCA9IGlucHV0LnNpZ25hbDtcbiAgICAgICAgICB0aGlzLmR1cGxleCA9IGlucHV0LmR1cGxleDtcbiAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gaW5wdXQuZGVzdGluYXRpb247XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIGluaXQgaXMgcHJvdmlkZWQsIG1lcmdlOiB1c2Ugc291cmNlIHByb3BlcnRpZXMsIHRoZW4gb3ZlcnJpZGUgd2l0aCBpbml0XG4gICAgICAgIC8vIENvcHkgYWxsIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlIFJlcXVlc3QgZmlyc3RcbiAgICAgICAgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2Q7XG4gICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycyhpbnB1dC5oZWFkZXJzKTtcbiAgICAgICAgdGhpcy5ib2R5ID0gaW5wdXQuYm9keTtcbiAgICAgICAgdGhpcy5tb2RlID0gaW5wdXQubW9kZTtcbiAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGlucHV0LmNyZWRlbnRpYWxzO1xuICAgICAgICB0aGlzLmNhY2hlID0gaW5wdXQuY2FjaGU7XG4gICAgICAgIHRoaXMucmVkaXJlY3QgPSBpbnB1dC5yZWRpcmVjdDtcbiAgICAgICAgdGhpcy5yZWZlcnJlciA9IGlucHV0LnJlZmVycmVyO1xuICAgICAgICB0aGlzLnJlZmVycmVyUG9saWN5ID0gaW5wdXQucmVmZXJyZXJQb2xpY3k7XG4gICAgICAgIHRoaXMuaW50ZWdyaXR5ID0gaW5wdXQuaW50ZWdyaXR5O1xuICAgICAgICB0aGlzLmtlZXBhbGl2ZSA9IGlucHV0LmtlZXBhbGl2ZTtcbiAgICAgICAgdGhpcy5zaWduYWwgPSBpbnB1dC5zaWduYWw7XG4gICAgICAgIHRoaXMuZHVwbGV4ID0gaW5wdXQuZHVwbGV4O1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gaW5wdXQuZGVzdGluYXRpb247XG4gICAgICB9XG5cbiAgICAgIC8vIE92ZXJyaWRlIHdpdGggaW5pdCBvcHRpb25zIGlmIHByb3ZpZGVkXG4gICAgICAvLyBTZXQgbWV0aG9kXG4gICAgICBpZiAoaW5pdD8ubWV0aG9kKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gaW5pdC5tZXRob2QudG9VcHBlckNhc2UoKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMubWV0aG9kICE9PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBGYWxsYmFjayB0byBkZWZhdWx0IGZvciBzdHJpbmcgaW5wdXQgY2FzZVxuICAgICAgICB0aGlzLm1ldGhvZCA9ICdHRVQnO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgaGVhZGVyc1xuICAgICAgaWYgKGluaXQ/LmhlYWRlcnMpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IHZtR2xvYmFsVGhpcy5IZWFkZXJzKGluaXQuaGVhZGVycyk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIGlucHV0IGluc3RhbmNlb2Ygdm1HbG9iYWxUaGlzLlVSTFxuICAgICAgKSB7XG4gICAgICAgIC8vIEZvciBzdHJpbmcvVVJMIGlucHV0LCBjcmVhdGUgZW1wdHkgaGVhZGVyc1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IG90aGVyIHByb3BlcnRpZXMgd2l0aCBpbml0IHZhbHVlcyBvciBkZWZhdWx0c1xuICAgICAgaWYgKGluaXQ/Lm1vZGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLm1vZGUgPSBpbml0Lm1vZGU7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLm1vZGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMubW9kZSA9ICdjb3JzJztcbiAgICAgIH1cblxuICAgICAgaWYgKGluaXQ/LmNyZWRlbnRpYWxzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jcmVkZW50aWFscyA9IGluaXQuY3JlZGVudGlhbHM7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmNyZWRlbnRpYWxzICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gJ3NhbWUtb3JpZ2luJztcbiAgICAgIH1cblxuICAgICAgLy8gYGFueWAgY2FzdCBoZXJlIGJlY2F1c2UgQHR5cGVzL25vZGUgdjIyIGRvZXMgbm90IHlldCBoYXZlIGBjYWNoZWBcbiAgICAgIGlmICgoaW5pdCBhcyBhbnkpPy5jYWNoZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY2FjaGUgPSAoaW5pdCBhcyBhbnkpLmNhY2hlO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5jYWNoZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5jYWNoZSA9ICdkZWZhdWx0JztcbiAgICAgIH1cblxuICAgICAgaWYgKGluaXQ/LnJlZGlyZWN0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5yZWRpcmVjdCA9IGluaXQucmVkaXJlY3Q7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLnJlZGlyZWN0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLnJlZGlyZWN0ID0gJ2ZvbGxvdyc7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbml0Py5yZWZlcnJlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVmZXJyZXIgPSBpbml0LnJlZmVycmVyO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5yZWZlcnJlciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5yZWZlcnJlciA9ICdhYm91dDpjbGllbnQnO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5pdD8ucmVmZXJyZXJQb2xpY3kgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlZmVycmVyUG9saWN5ID0gaW5pdC5yZWZlcnJlclBvbGljeTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMucmVmZXJyZXJQb2xpY3kgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMucmVmZXJyZXJQb2xpY3kgPSAnJztcbiAgICAgIH1cblxuICAgICAgaWYgKGluaXQ/LmludGVncml0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuaW50ZWdyaXR5ID0gaW5pdC5pbnRlZ3JpdHk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmludGVncml0eSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5pbnRlZ3JpdHkgPSAnJztcbiAgICAgIH1cblxuICAgICAgaWYgKGluaXQ/LmtlZXBhbGl2ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMua2VlcGFsaXZlID0gaW5pdC5rZWVwYWxpdmU7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmtlZXBhbGl2ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgIHRoaXMua2VlcGFsaXZlID0gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbml0Py5zaWduYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gQWJvcnRTaWduYWwgc3R1YlxuICAgICAgICB0aGlzLnNpZ25hbCA9IGluaXQuc2lnbmFsO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5zaWduYWwpIHtcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIEFib3J0U2lnbmFsIHN0dWJcbiAgICAgICAgdGhpcy5zaWduYWwgPSB7IGFib3J0ZWQ6IGZhbHNlIH07XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5kdXBsZXgpIHtcbiAgICAgICAgdGhpcy5kdXBsZXggPSAnaGFsZic7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5kZXN0aW5hdGlvbikge1xuICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gJ2RvY3VtZW50JztcbiAgICAgIH1cblxuICAgICAgY29uc3QgYm9keSA9IGluaXQ/LmJvZHk7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgR0VUL0hFQUQgbWV0aG9kcyBkb24ndCBoYXZlIGEgYm9keVxuICAgICAgaWYgKFxuICAgICAgICBib2R5ICE9PSBudWxsICYmXG4gICAgICAgIGJvZHkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAodGhpcy5tZXRob2QgPT09ICdHRVQnIHx8IHRoaXMubWV0aG9kID09PSAnSEVBRCcpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgUmVxdWVzdCB3aXRoIEdFVC9IRUFEIG1ldGhvZCBjYW5ub3QgaGF2ZSBib2R5LmApO1xuICAgICAgfVxuXG4gICAgICAvLyBTdG9yZSB0aGUgb3JpZ2luYWwgQm9keUluaXQgZm9yIHNlcmlhbGl6YXRpb25cbiAgICAgIGlmIChib2R5ICE9PSBudWxsICYmIGJvZHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBDcmVhdGUgYSBcImZha2VcIiBSZWFkYWJsZVN0cmVhbSB0aGF0IHN0b3JlcyB0aGUgb3JpZ2luYWwgYm9keVxuICAgICAgICAvLyBUaGlzIGF2b2lkcyBkb2luZyBhc3luYyB3b3JrIGR1cmluZyB3b3JrZmxvdyByZXBsYXlcbiAgICAgICAgdGhpcy5ib2R5ID0gT2JqZWN0LmNyZWF0ZSh2bUdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0ucHJvdG90eXBlLCB7XG4gICAgICAgICAgW0JPRFlfSU5JVF9TWU1CT0xdOiB7XG4gICAgICAgICAgICB2YWx1ZTogYm9keSxcbiAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYm9keSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2xvbmUoKTogUmVxdWVzdCB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgZ2V0IGJvZHlVc2VkKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGVzZVxuICAgIGJsb2IhOiAoKSA9PiBQcm9taXNlPEJsb2I+O1xuICAgIGZvcm1EYXRhITogKCkgPT4gUHJvbWlzZTxGb3JtRGF0YT47XG5cbiAgICBhcnJheUJ1ZmZlciE6ICgpID0+IFByb21pc2U8QXJyYXlCdWZmZXI+O1xuICAgIGpzb24hOiAoKSA9PiBQcm9taXNlPGFueT47XG4gICAgdGV4dCE6ICgpID0+IFByb21pc2U8c3RyaW5nPjtcblxuICAgIGFzeW5jIGJ5dGVzKCkge1xuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0IHRoaXMuYXJyYXlCdWZmZXIoKSk7XG4gICAgfVxuICB9XG4gIHZtR2xvYmFsVGhpcy5SZXF1ZXN0ID0gUmVxdWVzdDtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhSZXF1ZXN0LnByb3RvdHlwZSwge1xuICAgIGFycmF5QnVmZmVyOiB7XG4gICAgICB2YWx1ZTogdXNlU3RlcDxbXSwgQXJyYXlCdWZmZXI+KCdfX2J1aWx0aW5fcmVzcG9uc2VfYXJyYXlfYnVmZmVyJyksXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9LFxuICAgIGpzb246IHtcbiAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBhbnk+KCdfX2J1aWx0aW5fcmVzcG9uc2VfanNvbicpLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSxcbiAgICB0ZXh0OiB7XG4gICAgICB2YWx1ZTogdXNlU3RlcDxbXSwgc3RyaW5nPignX19idWlsdGluX3Jlc3BvbnNlX3RleHQnKSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0sXG4gIH0pO1xuXG4gIGNsYXNzIFJlc3BvbnNlIGltcGxlbWVudHMgZ2xvYmFsVGhpcy5SZXNwb25zZSB7XG4gICAgdHlwZSE6IGdsb2JhbFRoaXMuUmVzcG9uc2VbJ3R5cGUnXTtcbiAgICB1cmwhOiBzdHJpbmc7XG4gICAgc3RhdHVzITogbnVtYmVyO1xuICAgIHN0YXR1c1RleHQhOiBzdHJpbmc7XG4gICAgYm9keSE6IFJlYWRhYmxlU3RyZWFtPFVpbnQ4QXJyYXk+IHwgbnVsbDtcbiAgICBoZWFkZXJzITogSGVhZGVycztcbiAgICByZWRpcmVjdGVkITogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGJvZHk/OiBhbnksIGluaXQ/OiBSZXNwb25zZUluaXQpIHtcbiAgICAgIHRoaXMuc3RhdHVzID0gaW5pdD8uc3RhdHVzID8/IDIwMDtcbiAgICAgIHRoaXMuc3RhdHVzVGV4dCA9IGluaXQ/LnN0YXR1c1RleHQgPz8gJyc7XG4gICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoaW5pdD8uaGVhZGVycyk7XG4gICAgICB0aGlzLnR5cGUgPSAnZGVmYXVsdCc7XG4gICAgICB0aGlzLnVybCA9ICcnO1xuICAgICAgdGhpcy5yZWRpcmVjdGVkID0gZmFsc2U7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHRoYXQgbnVsbC1ib2R5IHN0YXR1cyBjb2RlcyBkb24ndCBoYXZlIGEgYm9keVxuICAgICAgLy8gUGVyIEhUVFAgc3BlYzogMjA0IChObyBDb250ZW50KSwgMjA1IChSZXNldCBDb250ZW50KSwgYW5kIDMwNCAoTm90IE1vZGlmaWVkKVxuICAgICAgaWYgKFxuICAgICAgICBib2R5ICE9PSBudWxsICYmXG4gICAgICAgIGJvZHkgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAodGhpcy5zdGF0dXMgPT09IDIwNCB8fCB0aGlzLnN0YXR1cyA9PT0gMjA1IHx8IHRoaXMuc3RhdHVzID09PSAzMDQpXG4gICAgICApIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICBgUmVzcG9uc2UgY29uc3RydWN0b3I6IEludmFsaWQgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgJHt0aGlzLnN0YXR1c31gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBCb2R5SW5pdCBmb3Igc2VyaWFsaXphdGlvblxuICAgICAgaWYgKGJvZHkgIT09IG51bGwgJiYgYm9keSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIFwiZmFrZVwiIFJlYWRhYmxlU3RyZWFtIHRoYXQgc3RvcmVzIHRoZSBvcmlnaW5hbCBib2R5XG4gICAgICAgIC8vIFRoaXMgYXZvaWRzIGRvaW5nIGFzeW5jIHdvcmsgZHVyaW5nIHdvcmtmbG93IHJlcGxheVxuICAgICAgICB0aGlzLmJvZHkgPSBPYmplY3QuY3JlYXRlKHZtR2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUsIHtcbiAgICAgICAgICBbQk9EWV9JTklUX1NZTUJPTF06IHtcbiAgICAgICAgICAgIHZhbHVlOiBib2R5LFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ib2R5ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhlc2VcbiAgICBjbG9uZSE6ICgpID0+IFJlc3BvbnNlO1xuICAgIGJsb2IhOiAoKSA9PiBQcm9taXNlPGdsb2JhbFRoaXMuQmxvYj47XG4gICAgZm9ybURhdGEhOiAoKSA9PiBQcm9taXNlPGdsb2JhbFRoaXMuRm9ybURhdGE+O1xuXG4gICAgZ2V0IG9rKCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMDtcbiAgICB9XG5cbiAgICBnZXQgYm9keVVzZWQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYXJyYXlCdWZmZXIhOiAoKSA9PiBQcm9taXNlPEFycmF5QnVmZmVyPjtcbiAgICBqc29uITogKCkgPT4gUHJvbWlzZTxhbnk+O1xuICAgIHRleHQhOiAoKSA9PiBQcm9taXNlPHN0cmluZz47XG5cbiAgICBhc3luYyBieXRlcygpIHtcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShhd2FpdCB0aGlzLmFycmF5QnVmZmVyKCkpO1xuICAgIH1cblxuICAgIHN0YXRpYyBqc29uKGRhdGE6IGFueSwgaW5pdD86IFJlc3BvbnNlSW5pdCk6IFJlc3BvbnNlIHtcbiAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoaW5pdD8uaGVhZGVycyk7XG4gICAgICBpZiAoIWhlYWRlcnMuaGFzKCdjb250ZW50LXR5cGUnKSkge1xuICAgICAgICBoZWFkZXJzLnNldCgnY29udGVudC10eXBlJywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoYm9keSwgeyAuLi5pbml0LCBoZWFkZXJzIH0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBlcnJvcigpOiBSZXNwb25zZSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHJlZGlyZWN0KHVybDogc3RyaW5nIHwgVVJMLCBzdGF0dXM6IG51bWJlciA9IDMwMik6IFJlc3BvbnNlIHtcbiAgICAgIC8vIFZhbGlkYXRlIHN0YXR1cyBjb2RlIC0gb25seSBzcGVjaWZpYyByZWRpcmVjdCBjb2RlcyBhcmUgYWxsb3dlZFxuICAgICAgaWYgKCFbMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhdLmluY2x1ZGVzKHN0YXR1cykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXG4gICAgICAgICAgYEludmFsaWQgcmVkaXJlY3Qgc3RhdHVzIGNvZGU6ICR7c3RhdHVzfS4gTXVzdCBiZSBvbmUgb2Y6IDMwMSwgMzAyLCAzMDMsIDMwNywgMzA4YFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgcmVzcG9uc2Ugd2l0aCBMb2NhdGlvbiBoZWFkZXJcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoKTtcbiAgICAgIGhlYWRlcnMuc2V0KCdMb2NhdGlvbicsIFN0cmluZyh1cmwpKTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBPYmplY3QuY3JlYXRlKFJlc3BvbnNlLnByb3RvdHlwZSk7XG4gICAgICByZXNwb25zZS5zdGF0dXMgPSBzdGF0dXM7XG4gICAgICByZXNwb25zZS5zdGF0dXNUZXh0ID0gJyc7XG4gICAgICByZXNwb25zZS5oZWFkZXJzID0gaGVhZGVycztcbiAgICAgIHJlc3BvbnNlLmJvZHkgPSBudWxsO1xuICAgICAgcmVzcG9uc2UudHlwZSA9ICdkZWZhdWx0JztcbiAgICAgIHJlc3BvbnNlLnVybCA9ICcnO1xuICAgICAgcmVzcG9uc2UucmVkaXJlY3RlZCA9IGZhbHNlO1xuXG4gICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuICB9XG4gIHZtR2xvYmFsVGhpcy5SZXNwb25zZSA9IFJlc3BvbnNlO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlc3BvbnNlLnByb3RvdHlwZSwge1xuICAgIGFycmF5QnVmZmVyOiB7XG4gICAgICB2YWx1ZTogdXNlU3RlcDxbXSwgQXJyYXlCdWZmZXI+KCdfX2J1aWx0aW5fcmVzcG9uc2VfYXJyYXlfYnVmZmVyJyksXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9LFxuICAgIGpzb246IHtcbiAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBhbnk+KCdfX2J1aWx0aW5fcmVzcG9uc2VfanNvbicpLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSxcbiAgICB0ZXh0OiB7XG4gICAgICB2YWx1ZTogdXNlU3RlcDxbXSwgc3RyaW5nPignX19idWlsdGluX3Jlc3BvbnNlX3RleHQnKSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0sXG4gIH0pO1xuXG4gIGNsYXNzIFJlYWRhYmxlU3RyZWFtPFQ+IGltcGxlbWVudHMgZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxUPiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgZ2V0IGxvY2tlZCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjYW5jZWwoKTogYW55IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBnZXRSZWFkZXIoKTogYW55IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBwaXBlVGhyb3VnaCgpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIHBpcGVUbygpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIHRlZSgpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIHZhbHVlcygpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIHN0YXRpYyBmcm9tKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cbiAgfVxuICB2bUdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW0gPSBSZWFkYWJsZVN0cmVhbTtcblxuICBjbGFzcyBXcml0YWJsZVN0cmVhbTxUPiBpbXBsZW1lbnRzIGdsb2JhbFRoaXMuV3JpdGFibGVTdHJlYW08VD4ge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIGdldCBsb2NrZWQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgYWJvcnQoKTogYW55IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBjbG9zZSgpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIGdldFdyaXRlcigpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cbiAgfVxuICB2bUdsb2JhbFRoaXMuV3JpdGFibGVTdHJlYW0gPSBXcml0YWJsZVN0cmVhbTtcblxuICBjbGFzcyBUcmFuc2Zvcm1TdHJlYW08SSwgTz4gaW1wbGVtZW50cyBnbG9iYWxUaGlzLlRyYW5zZm9ybVN0cmVhbTxJLCBPPiB7XG4gICAgcmVhZGFibGU6IGdsb2JhbFRoaXMuUmVhZGFibGVTdHJlYW08Tz47XG4gICAgd3JpdGFibGU6IGdsb2JhbFRoaXMuV3JpdGFibGVTdHJlYW08ST47XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG4gIH1cbiAgdm1HbG9iYWxUaGlzLlRyYW5zZm9ybVN0cmVhbSA9IFRyYW5zZm9ybVN0cmVhbTtcblxuICB2bUdsb2JhbFRoaXMuY29uc29sZSA9IGdsb2JhbFRoaXMuY29uc29sZTtcblxuICAvLyBFeHBvc2UgdGhlIHJlcXVlc3QtY29udGV4dCBzeW1ib2wgcmVxdWlyZWQgYnkgQUkgR2F0ZXdheS5cbiAgY29uc3QgU1lNQk9MX0ZPUl9SRVFfQ09OVEVYVCA9IFN5bWJvbC5mb3IoJ0B2ZXJjZWwvcmVxdWVzdC1jb250ZXh0Jyk7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICB2bUdsb2JhbFRoaXNbU1lNQk9MX0ZPUl9SRVFfQ09OVEVYVF0gPSAoZ2xvYmFsVGhpcyBhcyBhbnkpW1xuICAgIFNZTUJPTF9GT1JfUkVRX0NPTlRFWFRcbiAgXTtcbiAgZW5kVm1UcmFjZSgpO1xuXG4gIC8vIFJldXNlIGNvbXBpbGVkIHNjcmlwdHMgYnkgYChjb2RlLCBmaWxlbmFtZSlgOiBjb21waWxhdGlvbiBpcyBkZXRlcm1pbmlzdGljXG4gIC8vIGFuZCB0aGUgZmlsZW5hbWUgcHJlc2VydmVzIHdvcmtmbG93IHNvdXJjZSBhdHRyaWJ1dGlvbiBpbiBzdGFjayB0cmFjZXMuXG4gIC8vIFRoZSBidW5kbGUgcmVnaXN0ZXJzIHdvcmtmbG93cyBvbiBgZ2xvYmFsVGhpcy5fX3ByaXZhdGVfd29ya2Zsb3dzYC5cbiAgY29uc3QgeyBidW5kbGVTY3JpcHQsIHdvcmtmbG93TG9va3VwU2NyaXB0IH0gPVxuICAgIGNvbXBpbGVkV29ya2Zsb3dTY3JpcHRzID8/XG4gICAgKGF3YWl0IGNvbXBpbGVXb3JrZmxvd0J1bmRsZSh3b3JrZmxvd0NvZGUsIHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSkpO1xuICBjb25zdCB3b3JrZmxvd0ZuID0gYXdhaXQgdHJhY2UoJ3dvcmtmbG93LmJ1bmRsZS5ldmFsdWF0ZScsIGFzeW5jICgpID0+IHtcbiAgICBidW5kbGVTY3JpcHQucnVuSW5Db250ZXh0KGNvbnRleHQpO1xuICAgIHJldHVybiB3b3JrZmxvd0xvb2t1cFNjcmlwdC5ydW5JbkNvbnRleHQoY29udGV4dCk7XG4gIH0pO1xuXG4gIGlmICh0eXBlb2Ygd29ya2Zsb3dGbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd05vdFJlZ2lzdGVyZWRFcnJvcih3b3JrZmxvd1J1bi53b3JrZmxvd05hbWUpO1xuICB9XG5cbiAgLy8gQ2hhaW4gd29ya2Zsb3cgYXJndW1lbnQgaHlkcmF0aW9uIG9udG8gdGhlIHByb21pc2VRdWV1ZSBzbyB0aGF0IHRoZVxuICAvLyB1bmNvbnN1bWVkIGV2ZW50IGNoZWNrICh3aGljaCB3YWl0cyBmb3IgdGhlIHF1ZXVlIHRvIGRyYWluKSBkb2Vzbid0XG4gIC8vIGZpcmUgZHVyaW5nIHRoZSBhc3luYyBnYXAgYmV0d2VlbiBydW5fc3RhcnRlZCBjb25zdW1wdGlvbiBhbmQgdGhlXG4gIC8vIHdvcmtmbG93IGZ1bmN0aW9uIHN1YnNjcmliaW5nIGl0cyBmaXJzdCBzdGVwIGNhbGxiYWNrcy5cbiAgbGV0IGFyZ3M6IHVua25vd25bXSA9IFtdO1xuICB3b3JrZmxvd0NvbnRleHQucHJvbWlzZVF1ZXVlID0gd29ya2Zsb3dDb250ZXh0LnByb21pc2VRdWV1ZS50aGVuKGFzeW5jICgpID0+IHtcbiAgICAvLyBJbmNsdWRlIGFueSByZXNpZHVhbCBwYXlsb2FkIHByZXBhcmF0aW9uIHBsdXMgVk0tbG9jYWwgZGVzZXJpYWxpemF0aW9uXG4gICAgLy8gaW4gdGhlIGJsb2NraW5nIGJvdW5kYXJ5LlxuICAgIGFyZ3MgPSBhd2FpdCB0cmFjZSgnd29ya2Zsb3cuaW5wdXQuaHlkcmF0ZScsIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHByZXBhcmVkID1cbiAgICAgICAgYXdhaXQgcmVwbGF5UGF5bG9hZENhY2hlLnByZXBhcmVXb3JrZmxvd0lucHV0KHdvcmtmbG93UnVuKTtcbiAgICAgIHJldHVybiBoeWRyYXRlV29ya2Zsb3dBcmd1bWVudHMoXG4gICAgICAgIHdvcmtmbG93UnVuLmlucHV0LFxuICAgICAgICB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgdm1HbG9iYWxUaGlzLFxuICAgICAgICB7fSxcbiAgICAgICAgcHJlcGFyZWRcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xuICBhd2FpdCB3b3JrZmxvd0NvbnRleHQucHJvbWlzZVF1ZXVlO1xuXG4gIGNvbnN0IGZhaWxXb3JrZmxvdyA9IGFzeW5jIChlcnJvcjogdW5rbm93bik6IFByb21pc2U8bmV2ZXI+ID0+IHtcbiAgICAvLyBDb250cm9sLWZsb3cgc2lnbmFscyBhcmUgaGFuZGxlZCBieSB0aGUgcnVudGltZSBhbmQgZG8gbm90IG1lYW4gdGhlXG4gICAgLy8gd29ya2Zsb3cgaGFzIHRlcm1pbmFsbHkgZmFpbGVkLiBgb25Xb3JrZmxvd0Vycm9yYCB1c3VhbGx5IGFscmVhZHkgbW92ZWRcbiAgICAvLyB0aGUgc3RhdGUgbWFjaGluZSwgYnV0IGEgZGl2ZXJnZW5jZSBjYW4gYWxzbyBhcnJpdmUgdmlhIGEgc3RlcFxuICAgIC8vIHByb21pc2UncyBkaXJlY3QgcmVqZWN0aW9uIChieXBhc3NpbmcgYG9uV29ya2Zsb3dFcnJvcmApOyBkZW1vdGUgc29cbiAgICAvLyBldmVyeSBjb250cm9sLWZsb3cgcGF0aCBjb252ZXJnZXMgb24gYHJlcGxheWAgYW5kIGEgbGF0ZXIgcmVzdW1lIGZhbGxzXG4gICAgLy8gYmFjayBpbnN0ZWFkIG9mIHRocm93aW5nLlxuICAgIGlmIChXb3JrZmxvd1N1c3BlbnNpb24uaXMoZXJyb3IpIHx8IFJlcGxheURpdmVyZ2VuY2VFcnJvci5pcyhlcnJvcikpIHtcbiAgICAgIGlmIChzdGF0ZS50eXBlID09PSAncnVubmluZycpIHN0YXRlID0geyB0eXBlOiAncmVwbGF5JyB9O1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIHN0YXRlID0geyB0eXBlOiAnY29tcGxldGVkJyB9O1xuXG4gICAgYXdhaXQgZHJhaW5QZW5kaW5nUXVldWVJdGVtcyhcbiAgICAgIHdvcmtmbG93UnVuLnJ1bklkLFxuICAgICAgd29ya2Zsb3dDb250ZXh0Lmludm9jYXRpb25zUXVldWUsXG4gICAgICB2bUdsb2JhbFRoaXMsXG4gICAgICB3b3JrZmxvd1J1bixcbiAgICAgICdmYWlsZWQnLFxuICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgKTtcblxuICAgIHRocm93IGVycm9yO1xuICB9O1xuXG4gIGNvbnN0IHdhaXRGb3JFeGVjdXRpb24gPSBhc3luYyAoXG4gICAgd29ya2Zsb3dCb2R5OiBQcm9taXNlPHVua25vd24+LFxuICAgIGludGVycnVwdGlvbjogUHJvbWlzZVdpdGhSZXNvbHZlcnM8bmV2ZXI+XG4gICk6IFByb21pc2U8V29ya2Zsb3dSZXN1bHQ+ID0+IHtcbiAgICBsZXQgcmVzdWx0OiB1bmtub3duO1xuICAgIHRyeSB7XG4gICAgICByZXN1bHQgPSBhd2FpdCBQcm9taXNlLnJhY2UoW3dvcmtmbG93Qm9keSwgaW50ZXJydXB0aW9uLnByb21pc2VdKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHN0YXRlLnR5cGUgPT09ICdzdXNwZW5kZWQnICYmIGVycm9yID09PSBzdGF0ZS5zdXNwZW5zaW9uKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogJ3N1c3BlbmRlZCcsXG4gICAgICAgICAgc3VzcGVuc2lvbjogc3RhdGUuc3VzcGVuc2lvbixcbiAgICAgICAgICBzZXNzaW9uLFxuICAgICAgICAgIC8vIEEgc3VzcGVuc2lvbiBpcyBub3QgYSBzZXR0bGluZyBwb2ludDogdGhlIGNvbnN1bWVyIGZvciBzb21ldGhpbmdcbiAgICAgICAgICAvLyBoZWxkIG1heSB3ZWxsIGJlIHJlZ2lzdGVyZWQgYnkgdGhlIHJlcGxheSB0aGF0IGZvbGxvd3MgdGhpcyBvbmUuXG4gICAgICAgICAgLy8gU28gaXQgaXMgY2FycmllZCBvdXQgZm9yIHRoZSBzcGFuIGluc3RlYWQgb2YgYmVpbmcganVkZ2VkIGhlcmUuXG4gICAgICAgICAgcGFya2VkOiBldmVudHNDb25zdW1lci5wYXJrZWRTdW1tYXJ5LFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhaWxXb3JrZmxvdyhlcnJvcik7XG4gICAgfVxuXG4gICAgc3RhdGUgPSB7IHR5cGU6ICdjb21wbGV0ZWQnIH07XG4gICAgLy8gVGhlIGNvbnN1bWVyIHdhbGtzIHBhc3QgZXZlbnRzIHdob3NlIHR5cGUgY2FycmllcyBubyBvcmRlcmluZyBjbGFpbSBhbmRcbiAgICAvLyBob2xkcyB0aGVtIGZvciBhIGNvbnN1bWVyIGl0IGV4cGVjdHMgYSBsYXRlciBgc3Vic2NyaWJlKClgIHRvIHJlZ2lzdGVyLlxuICAgIC8vIFRoZSB3b3JrZmxvdyBmdW5jdGlvbiByZXR1cm5pbmcgaXMgdGhlIHBvaW50IHdoZXJlIHRoYXQgZXhwZWN0YXRpb24gaXNcbiAgICAvLyBzZXR0bGVkOiBub3RoaW5nIG1vcmUgd2lsbCBzdWJzY3JpYmUsIHNvIGFueXRoaW5nIHN0aWxsIGhlbGQgd2FzIG5ldmVyXG4gICAgLy8gYW55b25lJ3MsIGFuZCBjb21wbGV0aW5nIGhlcmUgd291bGQgZHJvcCBpdCBzaWxlbnRseS5cbiAgICBjb25zdCBzdHJhbmRlZCA9IGV2ZW50c0NvbnN1bWVyLnN0cmFuZGVkRXZlbnQ7XG4gICAgaWYgKHN0cmFuZGVkKSB7XG4gICAgICByZXR1cm4gZmFpbFdvcmtmbG93KFxuICAgICAgICBuZXcgUmVwbGF5RGl2ZXJnZW5jZUVycm9yKFxuICAgICAgICAgIGBSZXBsYXkgZmluaXNoZWQgd2l0aG91dCBjb25zdW1pbmcgZXZlbnQ6IGV2ZW50VHlwZT0ke3N0cmFuZGVkLmV2ZW50VHlwZX0sIGNvcnJlbGF0aW9uSWQ9JHtzdHJhbmRlZC5jb3JyZWxhdGlvbklkfSwgZXZlbnRJZD0ke3N0cmFuZGVkLmV2ZW50SWR9LmAsXG4gICAgICAgICAgeyBldmVudElkOiBzdHJhbmRlZC5ldmVudElkIH1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGRlaHlkcmF0ZVdvcmtmbG93UmV0dXJuVmFsdWUoXG4gICAgICAgIHJlc3VsdCxcbiAgICAgICAgd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgICAgIGVuY3J5cHRpb25LZXksXG4gICAgICAgIHZtR2xvYmFsVGhpcyxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIC8vIE9ubHkgY29tcHJlc3Npb24tY2FwYWJsZSBydW5zIChzcGVjID49IDUpIG1heSB3cml0ZSBjb21wcmVzc2VkXG4gICAgICAgIC8vIHBheWxvYWRzLiBUaGUgc2VyaWFsaXplciB1c2VzIHpzdGQgd2hlbiBzdXBwb3J0ZWQgYW5kIG1heSB1c2UgZ3ppcC5cbiAgICAgICAgKHdvcmtmbG93UnVuLnNwZWNWZXJzaW9uID8/IDApID49IFNQRUNfVkVSU0lPTl9TVVBQT1JUU19DT01QUkVTU0lPTlxuICAgICAgKTtcblxuICAgICAgYXdhaXQgZHJhaW5QZW5kaW5nUXVldWVJdGVtcyhcbiAgICAgICAgd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgICAgIHdvcmtmbG93Q29udGV4dC5pbnZvY2F0aW9uc1F1ZXVlLFxuICAgICAgICB2bUdsb2JhbFRoaXMsXG4gICAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgICAnY29tcGxldGVkJyxcbiAgICAgICAgcnVuUmVhZHlCYXJyaWVyXG4gICAgICApO1xuXG4gICAgICByZXR1cm4geyB0eXBlOiAnY29tcGxldGVkJywgb3V0cHV0LCByZXN1bHRUeXBlOiB0eXBlb2YgcmVzdWx0IH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJldHVybiBmYWlsV29ya2Zsb3coZXJyb3IpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB3b3JrZmxvd1RyYWNlQ29udGV4dCA9IGF3YWl0IGNyZWF0ZVJlZnJlc2hhYmxlVHJhY2VDb250ZXh0KCk7XG4gIGNvbnN0IHJlcGxheVRyYWNlID0gYXdhaXQgc3RhcnRUcmFjZVNwYW4oJ3dvcmtmbG93LnJlcGxheS5leGVjdXRlJyk7XG4gIGNvbnN0IHdvcmtmbG93Qm9keSA9IHdvcmtmbG93VHJhY2VDb250ZXh0LnJ1bihhc3luYyAoKSA9PlxuICAgIHdvcmtmbG93Rm4oLi4uYXJncylcbiAgKTtcblxuICBjb25zdCBzZXNzaW9uOiBXb3JrZmxvd1Nlc3Npb24gPSB7XG4gICAgd29ya2Zsb3dSdW4sXG4gICAgYXJndW1lbnRDb3VudDogYXJncy5sZW5ndGgsXG4gICAgYXN5bmMgcmVzdW1lKG5leHRFdmVudHMpIHtcbiAgICAgIHN3aXRjaCAoc3RhdGUudHlwZSkge1xuICAgICAgICBjYXNlICdzdXNwZW5kZWQnOiB7XG4gICAgICAgICAgLy8gVGhlIGZ1bGwgTyhrbm93biBldmVudHMpIHByZWZpeCBjb21wYXJlIGlzIHJlcXVpcmVkOiB0aGUgcnVudGltZVxuICAgICAgICAgIC8vIHVzdWFsbHkgZ3Jvd3Mgb25lIGFycmF5IGluIHBsYWNlLCBidXQgaXRzIHdhaXQtY29tcGxldGlvbiBhbmRcbiAgICAgICAgICAvLyBzdGFsZS1yZWxvYWQgcGF0aHMgUkVQTEFDRSB0aGUgYXJyYXkgd2l0aCBhIGZyZXNoIGZ1bGwgZmV0Y2gsIHNvXG4gICAgICAgICAgLy8gYSByZXdyaXR0ZW4gcHJlZml4IGlzIGEgcmVhbCBpbnB1dCwgbm90IHBhcmFub2lhLiBUaGUgY29tcGFyZXNcbiAgICAgICAgICAvLyBhcmUgY2hlYXAgc3RyaW5nIGVxdWFsaXR5IGFuZCBkd2FyZmVkIGJ5IHRoZSByZXBsYXkgdGhleSBhdm9pZC5cbiAgICAgICAgICBjb25zdCBrbm93bkV2ZW50cyA9IGV2ZW50c0NvbnN1bWVyLmV2ZW50cztcbiAgICAgICAgICBjb25zdCBpc1N0cmljdEV4dGVuc2lvbiA9XG4gICAgICAgICAgICBuZXh0RXZlbnRzLmxlbmd0aCA+IGtub3duRXZlbnRzLmxlbmd0aCAmJlxuICAgICAgICAgICAga25vd25FdmVudHMuZXZlcnkoXG4gICAgICAgICAgICAgIChldmVudCwgaW5kZXgpID0+IGV2ZW50LmV2ZW50SWQgPT09IG5leHRFdmVudHNbaW5kZXhdLmV2ZW50SWRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCFpc1N0cmljdEV4dGVuc2lvbikge1xuICAgICAgICAgICAgc3RhdGUgPSB7IHR5cGU6ICdyZXBsYXknIH07XG4gICAgICAgICAgICByZXR1cm4geyB0eXBlOiAncmVwbGF5JyB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBpbnRlcnJ1cHRpb24gPSB3aXRoUmVzb2x2ZXJzPG5ldmVyPigpO1xuICAgICAgICAgIHN0YXRlID0geyB0eXBlOiAncnVubmluZycsIGludGVycnVwdGlvbiB9O1xuICAgICAgICAgIHdvcmtmbG93Q29udGV4dC5zdXNwZW5zaW9uR2VuZXJhdGlvbisrO1xuICAgICAgICAgIHdvcmtmbG93VHJhY2VDb250ZXh0LnJlZnJlc2goKTtcbiAgICAgICAgICBldmVudHNDb25zdW1lci5hcHBlbmQobmV4dEV2ZW50cy5zbGljZShrbm93bkV2ZW50cy5sZW5ndGgpKTtcbiAgICAgICAgICByZXR1cm4gd2FpdEZvckV4ZWN1dGlvbih3b3JrZmxvd0JvZHksIGludGVycnVwdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncmVwbGF5JzpcbiAgICAgICAgICByZXR1cm4geyB0eXBlOiAncmVwbGF5JyB9O1xuICAgICAgICBjYXNlICdjb21wbGV0ZWQnOlxuICAgICAgICBjYXNlICdydW5uaW5nJzpcbiAgICAgICAgICB0aHJvdyBuZXcgV29ya2Zsb3dSdW50aW1lRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IHJlc3VtZSAke3N0YXRlLnR5cGV9IHdvcmtmbG93IFwiJHt3b3JrZmxvd1J1bi5ydW5JZH1cImBcbiAgICAgICAgICApO1xuICAgICAgfVxuICAgICAgc3RhdGUgc2F0aXNmaWVzIG5ldmVyO1xuICAgIH0sXG4gIH07XG5cbiAgLy8gVGhlIHJlcGxheSBzcGFuIG1lYXN1cmVzIHRoZSB1c2VyIGZ1bmN0aW9uIHdpdGhvdXQgYmVjb21pbmcgaXRzIGFtYmllbnRcbiAgLy8gY29udGV4dC4gVGhlIHdvcmtmbG93IHByb21pc2Ugc3RheXMgcGVuZGluZyBhY3Jvc3MgcmV0YWluZWQgcmVzdW1lcywgc28gYW5cbiAgLy8gYWN0aXZlIHJlcGxheSBzcGFuIGhlcmUgd291bGQgcmVtYWluIGNhcHR1cmVkIGFmdGVyIHRoYXQgc3BhbiBoYXMgZW5kZWQuXG4gIGNvbnN0IGV4ZWN1dGlvbiA9IHdhaXRGb3JFeGVjdXRpb24od29ya2Zsb3dCb2R5LCBpbml0aWFsSW50ZXJydXB0aW9uKTtcbiAgdm9pZCBleGVjdXRpb24udGhlbihyZXBsYXlUcmFjZS5lbmQsIHJlcGxheVRyYWNlLmZhaWwpO1xuXG4gIHJldHVybiB7XG4gICAgc2Vzc2lvbixcbiAgICBleGVjdXRpb24sXG4gIH07XG59XG4iXX0=
989
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvd29ya2Zsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUNMLFdBQVcsRUFDWCxxQkFBcUIsRUFDckIsMEJBQTBCLEVBQzFCLG9CQUFvQixHQUNyQixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sRUFDTCxxQkFBcUIsRUFFckIsYUFBYSxHQUNkLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFL0QsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakYsT0FBTyxLQUFLLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDakMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUUzRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzFELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFNUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM5QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU5QyxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHdCQUF3QixHQUN6QixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxhQUFh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LG9CQUFvQixFQUFFLENBQUM7b0JBQ3ZDLG9CQUFvQixDQUFDLE9BQU8sRUFBRSxDQUFDO29CQUMvQixjQUFjLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0JBQzVELE9BQU8sZ0JBQWdCLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUN0RCxDQUFDO2dCQUNELEtBQUssUUFBUTtvQkFDWCxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDO2dCQUM1QixLQUFLLFdBQVcsQ0FBQztnQkFDakIsS0FBSyxTQUFTO29CQUNaLE1BQU0sSUFBSSxvQkFBb0IsQ0FDNUIsaUJBQWlCLEtBQUssQ0FBQyxJQUFJLGNBQWMsV0FBVyxDQUFDLEtBQUssR0FBRyxDQUM5RCxDQUFDO1lBQ04sQ0FBQztZQUNELEtBQXFCLENBQUM7UUFDeEIsQ0FBQztLQUNGLENBQUM7SUFFRiwwRUFBMEU7SUFDMUUsNkVBQTZFO0lBQzdFLDJFQUEyRTtJQUMzRSxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUN0RSxLQUFLLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFdkQsT0FBTztRQUNMLE9BQU87UUFDUCxTQUFTO0tBQ1YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFNjcmlwdCB9IGZyb20gJ25vZGU6dm0nO1xuaW1wb3J0IHR5cGUgeyBTcGFuIH0gZnJvbSAnQG9wZW50ZWxlbWV0cnkvYXBpJztcbmltcG9ydCB7XG4gIEVSUk9SX1NMVUdTLFxuICBSZXBsYXlEaXZlcmdlbmNlRXJyb3IsXG4gIFdvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yLFxuICBXb3JrZmxvd1J1bnRpbWVFcnJvcixcbn0gZnJvbSAnQHdvcmtmbG93L2Vycm9ycyc7XG5pbXBvcnQge1xuICBjcmVhdGVXb3JrZmxvd0Jhc2VVcmwsXG4gIHR5cGUgUHJvbWlzZVdpdGhSZXNvbHZlcnMsXG4gIHdpdGhSZXNvbHZlcnMsXG59IGZyb20gJ0B3b3JrZmxvdy91dGlscyc7XG5pbXBvcnQgeyBwYXJzZVdvcmtmbG93TmFtZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB0eXBlIHsgRXZlbnQsIFdvcmtmbG93UnVuLCBXb3JsZENhcGFiaWxpdGllcyB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBTUEVDX1ZFUlNJT05fU1VQUE9SVFNfQ09NUFJFU1NJT04gfSBmcm9tICdAd29ya2Zsb3cvd29ybGQvc3BlYy12ZXJzaW9uJztcbmltcG9ydCAqIGFzIG5hbm9pZCBmcm9tICduYW5vaWQnO1xuaW1wb3J0IHsgbW9ub3RvbmljRmFjdG9yeSB9IGZyb20gJ3VsaWQnO1xuaW1wb3J0IHsgRXZlbnRDb25zdW1lclJlc3VsdCwgRXZlbnRzQ29uc3VtZXIgfSBmcm9tICcuL2V2ZW50cy1jb25zdW1lci5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1ZXVlSXRlbSB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IEVOT1RTVVAsIFdvcmtmbG93U3VzcGVuc2lvbiB9IGZyb20gJy4vZ2xvYmFsLmpzJztcbmltcG9ydCB7IHJ1bnRpbWVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93T3JjaGVzdHJhdG9yQ29udGV4dCB9IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQgeyBpc0RlbGl2ZXJ5SWRsZSB9IGZyb20gJy4vcHJpdmF0ZS5qcyc7XG5pbXBvcnQgeyBSZXBsYXlQYXlsb2FkQ2FjaGUgfSBmcm9tICcuL3JlcGxheS1wYXlsb2FkLWNhY2hlLmpzJztcbmltcG9ydCB7IGdldFBvcnRMYXp5IH0gZnJvbSAnLi9ydW50aW1lL2dldC1wb3J0LWxhenkuanMnO1xuaW1wb3J0IHsgcnVuSWRDcmVhdGVkQXQgfSBmcm9tICcuL3J1bnRpbWUvcnVuLWlkLXRpbWUuanMnO1xuaW1wb3J0IHsgaGFuZGxlU3VzcGVuc2lvbiB9IGZyb20gJy4vcnVudGltZS9zdXNwZW5zaW9uLWhhbmRsZXIuanMnO1xuaW1wb3J0IHsgZ2V0V29ybGQgfSBmcm9tICcuL3J1bnRpbWUvd29ybGQuanMnO1xuaW1wb3J0IHR5cGUgeyBQYXlsb2FkS2V5IH0gZnJvbSAnLi9zZXJpYWxpemF0aW9uL2VuY3J5cHRpb24uanMnO1xuaW1wb3J0IHtcbiAgZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZSxcbiAgaHlkcmF0ZVdvcmtmbG93QXJndW1lbnRzLFxufSBmcm9tICcuL3NlcmlhbGl6YXRpb24uanMnO1xuaW1wb3J0IHsgY3JlYXRlVXNlU3RlcCB9IGZyb20gJy4vc3RlcC5qcyc7XG5pbXBvcnQge1xuICBCT0RZX0lOSVRfU1lNQk9MLFxuICBTVEFCTEVfVUxJRCxcbiAgV09SS0ZMT1dfQ1JFQVRFX0hPT0ssXG4gIFdPUktGTE9XX0dFVF9TVFJFQU1fSUQsXG4gIFdPUktGTE9XX1NFVF9BVFRSSUJVVEVTLFxuICBXT1JLRkxPV19TTEVFUCxcbiAgV09SS0ZMT1dfVVNFX1NURVAsXG59IGZyb20gJy4vc3ltYm9scy5qcyc7XG5pbXBvcnQgKiBhcyBBdHRyaWJ1dGUgZnJvbSAnLi90ZWxlbWV0cnkvc2VtYW50aWMtY29udmVudGlvbnMuanMnO1xuaW1wb3J0IHtcbiAgYXBwbHlXb3JrZmxvd1N1c3BlbnNpb25Ub1NwYW4sXG4gIGNyZWF0ZVJlZnJlc2hhYmxlVHJhY2VDb250ZXh0LFxuICBzdGFydFRyYWNlU3BhbixcbiAgdHJhY2UsXG59IGZyb20gJy4vdGVsZW1ldHJ5LmpzJztcbmltcG9ydCB7IGdldFdvcmtmbG93UnVuU3RyZWFtSWQgfSBmcm9tICcuL3V0aWwuanMnO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCB9IGZyb20gJy4vdm0vaW5kZXguanMnO1xuaW1wb3J0IHsgZ2V0Q2FjaGVkV29ya2Zsb3dTY3JpcHQgfSBmcm9tICcuL3ZtL3NjcmlwdC1jYWNoZS5qcyc7XG5pbXBvcnQge1xuICBjcmVhdGVBYm9ydFNpZ25hbFN0YXRpY3MsXG4gIGNyZWF0ZUNyZWF0ZUFib3J0Q29udHJvbGxlcixcbn0gZnJvbSAnLi93b3JrZmxvdy9hYm9ydC1jb250cm9sbGVyLmpzJztcbmltcG9ydCB7IGNyZWF0ZVNldEF0dHJpYnV0ZXMgfSBmcm9tICcuL3dvcmtmbG93L2F0dHJpYnV0ZS1kaXNwYXRjaGVyLmpzJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dNZXRhZGF0YSB9IGZyb20gJy4vd29ya2Zsb3cvZ2V0LXdvcmtmbG93LW1ldGFkYXRhLmpzJztcbmltcG9ydCB7IFdPUktGTE9XX0NPTlRFWFRfU1lNQk9MIH0gZnJvbSAnLi93b3JrZmxvdy9nZXQtd29ya2Zsb3ctbWV0YWRhdGEuanMnO1xuaW1wb3J0IHsgY3JlYXRlQ3JlYXRlSG9vayB9IGZyb20gJy4vd29ya2Zsb3cvaG9vay5qcyc7XG5pbXBvcnQgeyBjcmVhdGVTbGVlcCB9IGZyb20gJy4vd29ya2Zsb3cvc2xlZXAuanMnO1xuXG4vKipcbiAqIERyYWluIHBlbmRpbmcgcXVldWUgaXRlbXMgYXQgd29ya2Zsb3cgY29tcGxldGlvbiAoc3VjY2VzcyBvciBmYWlsdXJlKS5cbiAqXG4gKiBUcmVhdHMgY29tcGxldGlvbiBhcyBhIGZpbmFsIHN1c3BlbnNpb24gc28gdW5hd2FpdGVkIGhvb2ssIHdhaXQsIGFuZFxuICogYXR0cmlidXRlIG9wZXJhdGlvbnMgYXJlIHJlY29yZGVkIGJlZm9yZSB0aGUgcnVuIGJlY29tZXMgdGVybWluYWwuIFRoaXNcbiAqIGFsc28gbGV0cyBhIGZpbmFsIGBjb250cm9sbGVyLmFib3J0KClgIHJlYWNoIGluLWZsaWdodCBzdGVwcy5cbiAqXG4gKiBJdCByZWNvcmRzIGAqX2NyZWF0ZWRgIGFuZCBuYXRpdmUgYXR0cmlidXRlIGV2ZW50cywgYnV0IG5ldmVyIGV4ZWN1dGVzIHN0ZXBcbiAqIGJvZGllczogYHN0ZXBfc3RhcnRlZGAgaXMgcmVqZWN0ZWQgYWZ0ZXIgdGhlIHJ1biBiZWNvbWVzIHRlcm1pbmFsLiBBXG4gKiBmaXJlLWFuZC1mb3JnZXQgc3RlcCB0aGVyZWZvcmUgbmVlZHMgYSBsYXRlciBzdXNwZW5zaW9uIHRvIGJlIHNjaGVkdWxlZC5cbiAqXG4gKiBEcmFpbiBmYWlsdXJlcyBkbyBub3QgY2hhbmdlIHRoZSB3b3JrZmxvdydzIHRlcm1pbmFsIG91dGNvbWUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRyYWluUGVuZGluZ1F1ZXVlSXRlbXMoXG4gIHJ1bklkOiBzdHJpbmcsXG4gIHBlbmRpbmdRdWV1ZTogTWFwPHN0cmluZywgUXVldWVJdGVtPixcbiAgdm1HbG9iYWxUaGlzOiB0eXBlb2YgZ2xvYmFsVGhpcyxcbiAgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuLFxuICBvdXRjb21lOiAnY29tcGxldGVkJyB8ICdmYWlsZWQnLFxuICAvKipcbiAgICogSW4gdHVyYm8gbW9kZSwgZ2F0ZXMgZmluYWwgYCpfY3JlYXRlZGAgd3JpdGVzIG9uIGJhY2tncm91bmRlZFxuICAgKiBgcnVuX3N0YXJ0ZWRgLiBVbmRlZmluZWQgd2hlbiBgcnVuX3N0YXJ0ZWRgIGlzIGF3YWl0ZWQuXG4gICAqL1xuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+XG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHBlbmRpbmdRdWV1ZS5zaXplID09PSAwKSByZXR1cm47XG4gIC8vIEltcGxpY2l0bHkgZGlzcG9zZSBhbnkgYWJvcnQgaG9va3MgKHN5c3RlbSBob29rcykgdGhhdCBhcmUgc3RpbGwgYWxpdmUgYXRcbiAgLy8gd29ya2Zsb3cgY29tcGxldGlvbiBzbyB0aGV5IGRvbid0IGxlYWsgcm93cyBpbiB0aGUgaG9va3MgdGFibGUgZm9yIHRoZVxuICAvLyBydW4ncyBsaWZldGltZS4gU2tpcCBob29rcyB0aGF0IGFscmVhZHkgaGF2ZSBhbiBhYm9ydCBpbiBmbGlnaHQ7IHRob3NlXG4gIC8vIHdpbGwgZW1pdCBob29rX3JlY2VpdmVkIHZpYSB0aGUgYWJvcnQgcHJvY2Vzc2luZyBwYXRoLiBVc2VyIGhvb2tzXG4gIC8vIChpc1N5c3RlbSAhPT0gdHJ1ZSkgYXJlIGludGVudGlvbmFsbHkgbGVmdCBhbG9uZTogdGhlaXIgbGlmZXRpbWUgaXNcbiAgLy8gbWFuYWdlZCBieSB0aGUgdXNlcidzIGNvZGUsIG5vdCB0aGUgcnVudGltZS5cbiAgZm9yIChjb25zdCBpdGVtIG9mIHBlbmRpbmdRdWV1ZS52YWx1ZXMoKSkge1xuICAgIGlmIChcbiAgICAgIGl0ZW0udHlwZSA9PT0gJ2hvb2snICYmXG4gICAgICBpdGVtLmlzU3lzdGVtICYmXG4gICAgICAhaXRlbS5kaXNwb3NlZCAmJlxuICAgICAgIWl0ZW0uYWJvcnRSZXF1ZXN0ZWRcbiAgICApIHtcbiAgICAgIGl0ZW0uZGlzcG9zZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHdvcmxkID0gYXdhaXQgZ2V0V29ybGQoKTtcbiAgICBjb25zdCBzeW50aGVzaXplZCA9IG5ldyBXb3JrZmxvd1N1c3BlbnNpb24ocGVuZGluZ1F1ZXVlLCB2bUdsb2JhbFRoaXMpO1xuICAgIGF3YWl0IGhhbmRsZVN1c3BlbnNpb24oe1xuICAgICAgc3VzcGVuc2lvbjogc3ludGhlc2l6ZWQsXG4gICAgICB3b3JsZCxcbiAgICAgIHJ1bjogd29ya2Zsb3dSdW4sXG4gICAgICBydW5SZWFkeUJhcnJpZXIsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHJ1bnRpbWVMb2dnZXIud2FybihcbiAgICAgIGBGYWlsZWQgdG8gZHJhaW4gcGVuZGluZyBxdWV1ZSBpdGVtcyBmb3IgJHtvdXRjb21lfSB3b3JrZmxvdyBydW5gLFxuICAgICAge1xuICAgICAgICB3b3JrZmxvd1J1bklkOiBydW5JZCxcbiAgICAgICAgbWVzc2FnZTogZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IFN0cmluZyhlcnIpLFxuICAgICAgfVxuICAgICk7XG4gIH1cbn1cblxuLyoqIEV2ZXJ5dGhpbmcgbmVlZGVkIHRvIGNvbGQtc3RhcnQgYSB3b3JrZmxvdyBWTSBvdmVyIGFuIGV2ZW50IGxvZy4gKi9cbmludGVyZmFjZSBXb3JrZmxvd1Nlc3Npb25PcHRpb25zIHtcbiAgcmVhZG9ubHkgd29ya2Zsb3dDb2RlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bjtcbiAgcmVhZG9ubHkgZXZlbnRzOiBFdmVudFtdO1xuICByZWFkb25seSBlbmNyeXB0aW9uS2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkO1xuICByZWFkb25seSByZXBsYXlQYXlsb2FkQ2FjaGU6IFJlcGxheVBheWxvYWRDYWNoZTtcbiAgcmVhZG9ubHkgY29tcGlsZWRXb3JrZmxvd1NjcmlwdHM/OiBDb21waWxlZFdvcmtmbG93U2NyaXB0cztcbiAgcmVhZG9ubHkgcnVuUmVhZHlCYXJyaWVyPzogUHJvbWlzZTx1bmtub3duPjtcbiAgcmVhZG9ubHkgd29ybGRDYXBhYmlsaXRpZXM/OiBXb3JsZENhcGFiaWxpdGllcztcbn1cblxuLyoqIENvbnRleHQtaW5kZXBlbmRlbnQgVjggc2NyaXB0cyB0aGF0IGNhbiBiZSBldmFsdWF0ZWQgaW4gYW55IGZyZXNoIFZNLiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21waWxlZFdvcmtmbG93U2NyaXB0cyB7XG4gIHJlYWRvbmx5IGJ1bmRsZVNjcmlwdDogU2NyaXB0O1xuICByZWFkb25seSB3b3JrZmxvd0xvb2t1cFNjcmlwdDogU2NyaXB0O1xufVxuXG4vKipcbiAqIENvbXBpbGUgdGhlIHdvcmtmbG93IGJ1bmRsZSBiZWZvcmUgaXRzIHJ1biBzbmFwc2hvdCBpcyBhdmFpbGFibGUuXG4gKlxuICogQ29tcGlsYXRpb24gZGVwZW5kcyBvbmx5IG9uIHRoZSByb3V0ZSdzIGJ1bmRsZSBzdHJpbmcgYW5kIHRoZSB3b3JrZmxvdyBuYW1lXG4gKiBwZXJzaXN0ZWQgb24gdGhlIHJ1biwgbm90IHRoZSBldmVudCBsb2cgb3IgVk0gY29udGV4dC4gVGhlIHJ1bnRpbWUgc3RhcnRzXG4gKiB0aGlzIHByb21pc2Ugd2hpbGUgYHJ1bl9zdGFydGVkYCBsb2FkcyB0aGUgcmVwbGF5IHNuYXBzaG90LCB0aGVuIGV2YWx1YXRlc1xuICogdGhlIHNjcmlwdHMgb25seSBhZnRlciBpdCBoYXMgY3JlYXRlZCB0aGUgZnJlc2ggY29udGV4dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXBpbGVXb3JrZmxvd0J1bmRsZShcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gIHdvcmtmbG93TmFtZTogc3RyaW5nXG4pOiBQcm9taXNlPENvbXBpbGVkV29ya2Zsb3dTY3JpcHRzPiB7XG4gIGNvbnN0IHBhcnNlZE5hbWUgPSBwYXJzZVdvcmtmbG93TmFtZSh3b3JrZmxvd05hbWUpO1xuICBjb25zdCBmaWxlbmFtZSA9IHBhcnNlZE5hbWU/Lm1vZHVsZVNwZWNpZmllciB8fCB3b3JrZmxvd05hbWU7XG4gIGNvbnN0IHdvcmtmbG93TG9va3VwQ29kZSA9IGBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3M/LmdldCgke0pTT04uc3RyaW5naWZ5KHdvcmtmbG93TmFtZSl9KWA7XG5cbiAgcmV0dXJuIHRyYWNlKCd3b3JrZmxvdy5idW5kbGUuY29tcGlsZScsIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgY29uc3QgYnVuZGxlID0gZ2V0Q2FjaGVkV29ya2Zsb3dTY3JpcHQod29ya2Zsb3dDb2RlLCBmaWxlbmFtZSk7XG4gICAgY29uc3QgbG9va3VwID0gZ2V0Q2FjaGVkV29ya2Zsb3dTY3JpcHQod29ya2Zsb3dMb29rdXBDb2RlLCBmaWxlbmFtZSk7XG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAvLyBUaGlzIGF0dHJpYnV0ZSBpbnRlbnRpb25hbGx5IGRlc2NyaWJlcyB0aGUgd29ya2Zsb3cgYnVuZGxlLiBUaGUgdGlueVxuICAgICAgLy8gbG9va3VwIHNjcmlwdCBtYXkgbWlzcyB3aGVuIGFub3RoZXIgd29ya2Zsb3cgZnJvbSB0aGUgc2FtZSBzb3VyY2UgZmlsZVxuICAgICAgLy8gcnVucywgYnV0IHRoYXQgZG9lcyBub3QgbWVhbiBWOCByZWNvbXBpbGVkIHRoZSBhcHBsaWNhdGlvbiBidW5kbGUuXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dCdW5kbGVDb21waWxlQ2FjaGVIaXQoYnVuZGxlLmNhY2hlSGl0KSxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgYnVuZGxlU2NyaXB0OiBidW5kbGUuc2NyaXB0LFxuICAgICAgd29ya2Zsb3dMb29rdXBTY3JpcHQ6IGxvb2t1cC5zY3JpcHQsXG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKlxuICogQSBsaXZlIHdvcmtmbG93IFZNLCBwYXJrZWQgYXQgYSBzdXNwZW5zaW9uIGJvdW5kYXJ5LiBgcmVzdW1lYCBhZHZhbmNlcyBpdFxuICogYnkgYXBwZW5kaW5nIGV2ZW50cyBpbnN0ZWFkIG9mIHJlcGxheWluZyBmcm9tIHNjcmF0Y2guXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Zsb3dTZXNzaW9uIHtcbiAgcmVhZG9ubHkgd29ya2Zsb3dSdW46IFdvcmtmbG93UnVuO1xuICByZWFkb25seSBhcmd1bWVudENvdW50OiBudW1iZXI7XG4gIHJlc3VtZShldmVudHM6IEV2ZW50W10pOiBQcm9taXNlPFdvcmtmbG93UmVzdW1lUmVzdWx0Pjtcbn1cblxuLyoqIEEgZmluaXNoZWQgZXhlY3V0aW9uIGF0dGVtcHQ6IHRoZSB3b3JrZmxvdydzIG91dHB1dCBvciBhIGxpdmUgYm91bmRhcnkuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1Jlc3VsdCA9XG4gIHwge1xuICAgICAgcmVhZG9ubHkgdHlwZTogJ2NvbXBsZXRlZCc7XG4gICAgICByZWFkb25seSBvdXRwdXQ6IHVua25vd247XG4gICAgICAvKiogYHR5cGVvZmAgdGhlIHJhdyByZXR1cm4gdmFsdWUsIGZvciB0ZWxlbWV0cnkuICovXG4gICAgICByZWFkb25seSByZXN1bHRUeXBlOiBzdHJpbmc7XG4gICAgfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IHR5cGU6ICdzdXNwZW5kZWQnO1xuICAgICAgcmVhZG9ubHkgc3VzcGVuc2lvbjogV29ya2Zsb3dTdXNwZW5zaW9uO1xuICAgICAgcmVhZG9ubHkgc2Vzc2lvbjogV29ya2Zsb3dTZXNzaW9uO1xuICAgICAgLyoqXG4gICAgICAgKiBFdmVudHMgdGhlIHJlcGxheSB3YWxrZWQgcGFzdCB1bmNsYWltZWQgYW5kIGlzIHN0aWxsIGhvbGRpbmcsIGlmIGFueS5cbiAgICAgICAqIE9yZGluYXJ5IG9uIGEgc3VzcGVuc2lvbiwgYW5kIG9ubHkgYWN0aW9uYWJsZSBhY3Jvc3MgYSBydW4nc1xuICAgICAgICogc3VzcGVuc2lvbnMsIHNvIGl0IGlzIHJlcG9ydGVkIGZvciB0ZWxlbWV0cnkgcmF0aGVyIHRoYW4gYWN0ZWQgb24gaGVyZS5cbiAgICAgICAqL1xuICAgICAgcmVhZG9ubHkgcGFya2VkPzoge1xuICAgICAgICByZWFkb25seSBjb3VudDogbnVtYmVyO1xuICAgICAgICByZWFkb25seSBldmVudElkOiBzdHJpbmc7XG4gICAgICAgIHJlYWRvbmx5IGV2ZW50VHlwZTogc3RyaW5nO1xuICAgICAgfTtcbiAgICB9O1xuXG4vKipcbiAqIGByZXN1bWVgIGNhbiBhZGRpdGlvbmFsbHkgZGVjbGluZTogYHsgdHlwZTogJ3JlcGxheScgfWAgbWVhbnMgXCJ0aGlzXG4gKiBzZXNzaW9uIGlzIHVudXNhYmxlLCBjb2xkLXJlcGxheSBpbnN0ZWFkXCIuIEEgZnJlc2ggcmVwbGF5IG5ldmVyIGRlY2xpbmVzLlxuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1Jlc3VtZVJlc3VsdCA9IFdvcmtmbG93UmVzdWx0IHwgeyByZWFkb25seSB0eXBlOiAncmVwbGF5JyB9O1xuXG4vKiogVGhlIHNlc3Npb24ncyBwcml2YXRlIHN0YXRlIG1hY2hpbmUuICovXG50eXBlIFdvcmtmbG93U2Vzc2lvblN0YXRlID1cbiAgfCB7XG4gICAgICByZWFkb25seSB0eXBlOiAncnVubmluZyc7XG4gICAgICByZWFkb25seSBpbnRlcnJ1cHRpb246IFByb21pc2VXaXRoUmVzb2x2ZXJzPG5ldmVyPjtcbiAgICB9XG4gIHwgeyByZWFkb25seSB0eXBlOiAnc3VzcGVuZGVkJzsgcmVhZG9ubHkgc3VzcGVuc2lvbjogV29ya2Zsb3dTdXNwZW5zaW9uIH1cbiAgfCB7IHJlYWRvbmx5IHR5cGU6ICdyZXBsYXknIH1cbiAgfCB7IHJlYWRvbmx5IHR5cGU6ICdjb21wbGV0ZWQnIH07XG5cbi8qKiBDb2xkLXN0YXJ0OiBidWlsZCBhIGZyZXNoIFZNIHNlc3Npb24gYW5kIHJlcGxheSBpdCBvdmVyIGBldmVudHNgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcGxheVdvcmtmbG93KFxuICBvcHRpb25zOiBXb3JrZmxvd1Nlc3Npb25PcHRpb25zXG4pOiBQcm9taXNlPFdvcmtmbG93UmVzdWx0PiB7XG4gIHJldHVybiB0cmFjZUV4ZWN1dGlvbihcbiAgICAncmVwbGF5JyxcbiAgICBvcHRpb25zLndvcmtmbG93UnVuLFxuICAgIG9wdGlvbnMuZXZlbnRzLFxuICAgIGFzeW5jIChzcGFuKSA9PiB7XG4gICAgICBjb25zdCB7IHNlc3Npb24sIGV4ZWN1dGlvbiB9ID0gYXdhaXQgY3JlYXRlV29ya2Zsb3dTZXNzaW9uKG9wdGlvbnMpO1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0FyZ3VtZW50c0NvdW50KHNlc3Npb24uYXJndW1lbnRDb3VudCksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZWNvcmRSZXN1bHQoYXdhaXQgZXhlY3V0aW9uLCBzcGFuKTtcbiAgICB9XG4gICk7XG59XG5cbi8qKiBXYXJtLXN0YXJ0OiBhZHZhbmNlIGEgcmV0YWluZWQgc2Vzc2lvbiBieSBhcHBlbmRpbmcgZXZlbnRzLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc3VtZVdvcmtmbG93KFxuICBzZXNzaW9uOiBXb3JrZmxvd1Nlc3Npb24sXG4gIGV2ZW50czogRXZlbnRbXVxuKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VtZVJlc3VsdD4ge1xuICByZXR1cm4gdHJhY2VFeGVjdXRpb24oXG4gICAgJ3JldGFpbmVkJyxcbiAgICBzZXNzaW9uLndvcmtmbG93UnVuLFxuICAgIGV2ZW50cyxcbiAgICBhc3luYyAoc3BhbikgPT4ge1xuICAgICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd0FyZ3VtZW50c0NvdW50KHNlc3Npb24uYXJndW1lbnRDb3VudCksXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNlc3Npb24ucmVzdW1lKGV2ZW50cyk7XG4gICAgICByZXR1cm4gcmVzdWx0LnR5cGUgPT09ICdyZXBsYXknID8gcmVzdWx0IDogcmVjb3JkUmVzdWx0KHJlc3VsdCwgc3Bhbik7XG4gICAgfVxuICApO1xufVxuXG5mdW5jdGlvbiB0cmFjZUV4ZWN1dGlvbjxUPihcbiAgbW9kZTogJ3JlcGxheScgfCAncmV0YWluZWQnLFxuICB3b3JrZmxvd1J1bjogV29ya2Zsb3dSdW4sXG4gIGV2ZW50czogRXZlbnRbXSxcbiAgZm46IChzcGFuOiBTcGFuIHwgdW5kZWZpbmVkKSA9PiBQcm9taXNlPFQ+XG4pOiBQcm9taXNlPFQ+IHtcbiAgcmV0dXJuIHRyYWNlKGB3b3JrZmxvdy5ydW4gJHt3b3JrZmxvd1J1bi53b3JrZmxvd05hbWV9YCwgKHNwYW4pID0+IHtcbiAgICBzcGFuPy5zZXRBdHRyaWJ1dGVzKHtcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUod29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1bklkKHdvcmtmbG93UnVuLnJ1bklkKSxcbiAgICAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cyh3b3JrZmxvd1J1bi5zdGF0dXMpLFxuICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93RXZlbnRzQ291bnQoZXZlbnRzLmxlbmd0aCksXG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dFeGVjdXRpb25Nb2RlKG1vZGUpLFxuICAgIH0pO1xuICAgIHJldHVybiBmbihzcGFuKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlY29yZFJlc3VsdChcbiAgcmVzdWx0OiBXb3JrZmxvd1Jlc3VsdCxcbiAgc3BhbjogU3BhbiB8IHVuZGVmaW5lZFxuKTogV29ya2Zsb3dSZXN1bHQge1xuICBpZiAocmVzdWx0LnR5cGUgPT09ICdjb21wbGV0ZWQnKSB7XG4gICAgc3Bhbj8uc2V0QXR0cmlidXRlcyh7XG4gICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dSZXN1bHRUeXBlKHJlc3VsdC5yZXN1bHRUeXBlKSxcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChzcGFuKSB7XG4gICAgYXBwbHlXb3JrZmxvd1N1c3BlbnNpb25Ub1NwYW4ocmVzdWx0LnN1c3BlbnNpb24sIHNwYW4pO1xuICAgIC8vIEV2ZW50cyB0aGlzIHBhc3Mgd2Fsa2VkIHBhc3QgdW5jbGFpbWVkIGFuZCBpcyBzdGlsbCBob2xkaW5nLiBPcmRpbmFyeSBvblxuICAgIC8vIGEgc3VzcGVuc2lvbjogYW4gb3V0LW9mLWJhbmQgZGVsaXZlcnkgdGhhdCBsYW5kZWQgYWhlYWQgb2YgdGhlIGNvZGUgdGhhdFxuICAgIC8vIHJlYWRzIGl0IHdhaXRzIGZvciB0aGUgcGFzcyB0aGF0IHJlYWNoZXMgdGhhdCBjb2RlLCBhbmQgZmFpbGluZyBoZXJlXG4gICAgLy8gd291bGQgZmFpbCBleGFjdGx5IHRoZSBydW5zIHRoYXQgdG9sZXJhbmNlIGV4aXN0cyBmb3IuIFRoZSBjYXNlIHRoYXQgaXNcbiAgICAvLyBub3Qgb3JkaW5hcnkgKHRoZSBzYW1lIGV2ZW50IHN0aWxsIGhlbGQgcGFzcyBhZnRlciBwYXNzKSBpcyBhIHNoYXBlXG4gICAgLy8gYWNyb3NzIHRoZXNlIHNwYW5zLCB3aGljaCBpcyB3aHkgdGhlIGV2ZW50SWQgaXMgb24gZWFjaCBvbmUgYW5kIG5vIHBhc3NcbiAgICAvLyB0cmllcyB0byBydWxlIG9uIGl0IGFsb25lLlxuICAgIGlmIChyZXN1bHQucGFya2VkKSB7XG4gICAgICBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dQYXJrZWRFdmVudHNDb3VudChyZXN1bHQucGFya2VkLmNvdW50KSxcbiAgICAgICAgLi4uQXR0cmlidXRlLldvcmtmbG93UGFya2VkRXZlbnRJZChyZXN1bHQucGFya2VkLmV2ZW50SWQpLFxuICAgICAgICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dQYXJrZWRFdmVudFR5cGUocmVzdWx0LnBhcmtlZC5ldmVudFR5cGUpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU2luZ2xlLXNob3QgcmVwbGF5OiBleGVjdXRlIHRoZSB3b3JrZmxvdyBvdmVyIGBldmVudHNgIGFuZCBlaXRoZXIgcmV0dXJuXG4gKiBpdHMgb3V0cHV0IG9yIHRocm93IGl0cyBzdXNwZW5zaW9uLiBLZXB0IGZvciB0aGUgZXh0ZW5zaXZlIGV4aXN0aW5nIHRlc3RcbiAqIHN1aXRlczsgcHJvZHVjdGlvbiBjb2RlIGdvZXMgdGhyb3VnaCBgcmVwbGF5V29ya2Zsb3dgL2ByZXN1bWVXb3JrZmxvd2AuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5Xb3JrZmxvdyhcbiAgd29ya2Zsb3dDb2RlOiBzdHJpbmcsXG4gIHdvcmtmbG93UnVuOiBXb3JrZmxvd1J1bixcbiAgZXZlbnRzOiBFdmVudFtdLFxuICBlbmNyeXB0aW9uS2V5OiBQYXlsb2FkS2V5IHwgdW5kZWZpbmVkLFxuICAvKipcbiAgICogT3B0aW9uYWwgcGVyLXJ1biBjYWNoZSBmb3IgcmVwbGF5IHBheWxvYWQgcHJlcGFyYXRpb24gYW5kIGltbXV0YWJsZSBmaW5hbFxuICAgKiB2YWx1ZXMuIE93bmVkIGJ5IHRoZSBpbmxpbmUgZXhlY3V0aW9uIGxvb3AgZm9yIHRoaXMgaW52b2NhdGlvbi5cbiAgICovXG4gIHJlcGxheVBheWxvYWRDYWNoZTogUmVwbGF5UGF5bG9hZENhY2hlID0gbmV3IFJlcGxheVBheWxvYWRDYWNoZShcbiAgICBlbmNyeXB0aW9uS2V5XG4gICksXG4gIC8qKlxuICAgKiBUdXJibyBtb2RlIG9ubHk6IHJlc29sdmVzIG9uY2UgdGhlIGJhY2tncm91bmRlZCBgcnVuX3N0YXJ0ZWRgIGhhcyBsYW5kZWQuXG4gICAqIFRocmVhZGVkIGludG8gdGhlIGVuZC1vZi1ydW4gZHJhaW4gc28gZmlyZS1hbmQtZm9yZ2V0IGAqX2NyZWF0ZWRgIHdyaXRlc1xuICAgKiBjb21taXR0ZWQgYXQgd29ya2Zsb3cgY29tcGxldGlvbiBvcmRlciBhZnRlciB0aGUgcnVuJ3MgY3JlYXRpb24uIFVuZGVmaW5lZFxuICAgKiBvdXRzaWRlIHR1cmJvLCB3aGVyZSBgcnVuX3N0YXJ0ZWRgIGlzIGF3YWl0ZWQgdXAgZnJvbnQuXG4gICAqL1xuICBydW5SZWFkeUJhcnJpZXI/OiBQcm9taXNlPHVua25vd24+LFxuICAvKipcbiAgICogRmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBXb3JsZCBleGVjdXRpbmcgdGhpcyB3b3JrZmxvdy4gTWlzc2luZ1xuICAgKiBjYXBhYmlsaXRpZXMgYXJlIHRyZWF0ZWQgYXMgdW5zdXBwb3J0ZWQuXG4gICAqL1xuICB3b3JsZENhcGFiaWxpdGllcz86IFdvcmxkQ2FwYWJpbGl0aWVzXG4pOiBQcm9taXNlPFVpbnQ4QXJyYXkgfCB1bmtub3duPiB7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcGxheVdvcmtmbG93KHtcbiAgICB3b3JrZmxvd0NvZGUsXG4gICAgd29ya2Zsb3dSdW4sXG4gICAgZXZlbnRzLFxuICAgIGVuY3J5cHRpb25LZXksXG4gICAgcmVwbGF5UGF5bG9hZENhY2hlLFxuICAgIHJ1blJlYWR5QmFycmllcixcbiAgICB3b3JsZENhcGFiaWxpdGllcyxcbiAgfSk7XG4gIGlmIChyZXN1bHQudHlwZSA9PT0gJ3N1c3BlbmRlZCcpIHRocm93IHJlc3VsdC5zdXNwZW5zaW9uO1xuICByZXR1cm4gcmVzdWx0Lm91dHB1dDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlV29ya2Zsb3dTZXNzaW9uKG9wdGlvbnM6IFdvcmtmbG93U2Vzc2lvbk9wdGlvbnMpIHtcbiAgY29uc3Qgdm1UcmFjZSA9IGF3YWl0IHN0YXJ0VHJhY2VTcGFuKCd3b3JrZmxvdy52bS5jcmVhdGVfY29udGV4dCcpO1xuICByZXR1cm4gY3JlYXRlV29ya2Zsb3dTZXNzaW9uSW5uZXIob3B0aW9ucywgdm1UcmFjZS5lbmQpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgIHZtVHJhY2UuZmFpbChlcnJvcik7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVXb3JrZmxvd1Nlc3Npb25Jbm5lcihcbiAge1xuICAgIHdvcmtmbG93Q29kZSxcbiAgICB3b3JrZmxvd1J1bixcbiAgICBldmVudHMsXG4gICAgZW5jcnlwdGlvbktleSxcbiAgICByZXBsYXlQYXlsb2FkQ2FjaGUsXG4gICAgY29tcGlsZWRXb3JrZmxvd1NjcmlwdHMsXG4gICAgcnVuUmVhZHlCYXJyaWVyLFxuICAgIHdvcmxkQ2FwYWJpbGl0aWVzLFxuICB9OiBXb3JrZmxvd1Nlc3Npb25PcHRpb25zLFxuICBlbmRWbVRyYWNlOiAoKSA9PiB2b2lkXG4pOiBQcm9taXNlPHtcbiAgc2Vzc2lvbjogV29ya2Zsb3dTZXNzaW9uO1xuICBleGVjdXRpb246IFByb21pc2U8V29ya2Zsb3dSZXN1bHQ+O1xufT4ge1xuICBjb25zdCBzdGFydGVkQXQgPSB3b3JrZmxvd1J1bi5zdGFydGVkQXQ7XG4gIGlmICghc3RhcnRlZEF0KSB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKFxuICAgICAgYFdvcmtmbG93IHJ1biBcIiR7d29ya2Zsb3dSdW4ucnVuSWR9XCIgaGFzIG5vIFwic3RhcnRlZEF0XCIgdGltZXN0YW1wIChzaG91bGQgbm90IGhhcHBlbilgXG4gICAgKTtcbiAgfVxuXG4gIC8vIFNlZWQgYW5kIGluaXRpYWwgY2xvY2sgbXVzdCBiZSBhdmFpbGFibGUgYmVmb3JlIEkvTyBhbmQgcmVtYWluIHN0YWJsZSBvblxuICAvLyByZXBsYXkuIEFmdGVyIHRoZSBmaXJzdCBldmVudCwgRXZlbnRzQ29uc3VtZXIgYWR2YW5jZXMgdGhlIFZNIGNsb2NrIGZyb21cbiAgLy8gZWFjaCBldmVudCdzIGBjcmVhdGVkQXRgLlxuICBjb25zdCBmaXhlZFRpbWVzdGFtcCA9XG4gICAgcnVuSWRDcmVhdGVkQXQod29ya2Zsb3dSdW4ucnVuSWQpID8/ICt3b3JrZmxvd1J1bi5jcmVhdGVkQXQ7XG5cbiAgLy8gVHJ1dGhpbmVzcywgbm90IHByZXNlbmNlOiBgdmVyY2VsIGVudiBwdWxsYCB3cml0ZXMgYFZFUkNFTF9VUkw9XCJcImAgaW50b1xuICAvLyBgLmVudi5sb2NhbGAsIGFuZCBhIGZyYW1ld29yayB0aGF0IGxvYWRzIHRoYXQgZmlsZSBsb2NhbGx5IHdvdWxkIG90aGVyd2lzZVxuICAvLyBwdXQgdXMgb24gdGhlIFZlcmNlbCBicmFuY2ggd2l0aCBub3RoaW5nIHRvIGJ1aWxkIGEgaG9zdCBmcm9tLCBtYWtpbmdcbiAgLy8gYGh0dHBzOi8vYCB0aGUgYmFzZSBVUkwgb2YgZXZlcnkgcnVuLlxuICBjb25zdCBpc1ZlcmNlbCA9IEJvb2xlYW4ocHJvY2Vzcy5lbnYuVkVSQ0VMX1VSTCk7XG4gIC8vIExvYWQgZ2V0UG9ydCBsYXppbHkgdG8gcHJldmVudCBUdXJib3BhY2sgZnJvbSB0cmFjaW5nIGdldC1wb3J0J3NcbiAgLy8gZnMgb3BzIChyZWFkZGlyLCByZWFkRmlsZSkgaW50byB0aGUgZmxvdyByb3V0ZSBidW5kbGUuIFRoZSByZXNvbHZlZFxuICAvLyBwb3J0IGlzIGNhY2hlZCBwZXIgcHJvY2VzcyAoc2VlIGdldC1wb3J0LWxhenkudHMpLCBzbyB0aGlzIGlzIGNoZWFwXG4gIC8vIG9uIHJlcGxheXMgYWZ0ZXIgdGhlIGZpcnN0LlxuICBjb25zdCB3b3JrZmxvd0Jhc2VVcmwgPSBjcmVhdGVXb3JrZmxvd0Jhc2VVcmwoXG4gICAgaXNWZXJjZWxcbiAgICAgID8gYGh0dHBzOi8vJHtwcm9jZXNzLmVudi5WRVJDRUxfVVJMfWBcbiAgICAgIDogYGh0dHA6Ly9sb2NhbGhvc3Q6JHsoYXdhaXQgZ2V0UG9ydExhenkoKSkgPz8gMzAwMH1gXG4gICk7XG4gIC8vIEluY2x1ZGUgYm90aCBub2RlOnZtJ3MgY29udGV4dCBjcmVhdGlvbiBhbmQgdGhlIGhvc3Qtc2lkZSBzYW5kYm94IHdpcmluZ1xuICAvLyBiZWxvdy4gTW9zdCBvZiB0aGUgYm9vdHN0cmFwIGxpdmVzIGluIHRoaXMgZnVuY3Rpb24gKEV2ZW50c0NvbnN1bWVyLFxuICAvLyB3b3JrZmxvdyBnbG9iYWxzLCBXZWIgQVBJIHNoaW1zKSwgc28gdHJhY2luZyBjcmVhdGVDb250ZXh0KCkgYWxvbmUgd291bGRcbiAgLy8gbWF0ZXJpYWxseSB1bmRlci1yZXBvcnQgVk0gc3RhcnR1cC5cbiAgY29uc3Qge1xuICAgIGNvbnRleHQsXG4gICAgZ2xvYmFsVGhpczogdm1HbG9iYWxUaGlzLFxuICAgIHVwZGF0ZVRpbWVzdGFtcCxcbiAgfSA9IGNyZWF0ZUNvbnRleHQoe1xuICAgIHNlZWQ6IGAke3dvcmtmbG93UnVuLnJ1bklkfToke3dvcmtmbG93UnVuLndvcmtmbG93TmFtZX06JHt3b3JrZmxvd1J1bi5kZXBsb3ltZW50SWR9YCxcbiAgICBmaXhlZFRpbWVzdGFtcCxcbiAgfSk7XG5cbiAgY29uc3QgaW5pdGlhbEludGVycnVwdGlvbiA9IHdpdGhSZXNvbHZlcnM8bmV2ZXI+KCk7XG4gIGxldCBzdGF0ZTogV29ya2Zsb3dTZXNzaW9uU3RhdGUgPSB7XG4gICAgdHlwZTogJ3J1bm5pbmcnLFxuICAgIGludGVycnVwdGlvbjogaW5pdGlhbEludGVycnVwdGlvbixcbiAgfTtcblxuICBjb25zdCBvbldvcmtmbG93RXJyb3IgPSAoZXJyb3I6IEVycm9yKTogdm9pZCA9PiB7XG4gICAgc3dpdGNoIChzdGF0ZS50eXBlKSB7XG4gICAgICBjYXNlICdydW5uaW5nJzoge1xuICAgICAgICBjb25zdCB7IGludGVycnVwdGlvbiB9ID0gc3RhdGU7XG4gICAgICAgIHN0YXRlID0gV29ya2Zsb3dTdXNwZW5zaW9uLmlzKGVycm9yKVxuICAgICAgICAgID8geyB0eXBlOiAnc3VzcGVuZGVkJywgc3VzcGVuc2lvbjogZXJyb3IgfVxuICAgICAgICAgIDogeyB0eXBlOiAncmVwbGF5JyB9O1xuICAgICAgICAvLyBTdGVwLCBob29rLCB3YWl0LCBhbmQgYXR0cmlidXRlIGNvbnN1bWVycyBjYW4gc2NoZWR1bGUgdGhlIHNhbWVcbiAgICAgICAgLy8gc3VzcGVuc2lvbi4gVGhlIGZpcnN0IHNpZ25hbCBhZHZhbmNlcyB0aGUgZ2VuZXJhdGlvbiBzbyB0aGUgcmVzdFxuICAgICAgICAvLyBuby1vcC5cbiAgICAgICAgd29ya2Zsb3dDb250ZXh0LnN1c3BlbnNpb25HZW5lcmF0aW9uKys7XG4gICAgICAgIGludGVycnVwdGlvbi5yZWplY3QoZXJyb3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlICdzdXNwZW5kZWQnOlxuICAgICAgICAvLyBTYW1lLWJvdW5kYXJ5IGR1cGxpY2F0ZXMgd2VyZSBzdGFsZWQgYnkgdGhlIGdlbmVyYXRpb24gYnVtcCBhYm92ZSxcbiAgICAgICAgLy8gc28gYW55dGhpbmcgbGFuZGluZyBoZXJlIGlzIG91dC1vZi1iYW5kIG9yIGEgZGl2ZXJnZW5jZS4gRmFsbCBiYWNrXG4gICAgICAgIC8vIHRvIHJlcGxheSByYXRoZXIgdGhhbiByZXN1bWluZyBhIHBvdGVudGlhbGx5IGluY29uc2lzdGVudCBzZXNzaW9uLlxuICAgICAgICBzdGF0ZSA9IHsgdHlwZTogJ3JlcGxheScgfTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSAncmVwbGF5JzpcbiAgICAgIGNhc2UgJ2NvbXBsZXRlZCc6XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3RhdGUgc2F0aXNmaWVzIG5ldmVyO1xuICB9O1xuXG4gIGNvbnN0IHVsaWQgPSBtb25vdG9uaWNGYWN0b3J5KCgpID0+IHZtR2xvYmFsVGhpcy5NYXRoLnJhbmRvbSgpKTtcbiAgLy8gQ29ycmVsYXRpb24gSURzIG11c3QgYmUgcmVwbGF5LXN0YWJsZS4gYHN0YXJ0ZWRBdGAgZGlmZmVycyBiZXR3ZWVuIGEgdHVyYm9cbiAgLy8gZGVsaXZlcnkgYW5kIGEgbGF0ZXIgc2VydmVyLWJhY2tlZCByZXBsYXksIHNvIHVzZSBmaXhlZFRpbWVzdGFtcC5cbiAgLy8gVGhlIGRyYXcgY291bnRlciBpcyB0aGUgcHJvZ3Jlc3MgbWV0cmljIGZvciBgcXVpZXNjZUVhcmxpZXJDYXNjYWRlc2BcbiAgLy8gKFdPUktGTE9XX0xPR19PUkRFUl9EUkFXUyk6IGEgcXVpZXQgdHVybiBpcyBvbmUgdGhhdCBkcmV3IG5vdGhpbmcuIEl0XG4gIC8vIGNvdW50cyBFVkVSWSBkcmF3IGZyb20gdGhpcyBzZXF1ZW5jZS4gVGhpcyBzYW1lIGZ1bmN0aW9uIGlzIGluc3RhbGxlZCBhc1xuICAvLyB0aGUgYFNUQUJMRV9VTElEYCBnbG9iYWwgYmVsb3csIHdoaWNoIHNlcmlhbGl6YXRpb24gZHJhd3Mgc3RyZWFtIGlkc1xuICAvLyBmcm9tIGR1cmluZyBkZWh5ZHJhdGlvbi4gVGhpcyBpcyBkZWxpYmVyYXRlIGJlY2F1c2UgcXVpZXNjZW5jZSBtdXN0IGFsc29cbiAgLy8gd2FpdCBvdXQgc2VyaWFsaXphdGlvbi1kcml2ZW4gZHJhd3MsIGFuZCBjb3VudGluZyBleHRyYSBkcmF3cyBvbmx5IGV4dGVuZHNcbiAgLy8gdGhlIHdhaXQgKHNlZSB0aGUgdGVybWluYXRpb24gbm90ZSBvbiBgcXVpZXNjZUVhcmxpZXJDYXNjYWRlc2ApLlxuICBsZXQgbWludENvdW50ID0gMDtcbiAgY29uc3QgZ2VuZXJhdGVVbGlkID0gKCkgPT4ge1xuICAgIG1pbnRDb3VudCArPSAxO1xuICAgIHJldHVybiB1bGlkKGZpeGVkVGltZXN0YW1wKTtcbiAgfTtcbiAgY29uc3QgZ2VuZXJhdGVOYW5vaWQgPSBuYW5vaWQuY3VzdG9tUmFuZG9tKG5hbm9pZC51cmxBbHBoYWJldCwgMjEsIChzaXplKSA9PlxuICAgIG5ldyBVaW50OEFycmF5KHNpemUpLm1hcCgoKSA9PiAyNTYgKiB2bUdsb2JhbFRoaXMuTWF0aC5yYW5kb20oKSlcbiAgKTtcblxuICAvLyBDcmVhdGUgYSBtdXRhYmxlIGhvbGRlciBmb3IgdGhlIHByb21pc2UgcXVldWUgc28gdGhlIEV2ZW50c0NvbnN1bWVyXG4gIC8vIGNhbiBhY2Nlc3MgdGhlIGN1cnJlbnQgcXVldWUgc3RhdGUgdmlhIGEgZ2V0dGVyLiBUaGUgcXVldWUgaXMgbXV0YXRlZFxuICAvLyBieSBzdGVwL2hvb2svc2xlZXAgY2FsbGJhY2tzIGFzIGV2ZW50cyBhcmUgcHJvY2Vzc2VkLlxuICBjb25zdCBwcm9taXNlUXVldWVIb2xkZXIgPSB7IGN1cnJlbnQ6IFByb21pc2UucmVzb2x2ZSgpIH07XG5cbiAgLy8gU2FtZSByZWFzb24gYXMgdGhlIHF1ZXVlIGhvbGRlcjogdGhlIGNvbnN1bWVyIGlzIGJ1aWx0IGJlZm9yZSB0aGUgY29udGV4dFxuICAvLyB3aG9zZSBkZWxpdmVyeSBzdGF0ZSBpdCBoYXMgdG8gcmVhZC4gSWRsZSB1bnRpbCB0aGUgY29udGV4dCBleGlzdHMsIHdoaWNoXG4gIC8vIGlzIGJlZm9yZSBhbnkgZGVsaXZlcnkgY2FuIGJlIHJlZ2lzdGVyZWQgYWdhaW5zdCBpdC5cbiAgY29uc3QgZGVsaXZlcnlJZGxlSG9sZGVyID0geyBjdXJyZW50OiAoKTogYm9vbGVhbiA9PiB0cnVlIH07XG5cbiAgLy8gVGhlIFZNIGNsb2NrIG9ubHkgZXZlciBtb3ZlcyBmb3J3YXJkLiBDb25zdW1wdGlvbiBvcmRlciBpcyBsb2cgb3JkZXIgZm9yXG4gIC8vIGV2ZXJ5dGhpbmcgd2hvc2Ugb3JkZXIgdGhlIHJlcGxheSBkZWNpZGVzLCBidXQgYW4gZXZlbnQgdGhlIGNvbnN1bWVyXG4gIC8vIHBhcmtlZCBpcyBkZWxpdmVyZWQgYWZ0ZXIgdGhlIHdhbGsgaGFzIGFscmVhZHkgcGFzc2VkIGV2ZW50cyB3cml0dGVuIGFmdGVyXG4gIC8vIGl0LCBhbmQgbGV0dGluZyBpdHMgYGNyZWF0ZWRBdGAgc2V0IHRoZSBjbG9jayB3b3VsZCBtYWtlIGBEYXRlLm5vdygpYCBnb1xuICAvLyBiYWNrd2FyZHMgaW5zaWRlIGEgc2luZ2xlIHJlcGxheS5cbiAgbGV0IGNsb2NrID0gZml4ZWRUaW1lc3RhbXA7XG5cbiAgY29uc3QgZXZlbnRzQ29uc3VtZXIgPSBuZXcgRXZlbnRzQ29uc3VtZXIoZXZlbnRzLCB7XG4gICAgb25Db25zdW1lZEV2ZW50OiAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGF0ID0gK2V2ZW50LmNyZWF0ZWRBdDtcbiAgICAgIGlmIChhdCA+IGNsb2NrKSB7XG4gICAgICAgIGNsb2NrID0gYXQ7XG4gICAgICAgIHVwZGF0ZVRpbWVzdGFtcChhdCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBvblVuY29uc3VtZWRFdmVudDogKGV2ZW50KSA9PiB7XG4gICAgICBvbldvcmtmbG93RXJyb3IoXG4gICAgICAgIG5ldyBSZXBsYXlEaXZlcmdlbmNlRXJyb3IoXG4gICAgICAgICAgYFJlcGxheSBjb3VsZCBub3QgY29uc3VtZSBldmVudDogZXZlbnRUeXBlPSR7ZXZlbnQuZXZlbnRUeXBlfSwgY29ycmVsYXRpb25JZD0ke2V2ZW50LmNvcnJlbGF0aW9uSWR9LCBldmVudElkPSR7ZXZlbnQuZXZlbnRJZH0uYCxcbiAgICAgICAgICB7IGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sXG4gICAgLy8gQm90aCBicmFuY2hlcyBsb2cgYXQgYGRlYnVnYCwgc28gbmVpdGhlciByZWFjaGVzIHRoZSBjb25zb2xlIHVubGVzc1xuICAgIC8vIGBERUJVR2AgbWF0Y2hlcy4gQSBkdXBsaWNhdGUgaXMgYSBwZXJtYW5lbnQgZmVhdHVyZSBvZiB0aGUgbG9nOiBldmVyeVxuICAgIC8vIGxhdGVyIHJlcGxheSByZS1yZWFkcyBpdCBhbmQgbGFuZHMgaGVyZSBhZ2Fpbiwgc28gYW55dGhpbmcgdGhlIGxvZ2dlclxuICAgIC8vIHByaW50cyB1bmNvbmRpdGlvbmFsbHkgd291bGQgcHJpbnQgb25jZSBwZXIgcmVwbGF5IGZvciB0aGUgbGlmZSBvZiB0aGVcbiAgICAvLyBydW4uIFRoZXJlIGlzIGFsc28gbm90aGluZyB0byBhY3Qgb24uIElnbm9yaW5nIHRoZSBldmVudCBpcyB0aGUgY29ycmVjdFxuICAgIC8vIG91dGNvbWUsIG5vdCBhIGRlZ3JhZGVkIG9uZSwgYW5kIG5vIHVzZXIgY2hhbmdlIG1ha2VzIHRoZSBzdHJhZ2dsZXIgZ29cbiAgICAvLyBhd2F5LiBXaGF0IHRoZSBsZXZlbHMgYXJlIGZvciBpcyBkaWFnbm9zaXMgYWZ0ZXIgdGhlIGZhY3QsIHdoaWNoIGlzXG4gICAgLy8gZXhhY3RseSB3aGF0IGBERUJVRz13b3JrZmxvdzpydW50aW1lOmRlYnVnYCBpcyBmb3IuXG4gICAgb25EdXBsaWNhdGVFdmVudDogKGV2ZW50LCBmaXJzdEV2ZW50VHlwZSkgPT4ge1xuICAgICAgY29uc3QgZGV0YWlscyA9IHtcbiAgICAgICAgd29ya2Zsb3dSdW5JZDogd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgICAgIGV2ZW50SWQ6IGV2ZW50LmV2ZW50SWQsXG4gICAgICAgIGV2ZW50VHlwZTogZXZlbnQuZXZlbnRUeXBlLFxuICAgICAgICBmaXJzdEV2ZW50VHlwZSxcbiAgICAgICAgY29ycmVsYXRpb25JZDogZXZlbnQuY29ycmVsYXRpb25JZCxcbiAgICAgIH07XG4gICAgICBpZiAoZmlyc3RFdmVudFR5cGUgIT09IGV2ZW50LmV2ZW50VHlwZSkge1xuICAgICAgICAvLyBUd28gd3JpdGVycyByZWFjaGVkIG9wcG9zaXRlIGNvbmNsdXNpb25zIGFib3V0IG9uZSBlbnRpdHk6IGFcbiAgICAgICAgLy8gYHN0ZXBfZmFpbGVkYCBiZWhpbmQgYSBgc3RlcF9jb21wbGV0ZWRgLCBvciB0aGUgcmV2ZXJzZS4gSWdub3JpbmcgaXRcbiAgICAgICAgLy8gaXMgc3RpbGwgY29ycmVjdCBhbmQgc3RpbGwgZGV0ZXJtaW5pc3RpYyAocmVwbGF5IHJlYWRzIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgLy8gYXQgdGhlIHNhbWUgcG9zaXRpb24gZXZlcnkgdGltZSksIGJ1dCB1bmxpa2UgYSByZS1jb21taXQgb2YgdGhlIHNhbWVcbiAgICAgICAgLy8gb3V0Y29tZSB0aGVyZSBpcyBubyByZWFkaW5nIG9mIHRoaXMgd2hlcmUgYm90aCB3cml0ZXJzIHdlcmUgcmlnaHQsXG4gICAgICAgIC8vIHNvIHRoZSBkaXNjYXJkZWQgb3V0Y29tZSBnZXRzIGl0cyBvd24gbWVzc2FnZS5cbiAgICAgICAgcnVudGltZUxvZ2dlci5kZWJ1ZyhcbiAgICAgICAgICAnSWdub3JpbmcgaW5lcnQgZXZlbnQgdGhhdCBkZWNpZGVzIGFuIGFscmVhZHktZGVjaWRlZCBvdXRjb21lIGRpZmZlcmVudGx5JyxcbiAgICAgICAgICBkZXRhaWxzXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFRoZSBmaXJzdCBldmVudCBvZiB0aGlzIGNsYXNzIGRlY2lkZWQgdGhlIG91dGNvbWUgYXQgYSBsb3dlciBsb2dcbiAgICAgIC8vIHBvc2l0aW9uIGFuZCByZXBsYXkgcmVhZHMgdGhhdCBvbmUuIFJlY29yZGVkIGJlY2F1c2UgYSBzdHJhZ2dsZXIgaXNcbiAgICAgIC8vIHN0aWxsIGV2aWRlbmNlIG9mIHR3byByZXBsYXlzIHdyaXRpbmcgZm9yIHRoZSBzYW1lIGVudGl0eSwgd2hpY2ggaXNcbiAgICAgIC8vIHdvcnRoIHNlZWluZyB3aGVuIGRpYWdub3NpbmcgYSBydW4uXG4gICAgICBydW50aW1lTG9nZ2VyLmRlYnVnKFxuICAgICAgICAnSWdub3JpbmcgaW5lcnQgZXZlbnQgdGhhdCByZXBlYXRzIGEgY2xhc3MgYWxyZWFkeSBpbiB0aGUgZXZlbnQgbG9nJyxcbiAgICAgICAgZGV0YWlsc1xuICAgICAgKTtcbiAgICB9LFxuICAgIGdldFByb21pc2VRdWV1ZTogKCkgPT4gcHJvbWlzZVF1ZXVlSG9sZGVyLmN1cnJlbnQsXG4gICAgaXNEZWxpdmVyeUlkbGU6ICgpID0+IGRlbGl2ZXJ5SWRsZUhvbGRlci5jdXJyZW50KCksXG4gIH0pO1xuXG4gIGNvbnN0IHdvcmtmbG93Q29udGV4dDogV29ya2Zsb3dPcmNoZXN0cmF0b3JDb250ZXh0ID0ge1xuICAgIHJ1bklkOiB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICBlbmNyeXB0aW9uS2V5LFxuICAgIHdvcmxkQ2FwYWJpbGl0aWVzLFxuICAgIGdsb2JhbFRoaXM6IHZtR2xvYmFsVGhpcyxcbiAgICBvbldvcmtmbG93RXJyb3IsXG4gICAgZXZlbnRzQ29uc3VtZXIsXG4gICAgZ2VuZXJhdGVVbGlkLFxuICAgIGdlbmVyYXRlTmFub2lkLFxuICAgIGdldCBtaW50Q291bnQoKSB7XG4gICAgICByZXR1cm4gbWludENvdW50O1xuICAgIH0sXG4gICAgaW52b2NhdGlvbnNRdWV1ZTogbmV3IE1hcCgpLFxuICAgIC8vIFVzZSBnZXR0ZXIvc2V0dGVyIHNvIHRoZSBFdmVudHNDb25zdW1lcidzIGdldFByb21pc2VRdWV1ZSgpIGFsd2F5c1xuICAgIC8vIHNlZXMgdGhlIGxhdGVzdCBxdWV1ZSBzdGF0ZSBhcyBpdCdzIG11dGF0ZWQgYnkgc3RlcC9ob29rL3NsZWVwIGNhbGxiYWNrcy5cbiAgICBnZXQgcHJvbWlzZVF1ZXVlKCkge1xuICAgICAgcmV0dXJuIHByb21pc2VRdWV1ZUhvbGRlci5jdXJyZW50O1xuICAgIH0sXG4gICAgc2V0IHByb21pc2VRdWV1ZSh2YWx1ZTogUHJvbWlzZTx2b2lkPikge1xuICAgICAgcHJvbWlzZVF1ZXVlSG9sZGVyLmN1cnJlbnQgPSB2YWx1ZTtcbiAgICB9LFxuICAgIHBlbmRpbmdEZWxpdmVyaWVzOiAwLFxuICAgIHN1c3BlbnNpb25HZW5lcmF0aW9uOiAwLFxuICAgIHBlbmRpbmdEZWxpdmVyeUJhcnJpZXJzOiBuZXcgTWFwKCksXG4gICAgcmVwbGF5UGF5bG9hZENhY2hlLFxuICB9O1xuXG4gIGRlbGl2ZXJ5SWRsZUhvbGRlci5jdXJyZW50ID0gKCkgPT4gaXNEZWxpdmVyeUlkbGUod29ya2Zsb3dDb250ZXh0KTtcblxuICAvLyBDb25zdW1lIHJ1biBsaWZlY3ljbGUgZXZlbnRzIC0gdGhlc2UgYXJlIHN0cnVjdHVyYWwgZXZlbnRzIHRoYXQgZG9uJ3RcbiAgLy8gbmVlZCBzcGVjaWFsIGhhbmRsaW5nIGluIHRoZSB3b3JrZmxvdywgYnV0IG11c3QgYmUgY29uc3VtZWQgdG8gYWR2YW5jZVxuICAvLyBwYXN0IHRoZW0gaW4gdGhlIGV2ZW50IGxvZ1xuICBsZXQgY29uc3VtZWRSdW5TdGFydGVkID0gZmFsc2U7XG4gIHdvcmtmbG93Q29udGV4dC5ldmVudHNDb25zdW1lci5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgaWYgKCFldmVudCkge1xuICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgfVxuXG4gICAgLy8gQ29uc3VtZSBydW5fY3JlYXRlZCAtIGV2ZXJ5IHJ1biBoYXMgZXhhY3RseSBvbmVcbiAgICBpZiAoZXZlbnQuZXZlbnRUeXBlID09PSAncnVuX2NyZWF0ZWQnKSB7XG4gICAgICByZXR1cm4gRXZlbnRDb25zdW1lclJlc3VsdC5Db25zdW1lZDtcbiAgICB9XG5cbiAgICAvLyBDb25zdW1lIHRoZSBmaXJzdCBydW5fc3RhcnRlZC4gVHdvIHJlcGxheXMgY2FuIGVhY2ggd3JpdGUgb25lICh0aGVcbiAgICAvLyBjcmVhdGUgaXMgaWRlbXBvdGVudCBmb3IgYSBydW4gYWxyZWFkeSBydW5uaW5nLCB3aGljaCBtYWtlcyB0aGUgd3JpdGVcbiAgICAvLyBzYWZlLCBub3Qgc2luZ2xlLXNob3QpOyB0aGUgZmlyc3QgaXMgdGhlIG9uZSB0aGUgcmVwbGF5IG9ic2VydmVzLCBhbmRcbiAgICAvLyB0aGUgY29uc3VtZXIgc2tpcHMgdGhlIHJlc3QgcmF0aGVyIHRoYW4gYWR2YW5jaW5nIHRoZSB3b3JrZmxvdyBjbG9ja1xuICAgIC8vIHR3aWNlLlxuICAgIGlmIChldmVudC5ldmVudFR5cGUgPT09ICdydW5fc3RhcnRlZCcpIHtcbiAgICAgIGlmIChjb25zdW1lZFJ1blN0YXJ0ZWQpIHtcbiAgICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gICAgICB9XG4gICAgICBjb25zdW1lZFJ1blN0YXJ0ZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgfVxuXG4gICAgLy8gQXR0cmlidXRlIHdyaXRlcyBwZXJmb3JtZWQgZnJvbSBhIHN0ZXAgaGF2ZSBubyB3b3JrZmxvdy1ib2R5IGNhbGwgdG9cbiAgICAvLyBjb25zdW1lIHRoZW0gZHVyaW5nIHJlcGxheTsgdGhleSBhcmUgYWxyZWFkeSByZWZsZWN0ZWQgaW4gdGhlIHJ1blxuICAgIC8vIHNuYXBzaG90IGFuZCByZW1haW4gc3RydWN0dXJhbCB1bnRpbCBhIHJlYWQgQVBJIGlzIGludHJvZHVjZWQuXG4gICAgaWYgKFxuICAgICAgZXZlbnQuZXZlbnRUeXBlID09PSAnYXR0cl9zZXQnICYmXG4gICAgICBldmVudC5ldmVudERhdGEud3JpdGVyLnR5cGUgPT09ICdzdGVwJ1xuICAgICkge1xuICAgICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuQ29uc3VtZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIEV2ZW50Q29uc3VtZXJSZXN1bHQuTm90Q29uc3VtZWQ7XG4gIH0pO1xuXG4gIGNvbnN0IHVzZVN0ZXAgPSBjcmVhdGVVc2VTdGVwKHdvcmtmbG93Q29udGV4dCk7XG4gIGNvbnN0IGNyZWF0ZUhvb2sgPSBjcmVhdGVDcmVhdGVIb29rKHdvcmtmbG93Q29udGV4dCk7XG4gIGNvbnN0IHNsZWVwID0gY3JlYXRlU2xlZXAod29ya2Zsb3dDb250ZXh0KTtcbiAgY29uc3Qgc2V0QXR0cmlidXRlcyA9IGNyZWF0ZVNldEF0dHJpYnV0ZXMod29ya2Zsb3dDb250ZXh0KTtcblxuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgdm1HbG9iYWxUaGlzW1dPUktGTE9XX1VTRV9TVEVQXSA9IHVzZVN0ZXA7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICB2bUdsb2JhbFRoaXNbV09SS0ZMT1dfU0VUX0FUVFJJQlVURVNdID0gc2V0QXR0cmlidXRlcztcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gIHZtR2xvYmFsVGhpc1tXT1JLRkxPV19DUkVBVEVfSE9PS10gPSBjcmVhdGVIb29rO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgdm1HbG9iYWxUaGlzW1dPUktGTE9XX1NMRUVQXSA9IHNsZWVwO1xuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgdm1HbG9iYWxUaGlzW1dPUktGTE9XX0dFVF9TVFJFQU1fSURdID0gKG5hbWVzcGFjZT86IHN0cmluZykgPT5cbiAgICBnZXRXb3JrZmxvd1J1blN0cmVhbUlkKHdvcmtmbG93UnVuLnJ1bklkLCBuYW1lc3BhY2UpO1xuXG4gIC8vIEZvciB0aGUgd29ya2Zsb3cgVk0sIHdlIHN0b3JlIHRoZSBjb250ZXh0IGluIGEgc3ltYm9sIG9uIHRoZSBgZ2xvYmFsVGhpc2Agb2JqZWN0XG4gIGNvbnN0IGN0eDogV29ya2Zsb3dNZXRhZGF0YSA9IHtcbiAgICB3b3JrZmxvd05hbWU6IHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSxcbiAgICB3b3JrZmxvd1J1bklkOiB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICB3b3JrZmxvd1N0YXJ0ZWRBdDogbmV3IHZtR2xvYmFsVGhpcy5EYXRlKCtzdGFydGVkQXQpLFxuICAgIHVybDogd29ya2Zsb3dCYXNlVXJsLFxuICAgIGZlYXR1cmVzOiB7IGVuY3J5cHRpb246ICEhZW5jcnlwdGlvbktleSB9LFxuICB9O1xuXG4gIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBgQHR5cGVzL25vZGVgIHNheXMgc3ltYm9sIGlzIG5vdCB2YWxpZCwgYnV0IGl0IGRvZXMgd29ya1xuICB2bUdsb2JhbFRoaXNbV09SS0ZMT1dfQ09OVEVYVF9TWU1CT0xdID0gY3R4O1xuICAvLyBTZXJpYWxpemF0aW9uIG1pbnRzIHN0cmVhbSBpZHMgdGhyb3VnaCB0aGlzIHN5bWJvbCwgYW5kIGNhbGxzIGl0IHdpdGggbm9cbiAgLy8gc2VlZCB0aW1lLiBgbW9ub3RvbmljRmFjdG9yeWAgcmV0dXJucyBgZW5jb2RlVGltZShsYXN0VGltZSlgIG9uIGl0c1xuICAvLyBpbmNyZW1lbnQgYnJhbmNoLCBzbyBvbmUgc3VjaCBjYWxsIGxhdGNoZXMgdGhlICpob3N0KiB3YWxsIGNsb2NrIGludG9cbiAgLy8gYGxhc3RUaW1lYCwgYW5kIGV2ZXJ5IGlkIHRoZSBydW4gbWludHMgYWZ0ZXJ3YXJkcyBjYXJyaWVzIHRoYXQgdGltZXN0YW1wXG4gIC8vIGluc3RlYWQgb2YgYGZpeGVkVGltZXN0YW1wYCwgYSB2YWx1ZSB0aGF0IGRpZmZlcnMgb24gZXZlcnkgcmVwbGF5LiBCaW5kaW5nXG4gIC8vIHRoZSBzZWVkIHRpbWUgaGVyZSBrZWVwcyB0aGUgd2hvbGUgcnVuIG9uIG9uZSByZXBsYXktc3RhYmxlIGNsb2NrLlxuICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gYEB0eXBlcy9ub2RlYCBzYXlzIHN5bWJvbCBpcyBub3QgdmFsaWQsIGJ1dCBpdCBkb2VzIHdvcmtcbiAgdm1HbG9iYWxUaGlzW1NUQUJMRV9VTElEXSA9IGdlbmVyYXRlVWxpZDtcblxuICAvLyBXb3JrZmxvdyBjb2RlIG11c3QgaW1wb3J0IHRoZSBkZXRlcm1pbmlzdGljIGBmZXRjaGAgc3RlcCBmcm9tIGB3b3JrZmxvd2AuXG4gIHZtR2xvYmFsVGhpcy5mZXRjaCA9ICgpID0+IHtcbiAgICB0aHJvdyBuZXcgdm1HbG9iYWxUaGlzLkVycm9yKFxuICAgICAgYEdsb2JhbCBcImZldGNoXCIgaXMgdW5hdmFpbGFibGUgaW4gd29ya2Zsb3cgZnVuY3Rpb25zLiBVc2UgdGhlIFwiZmV0Y2hcIiBzdGVwIGZ1bmN0aW9uIGZyb20gXCJ3b3JrZmxvd1wiIHRvIG1ha2UgSFRUUCByZXF1ZXN0cy5cXG5cXG5MZWFybiBtb3JlOiBodHRwczovL3dvcmtmbG93LXNkay5kZXYvZXJyLyR7RVJST1JfU0xVR1MuRkVUQ0hfSU5fV09SS0ZMT1dfRlVOQ1RJT059YFxuICAgICk7XG4gIH07XG5cbiAgLy8gT3ZlcnJpZGUgdGltZW91dC9pbnRlcnZhbCBmdW5jdGlvbnMgdG8gdGhyb3cgaGVscGZ1bCBlcnJvcnNcbiAgLy8gVGhlc2UgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gd29ya2Zsb3cgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSByZWx5IG9uXG4gIC8vIGFzeW5jaHJvbm91cyBzY2hlZHVsaW5nIHdoaWNoIGJyZWFrcyBkZXRlcm1pbmlzdGljIHJlcGxheVxuICBjb25zdCB0aW1lb3V0RXJyb3JNZXNzYWdlID1cbiAgICAnVGltZW91dCBmdW5jdGlvbnMgbGlrZSBcInNldFRpbWVvdXRcIiBhbmQgXCJzZXRJbnRlcnZhbFwiIGFyZSBub3Qgc3VwcG9ydGVkIGluIHdvcmtmbG93IGZ1bmN0aW9ucy4gVXNlIHRoZSBcInNsZWVwXCIgZnVuY3Rpb24gZnJvbSBcIndvcmtmbG93XCIgZm9yIHRpbWUtYmFzZWQgZGVsYXlzLic7XG5cbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLnNldFRpbWVvdXQgPSAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKHRpbWVvdXRFcnJvck1lc3NhZ2UsIHtcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLlRJTUVPVVRfRlVOQ1RJT05TX0lOX1dPUktGTE9XLFxuICAgIH0pO1xuICB9O1xuICAodm1HbG9iYWxUaGlzIGFzIGFueSkuc2V0SW50ZXJ2YWwgPSAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKHRpbWVvdXRFcnJvck1lc3NhZ2UsIHtcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLlRJTUVPVVRfRlVOQ1RJT05TX0lOX1dPUktGTE9XLFxuICAgIH0pO1xuICB9O1xuICAodm1HbG9iYWxUaGlzIGFzIGFueSkuY2xlYXJUaW1lb3V0ID0gKCkgPT4ge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICB9KTtcbiAgfTtcbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLmNsZWFySW50ZXJ2YWwgPSAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93UnVudGltZUVycm9yKHRpbWVvdXRFcnJvck1lc3NhZ2UsIHtcbiAgICAgIHNsdWc6IEVSUk9SX1NMVUdTLlRJTUVPVVRfRlVOQ1RJT05TX0lOX1dPUktGTE9XLFxuICAgIH0pO1xuICB9O1xuICAodm1HbG9iYWxUaGlzIGFzIGFueSkuc2V0SW1tZWRpYXRlID0gKCkgPT4ge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICB9KTtcbiAgfTtcbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLmNsZWFySW1tZWRpYXRlID0gKCkgPT4ge1xuICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcih0aW1lb3V0RXJyb3JNZXNzYWdlLCB7XG4gICAgICBzbHVnOiBFUlJPUl9TTFVHUy5USU1FT1VUX0ZVTkNUSU9OU19JTl9XT1JLRkxPVyxcbiAgICB9KTtcbiAgfTtcblxuICAvLyBgQWJvcnRDb250cm9sbGVyYCBhbmQgYEFib3J0U2lnbmFsYCBpbiB0aGUgd29ya2Zsb3cgVk0gYXJlIGhvb2stYmFja2VkXG4gIC8vIGZvciBkZXRlcm1pbmlzdGljIHJlcGxheS4gVGhlIGNvbnRyb2xsZXIncyBhYm9ydCgpIHF1ZXVlcyBhIGhvb2sgcmVzdW1wdGlvbixcbiAgLy8gYW5kIHNpZ25hbC5hYm9ydGVkIGlzIHVwZGF0ZWQgd2hlbiB0aGUgaG9vayBldmVudCBpcyBwcm9jZXNzZWQgZHVyaW5nIHJlcGxheS5cbiAgKHZtR2xvYmFsVGhpcyBhcyBhbnkpLkFib3J0Q29udHJvbGxlciA9XG4gICAgY3JlYXRlQ3JlYXRlQWJvcnRDb250cm9sbGVyKHdvcmtmbG93Q29udGV4dCk7XG4gIGNvbnN0IGFib3J0U2lnbmFsU3RhdGljcyA9IGNyZWF0ZUFib3J0U2lnbmFsU3RhdGljcygpO1xuICAodm1HbG9iYWxUaGlzIGFzIGFueSkuQWJvcnRTaWduYWwgPSB7XG4gICAgYWJvcnQ6IGFib3J0U2lnbmFsU3RhdGljcy5hYm9ydCxcbiAgICBhbnk6IGFib3J0U2lnbmFsU3RhdGljcy5hbnksXG4gICAgdGltZW91dDogYWJvcnRTaWduYWxTdGF0aWNzLnRpbWVvdXQsXG4gIH07XG5cbiAgLy8gYFJlcXVlc3RgIGFuZCBgUmVzcG9uc2VgIGFyZSBzcGVjaWFsIGJ1aWx0LWluIGNsYXNzZXMgdGhhdCBpbnZva2Ugc3RlcHNcbiAgLy8gZm9yIHRoZSBganNvbigpYCwgYHRleHQoKWAgYW5kIGBhcnJheUJ1ZmZlcigpYCBpbnN0YW5jZSBtZXRob2RzXG4gIGNsYXNzIFJlcXVlc3QgaW1wbGVtZW50cyBnbG9iYWxUaGlzLlJlcXVlc3Qge1xuICAgIGNhY2hlITogZ2xvYmFsVGhpcy5SZXF1ZXN0WydjYWNoZSddO1xuICAgIGNyZWRlbnRpYWxzITogZ2xvYmFsVGhpcy5SZXF1ZXN0WydjcmVkZW50aWFscyddO1xuICAgIGRlc3RpbmF0aW9uITogZ2xvYmFsVGhpcy5SZXF1ZXN0WydkZXN0aW5hdGlvbiddO1xuICAgIGhlYWRlcnMhOiBIZWFkZXJzO1xuICAgIGludGVncml0eSE6IHN0cmluZztcbiAgICBtZXRob2QhOiBzdHJpbmc7XG4gICAgbW9kZSE6IGdsb2JhbFRoaXMuUmVxdWVzdFsnbW9kZSddO1xuICAgIHJlZGlyZWN0ITogZ2xvYmFsVGhpcy5SZXF1ZXN0WydyZWRpcmVjdCddO1xuICAgIHJlZmVycmVyITogc3RyaW5nO1xuICAgIHJlZmVycmVyUG9saWN5ITogZ2xvYmFsVGhpcy5SZXF1ZXN0WydyZWZlcnJlclBvbGljeSddO1xuICAgIHVybCE6IHN0cmluZztcbiAgICBrZWVwYWxpdmUhOiBib29sZWFuO1xuICAgIHNpZ25hbCE6IEFib3J0U2lnbmFsO1xuICAgIGR1cGxleCE6ICdoYWxmJztcbiAgICBib2R5ITogUmVhZGFibGVTdHJlYW08YW55PiB8IG51bGw7XG5cbiAgICBjb25zdHJ1Y3RvcihpbnB1dDogYW55LCBpbml0PzogUmVxdWVzdEluaXQpIHtcbiAgICAgIC8vIEhhbmRsZSBVUkwgaW5wdXRcbiAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnIHx8IGlucHV0IGluc3RhbmNlb2Ygdm1HbG9iYWxUaGlzLlVSTCkge1xuICAgICAgICBjb25zdCB1cmxTdHJpbmcgPSBTdHJpbmcoaW5wdXQpO1xuICAgICAgICAvLyBWYWxpZGF0ZSBVUkwgZm9ybWF0XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbmV3IHZtR2xvYmFsVGhpcy5VUkwodXJsU3RyaW5nKTtcbiAgICAgICAgICB0aGlzLnVybCA9IHVybFN0cmluZztcbiAgICAgICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBGYWlsZWQgdG8gcGFyc2UgVVJMIGZyb20gJHt1cmxTdHJpbmd9YCwge1xuICAgICAgICAgICAgY2F1c2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElucHV0IGlzIGEgUmVxdWVzdCBvYmplY3QgLSBjbG9uZSBpdHMgcHJvcGVydGllc1xuICAgICAgICB0aGlzLnVybCA9IGlucHV0LnVybDtcbiAgICAgICAgaWYgKCFpbml0KSB7XG4gICAgICAgICAgdGhpcy5tZXRob2QgPSBpbnB1dC5tZXRob2Q7XG4gICAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IHZtR2xvYmFsVGhpcy5IZWFkZXJzKGlucHV0LmhlYWRlcnMpO1xuICAgICAgICAgIHRoaXMuYm9keSA9IGlucHV0LmJvZHk7XG4gICAgICAgICAgdGhpcy5tb2RlID0gaW5wdXQubW9kZTtcbiAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gaW5wdXQuY3JlZGVudGlhbHM7XG4gICAgICAgICAgdGhpcy5jYWNoZSA9IGlucHV0LmNhY2hlO1xuICAgICAgICAgIHRoaXMucmVkaXJlY3QgPSBpbnB1dC5yZWRpcmVjdDtcbiAgICAgICAgICB0aGlzLnJlZmVycmVyID0gaW5wdXQucmVmZXJyZXI7XG4gICAgICAgICAgdGhpcy5yZWZlcnJlclBvbGljeSA9IGlucHV0LnJlZmVycmVyUG9saWN5O1xuICAgICAgICAgIHRoaXMuaW50ZWdyaXR5ID0gaW5wdXQuaW50ZWdyaXR5O1xuICAgICAgICAgIHRoaXMua2VlcGFsaXZlID0gaW5wdXQua2VlcGFsaXZlO1xuICAgICAgICAgIHRoaXMuc2lnbmFsID0gaW5wdXQuc2lnbmFsO1xuICAgICAgICAgIHRoaXMuZHVwbGV4ID0gaW5wdXQuZHVwbGV4O1xuICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBpbnB1dC5kZXN0aW5hdGlvbjtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgaW5pdCBpcyBwcm92aWRlZCwgbWVyZ2U6IHVzZSBzb3VyY2UgcHJvcGVydGllcywgdGhlbiBvdmVycmlkZSB3aXRoIGluaXRcbiAgICAgICAgLy8gQ29weSBhbGwgcHJvcGVydGllcyBmcm9tIHRoZSBzb3VyY2UgUmVxdWVzdCBmaXJzdFxuICAgICAgICB0aGlzLm1ldGhvZCA9IGlucHV0Lm1ldGhvZDtcbiAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IHZtR2xvYmFsVGhpcy5IZWFkZXJzKGlucHV0LmhlYWRlcnMpO1xuICAgICAgICB0aGlzLmJvZHkgPSBpbnB1dC5ib2R5O1xuICAgICAgICB0aGlzLm1vZGUgPSBpbnB1dC5tb2RlO1xuICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gaW5wdXQuY3JlZGVudGlhbHM7XG4gICAgICAgIHRoaXMuY2FjaGUgPSBpbnB1dC5jYWNoZTtcbiAgICAgICAgdGhpcy5yZWRpcmVjdCA9IGlucHV0LnJlZGlyZWN0O1xuICAgICAgICB0aGlzLnJlZmVycmVyID0gaW5wdXQucmVmZXJyZXI7XG4gICAgICAgIHRoaXMucmVmZXJyZXJQb2xpY3kgPSBpbnB1dC5yZWZlcnJlclBvbGljeTtcbiAgICAgICAgdGhpcy5pbnRlZ3JpdHkgPSBpbnB1dC5pbnRlZ3JpdHk7XG4gICAgICAgIHRoaXMua2VlcGFsaXZlID0gaW5wdXQua2VlcGFsaXZlO1xuICAgICAgICB0aGlzLnNpZ25hbCA9IGlucHV0LnNpZ25hbDtcbiAgICAgICAgdGhpcy5kdXBsZXggPSBpbnB1dC5kdXBsZXg7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBpbnB1dC5kZXN0aW5hdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gT3ZlcnJpZGUgd2l0aCBpbml0IG9wdGlvbnMgaWYgcHJvdmlkZWRcbiAgICAgIC8vIFNldCBtZXRob2RcbiAgICAgIGlmIChpbml0Py5tZXRob2QpIHtcbiAgICAgICAgdGhpcy5tZXRob2QgPSBpbml0Lm1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5tZXRob2QgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIGRlZmF1bHQgZm9yIHN0cmluZyBpbnB1dCBjYXNlXG4gICAgICAgIHRoaXMubWV0aG9kID0gJ0dFVCc7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCBoZWFkZXJzXG4gICAgICBpZiAoaW5pdD8uaGVhZGVycykge1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgdm1HbG9iYWxUaGlzLkhlYWRlcnMoaW5pdC5oZWFkZXJzKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgaW5wdXQgaW5zdGFuY2VvZiB2bUdsb2JhbFRoaXMuVVJMXG4gICAgICApIHtcbiAgICAgICAgLy8gRm9yIHN0cmluZy9VUkwgaW5wdXQsIGNyZWF0ZSBlbXB0eSBoZWFkZXJzXG4gICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycygpO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgb3RoZXIgcHJvcGVydGllcyB3aXRoIGluaXQgdmFsdWVzIG9yIGRlZmF1bHRzXG4gICAgICBpZiAoaW5pdD8ubW9kZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMubW9kZSA9IGluaXQubW9kZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMubW9kZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5tb2RlID0gJ2NvcnMnO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5pdD8uY3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNyZWRlbnRpYWxzID0gaW5pdC5jcmVkZW50aWFscztcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuY3JlZGVudGlhbHMgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuY3JlZGVudGlhbHMgPSAnc2FtZS1vcmlnaW4nO1xuICAgICAgfVxuXG4gICAgICAvLyBgYW55YCBjYXN0IGhlcmUgYmVjYXVzZSBAdHlwZXMvbm9kZSB2MjIgZG9lcyBub3QgeWV0IGhhdmUgYGNhY2hlYFxuICAgICAgaWYgKChpbml0IGFzIGFueSk/LmNhY2hlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jYWNoZSA9IChpbml0IGFzIGFueSkuY2FjaGU7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLmNhY2hlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmNhY2hlID0gJ2RlZmF1bHQnO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5pdD8ucmVkaXJlY3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLnJlZGlyZWN0ID0gaW5pdC5yZWRpcmVjdDtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMucmVkaXJlY3QgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMucmVkaXJlY3QgPSAnZm9sbG93JztcbiAgICAgIH1cblxuICAgICAgaWYgKGluaXQ/LnJlZmVycmVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5yZWZlcnJlciA9IGluaXQucmVmZXJyZXI7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0aGlzLnJlZmVycmVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLnJlZmVycmVyID0gJ2Fib3V0OmNsaWVudCc7XG4gICAgICB9XG5cbiAgICAgIGlmIChpbml0Py5yZWZlcnJlclBvbGljeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMucmVmZXJyZXJQb2xpY3kgPSBpbml0LnJlZmVycmVyUG9saWN5O1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5yZWZlcnJlclBvbGljeSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5yZWZlcnJlclBvbGljeSA9ICcnO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5pdD8uaW50ZWdyaXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5pbnRlZ3JpdHkgPSBpbml0LmludGVncml0eTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuaW50ZWdyaXR5ICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aGlzLmludGVncml0eSA9ICcnO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5pdD8ua2VlcGFsaXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5rZWVwYWxpdmUgPSBpbml0LmtlZXBhbGl2ZTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMua2VlcGFsaXZlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdGhpcy5rZWVwYWxpdmUgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGluaXQ/LnNpZ25hbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgLSBBYm9ydFNpZ25hbCBzdHViXG4gICAgICAgIHRoaXMuc2lnbmFsID0gaW5pdC5zaWduYWw7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLnNpZ25hbCkge1xuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gQWJvcnRTaWduYWwgc3R1YlxuICAgICAgICB0aGlzLnNpZ25hbCA9IHsgYWJvcnRlZDogZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmR1cGxleCkge1xuICAgICAgICB0aGlzLmR1cGxleCA9ICdoYWxmJztcbiAgICAgIH1cblxuICAgICAgaWYgKCF0aGlzLmRlc3RpbmF0aW9uKSB7XG4gICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSAnZG9jdW1lbnQnO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBib2R5ID0gaW5pdD8uYm9keTtcblxuICAgICAgLy8gVmFsaWRhdGUgdGhhdCBHRVQvSEVBRCBtZXRob2RzIGRvbid0IGhhdmUgYSBib2R5XG4gICAgICBpZiAoXG4gICAgICAgIGJvZHkgIT09IG51bGwgJiZcbiAgICAgICAgYm9keSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICh0aGlzLm1ldGhvZCA9PT0gJ0dFVCcgfHwgdGhpcy5tZXRob2QgPT09ICdIRUFEJylcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBSZXF1ZXN0IHdpdGggR0VUL0hFQUQgbWV0aG9kIGNhbm5vdCBoYXZlIGJvZHkuYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0b3JlIHRoZSBvcmlnaW5hbCBCb2R5SW5pdCBmb3Igc2VyaWFsaXphdGlvblxuICAgICAgaWYgKGJvZHkgIT09IG51bGwgJiYgYm9keSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIFwiZmFrZVwiIFJlYWRhYmxlU3RyZWFtIHRoYXQgc3RvcmVzIHRoZSBvcmlnaW5hbCBib2R5XG4gICAgICAgIC8vIFRoaXMgYXZvaWRzIGRvaW5nIGFzeW5jIHdvcmsgZHVyaW5nIHdvcmtmbG93IHJlcGxheVxuICAgICAgICB0aGlzLmJvZHkgPSBPYmplY3QuY3JlYXRlKHZtR2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbS5wcm90b3R5cGUsIHtcbiAgICAgICAgICBbQk9EWV9JTklUX1NZTUJPTF06IHtcbiAgICAgICAgICAgIHZhbHVlOiBib2R5LFxuICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ib2R5ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjbG9uZSgpOiBSZXF1ZXN0IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBnZXQgYm9keVVzZWQoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogaW1wbGVtZW50IHRoZXNlXG4gICAgYmxvYiE6ICgpID0+IFByb21pc2U8QmxvYj47XG4gICAgZm9ybURhdGEhOiAoKSA9PiBQcm9taXNlPEZvcm1EYXRhPjtcblxuICAgIGFycmF5QnVmZmVyITogKCkgPT4gUHJvbWlzZTxBcnJheUJ1ZmZlcj47XG4gICAganNvbiE6ICgpID0+IFByb21pc2U8YW55PjtcbiAgICB0ZXh0ITogKCkgPT4gUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgYXN5bmMgYnl0ZXMoKSB7XG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYXdhaXQgdGhpcy5hcnJheUJ1ZmZlcigpKTtcbiAgICB9XG4gIH1cbiAgdm1HbG9iYWxUaGlzLlJlcXVlc3QgPSBSZXF1ZXN0O1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFJlcXVlc3QucHJvdG90eXBlLCB7XG4gICAgYXJyYXlCdWZmZXI6IHtcbiAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBBcnJheUJ1ZmZlcj4oJ19fYnVpbHRpbl9yZXNwb25zZV9hcnJheV9idWZmZXInKSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0sXG4gICAganNvbjoge1xuICAgICAgdmFsdWU6IHVzZVN0ZXA8W10sIGFueT4oJ19fYnVpbHRpbl9yZXNwb25zZV9qc29uJyksXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9LFxuICAgIHRleHQ6IHtcbiAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBzdHJpbmc+KCdfX2J1aWx0aW5fcmVzcG9uc2VfdGV4dCcpLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSxcbiAgfSk7XG5cbiAgY2xhc3MgUmVzcG9uc2UgaW1wbGVtZW50cyBnbG9iYWxUaGlzLlJlc3BvbnNlIHtcbiAgICB0eXBlITogZ2xvYmFsVGhpcy5SZXNwb25zZVsndHlwZSddO1xuICAgIHVybCE6IHN0cmluZztcbiAgICBzdGF0dXMhOiBudW1iZXI7XG4gICAgc3RhdHVzVGV4dCE6IHN0cmluZztcbiAgICBib2R5ITogUmVhZGFibGVTdHJlYW08VWludDhBcnJheT4gfCBudWxsO1xuICAgIGhlYWRlcnMhOiBIZWFkZXJzO1xuICAgIHJlZGlyZWN0ZWQhOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoYm9keT86IGFueSwgaW5pdD86IFJlc3BvbnNlSW5pdCkge1xuICAgICAgdGhpcy5zdGF0dXMgPSBpbml0Py5zdGF0dXMgPz8gMjAwO1xuICAgICAgdGhpcy5zdGF0dXNUZXh0ID0gaW5pdD8uc3RhdHVzVGV4dCA/PyAnJztcbiAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycyhpbml0Py5oZWFkZXJzKTtcbiAgICAgIHRoaXMudHlwZSA9ICdkZWZhdWx0JztcbiAgICAgIHRoaXMudXJsID0gJyc7XG4gICAgICB0aGlzLnJlZGlyZWN0ZWQgPSBmYWxzZTtcblxuICAgICAgLy8gVmFsaWRhdGUgdGhhdCBudWxsLWJvZHkgc3RhdHVzIGNvZGVzIGRvbid0IGhhdmUgYSBib2R5XG4gICAgICAvLyBQZXIgSFRUUCBzcGVjOiAyMDQgKE5vIENvbnRlbnQpLCAyMDUgKFJlc2V0IENvbnRlbnQpLCBhbmQgMzA0IChOb3QgTW9kaWZpZWQpXG4gICAgICBpZiAoXG4gICAgICAgIGJvZHkgIT09IG51bGwgJiZcbiAgICAgICAgYm9keSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICh0aGlzLnN0YXR1cyA9PT0gMjA0IHx8IHRoaXMuc3RhdHVzID09PSAyMDUgfHwgdGhpcy5zdGF0dXMgPT09IDMwNClcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIGBSZXNwb25zZSBjb25zdHJ1Y3RvcjogSW52YWxpZCByZXNwb25zZSBzdGF0dXMgY29kZSAke3RoaXMuc3RhdHVzfWBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gU3RvcmUgdGhlIG9yaWdpbmFsIEJvZHlJbml0IGZvciBzZXJpYWxpemF0aW9uXG4gICAgICBpZiAoYm9keSAhPT0gbnVsbCAmJiBib2R5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGEgXCJmYWtlXCIgUmVhZGFibGVTdHJlYW0gdGhhdCBzdG9yZXMgdGhlIG9yaWdpbmFsIGJvZHlcbiAgICAgICAgLy8gVGhpcyBhdm9pZHMgZG9pbmcgYXN5bmMgd29yayBkdXJpbmcgd29ya2Zsb3cgcmVwbGF5XG4gICAgICAgIHRoaXMuYm9keSA9IE9iamVjdC5jcmVhdGUodm1HbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtLnByb3RvdHlwZSwge1xuICAgICAgICAgIFtCT0RZX0lOSVRfU1lNQk9MXToge1xuICAgICAgICAgICAgdmFsdWU6IGJvZHksXG4gICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmJvZHkgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGVzZVxuICAgIGNsb25lITogKCkgPT4gUmVzcG9uc2U7XG4gICAgYmxvYiE6ICgpID0+IFByb21pc2U8Z2xvYmFsVGhpcy5CbG9iPjtcbiAgICBmb3JtRGF0YSE6ICgpID0+IFByb21pc2U8Z2xvYmFsVGhpcy5Gb3JtRGF0YT47XG5cbiAgICBnZXQgb2soKSB7XG4gICAgICByZXR1cm4gdGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwO1xuICAgIH1cblxuICAgIGdldCBib2R5VXNlZCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhcnJheUJ1ZmZlciE6ICgpID0+IFByb21pc2U8QXJyYXlCdWZmZXI+O1xuICAgIGpzb24hOiAoKSA9PiBQcm9taXNlPGFueT47XG4gICAgdGV4dCE6ICgpID0+IFByb21pc2U8c3RyaW5nPjtcblxuICAgIGFzeW5jIGJ5dGVzKCkge1xuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGF3YWl0IHRoaXMuYXJyYXlCdWZmZXIoKSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGpzb24oZGF0YTogYW55LCBpbml0PzogUmVzcG9uc2VJbml0KTogUmVzcG9uc2Uge1xuICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycyhpbml0Py5oZWFkZXJzKTtcbiAgICAgIGlmICghaGVhZGVycy5oYXMoJ2NvbnRlbnQtdHlwZScpKSB7XG4gICAgICAgIGhlYWRlcnMuc2V0KCdjb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShib2R5LCB7IC4uLmluaXQsIGhlYWRlcnMgfSk7XG4gICAgfVxuXG4gICAgc3RhdGljIGVycm9yKCk6IFJlc3BvbnNlIHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcmVkaXJlY3QodXJsOiBzdHJpbmcgfCBVUkwsIHN0YXR1czogbnVtYmVyID0gMzAyKTogUmVzcG9uc2Uge1xuICAgICAgLy8gVmFsaWRhdGUgc3RhdHVzIGNvZGUgLSBvbmx5IHNwZWNpZmljIHJlZGlyZWN0IGNvZGVzIGFyZSBhbGxvd2VkXG4gICAgICBpZiAoIVszMDEsIDMwMiwgMzAzLCAzMDcsIDMwOF0uaW5jbHVkZXMoc3RhdHVzKSkge1xuICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCByZWRpcmVjdCBzdGF0dXMgY29kZTogJHtzdGF0dXN9LiBNdXN0IGJlIG9uZSBvZjogMzAxLCAzMDIsIDMwMywgMzA3LCAzMDhgXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIENyZWF0ZSByZXNwb25zZSB3aXRoIExvY2F0aW9uIGhlYWRlclxuICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyB2bUdsb2JhbFRoaXMuSGVhZGVycygpO1xuICAgICAgaGVhZGVycy5zZXQoJ0xvY2F0aW9uJywgU3RyaW5nKHVybCkpO1xuXG4gICAgICBjb25zdCByZXNwb25zZSA9IE9iamVjdC5jcmVhdGUoUmVzcG9uc2UucHJvdG90eXBlKTtcbiAgICAgIHJlc3BvbnNlLnN0YXR1cyA9IHN0YXR1cztcbiAgICAgIHJlc3BvbnNlLnN0YXR1c1RleHQgPSAnJztcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMgPSBoZWFkZXJzO1xuICAgICAgcmVzcG9uc2UuYm9keSA9IG51bGw7XG4gICAgICByZXNwb25zZS50eXBlID0gJ2RlZmF1bHQnO1xuICAgICAgcmVzcG9uc2UudXJsID0gJyc7XG4gICAgICByZXNwb25zZS5yZWRpcmVjdGVkID0gZmFsc2U7XG5cbiAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG4gIH1cbiAgdm1HbG9iYWxUaGlzLlJlc3BvbnNlID0gUmVzcG9uc2U7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUmVzcG9uc2UucHJvdG90eXBlLCB7XG4gICAgYXJyYXlCdWZmZXI6IHtcbiAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBBcnJheUJ1ZmZlcj4oJ19fYnVpbHRpbl9yZXNwb25zZV9hcnJheV9idWZmZXInKSxcbiAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIH0sXG4gICAganNvbjoge1xuICAgICAgdmFsdWU6IHVzZVN0ZXA8W10sIGFueT4oJ19fYnVpbHRpbl9yZXNwb25zZV9qc29uJyksXG4gICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB9LFxuICAgIHRleHQ6IHtcbiAgICAgIHZhbHVlOiB1c2VTdGVwPFtdLCBzdHJpbmc+KCdfX2J1aWx0aW5fcmVzcG9uc2VfdGV4dCcpLFxuICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgfSxcbiAgfSk7XG5cbiAgY2xhc3MgUmVhZGFibGVTdHJlYW08VD4gaW1wbGVtZW50cyBnbG9iYWxUaGlzLlJlYWRhYmxlU3RyZWFtPFQ+IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBnZXQgbG9ja2VkKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNhbmNlbCgpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIGdldFJlYWRlcigpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIHBpcGVUaHJvdWdoKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgcGlwZVRvKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgdGVlKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgdmFsdWVzKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGZyb20oKTogYW55IHtcbiAgICAgIEVOT1RTVVAoKTtcbiAgICB9XG5cbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuICB9XG4gIHZtR2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbSA9IFJlYWRhYmxlU3RyZWFtO1xuXG4gIGNsYXNzIFdyaXRhYmxlU3RyZWFtPFQ+IGltcGxlbWVudHMgZ2xvYmFsVGhpcy5Xcml0YWJsZVN0cmVhbTxUPiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgZ2V0IGxvY2tlZCgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBhYm9ydCgpOiBhbnkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cblxuICAgIGNsb3NlKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuXG4gICAgZ2V0V3JpdGVyKCk6IGFueSB7XG4gICAgICBFTk9UU1VQKCk7XG4gICAgfVxuICB9XG4gIHZtR2xvYmFsVGhpcy5Xcml0YWJsZVN0cmVhbSA9IFdyaXRhYmxlU3RyZWFtO1xuXG4gIGNsYXNzIFRyYW5zZm9ybVN0cmVhbTxJLCBPPiBpbXBsZW1lbnRzIGdsb2JhbFRoaXMuVHJhbnNmb3JtU3RyZWFtPEksIE8+IHtcbiAgICByZWFkYWJsZTogZ2xvYmFsVGhpcy5SZWFkYWJsZVN0cmVhbTxPPjtcbiAgICB3cml0YWJsZTogZ2xvYmFsVGhpcy5Xcml0YWJsZVN0cmVhbTxJPjtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgRU5PVFNVUCgpO1xuICAgIH1cbiAgfVxuICB2bUdsb2JhbFRoaXMuVHJhbnNmb3JtU3RyZWFtID0gVHJhbnNmb3JtU3RyZWFtO1xuXG4gIHZtR2xvYmFsVGhpcy5jb25zb2xlID0gZ2xvYmFsVGhpcy5jb25zb2xlO1xuXG4gIC8vIEV4cG9zZSB0aGUgcmVxdWVzdC1jb250ZXh0IHN5bWJvbCByZXF1aXJlZCBieSBBSSBHYXRld2F5LlxuICBjb25zdCBTWU1CT0xfRk9SX1JFUV9DT05URVhUID0gU3ltYm9sLmZvcignQHZlcmNlbC9yZXF1ZXN0LWNvbnRleHQnKTtcbiAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIGBAdHlwZXMvbm9kZWAgc2F5cyBzeW1ib2wgaXMgbm90IHZhbGlkLCBidXQgaXQgZG9lcyB3b3JrXG4gIHZtR2xvYmFsVGhpc1tTWU1CT0xfRk9SX1JFUV9DT05URVhUXSA9IChnbG9iYWxUaGlzIGFzIGFueSlbXG4gICAgU1lNQk9MX0ZPUl9SRVFfQ09OVEVYVFxuICBdO1xuICBlbmRWbVRyYWNlKCk7XG5cbiAgLy8gUmV1c2UgY29tcGlsZWQgc2NyaXB0cyBieSBgKGNvZGUsIGZpbGVuYW1lKWA6IGNvbXBpbGF0aW9uIGlzIGRldGVybWluaXN0aWNcbiAgLy8gYW5kIHRoZSBmaWxlbmFtZSBwcmVzZXJ2ZXMgd29ya2Zsb3cgc291cmNlIGF0dHJpYnV0aW9uIGluIHN0YWNrIHRyYWNlcy5cbiAgLy8gVGhlIGJ1bmRsZSByZWdpc3RlcnMgd29ya2Zsb3dzIG9uIGBnbG9iYWxUaGlzLl9fcHJpdmF0ZV93b3JrZmxvd3NgLlxuICBjb25zdCB7IGJ1bmRsZVNjcmlwdCwgd29ya2Zsb3dMb29rdXBTY3JpcHQgfSA9XG4gICAgY29tcGlsZWRXb3JrZmxvd1NjcmlwdHMgPz9cbiAgICAoYXdhaXQgY29tcGlsZVdvcmtmbG93QnVuZGxlKHdvcmtmbG93Q29kZSwgd29ya2Zsb3dSdW4ud29ya2Zsb3dOYW1lKSk7XG4gIGNvbnN0IHdvcmtmbG93Rm4gPSBhd2FpdCB0cmFjZSgnd29ya2Zsb3cuYnVuZGxlLmV2YWx1YXRlJywgYXN5bmMgKCkgPT4ge1xuICAgIGJ1bmRsZVNjcmlwdC5ydW5JbkNvbnRleHQoY29udGV4dCk7XG4gICAgcmV0dXJuIHdvcmtmbG93TG9va3VwU2NyaXB0LnJ1bkluQ29udGV4dChjb250ZXh0KTtcbiAgfSk7XG5cbiAgaWYgKHR5cGVvZiB3b3JrZmxvd0ZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFdvcmtmbG93Tm90UmVnaXN0ZXJlZEVycm9yKHdvcmtmbG93UnVuLndvcmtmbG93TmFtZSk7XG4gIH1cblxuICAvLyBDaGFpbiB3b3JrZmxvdyBhcmd1bWVudCBoeWRyYXRpb24gb250byB0aGUgcHJvbWlzZVF1ZXVlIHNvIHRoYXQgdGhlXG4gIC8vIHVuY29uc3VtZWQgZXZlbnQgY2hlY2sgKHdoaWNoIHdhaXRzIGZvciB0aGUgcXVldWUgdG8gZHJhaW4pIGRvZXNuJ3RcbiAgLy8gZmlyZSBkdXJpbmcgdGhlIGFzeW5jIGdhcCBiZXR3ZWVuIHJ1bl9zdGFydGVkIGNvbnN1bXB0aW9uIGFuZCB0aGVcbiAgLy8gd29ya2Zsb3cgZnVuY3Rpb24gc3Vic2NyaWJpbmcgaXRzIGZpcnN0IHN0ZXAgY2FsbGJhY2tzLlxuICBsZXQgYXJnczogdW5rbm93bltdID0gW107XG4gIHdvcmtmbG93Q29udGV4dC5wcm9taXNlUXVldWUgPSB3b3JrZmxvd0NvbnRleHQucHJvbWlzZVF1ZXVlLnRoZW4oYXN5bmMgKCkgPT4ge1xuICAgIC8vIEluY2x1ZGUgYW55IHJlc2lkdWFsIHBheWxvYWQgcHJlcGFyYXRpb24gcGx1cyBWTS1sb2NhbCBkZXNlcmlhbGl6YXRpb25cbiAgICAvLyBpbiB0aGUgYmxvY2tpbmcgYm91bmRhcnkuXG4gICAgYXJncyA9IGF3YWl0IHRyYWNlKCd3b3JrZmxvdy5pbnB1dC5oeWRyYXRlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcHJlcGFyZWQgPVxuICAgICAgICBhd2FpdCByZXBsYXlQYXlsb2FkQ2FjaGUucHJlcGFyZVdvcmtmbG93SW5wdXQod29ya2Zsb3dSdW4pO1xuICAgICAgcmV0dXJuIGh5ZHJhdGVXb3JrZmxvd0FyZ3VtZW50cyhcbiAgICAgICAgd29ya2Zsb3dSdW4uaW5wdXQsXG4gICAgICAgIHdvcmtmbG93UnVuLnJ1bklkLFxuICAgICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgICB2bUdsb2JhbFRoaXMsXG4gICAgICAgIHt9LFxuICAgICAgICBwcmVwYXJlZFxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG4gIGF3YWl0IHdvcmtmbG93Q29udGV4dC5wcm9taXNlUXVldWU7XG5cbiAgY29uc3QgZmFpbFdvcmtmbG93ID0gYXN5bmMgKGVycm9yOiB1bmtub3duKTogUHJvbWlzZTxuZXZlcj4gPT4ge1xuICAgIC8vIENvbnRyb2wtZmxvdyBzaWduYWxzIGFyZSBoYW5kbGVkIGJ5IHRoZSBydW50aW1lIGFuZCBkbyBub3QgbWVhbiB0aGVcbiAgICAvLyB3b3JrZmxvdyBoYXMgdGVybWluYWxseSBmYWlsZWQuIGBvbldvcmtmbG93RXJyb3JgIHVzdWFsbHkgYWxyZWFkeSBtb3ZlZFxuICAgIC8vIHRoZSBzdGF0ZSBtYWNoaW5lLCBidXQgYSBkaXZlcmdlbmNlIGNhbiBhbHNvIGFycml2ZSB2aWEgYSBzdGVwXG4gICAgLy8gcHJvbWlzZSdzIGRpcmVjdCByZWplY3Rpb24gKGJ5cGFzc2luZyBgb25Xb3JrZmxvd0Vycm9yYCk7IGRlbW90ZSBzb1xuICAgIC8vIGV2ZXJ5IGNvbnRyb2wtZmxvdyBwYXRoIGNvbnZlcmdlcyBvbiBgcmVwbGF5YCBhbmQgYSBsYXRlciByZXN1bWUgZmFsbHNcbiAgICAvLyBiYWNrIGluc3RlYWQgb2YgdGhyb3dpbmcuXG4gICAgaWYgKFdvcmtmbG93U3VzcGVuc2lvbi5pcyhlcnJvcikgfHwgUmVwbGF5RGl2ZXJnZW5jZUVycm9yLmlzKGVycm9yKSkge1xuICAgICAgaWYgKHN0YXRlLnR5cGUgPT09ICdydW5uaW5nJykgc3RhdGUgPSB7IHR5cGU6ICdyZXBsYXknIH07XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gICAgc3RhdGUgPSB7IHR5cGU6ICdjb21wbGV0ZWQnIH07XG5cbiAgICBhd2FpdCBkcmFpblBlbmRpbmdRdWV1ZUl0ZW1zKFxuICAgICAgd29ya2Zsb3dSdW4ucnVuSWQsXG4gICAgICB3b3JrZmxvd0NvbnRleHQuaW52b2NhdGlvbnNRdWV1ZSxcbiAgICAgIHZtR2xvYmFsVGhpcyxcbiAgICAgIHdvcmtmbG93UnVuLFxuICAgICAgJ2ZhaWxlZCcsXG4gICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICApO1xuXG4gICAgdGhyb3cgZXJyb3I7XG4gIH07XG5cbiAgY29uc3Qgd2FpdEZvckV4ZWN1dGlvbiA9IGFzeW5jIChcbiAgICB3b3JrZmxvd0JvZHk6IFByb21pc2U8dW5rbm93bj4sXG4gICAgaW50ZXJydXB0aW9uOiBQcm9taXNlV2l0aFJlc29sdmVyczxuZXZlcj5cbiAgKTogUHJvbWlzZTxXb3JrZmxvd1Jlc3VsdD4gPT4ge1xuICAgIGxldCByZXN1bHQ6IHVua25vd247XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGF3YWl0IFByb21pc2UucmFjZShbd29ya2Zsb3dCb2R5LCBpbnRlcnJ1cHRpb24ucHJvbWlzZV0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoc3RhdGUudHlwZSA9PT0gJ3N1c3BlbmRlZCcgJiYgZXJyb3IgPT09IHN0YXRlLnN1c3BlbnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0eXBlOiAnc3VzcGVuZGVkJyxcbiAgICAgICAgICBzdXNwZW5zaW9uOiBzdGF0ZS5zdXNwZW5zaW9uLFxuICAgICAgICAgIHNlc3Npb24sXG4gICAgICAgICAgLy8gQSBzdXNwZW5zaW9uIGlzIG5vdCBhIHNldHRsaW5nIHBvaW50OiB0aGUgY29uc3VtZXIgZm9yIHNvbWV0aGluZ1xuICAgICAgICAgIC8vIGhlbGQgbWF5IHdlbGwgYmUgcmVnaXN0ZXJlZCBieSB0aGUgcmVwbGF5IHRoYXQgZm9sbG93cyB0aGlzIG9uZS5cbiAgICAgICAgICAvLyBTbyBpdCBpcyBjYXJyaWVkIG91dCBmb3IgdGhlIHNwYW4gaW5zdGVhZCBvZiBiZWluZyBqdWRnZWQgaGVyZS5cbiAgICAgICAgICBwYXJrZWQ6IGV2ZW50c0NvbnN1bWVyLnBhcmtlZFN1bW1hcnksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFpbFdvcmtmbG93KGVycm9yKTtcbiAgICB9XG5cbiAgICBzdGF0ZSA9IHsgdHlwZTogJ2NvbXBsZXRlZCcgfTtcbiAgICAvLyBUaGUgY29uc3VtZXIgd2Fsa3MgcGFzdCBldmVudHMgd2hvc2UgdHlwZSBjYXJyaWVzIG5vIG9yZGVyaW5nIGNsYWltIGFuZFxuICAgIC8vIGhvbGRzIHRoZW0gZm9yIGEgY29uc3VtZXIgaXQgZXhwZWN0cyBhIGxhdGVyIGBzdWJzY3JpYmUoKWAgdG8gcmVnaXN0ZXIuXG4gICAgLy8gVGhlIHdvcmtmbG93IGZ1bmN0aW9uIHJldHVybmluZyBpcyB0aGUgcG9pbnQgd2hlcmUgdGhhdCBleHBlY3RhdGlvbiBpc1xuICAgIC8vIHNldHRsZWQ6IG5vdGhpbmcgbW9yZSB3aWxsIHN1YnNjcmliZSwgc28gYW55dGhpbmcgc3RpbGwgaGVsZCB3YXMgbmV2ZXJcbiAgICAvLyBhbnlvbmUncywgYW5kIGNvbXBsZXRpbmcgaGVyZSB3b3VsZCBkcm9wIGl0IHNpbGVudGx5LlxuICAgIGNvbnN0IHN0cmFuZGVkID0gZXZlbnRzQ29uc3VtZXIuc3RyYW5kZWRFdmVudDtcbiAgICBpZiAoc3RyYW5kZWQpIHtcbiAgICAgIHJldHVybiBmYWlsV29ya2Zsb3coXG4gICAgICAgIG5ldyBSZXBsYXlEaXZlcmdlbmNlRXJyb3IoXG4gICAgICAgICAgYFJlcGxheSBmaW5pc2hlZCB3aXRob3V0IGNvbnN1bWluZyBldmVudDogZXZlbnRUeXBlPSR7c3RyYW5kZWQuZXZlbnRUeXBlfSwgY29ycmVsYXRpb25JZD0ke3N0cmFuZGVkLmNvcnJlbGF0aW9uSWR9LCBldmVudElkPSR7c3RyYW5kZWQuZXZlbnRJZH0uYCxcbiAgICAgICAgICB7IGV2ZW50SWQ6IHN0cmFuZGVkLmV2ZW50SWQgfVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZGVoeWRyYXRlV29ya2Zsb3dSZXR1cm5WYWx1ZShcbiAgICAgICAgcmVzdWx0LFxuICAgICAgICB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgICAgZW5jcnlwdGlvbktleSxcbiAgICAgICAgdm1HbG9iYWxUaGlzLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgLy8gT25seSBjb21wcmVzc2lvbi1jYXBhYmxlIHJ1bnMgKHNwZWMgPj0gNSkgbWF5IHdyaXRlIGNvbXByZXNzZWRcbiAgICAgICAgLy8gcGF5bG9hZHMuIFRoZSBzZXJpYWxpemVyIHVzZXMgenN0ZCB3aGVuIHN1cHBvcnRlZCBhbmQgbWF5IHVzZSBnemlwLlxuICAgICAgICAod29ya2Zsb3dSdW4uc3BlY1ZlcnNpb24gPz8gMCkgPj0gU1BFQ19WRVJTSU9OX1NVUFBPUlRTX0NPTVBSRVNTSU9OXG4gICAgICApO1xuXG4gICAgICBhd2FpdCBkcmFpblBlbmRpbmdRdWV1ZUl0ZW1zKFxuICAgICAgICB3b3JrZmxvd1J1bi5ydW5JZCxcbiAgICAgICAgd29ya2Zsb3dDb250ZXh0Lmludm9jYXRpb25zUXVldWUsXG4gICAgICAgIHZtR2xvYmFsVGhpcyxcbiAgICAgICAgd29ya2Zsb3dSdW4sXG4gICAgICAgICdjb21wbGV0ZWQnLFxuICAgICAgICBydW5SZWFkeUJhcnJpZXJcbiAgICAgICk7XG5cbiAgICAgIHJldHVybiB7IHR5cGU6ICdjb21wbGV0ZWQnLCBvdXRwdXQsIHJlc3VsdFR5cGU6IHR5cGVvZiByZXN1bHQgfTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGZhaWxXb3JrZmxvdyhlcnJvcik7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHdvcmtmbG93VHJhY2VDb250ZXh0ID0gYXdhaXQgY3JlYXRlUmVmcmVzaGFibGVUcmFjZUNvbnRleHQoKTtcbiAgY29uc3QgcmVwbGF5VHJhY2UgPSBhd2FpdCBzdGFydFRyYWNlU3Bhbignd29ya2Zsb3cucmVwbGF5LmV4ZWN1dGUnKTtcbiAgY29uc3Qgd29ya2Zsb3dCb2R5ID0gd29ya2Zsb3dUcmFjZUNvbnRleHQucnVuKGFzeW5jICgpID0+XG4gICAgd29ya2Zsb3dGbiguLi5hcmdzKVxuICApO1xuXG4gIGNvbnN0IHNlc3Npb246IFdvcmtmbG93U2Vzc2lvbiA9IHtcbiAgICB3b3JrZmxvd1J1bixcbiAgICBhcmd1bWVudENvdW50OiBhcmdzLmxlbmd0aCxcbiAgICBhc3luYyByZXN1bWUobmV4dEV2ZW50cykge1xuICAgICAgc3dpdGNoIChzdGF0ZS50eXBlKSB7XG4gICAgICAgIGNhc2UgJ3N1c3BlbmRlZCc6IHtcbiAgICAgICAgICAvLyBUaGUgZnVsbCBPKGtub3duIGV2ZW50cykgcHJlZml4IGNvbXBhcmUgaXMgcmVxdWlyZWQ6IHRoZSBydW50aW1lXG4gICAgICAgICAgLy8gdXN1YWxseSBncm93cyBvbmUgYXJyYXkgaW4gcGxhY2UsIGJ1dCBpdHMgd2FpdC1jb21wbGV0aW9uIGFuZFxuICAgICAgICAgIC8vIHN0YWxlLXJlbG9hZCBwYXRocyBSRVBMQUNFIHRoZSBhcnJheSB3aXRoIGEgZnJlc2ggZnVsbCBmZXRjaCwgc29cbiAgICAgICAgICAvLyBhIHJld3JpdHRlbiBwcmVmaXggaXMgYSByZWFsIGlucHV0LCBub3QgcGFyYW5vaWEuIFRoZSBjb21wYXJlc1xuICAgICAgICAgIC8vIGFyZSBjaGVhcCBzdHJpbmcgZXF1YWxpdHkgYW5kIGR3YXJmZWQgYnkgdGhlIHJlcGxheSB0aGV5IGF2b2lkLlxuICAgICAgICAgIGNvbnN0IGtub3duRXZlbnRzID0gZXZlbnRzQ29uc3VtZXIuZXZlbnRzO1xuICAgICAgICAgIGNvbnN0IGlzU3RyaWN0RXh0ZW5zaW9uID1cbiAgICAgICAgICAgIG5leHRFdmVudHMubGVuZ3RoID4ga25vd25FdmVudHMubGVuZ3RoICYmXG4gICAgICAgICAgICBrbm93bkV2ZW50cy5ldmVyeShcbiAgICAgICAgICAgICAgKGV2ZW50LCBpbmRleCkgPT4gZXZlbnQuZXZlbnRJZCA9PT0gbmV4dEV2ZW50c1tpbmRleF0uZXZlbnRJZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoIWlzU3RyaWN0RXh0ZW5zaW9uKSB7XG4gICAgICAgICAgICBzdGF0ZSA9IHsgdHlwZTogJ3JlcGxheScgfTtcbiAgICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdyZXBsYXknIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGludGVycnVwdGlvbiA9IHdpdGhSZXNvbHZlcnM8bmV2ZXI+KCk7XG4gICAgICAgICAgc3RhdGUgPSB7IHR5cGU6ICdydW5uaW5nJywgaW50ZXJydXB0aW9uIH07XG4gICAgICAgICAgd29ya2Zsb3dDb250ZXh0LnN1c3BlbnNpb25HZW5lcmF0aW9uKys7XG4gICAgICAgICAgd29ya2Zsb3dUcmFjZUNvbnRleHQucmVmcmVzaCgpO1xuICAgICAgICAgIGV2ZW50c0NvbnN1bWVyLmFwcGVuZChuZXh0RXZlbnRzLnNsaWNlKGtub3duRXZlbnRzLmxlbmd0aCkpO1xuICAgICAgICAgIHJldHVybiB3YWl0Rm9yRXhlY3V0aW9uKHdvcmtmbG93Qm9keSwgaW50ZXJydXB0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdyZXBsYXknOlxuICAgICAgICAgIHJldHVybiB7IHR5cGU6ICdyZXBsYXknIH07XG4gICAgICAgIGNhc2UgJ2NvbXBsZXRlZCc6XG4gICAgICAgIGNhc2UgJ3J1bm5pbmcnOlxuICAgICAgICAgIHRocm93IG5ldyBXb3JrZmxvd1J1bnRpbWVFcnJvcihcbiAgICAgICAgICAgIGBDYW5ub3QgcmVzdW1lICR7c3RhdGUudHlwZX0gd29ya2Zsb3cgXCIke3dvcmtmbG93UnVuLnJ1bklkfVwiYFxuICAgICAgICAgICk7XG4gICAgICB9XG4gICAgICBzdGF0ZSBzYXRpc2ZpZXMgbmV2ZXI7XG4gICAgfSxcbiAgfTtcblxuICAvLyBUaGUgcmVwbGF5IHNwYW4gbWVhc3VyZXMgdGhlIHVzZXIgZnVuY3Rpb24gd2l0aG91dCBiZWNvbWluZyBpdHMgYW1iaWVudFxuICAvLyBjb250ZXh0LiBUaGUgd29ya2Zsb3cgcHJvbWlzZSBzdGF5cyBwZW5kaW5nIGFjcm9zcyByZXRhaW5lZCByZXN1bWVzLCBzbyBhblxuICAvLyBhY3RpdmUgcmVwbGF5IHNwYW4gaGVyZSB3b3VsZCByZW1haW4gY2FwdHVyZWQgYWZ0ZXIgdGhhdCBzcGFuIGhhcyBlbmRlZC5cbiAgY29uc3QgZXhlY3V0aW9uID0gd2FpdEZvckV4ZWN1dGlvbih3b3JrZmxvd0JvZHksIGluaXRpYWxJbnRlcnJ1cHRpb24pO1xuICB2b2lkIGV4ZWN1dGlvbi50aGVuKHJlcGxheVRyYWNlLmVuZCwgcmVwbGF5VHJhY2UuZmFpbCk7XG5cbiAgcmV0dXJuIHtcbiAgICBzZXNzaW9uLFxuICAgIGV4ZWN1dGlvbixcbiAgfTtcbn1cbiJdfQ==