@sumaris-net/ngx-components 18.0.0 → 18.0.1-0.alpha1

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 (122) hide show
  1. package/doc/build.md +13 -11
  2. package/doc/changelog.md +42 -5
  3. package/esm2022/public_api.mjs +4 -2
  4. package/esm2022/src/app/admin/services/filter/person.filter.mjs +10 -3
  5. package/esm2022/src/app/admin/services/person.service.mjs +11 -5
  6. package/esm2022/src/app/admin/users/users.mjs +2 -2
  7. package/esm2022/src/app/core/about/about.modal.mjs +6 -4
  8. package/esm2022/src/app/core/about/about.module.mjs +5 -4
  9. package/esm2022/src/app/core/account/account.page.mjs +5 -6
  10. package/esm2022/src/app/core/account/token.table.mjs +10 -6
  11. package/esm2022/src/app/core/form/buttons/form-buttons-bar.component.mjs +5 -5
  12. package/esm2022/src/app/core/form/properties/properties.form.mjs +110 -57
  13. package/esm2022/src/app/core/form/properties/properties.utils.mjs +264 -32
  14. package/esm2022/src/app/core/form/properties/property.validator.mjs +36 -4
  15. package/esm2022/src/app/core/form/properties/testing/properties-form.test.mjs +26 -18
  16. package/esm2022/src/app/core/graphql/graphql.service.mjs +1 -1
  17. package/esm2022/src/app/core/home/home.module.mjs +2 -2
  18. package/esm2022/src/app/core/menu/menu.component.mjs +3 -3
  19. package/esm2022/src/app/core/menu/menu.module.mjs +2 -2
  20. package/esm2022/src/app/core/menu/menu.service.mjs +5 -4
  21. package/esm2022/src/app/core/register/register.form.mjs +1 -1
  22. package/esm2022/src/app/core/services/base-entity-service.class.mjs +1 -1
  23. package/esm2022/src/app/core/services/config/core.config.mjs +6 -1
  24. package/esm2022/src/app/core/services/local-settings.service.mjs +17 -8
  25. package/esm2022/src/app/core/services/model/config.model.mjs +1 -1
  26. package/esm2022/src/app/core/services/model/entity.model.mjs +2 -2
  27. package/esm2022/src/app/core/services/model/settings.model.mjs +1 -1
  28. package/esm2022/src/app/core/services/storage/entities-storage.service.mjs +1 -1
  29. package/esm2022/src/app/core/services/storage/entity-store.class.mjs +1 -1
  30. package/esm2022/src/app/core/services/validator/local-settings.validator.mjs +4 -24
  31. package/esm2022/src/app/core/settings/settings.page.mjs +51 -16
  32. package/esm2022/src/app/core/table/column/row-field.component.mjs +1 -1
  33. package/esm2022/src/app/core/table/testing/table.testing.mjs +1 -1
  34. package/esm2022/src/app/core/table/testing/table2.testing.mjs +1 -1
  35. package/esm2022/src/app/shared/debug/debug.component.mjs +10 -6
  36. package/esm2022/src/app/shared/form/field.component.mjs +39 -31
  37. package/esm2022/src/app/shared/form/field.model.mjs +59 -2
  38. package/esm2022/src/app/shared/functions.mjs +6 -3
  39. package/esm2022/src/app/shared/hotkeys/dialog/hotkeys-dialog.component.mjs +1 -1
  40. package/esm2022/src/app/shared/hotkeys/hotkeys.service.mjs +51 -17
  41. package/esm2022/src/app/shared/image/gallery/image-gallery.module.mjs +2 -2
  42. package/esm2022/src/app/shared/image/gallery/testing/gallery.testing.mjs +1 -1
  43. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.config.mjs +1 -1
  44. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.mjs +11 -4
  45. package/esm2022/src/app/shared/material/autocomplete/material.autocomplete.module.mjs +2 -2
  46. package/esm2022/src/app/shared/material/autocomplete/testing/autocomplete.test.mjs +18 -8
  47. package/esm2022/src/app/shared/material/chips/chips.module.mjs +2 -2
  48. package/esm2022/src/app/shared/material/chips/material.chips.mjs +4 -3
  49. package/esm2022/src/app/shared/material/latlong/material.latlong.mjs +33 -10
  50. package/esm2022/src/app/shared/named-filter/named-filter-selector.component.mjs +1 -1
  51. package/esm2022/src/app/shared/pipes/display-with.pipe.mjs +23 -0
  52. package/esm2022/src/app/shared/pipes/pipes.module.mjs +7 -3
  53. package/esm2022/src/app/shared/pipes/property.pipes.mjs +30 -31
  54. package/esm2022/src/app/shared/platforms.mjs +12 -4
  55. package/esm2022/src/app/shared/rx-state/rx-state.decorators.mjs +71 -0
  56. package/esm2022/src/app/shared/rx-state/rx-state.module.mjs +19 -0
  57. package/esm2022/src/app/shared/services/entity-service.class.mjs +1 -1
  58. package/esm2022/src/app/shared/services.mjs +34 -18
  59. package/esm2022/src/app/shared/shared.module.mjs +2 -2
  60. package/esm2022/src/app/shared/storage/storage-explorer.module.mjs +2 -2
  61. package/esm2022/src/app/shared/toolbar/modal-toolbar.mjs +2 -2
  62. package/esm2022/src/app/shared/toolbar/toolbar.module.mjs +2 -2
  63. package/esm2022/src/app/shared/types.mjs +1 -1
  64. package/esm2022/src/app/social/user-event/user-event.module.mjs +2 -2
  65. package/esm2022/src/environments/environment.mjs +3 -6
  66. package/fesm2022/sumaris-net.ngx-components.mjs +1429 -805
  67. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  68. package/package.json +5 -2
  69. package/public_api.d.ts +3 -1
  70. package/src/app/admin/services/filter/person.filter.d.ts +1 -0
  71. package/src/app/admin/services/person.service.d.ts +8 -6
  72. package/src/app/core/about/about.modal.d.ts +1 -1
  73. package/src/app/core/about/about.module.d.ts +2 -1
  74. package/src/app/core/account/token.table.d.ts +1 -1
  75. package/src/app/core/form/properties/properties.form.d.ts +28 -11
  76. package/src/app/core/form/properties/properties.utils.d.ts +41 -13
  77. package/src/app/core/form/properties/property.validator.d.ts +8 -0
  78. package/src/app/core/form/properties/testing/properties-form.test.d.ts +6 -3
  79. package/src/app/core/graphql/graphql.service.d.ts +2 -2
  80. package/src/app/core/home/home.module.d.ts +1 -1
  81. package/src/app/core/menu/menu.module.d.ts +1 -1
  82. package/src/app/core/services/base-entity-service.class.d.ts +1 -1
  83. package/src/app/core/services/config/core.config.d.ts +1 -0
  84. package/src/app/core/services/local-settings.service.d.ts +3 -1
  85. package/src/app/core/services/model/config.model.d.ts +2 -2
  86. package/src/app/core/services/model/entity.model.d.ts +2 -2
  87. package/src/app/core/services/model/settings.model.d.ts +2 -2
  88. package/src/app/core/services/storage/entities-storage.service.d.ts +4 -4
  89. package/src/app/core/services/storage/entity-store.class.d.ts +4 -4
  90. package/src/app/core/services/validator/local-settings.validator.d.ts +3 -7
  91. package/src/app/core/settings/settings.page.d.ts +4 -1
  92. package/src/app/shared/debug/debug.component.d.ts +2 -1
  93. package/src/app/shared/form/field.component.d.ts +14 -5
  94. package/src/app/shared/form/field.model.d.ts +44 -1
  95. package/src/app/shared/functions.d.ts +1 -0
  96. package/src/app/shared/hotkeys/hotkeys.service.d.ts +10 -3
  97. package/src/app/shared/image/gallery/image-gallery.module.d.ts +1 -1
  98. package/src/app/shared/material/autocomplete/material.autocomplete.config.d.ts +2 -2
  99. package/src/app/shared/material/autocomplete/material.autocomplete.d.ts +4 -1
  100. package/src/app/shared/material/autocomplete/material.autocomplete.module.d.ts +1 -1
  101. package/src/app/shared/material/chips/chips.module.d.ts +1 -1
  102. package/src/app/shared/material/chips/material.chips.d.ts +1 -0
  103. package/src/app/shared/material/latlong/material.latlong.d.ts +3 -0
  104. package/src/app/shared/pipes/display-with.pipe.d.ts +8 -0
  105. package/src/app/shared/pipes/pipes.module.d.ts +5 -4
  106. package/src/app/shared/pipes/property.pipes.d.ts +3 -9
  107. package/src/app/shared/platforms.d.ts +3 -0
  108. package/src/app/shared/rx-state/rx-state.decorators.d.ts +7 -0
  109. package/src/app/shared/services/entity-service.class.d.ts +2 -0
  110. package/src/app/shared/services.d.ts +8 -1
  111. package/src/app/shared/shared.module.d.ts +1 -1
  112. package/src/app/shared/storage/storage-explorer.module.d.ts +1 -1
  113. package/src/app/shared/toolbar/toolbar.module.d.ts +1 -1
  114. package/src/app/shared/types.d.ts +11 -6
  115. package/src/app/social/user-event/user-event.module.d.ts +1 -1
  116. package/src/assets/i18n/en-US.json +14 -2
  117. package/src/assets/i18n/en.json +13 -1
  118. package/src/assets/i18n/fr.json +11 -1
  119. package/src/assets/manifest.json +1 -1
  120. package/src/theme/_ngx-components.scss +2 -4
  121. package/esm2022/src/app/shared/rx-state.module.mjs +0 -19
  122. /package/src/app/shared/{rx-state.module.d.ts → rx-state/rx-state.module.d.ts} +0 -0
