ngx-material-entity 18.1.0 → 18.2.1

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 (85) hide show
  1. package/README.md +10 -13
  2. package/components/create-page/create-page.component.d.ts +3 -0
  3. package/components/edit-page/edit-page.component.d.ts +3 -0
  4. package/components/input/file/file-default-input/file-default-input.component.d.ts +1 -1
  5. package/components/input/file/file-image-input/file-image-input.component.d.ts +3 -0
  6. package/components/input/file/file-input/file-input.component.d.ts +8 -2
  7. package/components/input/input.component.d.ts +2 -0
  8. package/components/input/number/number-dropdown-input/number-dropdown-input.component.d.ts +2 -0
  9. package/components/input/relations/references-many-input/references-many-input.component.d.ts +2 -0
  10. package/components/input/string/string-dropdown-input/string-dropdown-input.component.d.ts +2 -0
  11. package/components/input/string/string-password-input/string-password-input.component.d.ts +3 -0
  12. package/components/tooltip/tooltip.component.d.ts +2 -0
  13. package/decorators/array/array-decorator-internal.data.d.ts +3 -2
  14. package/decorators/array/array-decorator.data.d.ts +7 -6
  15. package/decorators/base/property-decorator.data.d.ts +2 -2
  16. package/decorators/file/file-decorator-internal.data.d.ts +3 -2
  17. package/decorators/file/file-decorator.data.d.ts +4 -3
  18. package/esm2022/components/confirm-dialog/confirm-dialog.component.mjs +4 -4
  19. package/esm2022/components/create-page/create-page.component.mjs +18 -8
  20. package/esm2022/components/custom-table/custom-table.component.mjs +4 -4
  21. package/esm2022/components/edit-page/edit-page.component.mjs +18 -8
  22. package/esm2022/components/form/form.component.mjs +5 -5
  23. package/esm2022/components/input/array/array-date-input/array-date-input.component.mjs +5 -5
  24. package/esm2022/components/input/array/array-date-range-input/array-date-range-input.component.mjs +3 -3
  25. package/esm2022/components/input/array/array-date-time-input/array-date-time-input.component.mjs +3 -3
  26. package/esm2022/components/input/array/array-string-autocomplete-chips/array-string-autocomplete-chips.component.mjs +8 -6
  27. package/esm2022/components/input/array/array-string-chips-input/array-string-chips-input.component.mjs +8 -6
  28. package/esm2022/components/input/array/array-table.class.mjs +3 -3
  29. package/esm2022/components/input/base-input.component.mjs +3 -3
  30. package/esm2022/components/input/boolean/boolean-checkbox-input/boolean-checkbox-input.component.mjs +4 -4
  31. package/esm2022/components/input/boolean/boolean-dropdown-input/boolean-dropdown-input.component.mjs +3 -3
  32. package/esm2022/components/input/boolean/boolean-toggle-input/boolean-toggle-input.component.mjs +4 -4
  33. package/esm2022/components/input/custom/custom.component.mjs +3 -3
  34. package/esm2022/components/input/date/date-input/date-input.component.mjs +3 -3
  35. package/esm2022/components/input/date/date-range-input/date-range-input.component.mjs +3 -3
  36. package/esm2022/components/input/date/date-time-input/date-time-input.component.mjs +3 -3
  37. package/esm2022/components/input/file/file-default-input/file-default-input.component.mjs +5 -5
  38. package/esm2022/components/input/file/file-image-input/file-image-input.component.mjs +9 -5
  39. package/esm2022/components/input/file/file-input/file-input.component.mjs +25 -12
  40. package/esm2022/components/input/input.component.mjs +23 -12
  41. package/esm2022/components/input/number/number-dropdown-input/number-dropdown-input.component.mjs +10 -6
  42. package/esm2022/components/input/number/number-input/number-input.component.mjs +3 -3
  43. package/esm2022/components/input/number/number-slider-input/number-slider-input.component.mjs +4 -4
  44. package/esm2022/components/input/relations/references-many-input/references-many-input.component.mjs +10 -6
  45. package/esm2022/components/input/string/string-autocomplete-input/string-autocomplete-input.component.mjs +3 -3
  46. package/esm2022/components/input/string/string-dropdown-input/string-dropdown-input.component.mjs +10 -6
  47. package/esm2022/components/input/string/string-input/string-input.component.mjs +3 -3
  48. package/esm2022/components/input/string/string-password-input/string-password-input.component.mjs +11 -6
  49. package/esm2022/components/input/string/string-textbox-input/string-textbox-input.component.mjs +3 -3
  50. package/esm2022/components/table/create-dialog/create-entity-dialog.component.mjs +9 -6
  51. package/esm2022/components/table/display-column-value/base-display-column-value.component.mjs +3 -3
  52. package/esm2022/components/table/display-column-value/display-column-value.component.mjs +3 -3
  53. package/esm2022/components/table/edit-dialog/edit-data.builder.mjs +1 -1
  54. package/esm2022/components/table/edit-dialog/edit-entity-dialog.component.mjs +9 -7
  55. package/esm2022/components/table/table-data.builder.mjs +3 -1
  56. package/esm2022/components/table/table-data.mjs +1 -1
  57. package/esm2022/components/table/table.component.mjs +5 -11
  58. package/esm2022/components/tooltip/tooltip.component.mjs +9 -5
  59. package/esm2022/decorators/array/array-decorator-internal.data.mjs +5 -3
  60. package/esm2022/decorators/array/array-decorator.data.mjs +1 -1
  61. package/esm2022/decorators/array/array.decorator.mjs +15 -8
  62. package/esm2022/decorators/base/property-decorator.data.mjs +2 -2
  63. package/esm2022/decorators/file/file-decorator-internal.data.mjs +4 -3
  64. package/esm2022/decorators/file/file-decorator.data.mjs +3 -3
  65. package/esm2022/decorators/file/file.decorator.mjs +7 -4
  66. package/esm2022/decorators/number/number.decorator.mjs +7 -4
  67. package/esm2022/decorators/object/object.decorator.mjs +5 -3
  68. package/esm2022/decorators/string/string-decorator-internal.data.mjs +2 -1
  69. package/esm2022/decorators/string/string.decorator.mjs +11 -6
  70. package/esm2022/directives/drag-drop.directive.mjs +3 -3
  71. package/esm2022/directives/dynamic-style-class.directive.mjs +3 -3
  72. package/esm2022/directives/included-in.directive.mjs +3 -3
  73. package/esm2022/directives/number.directive.mjs +3 -3
  74. package/esm2022/directives/password-match.directive.mjs +3 -3
  75. package/esm2022/directives/tooltip.directive.mjs +3 -3
  76. package/esm2022/functions/dropdown-values-to-function.function.mjs +2 -1
  77. package/esm2022/functions/table-column-value-to-sort-value.function.mjs +9 -5
  78. package/esm2022/utilities/date.utilities.mjs +1 -1
  79. package/esm2022/utilities/entity.utilities.mjs +36 -21
  80. package/esm2022/utilities/file.utilities.mjs +7 -4
  81. package/esm2022/utilities/validation.utilities.mjs +41 -21
  82. package/fesm2022/ngx-material-entity.mjs +367 -254
  83. package/fesm2022/ngx-material-entity.mjs.map +1 -1
  84. package/package.json +4 -2
  85. package/utilities/entity.utilities.d.ts +4 -4
@@ -7,7 +7,7 @@
7
7
  */
8
8
  export function tableColumnValueToSortValue(value) {
9
9
  switch (typeof value) {
10
- case 'string':
10
+ case 'string': {
11
11
  const stringDate = new Date(value);
12
12
  if (!Number.isNaN(stringDate.getTime())) {
13
13
  return stringDate.getTime();
@@ -17,13 +17,17 @@ export function tableColumnValueToSortValue(value) {
17
17
  return number;
18
18
  }
19
19
  return value;
20
- case 'number':
20
+ }
21
+ case 'number': {
21
22
  return value;
22
- case 'object':
23
+ }
24
+ case 'object': {
23
25
  const date = new Date(value);
24
26
  return date.getTime();
25
- default:
27
+ }
28
+ default: {
26
29
  throw new Error(`Unsupported type for table value: ${typeof value}`);
30
+ }
27
31
  }
28
32
  }
29
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY29sdW1uLXZhbHVlLXRvLXNvcnQtdmFsdWUuZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9mdW5jdGlvbnMvdGFibGUtY29sdW1uLXZhbHVlLXRvLXNvcnQtdmFsdWUuZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLDJCQUEyQixDQUFDLEtBQXVCO0lBQy9ELFFBQVEsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNuQixLQUFLLFFBQVE7WUFDVCxNQUFNLFVBQVUsR0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxPQUFPLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQyxDQUFDO1lBQ0QsTUFBTSxNQUFNLEdBQVcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUN4QixPQUFPLE1BQU0sQ0FBQztZQUNsQixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDakIsS0FBSyxRQUFRO1lBQ1QsT0FBTyxLQUFLLENBQUM7UUFDakIsS0FBSyxRQUFRO1lBQ1QsTUFBTSxJQUFJLEdBQVMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDbkMsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUI7WUFDSSxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxPQUFPLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDN0UsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUYWJsZUNvbHVtblZhbHVlIH0gZnJvbSAnLi4vY29tcG9uZW50cy90YWJsZS90YWJsZS1kYXRhJztcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdGFibGUgY29sdW1uIHZhbHVlIHRvIGEgc3RyaW5nL251bWJlciBmb3Igc29ydGluZy5cbiAqIFRoaXMgYWxzbyBzdXBwb3J0cyBzdHJpbmcgZGF0ZXMsIGlmIHlvdSBlZy4gTmVlZGVkIHRvIGZvcm1hdCB0aGVtLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBBIHN0cmluZyBvciBhIG51bWJlciB0byBzb3J0IGJ5LlxuICogQHRocm93cyBXaGVuIGEgdmFsdWUgd2l0aCBhbiB1bmtub3duIHR5cGUgaGFzIGJlZW4gcHJvdmlkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWJsZUNvbHVtblZhbHVlVG9Tb3J0VmFsdWUodmFsdWU6IFRhYmxlQ29sdW1uVmFsdWUpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICBjb25zdCBzdHJpbmdEYXRlOiBEYXRlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oc3RyaW5nRGF0ZS5nZXRUaW1lKCkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ0RhdGUuZ2V0VGltZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbnVtYmVyOiBudW1iZXIgPSBOdW1iZXIucGFyc2VGbG9hdCh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihudW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICAgIGNvbnN0IGRhdGU6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHR5cGUgZm9yIHRhYmxlIHZhbHVlOiAke3R5cGVvZiB2YWx1ZX1gKTtcbiAgICB9XG59Il19
33
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtY29sdW1uLXZhbHVlLXRvLXNvcnQtdmFsdWUuZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy9mdW5jdGlvbnMvdGFibGUtY29sdW1uLXZhbHVlLXRvLXNvcnQtdmFsdWUuZnVuY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLDJCQUEyQixDQUFDLEtBQXVCO0lBQy9ELFFBQVEsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNuQixLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDWixNQUFNLFVBQVUsR0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUN0QyxPQUFPLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQyxDQUFDO1lBQ0QsTUFBTSxNQUFNLEdBQVcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoRCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUN4QixPQUFPLE1BQU0sQ0FBQztZQUNsQixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDakIsQ0FBQztRQUNELEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNaLE9BQU8sS0FBSyxDQUFDO1FBQ2pCLENBQUM7UUFDRCxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDWixNQUFNLElBQUksR0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuQyxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMxQixDQUFDO1FBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN6RSxDQUFDO0lBQ0wsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUYWJsZUNvbHVtblZhbHVlIH0gZnJvbSAnLi4vY29tcG9uZW50cy90YWJsZS90YWJsZS1kYXRhJztcblxuLyoqXG4gKiBDb252ZXJ0cyB0aGUgZ2l2ZW4gdGFibGUgY29sdW1uIHZhbHVlIHRvIGEgc3RyaW5nL251bWJlciBmb3Igc29ydGluZy5cbiAqIFRoaXMgYWxzbyBzdXBwb3J0cyBzdHJpbmcgZGF0ZXMsIGlmIHlvdSBlZy4gTmVlZGVkIHRvIGZvcm1hdCB0aGVtLlxuICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGNvbnZlcnQuXG4gKiBAcmV0dXJucyBBIHN0cmluZyBvciBhIG51bWJlciB0byBzb3J0IGJ5LlxuICogQHRocm93cyBXaGVuIGEgdmFsdWUgd2l0aCBhbiB1bmtub3duIHR5cGUgaGFzIGJlZW4gcHJvdmlkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWJsZUNvbHVtblZhbHVlVG9Tb3J0VmFsdWUodmFsdWU6IFRhYmxlQ29sdW1uVmFsdWUpOiBzdHJpbmcgfCBudW1iZXIge1xuICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgICAgIGNvbnN0IHN0cmluZ0RhdGU6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoIU51bWJlci5pc05hTihzdHJpbmdEYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nRGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBudW1iZXI6IG51bWJlciA9IE51bWJlci5wYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgICAgIGlmICghTnVtYmVyLmlzTmFOKG51bWJlcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdvYmplY3QnOiB7XG4gICAgICAgICAgICBjb25zdCBkYXRlOiBEYXRlID0gbmV3IERhdGUodmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgdHlwZSBmb3IgdGFibGUgdmFsdWU6ICR7dHlwZW9mIHZhbHVlfWApO1xuICAgICAgICB9XG4gICAgfVxufSJdfQ==
@@ -135,4 +135,4 @@ export class DateUtilities {
135
135
  || Number.isNaN(time.minutes);
136
136
  }
137
137
  }
138
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS51dGlsaXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy91dGlsaXRpZXMvZGF0ZS51dGlsaXRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVqRSxNQUFNLFNBQVMsR0FBVyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUEyQzlDOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixhQUFhO0lBRS9COztPQUVHO0lBQ0gsTUFBTSxDQUFDLGlCQUFpQixHQUEwQyxXQUFXLENBQUM7SUFFOUU7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBYztRQUN4QixPQUFPLEtBQWEsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQWtCLEVBQUUsRUFBRSxjQUEyQixFQUFFO1FBQ3RFLE1BQU0sR0FBRyxHQUEwQixDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBNEIsRUFBRSxDQUFDLENBQUM7UUFDL0YsS0FBSyxJQUFJLElBQUksR0FBUyxDQUFDLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLEtBQUssSUFBSSxNQUFNLEdBQVcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsTUFBTSxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUM5RCxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsSUFBWSxFQUFFLE1BQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3pGLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxH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QztJQUNqQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBVztRQUNsQyxPQUFPLElBQUksRUFBRSxLQUFLLElBQUksU0FBUztlQUN4QixPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUTtlQUM5QixNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7ZUFDeEIsSUFBSSxDQUFDLE9BQU8sSUFBSSxTQUFTO2VBQ3pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxRQUFRO2VBQ2hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRlRmlsdGVyRm4gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcblxuaW1wb3J0IHsgRHJvcGRvd25WYWx1ZSB9IGZyb20gJy4uL2RlY29yYXRvcnMvYmFzZS9kcm9wZG93bi12YWx1ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTG9kYXNoVXRpbGl0aWVzIH0gZnJvbSAnLi4vZW5jYXBzdWxhdGlvbi9sb2Rhc2gudXRpbGl0aWVzJztcbmltcG9ydCB7IGRlZmF1bHRUcnVlIH0gZnJvbSAnLi4vZnVuY3Rpb25zL2RlZmF1bHQtdHJ1ZS5mdW5jdGlvbic7XG5cbmNvbnN0IERBWV9JTl9NUzogbnVtYmVyID0gMTAwMCAqIDYwICogNjAgKiAyNDtcblxuLyoqXG4gKiBIZWxwZXIgdHlwZSBmb3IgaG91cnMgYW5kIG1pbnV0ZXMuXG4gKi9cbnR5cGUgRW51bWVyYXRlPE4gZXh0ZW5kcyBudW1iZXIsIEFjYyBleHRlbmRzIG51bWJlcltdID0gW10+ID0gQWNjWydsZW5ndGgnXSBleHRlbmRzIE5cbiAgICA/IEFjY1tudW1iZXJdXG4gICAgOiBFbnVtZXJhdGU8TiwgWy4uLkFjYywgQWNjWydsZW5ndGgnXV0+O1xuXG4vKipcbiAqIEhlbHBlciB0eXBlIGZvciBob3VycyBhbmQgbWludXRlcy5cbiAqL1xudHlwZSBSYW5nZTxGIGV4dGVuZHMgbnVtYmVyLCBUIGV4dGVuZHMgbnVtYmVyPiA9IEV4Y2x1ZGU8RW51bWVyYXRlPFQ+LCBFbnVtZXJhdGU8Rj4+O1xuXG4vKipcbiAqIFRoZSBwb3NzaWJsZSBob3VyIHZhbHVlcy4gUmFuZ2VzIGZyb20gMCB0byAyMy5cbiAqL1xuZXhwb3J0IHR5cGUgSG91ciA9IFJhbmdlPDAsIDI0PjtcblxuLyoqXG4gKiBUaGUgcG9zc2libGUgbWludXRlIHZhbHVlcy4gUmFuZ2VzIGZyb20gMCB0byA1OS5cbiAqL1xuZXhwb3J0IHR5cGUgTWludXRlID0gUmFuZ2U8MCwgNjA+O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB0aW1lIHZhbHVlIHdpdGggaG91cnMgYW5kIG1pbnV0ZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFRpbWUgPSB7XG4gICAgLyoqXG4gICAgICogVGhlIGhvdXJzIGluIHRoZSAyNCBob3VyIGZvcm1hdC5cbiAgICAgKi9cbiAgICBob3VyczogSG91cixcbiAgICAvKipcbiAgICAgKiBUaGUgbWludXRlcyBvZiB0aGUgdGltZS5cbiAgICAgKi9cbiAgICBtaW51dGVzOiBNaW51dGVcbn07XG5cbi8qKlxuICogVmFsaWQgc3RlcHMgZnJvbSBvbmUgdGltZSB2YWx1ZSB0byB0aGUgbmV4dC4gTmVlZHMgdG8gYmUgYWJsZSB0byBkaXZpZGUgNjAgbWludXRlcyB3aXRob3V0IHJlbWFpbmRlci5cbiAqL1xudHlwZSBNaW51dGVTdGVwcyA9IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDEwIHwgMTIgfCAxNSB8IDIwIHwgMzAgfCA2MDtcblxuLyoqXG4gKiBDb250YWlucyBIZWxwZXIgRnVuY3Rpb25zIGZvciBoYW5kbGluZyBkYXRlIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEYXRlVXRpbGl0aWVzIHtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IGZpbHRlciBmdW5jdGlvbiB0byB1c2VyIHdoZW4gbm9uZSB3YXMgcHJvdmlkZWQgYnkgdGhlIHVzZXIuXG4gICAgICovXG4gICAgc3RhdGljIGRlZmF1bHREYXRlRmlsdGVyOiBEYXRlRmlsdGVyRm48RGF0ZSB8IG51bGwgfCB1bmRlZmluZWQ+ID0gZGVmYXVsdFRydWU7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBnaXZlbiB2YWx1ZSBhcyBhIGRhdGUgdmFsdWUuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGdldCBhcyBhIGRhdGUuXG4gICAgICogQHJldHVybnMgVGhlIGdpdmVuIHZhbHVlIGFzIGEgZGF0ZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXNEYXRlKHZhbHVlOiB1bmtub3duKTogRGF0ZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBhcyBEYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRlZmF1bHQgdGltZXMgdXNlZCBieSB0aGUgRGF0ZVRpbWUgcGlja2VyIHdoZW4gbm90aGluZyBpcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuXG4gICAgICogQHBhcmFtIGZvcm1hdCAtIFRoZSB0aW1lIGZvcm1hdC4gRGVmYXVsdHMgdG8gMjQuXG4gICAgICogQHBhcmFtIG1pbnV0ZVN0ZXBzIC0gVGhlIHN0ZXBzIGZyb20gb25lIHRpbWUgdmFsdWUgdG8gdGhlIG5leHQuIERlZmF1bHRzIHRvIDMwLlxuICAgICAqIEByZXR1cm5zIFRpbWVzIGluIHRoZSAyNCBob3VyIGZvcm1hdCBmcm9tIDA6MDAgdW50aWwgMjM6MzAgaW4gMzAgbWludXRlIHN0ZXBzLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXREZWZhdWx0VGltZXMoZm9ybWF0OiAxMiB8IDI0ID0gMjQsIG1pbnV0ZVN0ZXBzOiBNaW51dGVTdGVwcyA9IDMwKTogRHJvcGRvd25WYWx1ZTxUaW1lPltdIHtcbiAgICAgICAgY29uc3QgcmVzOiBEcm9wZG93blZhbHVlPFRpbWU+W10gPSBbeyBkaXNwbGF5TmFtZTogJy0nLCB2YWx1ZTogdW5kZWZpbmVkIGFzIHVua25vd24gYXMgVGltZSB9XTtcbiAgICAgICAgZm9yIChsZXQgaG91cjogSG91ciA9IDA7IGhvdXIgPCAyNDsgaG91cisrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBtaW51dGU6IE1pbnV0ZSA9IDA7IG1pbnV0ZSA8IDYwOyBtaW51dGUgKz0gbWludXRlU3RlcHMpIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaChEYXRlVXRpbGl0aWVzLmdldFRpbWVEcm9wZG93blZhbHVlKGZvcm1hdCwgaG91ciBhcyBIb3VyLCBtaW51dGUgYXMgTWludXRlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRUaW1lRHJvcGRvd25WYWx1ZShmb3JtYXQ6IDEyIHwgMjQsIGhvdXI6IEhvdXIsIG1pbnV0ZTogTWludXRlKTogRHJvcGRvd25WYWx1ZTxUaW1lPiB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlIb3VyOiBudW1iZXIgPSBEYXRlVXRpbGl0aWVzLmdldEZvcm1hdHRlZEhvdXIoZm9ybWF0LCBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKGhvdXIpKTtcbiAgICAgICAgY29uc3QgZGlzcGxheU1pbnV0ZTogc3RyaW5nID0gRGF0ZVV0aWxpdGllcy5nZXRGb3JtYXR0ZWRNaW51dGUoZm9ybWF0LCBob3VyLCBtaW51dGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGAke2Rpc3BsYXlIb3VyfToke2Rpc3BsYXlNaW51dGV9YCxcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgaG91cnM6IGhvdXIsXG4gICAgICAgICAgICAgICAgbWludXRlczogbWludXRlXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0dGVkSG91cihmb3JtYXQ6IDEyIHwgMjQsIGhvdXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09IDEyICYmIGhvdXIgPiAxMikge1xuICAgICAgICAgICAgaG91ciAtPSAxMjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaG91cjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRGb3JtYXR0ZWRNaW51dGUoZm9ybWF0OiAxMiB8IDI0LCBob3VyOiBudW1iZXIsIG1pbnV0ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJlczogc3RyaW5nID0gYCR7bWludXRlfWA7XG4gICAgICAgIGlmIChmb3JtYXQgPT09IDEyKSB7XG4gICAgICAgICAgICByZXMgPSBob3VyID4gMTIgPyBgJHttaW51dGV9IFBNYCA6IGAke21pbnV0ZX0gQU1gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtaW51dGUudG9TdHJpbmcoKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJlcyA9ICcwJy5jb25jYXQocmVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIFRpbWUgb2JqZWN0IGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGRhdGUgdG8gZ2V0IHRoZSB0aW1lIG9iamVjdCBmcm9tLlxuICAgICAqIEByZXR1cm5zIFRoZSBUaW1lIG9iamVjdCBidWlsZCBmcm9tIHRoZSBkYXRlIHZhbHVlLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRUaW1lRnJvbURhdGUodmFsdWU/OiBEYXRlKTogVGltZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhvdXJzOiBuZXcgRGF0ZSh2YWx1ZSkuZ2V0SG91cnMoKSBhcyBIb3VyLFxuICAgICAgICAgICAgbWludXRlczogbmV3IERhdGUodmFsdWUpLmdldE1pbnV0ZXMoKSBhcyBNaW51dGVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkYXRlcyBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gZ2F0ZXMuIERvZXMgYWRkaXRpb25hbCBmaWx0ZXJpbmcgYmFzZWQgb24gdGhlIHByb3ZpZGVkIERhdGVSYW5nZSBtZXRhZGF0YS5cbiAgICAgKiBAcGFyYW0gc3RhcnREYXRlIC0gVGhlIHN0YXJ0IGRhdGUuXG4gICAgICogQHBhcmFtIGVuZERhdGUgLSBUaGUgZW5kIGRhdGUuXG4gICAgICogQHBhcmFtIGZpbHRlciAtIFRoZSBjdXN0b20gZmlsdGVyIGZyb20gdGhlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIEFsbCBkYXRlcyBiZXR3ZWVuIHRoZSB0d28gcHJvdmlkZWQgZGF0ZXMuIEluY2x1ZGVzIHN0YXJ0IGFuZCBlbmQgZGF0ZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0RGF0ZXNCZXR3ZWVuKHN0YXJ0RGF0ZTogRGF0ZSwgZW5kRGF0ZTogRGF0ZSwgZmlsdGVyPzogRGF0ZUZpbHRlckZuPERhdGU+KTogRGF0ZVtdIHtcbiAgICAgICAgY29uc3QgY2xvbmVkU3RhcnREYXRlOiBEYXRlID0gbmV3IERhdGUoc3RhcnREYXRlKTtcbiAgICAgICAgY29uc3QgcmVzOiBEYXRlW10gPSBbXTtcbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgY2xvbmVkU3RhcnREYXRlLmdldEZ1bGxZZWFyKCkgPCBlbmREYXRlLmdldEZ1bGxZZWFyKClcbiAgICAgICAgICAgIHx8IGNsb25lZFN0YXJ0RGF0ZS5nZXRNb250aCgpIDwgZW5kRGF0ZS5nZXRNb250aCgpXG4gICAgICAgICAgICB8fCBjbG9uZWRTdGFydERhdGUuZ2V0RGF0ZSgpIDw9IGVuZERhdGUuZ2V0RGF0ZSgpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmVzLnB1c2gobmV3IERhdGUoY2xvbmVkU3RhcnREYXRlKSk7XG4gICAgICAgICAgICBjbG9uZWRTdGFydERhdGUuc2V0VGltZShjbG9uZWRTdGFydERhdGUuZ2V0VGltZSgpICsgREFZX0lOX01TKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsdGVyID8gcmVzLmZpbHRlcihkID0+IGZpbHRlcihkKSkgOiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCB2YWxpZCB0aW1lcyBmb3IgdGhlIGRyb3Bkb3duIG9mIGEgZGF0ZXRpbWUgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIHRpbWVzIC0gQWxsIGdpdmVuIHRpbWVzIHRvIGZpbHRlci5cbiAgICAgKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIG9mIHRoZSBkYXRldGltZS5cbiAgICAgKiBAcGFyYW0gbWluIC0gVGhlIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbWluaW11bSB0aW1lLlxuICAgICAqIEBwYXJhbSBtYXggLSBUaGUgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIHRoZSBtYXhpbXVtIHRpbWUuXG4gICAgICogQHBhcmFtIGZpbHRlciAtIEEgZmlsdGVyIGZ1bmN0aW9uIHRvIGRvIG1vcmUgc3BlY2lmaWMgdGltZSBmaWx0ZXJpbmcuIFRoaXMgY291bGQgYmUgZS5nLiBUaGUgcmVtb3ZhbCBvZiBsdW5jaCBicmVha3MuXG4gICAgICogQHJldHVybnMgQWxsIHZhbGlkIGRyb3Bkb3duIHZhbHVlcyBmb3IgdGhlIGRhdGV0aW1lIHByb3BlcnR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRWYWxpZFRpbWVzRm9yRHJvcGRvd24oXG4gICAgICAgIHRpbWVzOiBEcm9wZG93blZhbHVlPFRpbWUgfCB1bmRlZmluZWQ+W10sXG4gICAgICAgIGRhdGU/OiBEYXRlLFxuICAgICAgICBtaW4/OiAoZGF0ZT86IERhdGUpID0+IFRpbWUsXG4gICAgICAgIG1heD86IChkYXRlPzogRGF0ZSkgPT4gVGltZSxcbiAgICAgICAgZmlsdGVyPzogKCh0aW1lOiBUaW1lKSA9PiBib29sZWFuKSB8ICgoKSA9PiBib29sZWFuKVxuICAgICk6IERyb3Bkb3duVmFsdWU8VGltZSB8IHVuZGVmaW5lZD5bXSB7XG4gICAgICAgIGlmIChtaW4pIHtcbiAgICAgICAgICAgIGNvbnN0IG1pblRpbWU6IFRpbWUgPSBtaW4oZGF0ZSk7XG4gICAgICAgICAgICB0aW1lcyA9IHRpbWVzLmZpbHRlcih0ID0+ICF0LnZhbHVlXG4gICAgICAgICAgICB8fCB0LnZhbHVlLmhvdXJzID4gbWluVGltZS5ob3Vyc1xuICAgICAgICAgICAgfHwgKFxuICAgICAgICAgICAgICAgIHQudmFsdWUuaG91cnMgPT09IG1pblRpbWUuaG91cnNcbiAgICAgICAgICAgICAgICAmJiB0LnZhbHVlLm1pbnV0ZXMgPj0gbWluVGltZS5taW51dGVzXG4gICAgICAgICAgICApKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWF4KSB7XG4gICAgICAgICAgICBjb25zdCBtYXhUaW1lOiBUaW1lID0gbWF4KGRhdGUpO1xuICAgICAgICAgICAgdGltZXMgPSB0aW1lcy5maWx0ZXIodCA9PiAhdC52YWx1ZVxuICAgICAgICAgICAgfHwgdC52YWx1ZS5ob3VycyA8IG1heFRpbWUuaG91cnNcbiAgICAgICAgICAgIHx8IChcbiAgICAgICAgICAgICAgICB0LnZhbHVlLmhvdXJzID09PSBtYXhUaW1lLmhvdXJzXG4gICAgICAgICAgICAgICAgJiYgdC52YWx1ZS5taW51dGVzIDw9IG1heFRpbWUubWludXRlc1xuICAgICAgICAgICAgKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgdGltZXMgPSB0aW1lcy5maWx0ZXIodCA9PiAhdC52YWx1ZSB8fCBmaWx0ZXIodC52YWx1ZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbWVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgdGltZSBvYmplY3QgaGFzIHByb2Nlc3NhYmxlIGhvdXJzIGFuZCBtaW51dGVzIHByb3BlcnRpZXMuXG4gICAgICogRG9lc24ndCBjaGVjayBjdXN0b20gdmFsaWRhdG9ycyBsaWtlIG1pbi9tYXggZnJvbSB0aGUgbWV0YWRhdGEgY29uZmlndXJhdGlvbi5cbiAgICAgKiBAcGFyYW0gdGltZSAtIFRoZSB0aW1lIHRvIGNoZWNrLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSB0aW1lIG9iamVjdCBpcyB1bnByb2Nlc3NhYmxlLlxuICAgICAqL1xuICAgIHN0YXRpYyB0aW1lSXNVbnByb2Nlc3NhYmxlKHRpbWU/OiBUaW1lKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aW1lPy5ob3VycyA9PSB1bmRlZmluZWRcbiAgICAgICAgICAgIHx8IHR5cGVvZiB0aW1lLmhvdXJzICE9PSAnbnVtYmVyJ1xuICAgICAgICAgICAgfHwgTnVtYmVyLmlzTmFOKHRpbWUuaG91cnMpXG4gICAgICAgICAgICB8fCB0aW1lLm1pbnV0ZXMgPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICB8fCB0eXBlb2YgdGltZS5taW51dGVzICE9PSAnbnVtYmVyJ1xuICAgICAgICAgICAgfHwgTnVtYmVyLmlzTmFOKHRpbWUubWludXRlcyk7XG4gICAgfVxufSJdfQ==
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS51dGlsaXRpZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtbWF0ZXJpYWwtZW50aXR5L3NyYy91dGlsaXRpZXMvZGF0ZS51dGlsaXRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ3BFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUVqRSxNQUFNLFNBQVMsR0FBVyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUEyQzlDOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixhQUFhO0lBRS9COztPQUVHO0lBQ0gsTUFBTSxDQUFDLGlCQUFpQixHQUEwQyxXQUFXLENBQUM7SUFFOUU7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBYztRQUN4QixPQUFPLEtBQWEsQ0FBQztJQUN6QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsZUFBZSxDQUFDLFNBQWtCLEVBQUUsRUFBRSxjQUEyQixFQUFFO1FBQ3RFLE1BQU0sR0FBRyxHQUEwQixDQUFDLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsU0FBNEIsRUFBRSxDQUFDLENBQUM7UUFDL0YsS0FBSyxJQUFJLElBQUksR0FBUyxDQUFDLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3pDLEtBQUssSUFBSSxNQUFNLEdBQVcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsTUFBTSxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUM5RCxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsSUFBWSxFQUFFLE1BQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3pGLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxH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QztJQUNqQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBVztRQUNsQyxPQUFPLElBQUksRUFBRSxLQUFLLElBQUksU0FBUztlQUN4QixPQUFPLElBQUksQ0FBQyxLQUFLLEtBQUssUUFBUTtlQUM5QixNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7ZUFDeEIsSUFBSSxDQUFDLE9BQU8sSUFBSSxTQUFTO2VBQ3pCLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxRQUFRO2VBQ2hDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEYXRlRmlsdGVyRm4gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcblxuaW1wb3J0IHsgRHJvcGRvd25WYWx1ZSB9IGZyb20gJy4uL2RlY29yYXRvcnMvYmFzZS9kcm9wZG93bi12YWx1ZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgTG9kYXNoVXRpbGl0aWVzIH0gZnJvbSAnLi4vZW5jYXBzdWxhdGlvbi9sb2Rhc2gudXRpbGl0aWVzJztcbmltcG9ydCB7IGRlZmF1bHRUcnVlIH0gZnJvbSAnLi4vZnVuY3Rpb25zL2RlZmF1bHQtdHJ1ZS5mdW5jdGlvbic7XG5cbmNvbnN0IERBWV9JTl9NUzogbnVtYmVyID0gMTAwMCAqIDYwICogNjAgKiAyNDtcblxuLyoqXG4gKiBIZWxwZXIgdHlwZSBmb3IgaG91cnMgYW5kIG1pbnV0ZXMuXG4gKi9cbnR5cGUgRW51bWVyYXRlPE4gZXh0ZW5kcyBudW1iZXIsIEFjYyBleHRlbmRzIG51bWJlcltdID0gW10+ID0gQWNjWydsZW5ndGgnXSBleHRlbmRzIE5cbiAgICA/IEFjY1tudW1iZXJdXG4gICAgOiBFbnVtZXJhdGU8TiwgWy4uLkFjYywgQWNjWydsZW5ndGgnXV0+O1xuXG4vKipcbiAqIEhlbHBlciB0eXBlIGZvciBob3VycyBhbmQgbWludXRlcy5cbiAqL1xudHlwZSBSYW5nZTxGIGV4dGVuZHMgbnVtYmVyLCBUIGV4dGVuZHMgbnVtYmVyPiA9IEV4Y2x1ZGU8RW51bWVyYXRlPFQ+LCBFbnVtZXJhdGU8Rj4+O1xuXG4vKipcbiAqIFRoZSBwb3NzaWJsZSBob3VyIHZhbHVlcy4gUmFuZ2VzIGZyb20gMCB0byAyMy5cbiAqL1xuZXhwb3J0IHR5cGUgSG91ciA9IFJhbmdlPDAsIDI0PjtcblxuLyoqXG4gKiBUaGUgcG9zc2libGUgbWludXRlIHZhbHVlcy4gUmFuZ2VzIGZyb20gMCB0byA1OS5cbiAqL1xuZXhwb3J0IHR5cGUgTWludXRlID0gUmFuZ2U8MCwgNjA+O1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYSB0aW1lIHZhbHVlIHdpdGggaG91cnMgYW5kIG1pbnV0ZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFRpbWUgPSB7XG4gICAgLyoqXG4gICAgICogVGhlIGhvdXJzIGluIHRoZSAyNCBob3VyIGZvcm1hdC5cbiAgICAgKi9cbiAgICBob3VyczogSG91cixcbiAgICAvKipcbiAgICAgKiBUaGUgbWludXRlcyBvZiB0aGUgdGltZS5cbiAgICAgKi9cbiAgICBtaW51dGVzOiBNaW51dGVcbn07XG5cbi8qKlxuICogVmFsaWQgc3RlcHMgZnJvbSBvbmUgdGltZSB2YWx1ZSB0byB0aGUgbmV4dC4gTmVlZHMgdG8gYmUgYWJsZSB0byBkaXZpZGUgNjAgbWludXRlcyB3aXRob3V0IHJlbWFpbmRlci5cbiAqL1xudHlwZSBNaW51dGVTdGVwcyA9IDEgfCAyIHwgMyB8IDQgfCA1IHwgNiB8IDEwIHwgMTIgfCAxNSB8IDIwIHwgMzAgfCA2MDtcblxuLyoqXG4gKiBDb250YWlucyBIZWxwZXIgRnVuY3Rpb25zIGZvciBoYW5kbGluZyBkYXRlIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEYXRlVXRpbGl0aWVzIHtcblxuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IGZpbHRlciBmdW5jdGlvbiB0byB1c2VyIHdoZW4gbm9uZSB3YXMgcHJvdmlkZWQgYnkgdGhlIHVzZXIuXG4gICAgICovXG4gICAgc3RhdGljIGRlZmF1bHREYXRlRmlsdGVyOiBEYXRlRmlsdGVyRm48RGF0ZSB8IG51bGwgfCB1bmRlZmluZWQ+ID0gZGVmYXVsdFRydWU7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBnaXZlbiB2YWx1ZSBhcyBhIGRhdGUgdmFsdWUuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIHZhbHVlIHRvIGdldCBhcyBhIGRhdGUuXG4gICAgICogQHJldHVybnMgVGhlIGdpdmVuIHZhbHVlIGFzIGEgZGF0ZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXNEYXRlKHZhbHVlOiB1bmtub3duKTogRGF0ZSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBhcyBEYXRlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGRlZmF1bHQgdGltZXMgdXNlZCBieSB0aGUgRGF0ZVRpbWUgcGlja2VyIHdoZW4gbm90aGluZyBpcyBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuXG4gICAgICogQHBhcmFtIGZvcm1hdCAtIFRoZSB0aW1lIGZvcm1hdC4gRGVmYXVsdHMgdG8gMjQuXG4gICAgICogQHBhcmFtIG1pbnV0ZVN0ZXBzIC0gVGhlIHN0ZXBzIGZyb20gb25lIHRpbWUgdmFsdWUgdG8gdGhlIG5leHQuIERlZmF1bHRzIHRvIDMwLlxuICAgICAqIEByZXR1cm5zIFRpbWVzIGluIHRoZSAyNCBob3VyIGZvcm1hdCBmcm9tIDA6MDAgdW50aWwgMjM6MzAgaW4gMzAgbWludXRlIHN0ZXBzLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXREZWZhdWx0VGltZXMoZm9ybWF0OiAxMiB8IDI0ID0gMjQsIG1pbnV0ZVN0ZXBzOiBNaW51dGVTdGVwcyA9IDMwKTogRHJvcGRvd25WYWx1ZTxUaW1lPltdIHtcbiAgICAgICAgY29uc3QgcmVzOiBEcm9wZG93blZhbHVlPFRpbWU+W10gPSBbeyBkaXNwbGF5TmFtZTogJy0nLCB2YWx1ZTogdW5kZWZpbmVkIGFzIHVua25vd24gYXMgVGltZSB9XTtcbiAgICAgICAgZm9yIChsZXQgaG91cjogSG91ciA9IDA7IGhvdXIgPCAyNDsgaG91cisrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBtaW51dGU6IE1pbnV0ZSA9IDA7IG1pbnV0ZSA8IDYwOyBtaW51dGUgKz0gbWludXRlU3RlcHMpIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaChEYXRlVXRpbGl0aWVzLmdldFRpbWVEcm9wZG93blZhbHVlKGZvcm1hdCwgaG91ciBhcyBIb3VyLCBtaW51dGUgYXMgTWludXRlKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRUaW1lRHJvcGRvd25WYWx1ZShmb3JtYXQ6IDEyIHwgMjQsIGhvdXI6IEhvdXIsIG1pbnV0ZTogTWludXRlKTogRHJvcGRvd25WYWx1ZTxUaW1lPiB7XG4gICAgICAgIGNvbnN0IGRpc3BsYXlIb3VyOiBudW1iZXIgPSBEYXRlVXRpbGl0aWVzLmdldEZvcm1hdHRlZEhvdXIoZm9ybWF0LCBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKGhvdXIpKTtcbiAgICAgICAgY29uc3QgZGlzcGxheU1pbnV0ZTogc3RyaW5nID0gRGF0ZVV0aWxpdGllcy5nZXRGb3JtYXR0ZWRNaW51dGUoZm9ybWF0LCBob3VyLCBtaW51dGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGAke2Rpc3BsYXlIb3VyfToke2Rpc3BsYXlNaW51dGV9YCxcbiAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgaG91cnM6IGhvdXIsXG4gICAgICAgICAgICAgICAgbWludXRlczogbWludXRlXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0Rm9ybWF0dGVkSG91cihmb3JtYXQ6IDEyIHwgMjQsIGhvdXI6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGlmIChmb3JtYXQgPT09IDEyICYmIGhvdXIgPiAxMikge1xuICAgICAgICAgICAgaG91ciAtPSAxMjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaG91cjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRGb3JtYXR0ZWRNaW51dGUoZm9ybWF0OiAxMiB8IDI0LCBob3VyOiBudW1iZXIsIG1pbnV0ZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJlczogc3RyaW5nID0gYCR7bWludXRlfWA7XG4gICAgICAgIGlmIChmb3JtYXQgPT09IDEyKSB7XG4gICAgICAgICAgICByZXMgPSBob3VyID4gMTIgPyBgJHttaW51dGV9IFBNYCA6IGAke21pbnV0ZX0gQU1gO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtaW51dGUudG9TdHJpbmcoKS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJlcyA9ICcwJy5jb25jYXQocmVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIFRpbWUgb2JqZWN0IGZyb20gdGhlIGdpdmVuIGRhdGUuXG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGRhdGUgdG8gZ2V0IHRoZSB0aW1lIG9iamVjdCBmcm9tLlxuICAgICAqIEByZXR1cm5zIFRoZSBUaW1lIG9iamVjdCBidWlsZCBmcm9tIHRoZSBkYXRlIHZhbHVlLlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRUaW1lRnJvbURhdGUodmFsdWU/OiBEYXRlKTogVGltZSB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhvdXJzOiBuZXcgRGF0ZSh2YWx1ZSkuZ2V0SG91cnMoKSBhcyBIb3VyLFxuICAgICAgICAgICAgbWludXRlczogbmV3IERhdGUodmFsdWUpLmdldE1pbnV0ZXMoKSBhcyBNaW51dGVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkYXRlcyBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gZ2F0ZXMuIERvZXMgYWRkaXRpb25hbCBmaWx0ZXJpbmcgYmFzZWQgb24gdGhlIHByb3ZpZGVkIERhdGVSYW5nZSBtZXRhZGF0YS5cbiAgICAgKiBAcGFyYW0gc3RhcnREYXRlIC0gVGhlIHN0YXJ0IGRhdGUuXG4gICAgICogQHBhcmFtIGVuZERhdGUgLSBUaGUgZW5kIGRhdGUuXG4gICAgICogQHBhcmFtIGZpbHRlciAtIFRoZSBjdXN0b20gZmlsdGVyIGZyb20gdGhlIG1ldGFkYXRhLlxuICAgICAqIEByZXR1cm5zIEFsbCBkYXRlcyBiZXR3ZWVuIHRoZSB0d28gcHJvdmlkZWQgZGF0ZXMuIEluY2x1ZGVzIHN0YXJ0IGFuZCBlbmQgZGF0ZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0RGF0ZXNCZXR3ZWVuKHN0YXJ0RGF0ZTogRGF0ZSwgZW5kRGF0ZTogRGF0ZSwgZmlsdGVyPzogRGF0ZUZpbHRlckZuPERhdGU+KTogRGF0ZVtdIHtcbiAgICAgICAgY29uc3QgY2xvbmVkU3RhcnREYXRlOiBEYXRlID0gbmV3IERhdGUoc3RhcnREYXRlKTtcbiAgICAgICAgY29uc3QgcmVzOiBEYXRlW10gPSBbXTtcbiAgICAgICAgd2hpbGUgKFxuICAgICAgICAgICAgY2xvbmVkU3RhcnREYXRlLmdldEZ1bGxZZWFyKCkgPCBlbmREYXRlLmdldEZ1bGxZZWFyKClcbiAgICAgICAgICAgIHx8IGNsb25lZFN0YXJ0RGF0ZS5nZXRNb250aCgpIDwgZW5kRGF0ZS5nZXRNb250aCgpXG4gICAgICAgICAgICB8fCBjbG9uZWRTdGFydERhdGUuZ2V0RGF0ZSgpIDw9IGVuZERhdGUuZ2V0RGF0ZSgpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmVzLnB1c2gobmV3IERhdGUoY2xvbmVkU3RhcnREYXRlKSk7XG4gICAgICAgICAgICBjbG9uZWRTdGFydERhdGUuc2V0VGltZShjbG9uZWRTdGFydERhdGUuZ2V0VGltZSgpICsgREFZX0lOX01TKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmlsdGVyID8gcmVzLmZpbHRlcihkID0+IGZpbHRlcihkKSkgOiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGFsbCB2YWxpZCB0aW1lcyBmb3IgdGhlIGRyb3Bkb3duIG9mIGEgZGF0ZXRpbWUgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIHRpbWVzIC0gQWxsIGdpdmVuIHRpbWVzIHRvIGZpbHRlci5cbiAgICAgKiBAcGFyYW0gZGF0ZSAtIFRoZSBkYXRlIG9mIHRoZSBkYXRldGltZS5cbiAgICAgKiBAcGFyYW0gbWluIC0gVGhlIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbWluaW11bSB0aW1lLlxuICAgICAqIEBwYXJhbSBtYXggLSBUaGUgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIHRoZSBtYXhpbXVtIHRpbWUuXG4gICAgICogQHBhcmFtIGZpbHRlciAtIEEgZmlsdGVyIGZ1bmN0aW9uIHRvIGRvIG1vcmUgc3BlY2lmaWMgdGltZSBmaWx0ZXJpbmcuIFRoaXMgY291bGQgYmUgZS5nLiBUaGUgcmVtb3ZhbCBvZiBsdW5jaCBicmVha3MuXG4gICAgICogQHJldHVybnMgQWxsIHZhbGlkIGRyb3Bkb3duIHZhbHVlcyBmb3IgdGhlIGRhdGV0aW1lIHByb3BlcnR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRWYWxpZFRpbWVzRm9yRHJvcGRvd24oXG4gICAgICAgIHRpbWVzOiBEcm9wZG93blZhbHVlPFRpbWUgfCB1bmRlZmluZWQ+W10sXG4gICAgICAgIGRhdGU/OiBEYXRlLFxuICAgICAgICBtaW4/OiAoZGF0ZT86IERhdGUpID0+IFRpbWUsXG4gICAgICAgIG1heD86IChkYXRlPzogRGF0ZSkgPT4gVGltZSxcbiAgICAgICAgZmlsdGVyPzogKCh0aW1lOiBUaW1lKSA9PiBib29sZWFuKSB8ICgoKSA9PiBib29sZWFuKVxuICAgICk6IERyb3Bkb3duVmFsdWU8VGltZSB8IHVuZGVmaW5lZD5bXSB7XG4gICAgICAgIGlmIChtaW4pIHtcbiAgICAgICAgICAgIGNvbnN0IG1pblRpbWU6IFRpbWUgPSBtaW4oZGF0ZSk7XG4gICAgICAgICAgICB0aW1lcyA9IHRpbWVzLmZpbHRlcih0ID0+ICF0LnZhbHVlXG4gICAgICAgICAgICAgICAgfHwgdC52YWx1ZS5ob3VycyA+IG1pblRpbWUuaG91cnNcbiAgICAgICAgICAgICAgICB8fCAoXG4gICAgICAgICAgICAgICAgICAgIHQudmFsdWUuaG91cnMgPT09IG1pblRpbWUuaG91cnNcbiAgICAgICAgICAgICAgICAgICAgJiYgdC52YWx1ZS5taW51dGVzID49IG1pblRpbWUubWludXRlc1xuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtYXgpIHtcbiAgICAgICAgICAgIGNvbnN0IG1heFRpbWU6IFRpbWUgPSBtYXgoZGF0ZSk7XG4gICAgICAgICAgICB0aW1lcyA9IHRpbWVzLmZpbHRlcih0ID0+ICF0LnZhbHVlXG4gICAgICAgICAgICAgICAgfHwgdC52YWx1ZS5ob3VycyA8IG1heFRpbWUuaG91cnNcbiAgICAgICAgICAgICAgICB8fCAoXG4gICAgICAgICAgICAgICAgICAgIHQudmFsdWUuaG91cnMgPT09IG1heFRpbWUuaG91cnNcbiAgICAgICAgICAgICAgICAgICAgJiYgdC52YWx1ZS5taW51dGVzIDw9IG1heFRpbWUubWludXRlc1xuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIHRpbWVzID0gdGltZXMuZmlsdGVyKHQgPT4gIXQudmFsdWUgfHwgZmlsdGVyKHQudmFsdWUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aW1lcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIHRpbWUgb2JqZWN0IGhhcyBwcm9jZXNzYWJsZSBob3VycyBhbmQgbWludXRlcyBwcm9wZXJ0aWVzLlxuICAgICAqIERvZXNuJ3QgY2hlY2sgY3VzdG9tIHZhbGlkYXRvcnMgbGlrZSBtaW4vbWF4IGZyb20gdGhlIG1ldGFkYXRhIGNvbmZpZ3VyYXRpb24uXG4gICAgICogQHBhcmFtIHRpbWUgLSBUaGUgdGltZSB0byBjaGVjay5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgdGltZSBvYmplY3QgaXMgdW5wcm9jZXNzYWJsZS5cbiAgICAgKi9cbiAgICBzdGF0aWMgdGltZUlzVW5wcm9jZXNzYWJsZSh0aW1lPzogVGltZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGltZT8uaG91cnMgPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICB8fCB0eXBlb2YgdGltZS5ob3VycyAhPT0gJ251bWJlcidcbiAgICAgICAgICAgIHx8IE51bWJlci5pc05hTih0aW1lLmhvdXJzKVxuICAgICAgICAgICAgfHwgdGltZS5taW51dGVzID09IHVuZGVmaW5lZFxuICAgICAgICAgICAgfHwgdHlwZW9mIHRpbWUubWludXRlcyAhPT0gJ251bWJlcidcbiAgICAgICAgICAgIHx8IE51bWJlci5pc05hTih0aW1lLm1pbnV0ZXMpO1xuICAgIH1cbn0iXX0=
@@ -86,17 +86,20 @@ export class EntityUtilities {
86
86
  const type = this.getPropertyType(entity, key);
87
87
  if (!await this.isEqual(entity[key], entityPriorChanges[key], metadata, type, http)) {
88
88
  switch (type) {
89
- case DecoratorTypes.OBJECT:
89
+ case DecoratorTypes.OBJECT: {
90
90
  // eslint-disable-next-line typescript/no-explicit-any
91
91
  res[key] = LodashUtilities.omit(entity[key], this.getOmitForCreate(entity[key]));
92
92
  break;
93
- case DecoratorTypes.ARRAY:
93
+ }
94
+ case DecoratorTypes.ARRAY: {
94
95
  res[key] = entity[key]
95
96
  .map(value => LodashUtilities.omit(value, this.getOmitForCreate(value)));
96
97
  break;
97
- default:
98
+ }
99
+ default: {
98
100
  res[key] = entity[key];
99
101
  break;
102
+ }
100
103
  }
101
104
  }
102
105
  }