@@ -1,4 +1,61 @@
1
- import { isNotNil } from '../functions';
1
+ import { isNotNil, joinPropertiesPath } from '../functions';
2
+ import { InjectionToken } from '@angular/core';
3
+ export class FormFieldDefinitionUtils {
4
+ /**
5
+ * Prepares an array of form field definitions by using the specified injector to process each definition.
6
+ *
7
+ * @param {Injector} injector - The injector used to process each form field definition.
8
+ * @param {FormFieldDefinition[]} defs - An array of form field definitions to be prepared.
9
+ * @return {FormFieldDefinition[]} An array of prepared form field definitions.
10
+ */
11
+ static prepareDefinitions(injector, defs) {
12
+ return defs?.map((def) => FormFieldDefinitionUtils.prepareDefinition(injector, def));
13
+ }
14
+ /**
15
+ * Prepares the definition by processing its type and optionally setting the values property.
16
+ *
17
+ * @param {Injector} injector - The injector used to get the necessary services.
18
+ * @param {FormFieldDefinition} def - The form field definition to be prepared.
19
+ * @return {FormFieldDefinition} - The prepared form field definition with updated values if the type is 'enum' or 'enums'.
20
+ */
21
+ static prepareDefinition(injector, def) {
22
+ if (def.type === 'enum' || def.type === 'enums') {
23
+ return {
24
+ ...def,
25
+ values: FormFieldDefinitionUtils.getEnumValues(injector, def.values),
26
+ };
27
+ }
28
+ return def;
29
+ }
30
+ /**
31
+ * Retrieves an array of Property objects from the provided enum values.
32
+ *
33
+ * @param {Injector} injector - The Angular injector to resolve the InjectionToken.
34
+ * @param {(string | Property)[] | InjectionToken<(string | Property)[]>} enumValues - The enum values, which can be an array of strings, array of Property objects, or an InjectionToken that resolves to such an array.
35
+ * @return {Property[]} An array of Property objects.
36
+ */
37
+ static getEnumValues(injector, enumValues) {
38
+ // Resolve token
39
+ if (enumValues instanceof InjectionToken) {
40
+ const values = injector.get(enumValues);
41
+ return Array.isArray(values) ? FormFieldDefinitionUtils.asPropertyArray(values) : [];
42
+ }
43
+ // Normalize string[] => Property[]
44
+ return FormFieldDefinitionUtils.asPropertyArray(enumValues);
45
+ }
46
+ static getDisplayValueFn(definition) {
47
+ if (definition.autocomplete && definition.autocomplete.displayWith) {
48
+ return (obj) => definition.autocomplete.displayWith(obj);
49
+ }
50
+ const attributes = (definition.autocomplete && definition.autocomplete.attributes) || ['label', 'name'];
51
+ return (obj) => obj && joinPropertiesPath(obj, attributes);
52
+ }
53
+ static asPropertyArray(values) {
54
+ return (Array.isArray(values) ? values : [])
55
+ .map((v) => (typeof v === 'string' ? { key: v, value: v } : typeof v === 'object' ? v : null))
56
+ .filter(isNotNil);
57
+ }
58
+ }
2
59
  export class FormFieldValuesHolder {
3
60
  getAsBoolean(data, definition) {
4
61
  const value = this.get(data, definition);
@@ -22,4 +79,4 @@ export class FormFieldValuesHolder {
22
79
  return isNotNil(data[definition.key]) ? data[definition.key] : definition.defaultValue || undefined;
23
80
  }
24
81
  }
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9mb3JtL2ZpZWxkLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFrRHhDLE1BQU0sT0FBZ0IscUJBQXFCO0lBQ3pDLFlBQVksQ0FBQyxJQUFlLEVBQUUsVUFBK0I7UUFDM0QsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDekMsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxLQUFLLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDbEUsQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUFTLEVBQUUsVUFBK0I7UUFDakQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDekMsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxZQUFZLENBQUMsSUFBUyxFQUFFLFVBQStCO1FBQ3JELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3pDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtZQUFFLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksU0FBUyxDQUFDO1FBQ3BGLE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDM0QsQ0FBQztJQUVELFlBQVksQ0FBQyxJQUFTLEVBQUUsVUFBK0I7UUFDckQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksU0FBUyxDQUFDO0lBQ2xELENBQUM7SUFFRCxHQUFHLENBQWEsSUFBUyxFQUFFLFVBQStCO1FBQ3hELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFlBQVksSUFBSSxTQUFTLENBQUM7SUFDdEcsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2JqZWN0TWFwLCBQcm9wZXJ0eSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGlzTm90TmlsIH0gZnJvbSAnLi4vZnVuY3Rpb25zJztcbmltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRBdXRvY29tcGxldGVGaWVsZENvbmZpZyB9IGZyb20gJy4uL21hdGVyaWFsL2F1dG9jb21wbGV0ZS9tYXRlcmlhbC5hdXRvY29tcGxldGUuY29uZmlnJztcbmltcG9ydCB7IFVzZXJQcm9maWxlTGFiZWwgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL21vZGVsL3BlcnNvbi5tb2RlbCc7XG5pbXBvcnQgeyBGbG9hdExhYmVsVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xuXG5leHBvcnQgZGVjbGFyZSB0eXBlIERpc3BsYXlGbiA9IChvYmo6IGFueSkgPT4gc3RyaW5nO1xuXG5leHBvcnQgZGVjbGFyZSB0eXBlIEVxdWFsc0ZuID0gKG8xOiBhbnksIG8yOiBhbnkpID0+IGJvb2xlYW47XG5cbmV4cG9ydCBkZWNsYXJlIHR5cGUgQ29tcGFyZUZuID0gKG8xOiBhbnksIG8yOiBhbnkpID0+IG51bWJlcjtcblxuZXhwb3J0IGRlY2xhcmUgdHlwZSBGb3JtRmllbGRUeXBlID1cbiAgfCAnaW50ZWdlcidcbiAgfCAnZG91YmxlJ1xuICB8ICdib29sZWFuJ1xuICB8ICdzdHJpbmcnXG4gIHwgJ2VudW0nXG4gIHwgJ2VudW1zJ1xuICB8ICdjb2xvcidcbiAgfCAncGVlcidcbiAgfCAnZW50aXR5J1xuICB8ICdlbnRpdGllcydcbiAgfCAnZGF0ZSdcbiAgfCAnZGF0ZVRpbWUnO1xuZXhwb3J0IGRlY2xhcmUgdHlwZSBBcHBGbG9hdExhYmVsVHlwZSA9IEZsb2F0TGFiZWxUeXBlIHwgJ25ldmVyJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEZvcm1GaWVsZERlZmluaXRpb248SyA9IHN0cmluZywgVCA9IEZvcm1GaWVsZFR5cGUsIEUgPSBhbnk+IHtcbiAga2V5OiBLO1xuICB0eXBlOiBUO1xuICBsYWJlbDogc3RyaW5nO1xuICBtaW5WYWx1ZT86IG51bWJlcjtcbiAgbWF4VmFsdWU/OiBudW1iZXI7XG4gIG1heGltdW1OdW1iZXJEZWNpbWFscz86IG51bWJlcjtcbiAgZGVmYXVsdFZhbHVlPzogYW55O1xuICBpc1RyYW5zaWVudD86IGJvb2xlYW47IC8vIFVzZWZ1bCBvbmx5IGZvciByZW1vdGUgY29uZmlndXJhdGlvblxuICB2YWx1ZXM/OiAoc3RyaW5nIHwgUHJvcGVydHkpW10gfCBJbmplY3Rpb25Ub2tlbjwoc3RyaW5nIHwgUHJvcGVydHkpW10+O1xuICBhdXRvY29tcGxldGU/OiBNYXRBdXRvY29tcGxldGVGaWVsZENvbmZpZzxFPjtcbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xuICByZXF1aXJlZD86IGJvb2xlYW47XG4gIGV4dHJhPzoge1xuICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgICAgIHJlcXVpcmVkOiBib29sZWFuO1xuICAgIH07XG4gIH07XG4gIG1pblByb2ZpbGU/OiBVc2VyUHJvZmlsZUxhYmVsO1xufVxuZXhwb3J0IGRlY2xhcmUgdHlwZSBGb3JtRmllbGREZWZpbml0aW9uTWFwID0gT2JqZWN0TWFwPEZvcm1GaWVsZERlZmluaXRpb24+O1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybUZpZWxkVmFsdWVzSG9sZGVyIHtcbiAgZ2V0QXNCb29sZWFuKGRhdGE6IE9iamVjdE1hcCwgZGVmaW5pdGlvbjogRm9ybUZpZWxkRGVmaW5pdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoZGF0YSwgZGVmaW5pdGlvbik7XG4gICAgcmV0dXJuIGlzTm90TmlsKHZhbHVlKSA/IHZhbHVlICYmIHZhbHVlICE9PSAnZmFsc2UnIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0QXNJbnQoZGF0YTogYW55LCBkZWZpbml0aW9uOiBGb3JtRmllbGREZWZpbml0aW9uKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KGRhdGEsIGRlZmluaXRpb24pO1xuICAgIHJldHVybiBpc05vdE5pbCh2YWx1ZSkgPyBwYXJzZUludCh2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRBc051bWJlcnMoZGF0YTogYW55LCBkZWZpbml0aW9uOiBGb3JtRmllbGREZWZpbml0aW9uKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoZGF0YSwgZGVmaW5pdGlvbik7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZS5zcGxpdCgnLCcpLm1hcChwYXJzZUZsb2F0KSB8fCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGlzTm90TmlsKHZhbHVlKSA/IFtwYXJzZUZsb2F0KHZhbHVlKV0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRBc1N0cmluZ3MoZGF0YTogYW55LCBkZWZpbml0aW9uOiBGb3JtRmllbGREZWZpbml0aW9uKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoZGF0YSwgZGVmaW5pdGlvbik7XG4gICAgcmV0dXJuICh2YWx1ZSAmJiB2YWx1ZS5zcGxpdCgnLCcpKSB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQ8VCA9IHN0cmluZz4oZGF0YTogYW55LCBkZWZpbml0aW9uOiBGb3JtRmllbGREZWZpbml0aW9uKTogVCB7XG4gICAgcmV0dXJuIGlzTm90TmlsKGRhdGFbZGVmaW5pdGlvbi5rZXldKSA/IGRhdGFbZGVmaW5pdGlvbi5rZXldIDogZGVmaW5pdGlvbi5kZWZhdWx0VmFsdWUgfHwgdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
82
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9mb3JtL2ZpZWxkLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxRQUFRLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQW9FekQsTUFBTSxPQUFPLHdCQUF3QjtJQUNuQzs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsa0JBQWtCLENBQUMsUUFBa0IsRUFBRSxJQUEyQjtRQUN2RSxPQUFPLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLHdCQUF3QixDQUFDLGlCQUFpQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZGLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxNQUFNLENBQUMsaUJBQWlCLENBQUMsUUFBa0IsRUFBRSxHQUF3QjtRQUNuRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDaEQsT0FBTztnQkFDTCxHQUFHLEdBQUc7Z0JBQ04sTUFBTSxFQUFFLHdCQUF3QixDQUFDLGFBQWEsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQzthQUNyRSxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBa0IsRUFBRSxVQUF5RTtRQUNoSCxnQkFBZ0I7UUFDaEIsSUFBSSxVQUFVLFlBQVksY0FBYyxFQUFFLENBQUM7WUFDekMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN4QyxPQUFPLEtBQUss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QUN6QyxPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxTQUFTLENBQUM7SUFDbEQsQ0FBQztJQUVELEdBQUcsQ0FBYSxJQUFTLEVBQUUsVUFBK0I7UUFDeEQsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsWUFBWSxJQUFJLFNBQVMsQ0FBQztJQUN0RyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYmplY3RNYXAsIFByb3BlcnR5IH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgaXNOb3ROaWwsIGpvaW5Qcm9wZXJ0aWVzUGF0aCB9IGZyb20gJy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnIH0gZnJvbSAnLi4vbWF0ZXJpYWwvYXV0b2NvbXBsZXRlL21hdGVyaWFsLmF1dG9jb21wbGV0ZS5jb25maWcnO1xuaW1wb3J0IHsgVXNlclByb2ZpbGVMYWJlbCB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvbW9kZWwvcGVyc29uLm1vZGVsJztcbmltcG9ydCB7IEZsb2F0TGFiZWxUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5cbmV4cG9ydCBkZWNsYXJlIHR5cGUgRGlzcGxheUZuID0gKG9iajogYW55KSA9PiBzdHJpbmc7XG5cbmV4cG9ydCBkZWNsYXJlIHR5cGUgRXF1YWxzRm4gPSAobzE6IGFueSwgbzI6IGFueSkgPT4gYm9vbGVhbjtcblxuZXhwb3J0IGRlY2xhcmUgdHlwZSBDb21wYXJlRm4gPSAobzE6IGFueSwgbzI6IGFueSkgPT4gbnVtYmVyO1xuXG5leHBvcnQgZGVjbGFyZSB0eXBlIEZvcm1GaWVsZFR5cGUgPVxuICB8ICdpbnRlZ2VyJ1xuICB8ICdkb3VibGUnXG4gIHwgJ2Jvb2xlYW4nXG4gIHwgJ3N0cmluZydcbiAgfCAnZW51bSdcbiAgfCAnZW51bXMnXG4gIHwgJ2NvbG9yJ1xuICB8ICdwZWVyJ1xuICB8ICdlbnRpdHknXG4gIHwgJ2VudGl0aWVzJ1xuICB8ICdkYXRlJ1xuICB8ICdkYXRlVGltZSc7XG5leHBvcnQgZGVjbGFyZSB0eXBlIEFwcEZsb2F0TGFiZWxUeXBlID0gRmxvYXRMYWJlbFR5cGUgfCAnbmV2ZXInO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgRm9ybUZpZWxkRGVmaW5pdGlvbjxLID0gc3RyaW5nLCBUID0gRm9ybUZpZWxkVHlwZSwgRSA9IGFueT4ge1xuICBrZXk6IEs7XG4gIHR5cGU6IFQ7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIG1pblZhbHVlPzogbnVtYmVyO1xuICBtYXhWYWx1ZT86IG51bWJlcjtcbiAgbWF4aW11bU51bWJlckRlY2ltYWxzPzogbnVtYmVyO1xuICBkZWZhdWx0VmFsdWU/OiBhbnk7XG4gIGlzVHJhbnNpZW50PzogYm9vbGVhbjsgLy8gVXNlZnVsIG9ubHkgZm9yIHJlbW90ZSBjb25maWd1cmF0aW9uXG4gIHZhbHVlcz86IChzdHJpbmcgfCBQcm9wZXJ0eSlbXSB8IEluamVjdGlvblRva2VuPChzdHJpbmcgfCBQcm9wZXJ0eSlbXT47XG4gIGF1dG9jb21wbGV0ZT86IE1hdEF1dG9jb21wbGV0ZUZpZWxkQ29uZmlnPEU+O1xuXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgcmVxdWlyZWQ/OiBib29sZWFuO1xuICBleHRyYT86IHtcbiAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICBkaXNhYmxlZD86IGJvb2xlYW47XG4gICAgICByZXF1aXJlZDogYm9vbGVhbjtcbiAgICB9O1xuICB9O1xuICBtaW5Qcm9maWxlPzogVXNlclByb2ZpbGVMYWJlbDtcblxuICAvKipcbiAgICogVXNlIGZvciBhdXRvbWF0aWMgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gdG8vZnJvbSBzdHJpbmcgKGVnLiB1c2luZyB0aGUgYXV0b2NvbXBsZXRlIHN1Z2dlc3RGbikuXG4gICAqIERlZmF1bHQgdmFsdWU6ICdpZCdcbiAgICovXG4gIHNlcmlhbGl6ZUF0dHJpYnV0ZT86IHN0cmluZztcblxuICAvKipcbiAgICogVXNlIHRvIHNlcmlhbGl6ZSBhbiBlbnRpdHkgaW50byBzdHJpbmcgKHNlZSBBcHBQcm9wZXJ0aWVzVXRpbHMuKioqYXNPYmplY3QoKSlcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBzZXJpYWxpemU/OiAodmFsdWU6IEUpID0+IHN0cmluZztcblxuICAvKipcbiAgICogVXNlIHRvIGRlc2VyaWFsaXplIGEgc3RyaW5nIGludG8gYW4gZW50aXR5IChzZWUgQXBwUHJvcGVydGllc1V0aWxzLioqKmZyb21PYmplY3QoKSlcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBkZXNlcmlhbGl6ZT86ICh2YWx1ZTogc3RyaW5nKSA9PiBFIHwgUHJvbWlzZTxFPjtcbn1cbmV4cG9ydCBkZWNsYXJlIHR5cGUgRm9ybUZpZWxkRGVmaW5pdGlvbk1hcCA9IE9iamVjdE1hcDxGb3JtRmllbGREZWZpbml0aW9uPjtcblxuZXhwb3J0IGNsYXNzIEZvcm1GaWVsZERlZmluaXRpb25VdGlscyB7XG4gIC8qKlxuICAgKiBQcmVwYXJlcyBhbiBhcnJheSBvZiBmb3JtIGZpZWxkIGRlZmluaXRpb25zIGJ5IHVzaW5nIHRoZSBzcGVjaWZpZWQgaW5qZWN0b3IgdG8gcHJvY2VzcyBlYWNoIGRlZmluaXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7SW5qZWN0b3J9IGluamVjdG9yIC0gVGhlIGluamVjdG9yIHVzZWQgdG8gcHJvY2VzcyBlYWNoIGZvcm0gZmllbGQgZGVmaW5pdGlvbi5cbiAgICogQHBhcmFtIHtGb3JtRmllbGREZWZpbml0aW9uW119IGRlZnMgLSBBbiBhcnJheSBvZiBmb3JtIGZpZWxkIGRlZmluaXRpb25zIHRvIGJlIHByZXBhcmVkLlxuICAgKiBAcmV0dXJuIHtGb3JtRmllbGREZWZpbml0aW9uW119IEFuIGFycmF5IG9mIHByZXBhcmVkIGZvcm0gZmllbGQgZGVmaW5pdGlvbnMuXG4gICAqL1xuICBzdGF0aWMgcHJlcGFyZURlZmluaXRpb25zKGluamVjdG9yOiBJbmplY3RvciwgZGVmczogRm9ybUZpZWxkRGVmaW5pdGlvbltdKTogRm9ybUZpZWxkRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gZGVmcz8ubWFwKChkZWYpID0+IEZvcm1GaWVsZERlZmluaXRpb25VdGlscy5wcmVwYXJlRGVmaW5pdGlvbihpbmplY3RvciwgZGVmKSk7XG4gIH1cblxuICAvKipcbiAgICogUHJlcGFyZXMgdGhlIGRlZmluaXRpb24gYnkgcHJvY2Vzc2luZyBpdHMgdHlwZSBhbmQgb3B0aW9uYWxseSBzZXR0aW5nIHRoZSB2YWx1ZXMgcHJvcGVydHkuXG4gICAqXG4gICAqIEBwYXJhbSB7SW5qZWN0b3J9IGluamVjdG9yIC0gVGhlIGluamVjdG9yIHVzZWQgdG8gZ2V0IHRoZSBuZWNlc3Nhcnkgc2VydmljZXMuXG4gICAqIEBwYXJhbSB7Rm9ybUZpZWxkRGVmaW5pdGlvbn0gZGVmIC0gVGhlIGZvcm0gZmllbGQgZGVmaW5pdGlvbiB0byBiZSBwcmVwYXJlZC5cbiAgICogQHJldHVybiB7Rm9ybUZpZWxkRGVmaW5pdGlvbn0gLSBUaGUgcHJlcGFyZWQgZm9ybSBmaWVsZCBkZWZpbml0aW9uIHdpdGggdXBkYXRlZCB2YWx1ZXMgaWYgdGhlIHR5cGUgaXMgJ2VudW0nIG9yICdlbnVtcycuXG4gICAqL1xuICBzdGF0aWMgcHJlcGFyZURlZmluaXRpb24oaW5qZWN0b3I6IEluamVjdG9yLCBkZWY6IEZvcm1GaWVsZERlZmluaXRpb24pOiBGb3JtRmllbGREZWZpbml0aW9uIHtcbiAgICBpZiAoZGVmLnR5cGUgPT09ICdlbnVtJyB8fCBkZWYudHlwZSA9PT0gJ2VudW1zJykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZGVmLFxuICAgICAgICB2YWx1ZXM6IEZvcm1GaWVsZERlZmluaXRpb25VdGlscy5nZXRFbnVtVmFsdWVzKGluamVjdG9yLCBkZWYudmFsdWVzKSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBkZWY7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGFuIGFycmF5IG9mIFByb3BlcnR5IG9iamVjdHMgZnJvbSB0aGUgcHJvdmlkZWQgZW51bSB2YWx1ZXMuXG4gICAqXG4gICAqIEBwYXJhbSB7SW5qZWN0b3J9IGluamVjdG9yIC0gVGhlIEFuZ3VsYXIgaW5qZWN0b3IgdG8gcmVzb2x2ZSB0aGUgSW5qZWN0aW9uVG9rZW4uXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IFByb3BlcnR5KVtdIHwgSW5qZWN0aW9uVG9rZW48KHN0cmluZyB8IFByb3BlcnR5KVtdPn0gZW51bVZhbHVlcyAtIFRoZSBlbnVtIHZhbHVlcywgd2hpY2ggY2FuIGJlIGFuIGFycmF5IG9mIHN0cmluZ3MsIGFycmF5IG9mIFByb3BlcnR5IG9iamVjdHMsIG9yIGFuIEluamVjdGlvblRva2VuIHRoYXQgcmVzb2x2ZXMgdG8gc3VjaCBhbiBhcnJheS5cbiAgICogQHJldHVybiB7UHJvcGVydHlbXX0gQW4gYXJyYXkgb2YgUHJvcGVydHkgb2JqZWN0cy5cbiAgICovXG4gIHN0YXRpYyBnZXRFbnVtVmFsdWVzKGluamVjdG9yOiBJbmplY3RvciwgZW51bVZhbHVlczogKHN0cmluZyB8IFByb3BlcnR5KVtdIHwgSW5qZWN0aW9uVG9rZW48KHN0cmluZyB8IFByb3BlcnR5KVtdPik6IFByb3BlcnR5W10ge1xuICAgIC8vIFJlc29sdmUgdG9rZW5cbiAgICBpZiAoZW51bVZhbHVlcyBpbnN0YW5jZW9mIEluamVjdGlvblRva2VuKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBpbmplY3Rvci5nZXQoZW51bVZhbHVlcyk7XG4gICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZXMpID8gRm9ybUZpZWxkRGVmaW5pdGlvblV0aWxzLmFzUHJvcGVydHlBcnJheSh2YWx1ZXMpIDogW107XG4gICAgfVxuXG4gICAgLy8gTm9ybWFsaXplIHN0cmluZ1tdID0+IFByb3BlcnR5W11cbiAgICByZXR1cm4gRm9ybUZpZWxkRGVmaW5pdGlvblV0aWxzLmFzUHJvcGVydHlBcnJheShlbnVtVmFsdWVzIGFzIChzdHJpbmcgfCBQcm9wZXJ0eSlbXSk7XG4gIH1cblxuICBzdGF0aWMgZ2V0RGlzcGxheVZhbHVlRm4oZGVmaW5pdGlvbjogRm9ybUZpZWxkRGVmaW5pdGlvbik6IERpc3BsYXlGbiB7XG4gICAgaWYgKGRlZmluaXRpb24uYXV0b2NvbXBsZXRlICYmIGRlZmluaXRpb24uYXV0b2NvbXBsZXRlLmRpc3BsYXlXaXRoKSB7XG4gICAgICByZXR1cm4gKG9iajogYW55KSA9PiBkZWZpbml0aW9uLmF1dG9jb21wbGV0ZS5kaXNwbGF5V2l0aChvYmopO1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVzID0gKGRlZmluaXRpb24uYXV0b2NvbXBsZXRlICYmIGRlZmluaXRpb24uYXV0b2NvbXBsZXRlLmF0dHJpYnV0ZXMpIHx8IFsnbGFiZWwnLCAnbmFtZSddO1xuICAgIHJldHVybiAob2JqOiBhbnkpID0+IG9iaiAmJiBqb2luUHJvcGVydGllc1BhdGgob2JqLCBhdHRyaWJ1dGVzKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGFzUHJvcGVydHlBcnJheSh2YWx1ZXM6IChzdHJpbmcgfCBQcm9wZXJ0eSlbXSk6IFByb3BlcnR5W10ge1xuICAgIHJldHVybiAoQXJyYXkuaXNBcnJheSh2YWx1ZXMpID8gdmFsdWVzIDogW10pXG4gICAgICAubWFwKCh2KSA9PiAodHlwZW9mIHYgPT09ICdzdHJpbmcnID8gPFByb3BlcnR5Pnsga2V5OiB2LCB2YWx1ZTogdiB9IDogdHlwZW9mIHYgPT09ICdvYmplY3QnID8gKHYgYXMgUHJvcGVydHkpIDogbnVsbCkpXG4gICAgICAuZmlsdGVyKGlzTm90TmlsKTtcbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybUZpZWxkVmFsdWVzSG9sZGVyIHtcbiAgZ2V0QXNCb29sZWFuKGRhdGE6IE9iamVjdE1hcCwgZGVmaW5pdGlvbjogRm9ybUZpZWxkRGVmaW5pdGlvbik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoZGF0YSwgZGVmaW5pdGlvbik7XG4gICAgcmV0dXJuIGlzTm90TmlsKHZhbHVlKSA/IHZhbHVlICYmIHZhbHVlICE9PSAnZmFsc2UnIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0QXNJbnQoZGF0YTogYW55LCBkZWZpbml0aW9uOiBGb3JtRmllbGREZWZpbml0aW9uKTogbnVtYmVyIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0KGRhdGEsIGRlZmluaXRpb24pO1xuICAgIHJldHVybiBpc05vdE5pbCh2YWx1ZSkgPyBwYXJzZUludCh2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRBc051bWJlcnMoZGF0YTogYW55LCBkZWZpbml0aW9uOiBGb3JtRmllbGREZWZpbml0aW9uKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoZGF0YSwgZGVmaW5pdGlvbik7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHJldHVybiB2YWx1ZS5zcGxpdCgnLCcpLm1hcChwYXJzZUZsb2F0KSB8fCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIGlzTm90TmlsKHZhbHVlKSA/IFtwYXJzZUZsb2F0KHZhbHVlKV0gOiB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXRBc1N0cmluZ3MoZGF0YTogYW55LCBkZWZpbml0aW9uOiBGb3JtRmllbGREZWZpbml0aW9uKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5nZXQoZGF0YSwgZGVmaW5pdGlvbik7XG4gICAgcmV0dXJuICh2YWx1ZSAmJiB2YWx1ZS5zcGxpdCgnLCcpKSB8fCB1bmRlZmluZWQ7XG4gIH1cblxuICBnZXQ8VCA9IHN0cmluZz4oZGF0YTogYW55LCBkZWZpbml0aW9uOiBGb3JtRmllbGREZWZpbml0aW9uKTogVCB7XG4gICAgcmV0dXJuIGlzTm90TmlsKGRhdGFbZGVmaW5pdGlvbi5rZXldKSA/IGRhdGFbZGVmaW5pdGlvbi5rZXldIDogZGVmaW5pdGlvbi5kZWZhdWx0VmFsdWUgfHwgdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
@@ -259,12 +259,12 @@ export function isNumberRange(value) {
259
259
  return isNotNil(value) && NUMBER_RANGE_REGEXP.test(value);
260
260
  }
261
261
  export function getPropertyByPath(obj, path, defaultValue) {
262
+ if (isNil(obj))
263
+ return defaultValue;
262
264
  // Path is an array: convert path to string
263
265
  if (Array.isArray(path)) {
264
266
  return getPropertyByPath(obj, path.join('.'), defaultValue);
265
267
  }
266
- if (isNil(obj))
267
- return defaultValue;
268
268
  if (isNilOrBlank(path))
269
269
  return obj;
270
270
  if (path.indexOf('[') !== -1) {
@@ -332,6 +332,9 @@ export function sleep(ms) {
332
332
  return Promise.resolve();
333
333
  return new Promise((resolve) => setTimeout(resolve, ms));
334
334
  }
335
+ export function isPromise(value) {
336
+ return typeof value?.['then'] === 'function' && typeof value?.['catch'] === 'function';
337
+ }
335
338
  export function round(value) {
336
339
  if (isNotNilOrNaN(value)) {
337
340
  return Math.round((value + Number.EPSILON) * 100) / 100;
@@ -548,4 +551,4 @@ export function noHtml(value) {
548
551
  return value;
549
552
  }
550
553
  }
551
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvZnVuY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVoRSxNQUFNLFVBQVUsS0FBSyxDQUFJLEdBQXlCO0lBQ2hELE9BQU8sR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDO0FBQzNDLENBQUM7QUFDRCxNQUFNLFVBQVUsWUFBWSxDQUFJLEdBQXlCO0lBQ3ZELE9BQU8sR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUM3RixDQUFDO0FBQ0QsTUFBTSxVQUFVLFFBQVEsQ0FBSSxHQUF5QjtJQUNuRCxPQUFPLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQztBQUMzQyxDQUFDO0FBQ0QsTUFBTSxVQUFVLGVBQWUsQ0FBSSxHQUF5QjtJQUMxRCxPQUFPLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDN0YsQ0FBQztBQUNELE1BQU0sVUFBVSxhQUFhLENBQUksR0FBeUI7SUFDeEQsT0FBTyxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RixDQUFDO0FBQ0QsTUFBTSxVQUFVLFVBQVUsQ0FBSSxHQUF5QjtJQUNyRCxPQUFPLEdBQUcsS0FBSyxTQUFT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TUFBTSxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFFcEMscUVBQXFFO0lBQ3JFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUM5RixDQUFDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FBQyxLQUFhO0lBQ2xDLElBQUksS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ3ZDLGlEQUFpRDtRQUNqRCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsOEJBQThCLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDM0QsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgS2V5c0VudW0sIEtleVZhbHVlVHlwZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgREVGQVVMVF9KT0lOX1BST1BFUlRJRVNfU0VQQVJBVE9SIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNOaWw8VD4ob2JqOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTmlsT3JCbGFuazxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogPT09IHVuZGVmaW5lZCB8fCBvYmogPT09IG51bGwgfHwgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnICYmIG9iai50cmltKCkgPT09ICcnKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05vdE5pbDxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb3ROaWxPckJsYW5rPFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCAmJiAodHlwZW9mIG9iaiAhPT0gJ3N0cmluZycgfHwgb2JqLnRyaW0oKSAhPT0gJycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTm90TmlsT3JOYU48VD4ob2JqOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsICYmICh0eXBlb2Ygb2JqICE9PSAnbnVtYmVyJyB8fCAhaXNOYU4ob2JqKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOaWxPck5hTjxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogPT09IHVuZGVmaW5lZCB8fCBvYmogPT09IG51bGwgfHwgKHR5cGVvZiBvYmogPT09ICdudW1iZXInICYmIGlzTmFOKG9iaikpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTm90RW1wdHlBcnJheTxUPihvYmo6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCAmJiBvYmoubGVuZ3RoID4gMDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBmaXJzdEFycmF5VmFsdWU8VD4ob2JqOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKTogVCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBpc05vdEVtcHR5QXJyYXkob2JqKSA/IG9ialswXSA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBsYXN0QXJyYXlWYWx1ZTxUPihvYmo6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGlzTm90RW1wdHlBcnJheShvYmopID8gb2JqW29iai5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc0VtcHR5QXJyYXk8VD4ob2JqOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogPT09IHVuZGVmaW5lZCB8fCBvYmogPT09IG51bGwgfHwgIW9iai5sZW5ndGg7XG59XG5leHBvcnQgZnVuY3Rpb24gYXJyYXlSZXNpemU8VD4oYXJyYXk6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQsIHNpemU6IG51bWJlciwgZGVmYXVsdFZhbHVlPzogVCk6IFRbXSB7XG4gIGlmIChzaXplIDwgMCkgdGhyb3cgbmV3IEVycm9yKFwiQXJndW1lbnQgJ3NpemUnIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXJcIik7XG4gIGlmICghYXJyYXkpIHJldHVybiBuZXdBcnJheShzaXplLCBkZWZhdWx0VmFsdWUpO1xuXG4gIC8vIFJlZHVjZSBzaXplXG4gIGlmIChhcnJheS5sZW5ndGggPiBzaXplKSB7XG4gICAgcmV0dXJuIGFycmF5LnNsaWNlKDAsIHNpemUpO1xuICB9XG4gIC8vIEluY3JlYXNlIHNpemVcbiAgZWxzZSBpZiAoYXJyYXkubGVuZ3RoIDwgc2l6ZSkge1xuICAgIHJldHVybiBbLi4uYXJyYXksIC4uLm5ld0FycmF5KHNpemUgLSBhcnJheS5sZW5ndGgsIGRlZmF1bHRWYWx1ZSldO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5O1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5ld0FycmF5PFQ+KHNpemU6IG51bWJlciwgZGVmYXVsdFZhbHVlPzogVCk6IFRbXSB7XG4gIGlmIChzaXplIDwgMCkgdGhyb3cgbmV3IEVycm9yKFwiQXJndW1lbnQgJ3NpemUnIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXJcIik7XG4gIHJldHVybiBuZXcgQXJyYXkoc2l6ZSkuZmlsbChkZWZhdWx0VmFsdWUpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTm90TmlsQm9vbGVhbihvYmo6IGFueSB8IG51bGwgfCB1bmRlZmluZWQpOiBvYmogaXMgYm9vbGVhbiB7XG4gIHJldHVybiAob2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdib29sZWFuJykgfHwgZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb3ROaWxTdHJpbmcob2JqOiBhbnkgfCBudWxsIHwgdW5kZWZpbmVkKTogb2JqIGlzIHN0cmluZyB7XG4gIHJldHVybiAob2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB8fCBmYWxzZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05vdE5pbE9iamVjdChvYmo6IGFueSB8IG51bGwgfCB1bmRlZmluZWQpOiBvYmogaXMgc3RyaW5nIHtcbiAgcmV0dXJuIChvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHx8IGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzQmxhbmtTdHJpbmcob2JqOiBhbnkgfCBudWxsIHwgdW5kZWZpbmVkKTogb2JqIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2Ygb2JqID09PSAnc3RyaW5nJyAmJiBvYmoudHJpbSgpLmxlbmd0aCA9PT0gMDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBub3ROaWxPckRlZmF1bHQ8VD4ob2JqOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCwgZGVmYXVsdFZhbHVlOiBUKTogVCB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgPyBvYmogOiBkZWZhdWx0VmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gYXJyYXlTaXplPFQ+KG9iajogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCk6IG51bWJlciB7XG4gIHJldHVybiAoaXNOb3RFbXB0eUFycmF5KG9iaikgJiYgb2JqLmxlbmd0aCkgfHwgMDtcbn1cblxuLyoqXG4gKiBSZW1vdmUgZHVwbGljYXRlZCB2YWx1ZSwgaW4gYXJyYXkuIFdpbGwgY29tcHV0ZSBhIHVuaXF1ZSBrZXkgKGZyb20gZ2l2ZW4gcHJvcGVydGllcywgb3IgZ2l2ZW4gZnVuY3Rpb24pLlxuICogSWYgcHJvcGVydGllc09yS2V5Rm4gaXMgbmlsIG9yIHVuZGVmaW5lZCwgd2lsbCB1c2UgYWxsIG9iamVjdCBwcm9wZXJ0aWVzXG4gKlxuICogQHBhcmFtIHZhbHVlc1xuICogQHBhcmFtIHByb3BlcnRpZXNPcktleUZuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheURpc3RpbmN0PFQgPSBhbnk+KHZhbHVlczogVFtdLCBwcm9wZXJ0aWVzT3JLZXlGbj86IHN0cmluZyB8IHN0cmluZ1tdIHwgKChvYmo6IFQpID0+IHN0cmluZykpOiBUW10ge1xuICBpZiAoaXNFbXB0eUFycmF5KHZhbHVlcykpIHJldHVybiB2YWx1ZXM7XG4gIGNvbnN0IHByb3BlcnRpZXM6IHN0cmluZ1tdID0gKCFwcm9wZXJ0aWVzT3JLZXlGbiAmJiBPYmplY3Qua2V5cyh2YWx1ZXNbMF0pKSB8fCAoQXJyYXkuaXNBcnJheShwcm9wZXJ0aWVzT3JLZXlGbikgJiYgcHJvcGVydGllc09yS2V5Rm4pO1xuICBjb25zdCBnZXRLZXk6IChvYmo6IFQpID0+IHN0cmluZyA9XG4gICAgKHR5cGVvZiBwcm9wZXJ0aWVzT3JLZXlGbiA9PT0gJ2Z1bmN0aW9uJyAmJiBwcm9wZXJ0aWVzT3JLZXlGbikgfHxcbiAgICAodHlwZW9mIHByb3BlcnRpZXNPcktleUZuID09PSAnc3RyaW5nJyAmJiAoKG9iaikgPT4gZ2V0UHJvcGVydHlCeVBhdGhBc1N0cmluZyhvYmosIHByb3BlcnRpZXNPcktleUZuKSkpIHx8XG4gICAgKGlzRW1wdHlBcnJheShwcm9wZXJ0aWVzKSAmJiAoKG9iaikgPT4gb2JqPy50b1N0cmluZygpKSkgfHxcbiAgICAoKG9iaikgPT4gam9pblByb3BlcnRpZXNQYXRoKG9iaiwgcHJvcGVydGllcywgJ3wnKSk7XG4gIGNvbnN0IGV4aXN0aW5nSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHJldHVybiB2YWx1ZXMucmVkdWNlKChyZXMsIGl0ZW0pID0+IHtcbiAgICBjb25zdCB1bmlxdWVLZXkgPSBnZXRLZXkoaXRlbSk7XG4gICAgaWYgKGV4aXN0aW5nSWRzLmhhcyh1bmlxdWVLZXkpKSByZXR1cm4gcmVzOyAvLyBTa2lwIGlmIGR1cGxpY2F0ZVxuICAgIGV4aXN0aW5nSWRzLmFkZCh1bmlxdWVLZXkpO1xuICAgIHJldHVybiByZXMuY29uY2F0KGl0ZW0pO1xuICB9LCBbXSk7XG59XG5leHBvcnQgZnVuY3Rpb24gbnVsbElmVW5kZWZpbmVkPFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBUIHwgbnVsbCB7XG4gIHJldHVybiBvYmogPT09IHVuZGVmaW5lZCA/IG51bGwgOiBvYmo7XG59XG5leHBvcnQgZnVuY3Rpb24gbnVsbElmTmlsT3JCbGFuazxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogVCB8IG51bGwge1xuICByZXR1cm4gaXNOaWxPckJsYW5rKG9iaikgPyBudWxsIDogb2JqO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHVuZGVmaW5lZElmTnVsbDxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogVCB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBvYmogPT09IG51bGwgPyB1bmRlZmluZWQgOiBvYmo7XG59XG5leHBvcnQgZnVuY3Rpb24gdHJpbUVtcHR5VG9OdWxsPFQ+KHN0cjogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCB2YWx1ZSA9IChzdHIgJiYgc3RyLnRyaW0oKSkgfHwgdW5kZWZpbmVkO1xuICByZXR1cm4gKHZhbHVlICYmIHZhbHVlLmxlbmd0aCAmJiB2YWx1ZSkgfHwgbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b0Jvb2xlYW4ob2JqOiBib29sZWFuIHwgbnVsbCB8IHVuZGVmaW5lZCB8IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsID8gKG9iaiAhPT0gJ2ZhbHNlJyA/ICEhb2JqIDogZmFsc2UpIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvTnVtYmVyKG9iajogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCB8IHN0cmluZywgZGVmYXVsdFZhbHVlPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIGlzTm90TmlsT3JOYU4ob2JqKSA/ICtvYmogOiBkZWZhdWx0VmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gdG9GbG9hdChvYmo6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZT86IG51bWJlcik6IG51bWJlciB8IG51bGwge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsID8gcGFyc2VGbG9hdChvYmopIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvSW50KG9iajogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgZGVmYXVsdFZhbHVlPzogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgPyBwYXJzZUludChvYmosIDApIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvTm90TmlsPFQgPSBhbnk+KG9iajogVCwgZGVmYXVsdFZhbHVlPzogVCk6IGFueSB8IG51bGwge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsID8gb2JqIDogZGVmYXVsdFZhbHVlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUR1cGxpY2F0ZXNGcm9tQXJyYXk8VD4ob2JqOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkLCBwcm9wZXJ0eT86IHN0cmluZyk6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQge1xuICBpZiAoaXNFbXB0eUFycmF5KG9iaikpIHJldHVybiBvYmo7XG4gIGlmIChwcm9wZXJ0eSkge1xuICAgIHJldHVybiBvYmouZmlsdGVyKChpdGVtLCBpLCBhcnJheSkgPT4gYXJyYXkuZmluZEluZGV4KCh0KSA9PiB0ICYmIGl0ZW0gJiYgdFtwcm9wZXJ0eV0gPT09IGl0ZW1bcHJvcGVydHldKSA9PT0gaSk7XG4gIH1cbiAgcmV0dXJuIG9iai5maWx0ZXIoKGl0ZW0sIGksIGFycmF5KSA9PiBhcnJheS5maW5kSW5kZXgoKHQpID0+IHQgJiYgaXRlbSAmJiB0ID09PSBpdGVtKSA9PT0gaSk7XG59XG5leHBvcnQgZnVuY3Rpb24gc3RhcnRzV2l0aFVwcGVyQ2FzZShpbnB1dDogc3RyaW5nLCBzZWFyY2g6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaW5wdXQgJiYgaW5wdXQudG9VcHBlckNhc2UoKS5zdGFydHNXaXRoKHNlYXJjaCk7XG59XG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hVcHBlckNhc2UoaW5wdXQ6IHN0cmluZywgcmVnZXhwOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlucHV0ICYmICEhaW5wdXQudG9VcHBlckNhc2UoKS5tYXRjaChyZWdleHApO1xufVxuXG4vKipcbiAqIFJlbW92ZSB0cmFpbGluZyBzbGFzaCBpZiBhbnkuIEV4YW1wbGVzIDpcbiAqIC0gJy90ZXN0LycgLT4gJy90ZXN0J1xuICogLSAnLycgLT4gdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub1RyYWlsaW5nU2xhc2gocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFwYXRoIHx8IHBhdGgudHJpbSgpID09PSAnLycpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChwYXRoLnRyaW0oKS5sYXN0SW5kZXhPZignLycpID09PSBwYXRoLmxlbmd0aCAtIDEpIHJldHVybiBwYXRoLnN1YnN0cmluZygwLCBwYXRoLmxlbmd0aCAtIDEpO1xuICByZXR1cm4gcGF0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VBbGwodmFsdWU6IHN0cmluZywgc2VhcmNoU3RyaW5nOiBhbnksIHJlcGxhY2VtZW50KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgd2hpbGUgKHZhbHVlICYmIHZhbHVlLmluZGV4T2Yoc2VhcmNoU3RyaW5nKSAhPT0gLTEpIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnJlcGxhY2Uoc2VhcmNoU3RyaW5nLCByZXBsYWNlbWVudCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHZhbHVlOiBzdHJpbmcpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZWxlc3MtZXNjYXBlXG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bLVxcL1xcXFxeJCorPy4oKXxbXFxde31dL2csICdcXFxcJCYnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUVuZCh2YWx1ZTogc3RyaW5nLCBlbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiB2YWx1ZT8uZW5kc1dpdGgoZW5kIHx8ICcnKSA/IHZhbHVlLnN1YnN0cigwLCB2YWx1ZS5sZW5ndGggLSBlbmQubGVuZ3RoKSA6IHZhbHVlO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgY2FzZSBjaGFuZ2UgYnkgYW4gdW5kZXJzY29yZSAoLmUuZyAnbXlTdHJpbmcnIGJlY29tZXMgJ215X3N0cmluZycpXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGFuZ2VDYXNlVG9VbmRlcnNjb3JlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoaXNOaWxPckJsYW5rKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICByZXR1cm4gdmFsdWUucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxXyQyJykudG9Mb3dlckNhc2UoKTtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIHVuZGVyc2NvcmUgYnkgYSBjaGFuZ2UgY2FzZSAoLmUuZyAnTVlfU1RSSU5HJyBiZWNvbWVzICdNeVN0cmluZycpXG4gKlxuICogQHBhcmFtIHZhbHVlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmRlcnNjb3JlVG9DaGFuZ2VDYXNlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoaXNOaWxPckJsYW5rKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICByZXR1cm4gdmFsdWUudG9Mb3dlckNhc2UoKS5zcGxpdCgnXycpLm1hcChjYXBpdGFsaXplRmlyc3RMZXR0ZXIpLmpvaW4oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZURpYWNyaXRpY3ModGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRleHQubm9ybWFsaXplKCdORkQnKS5yZXBsYWNlKC9bXFx1MDMwMC1cXHUwMzZmXS9nLCAnJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdWdnZXN0RnJvbVN0cmluZ0FycmF5KFxuICB2YWx1ZXM6IHN0cmluZ1tdLFxuICB2YWx1ZTogYW55LFxuICBvcHRpb25zPzoge1xuICAgIHNlYXJjaEF0dHJpYnV0ZT86IHN0cmluZztcbiAgICBzZWFyY2hBdHRyaWJ1dGVzPzogc3RyaW5nW107XG4gIH1cbik6IHN0cmluZ1tdIHtcbiAgdmFsdWUgPSAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZSAhPT0gJyonICYmIHZhbHVlLnRvVXBwZXJDYXNlKCkpIHx8IHVuZGVmaW5lZDtcbiAgaWYgKGlzTmlsT3JCbGFuayh2YWx1ZSkpIHJldHVybiB2YWx1ZXM7XG5cbiAgLy8gSWYgd2lsZGNhcmQsIHNlYXJjaCB1c2luZyByZWdleHBcbiAgaWYgKCh2YWx1ZSBhcyBzdHJpbmcpLmluZGV4T2YoJyonKSAhPT0gLTEpIHtcbiAgICB2YWx1ZSA9ICh2YWx1ZSBhcyBzdHJpbmcpLnJlcGxhY2UoJyonLCAnLionKTtcbiAgICByZXR1cm4gdmFsdWVzLmZpbHRlcigodikgPT4gbWF0Y2hVcHBlckNhc2UodiwgdmFsdWUpKTtcbiAgfVxuXG4gIC8vIElmIG5vIHdpbGRjYXJkLCBzZWFyY2ggdXNpbmcgc3RhcnRzV2l0aFxuICByZXR1cm4gdmFsdWVzLmZpbHRlcigodikgPT4gc3RhcnRzV2l0aFVwcGVyQ2FzZSh2LCB2YWx1ZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gam9pblByb3BlcnRpZXNQYXRoPFQgPSBhbnk+KG9iajogVCwgcHJvcGVydGllczogc3RyaW5nW10sIHNlcGFyYXRvcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghb2JqKSB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBkaXNwbGF5IGFuIHVuZGVmaW5lZCBlbnRpdHkuJyk7XG4gIGlmIChpc0VtcHR5QXJyYXkocHJvcGVydGllcykpIHRocm93IG5ldyBFcnJvcihcIk1pc3Npbmcgb3IgZW1wdHkgJ3Byb3BlcnRpZXMnIGFyZ3VtZW50XCIpO1xuICByZXR1cm4gcHJvcGVydGllc1xuICAgIC5tYXAoKHBhdGgpID0+IGdldFByb3BlcnR5QnlQYXRoKG9iaiwgcGF0aCkpXG4gICAgLmZpbHRlcihpc05vdE5pbE9yQmxhbmspXG4gICAgLmpvaW4oc2VwYXJhdG9yIHx8IERFRkFVTFRfSk9JTl9QUk9QRVJUSUVTX1NFUEFSQVRPUik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBqb2luUHJvcGVydGllczxUID0gYW55LCBLIGV4dGVuZHMga2V5b2YgVCA9IGFueT4ob2JqOiBULCBrZXlzOiBLW10sIHNlcGFyYXRvcj86IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghb2JqKSB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBkaXNwbGF5IGFuIHVuZGVmaW5lZCBlbnRpdHkuJyk7XG4gIHJldHVybiBrZXlzXG4gICAgLm1hcCgoa2V5KSA9PiBnZXRQcm9wZXJ0eShvYmosIGtleSkpXG4gICAgLmZpbHRlcihpc05vdE5pbE9yQmxhbmspXG4gICAgLmpvaW4oc2VwYXJhdG9yIHx8IERFRkFVTFRfSk9JTl9QUk9QRVJUSUVTX1NFUEFSQVRPUik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eVBhdGhDb21wYXJhdG9yPFQgPSBhbnk+KHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdKTogKGE6IFQsIGI6IFQpID0+IG51bWJlciB7XG4gIHJldHVybiAoYTogVCwgYjogVCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlQSA9IGdldFByb3BlcnR5QnlQYXRoKGEsIHBhdGgpO1xuICAgIGNvbnN0IHZhbHVlQiA9IGdldFByb3BlcnR5QnlQYXRoKGIsIHBhdGgpO1xuICAgIHJldHVybiB2YWx1ZUEgPT09IHZhbHVlQiA/IDAgOiB2YWx1ZUEgPiB2YWx1ZUIgPyAxIDogLTE7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eUNvbXBhcmF0b3I8VCA9IGFueSwgSyBleHRlbmRzIGtleW9mIFQgPSBhbnk+KGtleTogSywgZGVmYXVsdFZhbHVlPzogYW55KTogKGE6IFQsIGI6IFQpID0+IG51bWJlciB7XG4gIHJldHVybiAoYTogVCwgYjogVCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlQSA9IGFba2V5XSAhPT0gdW5kZWZpbmVkID8gYVtrZXldIDogZGVmYXVsdFZhbHVlO1xuICAgIGNvbnN0IHZhbHVlQiA9IGJba2V5XSA/IGJba2V5XSA6IGRlZmF1bHRWYWx1ZTtcbiAgICByZXR1cm4gdmFsdWVBID09PSB2YWx1ZUIgPyAwIDogdmFsdWVBID4gdmFsdWVCID8gMSA6IC0xO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydGllc1BhdGhDb21wYXJhdG9yPFQgPSBhbnk+KGtleXM6IHN0cmluZ1tdLCBkZWZhdWx0VmFsdWVzPzogYW55W10pOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyIHtcbiAgaWYgKCFrZXlzIHx8ICFrZXlzLmxlbmd0aCB8fCAoZGVmYXVsdFZhbHVlcyAmJiBrZXlzLmxlbmd0aCA+IGRlZmF1bHRWYWx1ZXMubGVuZ3RoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzOiBtaXNzaW5nICdrZXlzJyBvciBhcnJheSAnZGVmYXVsdFZhbHVlcycgaGFzIGEgYmFkIGxlbmd0aFwiKTtcbiAgfVxuICByZXR1cm4gKGE6IFQsIGI6IFQpID0+XG4gICAga2V5c1xuICAgICAgLm1hcCgoa2V5LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZUEgPSBnZXRQcm9wZXJ0eUJ5UGF0aChhLCBrZXksIGRlZmF1bHRWYWx1ZXMgJiYgZGVmYXVsdFZhbHVlc1tpbmRleF0pO1xuICAgICAgICBjb25zdCB2YWx1ZUIgPSBnZXRQcm9wZXJ0eUJ5UGF0aChiLCBrZXksIGRlZmF1bHRWYWx1ZXMgJiYgZGVmYXVsdFZhbHVlc1tpbmRleF0pO1xuICAgICAgICByZXR1cm4gdmFsdWVBID09PSB2YWx1ZUIgPyAwIDogdmFsdWVBID4gdmFsdWVCID8gMSA6IC0xO1xuICAgICAgfSlcbiAgICAgIC8vIFN0b3AgaWYgbm90IGVxdWFscywgb3RoZXJ3aXNlIGNvbnRpbnVlIHdpdGggdGhlIG5leHQga2V5XG4gICAgICAuZmluZCgocmVzKSA9PiByZXMgIT09IDApIHx8IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzb3J0PFQ+KGFycmF5OiBUW10sIGF0dHJpYnV0ZT86IHN0cmluZywgb3B0cz86IEludGwuQ29sbGF0b3JPcHRpb25zKTogVFtdIHtcbiAgaWYgKGlzRW1wdHlBcnJheShhcnJheSkpIHJldHVybiBhcnJheTtcbiAgY29uc3QgY29tcGFyZUZuOiAoYTogYW55LCBiOiBhbnkpID0+IG51bWJlciA9IG9wdHMgPyBuZXcgSW50bC5Db2xsYXRvcih1bmRlZmluZWQsIG9wdHMpLmNvbXBhcmUgOiAodjEsIHYyKSA9PiAodjEgPT09IHYyID8gMCA6IHYxID4gdjIgPyAxIDogLTEpO1xuICByZXR1cm4gYXJyYXlcbiAgICAuc2xpY2UoKSAvLyBjb3B5XG4gICAgLnNvcnQoYXR0cmlidXRlID8gKGEsIGIpID0+IGNvbXBhcmVGbihhW2F0dHJpYnV0ZV0sIGJbYXR0cmlidXRlXSkgOiBjb21wYXJlRm4pO1xufVxuY29uc3QgSU5URUdFUl9SRUdFWFAgPSAvXlstXT9cXGQrJC87XG5leHBvcnQgZnVuY3Rpb24gaXNJbnQodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNOb3ROaWwodmFsdWUpICYmIElOVEVHRVJfUkVHRVhQLnRlc3QodmFsdWUpO1xufVxuY29uc3QgTlVNQkVSX1JFR0VYUCA9IC9eWy1dP1xcZCsoXFwuXFxkKyk/JC87XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXIodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNOb3ROaWwodmFsdWUpICYmIE5VTUJFUl9SRUdFWFAudGVzdCh2YWx1ZSk7XG59XG5cbmNvbnN0IE5VTUJFUl9SQU5HRV9SRUdFWFAgPSAvXihcXGQrLVxcZCspfChbPjw9XSpcXGQrKSQvO1xuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyUmFuZ2UodmFsdWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNOb3ROaWwodmFsdWUpICYmIE5VTUJFUl9SQU5HRV9SRUdFWFAudGVzdCh2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9wZXJ0eUJ5UGF0aChvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiwgZGVmYXVsdFZhbHVlPzogYW55KTogYW55IHtcbiAgLy8gUGF0aCBpcyBhbiBhcnJheTogY29udmVydCBwYXRoIHRvIHN0cmluZ1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgIHJldHVybiBnZXRQcm9wZXJ0eUJ5UGF0aChvYmosIHBhdGguam9pbignLicpLCBkZWZhdWx0VmFsdWUpO1xuICB9XG4gIGlmIChpc05pbChvYmopKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICBpZiAoaXNOaWxPckJsYW5rKHBhdGgpKSByZXR1cm4gb2JqO1xuICBpZiAocGF0aC5pbmRleE9mKCdbJykgIT09IC0xKSB7XG4gICAgcGF0aCA9IHBhdGgucmVwbGFjZSgvXFxbKFteXFxbXFxdXSopXFxdLywgJy4kMS4nKTtcbiAgfVxuICBjb25zdCBpID0gcGF0aC5pbmRleE9mKCcuJyk7XG4gIC8vIFNpbXBsZSBwcm9wZXJ0eSBwYXRoXG4gIGlmIChpID09PSAtMSkge1xuICAgIGNvbnN0IHJlcyA9IG9ialtwYXRoXTtcbiAgICByZXR1cm4gaXNOb3ROaWwocmVzKSB8fCBpc05pbChkZWZhdWx0VmFsdWUpID8gcmVzIDogZGVmYXVsdFZhbHVlO1xuICB9XG4gIC8vIENvbXBsZXggcHJvcGVydHkgcGF0aFxuICBjb25zdCBvcHRpb25hbCA9IHBhdGguY2hhckF0KGkgLSAxKSA9PT0gJz8nO1xuICBjb25zdCBrZXkgPSBwYXRoLnN1YnN0cmluZygwLCBvcHRpb25hbCA/IGkgLSAxIDogaSk7XG4gIGlmIChpc05pbChvYmpba2V5XSkpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIGlmICh0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnKSB7XG4gICAgLy8gT2JqZWN0IG9yIEFycmF5XG4gICAgLy8gUmVjdXJzaXZlIGNhbGxcbiAgICByZXR1cm4gZ2V0UHJvcGVydHlCeVBhdGgob2JqW2tleV0sIHBhdGguc3Vic3RyaW5nKGkgKyAxKSk7XG4gIH1cbiAgaWYgKG9wdGlvbmFsKSByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJvcGVydHkgcGF0aDogJyR7a2V5fScgaXMgbm90IGFuIHZhbGlkIG9iamVjdC5gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3BlcnR5PFQgPSBhbnksIEsgZXh0ZW5kcyBrZXlvZiBUID0gYW55PihvYmo6IFQsIGtleTogSyk6IFRbS10ge1xuICBpZiAoaXNOaWwob2JqKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIG9ialtrZXldOyAvLyBJbmZlcnJlZCB0eXBlIGlzIFRbS11cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3BlcnR5QnlQYXRoQXNTdHJpbmcob2JqOiBhbnksIHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcmVzID0gZ2V0UHJvcGVydHlCeVBhdGgob2JqLCBwYXRoKTtcbiAgcmV0dXJuIHR5cGVvZiByZXMgPT09ICdzdHJpbmcnID8gcmVzIDogJycgKyByZXM7XG59XG5cbi8qKlxuICogVXBkYXRlIGFuIG9iamVjdCdzIHByb3BlcnR5LCB1c2luZyBhIHBhdGggKGxpa2UgJzxwcm9wZXJ0eV8xPi48c3ViX3Byb3BlcnR5XzE+JylcbiAqIEBwYXJhbSBvYmpcbiAqIEBwYXJhbSBwYXRoXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEByZXR1cm4gdGhlIGdpdmVuIG9ialxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UHJvcGVydHlCeVBhdGg8VCA9IGFueT4ob2JqOiBULCBwYXRoOiBzdHJpbmcgfCBzdHJpbmdbXSwgdmFsdWU6IGFueSk6IFQge1xuICAvLyBQYXRoIGlzIGFuIGFycmF5OiBjb252ZXJ0IHBhdGggdG8gc3RyaW5nXG4gIGlmIChBcnJheS5pc0FycmF5KHBhdGgpKSB7XG4gICAgcmV0dXJuIHNldFByb3BlcnR5QnlQYXRoKG9iaiwgcGF0aC5qb2luKCcuJyksIHZhbHVlKTtcbiAgfVxuICBpZiAoaXNOaWwob2JqKSkgcmV0dXJuIG9iajsgLy8gU2tpcFxuICBjb25zdCBpID0gcGF0aC5pbmRleE9mKCcuJyk7XG4gIC8vIFNpbXBsZSBwcm9wZXJ0eSBwYXRoXG4gIGlmIChpID09PSAtMSkge1xuICAgIG9ialtwYXRoXSA9IHZhbHVlO1xuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgY29uc3Qga2V5ID0gcGF0aC5zdWJzdHJpbmcoMCwgaSk7XG4gIGlmIChpc05pbChvYmpba2V5XSkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChvYmpba2V5XSAmJiB0eXBlb2Ygb2JqW2tleV0gPT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIHNldFByb3BlcnR5QnlQYXRoKG9ialtrZXldLCBwYXRoLnN1YnN0cmluZyhpICsgMSksIHZhbHVlKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZm9ybSBwYXRoOiAnJHtrZXl9JyBpcyBub3QgYW4gdmFsaWQgb2JqZWN0LmApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAobXMgPD0gMCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsKTogbnVtYmVyIHtcbiAgaWYgKGlzTm90TmlsT3JOYU4odmFsdWUpKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoKHZhbHVlICsgTnVtYmVyLkVQU0lMT04pICogMTAwKSAvIDEwMDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHNPck5pbCh2YWx1ZTE6IGFueSwgdmFsdWUyOiBhbnkpIHtcbiAgcmV0dXJuIHZhbHVlMSA9PT0gdmFsdWUyIHx8IChpc05pbCh2YWx1ZTEpICYmIGlzTmlsKHZhbHVlMikpO1xufVxuXG4vKipcbiAqIHJlbW92ZSBlbGVtZW50cyBmcm9tIGFuIGFycmF5XG4gKlxuICogQHJldHVybiB0aGUgcmVtb3ZlZCBlbGVtZW50c1xuICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSBvbiB3aGljaCBlbGVtZW50cyB3aWxsIGJlIHJlbW92ZWRcbiAqIEBwYXJhbSBwcmVkaWNhdGUgdGhlIHNlbGVjdGlvbiBwcmVkaWNhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFsbDxUPihhcnJheTogVFtdLCBwcmVkaWNhdGU6ICh2YWx1ZTogVCkgPT4gYm9vbGVhbik6IFRbXSB7XG4gIGxldCBuYlJlbW92ZSA9IDA7XG4gIHJldHVybiBhcnJheVxuICAgIC5zbGljZSgpXG4gICAgLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgICBuYlJlbW92ZSsrOyAvLyBnbGl0Y2ggY291bnRlciB0byBhdm9pZCBpbmRleCBnYXBcbiAgICAgICAgcmV0dXJuIGFycmF5LnNwbGljZShpbmRleCAtIG5iUmVtb3ZlICsgMSwgMSlbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KVxuICAgIC5maWx0ZXIoaXNOb3ROaWwpO1xufVxuXG4vKipcbiAqIHJlbW92ZSB0aGUgZmlyc3QgZWxlbWVudCBmcm9tIGFuIGFycmF5XG4gKlxuICogQHJldHVybiB0aGUgcmVtb3ZlZCBlbGVtZW50XG4gKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IG9uIHdoaWNoIHRoZSBlbGVtZW50IHdpbGwgYmUgcmVtb3ZlZFxuICogQHBhcmFtIHByZWRpY2F0ZSB0aGUgc2VsZWN0aW9uIHByZWRpY2F0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlPFQ+KGFycmF5OiBUW10sIHByZWRpY2F0ZTogKHZhbHVlOiBUKSA9PiBib29sZWFuKTogVCB7XG4gIHJldHVybiBhcnJheS5zbGljZSgpLmZpbmQoKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIodmFsdWU6IHN0cmluZykge1xuICBpZiAoIXZhbHVlIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHZhbHVlO1xuICByZXR1cm4gdmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zdWJzdHJpbmcoMSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5jYXBpdGFsaXplRmlyc3RMZXR0ZXIodmFsdWU6IHN0cmluZykge1xuICBpZiAoIXZhbHVlIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHZhbHVlO1xuICByZXR1cm4gdmFsdWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyB2YWx1ZS5zdWJzdHJpbmcoMSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYm9vbGVhblRvU3RyaW5nKHZhbHVlOiBhbnksIG9wdHM6IHsgeWVzTGFiZWw6IHN0cmluZzsgbm9MYWJlbDogc3RyaW5nIH0gPSB7IHllc0xhYmVsOiAnQ09NTU9OLllFUycsIG5vTGFiZWw6ICdDT01NT04uTk8nIH0pIHtcbiAgaWYgKGlzTmlsKHZhbHVlKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHZhbHVlID09PSAxIHx8IHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSAndHJ1ZScgPyBvcHRzLnllc0xhYmVsIDogb3B0cy5ub0xhYmVsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRCeVByb3BlcnR5PFQsIE0gZXh0ZW5kcyBLZXlWYWx1ZVR5cGU8VD4gPSBLZXlWYWx1ZVR5cGU8VD4+KGFycmF5OiBUW10gfCByZWFkb25seSBUW10sIHByb3BlcnR5TmFtZToga2V5b2YgVCB8IHN0cmluZyk6IE0ge1xuICByZXR1cm4gKGFycmF5IHx8IFtdKS5yZWR1Y2UoKHJlcywgdmFsdWUpID0+IHtcbiAgICBjb25zdCBrZXkgPSAodmFsdWUgYXMgdW5rbm93biBhcyBhbnkpPy5bcHJvcGVydHlOYW1lXTtcbiAgICBpZiAoaXNOb3ROaWwoa2V5KSkge1xuICAgICAgcmVzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfSwge30pIGFzIE07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEJ5SWQ8VCwgTSBleHRlbmRzIEtleVZhbHVlVHlwZTxUPiA9IEtleVZhbHVlVHlwZTxUPj4oYXJyYXk6IFRbXSB8IHJlYWRvbmx5IFRbXSk6IE0ge1xuICByZXR1cm4gKGFycmF5IHx8IFtdKS5yZWR1Y2UoXG4gICAgKHJlcywgdmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IHZhbHVlPy5bJ2lkJ107XG4gICAgICBpZiAoaXNOb3ROaWwoa2V5KSkge1xuICAgICAgICByZXNba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9LFxuICAgIDxNPnt9XG4gICk7XG59XG5cbi8qKlxuICogU3BsaXQgYW4gYXJyYXksIGludG8gYSBtYXAgb2YgYXJyYXksIGdyb3VwIGJ5IHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0QnlQcm9wZXJ0eTxUPih2YWx1ZXM6IFRbXSwgcHJvcGVydHlOYW1lOiBrZXlvZiBUKTogS2V5VmFsdWVUeXBlPFRbXT4ge1xuICByZXR1cm4gKHZhbHVlcyB8fCBbXSkucmVkdWNlKFxuICAgIChyZXMsIGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGl0ZW0gJiYgaXRlbVtwcm9wZXJ0eU5hbWVdO1xuICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdudW1iZXInIHx8IHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJlc1trZXldID0gcmVzW2tleV0gfHwgW107XG4gICAgICAgIHJlc1trZXldLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0sXG4gICAgPEtleVZhbHVlVHlwZTxUW10+Pnt9XG4gICk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0d28gb2JqZWN0cyBvciB0d28gdmFsdWVzIGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIFR3byBvYmplY3RzIG9yIHZhbHVlcyBhcmUgY29uc2lkZXJlZCBlcXVpdmFsZW50IGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gKlxuICogKiBCb3RoIG9iamVjdHMgb3IgdmFsdWVzIHBhc3MgYD09PWAgY29tcGFyaXNvbi5cbiAqICogQm90aCBvYmplY3RzIG9yIHZhbHVlcyBhcmUgb2YgdGhlIHNhbWUgdHlwZSBhbmQgYWxsIG9mIHRoZWlyIHByb3BlcnRpZXMgYXJlIGVxdWFsIGJ5XG4gKiAgIGNvbXBhcmluZyB0aGVtIHdpdGggYGVxdWFsc2AuXG4gKlxuICogQHBhcmFtIG8xIE9iamVjdCBvciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIG8yIE9iamVjdCBvciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhcmd1bWVudHMgYXJlIGVxdWFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKG8xOiBhbnksIG8yOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKG8xID09PSBvMikgcmV0dXJuIHRydWU7XG4gIGlmIChvMSA9PT0gbnVsbCB8fCBvMiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAobzEgIT09IG8xICYmIG8yICE9PSBvMikgcmV0dXJuIHRydWU7IC8vIE5hTiA9PT0gTmFOXG4gIGNvbnN0IHQxID0gdHlwZW9mIG8xO1xuICBjb25zdCB0MiA9IHR5cGVvZiBvMjtcbiAgbGV0IGxlbmd0aDogbnVtYmVyO1xuICBsZXQga2V5OiBhbnk7XG4gIGxldCBrZXlTZXQ6IGFueTtcbiAgaWYgKHQxID09PSB0MiAmJiB0MSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvMSkpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShvMikpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICgobGVuZ3RoID0gbzEubGVuZ3RoKSA9PT0gbzIubGVuZ3RoKSB7XG4gICAgICAgIGZvciAoa2V5ID0gMDsga2V5IDwgbGVuZ3RoOyBrZXkrKykge1xuICAgICAgICAgIGlmICghZXF1YWxzKG8xW2tleV0sIG8yW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG8yKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBrZXlTZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGd1YXJkLWZvci1pblxuICAgICAgZm9yIChrZXkgaW4gbzEpIHtcbiAgICAgICAgaWYgKCFlcXVhbHMobzFba2V5XSwgbzJba2V5XSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAga2V5U2V0W2tleV0gPSB0cnVlO1xuICAgICAgfVxuICAgICAgZm9yIChrZXkgaW4gbzIpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIGtleVNldCkgJiYgdHlwZW9mIG8yW2tleV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBAZHluYW1pY1xuZXhwb3J0IGNsYXNzIEJlYW5zIHtcbiAgLyoqXG4gICAqIENvcHkgYSBzb3VyY2Ugb2JqZWN0LCBieSBpbmNsdWRpbmcgb25seSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBkYXRhVHlwZS5cbiAgICogSU1QT1JUQU5UOiBleHRyYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIE5PVCBpbiB0aGUgdGFyZ2V0Q2xhc3MgYXJlIE5PVCBjb3BpZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgdG8gY29weVxuICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGNsYXNzIHRvIHVzZSBhcyB0YXJnZXQgY2xhc3NcbiAgICogQHBhcmFtIGtleXMgVGhlIGtleXMgdG8gY29weS4gSWYgZW1wdHksIHdpbGwgY29weSBvbmx5IE5PVCBvcHRpb25hbCBwcm9wZXJ0aWVzIGZyb20gdGhlIGRhdGFUeXBlXG4gICAqL1xuICBzdGF0aWMgY29weTxUPihzb3VyY2U6IFQsIGRhdGFUeXBlOiBuZXcgKCkgPT4gVCwga2V5cz86IEtleXNFbnVtPFQ+KTogVCB7XG4gICAgaWYgKGlzTmlsKHNvdXJjZSkpIHJldHVybiBzb3VyY2U7XG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IGRhdGFUeXBlKCk7XG4gICAgT2JqZWN0LmtleXMoa2V5cyB8fCB0YXJnZXQpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgaWYgYW4gb2JqZWN0IGFsbCBhbGwgcHJvcGVydGllcyB0byBuaWxcbiAgICovXG4gIHN0YXRpYyBpc0VtcHR5PFQ+KFxuICAgIGRhdGE6IFQsXG4gICAga2V5cz86IEtleXNFbnVtPFQ+IHwgc3RyaW5nW10sXG4gICAgb3B0cz86IHtcbiAgICAgIGJsYW5rU3RyaW5nTGlrZUVtcHR5PzogYm9vbGVhbjtcbiAgICB9XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBpc05pbChkYXRhKSB8fFxuICAgICAgKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogT2JqZWN0LmtleXMoa2V5cyB8fCBkYXRhKSlcbiAgICAgICAgLy8gRmluZCBpbmRleCBvZiB0aGUgZmlyc3QgTk9UIG5pbCB2YWx1ZVxuICAgICAgICAuZmluZEluZGV4KChrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFba2V5XTtcbiAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuICFCZWFucy5pc0VtcHR5KHZhbHVlLCBudWxsLCBvcHRzKTsgLy8gTG9vcFxuICAgICAgICAgIGlmIChvcHRzICYmIG9wdHMuYmxhbmtTdHJpbmdMaWtlRW1wdHkgPT09IHRydWUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIGlzTm90TmlsT3JCbGFuayh2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGlzTm90TmlsKHZhbHVlKTtcbiAgICAgICAgfSkgPT09IC0xXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBjb2xsZWN0QnlJZDxUPihhcnJheTogVFtdKTogS2V5VmFsdWVUeXBlPFRbXT4ge1xuICAgIHJldHVybiBjb2xsZWN0QnlQcm9wZXJ0eShhcnJheSwgJ2lkJyBhcyBrZXlvZiBUKTtcbiAgfVxuXG4gIHN0YXRpYyBjb2xsZWN0QnlQcm9wZXJ0eSA9IGNvbGxlY3RCeVByb3BlcnR5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFBhcmVudFdpdGhDbGFzcyhlbGVtOiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gIGlmICghY2xhc3NOYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICBsZXQgY3VycmVudEVsZW1lbnQgPSBlbGVtPy5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcbiAgICBpZiAoY3VycmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpIHJldHVybiBjdXJyZW50RWxlbWVudDtcbiAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludGVyc2VjdEFycmF5czxUID0gYW55Pih2YWx1ZXM6IFRbXVtdKTogVFtdIHtcbiAgaWYgKGlzRW1wdHlBcnJheSh2YWx1ZXMpKSByZXR1cm4gW107XG5cbiAgLy8gVXRpbGlzZSBsYSBtw6l0aG9kZSByZWR1Y2UgcG91ciBvYnRlbmlyIGwnaW50ZXJzZWN0aW9uIGRlcyB0YWJsZWF1eFxuICByZXR1cm4gdmFsdWVzLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiBhY2MuZmlsdGVyKCh4KSA9PiBjdXJyLmluY2x1ZGVzKHgpKSwgdmFsdWVzWzBdLnNsaWNlKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9IdG1sKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIC8vIFVzZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gcmVtb3ZlIGFsbCBIVE1MIHRhZ3NcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvPFtePl0qPi4qPzxcXC9bXj5dKj58PFtePl0rPi9nLCAnJyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4iXX0=
554
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvZnVuY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVoRSxNQUFNLFVBQVUsS0FBSyxDQUFJLEdBQXlCO0lBQ2hELE9BQU8sR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDO0FBQzNDLENBQUM7QUFDRCxNQUFNLFVBQVUsWUFBWSxDQUFJLEdBQXlCO0lBQ3ZELE9BQU8sR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssUUFBUSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztBQUM3RixDQUFDO0FBQ0QsTUFBTSxVQUFVLFFBQVEsQ0FBSSxHQUF5QjtJQUNuRCxPQUFPLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUksQ0FBQztBQUMzQyxDQUFDO0FBQ0QsTUFBTSxVQUFVLGVBQWUsQ0FBSSxHQUF5QjtJQUMxRCxPQUFPLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLFFBQVEsSUFBSSxHQUFHLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDN0YsQ0FBQztBQUNELE1BQU0sVUFBVSxhQUFhLENBQUksR0FBeUI7SUFDeEQsT0FBTyxHQUFHLEtBQUssU0FBUyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUN2RixDQUFDO0FBQ0QsTUFBTSxVQUFVLFVBQVUsQ0FBSSxHQUF5QjtJQUNyRCxPQUFPLEdBQUcsS0FBSyxTQUFT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QUFPLGNBQWMsQ0FBQztRQUN4RSxjQUFjLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQVUsTUFBYTtJQUNwRCxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUVwQyxxRUFBcUU7SUFDckUsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQzlGLENBQUM7QUFFRCxNQUFNLFVBQVUsTUFBTSxDQUFDLEtBQWE7SUFDbEMsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDdkMsaURBQWlEO1FBQ2pELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBLZXlzRW51bSwgS2V5VmFsdWVUeXBlIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBERUZBVUxUX0pPSU5fUFJPUEVSVElFU19TRVBBUkFUT1IgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05pbDxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogPT09IHVuZGVmaW5lZCB8fCBvYmogPT09IG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOaWxPckJsYW5rPFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9iaiA9PT0gdW5kZWZpbmVkIHx8IG9iaiA9PT0gbnVsbCB8fCAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycgJiYgb2JqLnRyaW0oKSA9PT0gJycpO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTm90TmlsPFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05vdE5pbE9yQmxhbms8VD4ob2JqOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsICYmICh0eXBlb2Ygb2JqICE9PSAnc3RyaW5nJyB8fCBvYmoudHJpbSgpICE9PSAnJyk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb3ROaWxPck5hTjxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgJiYgKHR5cGVvZiBvYmogIT09ICdudW1iZXInIHx8ICFpc05hTihvYmopKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05pbE9yTmFOPFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9iaiA9PT0gdW5kZWZpbmVkIHx8IG9iaiA9PT0gbnVsbCB8fCAodHlwZW9mIG9iaiA9PT0gJ251bWJlcicgJiYgaXNOYU4ob2JqKSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb3RFbXB0eUFycmF5PFQ+KG9iajogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqICE9PSB1bmRlZmluZWQgJiYgb2JqICE9PSBudWxsICYmIG9iai5sZW5ndGggPiAwO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGZpcnN0QXJyYXlWYWx1ZTxUPihvYmo6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGlzTm90RW1wdHlBcnJheShvYmopID8gb2JqWzBdIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGxhc3RBcnJheVZhbHVlPFQ+KG9iajogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFQgfCB1bmRlZmluZWQge1xuICByZXR1cm4gaXNOb3RFbXB0eUFycmF5KG9iaikgPyBvYmpbb2JqLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzRW1wdHlBcnJheTxUPihvYmo6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIG9iaiA9PT0gdW5kZWZpbmVkIHx8IG9iaiA9PT0gbnVsbCB8fCAhb2JqLmxlbmd0aDtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVJlc2l6ZTxUPihhcnJheTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCwgc2l6ZTogbnVtYmVyLCBkZWZhdWx0VmFsdWU/OiBUKTogVFtdIHtcbiAgaWYgKHNpemUgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJBcmd1bWVudCAnc2l6ZScgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlclwiKTtcbiAgaWYgKCFhcnJheSkgcmV0dXJuIG5ld0FycmF5KHNpemUsIGRlZmF1bHRWYWx1ZSk7XG5cbiAgLy8gUmVkdWNlIHNpemVcbiAgaWYgKGFycmF5Lmxlbmd0aCA+IHNpemUpIHtcbiAgICByZXR1cm4gYXJyYXkuc2xpY2UoMCwgc2l6ZSk7XG4gIH1cbiAgLy8gSW5jcmVhc2Ugc2l6ZVxuICBlbHNlIGlmIChhcnJheS5sZW5ndGggPCBzaXplKSB7XG4gICAgcmV0dXJuIFsuLi5hcnJheSwgLi4ubmV3QXJyYXkoc2l6ZSAtIGFycmF5Lmxlbmd0aCwgZGVmYXVsdFZhbHVlKV07XG4gIH1cblxuICByZXR1cm4gYXJyYXk7XG59XG5leHBvcnQgZnVuY3Rpb24gbmV3QXJyYXk8VD4oc2l6ZTogbnVtYmVyLCBkZWZhdWx0VmFsdWU/OiBUKTogVFtdIHtcbiAgaWYgKHNpemUgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJBcmd1bWVudCAnc2l6ZScgbXVzdCBiZSBhIHBvc2l0aXZlIG51bWJlclwiKTtcbiAgcmV0dXJuIG5ldyBBcnJheShzaXplKS5maWxsKGRlZmF1bHRWYWx1ZSk7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNOb3ROaWxCb29sZWFuKG9iajogYW55IHwgbnVsbCB8IHVuZGVmaW5lZCk6IG9iaiBpcyBib29sZWFuIHtcbiAgcmV0dXJuIChvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ2Jvb2xlYW4nKSB8fCBmYWxzZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBpc05vdE5pbFN0cmluZyhvYmo6IGFueSB8IG51bGwgfCB1bmRlZmluZWQpOiBvYmogaXMgc3RyaW5nIHtcbiAgcmV0dXJuIChvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHx8IGZhbHNlO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGlzTm90TmlsT2JqZWN0KG9iajogYW55IHwgbnVsbCB8IHVuZGVmaW5lZCk6IG9iaiBpcyBzdHJpbmcge1xuICByZXR1cm4gKG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCAmJiB0eXBlb2Ygb2JqID09PSAnb2JqZWN0JykgfHwgZmFsc2U7XG59XG5leHBvcnQgZnVuY3Rpb24gaXNCbGFua1N0cmluZyhvYmo6IGFueSB8IG51bGwgfCB1bmRlZmluZWQpOiBvYmogaXMgc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdzdHJpbmcnICYmIG9iai50cmltKCkubGVuZ3RoID09PSAwO1xufVxuZXhwb3J0IGZ1bmN0aW9uIG5vdE5pbE9yRGVmYXVsdDxUPihvYmo6IFQgfCBudWxsIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU6IFQpOiBUIHtcbiAgcmV0dXJuIG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCA/IG9iaiA6IGRlZmF1bHRWYWx1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBhcnJheVNpemU8VD4ob2JqOiBUW10gfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgcmV0dXJuIChpc05vdEVtcHR5QXJyYXkob2JqKSAmJiBvYmoubGVuZ3RoKSB8fCAwO1xufVxuXG4vKipcbiAqIFJlbW92ZSBkdXBsaWNhdGVkIHZhbHVlLCBpbiBhcnJheS4gV2lsbCBjb21wdXRlIGEgdW5pcXVlIGtleSAoZnJvbSBnaXZlbiBwcm9wZXJ0aWVzLCBvciBnaXZlbiBmdW5jdGlvbikuXG4gKiBJZiBwcm9wZXJ0aWVzT3JLZXlGbiBpcyBuaWwgb3IgdW5kZWZpbmVkLCB3aWxsIHVzZSBhbGwgb2JqZWN0IHByb3BlcnRpZXNcbiAqXG4gKiBAcGFyYW0gdmFsdWVzXG4gKiBAcGFyYW0gcHJvcGVydGllc09yS2V5Rm5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFycmF5RGlzdGluY3Q8VCA9IGFueT4odmFsdWVzOiBUW10sIHByb3BlcnRpZXNPcktleUZuPzogc3RyaW5nIHwgc3RyaW5nW10gfCAoKG9iajogVCkgPT4gc3RyaW5nKSk6IFRbXSB7XG4gIGlmIChpc0VtcHR5QXJyYXkodmFsdWVzKSkgcmV0dXJuIHZhbHVlcztcbiAgY29uc3QgcHJvcGVydGllczogc3RyaW5nW10gPSAoIXByb3BlcnRpZXNPcktleUZuICYmIE9iamVjdC5rZXlzKHZhbHVlc1swXSkpIHx8IChBcnJheS5pc0FycmF5KHByb3BlcnRpZXNPcktleUZuKSAmJiBwcm9wZXJ0aWVzT3JLZXlGbik7XG4gIGNvbnN0IGdldEtleTogKG9iajogVCkgPT4gc3RyaW5nID1cbiAgICAodHlwZW9mIHByb3BlcnRpZXNPcktleUZuID09PSAnZnVuY3Rpb24nICYmIHByb3BlcnRpZXNPcktleUZuKSB8fFxuICAgICh0eXBlb2YgcHJvcGVydGllc09yS2V5Rm4gPT09ICdzdHJpbmcnICYmICgob2JqKSA9PiBnZXRQcm9wZXJ0eUJ5UGF0aEFzU3RyaW5nKG9iaiwgcHJvcGVydGllc09yS2V5Rm4pKSkgfHxcbiAgICAoaXNFbXB0eUFycmF5KHByb3BlcnRpZXMpICYmICgob2JqKSA9PiBvYmo/LnRvU3RyaW5nKCkpKSB8fFxuICAgICgob2JqKSA9PiBqb2luUHJvcGVydGllc1BhdGgob2JqLCBwcm9wZXJ0aWVzLCAnfCcpKTtcbiAgY29uc3QgZXhpc3RpbmdJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcmV0dXJuIHZhbHVlcy5yZWR1Y2UoKHJlcywgaXRlbSkgPT4ge1xuICAgIGNvbnN0IHVuaXF1ZUtleSA9IGdldEtleShpdGVtKTtcbiAgICBpZiAoZXhpc3RpbmdJZHMuaGFzKHVuaXF1ZUtleSkpIHJldHVybiByZXM7IC8vIFNraXAgaWYgZHVwbGljYXRlXG4gICAgZXhpc3RpbmdJZHMuYWRkKHVuaXF1ZUtleSk7XG4gICAgcmV0dXJuIHJlcy5jb25jYXQoaXRlbSk7XG4gIH0sIFtdKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBudWxsSWZVbmRlZmluZWQ8VD4ob2JqOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCk6IFQgfCBudWxsIHtcbiAgcmV0dXJuIG9iaiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IG9iajtcbn1cbmV4cG9ydCBmdW5jdGlvbiBudWxsSWZOaWxPckJsYW5rPFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBUIHwgbnVsbCB7XG4gIHJldHVybiBpc05pbE9yQmxhbmsob2JqKSA/IG51bGwgOiBvYmo7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5kZWZpbmVkSWZOdWxsPFQ+KG9iajogVCB8IG51bGwgfCB1bmRlZmluZWQpOiBUIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIG9iaiA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IG9iajtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0cmltRW1wdHlUb051bGw8VD4oc3RyOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgbnVsbCB7XG4gIGNvbnN0IHZhbHVlID0gKHN0ciAmJiBzdHIudHJpbSgpKSB8fCB1bmRlZmluZWQ7XG4gIHJldHVybiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoICYmIHZhbHVlKSB8fCBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHRvQm9vbGVhbihvYmo6IGJvb2xlYW4gfCBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBib29sZWFuKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgPyAob2JqICE9PSAnZmFsc2UnID8gISFvYmogOiBmYWxzZSkgOiBkZWZhdWx0VmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gdG9OdW1iZXIob2JqOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkIHwgc3RyaW5nLCBkZWZhdWx0VmFsdWU/OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gaXNOb3ROaWxPck5hTihvYmopID8gK29iaiA6IGRlZmF1bHRWYWx1ZTtcbn1cbmV4cG9ydCBmdW5jdGlvbiB0b0Zsb2F0KG9iajogc3RyaW5nIHwgbnVsbCB8IHVuZGVmaW5lZCwgZGVmYXVsdFZhbHVlPzogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgPyBwYXJzZUZsb2F0KG9iaikgOiBkZWZhdWx0VmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gdG9JbnQob2JqOiBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkLCBkZWZhdWx0VmFsdWU/OiBudW1iZXIpOiBudW1iZXIgfCBudWxsIHtcbiAgcmV0dXJuIG9iaiAhPT0gdW5kZWZpbmVkICYmIG9iaiAhPT0gbnVsbCA/IHBhcnNlSW50KG9iaiwgMCkgOiBkZWZhdWx0VmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gdG9Ob3ROaWw8VCA9IGFueT4ob2JqOiBULCBkZWZhdWx0VmFsdWU/OiBUKTogYW55IHwgbnVsbCB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGwgPyBvYmogOiBkZWZhdWx0VmFsdWU7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRHVwbGljYXRlc0Zyb21BcnJheTxUPihvYmo6IFRbXSB8IG51bGwgfCB1bmRlZmluZWQsIHByb3BlcnR5Pzogc3RyaW5nKTogVFtdIHwgbnVsbCB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc0VtcHR5QXJyYXkob2JqKSkgcmV0dXJuIG9iajtcbiAgaWYgKHByb3BlcnR5KSB7XG4gICAgcmV0dXJuIG9iai5maWx0ZXIoKGl0ZW0sIGksIGFycmF5KSA9PiBhcnJheS5maW5kSW5kZXgoKHQpID0+IHQgJiYgaXRlbSAmJiB0W3Byb3BlcnR5XSA9PT0gaXRlbVtwcm9wZXJ0eV0pID09PSBpKTtcbiAgfVxuICByZXR1cm4gb2JqLmZpbHRlcigoaXRlbSwgaSwgYXJyYXkpID0+IGFycmF5LmZpbmRJbmRleCgodCkgPT4gdCAmJiBpdGVtICYmIHQgPT09IGl0ZW0pID09PSBpKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBzdGFydHNXaXRoVXBwZXJDYXNlKGlucHV0OiBzdHJpbmcsIHNlYXJjaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpbnB1dCAmJiBpbnB1dC50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoc2VhcmNoKTtcbn1cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaFVwcGVyQ2FzZShpbnB1dDogc3RyaW5nLCByZWdleHA6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaW5wdXQgJiYgISFpbnB1dC50b1VwcGVyQ2FzZSgpLm1hdGNoKHJlZ2V4cCk7XG59XG5cbi8qKlxuICogUmVtb3ZlIHRyYWlsaW5nIHNsYXNoIGlmIGFueS4gRXhhbXBsZXMgOlxuICogLSAnL3Rlc3QvJyAtPiAnL3Rlc3QnXG4gKiAtICcvJyAtPiB1bmRlZmluZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vVHJhaWxpbmdTbGFzaChwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXBhdGggfHwgcGF0aC50cmltKCkgPT09ICcvJykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHBhdGgudHJpbSgpLmxhc3RJbmRleE9mKCcvJykgPT09IHBhdGgubGVuZ3RoIC0gMSkgcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7XG4gIHJldHVybiBwYXRoO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVwbGFjZUFsbCh2YWx1ZTogc3RyaW5nLCBzZWFyY2hTdHJpbmc6IGFueSwgcmVwbGFjZW1lbnQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICB3aGlsZSAodmFsdWUgJiYgdmFsdWUuaW5kZXhPZihzZWFyY2hTdHJpbmcpICE9PSAtMSkge1xuICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShzZWFyY2hTdHJpbmcsIHJlcGxhY2VtZW50KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVSZWdFeHAodmFsdWU6IHN0cmluZykge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlbGVzcy1lc2NhcGVcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRW5kKHZhbHVlOiBzdHJpbmcsIGVuZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlPy5lbmRzV2l0aChlbmQgfHwgJycpID8gdmFsdWUuc3Vic3RyKDAsIHZhbHVlLmxlbmd0aCAtIGVuZC5sZW5ndGgpIDogdmFsdWU7XG59XG5cbi8qKlxuICogUmVwbGFjZSBjYXNlIGNoYW5nZSBieSBhbiB1bmRlcnNjb3JlICguZS5nICdteVN0cmluZycgYmVjb21lcyAnbXlfc3RyaW5nJylcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZUNhc2VUb1VuZGVyc2NvcmUodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChpc05pbE9yQmxhbmsodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDFfJDInKS50b0xvd2VyQ2FzZSgpO1xufVxuXG4vKipcbiAqIFJlcGxhY2UgdW5kZXJzY29yZSBieSBhIGNoYW5nZSBjYXNlICguZS5nICdNWV9TVFJJTkcnIGJlY29tZXMgJ015U3RyaW5nJylcbiAqXG4gKiBAcGFyYW0gdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuZGVyc2NvcmVUb0NoYW5nZUNhc2UodmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChpc05pbE9yQmxhbmsodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpLnNwbGl0KCdfJykubWFwKGNhcGl0YWxpemVGaXJzdExldHRlcikuam9pbigpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRGlhY3JpdGljcyh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gdGV4dC5ub3JtYWxpemUoJ05GRCcpLnJlcGxhY2UoL1tcXHUwMzAwLVxcdTAzNmZdL2csICcnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1Z2dlc3RGcm9tU3RyaW5nQXJyYXkoXG4gIHZhbHVlczogc3RyaW5nW10sXG4gIHZhbHVlOiBhbnksXG4gIG9wdGlvbnM/OiB7XG4gICAgc2VhcmNoQXR0cmlidXRlPzogc3RyaW5nO1xuICAgIHNlYXJjaEF0dHJpYnV0ZXM/OiBzdHJpbmdbXTtcbiAgfVxuKTogc3RyaW5nW10ge1xuICB2YWx1ZSA9ICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlICE9PSAnKicgJiYgdmFsdWUudG9VcHBlckNhc2UoKSkgfHwgdW5kZWZpbmVkO1xuICBpZiAoaXNOaWxPckJsYW5rKHZhbHVlKSkgcmV0dXJuIHZhbHVlcztcblxuICAvLyBJZiB3aWxkY2FyZCwgc2VhcmNoIHVzaW5nIHJlZ2V4cFxuICBpZiAoKHZhbHVlIGFzIHN0cmluZykuaW5kZXhPZignKicpICE9PSAtMSkge1xuICAgIHZhbHVlID0gKHZhbHVlIGFzIHN0cmluZykucmVwbGFjZSgnKicsICcuKicpO1xuICAgIHJldHVybiB2YWx1ZXMuZmlsdGVyKCh2KSA9PiBtYXRjaFVwcGVyQ2FzZSh2LCB2YWx1ZSkpO1xuICB9XG5cbiAgLy8gSWYgbm8gd2lsZGNhcmQsIHNlYXJjaCB1c2luZyBzdGFydHNXaXRoXG4gIHJldHVybiB2YWx1ZXMuZmlsdGVyKCh2KSA9PiBzdGFydHNXaXRoVXBwZXJDYXNlKHYsIHZhbHVlKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBqb2luUHJvcGVydGllc1BhdGg8VCA9IGFueT4ob2JqOiBULCBwcm9wZXJ0aWVzOiBzdHJpbmdbXSwgc2VwYXJhdG9yPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFvYmopIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGRpc3BsYXkgYW4gdW5kZWZpbmVkIGVudGl0eS4nKTtcbiAgaWYgKGlzRW1wdHlBcnJheShwcm9wZXJ0aWVzKSkgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyBvciBlbXB0eSAncHJvcGVydGllcycgYXJndW1lbnRcIik7XG4gIHJldHVybiBwcm9wZXJ0aWVzXG4gICAgLm1hcCgocGF0aCkgPT4gZ2V0UHJvcGVydHlCeVBhdGgob2JqLCBwYXRoKSlcbiAgICAuZmlsdGVyKGlzTm90TmlsT3JCbGFuaylcbiAgICAuam9pbihzZXBhcmF0b3IgfHwgREVGQVVMVF9KT0lOX1BST1BFUlRJRVNfU0VQQVJBVE9SKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpvaW5Qcm9wZXJ0aWVzPFQgPSBhbnksIEsgZXh0ZW5kcyBrZXlvZiBUID0gYW55PihvYmo6IFQsIGtleXM6IEtbXSwgc2VwYXJhdG9yPzogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFvYmopIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGRpc3BsYXkgYW4gdW5kZWZpbmVkIGVudGl0eS4nKTtcbiAgcmV0dXJuIGtleXNcbiAgICAubWFwKChrZXkpID0+IGdldFByb3BlcnR5KG9iaiwga2V5KSlcbiAgICAuZmlsdGVyKGlzTm90TmlsT3JCbGFuaylcbiAgICAuam9pbihzZXBhcmF0b3IgfHwgREVGQVVMVF9KT0lOX1BST1BFUlRJRVNfU0VQQVJBVE9SKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnR5UGF0aENvbXBhcmF0b3I8VCA9IGFueT4ocGF0aDogc3RyaW5nIHwgc3RyaW5nW10pOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyIHtcbiAgcmV0dXJuIChhOiBULCBiOiBUKSA9PiB7XG4gICAgY29uc3QgdmFsdWVBID0gZ2V0UHJvcGVydHlCeVBhdGgoYSwgcGF0aCk7XG4gICAgY29uc3QgdmFsdWVCID0gZ2V0UHJvcGVydHlCeVBhdGgoYiwgcGF0aCk7XG4gICAgcmV0dXJuIHZhbHVlQSA9PT0gdmFsdWVCID8gMCA6IHZhbHVlQSA+IHZhbHVlQiA/IDEgOiAtMTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByb3BlcnR5Q29tcGFyYXRvcjxUID0gYW55LCBLIGV4dGVuZHMga2V5b2YgVCA9IGFueT4oa2V5OiBLLCBkZWZhdWx0VmFsdWU/OiBhbnkpOiAoYTogVCwgYjogVCkgPT4gbnVtYmVyIHtcbiAgcmV0dXJuIChhOiBULCBiOiBUKSA9PiB7XG4gICAgY29uc3QgdmFsdWVBID0gYVtrZXldICE9PSB1bmRlZmluZWQgPyBhW2tleV0gOiBkZWZhdWx0VmFsdWU7XG4gICAgY29uc3QgdmFsdWVCID0gYltrZXldID8gYltrZXldIDogZGVmYXVsdFZhbHVlO1xuICAgIHJldHVybiB2YWx1ZUEgPT09IHZhbHVlQiA/IDAgOiB2YWx1ZUEgPiB2YWx1ZUIgPyAxIDogLTE7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0aWVzUGF0aENvbXBhcmF0b3I8VCA9IGFueT4oa2V5czogc3RyaW5nW10sIGRlZmF1bHRWYWx1ZXM/OiBhbnlbXSk6IChhOiBULCBiOiBUKSA9PiBudW1iZXIge1xuICBpZiAoIWtleXMgfHwgIWtleXMubGVuZ3RoIHx8IChkZWZhdWx0VmFsdWVzICYmIGtleXMubGVuZ3RoID4gZGVmYXVsdFZhbHVlcy5sZW5ndGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBhcmd1bWVudHM6IG1pc3NpbmcgJ2tleXMnIG9yIGFycmF5ICdkZWZhdWx0VmFsdWVzJyBoYXMgYSBiYWQgbGVuZ3RoXCIpO1xuICB9XG4gIHJldHVybiAoYTogVCwgYjogVCkgPT5cbiAgICBrZXlzXG4gICAgICAubWFwKChrZXksIGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlQSA9IGdldFByb3BlcnR5QnlQYXRoKGEsIGtleSwgZGVmYXVsdFZhbHVlcyAmJiBkZWZhdWx0VmFsdWVzW2luZGV4XSk7XG4gICAgICAgIGNvbnN0IHZhbHVlQiA9IGdldFByb3BlcnR5QnlQYXRoKGIsIGtleSwgZGVmYXVsdFZhbHVlcyAmJiBkZWZhdWx0VmFsdWVzW2luZGV4XSk7XG4gICAgICAgIHJldHVybiB2YWx1ZUEgPT09IHZhbHVlQiA/IDAgOiB2YWx1ZUEgPiB2YWx1ZUIgPyAxIDogLTE7XG4gICAgICB9KVxuICAgICAgLy8gU3RvcCBpZiBub3QgZXF1YWxzLCBvdGhlcndpc2UgY29udGludWUgd2l0aCB0aGUgbmV4dCBrZXlcbiAgICAgIC5maW5kKChyZXMpID0+IHJlcyAhPT0gMCkgfHwgMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNvcnQ8VD4oYXJyYXk6IFRbXSwgYXR0cmlidXRlPzogc3RyaW5nLCBvcHRzPzogSW50bC5Db2xsYXRvck9wdGlvbnMpOiBUW10ge1xuICBpZiAoaXNFbXB0eUFycmF5KGFycmF5KSkgcmV0dXJuIGFycmF5O1xuICBjb25zdCBjb21wYXJlRm46IChhOiBhbnksIGI6IGFueSkgPT4gbnVtYmVyID0gb3B0cyA/IG5ldyBJbnRsLkNvbGxhdG9yKHVuZGVmaW5lZCwgb3B0cykuY29tcGFyZSA6ICh2MSwgdjIpID0+ICh2MSA9PT0gdjIgPyAwIDogdjEgPiB2MiA/IDEgOiAtMSk7XG4gIHJldHVybiBhcnJheVxuICAgIC5zbGljZSgpIC8vIGNvcHlcbiAgICAuc29ydChhdHRyaWJ1dGUgPyAoYSwgYikgPT4gY29tcGFyZUZuKGFbYXR0cmlidXRlXSwgYlthdHRyaWJ1dGVdKSA6IGNvbXBhcmVGbik7XG59XG5jb25zdCBJTlRFR0VSX1JFR0VYUCA9IC9eWy1dP1xcZCskLztcbmV4cG9ydCBmdW5jdGlvbiBpc0ludCh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc05vdE5pbCh2YWx1ZSkgJiYgSU5URUdFUl9SRUdFWFAudGVzdCh2YWx1ZSk7XG59XG5jb25zdCBOVU1CRVJfUkVHRVhQID0gL15bLV0/XFxkKyhcXC5cXGQrKT8kLztcbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcih2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc05vdE5pbCh2YWx1ZSkgJiYgTlVNQkVSX1JFR0VYUC50ZXN0KHZhbHVlKTtcbn1cblxuY29uc3QgTlVNQkVSX1JBTkdFX1JFR0VYUCA9IC9eKFxcZCstXFxkKyl8KFs+PD1dKlxcZCspJC87XG5leHBvcnQgZnVuY3Rpb24gaXNOdW1iZXJSYW5nZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc05vdE5pbCh2YWx1ZSkgJiYgTlVNQkVSX1JBTkdFX1JFR0VYUC50ZXN0KHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFByb3BlcnR5QnlQYXRoKG9iajogYW55LCBwYXRoOiBzdHJpbmcgfCBBcnJheTxzdHJpbmcgfCBudW1iZXI+LCBkZWZhdWx0VmFsdWU/OiBhbnkpOiBhbnkge1xuICBpZiAoaXNOaWwob2JqKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgLy8gUGF0aCBpcyBhbiBhcnJheTogY29udmVydCBwYXRoIHRvIHN0cmluZ1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkge1xuICAgIHJldHVybiBnZXRQcm9wZXJ0eUJ5UGF0aChvYmosIHBhdGguam9pbignLicpLCBkZWZhdWx0VmFsdWUpO1xuICB9XG4gIGlmIChpc05pbE9yQmxhbmsocGF0aCkpIHJldHVybiBvYmo7XG4gIGlmIChwYXRoLmluZGV4T2YoJ1snKSAhPT0gLTEpIHtcbiAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9cXFsoW15cXFtcXF1dKilcXF0vLCAnLiQxLicpO1xuICB9XG4gIGNvbnN0IGkgPSBwYXRoLmluZGV4T2YoJy4nKTtcbiAgLy8gU2ltcGxlIHByb3BlcnR5IHBhdGhcbiAgaWYgKGkgPT09IC0xKSB7XG4gICAgY29uc3QgcmVzID0gb2JqW3BhdGhdO1xuICAgIHJldHVybiBpc05vdE5pbChyZXMpIHx8IGlzTmlsKGRlZmF1bHRWYWx1ZSkgPyByZXMgOiBkZWZhdWx0VmFsdWU7XG4gIH1cbiAgLy8gQ29tcGxleCBwcm9wZXJ0eSBwYXRoXG4gIGNvbnN0IG9wdGlvbmFsID0gcGF0aC5jaGFyQXQoaSAtIDEpID09PSAnPyc7XG4gIGNvbnN0IGtleSA9IHBhdGguc3Vic3RyaW5nKDAsIG9wdGlvbmFsID8gaSAtIDEgOiBpKTtcbiAgaWYgKGlzTmlsKG9ialtrZXldKSkgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgaWYgKHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICAvLyBPYmplY3Qgb3IgQXJyYXlcbiAgICAvLyBSZWN1cnNpdmUgY2FsbFxuICAgIHJldHVybiBnZXRQcm9wZXJ0eUJ5UGF0aChvYmpba2V5XSwgcGF0aC5zdWJzdHJpbmcoaSArIDEpKTtcbiAgfVxuICBpZiAob3B0aW9uYWwpIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwcm9wZXJ0eSBwYXRoOiAnJHtrZXl9JyBpcyBub3QgYW4gdmFsaWQgb2JqZWN0LmApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcGVydHk8VCA9IGFueSwgSyBleHRlbmRzIGtleW9mIFQgPSBhbnk+KG9iajogVCwga2V5OiBLKTogVFtLXSB7XG4gIGlmIChpc05pbChvYmopKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gb2JqW2tleV07IC8vIEluZmVycmVkIHR5cGUgaXMgVFtLXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvcGVydHlCeVBhdGhBc1N0cmluZyhvYmo6IGFueSwgcGF0aDogc3RyaW5nIHwgc3RyaW5nW10pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCByZXMgPSBnZXRQcm9wZXJ0eUJ5UGF0aChvYmosIHBhdGgpO1xuICByZXR1cm4gdHlwZW9mIHJlcyA9PT0gJ3N0cmluZycgPyByZXMgOiAnJyArIHJlcztcbn1cblxuLyoqXG4gKiBVcGRhdGUgYW4gb2JqZWN0J3MgcHJvcGVydHksIHVzaW5nIGEgcGF0aCAobGlrZSAnPHByb3BlcnR5XzE+LjxzdWJfcHJvcGVydHlfMT4nKVxuICogQHBhcmFtIG9ialxuICogQHBhcmFtIHBhdGhcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHJldHVybiB0aGUgZ2l2ZW4gb2JqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRQcm9wZXJ0eUJ5UGF0aDxUID0gYW55PihvYmo6IFQsIHBhdGg6IHN0cmluZyB8IHN0cmluZ1tdLCB2YWx1ZTogYW55KTogVCB7XG4gIC8vIFBhdGggaXMgYW4gYXJyYXk6IGNvbnZlcnQgcGF0aCB0byBzdHJpbmdcbiAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHtcbiAgICByZXR1cm4gc2V0UHJvcGVydHlCeVBhdGgob2JqLCBwYXRoLmpvaW4oJy4nKSwgdmFsdWUpO1xuICB9XG4gIGlmIChpc05pbChvYmopKSByZXR1cm4gb2JqOyAvLyBTa2lwXG4gIGNvbnN0IGkgPSBwYXRoLmluZGV4T2YoJy4nKTtcbiAgLy8gU2ltcGxlIHByb3BlcnR5IHBhdGhcbiAgaWYgKGkgPT09IC0xKSB7XG4gICAgb2JqW3BhdGhdID0gdmFsdWU7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuICBjb25zdCBrZXkgPSBwYXRoLnN1YnN0cmluZygwLCBpKTtcbiAgaWYgKGlzTmlsKG9ialtrZXldKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKG9ialtrZXldICYmIHR5cGVvZiBvYmpba2V5XSA9PT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gc2V0UHJvcGVydHlCeVBhdGgob2JqW2tleV0sIHBhdGguc3Vic3RyaW5nKGkgKyAxKSwgdmFsdWUpO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBmb3JtIHBhdGg6ICcke2tleX0nIGlzIG5vdCBhbiB2YWxpZCBvYmplY3QuYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChtcyA8PSAwKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9taXNlPFQ+KHZhbHVlOiBUIHwgUHJvbWlzZTxUPik6IHZhbHVlIGlzIFByb21pc2U8VD4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlPy5bJ3RoZW4nXSA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWU/LlsnY2F0Y2gnXSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJvdW5kKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQgfCBudWxsKTogbnVtYmVyIHtcbiAgaWYgKGlzTm90TmlsT3JOYU4odmFsdWUpKSB7XG4gICAgcmV0dXJuIE1hdGgucm91bmQoKHZhbHVlICsgTnVtYmVyLkVQU0lMT04pICogMTAwKSAvIDEwMDtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlcXVhbHNPck5pbCh2YWx1ZTE6IGFueSwgdmFsdWUyOiBhbnkpIHtcbiAgcmV0dXJuIHZhbHVlMSA9PT0gdmFsdWUyIHx8IChpc05pbCh2YWx1ZTEpICYmIGlzTmlsKHZhbHVlMikpO1xufVxuXG4vKipcbiAqIHJlbW92ZSBlbGVtZW50cyBmcm9tIGFuIGFycmF5XG4gKlxuICogQHJldHVybiB0aGUgcmVtb3ZlZCBlbGVtZW50c1xuICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSBvbiB3aGljaCBlbGVtZW50cyB3aWxsIGJlIHJlbW92ZWRcbiAqIEBwYXJhbSBwcmVkaWNhdGUgdGhlIHNlbGVjdGlvbiBwcmVkaWNhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFsbDxUPihhcnJheTogVFtdLCBwcmVkaWNhdGU6ICh2YWx1ZTogVCkgPT4gYm9vbGVhbik6IFRbXSB7XG4gIGxldCBuYlJlbW92ZSA9IDA7XG4gIHJldHVybiBhcnJheVxuICAgIC5zbGljZSgpXG4gICAgLm1hcCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlKSkge1xuICAgICAgICBuYlJlbW92ZSsrOyAvLyBnbGl0Y2ggY291bnRlciB0byBhdm9pZCBpbmRleCBnYXBcbiAgICAgICAgcmV0dXJuIGFycmF5LnNwbGljZShpbmRleCAtIG5iUmVtb3ZlICsgMSwgMSlbMF07XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9KVxuICAgIC5maWx0ZXIoaXNOb3ROaWwpO1xufVxuXG4vKipcbiAqIHJlbW92ZSB0aGUgZmlyc3QgZWxlbWVudCBmcm9tIGFuIGFycmF5XG4gKlxuICogQHJldHVybiB0aGUgcmVtb3ZlZCBlbGVtZW50XG4gKiBAcGFyYW0gYXJyYXkgdGhlIGFycmF5IG9uIHdoaWNoIHRoZSBlbGVtZW50IHdpbGwgYmUgcmVtb3ZlZFxuICogQHBhcmFtIHByZWRpY2F0ZSB0aGUgc2VsZWN0aW9uIHByZWRpY2F0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlPFQ+KGFycmF5OiBUW10sIHByZWRpY2F0ZTogKHZhbHVlOiBUKSA9PiBib29sZWFuKTogVCB7XG4gIHJldHVybiBhcnJheS5zbGljZSgpLmZpbmQoKHZhbHVlLCBpbmRleCkgPT4ge1xuICAgIGlmIChwcmVkaWNhdGUodmFsdWUpKSB7XG4gICAgICBhcnJheS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXBpdGFsaXplRmlyc3RMZXR0ZXIodmFsdWU6IHN0cmluZykge1xuICBpZiAoIXZhbHVlIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHZhbHVlO1xuICByZXR1cm4gdmFsdWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB2YWx1ZS5zdWJzdHJpbmcoMSk7XG59XG5leHBvcnQgZnVuY3Rpb24gdW5jYXBpdGFsaXplRmlyc3RMZXR0ZXIodmFsdWU6IHN0cmluZykge1xuICBpZiAoIXZhbHVlIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHZhbHVlO1xuICByZXR1cm4gdmFsdWUuY2hhckF0KDApLnRvTG93ZXJDYXNlKCkgKyB2YWx1ZS5zdWJzdHJpbmcoMSk7XG59XG5leHBvcnQgZnVuY3Rpb24gYm9vbGVhblRvU3RyaW5nKHZhbHVlOiBhbnksIG9wdHM6IHsgeWVzTGFiZWw6IHN0cmluZzsgbm9MYWJlbDogc3RyaW5nIH0gPSB7IHllc0xhYmVsOiAnQ09NTU9OLllFUycsIG5vTGFiZWw6ICdDT01NT04uTk8nIH0pIHtcbiAgaWYgKGlzTmlsKHZhbHVlKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHZhbHVlID09PSAxIHx8IHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSAndHJ1ZScgPyBvcHRzLnllc0xhYmVsIDogb3B0cy5ub0xhYmVsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRCeVByb3BlcnR5PFQsIE0gZXh0ZW5kcyBLZXlWYWx1ZVR5cGU8VD4gPSBLZXlWYWx1ZVR5cGU8VD4+KGFycmF5OiBUW10gfCByZWFkb25seSBUW10sIHByb3BlcnR5TmFtZToga2V5b2YgVCB8IHN0cmluZyk6IE0ge1xuICByZXR1cm4gKGFycmF5IHx8IFtdKS5yZWR1Y2UoKHJlcywgdmFsdWUpID0+IHtcbiAgICBjb25zdCBrZXkgPSAodmFsdWUgYXMgdW5rbm93biBhcyBhbnkpPy5bcHJvcGVydHlOYW1lXTtcbiAgICBpZiAoaXNOb3ROaWwoa2V5KSkge1xuICAgICAgcmVzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfSwge30pIGFzIE07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEJ5SWQ8VCwgTSBleHRlbmRzIEtleVZhbHVlVHlwZTxUPiA9IEtleVZhbHVlVHlwZTxUPj4oYXJyYXk6IFRbXSB8IHJlYWRvbmx5IFRbXSk6IE0ge1xuICByZXR1cm4gKGFycmF5IHx8IFtdKS5yZWR1Y2UoXG4gICAgKHJlcywgdmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IHZhbHVlPy5bJ2lkJ107XG4gICAgICBpZiAoaXNOb3ROaWwoa2V5KSkge1xuICAgICAgICByZXNba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9LFxuICAgIDxNPnt9XG4gICk7XG59XG5cbi8qKlxuICogU3BsaXQgYW4gYXJyYXksIGludG8gYSBtYXAgb2YgYXJyYXksIGdyb3VwIGJ5IHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0QnlQcm9wZXJ0eTxUPih2YWx1ZXM6IFRbXSwgcHJvcGVydHlOYW1lOiBrZXlvZiBUKTogS2V5VmFsdWVUeXBlPFRbXT4ge1xuICByZXR1cm4gKHZhbHVlcyB8fCBbXSkucmVkdWNlKFxuICAgIChyZXMsIGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IGtleSA9IGl0ZW0gJiYgaXRlbVtwcm9wZXJ0eU5hbWVdO1xuICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdudW1iZXInIHx8IHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJlc1trZXldID0gcmVzW2tleV0gfHwgW107XG4gICAgICAgIHJlc1trZXldLnB1c2goaXRlbSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0sXG4gICAgPEtleVZhbHVlVHlwZTxUW10+Pnt9XG4gICk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiB0d28gb2JqZWN0cyBvciB0d28gdmFsdWVzIGFyZSBlcXVpdmFsZW50LlxuICpcbiAqIFR3byBvYmplY3RzIG9yIHZhbHVlcyBhcmUgY29uc2lkZXJlZCBlcXVpdmFsZW50IGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nIGlzIHRydWU6XG4gKlxuICogKiBCb3RoIG9iamVjdHMgb3IgdmFsdWVzIHBhc3MgYD09PWAgY29tcGFyaXNvbi5cbiAqICogQm90aCBvYmplY3RzIG9yIHZhbHVlcyBhcmUgb2YgdGhlIHNhbWUgdHlwZSBhbmQgYWxsIG9mIHRoZWlyIHByb3BlcnRpZXMgYXJlIGVxdWFsIGJ5XG4gKiAgIGNvbXBhcmluZyB0aGVtIHdpdGggYGVxdWFsc2AuXG4gKlxuICogQHBhcmFtIG8xIE9iamVjdCBvciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHBhcmFtIG8yIE9iamVjdCBvciB2YWx1ZSB0byBjb21wYXJlLlxuICogQHJldHVybnMgdHJ1ZSBpZiBhcmd1bWVudHMgYXJlIGVxdWFsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXF1YWxzKG8xOiBhbnksIG8yOiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKG8xID09PSBvMikgcmV0dXJuIHRydWU7XG4gIGlmIChvMSA9PT0gbnVsbCB8fCBvMiA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAobzEgIT09IG8xICYmIG8yICE9PSBvMikgcmV0dXJuIHRydWU7IC8vIE5hTiA9PT0gTmFOXG4gIGNvbnN0IHQxID0gdHlwZW9mIG8xO1xuICBjb25zdCB0MiA9IHR5cGVvZiBvMjtcbiAgbGV0IGxlbmd0aDogbnVtYmVyO1xuICBsZXQga2V5OiBhbnk7XG4gIGxldCBrZXlTZXQ6IGFueTtcbiAgaWYgKHQxID09PSB0MiAmJiB0MSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvMSkpIHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShvMikpIHJldHVybiBmYWxzZTtcbiAgICAgIGlmICgobGVuZ3RoID0gbzEubGVuZ3RoKSA9PT0gbzIubGVuZ3RoKSB7XG4gICAgICAgIGZvciAoa2V5ID0gMDsga2V5IDwgbGVuZ3RoOyBrZXkrKykge1xuICAgICAgICAgIGlmICghZXF1YWxzKG8xW2tleV0sIG8yW2tleV0pKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG8yKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBrZXlTZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGd1YXJkLWZvci1pblxuICAgICAgZm9yIChrZXkgaW4gbzEpIHtcbiAgICAgICAgaWYgKCFlcXVhbHMobzFba2V5XSwgbzJba2V5XSkpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAga2V5U2V0W2tleV0gPSB0cnVlO1xuICAgICAgfVxuICAgICAgZm9yIChrZXkgaW4gbzIpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIGtleVNldCkgJiYgdHlwZW9mIG8yW2tleV0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBAZHluYW1pY1xuZXhwb3J0IGNsYXNzIEJlYW5zIHtcbiAgLyoqXG4gICAqIENvcHkgYSBzb3VyY2Ugb2JqZWN0LCBieSBpbmNsdWRpbmcgb25seSBwcm9wZXJ0aWVzIG9mIHRoZSBnaXZlbiBkYXRhVHlwZS5cbiAgICogSU1QT1JUQU5UOiBleHRyYSBwcm9wZXJ0aWVzIHRoYXQgYXJlIE5PVCBpbiB0aGUgdGFyZ2V0Q2xhc3MgYXJlIE5PVCBjb3BpZWQuXG4gICAqXG4gICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QgdG8gY29weVxuICAgKiBAcGFyYW0gZGF0YVR5cGUgdGhlIGNsYXNzIHRvIHVzZSBhcyB0YXJnZXQgY2xhc3NcbiAgICogQHBhcmFtIGtleXMgVGhlIGtleXMgdG8gY29weS4gSWYgZW1wdHksIHdpbGwgY29weSBvbmx5IE5PVCBvcHRpb25hbCBwcm9wZXJ0aWVzIGZyb20gdGhlIGRhdGFUeXBlXG4gICAqL1xuICBzdGF0aWMgY29weTxUPihzb3VyY2U6IFQsIGRhdGFUeXBlOiBuZXcgKCkgPT4gVCwga2V5cz86IEtleXNFbnVtPFQ+KTogVCB7XG4gICAgaWYgKGlzTmlsKHNvdXJjZSkpIHJldHVybiBzb3VyY2U7XG4gICAgY29uc3QgdGFyZ2V0ID0gbmV3IGRhdGFUeXBlKCk7XG4gICAgT2JqZWN0LmtleXMoa2V5cyB8fCB0YXJnZXQpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9KTtcbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNheXMgaWYgYW4gb2JqZWN0IGFsbCBhbGwgcHJvcGVydGllcyB0byBuaWxcbiAgICovXG4gIHN0YXRpYyBpc0VtcHR5PFQ+KFxuICAgIGRhdGE6IFQsXG4gICAga2V5cz86IEtleXNFbnVtPFQ+IHwgc3RyaW5nW10sXG4gICAgb3B0cz86IHtcbiAgICAgIGJsYW5rU3RyaW5nTGlrZUVtcHR5PzogYm9vbGVhbjtcbiAgICB9XG4gICk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICBpc05pbChkYXRhKSB8fFxuICAgICAgKEFycmF5LmlzQXJyYXkoa2V5cykgPyBrZXlzIDogT2JqZWN0LmtleXMoa2V5cyB8fCBkYXRhKSlcbiAgICAgICAgLy8gRmluZCBpbmRleCBvZiB0aGUgZmlyc3QgTk9UIG5pbCB2YWx1ZVxuICAgICAgICAuZmluZEluZGV4KChrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRhdGFba2V5XTtcbiAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JykgcmV0dXJuICFCZWFucy5pc0VtcHR5KHZhbHVlLCBudWxsLCBvcHRzKTsgLy8gTG9vcFxuICAgICAgICAgIGlmIChvcHRzICYmIG9wdHMuYmxhbmtTdHJpbmdMaWtlRW1wdHkgPT09IHRydWUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykgcmV0dXJuIGlzTm90TmlsT3JCbGFuayh2YWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGlzTm90TmlsKHZhbHVlKTtcbiAgICAgICAgfSkgPT09IC0xXG4gICAgKTtcbiAgfVxuXG4gIHN0YXRpYyBjb2xsZWN0QnlJZDxUPihhcnJheTogVFtdKTogS2V5VmFsdWVUeXBlPFRbXT4ge1xuICAgIHJldHVybiBjb2xsZWN0QnlQcm9wZXJ0eShhcnJheSwgJ2lkJyBhcyBrZXlvZiBUKTtcbiAgfVxuXG4gIHN0YXRpYyBjb2xsZWN0QnlQcm9wZXJ0eSA9IGNvbGxlY3RCeVByb3BlcnR5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZFBhcmVudFdpdGhDbGFzcyhlbGVtOiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gIGlmICghY2xhc3NOYW1lKSByZXR1cm4gdW5kZWZpbmVkO1xuICBsZXQgY3VycmVudEVsZW1lbnQgPSBlbGVtPy5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAoY3VycmVudEVsZW1lbnQpIHtcbiAgICBpZiAoY3VycmVudEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSkpIHJldHVybiBjdXJyZW50RWxlbWVudDtcbiAgICBjdXJyZW50RWxlbWVudCA9IGN1cnJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGludGVyc2VjdEFycmF5czxUID0gYW55Pih2YWx1ZXM6IFRbXVtdKTogVFtdIHtcbiAgaWYgKGlzRW1wdHlBcnJheSh2YWx1ZXMpKSByZXR1cm4gW107XG5cbiAgLy8gVXRpbGlzZSBsYSBtw6l0aG9kZSByZWR1Y2UgcG91ciBvYnRlbmlyIGwnaW50ZXJzZWN0aW9uIGRlcyB0YWJsZWF1eFxuICByZXR1cm4gdmFsdWVzLnJlZHVjZSgoYWNjLCBjdXJyKSA9PiBhY2MuZmlsdGVyKCh4KSA9PiBjdXJyLmluY2x1ZGVzKHgpKSwgdmFsdWVzWzBdLnNsaWNlKCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9IdG1sKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIC8vIFVzZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gcmVtb3ZlIGFsbCBIVE1MIHRhZ3NcbiAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvPFtePl0qPi4qPzxcXC9bXj5dKj58PFtePl0rPi9nLCAnJyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG59XG4iXX0=
@@ -20,4 +20,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
20
20
  type: Inject,
21
21
  args: [MAT_DIALOG_DATA]
22
22
  }] }] });