@@ -175,14 +178,15 @@ export class EntityUtilities {
175
178
  const type = this.getPropertyType(target, key);
176
179
  let value = entity ? ReflectUtilities.get(entity, key) : undefined;
177
180
  switch (type) {
178
- case DecoratorTypes.OBJECT:
181
+ case DecoratorTypes.OBJECT: {
179
182
  // eslint-disable-next-line typescript/no-explicit-any
180
183
  const objectMetadata
181
184
  // eslint-disable-next-line typescript/no-explicit-any
182
185
  = this.getPropertyMetadata(target, key, DecoratorTypes.OBJECT);
183
186
  value = new objectMetadata.EntityClass(value);
184
187
  break;
185
- case DecoratorTypes.ARRAY:
188
+ }
189
+ case DecoratorTypes.ARRAY: {
186
190
  const inputArray = value;
187
191
  const resArray = [];
188
192
  if (inputArray) {
@@ -197,8 +201,10 @@ export class EntityUtilities {
197
201
  }
198
202
  value = resArray;
199
203
  break;
200
- default:
204
+ }
205
+ default: {
201
206
  break;
207
+ }
202
208
  }
203
209
  ReflectUtilities.set(target, key, value);
204
210
  }
@@ -267,28 +273,37 @@ export class EntityUtilities {
267
273
  return true;
268
274
  }
269
275
  switch (type) {
270
- case DecoratorTypes.DATE_RANGE:
276
+ case DecoratorTypes.DATE_RANGE: {
271
277
  return this.isEqualDateRange(value, valuePriorChanges, metadata.filter);
272
- case DecoratorTypes.DATE:
278
+ }
279
+ case DecoratorTypes.DATE: {
273
280
  return this.isEqualDate(value, valuePriorChanges);
274
- case DecoratorTypes.DATE_TIME:
281
+ }
282
+ case DecoratorTypes.DATE_TIME: {
275
283
  return this.isEqualDateTime(value, valuePriorChanges);
284
+ }
276
285
  case DecoratorTypes.ARRAY_DATE:
277
- case DecoratorTypes.ARRAY_DATE_TIME:
286
+ case DecoratorTypes.ARRAY_DATE_TIME: {
278
287
  return this.isEqualArrayDate(value, valuePriorChanges);
279
- case DecoratorTypes.ARRAY_DATE_RANGE:
288
+ }
289
+ case DecoratorTypes.ARRAY_DATE_RANGE: {
280
290
  return this.isEqualArrayDateRange(value, valuePriorChanges, metadata.filter);
291
+ }
281
292
  case DecoratorTypes.ARRAY_STRING_CHIPS:
282
- case DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS:
293
+ case DecoratorTypes.ARRAY_STRING_AUTOCOMPLETE_CHIPS: {
283
294
  return this.isEqualArrayString(value, valuePriorChanges);
295
+ }
284
296
  case DecoratorTypes.FILE_IMAGE:
285
- case DecoratorTypes.FILE_DEFAULT:
297
+ case DecoratorTypes.FILE_DEFAULT: {
286
298
  return this.isEqualFile(value, valuePriorChanges, metadata.multiple, http);
287
- case DecoratorTypes.CUSTOM:
299
+ }
300
+ case DecoratorTypes.CUSTOM: {
288
301
  // eslint-disable-next-line typescript/no-explicit-any
289
302
  return this.isEqualCustom(value, valuePriorChanges, metadata);
290
- default:
303
+ }
304
+ default: {
291
305
  return LodashUtilities.isEqual(value, valuePriorChanges);
306
+ }
292
307
  }
293
308
  }