23
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90a2V5cy1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaG90a2V5cy9kaWFsb2cvaG90a2V5cy1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaG90a2V5cy9kaWFsb2cvaG90a2V5cy1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7O0FBTTNELE1BQU0sT0FBTyxzQkFBc0I7SUFHYztJQUYvQyxPQUFPLENBQVE7SUFFZixZQUErQyxJQUFJO1FBQUosU0FBSSxHQUFKLElBQUksQ0FBQTtRQUNqRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7dUdBTFUsc0JBQXNCLGtCQUdiLGVBQWU7MkZBSHhCLHNCQUFzQixvRENQbkMsa1BBV0E7OzJGREphLHNCQUFzQjtrQkFKbEMsU0FBUzs7OzBCQU9LLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICcuL2hvdGtleXMtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaG90a2V5cy1kaWFsb2cuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgSG90a2V5c0RpYWxvZ0NvbXBvbmVudCB7XG4gIGhvdGtleXM6IGFueVtdO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwcm90ZWN0ZWQgZGF0YSkge1xuICAgIHRoaXMuaG90a2V5cyA9IEFycmF5LmZyb20odGhpcy5kYXRhKTtcbiAgfVxufVxuIiwiPHRhYmxlIGNsYXNzPVwiaW9uLXBhZGRpbmdcIj5cbiAgPHRib2R5PlxuICAgIDx0ciAqbmdGb3I9XCJsZXQga2V5cyBvZiBob3RrZXlzXCI+XG4gICAgICA8dGQ+e3sga2V5c1sxXSB8IHRyYW5zbGF0ZSB9fTwvdGQ+XG5cbiAgICAgIDx0ZCBjbGFzcz1cInRleHQtcmlnaHRcIj5cbiAgICAgICAgPGtiZD57eyBrZXlzWzBdIH19PC9rYmQ+XG4gICAgICA8L3RkPlxuICAgIDwvdHI+XG4gIDwvdGJvZHk+XG48L3RhYmxlPlxuIl19
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90a2V5cy1kaWFsb2cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaG90a2V5cy9kaWFsb2cvaG90a2V5cy1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaG90a2V5cy9kaWFsb2cvaG90a2V5cy1kaWFsb2cuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDOzs7O0FBTTNELE1BQU0sT0FBTyxzQkFBc0I7SUFHYztJQUYvQyxPQUFPLENBQVE7SUFFZixZQUErQyxJQUFTO1FBQVQsU0FBSSxHQUFKLElBQUksQ0FBSztRQUN0RCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7dUdBTFUsc0JBQXNCLGtCQUdiLGVBQWU7MkZBSHhCLHNCQUFzQixvRENQbkMsa1BBV0E7OzJGREphLHNCQUFzQjtrQkFKbEMsU0FBUzs7OzBCQU9LLE1BQU07MkJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNQVRfRElBTE9HX0RBVEEgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuXG5AQ29tcG9uZW50KHtcbiAgdGVtcGxhdGVVcmw6ICcuL2hvdGtleXMtZGlhbG9nLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaG90a2V5cy1kaWFsb2cuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgSG90a2V5c0RpYWxvZ0NvbXBvbmVudCB7XG4gIGhvdGtleXM6IGFueVtdO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoTUFUX0RJQUxPR19EQVRBKSBwcm90ZWN0ZWQgZGF0YTogYW55KSB7XG4gICAgdGhpcy5ob3RrZXlzID0gQXJyYXkuZnJvbSh0aGlzLmRhdGEpO1xuICB9XG59XG4iLCI8dGFibGUgY2xhc3M9XCJpb24tcGFkZGluZ1wiPlxuICA8dGJvZHk+XG4gICAgPHRyICpuZ0Zvcj1cImxldCBrZXlzIG9mIGhvdGtleXNcIj5cbiAgICAgIDx0ZD57eyBrZXlzWzFdIHwgdHJhbnNsYXRlIH19PC90ZD5cblxuICAgICAgPHRkIGNsYXNzPVwidGV4dC1yaWdodFwiPlxuICAgICAgICA8a2JkPnt7IGtleXNbMF0gfX08L2tiZD5cbiAgICAgIDwvdGQ+XG4gICAgPC90cj5cbiAgPC90Ym9keT5cbjwvdGFibGU+XG4iXX0=
@@ -1,13 +1,13 @@
1
1
  import { Inject, inject, Injectable, InjectionToken, Optional } from '@angular/core';
2
- import { Observable } from 'rxjs';
2
+ import { delay, Observable } from 'rxjs';
3
3
  import { DOCUMENT } from '@angular/common';
4
4
  import { HotkeysDialogComponent } from './dialog/hotkeys-dialog.component';
5
5
  import { isNotNilOrBlank } from '../functions';
6
6
  import { first } from 'rxjs/operators';
7
7
  import * as i0 from "@angular/core";
8
- import * as i1 from "@angular/platform-browser";
9
- import * as i2 from "@angular/material/dialog";
10
- import * as i3 from "@ionic/angular";
8
+ import * as i1 from "@ionic/angular";
9
+ import * as i2 from "@angular/platform-browser";
10
+ import * as i3 from "@angular/material/dialog";
11
11
  export const APP_HOTKEYS_CONFIG = new InjectionToken('HotKeysConfig');
12
12
  export class Hotkeys {
13
13
  eventManager;
@@ -15,6 +15,7 @@ export class Hotkeys {
15
15
  modalController;
16
16
  popoverController;
17
17
  _debug = false;
18
+ _id = 0;
18
19
  _hotkeys = new Map();
19
20
  _document = inject(DOCUMENT);
20
21
  _defaults = {
@@ -22,8 +23,14 @@ export class Hotkeys {
22
23
  preventDefault: true,
23
24
  };
24
25
  _dialogRef;
26
+ _dialogIsOpened = false;
25
27
  _config;
26
- constructor(eventManager, dialog, modalController, popoverController, config) {
28
+ defaultControlKey;
29
+ defaultControlKeyName;
30
+ get isHelpModalOpened() {
31
+ return !!this._dialogRef;
32
+ }
33
+ constructor(platform, eventManager, dialog, modalController, popoverController, config) {
27
34
  this.eventManager = eventManager;
28
35
  this.dialog = dialog;
29
36
  this.modalController = modalController;
@@ -35,20 +42,26 @@ export class Hotkeys {
35
42
  };
36
43
  // Add shortcut to open help modal
37
44
  if (this._config.enableHelpModal) {
38
- this.addShortcut({ keys: this._config.openHelpModalShortcut }).subscribe(() => this.openHelpModal());
39
45
  if (this._debug)
40
46
  console.debug(`[hotkeys] Starting hotkeys service... Press ${this._config.openHelpModalShortcut} to get help modal.`);
47
+ this.addShortcut({ keys: this._config.openHelpModalShortcut }).subscribe(() => this.toggleHelpModal());
41
48
  }
49
+ const isIOS = platform.is('ios');
50
+ this.defaultControlKey = isIOS ? 'meta' : 'control';
51
+ this.defaultControlKeyName = isIOS ? '⌘' : 'Ctrl';
42
52
  // For DEV only
43
53
  //this._debug = !environment.production;
44
54
  }
45
55
  addShortcut(options) {
46
56
  const merged = { ...this._defaults, ...options };
57
+ if (!merged.keys)
58
+ throw new Error("Missing 'keys' or 'description' attribute");
47
59
  const event = `keydown.${merged.keys}`;
60
+ const id = this._id++;
61
+ this._hotkeys.set(id, merged);
48
62
  if (isNotNilOrBlank(merged.description)) {
49
63
  if (this._debug)
50
64
  console.debug(`[hotkeys] Add shortcut {${options.keys}}: ${merged.description}`);
51
- this._hotkeys.set(merged.keys, merged.description);
52
65
  }
53
66
  else {
54
67
  if (this._debug)
@@ -74,28 +87,49 @@ export class Hotkeys {
74
87
  const dispose = this.eventManager.addEventListener(merged.element, event, handler);
75
88
  return () => {
76
89
  dispose();
77
- this._hotkeys.delete(merged.keys);
90
+ this._hotkeys.delete(id);
78
91
  };
79
92
  });
80
93
  }
81
- openHelpModal() {
82
- if (this._dialogRef) {
83
- this._dialogRef.close(true);
84
- return;
94
+ toggleHelpModal() {
95
+ if (this.isHelpModalOpened) {
96
+ this.closeHelpModal();
97
+ }
98
+ else {
99
+ this.openHelpModal();
85
100
  }
101
+ }
102
+ openHelpModal() {
103
+ if (this.isHelpModalOpened)
104
+ return; // Skip if already opened
105
+ // Get keys with a not blank description
106
+ const hotkeys = Array.from(this._hotkeys.values()).reduce((map, item) => {
107
+ if (isNotNilOrBlank(item?.description)) {
108
+ map.set(item.keys, item.description);
109
+ }
110
+ return map;
111
+ }, new Map());
112
+ if (hotkeys.size === 0)
113
+ return; // Nothing to display
86
114
  this._dialogRef = this.dialog.open(HotkeysDialogComponent, {
87
115
  width: '500px',
88
- data: this._hotkeys,
116
+ data: hotkeys,
89
117
  });
90
118
  this._dialogRef
91
119
  .afterClosed()
92
- .pipe(first())
120
+ .pipe(first(),
121
+ // Avoid too many call (e.g. in Safari)
122
+ delay(250))
93
123
  .subscribe(() => {
94
124
  // Forget the dialog ref
95
125
  this._dialogRef = null;
126
+ console.debug('[hotkeys] Closing help modal');
96
127
  });
97
128
  }
98
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: Hotkeys, deps: [{ token: i1.EventManager }, { token: i2.MatDialog }, { token: i3.ModalController }, { token: i3.PopoverController }, { token: APP_HOTKEYS_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
129
+ closeHelpModal() {
130
+ this._dialogRef?.close(true);
131
+ }
132
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: Hotkeys, deps: [{ token: i1.Platform }, { token: i2.EventManager }, { token: i3.MatDialog }, { token: i1.ModalController }, { token: i1.PopoverController }, { token: APP_HOTKEYS_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
99
133
  static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: Hotkeys, providedIn: 'root' });
100
134
  }
101
135
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: Hotkeys, decorators: [{
@@ -103,10 +137,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImpor
103
137
  args: [{
104
138
  providedIn: 'root',
105
139
  }]
106
- }], ctorParameters: () => [{ type: i1.EventManager }, { type: i2.MatDialog }, { type: i3.ModalController }, { type: i3.PopoverController }, { type: undefined, decorators: [{
140
+ }], ctorParameters: () => [{ type: i1.Platform }, { type: i2.EventManager }, { type: i3.MatDialog }, { type: i1.ModalController }, { type: i1.PopoverController }, { type: undefined, decorators: [{
107
141
  type: Optional
108
142
  }, {
109
143
  type: Inject,
110
144
  args: [APP_HOTKEYS_CONFIG]
111
145
  }] }] });
112
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90a2V5cy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaG90a2V5cy9ob3RrZXlzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFckYsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDM0UsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUcvQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBc0J2QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLGNBQWMsQ0FBeUIsZUFBZSxDQUFDLENBQUM7QUFLOUYsTUFBTSxPQUFPLE9BQU87SUFZUjtJQUNBO0lBQ0E7SUFDQTtJQWRGLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDZixRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNyQixTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdCLFNBQVMsR0FBcUI7UUFDcEMsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTO1FBQ3ZCLGNBQWMsRUFBRSxJQUFJO0tBQ3JCLENBQUM7SUFDTSxVQUFVLENBQW9CO0lBQzlCLE9BQU8sQ0FBeUI7SUFFeEMsWUFDVSxZQUEwQixFQUMxQixNQUFpQixFQUNqQixlQUFnQyxFQUNoQyxpQkFBb0MsRUFDSixNQUErQjtRQUovRCxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLG9CQUFl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QyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNwQyxDQUFDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQ3pELEtBQUssRUFBRSxPQUFPO1lBQ2QsSUFBSSxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3BCLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVO2FBQ1osV0FBVyxFQUFFO2FBQ2IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ2IsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLHdCQUF3QjtZQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7dUdBckZVLE9BQU8sdUlBZ0JJLGtCQUFrQjsyR0FoQjdCLE9BQU8sY0FGTixNQUFNOzsyRkFFUCxPQUFPO2tCQUhuQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQjs7MEJBaUJJLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBpbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBPcHRpb25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRXZlbnRNYW5hZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBIb3RrZXlzRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9kaWFsb2cvaG90a2V5cy1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IGlzTm90TmlsT3JCbGFuayB9IGZyb20gJy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIsIFBvcG92ZXJDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgZmlyc3QgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmludGVyZmFjZSBPcHRpb25zIHtcbiAgZWxlbWVudDogYW55O1xuICBlbGVtZW50TmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBrZXlzOiBzdHJpbmc7XG4gIHByZXZlbnREZWZhdWx0OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhvdEtleXNDb25maWcge1xuICAvKipcbiAgICogU2hvcnRjdXQgdG8gb3BlbiB0aGUgaG90a2V5cyBoZWxwIG1vZGFsXG4gICAqL1xuICBvcGVuSGVscE1vZGFsU2hvcnRjdXQ6IHN0cmluZztcblxuICAvKipcbiAgICogRW5hYmxlIHRoZSBob3RrZXlzIGhlbHAgbW9kYWxcbiAgICovXG4gIGVuYWJsZUhlbHBNb2RhbDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IEFQUF9IT1RLRVlTX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxQYXJ0aWFsPEhvdEtleXNDb25maWc+PignSG90S2V5c0NvbmZpZycpO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgSG90a2V5cyB7XG4gIHByaXZhdGUgX2RlYnVnID0gZmFsc2U7XG4gIHByaXZhdGUgX2hvdGtleXMgPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX2RvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcbiAgcHJpdmF0ZSBfZGVmYXVsdHM6IFBhcnRpYWw8T3B0aW9ucz4gPSB7XG4gICAgZWxlbWVudDogdGhpcy5fZG9jdW1lbnQsXG4gICAgcHJldmVudERlZmF1bHQ6IHRydWUsXG4gIH07XG4gIHByaXZhdGUgX2RpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPGFueT47XG4gIHByaXZhdGUgX2NvbmZpZzogUGFydGlhbDxIb3RLZXlzQ29uZmlnPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGV2ZW50TWFuYWdlcjogRXZlbnRNYW5hZ2VyLFxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXG4gICAgcHJpdmF0ZSBtb2RhbENvbnRyb2xsZXI6IE1vZGFsQ29udHJvbGxlcixcbiAgICBwcml2YXRlIHBvcG92ZXJDb250cm9sbGVyOiBQb3BvdmVyQ29udHJvbGxlcixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9IT1RLRVlTX0NPTkZJRykgY29uZmlnPzogUGFydGlhbDxIb3RLZXlzQ29uZmlnPlxuICApIHtcbiAgICB0aGlzLl9jb25maWcgPSB7XG4gICAgICBlbmFibGVIZWxwTW9kYWw6IHRydWUsXG4gICAgICBvcGVuSGVscE1vZGFsU2hvcnRjdXQ6ICdGMScsXG4gICAgICAuLi5jb25maWcsXG4gICAgfTtcblxuICAgIC8vIEFkZCBzaG9ydGN1dCB0byBvcGVuIGhlbHAgbW9kYWxcbiAgICBpZiAodGhpcy5fY29uZmlnLmVuYWJsZUhlbHBNb2RhbCkge1xuICAgICAgdGhpcy5hZGRTaG9ydGN1dCh7IGtleXM6IHRoaXMuX2NvbmZpZy5vcGVuSGVscE1vZGFsU2hvcnRjdXQgfSkuc3Vic2NyaWJlKCgpID0+IHRoaXMub3BlbkhlbHBNb2RhbCgpKTtcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2hvdGtleXNdIFN0YXJ0aW5nIGhvdGtleXMgc2VydmljZS4uLiBQcmVzcyAke3RoaXMuX2NvbmZpZy5vcGVuSGVscE1vZGFsU2hvcnRjdXR9IHRvIGdldCBoZWxwIG1vZGFsLmApO1xuICAgIH1cblxuICAgIC8vIEZvciBERVYgb25seVxuICAgIC8vdGhpcy5fZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgfVxuXG4gIGFkZFNob3J0Y3V0KG9wdGlvbnM6IFBhcnRpYWw8T3B0aW9ucz4pOiBPYnNlcnZhYmxlPEtleWJvYXJkRXZlbnQ+IHtcbiAgICBjb25zdCBtZXJnZWQgPSB7IC4uLnRoaXMuX2RlZmF1bHRzLCAuLi5vcHRpb25zIH07XG4gICAgY29uc3QgZXZlbnQgPSBga2V5ZG93bi4ke21lcmdlZC5rZXlzfWA7XG5cbiAgICBpZiAoaXNOb3ROaWxPckJsYW5rKG1lcmdlZC5kZXNjcmlwdGlvbikpIHtcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2hvdGtleXNdIEFkZCBzaG9ydGN1dCB7JHtvcHRpb25zLmtleXN9fTogJHttZXJnZWQuZGVzY3JpcHRpb259YCk7XG4gICAgICB0aGlzLl9ob3RrZXlzLnNldChtZXJnZWQua2V5cywgbWVyZ2VkLmRlc2NyaXB0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKGBbaG90a2V5c10gQWRkIHNob3J0Y3V0IHske29wdGlvbnMua2V5c319YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcikgPT4ge1xuICAgICAgY29uc3QgaGFuZGxlciA9IGFzeW5jIChlOiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgIC8vIEdldCB0b3AgY29tcG9uZW50IGZyb20gTW9kYWxDb250cm9sbGVyXG4gICAgICAgIGNvbnN0IHRvcCA9IChhd2FpdCB0aGlzLm1vZGFsQ29udHJvbGxlci5nZXRUb3AoKSkgfHwgKGF3YWl0IHRoaXMucG9wb3ZlckNvbnRyb2xsZXIuZ2V0VG9wKCkpO1xuICAgICAgICAvLyBJZiBtb2RhbCBwcmVzZW50LCBjaGVjayBpdHMgY29tcG9uZW50IG5hbWUgYWdhaW5zdCBob3RrZXkgZWxlbWVudCBuYW1lIChmaXggIzE4MSlcbiAgICAgICAgaWYgKHRvcCAmJiB0b3AuY29tcG9uZW50WyduYW1lJ10gIT09IG1lcmdlZC5lbGVtZW50TmFtZSkge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBLZXlib2FyZEV2ZW50ICYmIGUucmVwZWF0KSByZXR1cm47IC8vIHNraXAgd2hlbiByZXBlYXRlZFxuICAgICAgICBpZiAobWVyZ2VkLnByZXZlbnREZWZhdWx0KSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2hvdGtleXNdIFNob3J0Y3V0IHske29wdGlvbnMua2V5c319IGRldGVjdGVkLi4uYCk7XG4gICAgICAgIG9ic2VydmVyLm5leHQoZSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBkaXNwb3NlID0gdGhpcy5ldmVudE1hbmFnZXIuYWRkRXZlbnRMaXN0ZW5lcihtZXJnZWQuZWxlbWVudCwgZXZlbnQsIGhhbmRsZXIpO1xuXG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBkaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuX2hvdGtleXMuZGVsZXRlKG1lcmdlZC5rZXlzKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBvcGVuSGVscE1vZGFsKCkge1xuICAgIGlmICh0aGlzLl9kaWFsb2dSZWYpIHtcbiAgICAgIHRoaXMuX2RpYWxvZ1JlZi5jbG9zZSh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihIb3RrZXlzRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgIGRhdGE6IHRoaXMuX2hvdGtleXMsXG4gICAgfSk7XG4gICAgdGhpcy5fZGlhbG9nUmVmXG4gICAgICAuYWZ0ZXJDbG9zZWQoKVxuICAgICAgLnBpcGUoZmlyc3QoKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAvLyBGb3JnZXQgdGhlIGRpYWxvZyByZWZcbiAgICAgICAgdGhpcy5fZGlhbG9nUmVmID0gbnVsbDtcbiAgICAgIH0pO1xuICB9XG59XG4iXX0=
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaG90a2V5cy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvaG90a2V5cy9ob3RrZXlzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixNQUFNLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5HLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMzRSxPQUFPLEVBQWdCLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUc3RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBc0J2QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLGNBQWMsQ0FBeUIsZUFBZSxDQUFDLENBQUM7QUFLOUYsTUFBTSxPQUFPLE9BQU87SUFzQlI7SUFDQTtJQUNBO0lBQ0E7SUF4QkYsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNmLEdBQUcsR0FBVyxDQUFDLENBQUM7SUFDaEIsUUFBUSxHQUFHLElBQUksR0FBRyxFQUFtQixDQUFDO0lBQ3RDLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0IsU0FBUyxHQUFxQjtRQUNwQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFNBQVM7UUFDdkIsY0FBYyxFQUFFLElBQUk7S0FDckIsQ0FBQztJQUNNLFVBQVUsQ0FBb0I7SUFDOUIsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUN4QixPQUFPLENBQXlCO0lBRS9CLGlCQUFpQixDQUFTO0lBQzFCLHFCQUFxQixDQUFTO0lBRXZDLElBQUksaUJBQWlCO1FBQ25CLE9B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ZXIsIEluamVjdCwgaW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEV2ZW50TWFuYWdlciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgZGVsYXksIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEhvdGtleXNEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuL2RpYWxvZy9ob3RrZXlzLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgaXNOaWxPckJsYW5rLCBpc05vdE5pbE9yQmxhbmsgfSBmcm9tICcuLi9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgTW9kYWxDb250cm9sbGVyLCBQbGF0Zm9ybSwgUG9wb3ZlckNvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgeyBmaXJzdCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW50ZXJmYWNlIE9wdGlvbnMge1xuICBlbGVtZW50OiBhbnk7XG4gIGVsZW1lbnROYW1lOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGtleXM6IHN0cmluZztcbiAgcHJldmVudERlZmF1bHQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG90S2V5c0NvbmZpZyB7XG4gIC8qKlxuICAgKiBTaG9ydGN1dCB0byBvcGVuIHRoZSBob3RrZXlzIGhlbHAgbW9kYWxcbiAgICovXG4gIG9wZW5IZWxwTW9kYWxTaG9ydGN1dDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbmFibGUgdGhlIGhvdGtleXMgaGVscCBtb2RhbFxuICAgKi9cbiAgZW5hYmxlSGVscE1vZGFsOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgQVBQX0hPVEtFWVNfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPFBhcnRpYWw8SG90S2V5c0NvbmZpZz4+KCdIb3RLZXlzQ29uZmlnJyk7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBIb3RrZXlzIHtcbiAgcHJpdmF0ZSBfZGVidWcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaWQ6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX2hvdGtleXMgPSBuZXcgTWFwPG51bWJlciwgT3B0aW9ucz4oKTtcbiAgcHJpdmF0ZSBfZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuICBwcml2YXRlIF9kZWZhdWx0czogUGFydGlhbDxPcHRpb25zPiA9IHtcbiAgICBlbGVtZW50OiB0aGlzLl9kb2N1bWVudCxcbiAgICBwcmV2ZW50RGVmYXVsdDogdHJ1ZSxcbiAgfTtcbiAgcHJpdmF0ZSBfZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8YW55PjtcbiAgcHJpdmF0ZSBfZGlhbG9nSXNPcGVuZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfY29uZmlnOiBQYXJ0aWFsPEhvdEtleXNDb25maWc+O1xuXG4gIHJlYWRvbmx5IGRlZmF1bHRDb250cm9sS2V5OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGRlZmF1bHRDb250cm9sS2V5TmFtZTogc3RyaW5nO1xuXG4gIGdldCBpc0hlbHBNb2RhbE9wZW5lZCgpIHtcbiAgICByZXR1cm4gISF0aGlzLl9kaWFsb2dSZWY7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwbGF0Zm9ybTogUGxhdGZvcm0sXG4gICAgcHJpdmF0ZSBldmVudE1hbmFnZXI6IEV2ZW50TWFuYWdlcixcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgbW9kYWxDb250cm9sbGVyOiBNb2RhbENvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSBwb3BvdmVyQ29udHJvbGxlcjogUG9wb3ZlckNvbnRyb2xsZXIsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfSE9US0VZU19DT05GSUcpIGNvbmZpZz86IFBhcnRpYWw8SG90S2V5c0NvbmZpZz5cbiAgKSB7XG4gICAgdGhpcy5fY29uZmlnID0ge1xuICAgICAgZW5hYmxlSGVscE1vZGFsOiB0cnVlLFxuICAgICAgb3BlbkhlbHBNb2RhbFNob3J0Y3V0OiAnRjEnLFxuICAgICAgLi4uY29uZmlnLFxuICAgIH07XG5cbiAgICAvLyBBZGQgc2hvcnRjdXQgdG8gb3BlbiBoZWxwIG1vZGFsXG4gICAgaWYgKHRoaXMuX2NvbmZpZy5lbmFibGVIZWxwTW9kYWwpIHtcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2hvdGtleXNdIFN0YXJ0aW5nIGhvdGtleXMgc2VydmljZS4uLiBQcmVzcyAke3RoaXMuX2NvbmZpZy5vcGVuSGVscE1vZGFsU2hvcnRjdXR9IHRvIGdldCBoZWxwIG1vZGFsLmApO1xuXG4gICAgICB0aGlzLmFkZFNob3J0Y3V0KHsga2V5czogdGhpcy5fY29uZmlnLm9wZW5IZWxwTW9kYWxTaG9ydGN1dCB9KS5zdWJzY3JpYmUoKCkgPT4gdGhpcy50b2dnbGVIZWxwTW9kYWwoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNJT1MgPSBwbGF0Zm9ybS5pcygnaW9zJyk7XG4gICAgdGhpcy5kZWZhdWx0Q29udHJvbEtleSA9IGlzSU9TID8gJ21ldGEnIDogJ2NvbnRyb2wnO1xuICAgIHRoaXMuZGVmYXVsdENvbnRyb2xLZXlOYW1lID0gaXNJT1MgPyAn4oyYJyA6ICdDdHJsJztcblxuICAgIC8vIEZvciBERVYgb25seVxuICAgIC8vdGhpcy5fZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgfVxuXG4gIGFkZFNob3J0Y3V0KG9wdGlvbnM6IFBhcnRpYWw8T3B0aW9ucz4pOiBPYnNlcnZhYmxlPEtleWJvYXJkRXZlbnQ+IHtcbiAgICBjb25zdCBtZXJnZWQgPSA8T3B0aW9ucz57IC4uLnRoaXMuX2RlZmF1bHRzLCAuLi5vcHRpb25zIH07XG4gICAgaWYgKCFtZXJnZWQua2V5cykgdGhyb3cgbmV3IEVycm9yKFwiTWlzc2luZyAna2V5cycgb3IgJ2Rlc2NyaXB0aW9uJyBhdHRyaWJ1dGVcIik7XG4gICAgY29uc3QgZXZlbnQgPSBga2V5ZG93bi4ke21lcmdlZC5rZXlzfWA7XG4gICAgY29uc3QgaWQgPSB0aGlzLl9pZCsrO1xuXG4gICAgdGhpcy5faG90a2V5cy5zZXQoaWQsIG1lcmdlZCk7XG5cbiAgICBpZiAoaXNOb3ROaWxPckJsYW5rKG1lcmdlZC5kZXNjcmlwdGlvbikpIHtcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2hvdGtleXNdIEFkZCBzaG9ydGN1dCB7JHtvcHRpb25zLmtleXN9fTogJHttZXJnZWQuZGVzY3JpcHRpb259YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLl9kZWJ1ZykgY29uc29sZS5kZWJ1ZyhgW2hvdGtleXNdIEFkZCBzaG9ydGN1dCB7JHtvcHRpb25zLmtleXN9fWApO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgob2JzZXJ2ZXIpID0+IHtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBhc3luYyAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAvLyBHZXQgdG9wIGNvbXBvbmVudCBmcm9tIE1vZGFsQ29udHJvbGxlclxuICAgICAgICBjb25zdCB0b3AgPSAoYXdhaXQgdGhpcy5tb2RhbENvbnRyb2xsZXIuZ2V0VG9wKCkpIHx8IChhd2FpdCB0aGlzLnBvcG92ZXJDb250cm9sbGVyLmdldFRvcCgpKTtcbiAgICAgICAgLy8gSWYgbW9kYWwgcHJlc2VudCwgY2hlY2sgaXRzIGNvbXBvbmVudCBuYW1lIGFnYWluc3QgaG90a2V5IGVsZW1lbnQgbmFtZSAoZml4ICMxODEpXG4gICAgICAgIGlmICh0b3AgJiYgdG9wLmNvbXBvbmVudFsnbmFtZSddICE9PSBtZXJnZWQuZWxlbWVudE5hbWUpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlIGluc3RhbmNlb2YgS2V5Ym9hcmRFdmVudCAmJiBlLnJlcGVhdCkgcmV0dXJuOyAvLyBza2lwIHdoZW4gcmVwZWF0ZWRcbiAgICAgICAgaWYgKG1lcmdlZC5wcmV2ZW50RGVmYXVsdCkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoYFtob3RrZXlzXSBTaG9ydGN1dCB7JHtvcHRpb25zLmtleXN9fSBkZXRlY3RlZC4uLmApO1xuICAgICAgICBvYnNlcnZlci5uZXh0KGUpO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZGlzcG9zZSA9IHRoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIobWVyZ2VkLmVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyKTtcblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLl9ob3RrZXlzLmRlbGV0ZShpZCk7XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlSGVscE1vZGFsKCkge1xuICAgIGlmICh0aGlzLmlzSGVscE1vZGFsT3BlbmVkKSB7XG4gICAgICB0aGlzLmNsb3NlSGVscE1vZGFsKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3BlbkhlbHBNb2RhbCgpO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5IZWxwTW9kYWwoKSB7XG4gICAgaWYgKHRoaXMuaXNIZWxwTW9kYWxPcGVuZWQpIHJldHVybjsgLy8gU2tpcCBpZiBhbHJlYWR5IG9wZW5lZFxuXG4gICAgLy8gR2V0IGtleXMgd2l0aCBhIG5vdCBibGFuayBkZXNjcmlwdGlvblxuICAgIGNvbnN0IGhvdGtleXMgPSBBcnJheS5mcm9tKHRoaXMuX2hvdGtleXMudmFsdWVzKCkpLnJlZHVjZSgobWFwLCBpdGVtOiBPcHRpb25zKSA9PiB7XG4gICAgICBpZiAoaXNOb3ROaWxPckJsYW5rKGl0ZW0/LmRlc2NyaXB0aW9uKSkge1xuICAgICAgICBtYXAuc2V0KGl0ZW0ua2V5cywgaXRlbS5kZXNjcmlwdGlvbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWFwO1xuICAgIH0sIG5ldyBNYXAoKSk7XG5cbiAgICBpZiAoaG90a2V5cy5zaXplID09PSAwKSByZXR1cm47IC8vIE5vdGhpbmcgdG8gZGlzcGxheVxuXG4gICAgdGhpcy5fZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihIb3RrZXlzRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgIGRhdGE6IGhvdGtleXMsXG4gICAgfSk7XG4gICAgdGhpcy5fZGlhbG9nUmVmXG4gICAgICAuYWZ0ZXJDbG9zZWQoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpcnN0KCksXG4gICAgICAgIC8vIEF2b2lkIHRvbyBtYW55IGNhbGwgKGUuZy4gaW4gU2FmYXJpKVxuICAgICAgICBkZWxheSgyNTApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gRm9yZ2V0IHRoZSBkaWFsb2cgcmVmXG4gICAgICAgIHRoaXMuX2RpYWxvZ1JlZiA9IG51bGw7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1tob3RrZXlzXSBDbG9zaW5nIGhlbHAgbW9kYWwnKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgY2xvc2VIZWxwTW9kYWwoKSB7XG4gICAgdGhpcy5fZGlhbG9nUmVmPy5jbG9zZSh0cnVlKTtcbiAgfVxufVxuIl19