294
309
  static differenceIsUndefinedAndEmptyString(value, valuePriorChanges) {
@@ -442,10 +457,10 @@ export class EntityUtilities {
442
457
  return metadataA.position.order - metadataB.position.order;
443
458
  }
444
459
  /**
445
- * Gets the bootstrap column classes for "lg", "md" and "sm".
446
- * @param entity - Entity to get the bootstrap column values of the key.
447
- * @param key - Key of the property to get bootstrap column values from.
448
- * @returns Bootstrap column classes.
460
+ * Gets the responsive column classes for "lg", "md" and "sm".
461
+ * @param entity - Entity to get the responsive column classes for.
462
+ * @param key - Key of the property to get the responsive column classes from.
463
+ * @returns Responsive column classes for large, middle and small displays.
449
464
  * @throws When no metadata for the given key was found.
450
465
  */
451
466
  static getWidthClasses(entity, key) {
@@ -453,7 +468,7 @@ export class EntityUtilities {
453
468
  if (!metadata) {
454
469
  throw new Error(`Could not get metadata for property "${key.toString()}"`);
455
470
  }
456
- return `col-lg-${metadata.defaultWidths[0]} col-md-${metadata.defaultWidths[1]} col-sm-${metadata.defaultWidths[2]}`;
471
+ return `lg:col-span-${metadata.defaultWidths[0]} md:col-span-${metadata.defaultWidths[1]} col-span-${metadata.defaultWidths[2]}`;
457
472
  }
458
473
  /**
459
474
  * Resets all changes on an entity.
@@ -593,4 +608,4 @@ export class EntityUtilities {
593
608
  return res;
594
609
  }
595
610
  }
596
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LnV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL3V0aWxpdGllcy9lbnRpdHkudXRpbGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBdUIscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUdqRCxPQUFPLEVBQWlCLGNBQWMsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBUXhGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQW9CdEU7O0dBRUc7QUFDSCxNQUFNLE9BQWdCLGVBQWU7SUFFakM7O09BRUc7SUFDSCxNQUFNLENBQVUsMEJBQTBCLEdBQVcscUJBQXFCLENBQUM7SUFFM0U7O09BRUc7SUFDSCxNQUFNLENBQVUsd0JBQXdCLEdBQVcsb0JBQW9CLENBQUM7SUFFeEU7O09BRUc7SUFDSCxNQUFNLENBQVUsd0JBQXdCLEdBQVcsb0JBQW9CLENBQUM7SUFFeEU7O09BRUc7SUFDSCxNQUFNLENBQVUsYUFBYSxHQUFXLFdBQVcsQ0FBQztJQUVwRDs7T0FFRztJQUNILE1BQU0sQ0FBVSxvQkFBb0IsR0FBVyxpQkFBaUIsQ0FBQztJQUVqRTs7T0FFRztJQUNILE1BQU0sQ0FBVSxRQUFRLEdBQVcsTUFBTSxDQUFDO0lBRTFDOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQWdELE1BQWtCO1FBQ3JGLE1BQU0sR0FBRyxHQUF5QixFQUFFLENBQUM7UUFDckMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN2QixNQUFNLFFBQVEs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O1lBQ2xCLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEVudmlyb25tZW50SW5qZWN0b3IsIHJ1bkluSW5qZWN0aW9uQ29udGV4dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0ZUZpbHRlckZuIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGF0ZXBpY2tlcic7XG5cbmltcG9ydCB7IERhdGVVdGlsaXRpZXMgfSBmcm9tICcuL2RhdGUudXRpbGl0aWVzJztcbmltcG9ydCB7IEZpbGVVdGlsaXRpZXMgfSBmcm9tICcuL2ZpbGUudXRpbGl0aWVzJztcbmltcG9ydCB7IEJhc2VFbnRpdHlUeXBlIH0gZnJvbSAnLi4vY2xhc3Nlcy9lbnRpdHkubW9kZWwnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlQXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCwgRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvYXJyYXkvYXJyYXktZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgRGVjb3JhdG9yVHlwZSwgRGVjb3JhdG9yVHlwZXMgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2Jhc2UvZGVjb3JhdG9yLXR5cGVzLmVudW0nO1xuaW1wb3J0IHsgUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvYmFzZS9wcm9wZXJ0eS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBDdXN0b21EZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvY3VzdG9tL2N1c3RvbS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEYXRlUmFuZ2VEYXRlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2RhdGUvZGF0ZS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEYXRlUmFuZ2UgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2RhdGUvZGF0ZS1kZWNvcmF0b3IuZGF0YSc7XG5pbXBvcnQgeyBEZWZhdWx0RmlsZURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9maWxlL2ZpbGUtZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgRmlsZURhdGEgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2ZpbGUvZmlsZS1kZWNvcmF0b3IuZGF0YSc7XG5pbXBvcnQgeyBEZWZhdWx0T2JqZWN0RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi9kZWNvcmF0b3JzL29iamVjdC9vYmplY3QtZGVjb3JhdG9yLWludGVybmFsLmRhdGEnO1xuaW1wb3J0IHsgTG9kYXNoVXRpbGl0aWVzIH0gZnJvbSAnLi4vZW5jYXBzdWxhdGlvbi9sb2Rhc2gudXRpbGl0aWVzJztcbmltcG9ydCB7IFJlZmxlY3RVdGlsaXRpZXMgfSBmcm9tICcuLi9lbmNhcHN1bGF0aW9uL3JlZmxlY3QudXRpbGl0aWVzJztcblxuLyoqXG4gKiBTaG93cyBpbmZvcm1hdGlvbiBhYm91dCBkaWZmZXJlbmNlcyBiZXR3ZWVuIHR3byBlbnRpdGllcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaWZmZXJlbmNlPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4ge1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgd2hlcmUgdGhlIHR3byBlbnRpdGllcyBoYXZlIGRpZmZlcmVudCB2YWx1ZXMuXG4gICAgICovXG4gICAga2V5OiBrZXlvZiBFbnRpdHlUeXBlLFxuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBiZWZvcmUgYW55IGNoYW5nZXMuXG4gICAgICovXG4gICAgYmVmb3JlOiB1bmtub3duLFxuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZhbHVlIGFmdGVyIGNoYW5nZXMuXG4gICAgICovXG4gICAgYWZ0ZXI6IHVua25vd25cbn1cblxuLyoqXG4gKiBDb250YWlucyBIZWxwZXJNZXRob2RzIGFyb3VuZCBoYW5kbGluZyBFbnRpdGllcyBhbmQgdGhlaXIgcHJvcGVydHktbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBFbnRpdHlVdGlsaXRpZXMge1xuXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBmb3IgYWxsIGtleXMgb2YgbWV0YWRhdGEgdGhhdCBzaG91bGQgYmUgc2V0IHRvIHVuZGVmaW5lZCB3aGVuIHRoZSBlbnRpdHkgZ2V0cyByZXNldC5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVhZG9ubHkgTUVUQURBVEFfS0VZU19UT19SRVNFVF9LRVk6IHN0cmluZyA9ICdtZXRhZGF0YUtleXNUb1Jlc2V0JztcblxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSB0aGF0IHNhdmVzIHRoZSBzaW5nbGUgcHJldmlldyBpbWFnZSB2YWx1ZSBvbiBpbWFnZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBTSU5HTEVfUFJFVklFV19JTUFHRV9LRVk6IHN0cmluZyA9ICdzaW5nbGVQcmV2aWV3SW1hZ2UnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIHRoYXQgc2F2ZXMgdGhlIG11bHRpIHByZXZpZXcgaW1hZ2VzIHZhbHVlIG9uIGltYWdlIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgc3RhdGljIHJlYWRvbmx5IE1VTFRJX1BSRVZJRVdfSU1BR0VTX0tFWTogc3RyaW5nID0gJ211bHRpUHJldmlld0ltYWdlcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciB0aGUgbWV0YWRhdGEgdGhhdCBzYXZlcyB0aGUgZmlsZW5hbWVzIHZhbHVlIG9uIGZpbGUgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVhZG9ubHkgRklMRU5BTUVTX0tFWTogc3RyaW5nID0gJ2ZpbGVOYW1lcyc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciB0aGUgbWV0YWRhdGEgdGhhdCBzYXZlcyB0aGUgY29uZmlybSBwYXNzd29yZCB2YWx1ZSBvbiBwYXNzd29yZCBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBDT05GSVJNX1BBU1NXT1JEX0tFWTogc3RyaW5nID0gJ2NvbmZpcm1QYXNzd29yZCc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciB0aGUgbWV0YWRhdGEgdGhhdCBzYXZlcyB0aGUgdGltZSB2YWx1ZSBvbiBkYXRlIHRpbWUgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVhZG9ubHkgVElNRV9LRVk6IHN0cmluZyA9ICd0aW1lJztcblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHByb3BlcnRpZXMgdG8gb21pdCB3aGVuIHVwZGF0aW5nIHRoZSBlbnRpdHkuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gZ2V0IHRoZSBwcm9wZXJ0aWVzIHdoaWNoIHNob3VsZCBiZSBsZWZ0IG91dCBmb3IgdXBkYXRpbmcgZnJvbS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcHJvcGVydGllcyB3aGljaCBzaG91bGQgYmUgbGVmdCBvdXQgZm9yIHVwZGF0aW5nIGFuIEVudGl0eS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0T21pdEZvclVwZGF0ZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgY29uc3QgcmVzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlbnRpdHkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+IHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGlmICghbWV0YWRhdGEgfHwgbWV0YWRhdGEub21pdEZvclVwZGF0ZSkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0aWVzIHRvIG9taXQgd2hlbiBjcmVhdGluZyBuZXcgZW50aXRpZXMuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gZ2V0IHRoZSBwcm9wZXJ0aWVzIHdoaWNoIHNob3VsZCBiZSBsZWZ0IG91dCBmb3IgY3JlYXRpbmcgZnJvbS5cbiAgICAgKiBAcmV0dXJucyBUaGUgcHJvcGVydGllcyB3aGljaCBzaG91bGQgYmUgbGVmdCBvdXQgZm9yIGNyZWF0aW5nIGEgbmV3IEVudGl0eS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0T21pdEZvckNyZWF0ZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgY29uc3QgcmVzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlbnRpdHkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+IHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGlmICghbWV0YWRhdGEgfHwgbWV0YWRhdGEub21pdEZvckNyZWF0ZSkge1xuICAgICAgICAgICAgICAgIHJlcy5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBlbnRpdHkgd2l0aG91dCB0aGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIG9taXR0ZWQgZm9yIGNyZWF0aW9uLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHdpdGggYWxsIGl0cyB2YWx1ZXMuXG4gICAgICogQHJldHVybnMgVGhlIHJlZHVjZWQgZW50aXR5IG9iamVjdC5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0V2l0aG91dE9taXRDcmVhdGVWYWx1ZXM8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihlbnRpdHk6IEVudGl0eVR5cGUpOiBQYXJ0aWFsPEVudGl0eVR5cGU+IHtcbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5vbWl0KGVudGl0eSwgdGhpcy5nZXRPbWl0Rm9yQ3JlYXRlKGVudGl0eSkpIGFzIFBhcnRpYWw8RW50aXR5VHlwZT47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gZW50aXR5IHdpdGhvdXQgdGhlIHZhbHVlcyB0aGF0IHNob3VsZCBiZSBvbWl0dGVkIGZvciB1cGRhdGluZy5cbiAgICAgKiBUaGlzIGFsc28gaGFuZGxlcyBvbWl0dGluZyBrZXlzIGZvciBAb2JqZWN0IG9yIEBhcnJheSB2YWx1ZXMgYW5kIHJlbW92ZXMgdmFsdWVzIHRoYXQgaGF2ZW4ndCBiZWVuIGNoYW5nZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB3aXRoIGFsbCBpdHMgdmFsdWVzLlxuICAgICAqIEBwYXJhbSBlbnRpdHlQcmlvckNoYW5nZXMgLSBUaGUgZW50aXR5IGJlZm9yZSBhbnkgY2hhbmdlcyB3ZXJlIGFwcGxpZWQuXG4gICAgICogQHBhcmFtIGh0dHAgLSBUaGUgYW5ndWxhciBIdHRwQ2xpZW50LiBVc2VkIHRvIGZldGNoIGZpbGVzLlxuICAgICAqIEBwYXJhbSBpbmplY3RvciAtIEFuIGFuZ3VsYXIgZW52aXJvbm1lbnQgaW5qZWN0b3IuXG4gICAgICogQHJldHVybnMgVGhlIHJlZHVjZWQgZW50aXR5IG9iamVjdC5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgZ2V0V2l0aG91dE9taXRVcGRhdGVWYWx1ZXM8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBlbnRpdHlQcmlvckNoYW5nZXM6IEVudGl0eVR5cGUsXG4gICAgICAgIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgICAgIGluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yXG4gICAgKTogUHJvbWlzZTxQYXJ0aWFsPEVudGl0eVR5cGU+PiB7XG4gICAgICAgIGNvbnN0IHJlczogUGFydGlhbDxFbnRpdHlUeXBlPiA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLmtleXNPZihlbnRpdHksIGluamVjdG9yLCBmYWxzZSwgdHJ1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+IHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGNvbnN0IHR5cGU6IERlY29yYXRvclR5cGVzIHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eVR5cGUoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLmlzRXF1YWwoZW50aXR5W2tleV0sIGVudGl0eVByaW9yQ2hhbmdlc1trZXldLCBtZXRhZGF0YSwgdHlwZSwgaHR0cCkpIHtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5PQkpFQ1Q6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZXNba2V5XSBhcyBvYmplY3QpID0gTG9kYXNoVXRpbGl0aWVzLm9taXQoZW50aXR5W2tleV0gYXMgYW55LCB0aGlzLmdldE9taXRGb3JDcmVhdGUoZW50aXR5W2tleV0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZOlxuICAgICAgICAgICAgICAgICAgICAgICAgKHJlc1trZXldIGFzIG9iamVjdFtdKSA9IChlbnRpdHlba2V5XSBhcyBvYmplY3RbXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKHZhbHVlID0+IExvZGFzaFV0aWxpdGllcy5vbWl0KHZhbHVlLCB0aGlzLmdldE9taXRGb3JDcmVhdGUodmFsdWUpKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1trZXldID0gZW50aXR5W2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGFsbCBkZWZhdWx0IHZhbHVlcyBvbiB0aGUgZ2l2ZW4gZW50aXR5LlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIHNldCB0aGUgZGVmYXVsdCB2YWx1ZXMgb24uXG4gICAgICovXG4gICAgc3RhdGljIHNldERlZmF1bHRWYWx1ZXM8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihlbnRpdHk6IEVudGl0eVR5cGUpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZW50aXR5KSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGtleSk7XG4gICAgICAgICAgICBpZiAobWV0YWRhdGE/LmRlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby11bnNhZmUtYXNzaWdubWVudCwgdHlwZXNjcmlwdC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICBlbnRpdHlba2V5XSA9IG1ldGFkYXRhLmRlZmF1bHQoKSBhcyBhbnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIGFsbCBwcm9wZXJ0aWVzIG9uIHRoZSBnaXZlbiBlbnRpdHkgd2hpY2ggYXJlIGZpbGVzLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHRvIGNoZWNrIGZvciBmaWxlIHByb3BlcnRpZXMuXG4gICAgICogQHBhcmFtIG9taXQgLSBXaGV0aGVyIHRvIGxlYXZlIG91dCB2YWx1ZXMgdGhhdCBhcmUgb21pdHRlZCBmb3IgY3JlYXRlIG9yIGRlbGV0ZS5cbiAgICAgKiBAcmV0dXJucyBUaGUga2V5cyBvZiBhbGwgZmlsZSBwcm9wZXJ0aWVzIG9uIHRoZSBnaXZlbiBlbnRpdHkuXG4gICAgICovXG4gICAgc3RhdGljIGdldEZpbGVQcm9wZXJ0aWVzPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgb21pdD86ICdjcmVhdGUnIHwgJ3VwZGF0ZSdcbiAgICApOiAoa2V5b2YgRW50aXR5VHlwZSlbXSB7XG4gICAgICAgIGNvbnN0IHJlczogKGtleW9mIEVudGl0eVR5cGUpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZW50aXR5KSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlOiBEZWNvcmF0b3JUeXBlcyB8IHVuZGVmaW5lZCA9IHRoaXMuZ2V0UHJvcGVydHlUeXBlKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGlmICh0eXBlID09PSBEZWNvcmF0b3JUeXBlcy5GSUxFX0RFRkFVTFQgfHwgdHlwZSA9PT0gRGVjb3JhdG9yVHlwZXMuRklMRV9JTUFHRSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzdHlsaXN0aWMvbWF4LWxlblxuICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+ID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KSBhcyBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+O1xuICAgICAgICAgICAgICAgIGlmICghKG1ldGFkYXRhLm9taXRGb3JDcmVhdGUgJiYgb21pdCA9PT0gJ2NyZWF0ZScpICYmICEobWV0YWRhdGEub21pdEZvclVwZGF0ZSAmJiBvbWl0ID09PSAndXBkYXRlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBtZXRhZGF0YSBpbmNsdWRlZCBpbiBhbiBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB3aXRoIHRoZSBwcm9wZXJ0eSB0byBnZXQgdGhlIG1ldGFkYXRhIGZyb20uXG4gICAgICogQHBhcmFtIHByb3BlcnR5S2V5IC0gVGhlIHByb3BlcnR5IG9uIHRoZSBnaXZlbiBFbnRpdHkgdG8gZ2V0IHRoZSBtZXRhZGF0YSBmcm9tLlxuICAgICAqIEBwYXJhbSB0eXBlIC0gRm9yIHNlY3VyZSBUeXBpbmcsIGRlZmluZXMgdGhlIHJldHVybmVkIFByb3BlcnR5Q29uZmlnLlxuICAgICAqIEByZXR1cm5zIFRoZSBtZXRhZGF0YSBvZiB0aGUgcHJvcGVydHkuXG4gICAgICogQHRocm93cyBXaGVuIG5vIG1ldGFkYXRhIGNhbiBiZSBmb3VuZCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRQcm9wZXJ0eU1ldGFkYXRhPFxuICAgICAgICBFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4sXG4gICAgICAgIFQgZXh0ZW5kcyBEZWNvcmF0b3JUeXBlcyxcbiAgICAgICAgQ3VzdG9tTWV0YWRhdGFUeXBlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbiAgICA+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIHByb3BlcnR5S2V5OiBrZXlvZiBFbnRpdHlUeXBlLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW51c2VkSW1wb3J0cy9uby11bnVzZWQtdmFyc1xuICAgICAgICB0eXBlPzogVFxuICAgICk6IERlY29yYXRvclR5cGU8VCwgQ3VzdG9tTWV0YWRhdGFUeXBlPiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhOiB1bmtub3duID0gUmVmbGVjdFV0aWxpdGllcy5nZXRNZXRhZGF0YSgnbWV0YWRhdGEnLCBlbnRpdHksIHByb3BlcnR5S2V5KTtcbiAgICAgICAgLy8gaWYgKG1ldGFkYXRhID09IG51bGwpIHtcbiAgICAgICAgLy8gICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgbWV0YWRhdGEgZm9yIHByb3BlcnR5ICR7U3RyaW5nKHByb3BlcnR5S2V5KX0gb24gdGhlIGVudGl0eSAke0pTT04uc3RyaW5naWZ5KGVudGl0eSl9YCk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgcmV0dXJuIG1ldGFkYXRhIGFzIERlY29yYXRvclR5cGU8VCwgQ3VzdG9tTWV0YWRhdGFUeXBlPiB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eS1tZXRhZGF0YS5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB3aXRoIHRoZSBwcm9wZXJ0eSB0byBnZXQgdGhlIHR5cGUgZnJvbS5cbiAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgLSBUaGUgcHJvcGVydHkgb24gdGhlIGdpdmVuIEVudGl0eSB0byBnZXQgdGhlIHR5cGUgZnJvbS5cbiAgICAgKiBAcmV0dXJucyBUaGUgdHlwZSBvZiB0aGUgbWV0YWRhdGEuXG4gICAgICogQHRocm93cyBXaWxsIHRocm93IGFuIGVycm9yIGlmIG5vIG1ldGFkYXRhIGNhbiBiZSBmb3VuZCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRQcm9wZXJ0eVR5cGU8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLCBwcm9wZXJ0eUtleToga2V5b2YgRW50aXR5VHlwZVxuICAgICk6IERlY29yYXRvclR5cGVzIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIFJlZmxlY3RVdGlsaXRpZXMuZ2V0TWV0YWRhdGEoJ3R5cGUnLCBlbnRpdHksIHByb3BlcnR5S2V5KSBhcyBEZWNvcmF0b3JUeXBlcyB8IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIGFsbCBwcm9wZXJ0eSB2YWx1ZXMgYmFzZWQgb24gYSBnaXZlbiBlbnRpdHkgZGF0YS1vYmplY3QuXG4gICAgICogQHBhcmFtIHRhcmdldCAtIFRoZSB0YXJnZXQgb2JqZWN0IHRoYXQgbmVlZHMgdG8gYmUgY29uc3RydWN0ZWQgKGlmIGNhbGxlZCBpbnNpZGUgYW4gRW50aXR5IGNvbnN0cnVjdG9yIGl0cyB1c3VhbGx5IHRoaXMpLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZGF0YSBvYmplY3QgdG8gZ2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZXMgZnJvbS5cbiAgICAgKiBAYWxpYXMgbmV3XG4gICAgICogQGFsaWFzIGJ1aWxkXG4gICAgICogQGFsaWFzIGNvbnN0cnVjdFxuICAgICAqL1xuICAgIHN0YXRpYyBuZXc8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+Pih0YXJnZXQ6IEVudGl0eVR5cGUsIGVudGl0eT86IEVudGl0eVR5cGUpOiB2b2lkIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlOiBEZWNvcmF0b3JUeXBlcyB8IHVuZGVmaW5lZCA9IHRoaXMuZ2V0UHJvcGVydHlUeXBlKHRhcmdldCwga2V5KTtcbiAgICAgICAgICAgIGxldCB2YWx1ZTogdW5rbm93biA9IGVudGl0eSA/IFJlZmxlY3RVdGlsaXRpZXMuZ2V0KGVudGl0eSwga2V5KSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuT0JKRUNUOlxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0TWV0YWRhdGE6IERlZmF1bHRPYmplY3REZWNvcmF0b3JDb25maWdJbnRlcm5hbDxhbnk+XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgICAgID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKHRhcmdldCwga2V5LCBEZWNvcmF0b3JUeXBlcy5PQkpFQ1QpIGFzIERlZmF1bHRPYmplY3REZWNvcmF0b3JDb25maWdJbnRlcm5hbDxhbnk+O1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG5ldyBvYmplY3RNZXRhZGF0YS5FbnRpdHlDbGFzcyh2YWx1ZSBhcyBvYmplY3QgfCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZOlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnB1dEFycmF5OiBFbnRpdHlUeXBlW10gfCB1bmRlZmluZWQgPSB2YWx1ZSBhcyBFbnRpdHlUeXBlW10gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc0FycmF5OiBFbnRpdHlUeXBlW10gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyYXlNZXRhZGF0YTogRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxhbnk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEodGFyZ2V0LCBrZXksIERlY29yYXRvclR5cGVzLkFSUkFZKSBhcyBFbnRpdHlBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsPGFueT47XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaW5wdXRBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1XaXRoTWV0YWRhdGE6IEVudGl0eVR5cGUgPSBuZXcgYXJyYXlNZXRhZGF0YS5FbnRpdHlDbGFzcyhpdGVtKSBhcyBFbnRpdHlUeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0FycmF5LnB1c2goaXRlbVdpdGhNZXRhZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSByZXNBcnJheTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBSZWZsZWN0VXRpbGl0aWVzLnNldCh0YXJnZXQsIGtleSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L21lbWJlci1vcmRlcmluZywganNkb2MvcmVxdWlyZS1qc2RvYywgdHlwZXNjcmlwdC90eXBlZGVmXG4gICAgc3RhdGljIGNvbnN0cnVjdCA9IHRoaXMubmV3O1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L21lbWJlci1vcmRlcmluZywganNkb2MvcmVxdWlyZS1qc2RvYywgdHlwZXNjcmlwdC90eXBlZGVmXG4gICAgc3RhdGljIGJ1aWxkID0gdGhpcy5uZXc7XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYW4gZW50aXR5IGlzIFwiZGlydHlcIiAoaWYgaXRzIHZhbHVlcyBoYXZlIGNoYW5nZWQpLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IGFmdGVyIGFsbCBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSBlbnRpdHlQcmlvckNoYW5nZXMgLSBUaGUgZW50aXR5IGJlZm9yZSB0aGUgY2hhbmdlcy5cbiAgICAgKiBAcGFyYW0gaHR0cCAtIFRoZSBhbmd1bGFyIEh0dHBDbGllbnQuIFVzZWQgdG8gZmV0Y2ggZmlsZXMuXG4gICAgICogQHBhcmFtIGluamVjdG9yIC0gQW4gYW5ndWxhciBlbnZpcm9ubWVudCBpbmplY3Rvci5cbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIG9yIG5vdCB0aGUgZW50aXR5IGlzIGRpcnR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBpc0RpcnR5PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgZW50aXR5UHJpb3JDaGFuZ2VzOiBFbnRpdHlUeXBlLFxuICAgICAgICBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICBpbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvclxuICAgICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAoIShlbnRpdHlQcmlvckNoYW5nZXMgYXMgRW50aXR5VHlwZSB8IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaWZmZXJlbmNlczogRGlmZmVyZW5jZTxFbnRpdHlUeXBlPltdID0gYXdhaXQgdGhpcy5nZXREaWZmZXJlbmNlc0JldHdlZW5FbnRpdGllcyhlbnRpdHksIGVudGl0eVByaW9yQ2hhbmdlcywgaHR0cCwgaW5qZWN0b3IpO1xuICAgICAgICByZXR1cm4gISFkaWZmZXJlbmNlcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgdHdvIGdpdmVuIGVudGl0aWVzLiBPbmx5IGNoZWNrcyBwcm9wZXJ0aWVzIHdoaWNoIGFyZSBkZWNvcmF0ZWQuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgYXMgaXMuXG4gICAgICogQHBhcmFtIGVudGl0eVByaW9yQ2hhbmdlcyAtIFRoZSBlbnRpdHkgYmVmb3JlIGFueSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlLlxuICAgICAqIEBwYXJhbSBodHRwIC0gVGhlIGFuZ3VsYXIgaHR0cCBjbGllbnQsIGlzIG5lZWRlZCB0byBjaGVjayBpZiBmaWxlcyBhcmUgZXF1YWwuXG4gICAgICogQHBhcmFtIGluamVjdG9yIC0gQW4gYW5ndWxhciBlbnZpcm9ubWVudCBpbmplY3Rvci5cbiAgICAgKiBAcmV0dXJucyBUaGUgZGlmZmVyZW5jZXMgYXMgYW4gYXJyYXkgY29uc2lzdGluZyBvZiBrZXksIGJlZm9yZSBhbmQgYWZ0ZXIuXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIGdldERpZmZlcmVuY2VzQmV0d2VlbkVudGl0aWVzPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgZW50aXR5UHJpb3JDaGFuZ2VzOiBFbnRpdHlUeXBlLFxuICAgICAgICBodHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICBpbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvclxuICAgICk6IFByb21pc2U8RGlmZmVyZW5jZTxFbnRpdHlUeXBlPltdPiB7XG4gICAgICAgIGNvbnN0IHJlczogRGlmZmVyZW5jZTxFbnRpdHlUeXBlPltdID0gW107XG4gICAgICAgIC8vIHZhbHVlcyB0aGF0IGFyZSBub3QgZGVjb3JhdGVkIGNhbiBiZSBpZ25vcmVkLCBhcyB0aGV5IGFyZSBub3QgdHJhbnNmZXJyZWQgdmlhIGh0dHAuXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMua2V5c09mKGVudGl0eSwgaW5qZWN0b3IpKSB7XG4gICAgICAgICAgICBjb25zdCB0eXBlOiBEZWNvcmF0b3JUeXBlcyB8IHVuZGVmaW5lZCA9IHRoaXMuZ2V0UHJvcGVydHlUeXBlKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+IHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGlmICghYXdhaXQgdGhpcy5pc0VxdWFsKGVudGl0eVtrZXldLCBlbnRpdHlQcmlvckNoYW5nZXNba2V5XSwgbWV0YWRhdGEsIHR5cGUsIGh0dHApKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgICAgICAgICAgYmVmb3JlOiBlbnRpdHlQcmlvckNoYW5nZXNba2V5XSxcbiAgICAgICAgICAgICAgICAgICAgYWZ0ZXI6IGVudGl0eVtrZXldXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCB0byBzZXQgYmxvYiBmaWxlIGRhdGEgc28gdGhhdCBpdCBpcyBvbmx5IHJlcXVlc3RlZCBvbmNlLlxuICAgICAgICAgICAgICAgIGVudGl0eVByaW9yQ2hhbmdlc1trZXldID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcChlbnRpdHlba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdHdvIGdpdmVuIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICogSXQgdXNlcyB0aGUgaXNFcXVhbCBtZXRob2QgZnJvbSBMb2Rhc2hVdGlsaXRpZXMgYW5kIGV4dGVuZHMgaXQgd2l0aCBmdW5jdGlvbmFsaXR5IHJlZ2FyZGluZyBEYXRlcy5cbiAgICAgKiBAcGFyYW0gdmFsdWUgLSBUaGUgdXBkYXRlZCB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gdmFsdWVQcmlvckNoYW5nZXMgLSBUaGUgdmFsdWUgYmVmb3JlIGFueSBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSBtZXRhZGF0YSAtIFRoZSBtZXRhZGF0YSBvZiB0aGUgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIHR5cGUgLSBUaGUgdHlwZSBvZiB0aGUgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIGh0dHAgLSBUaGUgYW5ndWxhciBIdHRwQ2xpZW50LiBVc2VkIHRvIGZldGNoIGZpbGVzLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbiB2YWx1ZXMgYXJlIGVxdWFsLlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBpc0VxdWFsKFxuICAgICAgICB2YWx1ZTogdW5rbm93bixcbiAgICAgICAgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24sXG4gICAgICAgIG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgICAgICB0eXBlOiBEZWNvcmF0b3JUeXBlcyB8IHVuZGVmaW5lZCxcbiAgICAgICAgaHR0cDogSHR0cENsaWVudFxuICAgICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBpZiAoKHZhbHVlID09IHVuZGVmaW5lZCAmJiB2YWx1ZVByaW9yQ2hhbmdlcyA9PSB1bmRlZmluZWQpXG4gICAgICAgICAgICB8fCB0aGlzLmRpZmZlcmVuY2VJc1VuZGVmaW5lZEFuZEVtcHR5QXJyYXkodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzKVxuICAgICAgICAgICAgfHwgdGhpcy5kaWZmZXJlbmNlSXNVbmRlZmluZWRBbmRFbXB0eVN0cmluZyh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkRBVEVfUkFOR0U6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNFcXVhbERhdGVSYW5nZShcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlUHJpb3JDaGFuZ2VzLFxuICAgICAgICAgICAgICAgICAgICAobWV0YWRhdGEgYXMgRGF0ZVJhbmdlRGF0ZURlY29yYXRvckNvbmZpZ0ludGVybmFsKS5maWx0ZXJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5EQVRFOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWxEYXRlKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcyk7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkRBVEVfVElNRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0VxdWFsRGF0ZVRpbWUodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURTpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURV9USU1FOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWxBcnJheURhdGUodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfREFURV9SQU5HRTpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0VxdWFsQXJyYXlEYXRlUmFuZ2UoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVByaW9yQ2hhbmdlcyxcbiAgICAgICAgICAgICAgICAgICAgKG1ldGFkYXRhIGFzIERhdGVSYW5nZUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpLmZpbHRlclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX1NUUklOR19DSElQUzpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfU1RSSU5HX0FVVE9DT01QTEVURV9DSElQUzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0VxdWFsQXJyYXlTdHJpbmcodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuRklMRV9JTUFHRTpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuRklMRV9ERUZBVUxUOlxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWxGaWxlKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcywgKG1ldGFkYXRhIGFzIERlZmF1bHRGaWxlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpLm11bHRpcGxlLCBodHRwKTtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQ1VTVE9NOlxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWxDdXN0b20odmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzLCBtZXRhZGF0YSBhcyBDdXN0b21EZWNvcmF0b3JDb25maWdJbnRlcm5hbDxhbnksIGFueSwgYW55LCBhbnk+KTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBkaWZmZXJlbmNlSXNVbmRlZmluZWRBbmRFbXB0eVN0cmluZyh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZVByaW9yQ2hhbmdlcyA9PSB1bmRlZmluZWQgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhdmFsdWUubGVuZ3RoKVxuICAgICAgICAgICAgfHwgKHZhbHVlID09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsdWVQcmlvckNoYW5nZXMgPT09ICdzdHJpbmcnICYmICF2YWx1ZVByaW9yQ2hhbmdlcy5sZW5ndGgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGRpZmZlcmVuY2VJc1VuZGVmaW5lZEFuZEVtcHR5QXJyYXkodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAodmFsdWVQcmlvckNoYW5nZXMgPT0gdW5kZWZpbmVkICYmIEFycmF5LmlzQXJyYXkodmFsdWUpICYmICF2YWx1ZS5sZW5ndGgpXG4gICAgICAgICAgICB8fCAodmFsdWUgPT0gdW5kZWZpbmVkICYmIEFycmF5LmlzQXJyYXkodmFsdWVQcmlvckNoYW5nZXMpICYmICF2YWx1ZVByaW9yQ2hhbmdlcy5sZW5ndGgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxBcnJheVN0cmluZyh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24pOiBib29sZWFuIHwgUHJvbWlzZUxpa2U8Ym9vbGVhbj4ge1xuICAgICAgICBsZXQgc3RyaW5nQXJyYXk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh2YWx1ZSBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChzdHJpbmdBcnJheSkge1xuICAgICAgICAgICAgc3RyaW5nQXJyYXkgPSBzdHJpbmdBcnJheS5zb3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN0cmluZ0FycmF5UHJpb3JDaGFuZ2VzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWVQcmlvckNoYW5nZXMgYXMgc3RyaW5nW10gfCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoc3RyaW5nQXJyYXlQcmlvckNoYW5nZXMpIHtcbiAgICAgICAgICAgIHN0cmluZ0FycmF5UHJpb3JDaGFuZ2VzID0gc3RyaW5nQXJyYXlQcmlvckNoYW5nZXMuc29ydCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBMb2Rhc2hVdGlsaXRpZXMuaXNFcXVhbChzdHJpbmdBcnJheSwgc3RyaW5nQXJyYXlQcmlvckNoYW5nZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxBcnJheURhdGUodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBuZXdWYWx1ZTogRGF0ZVtdIHwgdW5kZWZpbmVkID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh2YWx1ZSBhcyBEYXRlW10gfCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAobmV3VmFsdWUpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3VmFsdWUubWFwKHYgPT4gbmV3IERhdGUodikpLnNvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV3VmFsdWVQcmlvckNoYW5nZXM6IERhdGVbXSB8IHVuZGVmaW5lZCA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWVQcmlvckNoYW5nZXMgYXMgRGF0ZVtdIHwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKG5ld1ZhbHVlUHJpb3JDaGFuZ2VzKSB7XG4gICAgICAgICAgICBuZXdWYWx1ZVByaW9yQ2hhbmdlcyA9IG5ld1ZhbHVlUHJpb3JDaGFuZ2VzLm1hcCh2ID0+IG5ldyBEYXRlKHYpKS5zb3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKG5ld1ZhbHVlLCBuZXdWYWx1ZVByaW9yQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbEFycmF5RGF0ZVJhbmdlKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93biwgZmlsdGVyPzogRGF0ZUZpbHRlckZuPERhdGU+KTogYm9vbGVhbiB7XG4gICAgICAgIGxldCBkYXRlUmFuZ2VzOiBEYXRlUmFuZ2VbXSB8IHVuZGVmaW5lZCA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWUgYXMgRGF0ZVJhbmdlW10gfCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoZGF0ZVJhbmdlcykge1xuICAgICAgICAgICAgZGF0ZVJhbmdlcyA9IGRhdGVSYW5nZXMuc29ydCgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBkYXRlUmFuZ2VzUHJpb3JDaGFuZ2VzOiBEYXRlUmFuZ2VbXSB8IHVuZGVmaW5lZCA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWVQcmlvckNoYW5nZXMgYXMgRGF0ZVJhbmdlW10gfCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoZGF0ZVJhbmdlc1ByaW9yQ2hhbmdlcykge1xuICAgICAgICAgICAgZGF0ZVJhbmdlc1ByaW9yQ2hhbmdlcyA9IGRhdGVSYW5nZXNQcmlvckNoYW5nZXMuc29ydCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRlUmFuZ2VzPy5sZW5ndGggIT09IGRhdGVSYW5nZXNQcmlvckNoYW5nZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRlUmFuZ2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBkYXRlUmFuZ2VzPy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0VxdWFsRGF0ZVJhbmdlKGRhdGVSYW5nZXM/LltpXSwgZGF0ZVJhbmdlc1ByaW9yQ2hhbmdlcz8uW2ldLCBmaWx0ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbERhdGVUaW1lKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlOiBEYXRlID0gbmV3IERhdGUodmFsdWUgYXMgRGF0ZSk7XG4gICAgICAgIGNvbnN0IGRhdGVQcmlvckNoYW5nZXM6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBEYXRlKTtcbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKGRhdGUsIGRhdGVQcmlvckNoYW5nZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxEYXRlKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlOiBEYXRlID0gbmV3IERhdGUodmFsdWUgYXMgRGF0ZSk7XG4gICAgICAgIGNvbnN0IGRhdGVQcmlvckNoYW5nZXM6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBEYXRlKTtcbiAgICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgICAgZGF0ZVByaW9yQ2hhbmdlcy5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKGRhdGUsIGRhdGVQcmlvckNoYW5nZXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxEYXRlUmFuZ2UodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duLCBmaWx0ZXI/OiBEYXRlRmlsdGVyRm48RGF0ZT4pOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlOiBQYXJ0aWFsPERhdGVSYW5nZT4gfCB1bmRlZmluZWQgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHZhbHVlKSBhcyBQYXJ0aWFsPERhdGVSYW5nZT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChkYXRlUmFuZ2U/LnN0YXJ0KSB7XG4gICAgICAgICAgICBkYXRlUmFuZ2Uuc3RhcnQgPSBuZXcgRGF0ZShkYXRlUmFuZ2Uuc3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRlUmFuZ2U/LmVuZCkge1xuICAgICAgICAgICAgZGF0ZVJhbmdlLmVuZCA9IG5ldyBEYXRlKGRhdGVSYW5nZS5lbmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRlUmFuZ2U/LnN0YXJ0ICYmIGRhdGVSYW5nZS5lbmQpIHtcbiAgICAgICAgICAgIGRhdGVSYW5nZS52YWx1ZXMgPSBEYXRlVXRpbGl0aWVzLmdldERhdGVzQmV0d2VlbihcbiAgICAgICAgICAgICAgICBkYXRlUmFuZ2Uuc3RhcnQsXG4gICAgICAgICAgICAgICAgZGF0ZVJhbmdlLmVuZCxcbiAgICAgICAgICAgICAgICBmaWx0ZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN0eWxpc3RpYy9tYXgtbGVuXG4gICAgICAgIGNvbnN0IGRhdGVSYW5nZVByaW9yQ2hhbmdlczogUGFydGlhbDxEYXRlUmFuZ2U+IHwgdW5kZWZpbmVkID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh2YWx1ZVByaW9yQ2hhbmdlcykgYXMgUGFydGlhbDxEYXRlUmFuZ2U+IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzPy5zdGFydCkge1xuICAgICAgICAgICAgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLnN0YXJ0ID0gbmV3IERhdGUoZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLnN0YXJ0KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzPy5lbmQpIHtcbiAgICAgICAgICAgIGRhdGVSYW5nZVByaW9yQ2hhbmdlcy5lbmQgPSBuZXcgRGF0ZShkYXRlUmFuZ2VQcmlvckNoYW5nZXMuZW5kKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzPy5zdGFydCAmJiBkYXRlUmFuZ2VQcmlvckNoYW5nZXMuZW5kKSB7XG4gICAgICAgICAgICBkYXRlUmFuZ2VQcmlvckNoYW5nZXMudmFsdWVzID0gRGF0ZVV0aWxpdGllcy5nZXREYXRlc0JldHdlZW4oXG4gICAgICAgICAgICAgICAgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLnN0YXJ0LFxuICAgICAgICAgICAgICAgIGRhdGVSYW5nZVByaW9yQ2hhbmdlcy5lbmQsXG4gICAgICAgICAgICAgICAgZmlsdGVyXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBMb2Rhc2hVdGlsaXRpZXMuaXNFcXVhbChkYXRlUmFuZ2UsIGRhdGVSYW5nZVByaW9yQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgLy8gVE9ETzogRmluZCBhIHdheSB0byB1c2UgYmxvYnMgd2l0aCBqZXN0XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc29uYXIvY29nbml0aXZlLWNvbXBsZXhpdHlcbiAgICBwcml2YXRlIHN0YXRpYyBhc3luYyBpc0VxdWFsRmlsZSh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24sIG11bHRpcGxlOiBib29sZWFuLCBodHRwOiBIdHRwQ2xpZW50KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZVByaW9yQ2hhbmdlcyA9PSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlUHJpb3JDaGFuZ2VzID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZpbGVzOiBGaWxlRGF0YVtdID0gbXVsdGlwbGUgPyAodmFsdWUgYXMgRmlsZURhdGFbXSkuc29ydCgpIDogW3ZhbHVlIGFzIEZpbGVEYXRhXS5zb3J0KCk7XG4gICAgICAgIGNvbnN0IGZpbGVzUHJpb3JDaGFuZ2VzOiBGaWxlRGF0YVtdID0gbXVsdGlwbGUgPyAodmFsdWVQcmlvckNoYW5nZXMgYXMgRmlsZURhdGFbXSkuc29ydCgpIDogW3ZhbHVlUHJpb3JDaGFuZ2VzIGFzIEZpbGVEYXRhXS5zb3J0KCk7XG4gICAgICAgIGlmIChmaWxlcy5sZW5ndGggIT09IGZpbGVzUHJpb3JDaGFuZ2VzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gY2hlY2tzIHRoaXMgYmVmb3JlIGFjdHVhbGx5IGdldHRpbmcgYW55IGZpbGVzIGR1ZSB0byBwZXJmb3JtYW5jZSByZWFzb25zLlxuICAgICAgICAgICAgaWYgKCFMb2Rhc2hVdGlsaXRpZXMuaXNFcXVhbChMb2Rhc2hVdGlsaXRpZXMub21pdChmaWxlc1tpXSwgJ2ZpbGUnKSwgTG9kYXNoVXRpbGl0aWVzLm9taXQoZmlsZXNQcmlvckNoYW5nZXNbaV0sICdmaWxlJykpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZpbGVzUHJpb3JDaGFuZ2VzW2ldLmZpbGUgJiYgIWZpbGVzW2ldLmZpbGUpIHtcbiAgICAgICAgICAgICAgICBmaWxlc1tpXSA9IGF3YWl0IEZpbGVVdGlsaXRpZXMuZ2V0RmlsZURhdGEoZmlsZXNbaV0sIGh0dHApO1xuICAgICAgICAgICAgICAgIHZhbHVlID0gZmlsZXNbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsZXNbaV0uZmlsZSAmJiAhZmlsZXNQcmlvckNoYW5nZXNbaV0uZmlsZSkge1xuICAgICAgICAgICAgICAgIGZpbGVzUHJpb3JDaGFuZ2VzW2ldID0gYXdhaXQgRmlsZVV0aWxpdGllcy5nZXRGaWxlRGF0YShmaWxlc1ByaW9yQ2hhbmdlc1tpXSwgaHR0cCk7XG4gICAgICAgICAgICAgICAgdmFsdWVQcmlvckNoYW5nZXMgPSBmaWxlc1ByaW9yQ2hhbmdlc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwoYXdhaXQgZmlsZXNbaV0uZmlsZT8udGV4dCgpLCBhd2FpdCBmaWxlc1ByaW9yQ2hhbmdlc1tpXS5maWxlPy50ZXh0KCkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzRXF1YWxDdXN0b20oXG4gICAgICAgIHZhbHVlOiB1bmtub3duLFxuICAgICAgICB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bixcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgIG1ldGFkYXRhOiBDdXN0b21EZWNvcmF0b3JDb25maWdJbnRlcm5hbDxhbnksIGFueSwgYW55LCBhbnk+XG4gICAgKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBtZXRhZGF0YS5pc0VxdWFsKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcywgbWV0YWRhdGEpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbXBhcmUgZnVuY3Rpb24gZm9yIHNvcnRpbmcgZW50aXR5IGtleXMgYnkgdGhlaXIgb3JkZXIgdmFsdWUuXG4gICAgICogQHBhcmFtIGEgLSBGaXJzdCBrZXkgb2YgZW50aXR5LlxuICAgICAqIEBwYXJhbSBiIC0gU2Vjb25kIGtleSBvZiBlbnRpdHkuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIEN1cnJlbnQgZW50aXR5ICh1c2VkIHRvIGdldCBtZXRhZGF0YSBvZiBlbnRpdHkga2V5cykuXG4gICAgICogQHJldHVybnMgMCBpZiBib3RoIHZhbHVlcyBoYXZlIHRoZSBzYW1lIG9yZGVyLCBhIG5lZ2F0aXZlIHZhbHVlIGlmICdhJyBjb21lcyBiZWZvcmUgJ2InLCBhIHBvc2l0aXZlIHZhbHVlIGlmICdhJyBjb21lcyBiZWhpbmQgJ2InLlxuICAgICAqL1xuICAgIHN0YXRpYyBjb21wYXJlT3JkZXI8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgYToga2V5b2YgRW50aXR5VHlwZSxcbiAgICAgICAgYjoga2V5b2YgRW50aXR5VHlwZSxcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlXG4gICAgKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGFBOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+IHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgYSk7XG4gICAgICAgIGNvbnN0IG1ldGFkYXRhQjogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGIpO1xuXG4gICAgICAgIGlmICghbWV0YWRhdGFBIHx8ICFtZXRhZGF0YUIpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGFkYXRhQS5wb3NpdGlvbi5vcmRlciA9PT0gLTEpIHtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YUIucG9zaXRpb24ub3JkZXIgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXRhZGF0YUIucG9zaXRpb24ub3JkZXIgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1ldGFkYXRhQS5wb3NpdGlvbi5vcmRlciAtIG1ldGFkYXRhQi5wb3NpdGlvbi5vcmRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBib290c3RyYXAgY29sdW1uIGNsYXNzZXMgZm9yIFwibGdcIiwgXCJtZFwiIGFuZCBcInNtXCIuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIEVudGl0eSB0byBnZXQgdGhlIGJvb3RzdHJhcCBjb2x1bW4gdmFsdWVzIG9mIHRoZSBrZXkuXG4gICAgICogQHBhcmFtIGtleSAtIEtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0IGJvb3RzdHJhcCBjb2x1bW4gdmFsdWVzIGZyb20uXG4gICAgICogQHJldHVybnMgQm9vdHN0cmFwIGNvbHVtbiBjbGFzc2VzLlxuICAgICAqIEB0aHJvd3MgV2hlbiBubyBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIGtleSB3YXMgZm91bmQuXG4gICAgICovXG4gICAgc3RhdGljIGdldFdpZHRoQ2xhc3NlczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSwga2V5OiBrZXlvZiBFbnRpdHlUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICBpZiAoIW1ldGFkYXRhKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgbWV0YWRhdGEgZm9yIHByb3BlcnR5IFwiJHtrZXkudG9TdHJpbmcoKX1cImApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgY29sLWxnLSR7bWV0YWRhdGEuZGVmYXVsdFdpZHRoc1swXX0gY29sLW1kLSR7bWV0YWRhdGEuZGVmYXVsdFdpZHRoc1sxXX0gY29sLXNtLSR7bWV0YWRhdGEuZGVmYXVsdFdpZHRoc1syXX1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyBhbGwgY2hhbmdlcyBvbiBhbiBlbnRpdHkuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gcmVzZXQuXG4gICAgICogQHBhcmFtIGVudGl0eVByaW9yQ2hhbmdlcyAtIFRoZSBlbnRpdHkgYmVmb3JlIGFueSBjaGFuZ2VzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZXNldENoYW5nZXNPbkVudGl0eTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSwgZW50aXR5UHJpb3JDaGFuZ2VzOiBFbnRpdHlUeXBlKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVudGl0eVByaW9yQ2hhbmdlcykge1xuICAgICAgICAgICAgUmVmbGVjdFV0aWxpdGllcy5zZXQoZW50aXR5LCBrZXksIFJlZmxlY3RVdGlsaXRpZXMuZ2V0KGVudGl0eVByaW9yQ2hhbmdlcywga2V5KSk7XG4gICAgICAgICAgICBpZiAoUmVmbGVjdFV0aWxpdGllcy5oYXNNZXRhZGF0YSh0aGlzLk1FVEFEQVRBX0tFWVNfVE9fUkVTRVRfS0VZLCBlbnRpdHksIGtleSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGsgb2YgKFJlZmxlY3RVdGlsaXRpZXMuZ2V0TWV0YWRhdGEodGhpcy5NRVRBREFUQV9LRVlTX1RPX1JFU0VUX0tFWSwgZW50aXR5LCBrZXkpIGFzIHN0cmluZ1tdKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoUmVmbGVjdFV0aWxpdGllcy5oYXNNZXRhZGF0YShrLCBlbnRpdHksIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3RVdGlsaXRpZXMuZGVmaW5lTWV0YWRhdGEoaywgdW5kZWZpbmVkLCBlbnRpdHksIGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRFbnRpdHlSb3dzPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgdGFiOiBudW1iZXIsXG4gICAgICAgIGhpZGVPbWl0Rm9yQ3JlYXRlOiBib29sZWFuLFxuICAgICAgICBoaWRlT21pdEZvckVkaXQ6IGJvb2xlYW4sXG4gICAgICAgIGFkZGl0aW9uYWxPbWl0VmFsdWVzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSxcbiAgICAgICAgaW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3JcbiAgICApOiBFbnRpdHlSb3c8RW50aXR5VHlwZT5bXSB7XG4gICAgICAgIGNvbnN0IHJlczogRW50aXR5Um93PEVudGl0eVR5cGU+W10gPSBbXTtcblxuICAgICAgICBjb25zdCBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IHRoaXMua2V5c09mKGVudGl0eSwgaW5qZWN0b3IsIGhpZGVPbWl0Rm9yQ3JlYXRlLCBoaWRlT21pdEZvckVkaXQpXG4gICAgICAgICAgICAuZmlsdGVyKGsgPT4gIWFkZGl0aW9uYWxPbWl0VmFsdWVzLmluY2x1ZGVzKGspKTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZSb3dzOiBudW1iZXIgPSB0aGlzLmdldE51bWJlck9mUm93czxFbnRpdHlUeXBlPihrZXlzLCBlbnRpdHksIHRhYik7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPD0gbnVtYmVyT2ZSb3dzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdzogRW50aXR5Um93PEVudGl0eVR5cGU+ID0ge1xuICAgICAgICAgICAgICAgIHJvdzogaSxcbiAgICAgICAgICAgICAgICBrZXlzOiB0aGlzLmdldEtleXNGb3JSb3c8RW50aXR5VHlwZT4oa2V5cywgZW50aXR5LCBpLCB0YWIpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzLnB1c2gocm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdldEtleXNGb3JSb3c8RW50aXR5VHlwZT4oa2V5cywgZW50aXR5LCAtMSwgdGFiKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RSb3c6IEVudGl0eVJvdzxFbnRpdHlUeXBlPiA9IHtcbiAgICAgICAgICAgICAgICByb3c6IG51bWJlck9mUm93cyArIDEsXG4gICAgICAgICAgICAgICAga2V5czogdGhpcy5nZXRLZXlzRm9yUm93PEVudGl0eVR5cGU+KGtleXMsIGVudGl0eSwgLTEsIHRhYilcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXMucHVzaChsYXN0Um93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdGFicyB0aGF0IGFyZSB1c2VkIHRvIGRpc3BsYXkgdGhlIGdpdmVuIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBnZXQgdGhlIHJvd3MgZnJvbS5cbiAgICAgKiBAcGFyYW0gaW5qZWN0b3IgLSBBbiBhbmd1bGFyIGVudmlyb25tZW50IGluamVjdG9yLlxuICAgICAqIEBwYXJhbSBoaWRlT21pdEZvckNyZWF0ZSAtIFdoZXRoZXIgb3Igbm90IGtleXMgd2l0aCB0aGUgbWV0YWRhdGEgb21pdEZvckNyZWF0ZSBzaG91bGQgYmUgZmlsdGVyZWQgb3V0LlxuICAgICAqIEBwYXJhbSBoaWRlT21pdEZvckVkaXQgLSBXaGV0aGVyIG9yIG5vdCBrZXlzIHdpdGggdGhlIG1ldGFkYXRhIG9taXRGb3JVcGRhdGUgc2hvdWxkIGJlIGZpbHRlcmVkIG91dC5cbiAgICAgKiBAcGFyYW0gYWRkaXRpb25hbE9taXRLZXlzIC0gQWRkaXRpb25hbCBvbWl0IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyBUaGUgc29ydGVkIFRhYnMgY29udGFpbmluZyB0aGUgcm93cyBhbmQgdGhlIGtleXMgdG8gZGlzcGxheSBpbiB0aGF0IHJvdy5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0RW50aXR5VGFiczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIGluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgICAgICBoaWRlT21pdEZvckNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgICAgICBoaWRlT21pdEZvckVkaXQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgYWRkaXRpb25hbE9taXRLZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFtdXG4gICAgKTogRW50aXR5VGFiPEVudGl0eVR5cGU+W10ge1xuICAgICAgICBjb25zdCByZXM6IEVudGl0eVRhYjxFbnRpdHlUeXBlPltdID0gW107XG4gICAgICAgIGNvbnN0IGtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gdGhpcy5rZXlzT2YoZW50aXR5LCBpbmplY3RvciwgaGlkZU9taXRGb3JDcmVhdGUsIGhpZGVPbWl0Rm9yRWRpdClcbiAgICAgICAgICAgIC5maWx0ZXIoayA9PiAhYWRkaXRpb25hbE9taXRLZXlzLmluY2x1ZGVzKGspKTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZUYWJzOiBudW1iZXIgPSB0aGlzLmdldE51bWJlck9mVGFiczxFbnRpdHlUeXBlPihrZXlzLCBlbnRpdHkpO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0VGFiUm93czogRW50aXR5Um93PEVudGl0eVR5cGU+W10gPSB0aGlzLmdldEVudGl0eVJvd3M8RW50aXR5VHlwZT4oXG4gICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgICAtMSxcbiAgICAgICAgICAgIGhpZGVPbWl0Rm9yQ3JlYXRlLFxuICAgICAgICAgICAgaGlkZU9taXRGb3JFZGl0LFxuICAgICAgICAgICAgYWRkaXRpb25hbE9taXRLZXlzLFxuICAgICAgICAgICAgaW5qZWN0b3JcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGZpcnN0VGFiUm93cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0VGFiOiBFbnRpdHlUYWI8RW50aXR5VHlwZT4gPSB7XG4gICAgICAgICAgICAgICAgdGFiTmFtZTogdGhpcy5nZXRGaXJzdFRhYk5hbWUoZW50aXR5KSxcbiAgICAgICAgICAgICAgICB0YWI6IC0xLFxuICAgICAgICAgICAgICAgIHJvd3M6IGZpcnN0VGFiUm93c1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcy5wdXNoKGZpcnN0VGFiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDI7IGkgPD0gbnVtYmVyT2ZUYWJzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd3M6IEVudGl0eVJvdzxFbnRpdHlUeXBlPltdID0gdGhpcy5nZXRFbnRpdHlSb3dzPEVudGl0eVR5cGU+KFxuICAgICAgICAgICAgICAgIGVudGl0eSwgaSwgaGlkZU9taXRGb3JDcmVhdGUsIGhpZGVPbWl0Rm9yRWRpdCwgYWRkaXRpb25hbE9taXRLZXlzLCBpbmplY3RvclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChyb3dzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYjogRW50aXR5VGFiPEVudGl0eVR5cGU+ID0ge1xuICAgICAgICAgICAgICAgICAgICB0YWJOYW1lOiB0aGlzLmdldFRhYk5hbWUoZW50aXR5LCBpKSxcbiAgICAgICAgICAgICAgICAgICAgdGFiOiBpLFxuICAgICAgICAgICAgICAgICAgICByb3dzOiByb3dzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXMucHVzaCh0YWIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRLZXlzRm9yUm93PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdLFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIHJvdzogbnVtYmVyLFxuICAgICAgICB0YWI6IG51bWJlclxuICAgICk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgcmV0dXJuIGtleXNcbiAgICAgICAgICAgIC5maWx0ZXIoayA9PiB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKT8ucG9zaXRpb24ucm93ID09PSByb3cpXG4gICAgICAgICAgICAuZmlsdGVyKGsgPT4gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgayk/LnBvc2l0aW9uLnRhYiA9PT0gdGFiKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IHRoaXMuY29tcGFyZU9yZGVyKGEsIGIsIGVudGl0eSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldE51bWJlck9mUm93czxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSxcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICB0YWI6IG51bWJlclxuICAgICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAoa2V5c1xuICAgICAgICAgICAgLmZpbHRlcihrID0+IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGspPy5wb3NpdGlvbi50YWIgPT09IHRhYilcbiAgICAgICAgICAgIC5tYXAoayA9PiB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKT8ucG9zaXRpb24ucm93KSBhcyBudW1iZXJbXSlcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhID4gYiA/IC0xIDogMSlbMF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0TnVtYmVyT2ZUYWJzPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oa2V5czogKGtleW9mIEVudGl0eVR5cGUpW10sIGVudGl0eTogRW50aXR5VHlwZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAoa2V5c1xuICAgICAgICAgICAgLmZpbHRlcihrID0+IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGspICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgIC5tYXAoayA9PiB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKT8ucG9zaXRpb24udGFiKSBhcyBudW1iZXJbXSlcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhID4gYiA/IC0xIDogMSlbMF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0VGFiTmFtZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSwgdGFiOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwcm92aWRlZFRhYk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IFJlZmxlY3RVdGlsaXRpZXMub3duS2V5cyhlbnRpdHkpXG4gICAgICAgICAgICAubWFwKGsgPT4gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgaykpXG4gICAgICAgICAgICAuZmluZChtID0+IG0/LnBvc2l0aW9uLnRhYiA9PT0gdGFiICYmIG0ucG9zaXRpb24udGFiTmFtZSk/LnBvc2l0aW9uLnRhYk5hbWU7XG4gICAgICAgIHJldHVybiBwcm92aWRlZFRhYk5hbWUgPz8gYFRhYiAke3RhYn1gO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldEZpcnN0VGFiTmFtZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVkVGFiTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gUmVmbGVjdFV0aWxpdGllcy5vd25LZXlzKGVudGl0eSlcbiAgICAgICAgICAgIC5tYXAoayA9PiB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKSlcbiAgICAgICAgICAgIC5maW5kKG0gPT4gbT8ucG9zaXRpb24udGFiTmFtZSAmJiBtLnBvc2l0aW9uLnRhYiA9PT0gLTEpPy5wb3NpdGlvbi50YWJOYW1lO1xuICAgICAgICByZXR1cm4gcHJvdmlkZWRUYWJOYW1lID8/ICdUYWIgMSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUga2V5cyBvZiB0aGUgcHJvdmlkZWQgZW50aXR5IGNvcnJlY3RseSB0eXBlZC5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBnZXQgdGhlIGtleXMgb2YuXG4gICAgICogQHBhcmFtIGluamVjdG9yIC0gQW4gYW5ndWxhciBlbnZpcm9ubWVudCBpbmplY3Rvci5cbiAgICAgKiBAcGFyYW0gaGlkZU9taXRGb3JDcmVhdGUgLSBXaGV0aGVyIG9yIG5vdCBrZXlzIHdpdGggdGhlIG1ldGFkYXRhIG9taXRGb3JDcmVhdGUgc2hvdWxkIGJlIGZpbHRlcmVkIG91dC5cbiAgICAgKiBAcGFyYW0gaGlkZU9taXRGb3JFZGl0IC0gV2hldGhlciBvciBub3Qga2V5cyB3aXRoIHRoZSBtZXRhZGF0YSBvbWl0Rm9yVXBkYXRlIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQuXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2Yga2V5cyBvZiB0aGUgZW50aXR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlzT2Y8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBpbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgICAgaGlkZU9taXRGb3JDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgaGlkZU9taXRGb3JFZGl0OiBib29sZWFuID0gZmFsc2VcbiAgICApOiAoa2V5b2YgRW50aXR5VHlwZSlbXSB7XG4gICAgICAgIGxldCBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFJlZmxlY3RVdGlsaXRpZXMub3duS2V5cyhlbnRpdHkpO1xuICAgICAgICBjb25zdCBkb250RGlzcGxheUtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gdGhpcy5nZXREb250RGlzcGxheUtleXMoZW50aXR5LCBpbmplY3Rvcik7XG4gICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcihrID0+ICFkb250RGlzcGxheUtleXMuaW5jbHVkZXMoaykpO1xuICAgICAgICBpZiAoaGlkZU9taXRGb3JDcmVhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9taXRGb3JDcmVhdGVLZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IHRoaXMuZ2V0T21pdEZvckNyZWF0ZShlbnRpdHkpO1xuICAgICAgICAgICAga2V5cyA9IGtleXMuZmlsdGVyKGsgPT4gIW9taXRGb3JDcmVhdGVLZXlzLmluY2x1ZGVzKGspKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGlkZU9taXRGb3JFZGl0KSB7XG4gICAgICAgICAgICBjb25zdCBvbWl0Rm9yVXBkYXRlS2V5czogKGtleW9mIEVudGl0eVR5cGUpW10gPSB0aGlzLmdldE9taXRGb3JVcGRhdGUoZW50aXR5KTtcbiAgICAgICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcihrID0+ICFvbWl0Rm9yVXBkYXRlS2V5cy5pbmNsdWRlcyhrKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0RG9udERpc3BsYXlLZXlzPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgaW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3JcbiAgICApOiAoa2V5b2YgRW50aXR5VHlwZSlbXSB7XG4gICAgICAgIGNvbnN0IHJlczogKGtleW9mIEVudGl0eVR5cGUpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZW50aXR5KSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGtleSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9zdHJpY3QtYm9vbGVhbi1leHByZXNzaW9uc1xuICAgICAgICAgICAgaWYgKHJ1bkluSW5qZWN0aW9uQ29udGV4dChpbmplY3RvciwgKCkgPT4gIW1ldGFkYXRhPy5kaXNwbGF5KGVudGl0eSkpKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIHJvdyB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBkaXNwbGF5IGFuIGVudGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlSb3c8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PiB7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdyBpbiB3aGljaCB0aGlzIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgcm93OiBudW1iZXIsXG4gICAgLyoqXG4gICAgICogVGhlIGtleXMgb2YgdGhlIHZhbHVlcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhhdCByb3cuXG4gICAgICovXG4gICAga2V5czogKGtleW9mIEVudGl0eVR5cGUpW11cbn1cblxuLyoqXG4gKiBBIHRhYiB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGRpc3BsYXkgYW4gZW50aXR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVRhYjxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGFiIGluIHdoaWNoIHRoZSByb3dzIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgdGFiOiBudW1iZXIsXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgdG8gZGlzcGxheSBpbnNpZGUgdGhlIHRhYi5cbiAgICAgKi9cbiAgICB0YWJOYW1lOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICogVGhlIHJvd3MgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluc2lkZSB0aGlzIHRhYiwuXG4gICAgICovXG4gICAgcm93czogRW50aXR5Um93PEVudGl0eVR5cGU+W11cbn0iXX0=
611
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LnV0aWxpdGllcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1tYXRlcmlhbC1lbnRpdHkvc3JjL3V0aWxpdGllcy9lbnRpdHkudXRpbGl0aWVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBdUIscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUdqRCxPQUFPLEVBQWlCLGNBQWMsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBUXhGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQW9CdEU7O0dBRUc7QUFDSCxNQUFNLE9BQWdCLGVBQWU7SUFFakM7O09BRUc7SUFDSCxNQUFNLENBQVUsMEJBQTBCLEdBQVcscUJBQXFCLENBQUM7SUFFM0U7O09BRUc7SUFDSCxNQUFNLENBQVUsd0JBQXdCLEdBQVcsb0JBQW9CLENBQUM7SUFFeEU7O09BRUc7SUFDSCxNQUFNLENBQVUsd0JBQXdCLEdBQVcsb0JBQW9CLENBQUM7SUFFeEU7O09BRUc7SUFDSCxNQUFNLENBQVUsYUFBYSxHQUFXLFdBQVcsQ0FBQztJQUVwRDs7T0FFRztJQUNILE1BQU0sQ0FBVSxvQkFBb0IsR0FBVyxpQkFBaUIsQ0FBQztJQUVqRTs7T0FFRztJQUNILE1BQU0sQ0FBVSxRQUFRLEdBQVcsTUFBTSxDQUFDO0lBRTFDOzs7O09BSUc7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQWdELE1BQWtCO1FBQ3JGLE1BQU0sR0FBRyxHQUF5QixFQUFFLENBQUM7UUFDckMsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN2QixNQUFNLFFBQVEs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LENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU8sTUFBTSxDQUFDLGtCQUFrQixDQUM3QixNQUFrQixFQUNsQixRQUE2QjtRQUU3QixNQUFNLEdBQUcsR0FBeUIsRUFBRSxDQUFDO1FBQ3JDLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7WUFDdkIsTUFBTSxRQUFRLEdBQXlELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFDN0csaUVBQWlFO1lBQ2pFLElBQUkscUJBQXFCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEIsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnRJbmplY3RvciwgcnVuSW5JbmplY3Rpb25Db250ZXh0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRlRmlsdGVyRm4gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kYXRlcGlja2VyJztcblxuaW1wb3J0IHsgRGF0ZVV0aWxpdGllcyB9IGZyb20gJy4vZGF0ZS51dGlsaXRpZXMnO1xuaW1wb3J0IHsgRmlsZVV0aWxpdGllcyB9IGZyb20gJy4vZmlsZS51dGlsaXRpZXMnO1xuaW1wb3J0IHsgQmFzZUVudGl0eVR5cGUgfSBmcm9tICcuLi9jbGFzc2VzL2VudGl0eS5tb2RlbCc7XG5pbXBvcnQgeyBEYXRlUmFuZ2VBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsLCBFbnRpdHlBcnJheURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9hcnJheS9hcnJheS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBEZWNvcmF0b3JUeXBlLCBEZWNvcmF0b3JUeXBlcyB9IGZyb20gJy4uL2RlY29yYXRvcnMvYmFzZS9kZWNvcmF0b3ItdHlwZXMuZW51bSc7XG5pbXBvcnQgeyBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9iYXNlL3Byb3BlcnR5LWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IEN1c3RvbURlY29yYXRvckNvbmZpZ0ludGVybmFsIH0gZnJvbSAnLi4vZGVjb3JhdG9ycy9jdXN0b20vY3VzdG9tLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IERhdGVSYW5nZURhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvZGF0ZS9kYXRlLWRlY29yYXRvci1pbnRlcm5hbC5kYXRhJztcbmltcG9ydCB7IERhdGVSYW5nZSB9IGZyb20gJy4uL2RlY29yYXRvcnMvZGF0ZS9kYXRlLWRlY29yYXRvci5kYXRhJztcbmltcG9ydCB7IERlZmF1bHRGaWxlRGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwgfSBmcm9tICcuLi9kZWNvcmF0b3JzL2ZpbGUvZmlsZS1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBGaWxlRGF0YSB9IGZyb20gJy4uL2RlY29yYXRvcnMvZmlsZS9maWxlLWRlY29yYXRvci5kYXRhJztcbmltcG9ydCB7IERlZmF1bHRPYmplY3REZWNvcmF0b3JDb25maWdJbnRlcm5hbCB9IGZyb20gJy4uL2RlY29yYXRvcnMvb2JqZWN0L29iamVjdC1kZWNvcmF0b3ItaW50ZXJuYWwuZGF0YSc7XG5pbXBvcnQgeyBMb2Rhc2hVdGlsaXRpZXMgfSBmcm9tICcuLi9lbmNhcHN1bGF0aW9uL2xvZGFzaC51dGlsaXRpZXMnO1xuaW1wb3J0IHsgUmVmbGVjdFV0aWxpdGllcyB9IGZyb20gJy4uL2VuY2Fwc3VsYXRpb24vcmVmbGVjdC51dGlsaXRpZXMnO1xuXG4vKipcbiAqIFNob3dzIGluZm9ybWF0aW9uIGFib3V0IGRpZmZlcmVuY2VzIGJldHdlZW4gdHdvIGVudGl0aWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpZmZlcmVuY2U8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PiB7XG4gICAgLyoqXG4gICAgICogVGhlIGtleSB3aGVyZSB0aGUgdHdvIGVudGl0aWVzIGhhdmUgZGlmZmVyZW50IHZhbHVlcy5cbiAgICAgKi9cbiAgICBrZXk6IGtleW9mIEVudGl0eVR5cGUsXG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIGJlZm9yZSBhbnkgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBiZWZvcmU6IHVua25vd24sXG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmFsdWUgYWZ0ZXIgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBhZnRlcjogdW5rbm93blxufVxuXG4vKipcbiAqIENvbnRhaW5zIEhlbHBlck1ldGhvZHMgYXJvdW5kIGhhbmRsaW5nIEVudGl0aWVzIGFuZCB0aGVpciBwcm9wZXJ0eS1tZXRhZGF0YS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEVudGl0eVV0aWxpdGllcyB7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciBhbGwga2V5cyBvZiBtZXRhZGF0YSB0aGF0IHNob3VsZCBiZSBzZXQgdG8gdW5kZWZpbmVkIHdoZW4gdGhlIGVudGl0eSBnZXRzIHJlc2V0LlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBNRVRBREFUQV9LRVlTX1RPX1JFU0VUX0tFWTogc3RyaW5nID0gJ21ldGFkYXRhS2V5c1RvUmVzZXQnO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGtleSBmb3IgdGhlIG1ldGFkYXRhIHRoYXQgc2F2ZXMgdGhlIHNpbmdsZSBwcmV2aWV3IGltYWdlIHZhbHVlIG9uIGltYWdlIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgc3RhdGljIHJlYWRvbmx5IFNJTkdMRV9QUkVWSUVXX0lNQUdFX0tFWTogc3RyaW5nID0gJ3NpbmdsZVByZXZpZXdJbWFnZSc7XG5cbiAgICAvKipcbiAgICAgKiBUaGUga2V5IGZvciB0aGUgbWV0YWRhdGEgdGhhdCBzYXZlcyB0aGUgbXVsdGkgcHJldmlldyBpbWFnZXMgdmFsdWUgb24gaW1hZ2UgcHJvcGVydGllcy5cbiAgICAgKi9cbiAgICBzdGF0aWMgcmVhZG9ubHkgTVVMVElfUFJFVklFV19JTUFHRVNfS0VZOiBzdHJpbmcgPSAnbXVsdGlQcmV2aWV3SW1hZ2VzJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSB0aGF0IHNhdmVzIHRoZSBmaWxlbmFtZXMgdmFsdWUgb24gZmlsZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBGSUxFTkFNRVNfS0VZOiBzdHJpbmcgPSAnZmlsZU5hbWVzJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSB0aGF0IHNhdmVzIHRoZSBjb25maXJtIHBhc3N3b3JkIHZhbHVlIG9uIHBhc3N3b3JkIHByb3BlcnRpZXMuXG4gICAgICovXG4gICAgc3RhdGljIHJlYWRvbmx5IENPTkZJUk1fUEFTU1dPUkRfS0VZOiBzdHJpbmcgPSAnY29uZmlybVBhc3N3b3JkJztcblxuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgZm9yIHRoZSBtZXRhZGF0YSB0aGF0IHNhdmVzIHRoZSB0aW1lIHZhbHVlIG9uIGRhdGUgdGltZSBwcm9wZXJ0aWVzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZWFkb25seSBUSU1FX0tFWTogc3RyaW5nID0gJ3RpbWUnO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcHJvcGVydGllcyB0byBvbWl0IHdoZW4gdXBkYXRpbmcgdGhlIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBnZXQgdGhlIHByb3BlcnRpZXMgd2hpY2ggc2hvdWxkIGJlIGxlZnQgb3V0IGZvciB1cGRhdGluZyBmcm9tLlxuICAgICAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0aWVzIHdoaWNoIHNob3VsZCBiZSBsZWZ0IG91dCBmb3IgdXBkYXRpbmcgYW4gRW50aXR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRPbWl0Rm9yVXBkYXRlPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oZW50aXR5OiBFbnRpdHlUeXBlKTogKGtleW9mIEVudGl0eVR5cGUpW10ge1xuICAgICAgICBjb25zdCByZXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVudGl0eSkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgaWYgKCFtZXRhZGF0YSB8fCBtZXRhZGF0YS5vbWl0Rm9yVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHByb3BlcnRpZXMgdG8gb21pdCB3aGVuIGNyZWF0aW5nIG5ldyBlbnRpdGllcy5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBnZXQgdGhlIHByb3BlcnRpZXMgd2hpY2ggc2hvdWxkIGJlIGxlZnQgb3V0IGZvciBjcmVhdGluZyBmcm9tLlxuICAgICAqIEByZXR1cm5zIFRoZSBwcm9wZXJ0aWVzIHdoaWNoIHNob3VsZCBiZSBsZWZ0IG91dCBmb3IgY3JlYXRpbmcgYSBuZXcgRW50aXR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRPbWl0Rm9yQ3JlYXRlPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oZW50aXR5OiBFbnRpdHlUeXBlKTogKGtleW9mIEVudGl0eVR5cGUpW10ge1xuICAgICAgICBjb25zdCByZXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVudGl0eSkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgaWYgKCFtZXRhZGF0YSB8fCBtZXRhZGF0YS5vbWl0Rm9yQ3JlYXRlKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGdpdmVuIGVudGl0eSB3aXRob3V0IHRoZSB2YWx1ZXMgdGhhdCBzaG91bGQgYmUgb21pdHRlZCBmb3IgY3JlYXRpb24uXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgd2l0aCBhbGwgaXRzIHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVkdWNlZCBlbnRpdHkgb2JqZWN0LlxuICAgICAqL1xuICAgIHN0YXRpYyBnZXRXaXRob3V0T21pdENyZWF0ZVZhbHVlczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSk6IFBhcnRpYWw8RW50aXR5VHlwZT4ge1xuICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLm9taXQoZW50aXR5LCB0aGlzLmdldE9taXRGb3JDcmVhdGUoZW50aXR5KSkgYXMgUGFydGlhbDxFbnRpdHlUeXBlPjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiBlbnRpdHkgd2l0aG91dCB0aGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIG9taXR0ZWQgZm9yIHVwZGF0aW5nLlxuICAgICAqIFRoaXMgYWxzbyBoYW5kbGVzIG9taXR0aW5nIGtleXMgZm9yIEBvYmplY3Qgb3IgQGFycmF5IHZhbHVlcyBhbmQgcmVtb3ZlcyB2YWx1ZXMgdGhhdCBoYXZlbid0IGJlZW4gY2hhbmdlZCBieSBkZWZhdWx0LlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHdpdGggYWxsIGl0cyB2YWx1ZXMuXG4gICAgICogQHBhcmFtIGVudGl0eVByaW9yQ2hhbmdlcyAtIFRoZSBlbnRpdHkgYmVmb3JlIGFueSBjaGFuZ2VzIHdlcmUgYXBwbGllZC5cbiAgICAgKiBAcGFyYW0gaHR0cCAtIFRoZSBhbmd1bGFyIEh0dHBDbGllbnQuIFVzZWQgdG8gZmV0Y2ggZmlsZXMuXG4gICAgICogQHBhcmFtIGluamVjdG9yIC0gQW4gYW5ndWxhciBlbnZpcm9ubWVudCBpbmplY3Rvci5cbiAgICAgKiBAcmV0dXJucyBUaGUgcmVkdWNlZCBlbnRpdHkgb2JqZWN0LlxuICAgICAqL1xuICAgIHN0YXRpYyBhc3luYyBnZXRXaXRob3V0T21pdFVwZGF0ZVZhbHVlczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIGVudGl0eVByaW9yQ2hhbmdlczogRW50aXR5VHlwZSxcbiAgICAgICAgaHR0cDogSHR0cENsaWVudCxcbiAgICAgICAgaW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3JcbiAgICApOiBQcm9taXNlPFBhcnRpYWw8RW50aXR5VHlwZT4+IHtcbiAgICAgICAgY29uc3QgcmVzOiBQYXJ0aWFsPEVudGl0eVR5cGU+ID0ge307XG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMua2V5c09mKGVudGl0eSwgaW5qZWN0b3IsIGZhbHNlLCB0cnVlKSkge1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgY29uc3QgdHlwZTogRGVjb3JhdG9yVHlwZXMgfCB1bmRlZmluZWQgPSB0aGlzLmdldFByb3BlcnR5VHlwZShlbnRpdHksIGtleSk7XG4gICAgICAgICAgICBpZiAoIWF3YWl0IHRoaXMuaXNFcXVhbChlbnRpdHlba2V5XSwgZW50aXR5UHJpb3JDaGFuZ2VzW2tleV0sIG1ldGFkYXRhLCB0eXBlLCBodHRwKSkge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLk9CSkVDVDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgICAgICAocmVzW2tleV0gYXMgb2JqZWN0KSA9IExvZGFzaFV0aWxpdGllcy5vbWl0KGVudGl0eVtrZXldIGFzIGFueSwgdGhpcy5nZXRPbWl0Rm9yQ3JlYXRlKGVudGl0eVtrZXldKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAocmVzW2tleV0gYXMgb2JqZWN0W10pID0gKGVudGl0eVtrZXldIGFzIG9iamVjdFtdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAodmFsdWUgPT4gTG9kYXNoVXRpbGl0aWVzLm9taXQodmFsdWUsIHRoaXMuZ2V0T21pdEZvckNyZWF0ZSh2YWx1ZSkpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc1trZXldID0gZW50aXR5W2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYWxsIGRlZmF1bHQgdmFsdWVzIG9uIHRoZSBnaXZlbiBlbnRpdHkuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gc2V0IHRoZSBkZWZhdWx0IHZhbHVlcyBvbi5cbiAgICAgKi9cbiAgICBzdGF0aWMgc2V0RGVmYXVsdFZhbHVlczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlbnRpdHkpIHtcbiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+IHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwga2V5KTtcbiAgICAgICAgICAgIGlmIChtZXRhZGF0YT8uZGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLXVuc2FmZS1hc3NpZ25tZW50LCB0eXBlc2NyaXB0L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgIGVudGl0eVtrZXldID0gbWV0YWRhdGEuZGVmYXVsdCgpIGFzIGFueTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYWxsIHByb3BlcnRpZXMgb24gdGhlIGdpdmVuIGVudGl0eSB3aGljaCBhcmUgZmlsZXMuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gY2hlY2sgZm9yIGZpbGUgcHJvcGVydGllcy5cbiAgICAgKiBAcGFyYW0gb21pdCAtIFdoZXRoZXIgdG8gbGVhdmUgb3V0IHZhbHVlcyB0aGF0IGFyZSBvbWl0dGVkIGZvciBjcmVhdGUgb3IgZGVsZXRlLlxuICAgICAqIEByZXR1cm5zIFRoZSBrZXlzIG9mIGFsbCBmaWxlIHByb3BlcnRpZXMgb24gdGhlIGdpdmVuIGVudGl0eS5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0RmlsZVByb3BlcnRpZXM8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBvbWl0PzogJ2NyZWF0ZScgfCAndXBkYXRlJ1xuICAgICk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgY29uc3QgcmVzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBlbnRpdHkpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGU6IERlY29yYXRvclR5cGVzIHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eVR5cGUoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgaWYgKHR5cGUgPT09IERlY29yYXRvclR5cGVzLkZJTEVfREVGQVVMVCB8fCB0eXBlID09PSBEZWNvcmF0b3JUeXBlcy5GSUxFX0lNQUdFKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHN0eWxpc3RpYy9tYXgtbGVuXG4gICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpIGFzIFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj47XG4gICAgICAgICAgICAgICAgaWYgKCEobWV0YWRhdGEub21pdEZvckNyZWF0ZSAmJiBvbWl0ID09PSAnY3JlYXRlJykgJiYgIShtZXRhZGF0YS5vbWl0Rm9yVXBkYXRlICYmIG9taXQgPT09ICd1cGRhdGUnKSkge1xuICAgICAgICAgICAgICAgICAgICByZXMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1ldGFkYXRhIGluY2x1ZGVkIGluIGFuIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHdpdGggdGhlIHByb3BlcnR5IHRvIGdldCB0aGUgbWV0YWRhdGEgZnJvbS5cbiAgICAgKiBAcGFyYW0gcHJvcGVydHlLZXkgLSBUaGUgcHJvcGVydHkgb24gdGhlIGdpdmVuIEVudGl0eSB0byBnZXQgdGhlIG1ldGFkYXRhIGZyb20uXG4gICAgICogQHBhcmFtIHR5cGUgLSBGb3Igc2VjdXJlIFR5cGluZywgZGVmaW5lcyB0aGUgcmV0dXJuZWQgUHJvcGVydHlDb25maWcuXG4gICAgICogQHJldHVybnMgVGhlIG1ldGFkYXRhIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICAgKiBAdGhyb3dzIFdoZW4gbm8gbWV0YWRhdGEgY2FuIGJlIGZvdW5kIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICovXG4gICAgc3RhdGljIGdldFByb3BlcnR5TWV0YWRhdGE8XG4gICAgICAgIEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPixcbiAgICAgICAgVCBleHRlbmRzIERlY29yYXRvclR5cGVzLFxuICAgICAgICBDdXN0b21NZXRhZGF0YVR5cGUgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICAgID4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgcHJvcGVydHlLZXk6IGtleW9mIEVudGl0eVR5cGUsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bnVzZWRJbXBvcnRzL25vLXVudXNlZC12YXJzXG4gICAgICAgIHR5cGU/OiBUXG4gICAgKTogRGVjb3JhdG9yVHlwZTxULCBDdXN0b21NZXRhZGF0YVR5cGU+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGE6IHVua25vd24gPSBSZWZsZWN0VXRpbGl0aWVzLmdldE1ldGFkYXRhKCdtZXRhZGF0YScsIGVudGl0eSwgcHJvcGVydHlLZXkpO1xuICAgICAgICAvLyBpZiAobWV0YWRhdGEgPT0gbnVsbCkge1xuICAgICAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBtZXRhZGF0YSBmb3IgcHJvcGVydHkgJHtTdHJpbmcocHJvcGVydHlLZXkpfSBvbiB0aGUgZW50aXR5ICR7SlNPTi5zdHJpbmdpZnkoZW50aXR5KX1gKTtcbiAgICAgICAgLy8gfVxuICAgICAgICByZXR1cm4gbWV0YWRhdGEgYXMgRGVjb3JhdG9yVHlwZTxULCBDdXN0b21NZXRhZGF0YVR5cGU+IHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5LW1ldGFkYXRhLlxuICAgICAqIEBwYXJhbSBlbnRpdHkgLSBUaGUgZW50aXR5IHdpdGggdGhlIHByb3BlcnR5IHRvIGdldCB0aGUgdHlwZSBmcm9tLlxuICAgICAqIEBwYXJhbSBwcm9wZXJ0eUtleSAtIFRoZSBwcm9wZXJ0eSBvbiB0aGUgZ2l2ZW4gRW50aXR5IHRvIGdldCB0aGUgdHlwZSBmcm9tLlxuICAgICAqIEByZXR1cm5zIFRoZSB0eXBlIG9mIHRoZSBtZXRhZGF0YS5cbiAgICAgKiBAdGhyb3dzIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgbm8gbWV0YWRhdGEgY2FuIGJlIGZvdW5kIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gICAgICovXG4gICAgc3RhdGljIGdldFByb3BlcnR5VHlwZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsIHByb3BlcnR5S2V5OiBrZXlvZiBFbnRpdHlUeXBlXG4gICAgKTogRGVjb3JhdG9yVHlwZXMgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gUmVmbGVjdFV0aWxpdGllcy5nZXRNZXRhZGF0YSgndHlwZScsIGVudGl0eSwgcHJvcGVydHlLZXkpIGFzIERlY29yYXRvclR5cGVzIHwgdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgYWxsIHByb3BlcnR5IHZhbHVlcyBiYXNlZCBvbiBhIGdpdmVuIGVudGl0eSBkYXRhLW9iamVjdC5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0IC0gVGhlIHRhcmdldCBvYmplY3QgdGhhdCBuZWVkcyB0byBiZSBjb25zdHJ1Y3RlZCAoaWYgY2FsbGVkIGluc2lkZSBhbiBFbnRpdHkgY29uc3RydWN0b3IgaXRzIHVzdWFsbHkgdGhpcykuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBkYXRhIG9iamVjdCB0byBnZXQgdGhlIHByb3BlcnR5IHZhbHVlcyBmcm9tLlxuICAgICAqIEBhbGlhcyBuZXdcbiAgICAgKiBAYWxpYXMgYnVpbGRcbiAgICAgKiBAYWxpYXMgY29uc3RydWN0XG4gICAgICovXG4gICAgc3RhdGljIG5ldzxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KHRhcmdldDogRW50aXR5VHlwZSwgZW50aXR5PzogRW50aXR5VHlwZSk6IHZvaWQge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0YXJnZXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGU6IERlY29yYXRvclR5cGVzIHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eVR5cGUodGFyZ2V0LCBrZXkpO1xuICAgICAgICAgICAgbGV0IHZhbHVlOiB1bmtub3duID0gZW50aXR5ID8gUmVmbGVjdFV0aWxpdGllcy5nZXQoZW50aXR5LCBrZXkpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5PQkpFQ1Q6IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9iamVjdE1ldGFkYXRhOiBEZWZhdWx0T2JqZWN0RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8YW55PlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgICAgICA9IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YSh0YXJnZXQsIGtleSwgRGVjb3JhdG9yVHlwZXMuT0JKRUNUKSBhcyBEZWZhdWx0T2JqZWN0RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8YW55PjtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBuZXcgb2JqZWN0TWV0YWRhdGEuRW50aXR5Q2xhc3ModmFsdWUgYXMgb2JqZWN0IHwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVk6IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5wdXRBcnJheTogRW50aXR5VHlwZVtdIHwgdW5kZWZpbmVkID0gdmFsdWUgYXMgRW50aXR5VHlwZVtdIHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNBcnJheTogRW50aXR5VHlwZVtdID0gW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dEFycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFycmF5TWV0YWRhdGE6IEVudGl0eUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8YW55PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKHRhcmdldCwga2V5LCBEZWNvcmF0b3JUeXBlcy5BUlJBWSkgYXMgRW50aXR5QXJyYXlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDxhbnk+O1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIGlucHV0QXJyYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtV2l0aE1ldGFkYXRhOiBFbnRpdHlUeXBlID0gbmV3IGFycmF5TWV0YWRhdGEuRW50aXR5Q2xhc3MoaXRlbSkgYXMgRW50aXR5VHlwZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNBcnJheS5wdXNoKGl0ZW1XaXRoTWV0YWRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gcmVzQXJyYXk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFJlZmxlY3RVdGlsaXRpZXMuc2V0KHRhcmdldCwga2V5LCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvbWVtYmVyLW9yZGVyaW5nLCBqc2RvYy9yZXF1aXJlLWpzZG9jLCB0eXBlc2NyaXB0L3R5cGVkZWZcbiAgICBzdGF0aWMgY29uc3RydWN0ID0gdGhpcy5uZXc7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHR5cGVzY3JpcHQvbWVtYmVyLW9yZGVyaW5nLCBqc2RvYy9yZXF1aXJlLWpzZG9jLCB0eXBlc2NyaXB0L3R5cGVkZWZcbiAgICBzdGF0aWMgYnVpbGQgPSB0aGlzLm5ldztcblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhbiBlbnRpdHkgaXMgXCJkaXJ0eVwiIChpZiBpdHMgdmFsdWVzIGhhdmUgY2hhbmdlZCkuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgYWZ0ZXIgYWxsIGNoYW5nZXMuXG4gICAgICogQHBhcmFtIGVudGl0eVByaW9yQ2hhbmdlcyAtIFRoZSBlbnRpdHkgYmVmb3JlIHRoZSBjaGFuZ2VzLlxuICAgICAqIEBwYXJhbSBodHRwIC0gVGhlIGFuZ3VsYXIgSHR0cENsaWVudC4gVXNlZCB0byBmZXRjaCBmaWxlcy5cbiAgICAgKiBAcGFyYW0gaW5qZWN0b3IgLSBBbiBhbmd1bGFyIGVudmlyb25tZW50IGluamVjdG9yLlxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgb3Igbm90IHRoZSBlbnRpdHkgaXMgZGlydHkuXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIGlzRGlydHk8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBlbnRpdHlQcmlvckNoYW5nZXM6IEVudGl0eVR5cGUsXG4gICAgICAgIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgICAgIGluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yXG4gICAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICghKGVudGl0eVByaW9yQ2hhbmdlcyBhcyBFbnRpdHlUeXBlIHwgdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpZmZlcmVuY2VzOiBEaWZmZXJlbmNlPEVudGl0eVR5cGU+W10gPSBhd2FpdCB0aGlzLmdldERpZmZlcmVuY2VzQmV0d2VlbkVudGl0aWVzKGVudGl0eSwgZW50aXR5UHJpb3JDaGFuZ2VzLCBodHRwLCBpbmplY3Rvcik7XG4gICAgICAgIHJldHVybiAhIWRpZmZlcmVuY2VzLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSB0d28gZ2l2ZW4gZW50aXRpZXMuIE9ubHkgY2hlY2tzIHByb3BlcnRpZXMgd2hpY2ggYXJlIGRlY29yYXRlZC5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSBhcyBpcy5cbiAgICAgKiBAcGFyYW0gZW50aXR5UHJpb3JDaGFuZ2VzIC0gVGhlIGVudGl0eSBiZWZvcmUgYW55IGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUuXG4gICAgICogQHBhcmFtIGh0dHAgLSBUaGUgYW5ndWxhciBodHRwIGNsaWVudCwgaXMgbmVlZGVkIHRvIGNoZWNrIGlmIGZpbGVzIGFyZSBlcXVhbC5cbiAgICAgKiBAcGFyYW0gaW5qZWN0b3IgLSBBbiBhbmd1bGFyIGVudmlyb25tZW50IGluamVjdG9yLlxuICAgICAqIEByZXR1cm5zIFRoZSBkaWZmZXJlbmNlcyBhcyBhbiBhcnJheSBjb25zaXN0aW5nIG9mIGtleSwgYmVmb3JlIGFuZCBhZnRlci5cbiAgICAgKi9cbiAgICBzdGF0aWMgYXN5bmMgZ2V0RGlmZmVyZW5jZXNCZXR3ZWVuRW50aXRpZXM8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBlbnRpdHlQcmlvckNoYW5nZXM6IEVudGl0eVR5cGUsXG4gICAgICAgIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgICAgIGluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yXG4gICAgKTogUHJvbWlzZTxEaWZmZXJlbmNlPEVudGl0eVR5cGU+W10+IHtcbiAgICAgICAgY29uc3QgcmVzOiBEaWZmZXJlbmNlPEVudGl0eVR5cGU+W10gPSBbXTtcbiAgICAgICAgLy8gdmFsdWVzIHRoYXQgYXJlIG5vdCBkZWNvcmF0ZWQgY2FuIGJlIGlnbm9yZWQsIGFzIHRoZXkgYXJlIG5vdCB0cmFuc2ZlcnJlZCB2aWEgaHR0cC5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgdGhpcy5rZXlzT2YoZW50aXR5LCBpbmplY3RvcikpIHtcbiAgICAgICAgICAgIGNvbnN0IHR5cGU6IERlY29yYXRvclR5cGVzIHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eVR5cGUoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICAgICAgaWYgKCFhd2FpdCB0aGlzLmlzRXF1YWwoZW50aXR5W2tleV0sIGVudGl0eVByaW9yQ2hhbmdlc1trZXldLCBtZXRhZGF0YSwgdHlwZSwgaHR0cCkpIHtcbiAgICAgICAgICAgICAgICByZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGtleToga2V5LFxuICAgICAgICAgICAgICAgICAgICBiZWZvcmU6IGVudGl0eVByaW9yQ2hhbmdlc1trZXldLFxuICAgICAgICAgICAgICAgICAgICBhZnRlcjogZW50aXR5W2tleV1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIHRvIHNldCBibG9iIGZpbGUgZGF0YSBzbyB0aGF0IGl0IGlzIG9ubHkgcmVxdWVzdGVkIG9uY2UuXG4gICAgICAgICAgICAgICAgZW50aXR5UHJpb3JDaGFuZ2VzW2tleV0gPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKGVudGl0eVtrZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0d28gZ2l2ZW4gdmFsdWVzIGFyZSBlcXVhbC5cbiAgICAgKiBJdCB1c2VzIHRoZSBpc0VxdWFsIG1ldGhvZCBmcm9tIExvZGFzaFV0aWxpdGllcyBhbmQgZXh0ZW5kcyBpdCB3aXRoIGZ1bmN0aW9uYWxpdHkgcmVnYXJkaW5nIERhdGVzLlxuICAgICAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB1cGRhdGVkIHZhbHVlLlxuICAgICAqIEBwYXJhbSB2YWx1ZVByaW9yQ2hhbmdlcyAtIFRoZSB2YWx1ZSBiZWZvcmUgYW55IGNoYW5nZXMuXG4gICAgICogQHBhcmFtIG1ldGFkYXRhIC0gVGhlIG1ldGFkYXRhIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0gdHlwZSAtIFRoZSB0eXBlIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0gaHR0cCAtIFRoZSBhbmd1bGFyIEh0dHBDbGllbnQuIFVzZWQgdG8gZmV0Y2ggZmlsZXMuXG4gICAgICogQHJldHVybnMgV2hldGhlciBvciBub3QgdGhlIGdpdmVuIHZhbHVlcyBhcmUgZXF1YWwuXG4gICAgICovXG4gICAgc3RhdGljIGFzeW5jIGlzRXF1YWwoXG4gICAgICAgIHZhbHVlOiB1bmtub3duLFxuICAgICAgICB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bixcbiAgICAgICAgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgICAgIHR5cGU6IERlY29yYXRvclR5cGVzIHwgdW5kZWZpbmVkLFxuICAgICAgICBodHRwOiBIdHRwQ2xpZW50XG4gICAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGlmICgodmFsdWUgPT0gdW5kZWZpbmVkICYmIHZhbHVlUHJpb3JDaGFuZ2VzID09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHx8IHRoaXMuZGlmZmVyZW5jZUlzVW5kZWZpbmVkQW5kRW1wdHlBcnJheSh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMpXG4gICAgICAgICAgICB8fCB0aGlzLmRpZmZlcmVuY2VJc1VuZGVmaW5lZEFuZEVtcHR5U3RyaW5nKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuREFURV9SQU5HRToge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWxEYXRlUmFuZ2UoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVByaW9yQ2hhbmdlcyxcbiAgICAgICAgICAgICAgICAgICAgKG1ldGFkYXRhIGFzIERhdGVSYW5nZURhdGVEZWNvcmF0b3JDb25maWdJbnRlcm5hbCkuZmlsdGVyXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuREFURToge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWxEYXRlKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkRBVEVfVElNRToge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWxEYXRlVGltZSh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWV9EQVRFOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5BUlJBWV9EQVRFX1RJTUU6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0VxdWFsQXJyYXlEYXRlKHZhbHVlLCB2YWx1ZVByaW9yQ2hhbmdlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX0RBVEVfUkFOR0U6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0VxdWFsQXJyYXlEYXRlUmFuZ2UoXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVByaW9yQ2hhbmdlcyxcbiAgICAgICAgICAgICAgICAgICAgKG1ldGFkYXRhIGFzIERhdGVSYW5nZUFycmF5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWwpLmZpbHRlclxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkFSUkFZX1NUUklOR19DSElQUzpcbiAgICAgICAgICAgIGNhc2UgRGVjb3JhdG9yVHlwZXMuQVJSQVlfU1RSSU5HX0FVVE9DT01QTEVURV9DSElQUzoge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWxBcnJheVN0cmluZyh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5GSUxFX0lNQUdFOlxuICAgICAgICAgICAgY2FzZSBEZWNvcmF0b3JUeXBlcy5GSUxFX0RFRkFVTFQ6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc0VxdWFsRmlsZSh2YWx1ZSwgdmFsdWVQcmlvckNoYW5nZXMsIChtZXRhZGF0YSBhcyBEZWZhdWx0RmlsZURlY29yYXRvckNvbmZpZ0ludGVybmFsKS5tdWx0aXBsZSwgaHR0cCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIERlY29yYXRvclR5cGVzLkNVU1RPTToge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB0eXBlc2NyaXB0L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlzRXF1YWxDdXN0b20odmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzLCBtZXRhZGF0YSBhcyBDdXN0b21EZWNvcmF0b3JDb25maWdJbnRlcm5hbDxhbnksIGFueSwgYW55LCBhbnk+KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGRpZmZlcmVuY2VJc1VuZGVmaW5lZEFuZEVtcHR5U3RyaW5nKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gKHZhbHVlUHJpb3JDaGFuZ2VzID09IHVuZGVmaW5lZCAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICF2YWx1ZS5sZW5ndGgpXG4gICAgICAgICAgICB8fCAodmFsdWUgPT0gdW5kZWZpbmVkICYmIHR5cGVvZiB2YWx1ZVByaW9yQ2hhbmdlcyA9PT0gJ3N0cmluZycgJiYgIXZhbHVlUHJpb3JDaGFuZ2VzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZGlmZmVyZW5jZUlzVW5kZWZpbmVkQW5kRW1wdHlBcnJheSh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZVByaW9yQ2hhbmdlcyA9PSB1bmRlZmluZWQgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgIXZhbHVlLmxlbmd0aClcbiAgICAgICAgICAgIHx8ICh2YWx1ZSA9PSB1bmRlZmluZWQgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZVByaW9yQ2hhbmdlcykgJiYgIXZhbHVlUHJpb3JDaGFuZ2VzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbEFycmF5U3RyaW5nKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93bik6IGJvb2xlYW4gfCBQcm9taXNlTGlrZTxib29sZWFuPiB7XG4gICAgICAgIGxldCBzdHJpbmdBcnJheTogc3RyaW5nW10gfCB1bmRlZmluZWQgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHZhbHVlIGFzIHN0cmluZ1tdIHwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHN0cmluZ0FycmF5KSB7XG4gICAgICAgICAgICBzdHJpbmdBcnJheSA9IHN0cmluZ0FycmF5LnNvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RyaW5nQXJyYXlQcmlvckNoYW5nZXM6IHN0cmluZ1tdIHwgdW5kZWZpbmVkID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBzdHJpbmdbXSB8IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChzdHJpbmdBcnJheVByaW9yQ2hhbmdlcykge1xuICAgICAgICAgICAgc3RyaW5nQXJyYXlQcmlvckNoYW5nZXMgPSBzdHJpbmdBcnJheVByaW9yQ2hhbmdlcy5zb3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKHN0cmluZ0FycmF5LCBzdHJpbmdBcnJheVByaW9yQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbEFycmF5RGF0ZSh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24pOiBib29sZWFuIHtcbiAgICAgICAgbGV0IG5ld1ZhbHVlOiBEYXRlW10gfCB1bmRlZmluZWQgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHZhbHVlIGFzIERhdGVbXSB8IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChuZXdWYWx1ZSkge1xuICAgICAgICAgICAgbmV3VmFsdWUgPSBuZXdWYWx1ZS5tYXAodiA9PiBuZXcgRGF0ZSh2KSkuc29ydCgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBuZXdWYWx1ZVByaW9yQ2hhbmdlczogRGF0ZVtdIHwgdW5kZWZpbmVkID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBEYXRlW10gfCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAobmV3VmFsdWVQcmlvckNoYW5nZXMpIHtcbiAgICAgICAgICAgIG5ld1ZhbHVlUHJpb3JDaGFuZ2VzID0gbmV3VmFsdWVQcmlvckNoYW5nZXMubWFwKHYgPT4gbmV3IERhdGUodikpLnNvcnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwobmV3VmFsdWUsIG5ld1ZhbHVlUHJpb3JDaGFuZ2VzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0VxdWFsQXJyYXlEYXRlUmFuZ2UodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duLCBmaWx0ZXI/OiBEYXRlRmlsdGVyRm48RGF0ZT4pOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGRhdGVSYW5nZXM6IERhdGVSYW5nZVtdIHwgdW5kZWZpbmVkID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh2YWx1ZSBhcyBEYXRlUmFuZ2VbXSB8IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChkYXRlUmFuZ2VzKSB7XG4gICAgICAgICAgICBkYXRlUmFuZ2VzID0gZGF0ZVJhbmdlcy5zb3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGRhdGVSYW5nZXNQcmlvckNoYW5nZXM6IERhdGVSYW5nZVtdIHwgdW5kZWZpbmVkID0gTG9kYXNoVXRpbGl0aWVzLmNsb25lRGVlcCh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBEYXRlUmFuZ2VbXSB8IHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChkYXRlUmFuZ2VzUHJpb3JDaGFuZ2VzKSB7XG4gICAgICAgICAgICBkYXRlUmFuZ2VzUHJpb3JDaGFuZ2VzID0gZGF0ZVJhbmdlc1ByaW9yQ2hhbmdlcy5zb3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGVSYW5nZXM/Lmxlbmd0aCAhPT0gZGF0ZVJhbmdlc1ByaW9yQ2hhbmdlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGVSYW5nZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGRhdGVSYW5nZXM/Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzRXF1YWxEYXRlUmFuZ2UoZGF0ZVJhbmdlcz8uW2ldLCBkYXRlUmFuZ2VzUHJpb3JDaGFuZ2VzPy5baV0sIGZpbHRlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc0VxdWFsRGF0ZVRpbWUodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGRhdGU6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZSBhcyBEYXRlKTtcbiAgICAgICAgY29uc3QgZGF0ZVByaW9yQ2hhbmdlczogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlUHJpb3JDaGFuZ2VzIGFzIERhdGUpO1xuICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwoZGF0ZSwgZGF0ZVByaW9yQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbERhdGUodmFsdWU6IHVua25vd24sIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGRhdGU6IERhdGUgPSBuZXcgRGF0ZSh2YWx1ZSBhcyBEYXRlKTtcbiAgICAgICAgY29uc3QgZGF0ZVByaW9yQ2hhbmdlczogRGF0ZSA9IG5ldyBEYXRlKHZhbHVlUHJpb3JDaGFuZ2VzIGFzIERhdGUpO1xuICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgICAgICBkYXRlUHJpb3JDaGFuZ2VzLnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgICAgICByZXR1cm4gTG9kYXNoVXRpbGl0aWVzLmlzRXF1YWwoZGF0ZSwgZGF0ZVByaW9yQ2hhbmdlcyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbERhdGVSYW5nZSh2YWx1ZTogdW5rbm93biwgdmFsdWVQcmlvckNoYW5nZXM6IHVua25vd24sIGZpbHRlcj86IERhdGVGaWx0ZXJGbjxEYXRlPik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBkYXRlUmFuZ2U6IFBhcnRpYWw8RGF0ZVJhbmdlPiB8IHVuZGVmaW5lZCA9IExvZGFzaFV0aWxpdGllcy5jbG9uZURlZXAodmFsdWUpIGFzIFBhcnRpYWw8RGF0ZVJhbmdlPiB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGRhdGVSYW5nZT8uc3RhcnQpIHtcbiAgICAgICAgICAgIGRhdGVSYW5nZS5zdGFydCA9IG5ldyBEYXRlKGRhdGVSYW5nZS5zdGFydCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGVSYW5nZT8uZW5kKSB7XG4gICAgICAgICAgICBkYXRlUmFuZ2UuZW5kID0gbmV3IERhdGUoZGF0ZVJhbmdlLmVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGVSYW5nZT8uc3RhcnQgJiYgZGF0ZVJhbmdlLmVuZCkge1xuICAgICAgICAgICAgZGF0ZVJhbmdlLnZhbHVlcyA9IERhdGVVdGlsaXRpZXMuZ2V0RGF0ZXNCZXR3ZWVuKFxuICAgICAgICAgICAgICAgIGRhdGVSYW5nZS5zdGFydCxcbiAgICAgICAgICAgICAgICBkYXRlUmFuZ2UuZW5kLFxuICAgICAgICAgICAgICAgIGZpbHRlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc3R5bGlzdGljL21heC1sZW5cbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzOiBQYXJ0aWFsPERhdGVSYW5nZT4gfCB1bmRlZmluZWQgPSBMb2Rhc2hVdGlsaXRpZXMuY2xvbmVEZWVwKHZhbHVlUHJpb3JDaGFuZ2VzKSBhcyBQYXJ0aWFsPERhdGVSYW5nZT4gfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChkYXRlUmFuZ2VQcmlvckNoYW5nZXM/LnN0YXJ0KSB7XG4gICAgICAgICAgICBkYXRlUmFuZ2VQcmlvckNoYW5nZXMuc3RhcnQgPSBuZXcgRGF0ZShkYXRlUmFuZ2VQcmlvckNoYW5nZXMuc3RhcnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRlUmFuZ2VQcmlvckNoYW5nZXM/LmVuZCkge1xuICAgICAgICAgICAgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLmVuZCA9IG5ldyBEYXRlKGRhdGVSYW5nZVByaW9yQ2hhbmdlcy5lbmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRlUmFuZ2VQcmlvckNoYW5nZXM/LnN0YXJ0ICYmIGRhdGVSYW5nZVByaW9yQ2hhbmdlcy5lbmQpIHtcbiAgICAgICAgICAgIGRhdGVSYW5nZVByaW9yQ2hhbmdlcy52YWx1ZXMgPSBEYXRlVXRpbGl0aWVzLmdldERhdGVzQmV0d2VlbihcbiAgICAgICAgICAgICAgICBkYXRlUmFuZ2VQcmlvckNoYW5nZXMuc3RhcnQsXG4gICAgICAgICAgICAgICAgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzLmVuZCxcbiAgICAgICAgICAgICAgICBmaWx0ZXJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIExvZGFzaFV0aWxpdGllcy5pc0VxdWFsKGRhdGVSYW5nZSwgZGF0ZVJhbmdlUHJpb3JDaGFuZ2VzKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBGaW5kIGEgd2F5IHRvIHVzZSBibG9icyB3aXRoIGplc3RcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzb25hci9jb2duaXRpdmUtY29tcGxleGl0eVxuICAgIHByaXZhdGUgc3RhdGljIGFzeW5jIGlzRXF1YWxGaWxlKHZhbHVlOiB1bmtub3duLCB2YWx1ZVByaW9yQ2hhbmdlczogdW5rbm93biwgbXVsdGlwbGU6IGJvb2xlYW4sIGh0dHA6IEh0dHBDbGllbnQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKHZhbHVlID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlUHJpb3JDaGFuZ2VzID09IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWVQcmlvckNoYW5nZXMgPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlsZXM6IEZpbGVEYXRhW10gPSBtdWx0aXBsZSA/ICh2YWx1ZSBhcyBGaWxlRGF0YVtdKS5zb3J0KCkgOiBbdmFsdWUgYXMgRmlsZURhdGFdLnNvcnQoKTtcbiAgICAgICAgY29uc3QgZmlsZXNQcmlvckNoYW5nZXM6IEZpbGVEYXRhW10gPSBtdWx0aXBsZSA/ICh2YWx1ZVByaW9yQ2hhbmdlcyBhcyBGaWxlRGF0YVtdKS5zb3J0KCkgOiBbdmFsdWVQcmlvckNoYW5nZXMgYXMgRmlsZURhdGFdLnNvcnQoKTtcbiAgICAgICAgaWYgKGZpbGVzLmxlbmd0aCAhPT0gZmlsZXNQcmlvckNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaTogbnVtYmVyID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAvLyBjaGVja3MgdGhpcyBiZWZvcmUgYWN0dWFsbHkgZ2V0dGluZyBhbnkgZmlsZXMgZHVlIHRvIHBlcmZvcm1hbmNlIHJlYXNvbnMuXG4gICAgICAgICAgICBpZiAoIUxvZGFzaFV0aWxpdGllcy5pc0VxdWFsKExvZGFzaFV0aWxpdGllcy5vbWl0KGZpbGVzW2ldLCAnZmlsZScpLCBMb2Rhc2hVdGlsaXRpZXMub21pdChmaWxlc1ByaW9yQ2hhbmdlc1tpXSwgJ2ZpbGUnKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlsZXNQcmlvckNoYW5nZXNbaV0uZmlsZSAmJiAhZmlsZXNbaV0uZmlsZSkge1xuICAgICAgICAgICAgICAgIGZpbGVzW2ldID0gYXdhaXQgRmlsZVV0aWxpdGllcy5nZXRGaWxlRGF0YShmaWxlc1tpXSwgaHR0cCk7XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBmaWxlc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlc1tpXS5maWxlICYmICFmaWxlc1ByaW9yQ2hhbmdlc1tpXS5maWxlKSB7XG4gICAgICAgICAgICAgICAgZmlsZXNQcmlvckNoYW5nZXNbaV0gPSBhd2FpdCBGaWxlVXRpbGl0aWVzLmdldEZpbGVEYXRhKGZpbGVzUHJpb3JDaGFuZ2VzW2ldLCBodHRwKTtcbiAgICAgICAgICAgICAgICB2YWx1ZVByaW9yQ2hhbmdlcyA9IGZpbGVzUHJpb3JDaGFuZ2VzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFMb2Rhc2hVdGlsaXRpZXMuaXNFcXVhbChhd2FpdCBmaWxlc1tpXS5maWxlPy50ZXh0KCksIGF3YWl0IGZpbGVzUHJpb3JDaGFuZ2VzW2ldLmZpbGU/LnRleHQoKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNFcXVhbEN1c3RvbShcbiAgICAgICAgdmFsdWU6IHVua25vd24sXG4gICAgICAgIHZhbHVlUHJpb3JDaGFuZ2VzOiB1bmtub3duLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgbWV0YWRhdGE6IEN1c3RvbURlY29yYXRvckNvbmZpZ0ludGVybmFsPGFueSwgYW55LCBhbnksIGFueT5cbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIG1ldGFkYXRhLmlzRXF1YWwodmFsdWUsIHZhbHVlUHJpb3JDaGFuZ2VzLCBtZXRhZGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZSBmdW5jdGlvbiBmb3Igc29ydGluZyBlbnRpdHkga2V5cyBieSB0aGVpciBvcmRlciB2YWx1ZS5cbiAgICAgKiBAcGFyYW0gYSAtIEZpcnN0IGtleSBvZiBlbnRpdHkuXG4gICAgICogQHBhcmFtIGIgLSBTZWNvbmQga2V5IG9mIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gQ3VycmVudCBlbnRpdHkgKHVzZWQgdG8gZ2V0IG1ldGFkYXRhIG9mIGVudGl0eSBrZXlzKS5cbiAgICAgKiBAcmV0dXJucyAwIGlmIGJvdGggdmFsdWVzIGhhdmUgdGhlIHNhbWUgb3JkZXIsIGEgbmVnYXRpdmUgdmFsdWUgaWYgJ2EnIGNvbWVzIGJlZm9yZSAnYicsIGEgcG9zaXRpdmUgdmFsdWUgaWYgJ2EnIGNvbWVzIGJlaGluZCAnYicuXG4gICAgICovXG4gICAgc3RhdGljIGNvbXBhcmVPcmRlcjxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBhOiBrZXlvZiBFbnRpdHlUeXBlLFxuICAgICAgICBiOiBrZXlvZiBFbnRpdHlUeXBlLFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGVcbiAgICApOiBudW1iZXIge1xuICAgICAgICBjb25zdCBtZXRhZGF0YUE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBhKTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGFCOiBQcm9wZXJ0eURlY29yYXRvckNvbmZpZ0ludGVybmFsPHVua25vd24+IHwgdW5kZWZpbmVkID0gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgYik7XG5cbiAgICAgICAgaWYgKCFtZXRhZGF0YUEgfHwgIW1ldGFkYXRhQikge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0YWRhdGFBLnBvc2l0aW9uLm9yZGVyID09PSAtMSkge1xuICAgICAgICAgICAgaWYgKG1ldGFkYXRhQi5wb3NpdGlvbi5vcmRlciA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1ldGFkYXRhQi5wb3NpdGlvbi5vcmRlciA9PT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbWV0YWRhdGFBLnBvc2l0aW9uLm9yZGVyIC0gbWV0YWRhdGFCLnBvc2l0aW9uLm9yZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJlc3BvbnNpdmUgY29sdW1uIGNsYXNzZXMgZm9yIFwibGdcIiwgXCJtZFwiIGFuZCBcInNtXCIuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIEVudGl0eSB0byBnZXQgdGhlIHJlc3BvbnNpdmUgY29sdW1uIGNsYXNzZXMgZm9yLlxuICAgICAqIEBwYXJhbSBrZXkgLSBLZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldCB0aGUgcmVzcG9uc2l2ZSBjb2x1bW4gY2xhc3NlcyBmcm9tLlxuICAgICAqIEByZXR1cm5zIFJlc3BvbnNpdmUgY29sdW1uIGNsYXNzZXMgZm9yIGxhcmdlLCBtaWRkbGUgYW5kIHNtYWxsIGRpc3BsYXlzLlxuICAgICAqIEB0aHJvd3MgV2hlbiBubyBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuIGtleSB3YXMgZm91bmQuXG4gICAgICovXG4gICAgc3RhdGljIGdldFdpZHRoQ2xhc3NlczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSwga2V5OiBrZXlvZiBFbnRpdHlUeXBlKTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGE6IFByb3BlcnR5RGVjb3JhdG9yQ29uZmlnSW50ZXJuYWw8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrZXkpO1xuICAgICAgICBpZiAoIW1ldGFkYXRhKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgbWV0YWRhdGEgZm9yIHByb3BlcnR5IFwiJHtrZXkudG9TdHJpbmcoKX1cImApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgbGc6Y29sLXNwYW4tJHttZXRhZGF0YS5kZWZhdWx0V2lkdGhzWzBdfSBtZDpjb2wtc3Bhbi0ke21ldGFkYXRhLmRlZmF1bHRXaWR0aHNbMV19IGNvbC1zcGFuLSR7bWV0YWRhdGEuZGVmYXVsdFdpZHRoc1syXX1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc2V0cyBhbGwgY2hhbmdlcyBvbiBhbiBlbnRpdHkuXG4gICAgICogQHBhcmFtIGVudGl0eSAtIFRoZSBlbnRpdHkgdG8gcmVzZXQuXG4gICAgICogQHBhcmFtIGVudGl0eVByaW9yQ2hhbmdlcyAtIFRoZSBlbnRpdHkgYmVmb3JlIGFueSBjaGFuZ2VzLlxuICAgICAqL1xuICAgIHN0YXRpYyByZXNldENoYW5nZXNPbkVudGl0eTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSwgZW50aXR5UHJpb3JDaGFuZ2VzOiBFbnRpdHlUeXBlKTogdm9pZCB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGVudGl0eVByaW9yQ2hhbmdlcykge1xuICAgICAgICAgICAgUmVmbGVjdFV0aWxpdGllcy5zZXQoZW50aXR5LCBrZXksIFJlZmxlY3RVdGlsaXRpZXMuZ2V0KGVudGl0eVByaW9yQ2hhbmdlcywga2V5KSk7XG4gICAgICAgICAgICBpZiAoUmVmbGVjdFV0aWxpdGllcy5oYXNNZXRhZGF0YSh0aGlzLk1FVEFEQVRBX0tFWVNfVE9fUkVTRVRfS0VZLCBlbnRpdHksIGtleSkpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGsgb2YgKFJlZmxlY3RVdGlsaXRpZXMuZ2V0TWV0YWRhdGEodGhpcy5NRVRBREFUQV9LRVlTX1RPX1JFU0VUX0tFWSwgZW50aXR5LCBrZXkpIGFzIHN0cmluZ1tdKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoUmVmbGVjdFV0aWxpdGllcy5oYXNNZXRhZGF0YShrLCBlbnRpdHksIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3RVdGlsaXRpZXMuZGVmaW5lTWV0YWRhdGEoaywgdW5kZWZpbmVkLCBlbnRpdHksIGtleSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRFbnRpdHlSb3dzPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgdGFiOiBudW1iZXIsXG4gICAgICAgIGhpZGVPbWl0Rm9yQ3JlYXRlOiBib29sZWFuLFxuICAgICAgICBoaWRlT21pdEZvckVkaXQ6IGJvb2xlYW4sXG4gICAgICAgIGFkZGl0aW9uYWxPbWl0VmFsdWVzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSxcbiAgICAgICAgaW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3JcbiAgICApOiBFbnRpdHlSb3c8RW50aXR5VHlwZT5bXSB7XG4gICAgICAgIGNvbnN0IHJlczogRW50aXR5Um93PEVudGl0eVR5cGU+W10gPSBbXTtcblxuICAgICAgICBjb25zdCBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IHRoaXMua2V5c09mKGVudGl0eSwgaW5qZWN0b3IsIGhpZGVPbWl0Rm9yQ3JlYXRlLCBoaWRlT21pdEZvckVkaXQpXG4gICAgICAgICAgICAuZmlsdGVyKGsgPT4gIWFkZGl0aW9uYWxPbWl0VmFsdWVzLmluY2x1ZGVzKGspKTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZSb3dzOiBudW1iZXIgPSB0aGlzLmdldE51bWJlck9mUm93czxFbnRpdHlUeXBlPihrZXlzLCBlbnRpdHksIHRhYik7XG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPD0gbnVtYmVyT2ZSb3dzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdzogRW50aXR5Um93PEVudGl0eVR5cGU+ID0ge1xuICAgICAgICAgICAgICAgIHJvdzogaSxcbiAgICAgICAgICAgICAgICBrZXlzOiB0aGlzLmdldEtleXNGb3JSb3c8RW50aXR5VHlwZT4oa2V5cywgZW50aXR5LCBpLCB0YWIpXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVzLnB1c2gocm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmdldEtleXNGb3JSb3c8RW50aXR5VHlwZT4oa2V5cywgZW50aXR5LCAtMSwgdGFiKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhc3RSb3c6IEVudGl0eVJvdzxFbnRpdHlUeXBlPiA9IHtcbiAgICAgICAgICAgICAgICByb3c6IG51bWJlck9mUm93cyArIDEsXG4gICAgICAgICAgICAgICAga2V5czogdGhpcy5nZXRLZXlzRm9yUm93PEVudGl0eVR5cGU+KGtleXMsIGVudGl0eSwgLTEsIHRhYilcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXMucHVzaChsYXN0Um93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgdGFicyB0aGF0IGFyZSB1c2VkIHRvIGRpc3BsYXkgdGhlIGdpdmVuIGVudGl0eS5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBnZXQgdGhlIHJvd3MgZnJvbS5cbiAgICAgKiBAcGFyYW0gaW5qZWN0b3IgLSBBbiBhbmd1bGFyIGVudmlyb25tZW50IGluamVjdG9yLlxuICAgICAqIEBwYXJhbSBoaWRlT21pdEZvckNyZWF0ZSAtIFdoZXRoZXIgb3Igbm90IGtleXMgd2l0aCB0aGUgbWV0YWRhdGEgb21pdEZvckNyZWF0ZSBzaG91bGQgYmUgZmlsdGVyZWQgb3V0LlxuICAgICAqIEBwYXJhbSBoaWRlT21pdEZvckVkaXQgLSBXaGV0aGVyIG9yIG5vdCBrZXlzIHdpdGggdGhlIG1ldGFkYXRhIG9taXRGb3JVcGRhdGUgc2hvdWxkIGJlIGZpbHRlcmVkIG91dC5cbiAgICAgKiBAcGFyYW0gYWRkaXRpb25hbE9taXRLZXlzIC0gQWRkaXRpb25hbCBvbWl0IHZhbHVlcy5cbiAgICAgKiBAcmV0dXJucyBUaGUgc29ydGVkIFRhYnMgY29udGFpbmluZyB0aGUgcm93cyBhbmQgdGhlIGtleXMgdG8gZGlzcGxheSBpbiB0aGF0IHJvdy5cbiAgICAgKi9cbiAgICBzdGF0aWMgZ2V0RW50aXR5VGFiczxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIGluamVjdG9yOiBFbnZpcm9ubWVudEluamVjdG9yLFxuICAgICAgICBoaWRlT21pdEZvckNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuICAgICAgICBoaWRlT21pdEZvckVkaXQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgYWRkaXRpb25hbE9taXRLZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFtdXG4gICAgKTogRW50aXR5VGFiPEVudGl0eVR5cGU+W10ge1xuICAgICAgICBjb25zdCByZXM6IEVudGl0eVRhYjxFbnRpdHlUeXBlPltdID0gW107XG4gICAgICAgIGNvbnN0IGtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gdGhpcy5rZXlzT2YoZW50aXR5LCBpbmplY3RvciwgaGlkZU9taXRGb3JDcmVhdGUsIGhpZGVPbWl0Rm9yRWRpdClcbiAgICAgICAgICAgIC5maWx0ZXIoayA9PiAhYWRkaXRpb25hbE9taXRLZXlzLmluY2x1ZGVzKGspKTtcbiAgICAgICAgY29uc3QgbnVtYmVyT2ZUYWJzOiBudW1iZXIgPSB0aGlzLmdldE51bWJlck9mVGFiczxFbnRpdHlUeXBlPihrZXlzLCBlbnRpdHkpO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0VGFiUm93czogRW50aXR5Um93PEVudGl0eVR5cGU+W10gPSB0aGlzLmdldEVudGl0eVJvd3M8RW50aXR5VHlwZT4oXG4gICAgICAgICAgICBlbnRpdHksXG4gICAgICAgICAgICAtMSxcbiAgICAgICAgICAgIGhpZGVPbWl0Rm9yQ3JlYXRlLFxuICAgICAgICAgICAgaGlkZU9taXRGb3JFZGl0LFxuICAgICAgICAgICAgYWRkaXRpb25hbE9taXRLZXlzLFxuICAgICAgICAgICAgaW5qZWN0b3JcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGZpcnN0VGFiUm93cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0VGFiOiBFbnRpdHlUYWI8RW50aXR5VHlwZT4gPSB7XG4gICAgICAgICAgICAgICAgdGFiTmFtZTogdGhpcy5nZXRGaXJzdFRhYk5hbWUoZW50aXR5KSxcbiAgICAgICAgICAgICAgICB0YWI6IC0xLFxuICAgICAgICAgICAgICAgIHJvd3M6IGZpcnN0VGFiUm93c1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcy5wdXNoKGZpcnN0VGFiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDI7IGkgPD0gbnVtYmVyT2ZUYWJzOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJvd3M6IEVudGl0eVJvdzxFbnRpdHlUeXBlPltdID0gdGhpcy5nZXRFbnRpdHlSb3dzPEVudGl0eVR5cGU+KFxuICAgICAgICAgICAgICAgIGVudGl0eSwgaSwgaGlkZU9taXRGb3JDcmVhdGUsIGhpZGVPbWl0Rm9yRWRpdCwgYWRkaXRpb25hbE9taXRLZXlzLCBpbmplY3RvclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChyb3dzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYjogRW50aXR5VGFiPEVudGl0eVR5cGU+ID0ge1xuICAgICAgICAgICAgICAgICAgICB0YWJOYW1lOiB0aGlzLmdldFRhYk5hbWUoZW50aXR5LCBpKSxcbiAgICAgICAgICAgICAgICAgICAgdGFiOiBpLFxuICAgICAgICAgICAgICAgICAgICByb3dzOiByb3dzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXMucHVzaCh0YWIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRLZXlzRm9yUm93PEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdLFxuICAgICAgICBlbnRpdHk6IEVudGl0eVR5cGUsXG4gICAgICAgIHJvdzogbnVtYmVyLFxuICAgICAgICB0YWI6IG51bWJlclxuICAgICk6IChrZXlvZiBFbnRpdHlUeXBlKVtdIHtcbiAgICAgICAgcmV0dXJuIGtleXNcbiAgICAgICAgICAgIC5maWx0ZXIoayA9PiB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKT8ucG9zaXRpb24ucm93ID09PSByb3cpXG4gICAgICAgICAgICAuZmlsdGVyKGsgPT4gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgayk/LnBvc2l0aW9uLnRhYiA9PT0gdGFiKVxuICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IHRoaXMuY29tcGFyZU9yZGVyKGEsIGIsIGVudGl0eSkpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldE51bWJlck9mUm93czxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KFxuICAgICAgICBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSxcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICB0YWI6IG51bWJlclxuICAgICk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAoa2V5c1xuICAgICAgICAgICAgLmZpbHRlcihrID0+IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGspPy5wb3NpdGlvbi50YWIgPT09IHRhYilcbiAgICAgICAgICAgIC5tYXAoayA9PiB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKT8ucG9zaXRpb24ucm93KSBhcyBudW1iZXJbXSlcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhID4gYiA/IC0xIDogMSlbMF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0TnVtYmVyT2ZUYWJzPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oa2V5czogKGtleW9mIEVudGl0eVR5cGUpW10sIGVudGl0eTogRW50aXR5VHlwZSk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiAoa2V5c1xuICAgICAgICAgICAgLmZpbHRlcihrID0+IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGspICE9IHVuZGVmaW5lZClcbiAgICAgICAgICAgIC5tYXAoayA9PiB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKT8ucG9zaXRpb24udGFiKSBhcyBudW1iZXJbXSlcbiAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhID4gYiA/IC0xIDogMSlbMF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0VGFiTmFtZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSwgdGFiOiBudW1iZXIpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBwcm92aWRlZFRhYk5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IFJlZmxlY3RVdGlsaXRpZXMub3duS2V5cyhlbnRpdHkpXG4gICAgICAgICAgICAubWFwKGsgPT4gdGhpcy5nZXRQcm9wZXJ0eU1ldGFkYXRhKGVudGl0eSwgaykpXG4gICAgICAgICAgICAuZmluZChtID0+IG0/LnBvc2l0aW9uLnRhYiA9PT0gdGFiICYmIG0ucG9zaXRpb24udGFiTmFtZSk/LnBvc2l0aW9uLnRhYk5hbWU7XG4gICAgICAgIHJldHVybiBwcm92aWRlZFRhYk5hbWUgPz8gYFRhYiAke3RhYn1gO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGdldEZpcnN0VGFiTmFtZTxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+KGVudGl0eTogRW50aXR5VHlwZSk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHByb3ZpZGVkVGFiTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gUmVmbGVjdFV0aWxpdGllcy5vd25LZXlzKGVudGl0eSlcbiAgICAgICAgICAgIC5tYXAoayA9PiB0aGlzLmdldFByb3BlcnR5TWV0YWRhdGEoZW50aXR5LCBrKSlcbiAgICAgICAgICAgIC5maW5kKG0gPT4gbT8ucG9zaXRpb24udGFiTmFtZSAmJiBtLnBvc2l0aW9uLnRhYiA9PT0gLTEpPy5wb3NpdGlvbi50YWJOYW1lO1xuICAgICAgICByZXR1cm4gcHJvdmlkZWRUYWJOYW1lID8/ICdUYWIgMSc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUga2V5cyBvZiB0aGUgcHJvdmlkZWQgZW50aXR5IGNvcnJlY3RseSB0eXBlZC5cbiAgICAgKiBAcGFyYW0gZW50aXR5IC0gVGhlIGVudGl0eSB0byBnZXQgdGhlIGtleXMgb2YuXG4gICAgICogQHBhcmFtIGluamVjdG9yIC0gQW4gYW5ndWxhciBlbnZpcm9ubWVudCBpbmplY3Rvci5cbiAgICAgKiBAcGFyYW0gaGlkZU9taXRGb3JDcmVhdGUgLSBXaGV0aGVyIG9yIG5vdCBrZXlzIHdpdGggdGhlIG1ldGFkYXRhIG9taXRGb3JDcmVhdGUgc2hvdWxkIGJlIGZpbHRlcmVkIG91dC5cbiAgICAgKiBAcGFyYW0gaGlkZU9taXRGb3JFZGl0IC0gV2hldGhlciBvciBub3Qga2V5cyB3aXRoIHRoZSBtZXRhZGF0YSBvbWl0Rm9yVXBkYXRlIHNob3VsZCBiZSBmaWx0ZXJlZCBvdXQuXG4gICAgICogQHJldHVybnMgQW4gYXJyYXkgb2Yga2V5cyBvZiB0aGUgZW50aXR5LlxuICAgICAqL1xuICAgIHN0YXRpYyBrZXlzT2Y8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PihcbiAgICAgICAgZW50aXR5OiBFbnRpdHlUeXBlLFxuICAgICAgICBpbmplY3RvcjogRW52aXJvbm1lbnRJbmplY3RvcixcbiAgICAgICAgaGlkZU9taXRGb3JDcmVhdGU6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICAgaGlkZU9taXRGb3JFZGl0OiBib29sZWFuID0gZmFsc2VcbiAgICApOiAoa2V5b2YgRW50aXR5VHlwZSlbXSB7XG4gICAgICAgIGxldCBrZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IFJlZmxlY3RVdGlsaXRpZXMub3duS2V5cyhlbnRpdHkpO1xuICAgICAgICBjb25zdCBkb250RGlzcGxheUtleXM6IChrZXlvZiBFbnRpdHlUeXBlKVtdID0gdGhpcy5nZXREb250RGlzcGxheUtleXMoZW50aXR5LCBpbmplY3Rvcik7XG4gICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcihrID0+ICFkb250RGlzcGxheUtleXMuaW5jbHVkZXMoaykpO1xuICAgICAgICBpZiAoaGlkZU9taXRGb3JDcmVhdGUpIHtcbiAgICAgICAgICAgIGNvbnN0IG9taXRGb3JDcmVhdGVLZXlzOiAoa2V5b2YgRW50aXR5VHlwZSlbXSA9IHRoaXMuZ2V0T21pdEZvckNyZWF0ZShlbnRpdHkpO1xuICAgICAgICAgICAga2V5cyA9IGtleXMuZmlsdGVyKGsgPT4gIW9taXRGb3JDcmVhdGVLZXlzLmluY2x1ZGVzKGspKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaGlkZU9taXRGb3JFZGl0KSB7XG4gICAgICAgICAgICBjb25zdCBvbWl0Rm9yVXBkYXRlS2V5czogKGtleW9mIEVudGl0eVR5cGUpW10gPSB0aGlzLmdldE9taXRGb3JVcGRhdGUoZW50aXR5KTtcbiAgICAgICAgICAgIGtleXMgPSBrZXlzLmZpbHRlcihrID0+ICFvbWl0Rm9yVXBkYXRlS2V5cy5pbmNsdWRlcyhrKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGtleXM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZ2V0RG9udERpc3BsYXlLZXlzPEVudGl0eVR5cGUgZXh0ZW5kcyBCYXNlRW50aXR5VHlwZTxFbnRpdHlUeXBlPj4oXG4gICAgICAgIGVudGl0eTogRW50aXR5VHlwZSxcbiAgICAgICAgaW5qZWN0b3I6IEVudmlyb25tZW50SW5qZWN0b3JcbiAgICApOiAoa2V5b2YgRW50aXR5VHlwZSlbXSB7XG4gICAgICAgIGNvbnN0IHJlczogKGtleW9mIEVudGl0eVR5cGUpW10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZW50aXR5KSB7XG4gICAgICAgICAgICBjb25zdCBtZXRhZGF0YTogUHJvcGVydHlEZWNvcmF0b3JDb25maWdJbnRlcm5hbDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHRoaXMuZ2V0UHJvcGVydHlNZXRhZGF0YShlbnRpdHksIGtleSk7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdHlwZXNjcmlwdC9zdHJpY3QtYm9vbGVhbi1leHByZXNzaW9uc1xuICAgICAgICAgICAgaWYgKHJ1bkluSW5qZWN0aW9uQ29udGV4dChpbmplY3RvciwgKCkgPT4gIW1ldGFkYXRhPy5kaXNwbGF5KGVudGl0eSkpKSB7XG4gICAgICAgICAgICAgICAgcmVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cbn1cblxuLyoqXG4gKiBBIHJvdyB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0byBkaXNwbGF5IGFuIGVudGl0eS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlSb3c8RW50aXR5VHlwZSBleHRlbmRzIEJhc2VFbnRpdHlUeXBlPEVudGl0eVR5cGU+PiB7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdyBpbiB3aGljaCB0aGlzIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgcm93OiBudW1iZXIsXG4gICAgLyoqXG4gICAgICogVGhlIGtleXMgb2YgdGhlIHZhbHVlcyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhhdCByb3cuXG4gICAgICovXG4gICAga2V5czogKGtleW9mIEVudGl0eVR5cGUpW11cbn1cblxuLyoqXG4gKiBBIHRhYiB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGRpc3BsYXkgYW4gZW50aXR5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVRhYjxFbnRpdHlUeXBlIGV4dGVuZHMgQmFzZUVudGl0eVR5cGU8RW50aXR5VHlwZT4+IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdGFiIGluIHdoaWNoIHRoZSByb3dzIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAgICovXG4gICAgdGFiOiBudW1iZXIsXG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgdG8gZGlzcGxheSBpbnNpZGUgdGhlIHRhYi5cbiAgICAgKi9cbiAgICB0YWJOYW1lOiBzdHJpbmcsXG4gICAgLyoqXG4gICAgICogVGhlIHJvd3MgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluc2lkZSB0aGlzIHRhYiwuXG4gICAgICovXG4gICAgcm93czogRW50aXR5Um93PEVudGl0eVR5cGU+W11cbn0iXX0=