@mediusinc/mng-commons 5.5.0-rc.0 → 5.5.0-rc.2

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 (170) hide show
  1. package/core/descriptors/table.descriptor.d.ts +4 -2
  2. package/core/directives/rerender.directive.d.ts +9 -0
  3. package/core/helpers/route.d.ts +25 -25
  4. package/core/index.d.ts +2 -0
  5. package/core/reactivity/effect.d.ts +16 -0
  6. package/esm2022/core/components/notification/notification-wrapper.component.mjs +4 -4
  7. package/esm2022/core/components/pages/error/error.page.component.mjs +4 -4
  8. package/esm2022/core/components/pages/not-found/not-found.page.component.mjs +4 -4
  9. package/esm2022/core/data-list/data-list-params-helpers.mjs +18 -3
  10. package/esm2022/core/descriptors/table.descriptor.mjs +1 -1
  11. package/esm2022/core/directives/component.directive.mjs +4 -4
  12. package/esm2022/core/directives/rerender.directive.mjs +25 -0
  13. package/esm2022/core/directives/template.directive.mjs +4 -4
  14. package/esm2022/core/index.mjs +4 -1
  15. package/esm2022/core/pipes/boolean.pipe.mjs +6 -6
  16. package/esm2022/core/pipes/class-map.pipe.mjs +4 -4
  17. package/esm2022/core/pipes/enum.pipe.mjs +4 -4
  18. package/esm2022/core/pipes/enumerate-async.pipe.mjs +4 -4
  19. package/esm2022/core/pipes/enumerate.pipe.mjs +4 -4
  20. package/esm2022/core/pipes/getter.pipe.mjs +5 -5
  21. package/esm2022/core/pipes/i18n-property.pipe.mjs +4 -4
  22. package/esm2022/core/pipes/json-path.pipe.mjs +4 -4
  23. package/esm2022/core/pipes/parametrize.pipe.mjs +4 -4
  24. package/esm2022/core/pipes/template.pipe.mjs +4 -4
  25. package/esm2022/core/reactivity/effect.mjs +22 -0
  26. package/esm2022/core/security/permission.service.mjs +4 -4
  27. package/esm2022/core/services/commons-init.service.mjs +4 -4
  28. package/esm2022/core/services/commons-router.service.mjs +4 -4
  29. package/esm2022/core/services/commons-storage.service.mjs +4 -4
  30. package/esm2022/core/services/commons.service.mjs +8 -8
  31. package/esm2022/filter/descriptors/filter-lookup.descriptor.mjs +32 -25
  32. package/esm2022/filter/descriptors/filter.descriptor.mjs +53 -1
  33. package/esm2022/form/components/autocomplete/autocomplete.component.mjs +4 -4
  34. package/esm2022/form/components/date-range/date-range.component.mjs +4 -4
  35. package/esm2022/form/components/dropdown/dropdown.component.mjs +4 -4
  36. package/esm2022/form/components/number-range/number-range.component.mjs +4 -4
  37. package/esm2022/form/directives/input-trim.directive.mjs +4 -4
  38. package/esm2022/table/api/descriptors/sort.descriptor.mjs +2 -2
  39. package/esm2022/table/api/descriptors/table.descriptor.mjs +32 -8
  40. package/esm2022/table/components/column-filter/column-filter.component.mjs +33 -40
  41. package/esm2022/table/components/column-value/column-value.component.mjs +6 -6
  42. package/esm2022/table/components/filter/filter-active-tag/filter-active-tag.component.mjs +7 -7
  43. package/esm2022/table/components/filter/filter-form/filter-form.component.mjs +24 -34
  44. package/esm2022/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.mjs +44 -45
  45. package/esm2022/table/components/table/table.component.mjs +114 -430
  46. package/esm2022/table/helpers/filters.mjs +9 -25
  47. package/esm2022/table/helpers/table.mjs +24 -0
  48. package/esm2022/table/index.mjs +2 -2
  49. package/esm2022/table/models/column-preferences.model.mjs +1 -1
  50. package/esm2022/table/models/filter.model.mjs +1 -1
  51. package/esm2022/table/pipes/filter-value.pipe.mjs +4 -4
  52. package/esm2022/table/pipes/locale-default-row-class.pipe.mjs +4 -4
  53. package/esm2022/table/pipes/table-column-filter-class.pipe.mjs +4 -4
  54. package/esm2022/table/services/table-data.service.mjs +194 -0
  55. package/esm2022/table/services/table-metadata.service.mjs +136 -0
  56. package/esm2022/table/services/table-preferences.service.mjs +142 -0
  57. package/esm2022/tableview/action/components/action/action.component.mjs +6 -7
  58. package/esm2022/tableview/action/components/editor/action-editor.component.mjs +4 -4
  59. package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +69 -46
  60. package/esm2022/tableview/action/components/localization/data-language-dropdown.component.mjs +4 -4
  61. package/esm2022/tableview/action/components/route/action-route.component.mjs +5 -6
  62. package/esm2022/tableview/action/components/table/action-table.component.mjs +4 -4
  63. package/esm2022/tableview/action/helpers/action-execution.mjs +25 -0
  64. package/esm2022/tableview/action/models/execution/action-instance.model.mjs +2 -3
  65. package/esm2022/tableview/action/services/action-executor.service.mjs +12 -79
  66. package/esm2022/tableview/action/services/component-action-executor.service.mjs +4 -4
  67. package/esm2022/tableview/action/services/data-provider-executor.service.mjs +4 -4
  68. package/esm2022/tableview/action/services/navigation.service.mjs +4 -4
  69. package/esm2022/tableview/action/services/root-action-executor.service.mjs +4 -4
  70. package/esm2022/tableview/action/services/view-container.service.mjs +4 -4
  71. package/esm2022/tableview/api/action/descriptors/action-confirmation.descriptor.mjs +13 -1
  72. package/esm2022/tableview/api/action/descriptors/action-editor.descriptor.mjs +67 -10
  73. package/esm2022/tableview/api/action/descriptors/action-link-descriptor.factory.mjs +2 -2
  74. package/esm2022/tableview/api/action/descriptors/action-link.descriptor.mjs +17 -1
  75. package/esm2022/tableview/api/action/descriptors/action.descriptor.mjs +32 -7
  76. package/esm2022/tableview/api/action/models/execution/action-instance-state.model.mjs +2 -2
  77. package/esm2022/tableview/api/editor/descriptors/field-base.descriptor.mjs +20 -1
  78. package/esm2022/tableview/api/editor/descriptors/field-many.descriptor.mjs +2 -1
  79. package/esm2022/tableview/api/editor/models/formly-custom-field.model.mjs +4 -4
  80. package/esm2022/tableview/api/tableview/descriptors/tableview.descriptor.mjs +13 -5
  81. package/esm2022/tableview/api/tableview/helpers/tableview-default-actions.mjs +3 -2
  82. package/esm2022/tableview/api/tableview/helpers/tableview-descriptor-helpers.mjs +2 -2
  83. package/esm2022/tableview/editor/components/editor/auto-save-status/auto-save-status.component.mjs +4 -4
  84. package/esm2022/tableview/editor/components/editor/form-editor.component.mjs +31 -38
  85. package/esm2022/tableview/editor/components/formly/constants.mjs +2 -0
  86. package/esm2022/tableview/editor/components/formly/fields/formly-field-action/formly-field-action.component.mjs +4 -4
  87. package/esm2022/tableview/editor/components/formly/fields/formly-field-autocomplete/formly-field-autocomplete.component.mjs +7 -5
  88. package/esm2022/tableview/editor/components/formly/fields/formly-field-custom/formly-field-custom.component.mjs +4 -4
  89. package/esm2022/tableview/editor/components/formly/fields/formly-field-datepicker/formly-field-datepicker.component.mjs +7 -5
  90. package/esm2022/tableview/editor/components/formly/fields/formly-field-dropdown/formly-field-dropdown.component.mjs +7 -5
  91. package/esm2022/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.mjs +4 -4
  92. package/esm2022/tableview/editor/components/formly/fields/formly-field-input/formly-field-input.component.mjs +5 -5
  93. package/esm2022/tableview/editor/components/formly/fields/formly-field-label/formly-field-label.component.mjs +4 -4
  94. package/esm2022/tableview/editor/components/formly/fields/formly-field-lookup-dialog/formly-field-lookup-dialog.component.mjs +5 -6
  95. package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.mjs +10 -6
  96. package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +11 -7
  97. package/esm2022/tableview/editor/components/formly/fields/formly-field-tabs/formly-field-tabs.component.mjs +4 -4
  98. package/esm2022/tableview/editor/components/formly/fields/formly-field-type.abstract.component.mjs +6 -5
  99. package/esm2022/tableview/editor/components/formly/pipes/formly-field-label.pipe.mjs +4 -4
  100. package/esm2022/tableview/editor/components/formly/wrappers/formly-field-no-label-wrapper/formly-field-no-label-wrapper.component.mjs +4 -4
  101. package/esm2022/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.mjs +10 -5
  102. package/esm2022/tableview/editor/helpers/editor-autosave.mjs +2 -2
  103. package/esm2022/tableview/editor/services/form-editor.service.mjs +4 -4
  104. package/esm2022/tableview/index.mjs +1 -2
  105. package/esm2022/tableview/tableview/components/route/tableview-route.component.mjs +4 -4
  106. package/esm2022/tableview/tableview/components/tableview/tableview.component.mjs +4 -4
  107. package/fesm2022/mediusinc-mng-commons-core.mjs +130 -71
  108. package/fesm2022/mediusinc-mng-commons-core.mjs.map +1 -1
  109. package/fesm2022/mediusinc-mng-commons-filter.mjs +83 -24
  110. package/fesm2022/mediusinc-mng-commons-filter.mjs.map +1 -1
  111. package/fesm2022/mediusinc-mng-commons-form-api.mjs.map +1 -1
  112. package/fesm2022/mediusinc-mng-commons-form.mjs +15 -15
  113. package/fesm2022/mediusinc-mng-commons-form.mjs.map +1 -1
  114. package/fesm2022/mediusinc-mng-commons-model.mjs.map +1 -1
  115. package/fesm2022/mediusinc-mng-commons-table-api.mjs +32 -8
  116. package/fesm2022/mediusinc-mng-commons-table-api.mjs.map +1 -1
  117. package/fesm2022/mediusinc-mng-commons-table.mjs +700 -603
  118. package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
  119. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +165 -26
  120. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
  121. package/fesm2022/mediusinc-mng-commons-tableview.mjs +265 -317
  122. package/fesm2022/mediusinc-mng-commons-tableview.mjs.map +1 -1
  123. package/fesm2022/mediusinc-mng-commons.mjs.map +1 -1
  124. package/filter/descriptors/filter-lookup.descriptor.d.ts +17 -20
  125. package/filter/descriptors/filter.descriptor.d.ts +32 -2
  126. package/form/components/date-range/date-range.component.d.ts +3 -3
  127. package/form/components/number-range/number-range.component.d.ts +2 -2
  128. package/package.json +4 -4
  129. package/table/api/descriptors/column.descriptor.d.ts +1 -1
  130. package/table/api/descriptors/sort.descriptor.d.ts +2 -2
  131. package/table/api/descriptors/table.descriptor.d.ts +21 -7
  132. package/table/components/column-filter/column-filter.component.d.ts +8 -14
  133. package/table/components/filter/filter-active-tag/filter-active-tag.component.d.ts +5 -5
  134. package/table/components/filter/filter-form/filter-form.component.d.ts +10 -19
  135. package/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.d.ts +11 -13
  136. package/table/components/table/table.component.d.ts +20 -64
  137. package/table/helpers/filters.d.ts +4 -7
  138. package/table/helpers/table.d.ts +6 -0
  139. package/table/index.d.ts +1 -1
  140. package/table/models/column-preferences.model.d.ts +2 -2
  141. package/table/models/filter.model.d.ts +14 -2
  142. package/table/services/table-data.service.d.ts +36 -0
  143. package/table/services/table-metadata.service.d.ts +31 -0
  144. package/table/services/table-preferences.service.d.ts +25 -0
  145. package/tableview/action/components/editor/injector-context/action-editor-injector-context.component.d.ts +4 -7
  146. package/tableview/action/components/localization/data-language-dropdown.component.d.ts +1 -1
  147. package/tableview/action/helpers/action-execution.d.ts +7 -0
  148. package/tableview/action/models/execution/action-instance.model.d.ts +1 -2
  149. package/tableview/action/services/action-executor.service.d.ts +1 -2
  150. package/tableview/api/action/descriptors/action-confirmation.descriptor.d.ts +1 -0
  151. package/tableview/api/action/descriptors/action-editor.descriptor.d.ts +12 -4
  152. package/tableview/api/action/descriptors/action-link.descriptor.d.ts +1 -0
  153. package/tableview/api/action/descriptors/action.descriptor.d.ts +5 -3
  154. package/tableview/api/action/models/execution/action-instance-state.model.d.ts +1 -1
  155. package/tableview/api/editor/descriptors/field-base.descriptor.d.ts +15 -10
  156. package/tableview/api/editor/descriptors/field-group.descriptor.d.ts +1 -1
  157. package/tableview/api/tableview/descriptors/tableview.descriptor.d.ts +6 -4
  158. package/tableview/editor/components/editor/form-editor.component.d.ts +3 -2
  159. package/tableview/editor/components/formly/constants.d.ts +1 -0
  160. package/tableview/editor/components/formly/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +1 -1
  161. package/tableview/editor/components/formly/fields/formly-field-table-dialog-form/formly-field-table-dialog-form.component.d.ts +1 -0
  162. package/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.d.ts +1 -0
  163. package/tableview/editor/components/formly/fields/formly-field-type.abstract.component.d.ts +2 -1
  164. package/tableview/editor/components/formly/wrappers/formly-field-wrapper/formly-field-wrapper.component.d.ts +1 -0
  165. package/tableview/index.d.ts +0 -1
  166. package/version-info.json +5 -5
  167. package/esm2022/table/services/data-list.service.mjs +0 -29
  168. package/esm2022/tableview/action/models/execution/action-instance-state.model.mjs +0 -32
  169. package/table/services/data-list.service.d.ts +0 -19
  170. package/tableview/action/models/execution/action-instance-state.model.d.ts +0 -30
@@ -3,7 +3,6 @@ import { ChangeDetectionStrategy, Component, ElementRef, booleanAttribute, compu
3
3
  import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
4
4
  import { FormsModule } from '@angular/forms';
5
5
  import { TranslateModule, TranslateService } from '@ngx-translate/core';
6
- import { PrimeNGConfig } from 'primeng/api';
7
6
  import { CalendarModule } from 'primeng/calendar';
8
7
  import { CheckboxModule } from 'primeng/checkbox';
9
8
  import { DropdownModule } from 'primeng/dropdown';
@@ -12,11 +11,11 @@ import { InputTextModule } from 'primeng/inputtext';
12
11
  import { MessagesModule } from 'primeng/messages';
13
12
  import { ToggleButtonModule } from 'primeng/togglebutton';
14
13
  import { NEVER, switchMap } from 'rxjs';
15
- import { COMMONS_MODULE_CONFIG_IT, FilterMatchMode, getI18nTypePropertyKey } from '@mediusinc/mng-commons/core';
14
+ import { FilterMatchMode, getI18nTypePropertyKey } from '@mediusinc/mng-commons/core';
16
15
  import { FilterLookupTypeEnum, FilterTypeEnum } from '@mediusinc/mng-commons/filter';
17
16
  import { AutocompleteComponent, DateRangeComponent, DropdownComponent, InputTrimDirective, NumberRangeComponent } from '@mediusinc/mng-commons/form';
18
17
  import { lookupDataProviderWithService } from '@mediusinc/mng-commons/form/api';
19
- import { filterAdjustDisplayValueOnMatchModeChange, filterApplySerializationConfigToCmp, filterGetDateConfig, filterGetDefaultMatchMode, filterGetNumberConfig, generateMatchModeOptions } from '../../../helpers/filters';
18
+ import { filterAdjustDisplayValueOnMatchModeChange, filterGetDefaultMatchMode } from '../../../helpers/filters';
20
19
  import * as i0 from "@angular/core";
21
20
  import * as i1 from "@angular/forms";
22
21
  import * as i2 from "@ngx-translate/core";
@@ -27,18 +26,16 @@ import * as i6 from "primeng/checkbox";
27
26
  import * as i7 from "primeng/messages";
28
27
  import * as i8 from "primeng/inputtext";
29
28
  import * as i9 from "primeng/togglebutton";
30
- export class FilterFormComponent {
29
+ export class TableFilterFormComponent {
31
30
  constructor() {
32
31
  this.lookupTypeDropdown = FilterLookupTypeEnum.Dropdown;
33
32
  this.lookupTypeAutocomplete = FilterLookupTypeEnum.Autocomplete;
34
33
  this.FilterTypeEnum = FilterTypeEnum;
35
34
  this.FilterMatchMode = FilterMatchMode;
36
35
  this.elementRef = inject(ElementRef);
37
- this.moduleConfig = inject(COMMONS_MODULE_CONFIG_IT, { optional: true });
38
- this.primeConfig = inject(PrimeNGConfig);
39
36
  this.translate = inject(TranslateService);
40
37
  this.title = input();
41
- this.descriptors = input.required();
38
+ this.metadata = input.required();
42
39
  this.genericDescriptor = input();
43
40
  this.model = input.required();
44
41
  this.filter = input();
@@ -50,17 +47,17 @@ export class FilterFormComponent {
50
47
  this.propertyOptionsWithTranslations = computed(() => {
51
48
  const disabledProperties = this.disabledProperties();
52
49
  const filter = this.filter();
53
- return (this.descriptors()?.map(d => {
50
+ return (this.metadata()?.map(d => {
54
51
  return {
55
- property: d.property,
56
- label: d.isGenericFilter ? d.property : this.getPropertyLabelKey(d),
57
- disabled: !filter && disabledProperties.includes(d.property)
52
+ property: d.descriptor.property,
53
+ label: d.descriptor.isGenericFilter ? d.descriptor.property : this.getPropertyLabelKey(d.descriptor),
54
+ disabled: !filter && disabledProperties.includes(d.descriptor.property)
58
55
  };
59
56
  }) ?? []);
60
57
  });
61
- this.selectedDescriptor = computed(() => {
58
+ this.selectedFilterMetadata = computed(() => {
62
59
  const property = this.propertyModel();
63
- return this.descriptors().find(filterDescriptor => filterDescriptor.property === property);
60
+ return this.metadata().find(d => d.descriptor.property === property);
64
61
  });
65
62
  // change value lookup function to include the property name of the generic filter
66
63
  this.genericValueDataProvider = computed(() => {
@@ -73,8 +70,8 @@ export class FilterFormComponent {
73
70
  filters: {
74
71
  ...params?.filters,
75
72
  field: {
76
- value: this.selectedDescriptor()?.property,
77
- matchMode: this.selectedDescriptor()?.filterType === FilterTypeEnum.LookupEnum ? FilterMatchMode.In : FilterMatchMode.StartsWith
73
+ value: this.selectedFilterMetadata()?.descriptor.property,
74
+ matchMode: this.selectedFilterMetadata()?.descriptor.filterType === FilterTypeEnum.LookupEnum ? FilterMatchMode.In : FilterMatchMode.StartsWith
78
75
  }
79
76
  }
80
77
  };
@@ -84,22 +81,16 @@ export class FilterFormComponent {
84
81
  return;
85
82
  });
86
83
  this.selectedDescriptorAsLookup = computed(() => {
87
- const filterDescriptor = this.selectedDescriptor();
84
+ const filterDescriptor = this.selectedFilterMetadata()?.descriptor;
88
85
  return filterDescriptor !== undefined &&
89
86
  !filterDescriptor.isGenericFilter &&
90
87
  (filterDescriptor.filterType === FilterTypeEnum.Lookup || filterDescriptor.filterType === FilterTypeEnum.LookupEnum)
91
88
  ? filterDescriptor
92
89
  : undefined;
93
90
  });
94
- this.matchModeOptions = computed(() => {
95
- return generateMatchModeOptions(this.primeConfig, this.selectedDescriptor(), this.serializationCfg);
96
- });
97
91
  this.isEdit = computed(() => this.filter() != null);
98
92
  this.formSubmitted = signal(false);
99
93
  this.formErrorMessage = signal([]);
100
- // display configs
101
- this.dateConfig = computed(() => filterGetDateConfig(this.selectedDescriptor(), this.serializationCfg));
102
- this.numberConfig = computed(() => filterGetNumberConfig(this.selectedDescriptor()));
103
94
  // UI utilities
104
95
  this.filterForm = viewChild.required('filterForm');
105
96
  // Filter form model and form utilities
@@ -107,13 +98,12 @@ export class FilterFormComponent {
107
98
  this.matchModeModel = signal(null);
108
99
  this.valueModel = signal(null);
109
100
  this.caseSensitiveModel = signal(false);
110
- this.serializationCfg = {};
111
- filterApplySerializationConfigToCmp(this.moduleConfig, this.serializationCfg);
101
+ this.isMultiselect = computed(() => this.matchModeModel() === FilterMatchMode.In || this.matchModeModel() === FilterMatchMode.NotIn);
112
102
  effect(() => {
113
103
  const edit = this.filter();
114
104
  if (edit) {
115
105
  this.resetForm({
116
- property: edit.descriptor.property,
106
+ property: edit.metadata.descriptor.property,
117
107
  matchMode: edit.displayMatchMode ?? edit.matchMode ?? null,
118
108
  value: edit.displayValue ?? edit.value,
119
109
  caseSensitive: edit.caseSensitive ?? false
@@ -124,7 +114,7 @@ export class FilterFormComponent {
124
114
  }
125
115
  }, { allowSignalWrites: true });
126
116
  effect(() => {
127
- const descriptor = this.selectedDescriptor();
117
+ const descriptor = this.selectedFilterMetadata()?.descriptor;
128
118
  const value = untracked(() => this.valueModel());
129
119
  if (value != null) {
130
120
  // reset value if filter type and value type mismatch
@@ -142,12 +132,12 @@ export class FilterFormComponent {
142
132
  }
143
133
  }, { allowSignalWrites: true });
144
134
  effect(() => {
145
- const matchModeOptions = this.matchModeOptions();
135
+ const matchModeOptions = this.selectedFilterMetadata()?.matchModes ?? [];
146
136
  const matchMode = untracked(() => this.matchModeModel());
147
137
  const filterForm = untracked(() => this.filterForm());
148
138
  if (matchModeOptions.length > 0 &&
149
139
  (!matchMode || filterForm.controls['matchMode']?.pristine || filterForm.controls['matchMode']?.untouched || !matchModeOptions.find(o => o.value === matchMode))) {
150
- this.matchModeModel.set(filterGetDefaultMatchMode(this.selectedDescriptor(), matchModeOptions));
140
+ this.matchModeModel.set(filterGetDefaultMatchMode(this.selectedFilterMetadata()?.descriptor, matchModeOptions));
151
141
  }
152
142
  }, { allowSignalWrites: true });
153
143
  effect(() => {
@@ -207,12 +197,12 @@ export class FilterFormComponent {
207
197
  }
208
198
  return labelKey;
209
199
  }
210
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: FilterFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
211
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.5", type: FilterFormComponent, isStandalone: true, selector: "mng-filter-form", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, descriptors: { classPropertyName: "descriptors", publicName: "descriptors", isSignal: true, isRequired: true, transformFunction: null }, genericDescriptor: { classPropertyName: "genericDescriptor", publicName: "genericDescriptor", isSignal: true, isRequired: false, transformFunction: null }, model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, overlay: { classPropertyName: "overlay", publicName: "overlay", isSignal: true, isRequired: false, transformFunction: null }, disabledProperties: { classPropertyName: "disabledProperties", publicName: "disabledProperties", isSignal: true, isRequired: false, transformFunction: null }, enableCaseSensitive: { classPropertyName: "enableCaseSensitive", publicName: "enableCaseSensitive", isSignal: true, isRequired: false, transformFunction: null }, propertySearch: { classPropertyName: "propertySearch", publicName: "propertySearch", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { apply: "apply" }, host: { classAttribute: "flex flex-grow-1" }, viewQueries: [{ propertyName: "filterForm", first: true, predicate: ["filterForm"], descendants: true, isSignal: true }], ngImport: i0, template: "<div>\n <div>\n <h5>{{ filter() ? ('mngFilter.titleEdit' | translate) : ('mngFilter.titleAdd' | translate) }}</h5>\n </div>\n <form #filterForm=\"ngForm\" (ngSubmit)=\"onFormSubmit(filterForm)\" class=\"flex flex-column align-items-center lg:flex-row gap-3\">\n <div class=\"w-full lg:w-auto\">\n <mng-dropdown\n name=\"property\"\n id=\"property\"\n tabindex=\"1\"\n #propertyControl=\"ngModel\"\n [(ngModel)]=\"propertyModel\"\n [options]=\"propertyOptionsWithTranslations()\"\n optionsValueProperty=\"property\"\n optionsDisabledProperty=\"disabled\"\n optionsLabelProperty=\"label\"\n [placeholder]=\"'mngFilter.property' | translate\"\n [optionsLabelTranslate]=\"!propertySearch()\"\n [inlineSearch]=\"propertySearch()\"\n required=\"true\"\n className=\"w-full\"\n [disabled]=\"isEdit()\"\n [appendTo]=\"null\" />\n </div>\n <div class=\"w-full lg:w-auto\">\n <mng-dropdown\n name=\"matchMode\"\n id=\"matchMode\"\n [(ngModel)]=\"matchModeModel\"\n className=\"w-full\"\n [options]=\"matchModeOptions()\"\n [placeholder]=\"'mngFilter.matchMode' | translate\"\n [disabled]=\"!propertyControl.value\"\n class=\"align-self-end\"\n required=\"true\"\n [appendTo]=\"null\" />\n </div>\n @if (!(matchModeModel() === FilterMatchMode.Exists || matchModeModel() === FilterMatchMode.DoesNotExist)) {\n <div class=\"w-full lg:w-auto flex flex-column\">\n @switch (selectedDescriptor()?.filterType) {\n @case (FilterTypeEnum.Number) {\n @if (matchModeModel() === FilterMatchMode.Between) {\n <mng-number-range\n className=\"mng-column-filter-number-input\"\n name=\"value\"\n [(ngModel)]=\"valueModel\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [useGrouping]=\"selectedDescriptor()?.numberUseGrouping ?? false\"\n [minFractionDigits]=\"numberConfig()?.fractionsMin\"\n [maxFractionDigits]=\"numberConfig()?.fractionsMax\"\n required=\"true\" />\n } @else {\n <p-inputNumber\n inputStyleClass=\"mng-column-filter-number-input\"\n name=\"value\"\n [(ngModel)]=\"valueModel\"\n [styleClass]=\"'w-full'\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [useGrouping]=\"selectedDescriptor()?.numberUseGrouping\"\n [minFractionDigits]=\"numberConfig()?.fractionsMin\"\n [maxFractionDigits]=\"numberConfig()?.fractionsMax\"\n [disabled]=\"!matchModeModel()\"\n required=\"true\" />\n }\n }\n\n @case (FilterTypeEnum.Boolean) {\n <p-checkbox [(ngModel)]=\"valueModel\" [disabled]=\"!matchModeModel()\" name=\"value\" binary=\"true\" required=\"true\" />\n }\n @case (FilterTypeEnum.Date) {\n @if (matchModeModel() === FilterMatchMode.Between) {\n <mng-date-range\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [showTime]=\"dateConfig()?.showTime ?? false\"\n [showSeconds]=\"dateConfig()?.showSeconds ?? false\"\n [dateFormat]=\"dateConfig()?.format\"\n [placeholder]=\"'mngFilter.value' | translate\"\n required=\"true\"></mng-date-range>\n } @else {\n <p-calendar\n appendTo=\"body\"\n name=\"value\"\n [(ngModel)]=\"valueModel\"\n [styleClass]=\"'w-full'\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [showIcon]=\"true\"\n [showTime]=\"dateConfig()?.showTime ?? false\"\n [showSeconds]=\"dateConfig()?.showSeconds ?? false\"\n [dateFormat]=\"dateConfig()?.format\"\n [firstDayOfWeek]=\"1\"\n [disabled]=\"!matchModeModel()\"\n required=\"true\">\n </p-calendar>\n }\n }\n @case (FilterTypeEnum.Lookup) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\"></ng-container>\n }\n @case (FilterTypeEnum.LookupEnum) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\"></ng-container>\n }\n @default {\n @if (selectedDescriptor()?.genericValueProvider && genericValueDataProvider()) {\n <!-- conditional rendering on the placeholder is there because of styling issues with PrimeNG -->\n <!-- (PrimeNG applies the .p-placeholder class to programmatically set values, making them greyed out) -->\n <span class=\"flex align-items-center\">\n <mng-dropdown\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"genericValueDataProvider()\"\n [className]=\"selectedDescriptor()?.className\"\n [dropdownClassName]=\"selectedDescriptor()?.dropdownClassName\"\n [placeholder]=\"valueModel() ? undefined : ('mngFilter.value' | translate)\"\n allowInput=\"true\"\n [disabled]=\"!matchModeModel()\"\n [appendTo]=\"null\"\n required=\"true\"></mng-dropdown>\n @if (enableCaseSensitive()) {\n <p-toggleButton [(ngModel)]=\"caseSensitiveModel\" name=\"caseSensitive\" styleClass=\"ml-2 p-1 p-button\" onLabel=\"Aa\" offLabel=\"Aa\" />\n }\n </span>\n } @else {\n <span class=\"p-input-icon-right\">\n <input\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n type=\"text\"\n pInputText\n class=\"mng-column-filter-string-input w-full\"\n [attr.placeholder]=\"'mngFilter.value' | translate\"\n [mngInputTrim]=\"selectedDescriptor()?.trimOption!\"\n [disabled]=\"!matchModeModel()\"\n [placeholder]=\"'mngFilter.value' | translate\"\n required=\"true\" />\n @if (enableCaseSensitive()) {\n <span class=\"toggle-button-input\">\n <p-toggleButton [(ngModel)]=\"caseSensitiveModel\" name=\"caseSensitive\" styleClass=\"ml-1 p-1 p-button-sm\" onLabel=\"Aa\" offLabel=\"Aa\" />\n </span>\n }\n </span>\n }\n }\n }\n <ng-template #lookupFilter>\n @if (selectedDescriptorAsLookup(); as lookupFilterDescriptor) {\n @switch (lookupFilterDescriptor.lookupType) {\n @case (lookupTypeAutocomplete) {\n <mng-autocomplete\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"lookupFilterDescriptor.dataProvider\"\n [optionsTrackProperty]=\"lookupFilterDescriptor.optionsValueProperty\"\n [optionsValueProperty]=\"lookupFilterDescriptor.optionsValueProperty\"\n [optionsLabelProperty]=\"lookupFilterDescriptor.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookupFilterDescriptor.optionsLabelTranslate\"\n [multiselect]=\"lookupFilterDescriptor.multiselect\"\n [autoClear]=\"lookupFilterDescriptor.autocompleteAutoClear ?? false\"\n [openOnFocus]=\"lookupFilterDescriptor.autocompleteAutoClear ?? true\"\n [inlineSearch]=\"lookupFilterDescriptor.autocompleteInlineSearch ?? false\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [className]=\"lookupFilterDescriptor.className\"\n [dropdownClassName]=\"lookupFilterDescriptor.dropdownClassName\"\n [searchTrim]=\"selectedDescriptor()?.trimOption!\"\n [disabled]=\"!matchModeModel()\"\n required=\"true\">\n </mng-autocomplete>\n }\n @case (lookupTypeDropdown) {\n <mng-dropdown\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"lookupFilterDescriptor.dataProvider\"\n [optionsValueProperty]=\"lookupFilterDescriptor.optionsValueProperty\"\n [optionsLabelProperty]=\"lookupFilterDescriptor.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookupFilterDescriptor.optionsLabelTranslate\"\n [multiselect]=\"lookupFilterDescriptor.multiselect\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [className]=\"lookupFilterDescriptor.className + ' w-full'\"\n [dropdownClassName]=\"lookupFilterDescriptor.dropdownClassName\"\n showClear=\"false\"\n [disabled]=\"!matchModeModel()\"\n [appendTo]=\"null\"\n required=\"true\">\n </mng-dropdown>\n }\n }\n } @else if (selectedDescriptor()?.isGenericFilter && genericValueDataProvider()) {\n <mng-dropdown\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"genericValueDataProvider()\"\n [placeholder]=\"'mngFilter.value' | translate\"\n showClear=\"false\"\n [disabled]=\"!matchModeModel()\"\n [appendTo]=\"null\"\n required=\"true\">\n </mng-dropdown>\n }\n </ng-template>\n </div>\n }\n <div class=\"flex justify-content-end\">\n <button pButton type=\"submit\" class=\"align-self-end\">\n {{ (filter() ? 'general.apply' : 'general.add') | translate }}\n </button>\n </div>\n </form>\n @if (formSubmitted() && filterForm.invalid) {\n <p-messages [value]=\"formErrorMessage()\" class=\"w-full\"></p-messages>\n }\n</div>\n", styles: [".toggle-button-input{position:absolute;right:.25rem;top:50%;transform:translateY(-50%)}\n"], dependencies: [{ kind: "component", type: DropdownComponent, selector: "mng-dropdown", inputs: ["dataProvider", "options", "optionsTrackProperty", "optionsLabelProperty", "optionsLabelTranslate", "optionsValueProperty", "optionsDisabledProperty", "multiselect", "placeholder", "showClear", "selectFirstItem", "className", "dropdownClassName", "changeValueOnBlur", "loading", "disabled", "allowInput", "appendTo", "inlineSearch", "searchTrim"], outputs: ["valueChange", "blur"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "directive", type: InputTrimDirective, selector: "[mngInputTrim]", inputs: ["mngInputTrim"] }, { kind: "component", type: NumberRangeComponent, selector: "mng-number-range", inputs: ["placeholder", "useGrouping", "minFractionDigits", "maxFractionDigits", "required", "disabled"], outputs: ["keyDown"] }, { kind: "ngmodule", type: InputNumberModule }, { kind: "component", type: i3.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: DateRangeComponent, selector: "mng-date-range", inputs: ["placeholder", "showTime", "showSeconds", "dateFormat", "className", "required", "disabled"] }, { kind: "ngmodule", type: CalendarModule }, { kind: "component", type: i4.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: AutocompleteComponent, selector: "mng-autocomplete", inputs: ["dataProvider", "optionsTrackProperty", "optionsValueProperty", "optionsLabelProperty", "optionsLabelTranslate", "inlineSearch", "openOnFocus", "multiselect", "placeholder", "className", "dropdownClassName", "showClear", "autoClear", "selectFirst", "searchTrim", "disabled"], outputs: ["valueChange", "blur"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i6.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "ngmodule", type: MessagesModule }, { kind: "component", type: i7.Messages, selector: "p-messages", inputs: ["value", "closable", "style", "styleClass", "enableService", "key", "escape", "severity", "showTransitionOptions", "hideTransitionOptions"], outputs: ["valueChange", "onClose"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i8.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "ngmodule", type: ToggleButtonModule }, { kind: "component", type: i9.ToggleButton, selector: "p-toggleButton", inputs: ["onLabel", "offLabel", "onIcon", "offIcon", "ariaLabel", "ariaLabelledBy", "disabled", "style", "styleClass", "inputId", "tabindex", "iconPos", "autofocus"], outputs: ["onChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
200
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TableFilterFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
201
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: TableFilterFormComponent, isStandalone: true, selector: "mng-table-filter-form", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, metadata: { classPropertyName: "metadata", publicName: "metadata", isSignal: true, isRequired: true, transformFunction: null }, genericDescriptor: { classPropertyName: "genericDescriptor", publicName: "genericDescriptor", isSignal: true, isRequired: false, transformFunction: null }, model: { classPropertyName: "model", publicName: "model", isSignal: true, isRequired: true, transformFunction: null }, filter: { classPropertyName: "filter", publicName: "filter", isSignal: true, isRequired: false, transformFunction: null }, overlay: { classPropertyName: "overlay", publicName: "overlay", isSignal: true, isRequired: false, transformFunction: null }, disabledProperties: { classPropertyName: "disabledProperties", publicName: "disabledProperties", isSignal: true, isRequired: false, transformFunction: null }, enableCaseSensitive: { classPropertyName: "enableCaseSensitive", publicName: "enableCaseSensitive", isSignal: true, isRequired: false, transformFunction: null }, propertySearch: { classPropertyName: "propertySearch", publicName: "propertySearch", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { apply: "apply" }, host: { classAttribute: "flex flex-grow-1" }, viewQueries: [{ propertyName: "filterForm", first: true, predicate: ["filterForm"], descendants: true, isSignal: true }], ngImport: i0, template: "<div>\n <div>\n <h5>{{ filter() ? ('mngFilter.titleEdit' | translate) : ('mngFilter.titleAdd' | translate) }}</h5>\n </div>\n <form #filterForm=\"ngForm\" (ngSubmit)=\"onFormSubmit(filterForm)\" class=\"flex flex-column align-items-center lg:flex-row gap-3\">\n <div class=\"w-full lg:w-auto\">\n <mng-dropdown\n name=\"property\"\n id=\"property\"\n tabindex=\"1\"\n #propertyControl=\"ngModel\"\n [(ngModel)]=\"propertyModel\"\n [options]=\"propertyOptionsWithTranslations()\"\n optionsValueProperty=\"property\"\n optionsDisabledProperty=\"disabled\"\n optionsLabelProperty=\"label\"\n [placeholder]=\"'mngFilter.property' | translate\"\n [optionsLabelTranslate]=\"!propertySearch()\"\n [inlineSearch]=\"propertySearch()\"\n required=\"true\"\n className=\"w-full\"\n [disabled]=\"isEdit()\"\n [appendTo]=\"null\" />\n </div>\n <div class=\"w-full lg:w-auto\">\n <mng-dropdown\n name=\"matchMode\"\n id=\"matchMode\"\n [(ngModel)]=\"matchModeModel\"\n className=\"w-full\"\n [options]=\"selectedFilterMetadata()?.matchModes ?? []\"\n [placeholder]=\"'mngFilter.matchMode' | translate\"\n [disabled]=\"!propertyControl.value\"\n class=\"align-self-end\"\n required=\"true\"\n [appendTo]=\"null\" />\n </div>\n @if (!(matchModeModel() === FilterMatchMode.Exists || matchModeModel() === FilterMatchMode.DoesNotExist)) {\n <div class=\"w-full lg:w-auto flex flex-column\">\n @switch (selectedFilterMetadata()?.descriptor?.filterType) {\n @case (FilterTypeEnum.Number) {\n @if (matchModeModel() === FilterMatchMode.Between) {\n <mng-number-range\n className=\"mng-column-filter-number-input\"\n name=\"value\"\n [(ngModel)]=\"valueModel\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [useGrouping]=\"selectedFilterMetadata()?.descriptor?.numberUseGrouping ?? false\"\n [minFractionDigits]=\"selectedFilterMetadata()?.numberConfig?.fractionsMin\"\n [maxFractionDigits]=\"selectedFilterMetadata()?.numberConfig?.fractionsMax\"\n required=\"true\" />\n } @else {\n <p-inputNumber\n inputStyleClass=\"mng-column-filter-number-input\"\n name=\"value\"\n [(ngModel)]=\"valueModel\"\n [styleClass]=\"'w-full'\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [useGrouping]=\"selectedFilterMetadata()?.descriptor?.numberUseGrouping\"\n [minFractionDigits]=\"selectedFilterMetadata()?.numberConfig?.fractionsMin\"\n [maxFractionDigits]=\"selectedFilterMetadata()?.numberConfig?.fractionsMax\"\n [disabled]=\"!matchModeModel()\"\n required=\"true\" />\n }\n }\n\n @case (FilterTypeEnum.Boolean) {\n <p-checkbox [(ngModel)]=\"valueModel\" [disabled]=\"!matchModeModel()\" name=\"value\" binary=\"true\" required=\"true\" />\n }\n @case (FilterTypeEnum.Date) {\n @if (matchModeModel() === FilterMatchMode.Between) {\n <mng-date-range\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [showTime]=\"selectedFilterMetadata()?.dateConfig?.showTime ?? false\"\n [showSeconds]=\"selectedFilterMetadata()?.dateConfig?.showSeconds ?? false\"\n [dateFormat]=\"selectedFilterMetadata()?.dateConfig?.format\"\n [placeholder]=\"'mngFilter.value' | translate\"\n required=\"true\"></mng-date-range>\n } @else {\n <p-calendar\n appendTo=\"body\"\n name=\"value\"\n [(ngModel)]=\"valueModel\"\n [styleClass]=\"'w-full'\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [showIcon]=\"true\"\n [showTime]=\"selectedFilterMetadata()?.dateConfig?.showTime ?? false\"\n [showSeconds]=\"selectedFilterMetadata()?.dateConfig?.showSeconds ?? false\"\n [dateFormat]=\"selectedFilterMetadata()?.dateConfig?.format\"\n [firstDayOfWeek]=\"1\"\n [disabled]=\"!matchModeModel()\"\n required=\"true\">\n </p-calendar>\n }\n }\n @case (FilterTypeEnum.Lookup) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\"></ng-container>\n }\n @case (FilterTypeEnum.LookupEnum) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\"></ng-container>\n }\n @default {\n @if (selectedFilterMetadata()?.descriptor?.genericValueProvider && genericValueDataProvider()) {\n <!-- conditional rendering on the placeholder is there because of styling issues with PrimeNG -->\n <!-- (PrimeNG applies the .p-placeholder class to programmatically set values, making them greyed out) -->\n <span class=\"flex align-items-center\">\n <mng-dropdown\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"genericValueDataProvider()\"\n [className]=\"selectedFilterMetadata()?.descriptor?.className\"\n [dropdownClassName]=\"selectedFilterMetadata()?.descriptor?.dropdownClassName\"\n [placeholder]=\"valueModel() ? undefined : ('mngFilter.value' | translate)\"\n allowInput=\"true\"\n [disabled]=\"!matchModeModel()\"\n [appendTo]=\"null\"\n required=\"true\"></mng-dropdown>\n @if (enableCaseSensitive()) {\n <p-toggleButton [(ngModel)]=\"caseSensitiveModel\" name=\"caseSensitive\" styleClass=\"ml-2 p-1 p-button\" onLabel=\"Aa\" offLabel=\"Aa\" />\n }\n </span>\n } @else {\n <span class=\"p-input-icon-right\">\n <input\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n type=\"text\"\n pInputText\n class=\"mng-column-filter-string-input w-full\"\n [attr.placeholder]=\"'mngFilter.value' | translate\"\n [mngInputTrim]=\"selectedFilterMetadata()?.descriptor?.trimOption\"\n [disabled]=\"!matchModeModel()\"\n [placeholder]=\"'mngFilter.value' | translate\"\n required=\"true\" />\n @if (enableCaseSensitive()) {\n <span class=\"toggle-button-input\">\n <p-toggleButton [(ngModel)]=\"caseSensitiveModel\" name=\"caseSensitive\" styleClass=\"ml-1 p-1 p-button-sm\" onLabel=\"Aa\" offLabel=\"Aa\" />\n </span>\n }\n </span>\n }\n }\n }\n <ng-template #lookupFilter>\n @if (selectedDescriptorAsLookup(); as lookupFilterDescriptor) {\n @switch (lookupFilterDescriptor.lookupType) {\n @case (lookupTypeAutocomplete) {\n <mng-autocomplete\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"lookupFilterDescriptor.dataProvider\"\n [optionsTrackProperty]=\"lookupFilterDescriptor.optionsValueProperty\"\n [optionsValueProperty]=\"lookupFilterDescriptor.optionsValueProperty\"\n [optionsLabelProperty]=\"lookupFilterDescriptor.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookupFilterDescriptor.optionsLabelTranslate\"\n [multiselect]=\"isMultiselect()\"\n [autoClear]=\"lookupFilterDescriptor.autocompleteAutoClear ?? false\"\n [openOnFocus]=\"lookupFilterDescriptor.autocompleteAutoClear ?? true\"\n [inlineSearch]=\"lookupFilterDescriptor.autocompleteInlineSearch ?? false\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [className]=\"lookupFilterDescriptor.className\"\n [dropdownClassName]=\"lookupFilterDescriptor.dropdownClassName\"\n [searchTrim]=\"selectedFilterMetadata()?.descriptor?.trimOption\"\n [disabled]=\"!matchModeModel()\"\n required=\"true\">\n </mng-autocomplete>\n }\n @case (lookupTypeDropdown) {\n <mng-dropdown\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"lookupFilterDescriptor.dataProvider\"\n [optionsValueProperty]=\"lookupFilterDescriptor.optionsValueProperty\"\n [optionsLabelProperty]=\"lookupFilterDescriptor.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookupFilterDescriptor.optionsLabelTranslate\"\n [multiselect]=\"isMultiselect()\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [className]=\"lookupFilterDescriptor.className + ' w-full'\"\n [dropdownClassName]=\"lookupFilterDescriptor.dropdownClassName\"\n showClear=\"false\"\n [disabled]=\"!matchModeModel()\"\n [appendTo]=\"null\"\n required=\"true\">\n </mng-dropdown>\n }\n }\n } @else if (selectedFilterMetadata()?.descriptor?.isGenericFilter && genericValueDataProvider()) {\n <mng-dropdown\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"genericValueDataProvider()\"\n [placeholder]=\"'mngFilter.value' | translate\"\n showClear=\"false\"\n [disabled]=\"!matchModeModel()\"\n [appendTo]=\"null\"\n required=\"true\">\n </mng-dropdown>\n }\n </ng-template>\n </div>\n }\n <div class=\"flex justify-content-end\">\n <button pButton type=\"submit\" class=\"align-self-end\">\n {{ (filter() ? 'general.apply' : 'general.add') | translate }}\n </button>\n </div>\n </form>\n @if (formSubmitted() && filterForm.invalid) {\n <p-messages [value]=\"formErrorMessage()\" class=\"w-full\"></p-messages>\n }\n</div>\n", styles: [".toggle-button-input{position:absolute;right:.25rem;top:50%;transform:translateY(-50%)}\n"], dependencies: [{ kind: "component", type: DropdownComponent, selector: "mng-dropdown", inputs: ["dataProvider", "options", "optionsTrackProperty", "optionsLabelProperty", "optionsLabelTranslate", "optionsValueProperty", "optionsDisabledProperty", "multiselect", "placeholder", "showClear", "selectFirstItem", "className", "dropdownClassName", "changeValueOnBlur", "loading", "disabled", "allowInput", "appendTo", "inlineSearch", "searchTrim"], outputs: ["valueChange", "blur"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "directive", type: InputTrimDirective, selector: "[mngInputTrim]", inputs: ["mngInputTrim"] }, { kind: "component", type: NumberRangeComponent, selector: "mng-number-range", inputs: ["placeholder", "useGrouping", "minFractionDigits", "maxFractionDigits", "required", "disabled"], outputs: ["keyDown"] }, { kind: "ngmodule", type: InputNumberModule }, { kind: "component", type: i3.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "component", type: DateRangeComponent, selector: "mng-date-range", inputs: ["placeholder", "showTime", "showSeconds", "dateFormat", "className", "required", "disabled"] }, { kind: "ngmodule", type: CalendarModule }, { kind: "component", type: i4.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "directive", type: i5.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading", "severity", "raised", "rounded", "text", "outlined", "size", "plain"] }, { kind: "component", type: AutocompleteComponent, selector: "mng-autocomplete", inputs: ["dataProvider", "optionsTrackProperty", "optionsValueProperty", "optionsLabelProperty", "optionsLabelTranslate", "inlineSearch", "openOnFocus", "multiselect", "placeholder", "className", "dropdownClassName", "showClear", "autoClear", "selectFirst", "searchTrim", "disabled"], outputs: ["valueChange", "blur"] }, { kind: "ngmodule", type: CheckboxModule }, { kind: "component", type: i6.Checkbox, selector: "p-checkbox", inputs: ["value", "name", "disabled", "binary", "label", "ariaLabelledBy", "ariaLabel", "tabindex", "inputId", "style", "styleClass", "labelStyleClass", "formControl", "checkboxIcon", "readonly", "required", "autofocus", "trueValue", "falseValue", "variant"], outputs: ["onChange", "onFocus", "onBlur"] }, { kind: "ngmodule", type: MessagesModule }, { kind: "component", type: i7.Messages, selector: "p-messages", inputs: ["value", "closable", "style", "styleClass", "enableService", "key", "escape", "severity", "showTransitionOptions", "hideTransitionOptions"], outputs: ["valueChange", "onClose"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i8.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "ngmodule", type: ToggleButtonModule }, { kind: "component", type: i9.ToggleButton, selector: "p-toggleButton", inputs: ["onLabel", "offLabel", "onIcon", "offIcon", "ariaLabel", "ariaLabelledBy", "disabled", "style", "styleClass", "inputId", "tabindex", "iconPos", "autofocus"], outputs: ["onChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
212
202
  }
213
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: FilterFormComponent, decorators: [{
203
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: TableFilterFormComponent, decorators: [{
214
204
  type: Component,
215
- args: [{ standalone: true, selector: 'mng-filter-form', imports: [
205
+ args: [{ standalone: true, selector: 'mng-table-filter-form', imports: [
216
206
  DropdownComponent,
217
207
  FormsModule,
218
208
  NgClass,
@@ -231,6 +221,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImpor
231
221
  ToggleButtonModule
232
222
  ], changeDetection: ChangeDetectionStrategy.OnPush, host: {
233
223
  class: 'flex flex-grow-1'
234
- }, template: "<div>\n <div>\n <h5>{{ filter() ? ('mngFilter.titleEdit' | translate) : ('mngFilter.titleAdd' | translate) }}</h5>\n </div>\n <form #filterForm=\"ngForm\" (ngSubmit)=\"onFormSubmit(filterForm)\" class=\"flex flex-column align-items-center lg:flex-row gap-3\">\n <div class=\"w-full lg:w-auto\">\n <mng-dropdown\n name=\"property\"\n id=\"property\"\n tabindex=\"1\"\n #propertyControl=\"ngModel\"\n [(ngModel)]=\"propertyModel\"\n [options]=\"propertyOptionsWithTranslations()\"\n optionsValueProperty=\"property\"\n optionsDisabledProperty=\"disabled\"\n optionsLabelProperty=\"label\"\n [placeholder]=\"'mngFilter.property' | translate\"\n [optionsLabelTranslate]=\"!propertySearch()\"\n [inlineSearch]=\"propertySearch()\"\n required=\"true\"\n className=\"w-full\"\n [disabled]=\"isEdit()\"\n [appendTo]=\"null\" />\n </div>\n <div class=\"w-full lg:w-auto\">\n <mng-dropdown\n name=\"matchMode\"\n id=\"matchMode\"\n [(ngModel)]=\"matchModeModel\"\n className=\"w-full\"\n [options]=\"matchModeOptions()\"\n [placeholder]=\"'mngFilter.matchMode' | translate\"\n [disabled]=\"!propertyControl.value\"\n class=\"align-self-end\"\n required=\"true\"\n [appendTo]=\"null\" />\n </div>\n @if (!(matchModeModel() === FilterMatchMode.Exists || matchModeModel() === FilterMatchMode.DoesNotExist)) {\n <div class=\"w-full lg:w-auto flex flex-column\">\n @switch (selectedDescriptor()?.filterType) {\n @case (FilterTypeEnum.Number) {\n @if (matchModeModel() === FilterMatchMode.Between) {\n <mng-number-range\n className=\"mng-column-filter-number-input\"\n name=\"value\"\n [(ngModel)]=\"valueModel\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [useGrouping]=\"selectedDescriptor()?.numberUseGrouping ?? false\"\n [minFractionDigits]=\"numberConfig()?.fractionsMin\"\n [maxFractionDigits]=\"numberConfig()?.fractionsMax\"\n required=\"true\" />\n } @else {\n <p-inputNumber\n inputStyleClass=\"mng-column-filter-number-input\"\n name=\"value\"\n [(ngModel)]=\"valueModel\"\n [styleClass]=\"'w-full'\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [useGrouping]=\"selectedDescriptor()?.numberUseGrouping\"\n [minFractionDigits]=\"numberConfig()?.fractionsMin\"\n [maxFractionDigits]=\"numberConfig()?.fractionsMax\"\n [disabled]=\"!matchModeModel()\"\n required=\"true\" />\n }\n }\n\n @case (FilterTypeEnum.Boolean) {\n <p-checkbox [(ngModel)]=\"valueModel\" [disabled]=\"!matchModeModel()\" name=\"value\" binary=\"true\" required=\"true\" />\n }\n @case (FilterTypeEnum.Date) {\n @if (matchModeModel() === FilterMatchMode.Between) {\n <mng-date-range\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [showTime]=\"dateConfig()?.showTime ?? false\"\n [showSeconds]=\"dateConfig()?.showSeconds ?? false\"\n [dateFormat]=\"dateConfig()?.format\"\n [placeholder]=\"'mngFilter.value' | translate\"\n required=\"true\"></mng-date-range>\n } @else {\n <p-calendar\n appendTo=\"body\"\n name=\"value\"\n [(ngModel)]=\"valueModel\"\n [styleClass]=\"'w-full'\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [showIcon]=\"true\"\n [showTime]=\"dateConfig()?.showTime ?? false\"\n [showSeconds]=\"dateConfig()?.showSeconds ?? false\"\n [dateFormat]=\"dateConfig()?.format\"\n [firstDayOfWeek]=\"1\"\n [disabled]=\"!matchModeModel()\"\n required=\"true\">\n </p-calendar>\n }\n }\n @case (FilterTypeEnum.Lookup) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\"></ng-container>\n }\n @case (FilterTypeEnum.LookupEnum) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\"></ng-container>\n }\n @default {\n @if (selectedDescriptor()?.genericValueProvider && genericValueDataProvider()) {\n <!-- conditional rendering on the placeholder is there because of styling issues with PrimeNG -->\n <!-- (PrimeNG applies the .p-placeholder class to programmatically set values, making them greyed out) -->\n <span class=\"flex align-items-center\">\n <mng-dropdown\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"genericValueDataProvider()\"\n [className]=\"selectedDescriptor()?.className\"\n [dropdownClassName]=\"selectedDescriptor()?.dropdownClassName\"\n [placeholder]=\"valueModel() ? undefined : ('mngFilter.value' | translate)\"\n allowInput=\"true\"\n [disabled]=\"!matchModeModel()\"\n [appendTo]=\"null\"\n required=\"true\"></mng-dropdown>\n @if (enableCaseSensitive()) {\n <p-toggleButton [(ngModel)]=\"caseSensitiveModel\" name=\"caseSensitive\" styleClass=\"ml-2 p-1 p-button\" onLabel=\"Aa\" offLabel=\"Aa\" />\n }\n </span>\n } @else {\n <span class=\"p-input-icon-right\">\n <input\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n type=\"text\"\n pInputText\n class=\"mng-column-filter-string-input w-full\"\n [attr.placeholder]=\"'mngFilter.value' | translate\"\n [mngInputTrim]=\"selectedDescriptor()?.trimOption!\"\n [disabled]=\"!matchModeModel()\"\n [placeholder]=\"'mngFilter.value' | translate\"\n required=\"true\" />\n @if (enableCaseSensitive()) {\n <span class=\"toggle-button-input\">\n <p-toggleButton [(ngModel)]=\"caseSensitiveModel\" name=\"caseSensitive\" styleClass=\"ml-1 p-1 p-button-sm\" onLabel=\"Aa\" offLabel=\"Aa\" />\n </span>\n }\n </span>\n }\n }\n }\n <ng-template #lookupFilter>\n @if (selectedDescriptorAsLookup(); as lookupFilterDescriptor) {\n @switch (lookupFilterDescriptor.lookupType) {\n @case (lookupTypeAutocomplete) {\n <mng-autocomplete\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"lookupFilterDescriptor.dataProvider\"\n [optionsTrackProperty]=\"lookupFilterDescriptor.optionsValueProperty\"\n [optionsValueProperty]=\"lookupFilterDescriptor.optionsValueProperty\"\n [optionsLabelProperty]=\"lookupFilterDescriptor.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookupFilterDescriptor.optionsLabelTranslate\"\n [multiselect]=\"lookupFilterDescriptor.multiselect\"\n [autoClear]=\"lookupFilterDescriptor.autocompleteAutoClear ?? false\"\n [openOnFocus]=\"lookupFilterDescriptor.autocompleteAutoClear ?? true\"\n [inlineSearch]=\"lookupFilterDescriptor.autocompleteInlineSearch ?? false\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [className]=\"lookupFilterDescriptor.className\"\n [dropdownClassName]=\"lookupFilterDescriptor.dropdownClassName\"\n [searchTrim]=\"selectedDescriptor()?.trimOption!\"\n [disabled]=\"!matchModeModel()\"\n required=\"true\">\n </mng-autocomplete>\n }\n @case (lookupTypeDropdown) {\n <mng-dropdown\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"lookupFilterDescriptor.dataProvider\"\n [optionsValueProperty]=\"lookupFilterDescriptor.optionsValueProperty\"\n [optionsLabelProperty]=\"lookupFilterDescriptor.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookupFilterDescriptor.optionsLabelTranslate\"\n [multiselect]=\"lookupFilterDescriptor.multiselect\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [className]=\"lookupFilterDescriptor.className + ' w-full'\"\n [dropdownClassName]=\"lookupFilterDescriptor.dropdownClassName\"\n showClear=\"false\"\n [disabled]=\"!matchModeModel()\"\n [appendTo]=\"null\"\n required=\"true\">\n </mng-dropdown>\n }\n }\n } @else if (selectedDescriptor()?.isGenericFilter && genericValueDataProvider()) {\n <mng-dropdown\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"genericValueDataProvider()\"\n [placeholder]=\"'mngFilter.value' | translate\"\n showClear=\"false\"\n [disabled]=\"!matchModeModel()\"\n [appendTo]=\"null\"\n required=\"true\">\n </mng-dropdown>\n }\n </ng-template>\n </div>\n }\n <div class=\"flex justify-content-end\">\n <button pButton type=\"submit\" class=\"align-self-end\">\n {{ (filter() ? 'general.apply' : 'general.add') | translate }}\n </button>\n </div>\n </form>\n @if (formSubmitted() && filterForm.invalid) {\n <p-messages [value]=\"formErrorMessage()\" class=\"w-full\"></p-messages>\n }\n</div>\n", styles: [".toggle-button-input{position:absolute;right:.25rem;top:50%;transform:translateY(-50%)}\n"] }]
224
+ }, template: "<div>\n <div>\n <h5>{{ filter() ? ('mngFilter.titleEdit' | translate) : ('mngFilter.titleAdd' | translate) }}</h5>\n </div>\n <form #filterForm=\"ngForm\" (ngSubmit)=\"onFormSubmit(filterForm)\" class=\"flex flex-column align-items-center lg:flex-row gap-3\">\n <div class=\"w-full lg:w-auto\">\n <mng-dropdown\n name=\"property\"\n id=\"property\"\n tabindex=\"1\"\n #propertyControl=\"ngModel\"\n [(ngModel)]=\"propertyModel\"\n [options]=\"propertyOptionsWithTranslations()\"\n optionsValueProperty=\"property\"\n optionsDisabledProperty=\"disabled\"\n optionsLabelProperty=\"label\"\n [placeholder]=\"'mngFilter.property' | translate\"\n [optionsLabelTranslate]=\"!propertySearch()\"\n [inlineSearch]=\"propertySearch()\"\n required=\"true\"\n className=\"w-full\"\n [disabled]=\"isEdit()\"\n [appendTo]=\"null\" />\n </div>\n <div class=\"w-full lg:w-auto\">\n <mng-dropdown\n name=\"matchMode\"\n id=\"matchMode\"\n [(ngModel)]=\"matchModeModel\"\n className=\"w-full\"\n [options]=\"selectedFilterMetadata()?.matchModes ?? []\"\n [placeholder]=\"'mngFilter.matchMode' | translate\"\n [disabled]=\"!propertyControl.value\"\n class=\"align-self-end\"\n required=\"true\"\n [appendTo]=\"null\" />\n </div>\n @if (!(matchModeModel() === FilterMatchMode.Exists || matchModeModel() === FilterMatchMode.DoesNotExist)) {\n <div class=\"w-full lg:w-auto flex flex-column\">\n @switch (selectedFilterMetadata()?.descriptor?.filterType) {\n @case (FilterTypeEnum.Number) {\n @if (matchModeModel() === FilterMatchMode.Between) {\n <mng-number-range\n className=\"mng-column-filter-number-input\"\n name=\"value\"\n [(ngModel)]=\"valueModel\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [useGrouping]=\"selectedFilterMetadata()?.descriptor?.numberUseGrouping ?? false\"\n [minFractionDigits]=\"selectedFilterMetadata()?.numberConfig?.fractionsMin\"\n [maxFractionDigits]=\"selectedFilterMetadata()?.numberConfig?.fractionsMax\"\n required=\"true\" />\n } @else {\n <p-inputNumber\n inputStyleClass=\"mng-column-filter-number-input\"\n name=\"value\"\n [(ngModel)]=\"valueModel\"\n [styleClass]=\"'w-full'\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [useGrouping]=\"selectedFilterMetadata()?.descriptor?.numberUseGrouping\"\n [minFractionDigits]=\"selectedFilterMetadata()?.numberConfig?.fractionsMin\"\n [maxFractionDigits]=\"selectedFilterMetadata()?.numberConfig?.fractionsMax\"\n [disabled]=\"!matchModeModel()\"\n required=\"true\" />\n }\n }\n\n @case (FilterTypeEnum.Boolean) {\n <p-checkbox [(ngModel)]=\"valueModel\" [disabled]=\"!matchModeModel()\" name=\"value\" binary=\"true\" required=\"true\" />\n }\n @case (FilterTypeEnum.Date) {\n @if (matchModeModel() === FilterMatchMode.Between) {\n <mng-date-range\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [showTime]=\"selectedFilterMetadata()?.dateConfig?.showTime ?? false\"\n [showSeconds]=\"selectedFilterMetadata()?.dateConfig?.showSeconds ?? false\"\n [dateFormat]=\"selectedFilterMetadata()?.dateConfig?.format\"\n [placeholder]=\"'mngFilter.value' | translate\"\n required=\"true\"></mng-date-range>\n } @else {\n <p-calendar\n appendTo=\"body\"\n name=\"value\"\n [(ngModel)]=\"valueModel\"\n [styleClass]=\"'w-full'\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [showIcon]=\"true\"\n [showTime]=\"selectedFilterMetadata()?.dateConfig?.showTime ?? false\"\n [showSeconds]=\"selectedFilterMetadata()?.dateConfig?.showSeconds ?? false\"\n [dateFormat]=\"selectedFilterMetadata()?.dateConfig?.format\"\n [firstDayOfWeek]=\"1\"\n [disabled]=\"!matchModeModel()\"\n required=\"true\">\n </p-calendar>\n }\n }\n @case (FilterTypeEnum.Lookup) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\"></ng-container>\n }\n @case (FilterTypeEnum.LookupEnum) {\n <ng-container *ngTemplateOutlet=\"lookupFilter\"></ng-container>\n }\n @default {\n @if (selectedFilterMetadata()?.descriptor?.genericValueProvider && genericValueDataProvider()) {\n <!-- conditional rendering on the placeholder is there because of styling issues with PrimeNG -->\n <!-- (PrimeNG applies the .p-placeholder class to programmatically set values, making them greyed out) -->\n <span class=\"flex align-items-center\">\n <mng-dropdown\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"genericValueDataProvider()\"\n [className]=\"selectedFilterMetadata()?.descriptor?.className\"\n [dropdownClassName]=\"selectedFilterMetadata()?.descriptor?.dropdownClassName\"\n [placeholder]=\"valueModel() ? undefined : ('mngFilter.value' | translate)\"\n allowInput=\"true\"\n [disabled]=\"!matchModeModel()\"\n [appendTo]=\"null\"\n required=\"true\"></mng-dropdown>\n @if (enableCaseSensitive()) {\n <p-toggleButton [(ngModel)]=\"caseSensitiveModel\" name=\"caseSensitive\" styleClass=\"ml-2 p-1 p-button\" onLabel=\"Aa\" offLabel=\"Aa\" />\n }\n </span>\n } @else {\n <span class=\"p-input-icon-right\">\n <input\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n type=\"text\"\n pInputText\n class=\"mng-column-filter-string-input w-full\"\n [attr.placeholder]=\"'mngFilter.value' | translate\"\n [mngInputTrim]=\"selectedFilterMetadata()?.descriptor?.trimOption\"\n [disabled]=\"!matchModeModel()\"\n [placeholder]=\"'mngFilter.value' | translate\"\n required=\"true\" />\n @if (enableCaseSensitive()) {\n <span class=\"toggle-button-input\">\n <p-toggleButton [(ngModel)]=\"caseSensitiveModel\" name=\"caseSensitive\" styleClass=\"ml-1 p-1 p-button-sm\" onLabel=\"Aa\" offLabel=\"Aa\" />\n </span>\n }\n </span>\n }\n }\n }\n <ng-template #lookupFilter>\n @if (selectedDescriptorAsLookup(); as lookupFilterDescriptor) {\n @switch (lookupFilterDescriptor.lookupType) {\n @case (lookupTypeAutocomplete) {\n <mng-autocomplete\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"lookupFilterDescriptor.dataProvider\"\n [optionsTrackProperty]=\"lookupFilterDescriptor.optionsValueProperty\"\n [optionsValueProperty]=\"lookupFilterDescriptor.optionsValueProperty\"\n [optionsLabelProperty]=\"lookupFilterDescriptor.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookupFilterDescriptor.optionsLabelTranslate\"\n [multiselect]=\"isMultiselect()\"\n [autoClear]=\"lookupFilterDescriptor.autocompleteAutoClear ?? false\"\n [openOnFocus]=\"lookupFilterDescriptor.autocompleteAutoClear ?? true\"\n [inlineSearch]=\"lookupFilterDescriptor.autocompleteInlineSearch ?? false\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [className]=\"lookupFilterDescriptor.className\"\n [dropdownClassName]=\"lookupFilterDescriptor.dropdownClassName\"\n [searchTrim]=\"selectedFilterMetadata()?.descriptor?.trimOption\"\n [disabled]=\"!matchModeModel()\"\n required=\"true\">\n </mng-autocomplete>\n }\n @case (lookupTypeDropdown) {\n <mng-dropdown\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"lookupFilterDescriptor.dataProvider\"\n [optionsValueProperty]=\"lookupFilterDescriptor.optionsValueProperty\"\n [optionsLabelProperty]=\"lookupFilterDescriptor.optionsLabelProperty\"\n [optionsLabelTranslate]=\"lookupFilterDescriptor.optionsLabelTranslate\"\n [multiselect]=\"isMultiselect()\"\n [placeholder]=\"'mngFilter.value' | translate\"\n [className]=\"lookupFilterDescriptor.className + ' w-full'\"\n [dropdownClassName]=\"lookupFilterDescriptor.dropdownClassName\"\n showClear=\"false\"\n [disabled]=\"!matchModeModel()\"\n [appendTo]=\"null\"\n required=\"true\">\n </mng-dropdown>\n }\n }\n } @else if (selectedFilterMetadata()?.descriptor?.isGenericFilter && genericValueDataProvider()) {\n <mng-dropdown\n [(ngModel)]=\"valueModel\"\n name=\"value\"\n [dataProvider]=\"genericValueDataProvider()\"\n [placeholder]=\"'mngFilter.value' | translate\"\n showClear=\"false\"\n [disabled]=\"!matchModeModel()\"\n [appendTo]=\"null\"\n required=\"true\">\n </mng-dropdown>\n }\n </ng-template>\n </div>\n }\n <div class=\"flex justify-content-end\">\n <button pButton type=\"submit\" class=\"align-self-end\">\n {{ (filter() ? 'general.apply' : 'general.add') | translate }}\n </button>\n </div>\n </form>\n @if (formSubmitted() && filterForm.invalid) {\n <p-messages [value]=\"formErrorMessage()\" class=\"w-full\"></p-messages>\n }\n</div>\n", styles: [".toggle-button-input{position:absolute;right:.25rem;top:50%;transform:translateY(-50%)}\n"] }]
235
225
  }], ctorParameters: () => [] });
236
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGFibGUvc3JjL2NvbXBvbmVudHMvZmlsdGVyL2ZpbHRlci1mb3JtL2ZpbHRlci1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3RhYmxlL3NyYy9jb21wb25lbnRzL2ZpbHRlci9maWx0ZXItZm9ybS9maWx0ZXItZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFFLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0SyxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsWUFBWSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDNUUsT0FBTyxFQUFDLFdBQVcsRUFBUyxNQUFNLGdCQUFnQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxlQUFlLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsYUFBYSxFQUFhLE1BQU0sYUFBYSxDQUFDO0FBQ3RELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFP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RHRLUSxpQkFBaUIsK2JBQ2pCLFdBQVcsb3dDQUVYLGVBQWUsNEZBQ2Ysa0JBQWtCLHFGQUNsQixvQkFBb0IsNExBQ3BCLGlCQUFpQiwwdkJBQ2pCLGtCQUFrQixpS0FDbEIsY0FBYyx5Z0RBQ2QscUJBQXFCLDJYQUNyQixjQUFjLGdaQUNkLGNBQWMsMlJBQ2QsZUFBZSx5SEFDZixnQkFBZ0IsbUpBQ2hCLGNBQWMsOEJBQ2Qsa0JBQWtCOzsyRkFPYixtQkFBbUI7a0JBNUIvQixTQUFTO2lDQUNNLElBQUksWUFDTixpQkFBaUIsV0FHbEI7d0JBQ0wsaUJBQWlCO3dCQUNqQixXQUFXO3dCQUNYLE9BQU87d0JBQ1AsZUFBZTt3QkFDZixrQkFBa0I7d0JBQ2xCLG9CQUFvQjt3QkFDcEIsaUJBQWlCO3dCQUNqQixrQkFBa0I7d0JBQ2xCLGNBQWM7d0JBQ2QscUJBQXFCO3dCQUNyQixjQUFjO3dCQUNkLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixnQkFBZ0I7d0JBQ2hCLGNBQWM7d0JBQ2Qsa0JBQWtCO3FCQUNyQixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTSxRQUN6Qzt3QkFDRixLQUFLLEVBQUUsa0JBQWtCO3FCQUM1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TmdDbGFzcywgTmdUZW1wbGF0ZU91dGxldH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgYm9vbGVhbkF0dHJpYnV0ZSwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCwgdmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7Rm9ybXNNb2R1bGUsIE5nRm9ybX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1ByaW1lTkdDb25maWcsIFNlbGVjdEl0ZW19IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7Q2FsZW5kYXJNb2R1bGV9IGZyb20gJ3ByaW1lbmcvY2FsZW5kYXInO1xuaW1wb3J0IHtDaGVja2JveE1vZHVsZX0gZnJvbSAncHJpbWVuZy9jaGVja2JveCc7XG5pbXBvcnQge0Ryb3Bkb3duTW9kdWxlfSBmcm9tICdwcmltZW5nL2Ryb3Bkb3duJztcbmltcG9ydCB7SW5wdXROdW1iZXJNb2R1bGV9IGZyb20gJ3ByaW1lbmcvaW5wdXRudW1iZXInO1xuaW1wb3J0IHtJbnB1dFRleHRNb2R1bGV9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0JztcbmltcG9ydCB7TWVzc2FnZXNNb2R1bGV9IGZyb20gJ3ByaW1lbmcvbWVzc2FnZXMnO1xuaW1wb3J0IHtPdmVybGF5UGFuZWx9IGZyb20gJ3ByaW1lbmcvb3ZlcmxheXBhbmVsJztcbmltcG9ydCB7VG9nZ2xlQnV0dG9uTW9kdWxlfSBmcm9tICdwcmltZW5nL3RvZ2dsZWJ1dHRvbic7XG5pbXBvcnQge05FVkVSLCBzd2l0Y2hNYXB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICAgIENPTU1PTlNfTU9EVUxFX0NPTkZJR19JVCxcbiAgICBDb21tb25zU2VyaWFsaXphdGlvbkNvbmZpZyxcbiAgICBGaWx0ZXJNYXRjaE1vZGUsXG4gICAgRmlsdGVyTWF0Y2hNb2RlRXh0ZW5kZWRUeXBlLFxuICAgIElMb29rdXBEYXRhUHJvdmlkZXIsXG4gICAgZ2V0STE4blR5cGVQcm9wZXJ0eUtleVxufSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2NvcmUnO1xuaW1wb3J0IHtGaWx0ZXJEZXNjcmlwdG9yLCBGaWx0ZXJHZW5lcmljRGVzY3JpcHRvciwgRmlsdGVyTG9va3VwRGVzY3JpcHRvciwgRmlsdGVyTG9va3VwVHlwZUVudW0sIEZpbHRlclR5cGVFbnVtfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2ZpbHRlcic7XG5pbXBvcnQge0F1dG9jb21wbGV0ZUNvbXBvbmVudCwgRGF0ZVJhbmdlQ29tcG9uZW50LCBEcm9wZG93bkNvbXBvbmVudCwgSW5wdXRUcmltRGlyZWN0aXZlLCBOdW1iZXJSYW5nZUNvbXBvbmVudH0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9mb3JtJztcbmltcG9ydCB7bG9va3VwRGF0YVByb3ZpZGVyV2l0aFNlcnZpY2V9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvZm9ybS9hcGknO1xuaW1wb3J0IHtNb2RlbERlc2NyaXB0b3J9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvbW9kZWwnO1xuXG5pbXBvcnQge1xuICAgIGZpbHRlckFkanVzdERpc3BsYXlWYWx1ZU9uTWF0Y2hNb2RlQ2hhbmdlLFxuICAgIGZpbHRlckFwcGx5U2VyaWFsaXphdGlvbkNvbmZpZ1RvQ21wLFxuICAgIGZpbHRlckdldERhdGVDb25maWcsXG4gICAgZmlsdGVyR2V0RGVmYXVsdE1hdGNoTW9kZSxcbiAgICBmaWx0ZXJHZXROdW1iZXJDb25maWcsXG4gICAgZ2VuZXJhdGVNYXRjaE1vZGVPcHRpb25zXG59IGZyb20gJy4uLy4uLy4uL2hlbHBlcnMvZmlsdGVycyc7XG5pbXBvcnQge0NvbW1vbnNGaWx0ZXJNZXRhZGF0YVdpdGhEZXNjcmlwdG9yLCBGaWx0ZXJGb3JtRW1pdEV2ZW50fSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZmlsdGVyLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ21uZy1maWx0ZXItZm9ybScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ZpbHRlci1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybDogJy4vZmlsdGVyLWZvcm0uY29tcG9uZW50LnNjc3MnLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgRHJvcGRvd25Db21wb25lbnQsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIElucHV0VHJpbURpcmVjdGl2ZSxcbiAgICAgICAgTnVtYmVyUmFuZ2VDb21wb25lbnQsXG4gICAgICAgIElucHV0TnVtYmVyTW9kdWxlLFxuICAgICAgICBEYXRlUmFuZ2VDb21wb25lbnQsXG4gICAgICAgIENhbGVuZGFyTW9kdWxlLFxuICAgICAgICBBdXRvY29tcGxldGVDb21wb25lbnQsXG4gICAgICAgIENoZWNrYm94TW9kdWxlLFxuICAgICAgICBNZXNzYWdlc01vZHVsZSxcbiAgICAgICAgSW5wdXRUZXh0TW9kdWxlLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBEcm9wZG93bk1vZHVsZSxcbiAgICAgICAgVG9nZ2xlQnV0dG9uTW9kdWxlXG4gICAgXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiAnZmxleCBmbGV4LWdyb3ctMSdcbiAgICB9XG59KVxuZXhwb3J0IGNsYXNzIEZpbHRlckZvcm1Db21wb25lbnQge1xuICAgIHB1YmxpYyByZWFkb25seSBsb29rdXBUeXBlRHJvcGRvd246IEZpbHRlckxvb2t1cFR5cGVFbnVtID0gRmlsdGVyTG9va3VwVHlwZUVudW0uRHJvcGRvd247XG4gICAgcHVibGljIHJlYWRvbmx5IGxvb2t1cFR5cGVBdXRvY29tcGxldGU6IEZpbHRlckxvb2t1cFR5cGVFbnVtID0gRmlsdGVyTG9va3VwVHlwZUVudW0uQXV0b2NvbXBsZXRlO1xuICAgIHB1YmxpYyByZWFkb25seSBGaWx0ZXJUeXBlRW51bSA9IEZpbHRlclR5cGVFbnVtO1xuICAgIHB1YmxpYyByZWFkb25seSBGaWx0ZXJNYXRjaE1vZGUgPSBGaWx0ZXJNYXRjaE1vZGU7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3QoRWxlbWVudFJlZik7XG4gICAgcHJpdmF0ZSByZWFkb25seSBtb2R1bGVDb25maWcgPSBpbmplY3QoQ09NTU9OU19NT0RVTEVfQ09ORklHX0lULCB7b3B0aW9uYWw6IHRydWV9KTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByaW1lQ29uZmlnID0gaW5qZWN0KFByaW1lTkdDb25maWcpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdHJhbnNsYXRlID0gaW5qZWN0KFRyYW5zbGF0ZVNlcnZpY2UpO1xuXG4gICAgcHVibGljIHRpdGxlID0gaW5wdXQ8c3RyaW5nPigpO1xuICAgIHB1YmxpYyBkZXNjcmlwdG9ycyA9IGlucHV0LnJlcXVpcmVkPEZpbHRlckRlc2NyaXB0b3I8YW55LCBhbnk+W10+KCk7XG4gICAgcHVibGljIGdlbmVyaWNEZXNjcmlwdG9yID0gaW5wdXQ8RmlsdGVyR2VuZXJpY0Rlc2NyaXB0b3I+KCk7XG4gICAgcHVibGljIG1vZGVsID0gaW5wdXQucmVxdWlyZWQ8TW9kZWxEZXNjcmlwdG9yPGFueT4+KCk7XG4gICAgcHVibGljIGZpbHRlciA9IGlucHV0PENvbW1vbnNGaWx0ZXJNZXRhZGF0YVdpdGhEZXNjcmlwdG9yPigpO1xuICAgIHB1YmxpYyBvdmVybGF5ID0gaW5wdXQ8T3ZlcmxheVBhbmVsPigpO1xuICAgIHB1YmxpYyBkaXNhYmxlZFByb3BlcnRpZXMgPSBpbnB1dDxzdHJpbmdbXT4oW10pO1xuICAgIHB1YmxpYyBlbmFibGVDYXNlU2Vuc2l0aXZlID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gICAgcHVibGljIHByb3BlcnR5U2VhcmNoID0gaW5wdXQoZmFsc2UsIHt0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGV9KTtcblxuICAgIHB1YmxpYyBhcHBseSA9IG91dHB1dDxGaWx0ZXJGb3JtRW1pdEV2ZW50PigpO1xuXG4gICAgcHVibGljIHByb3BlcnR5T3B0aW9uc1dpdGhUcmFuc2xhdGlvbnMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRpc2FibGVkUHJvcGVydGllcyA9IHRoaXMuZGlzYWJsZWRQcm9wZXJ0aWVzKCk7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZmlsdGVyKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3JzKCk/Lm1hcChkID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gPFByb3BlcnR5TW9kZWw+e1xuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogZC5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGQuaXNHZW5lcmljRmlsdGVyID8gZC5wcm9wZXJ0eSA6IHRoaXMuZ2V0UHJvcGVydHlMYWJlbEtleShkKSxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFmaWx0ZXIgJiYgZGlzYWJsZWRQcm9wZXJ0aWVzLmluY2x1ZGVzKGQucHJvcGVydHkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pID8/IFtdXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgc2VsZWN0ZWREZXNjcmlwdG9yID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydHlNb2RlbCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdG9ycygpLmZpbmQoZmlsdGVyRGVzY3JpcHRvciA9PiBmaWx0ZXJEZXNjcmlwdG9yLnByb3BlcnR5ID09PSBwcm9wZXJ0eSk7XG4gICAgfSk7XG5cbiAgICAvLyBjaGFuZ2UgdmFsdWUgbG9va3VwIGZ1bmN0aW9uIHRvIGluY2x1ZGUgdGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIGdlbmVyaWMgZmlsdGVyXG4gICAgcHVibGljIGdlbmVyaWNWYWx1ZURhdGFQcm92aWRlciA9IGNvbXB1dGVkPElMb29rdXBEYXRhUHJvdmlkZXI8c3RyaW5nLCBhbnksIGFueSwgJ2ZpZWxkJz4gfCB1bmRlZmluZWQ+KCgpID0+IHtcbiAgICAgICAgY29uc3QgZ2VuZXJpY1ZhbHVlUHJvdmlkZXIgPSB0aGlzLmdlbmVyaWNEZXNjcmlwdG9yKCk/LnZhbHVlTG9va3VwO1xuXG4gICAgICAgIGlmIChnZW5lcmljVmFsdWVQcm92aWRlciAmJiBnZW5lcmljVmFsdWVQcm92aWRlci5zZXJ2aWNlVHlwZSkge1xuICAgICAgICAgICAgY29uc3QgbG9va3VwRm4gPSBnZW5lcmljVmFsdWVQcm92aWRlci5sb29rdXA7XG4gICAgICAgICAgICByZXR1cm4gbG9va3VwRGF0YVByb3ZpZGVyV2l0aFNlcnZpY2U8c3RyaW5nLCBhbnksIGFueSwgJ2ZpZWxkJz4oZ2VuZXJpY1ZhbHVlUHJvdmlkZXIuc2VydmljZVR5cGUpLndpdGhMb29rdXAoKHBhcmFtcywgc2VydmljZSwgc2VhcmNoKSA9PiB7XG4gICAgICAgICAgICAgICAgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnBhcmFtcz8uZmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuc2VsZWN0ZWREZXNjcmlwdG9yKCk/LnByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZTogdGhpcy5zZWxlY3RlZERlc2NyaXB0b3IoKT8uZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZUVudW0uTG9va3VwRW51bSA/IEZpbHRlck1hdGNoTW9kZS5JbiA6IEZpbHRlck1hdGNoTW9kZS5TdGFydHNXaXRoXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBsb29rdXBGbihwYXJhbXMsIHNlcnZpY2UsIHNlYXJjaCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgc2VsZWN0ZWREZXNjcmlwdG9yQXNMb29rdXAgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlckRlc2NyaXB0b3IgPSB0aGlzLnNlbGVjdGVkRGVzY3JpcHRvcigpO1xuICAgICAgICByZXR1cm4gZmlsdGVyRGVzY3JpcHRvciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhZmlsdGVyRGVzY3JpcHRvci5pc0dlbmVyaWNGaWx0ZXIgJiZcbiAgICAgICAgICAgIChmaWx0ZXJEZXNjcmlwdG9yLmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLkxvb2t1cCB8fCBmaWx0ZXJEZXNjcmlwdG9yLmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLkxvb2t1cEVudW0pXG4gICAgICAgICAgICA/IChmaWx0ZXJEZXNjcmlwdG9yIGFzIEZpbHRlckxvb2t1cERlc2NyaXB0b3I8YW55LCBhbnk+KVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gICAgcHVibGljIG1hdGNoTW9kZU9wdGlvbnMgPSBjb21wdXRlZDxTZWxlY3RJdGVtW10+KCgpID0+IHtcbiAgICAgICAgcmV0dXJuIGdlbmVyYXRlTWF0Y2hNb2RlT3B0aW9ucyh0aGlzLnByaW1lQ29uZmlnLCB0aGlzLnNlbGVjdGVkRGVzY3JpcHRvcigpLCB0aGlzLnNlcmlhbGl6YXRpb25DZmcpO1xuICAgIH0pO1xuXG4gICAgcHVibGljIGlzRWRpdCA9IGNvbXB1dGVkKCgpID0+IHRoaXMuZmlsdGVyKCkgIT0gbnVsbCk7XG4gICAgcHVibGljIGZvcm1TdWJtaXR0ZWQgPSBzaWduYWwoZmFsc2UpO1xuICAgIHB1YmxpYyBmb3JtRXJyb3JNZXNzYWdlID0gc2lnbmFsPGFueT4oW10pO1xuXG4gICAgLy8gZGlzcGxheSBjb25maWdzXG4gICAgcHVibGljIGRhdGVDb25maWcgPSBjb21wdXRlZCgoKSA9PiBmaWx0ZXJHZXREYXRlQ29uZmlnKHRoaXMuc2VsZWN0ZWREZXNjcmlwdG9yKCksIHRoaXMuc2VyaWFsaXphdGlvbkNmZykpO1xuICAgIHB1YmxpYyBudW1iZXJDb25maWcgPSBjb21wdXRlZCgoKSA9PiBmaWx0ZXJHZXROdW1iZXJDb25maWcodGhpcy5zZWxlY3RlZERlc2NyaXB0b3IoKSkpO1xuXG4gICAgLy8gVUkgdXRpbGl0aWVzXG4gICAgcHJpdmF0ZSBmaWx0ZXJGb3JtID0gdmlld0NoaWxkLnJlcXVpcmVkPE5nRm9ybT4oJ2ZpbHRlckZvcm0nKTtcblxuICAgIC8vIEZpbHRlciBmb3JtIG1vZGVsIGFuZCBmb3JtIHV0aWxpdGllc1xuICAgIHB1YmxpYyBwcm9wZXJ0eU1vZGVsID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICAgIHB1YmxpYyBtYXRjaE1vZGVNb2RlbCA9IHNpZ25hbDxGaWx0ZXJNYXRjaE1vZGVFeHRlbmRlZFR5cGUgfCBudWxsPihudWxsKTtcbiAgICBwdWJsaWMgdmFsdWVNb2RlbCA9IHNpZ25hbDxhbnkgfCBhbnlbXSB8IG51bGw+KG51bGwpO1xuICAgIHB1YmxpYyBjYXNlU2Vuc2l0aXZlTW9kZWwgPSBzaWduYWw8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gICAgcHJpdmF0ZSBzZXJpYWxpemF0aW9uQ2ZnOiBDb21tb25zU2VyaWFsaXphdGlvbkNvbmZpZyA9IHt9O1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGZpbHRlckFwcGx5U2VyaWFsaXphdGlvbkNvbmZpZ1RvQ21wKHRoaXMubW9kdWxlQ29uZmlnLCB0aGlzLnNlcmlhbGl6YXRpb25DZmcpO1xuXG4gICAgICAgIGVmZmVjdChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBlZGl0ID0gdGhpcy5maWx0ZXIoKTtcbiAgICAgICAgICAgICAgICBpZiAoZWRpdCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eTogZWRpdC5kZXNjcmlwdG9yLnByb3BlcnR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hNb2RlOiBlZGl0LmRpc3BsYXlNYXRjaE1vZGUgPz8gZWRpdC5tYXRjaE1vZGUgPz8gbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBlZGl0LmRpc3BsYXlWYWx1ZSA/PyBlZGl0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZTogZWRpdC5jYXNlU2Vuc2l0aXZlID8/IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGb3JtKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHthbGxvd1NpZ25hbFdyaXRlczogdHJ1ZX1cbiAgICAgICAgKTtcblxuICAgICAgICBlZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRvciA9IHRoaXMuc2VsZWN0ZWREZXNjcmlwdG9yKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB1bnRyYWNrZWQoKCkgPT4gdGhpcy52YWx1ZU1vZGVsKCkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgdmFsdWUgaWYgZmlsdGVyIHR5cGUgYW5kIHZhbHVlIHR5cGUgbWlzbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2NyaXB0b3I/LmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLlN0cmluZyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2UgfHwgdmFsdWUgPT09ICd0cnVlJyB8fCB2YWx1ZSA9PT0gJ2ZhbHNlJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIERhdGUpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2NyaXB0b3I/LmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLk51bWJlciAmJiB0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInICYmIGlzTmFOKCt2YWx1ZSkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoZGVzY3JpcHRvcj8uZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZUVudW0uRGF0ZSAmJiAhKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yPy5maWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlRW51bS5Mb29rdXAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3I/LmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLkxvb2t1cEVudW1cbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlTW9kZWwuc2V0KG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0b3I/LmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLkJvb2xlYW4gJiYgdHlwZW9mIHZhbHVlICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWVNb2RlbC5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHthbGxvd1NpZ25hbFdyaXRlczogdHJ1ZX1cbiAgICAgICAgKTtcblxuICAgICAgICBlZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hNb2RlT3B0aW9ucyA9IHRoaXMubWF0Y2hNb2RlT3B0aW9ucygpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoTW9kZSA9IHVudHJhY2tlZCgoKSA9PiB0aGlzLm1hdGNoTW9kZU1vZGVsKCkpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlckZvcm0gPSB1bnRyYWNrZWQoKCkgPT4gdGhpcy5maWx0ZXJGb3JtKCkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGVPcHRpb25zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgKCFtYXRjaE1vZGUgfHwgZmlsdGVyRm9ybS5jb250cm9sc1snbWF0Y2hNb2RlJ10/LnByaXN0aW5lIHx8IGZpbHRlckZvcm0uY29udHJvbHNbJ21hdGNoTW9kZSddPy51bnRvdWNoZWQgfHwgIW1hdGNoTW9kZU9wdGlvbnMuZmluZChvID0+IG8udmFsdWUgPT09IG1hdGNoTW9kZSkpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hNb2RlTW9kZWwuc2V0KGZpbHRlckdldERlZmF1bHRNYXRjaE1vZGUodGhpcy5zZWxlY3RlZERlc2NyaXB0b3IoKSwgbWF0Y2hNb2RlT3B0aW9ucykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7YWxsb3dTaWduYWxXcml0ZXM6IHRydWV9XG4gICAgICAgICk7XG5cbiAgICAgICAgZWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHVudHJhY2tlZCgoKSA9PiB0aGlzLnZhbHVlTW9kZWwoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZU1vZGVsLnNldChmaWx0ZXJBZGp1c3REaXNwbGF5VmFsdWVPbk1hdGNoTW9kZUNoYW5nZSh0aGlzLm1hdGNoTW9kZU1vZGVsKCkgPz8gdW5kZWZpbmVkLCBjdXJyZW50VmFsdWUpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7YWxsb3dTaWduYWxXcml0ZXM6IHRydWV9XG4gICAgICAgICk7XG5cbiAgICAgICAgdG9PYnNlcnZhYmxlKHRoaXMub3ZlcmxheSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChvID0+IChvID8gby5vblNob3cgOiBORVZFUikpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtRmllbGRzID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICAgICAgICAgJ2lucHV0Om5vdChbZGlzYWJsZWRdKSwgc2VsZWN0Om5vdChbZGlzYWJsZWRdKSwgdGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pLCBbcm9sZT1cImNvbWJvYm94XCJdOm5vdChbZGlzYWJsZWRdKSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVJbnB1dElkeCA9IGFjdGl2ZUVsID8gWy4uLmZvcm1GaWVsZHNdLmZpbmRJbmRleChlbCA9PiBhY3RpdmVFbC5pc0VxdWFsTm9kZShlbCkpIDogMDtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlSW5wdXRJZHggPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGRzWzBdLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Gb3JtU3VibWl0KGZvcm06IE5nRm9ybSkge1xuICAgICAgICB0aGlzLmZvcm1TdWJtaXR0ZWQuc2V0KHRydWUpO1xuXG4gICAgICAgIC8vIG1hcmsgYWxsIGFzIGRpcnR5XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZvcm0uY29udHJvbHMpIHtcbiAgICAgICAgICAgIGZvcm0uY29udHJvbHNba2V5XS5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLnByb3BlcnR5TW9kZWwoKTtcbiAgICAgICAgY29uc3QgbWF0Y2hNb2RlID0gdGhpcy5tYXRjaE1vZGVNb2RlbCgpO1xuICAgICAgICBpZiAoZm9ybS5pbnZhbGlkIHx8ICFwcm9wZXJ0eSB8fCAhbWF0Y2hNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1FcnJvck1lc3NhZ2Uuc2V0KFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnd2FybicsXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21uZ0ZpbHRlci5tZXNzYWdlcy5pbnZhbGlkRm9ybVRpdGxlJyksXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbW5nRmlsdGVyLm1lc3NhZ2VzLmludmFsaWRGb3JtTWVzc2FnZScpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcGx5LmVtaXQoe1xuICAgICAgICAgICAgcHJvcGVydHk6IHByb3BlcnR5LFxuICAgICAgICAgICAgbWF0Y2hNb2RlOiBtYXRjaE1vZGUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZU1vZGVsKCksXG4gICAgICAgICAgICBjYXNlU2Vuc2l0aXZlOiB0aGlzLmNhc2VTZW5zaXRpdmVNb2RlbCgpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHJlc2V0dGluZyB0aGUgZm9ybSBpcyBkb25lIGZyb20gdGhlIHBhcmVudCBjb21wb25lbnQgKGZpbHRlci1vdmVybGF5LXdpdGgtdGFnKSBmb3Igc21vb3RoZXIgYW5pbWF0aW9uc1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNldEZvcm0odmFsdWU/OiBGaWx0ZXJGb3JtTW9kZWwpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtKCkucmVzZXRGb3JtKHZhbHVlKTtcbiAgICAgICAgLy8gc29tZWhvdyBoYXZlIHRvIHNldCBjYXNlIHNlbnNpdGl2aXR5IG1hbnVhbGx5XG4gICAgICAgIHRoaXMuY2FzZVNlbnNpdGl2ZU1vZGVsLnNldCh2YWx1ZT8uY2FzZVNlbnNpdGl2ZSA/PyBmYWxzZSk7XG4gICAgICAgIHRoaXMuZm9ybVN1Ym1pdHRlZC5zZXQoZmFsc2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJvcGVydHlMYWJlbEtleShmaWx0ZXJEZXNjcmlwdG9yOiBGaWx0ZXJEZXNjcmlwdG9yPGFueSwgYW55Pikge1xuICAgICAgICBsZXQgbGFiZWxLZXk6IHN0cmluZztcbiAgICAgICAgaWYgKGZpbHRlckRlc2NyaXB0b3IudGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGFiZWxLZXkgPSBmaWx0ZXJEZXNjcmlwdG9yLnRpdGxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFiZWxLZXkgPSBnZXRJMThuVHlwZVByb3BlcnR5S2V5KHRoaXMubW9kZWwoKS5pMThuQmFzZUtleSwgZmlsdGVyRGVzY3JpcHRvci5wcm9wZXJ0eSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhYmVsS2V5O1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIEZpbHRlckZvcm1Nb2RlbCB7XG4gICAgcHJvcGVydHk6IHN0cmluZyB8IG51bGw7XG4gICAgbWF0Y2hNb2RlOiBGaWx0ZXJNYXRjaE1vZGVFeHRlbmRlZFR5cGUgfCBudWxsO1xuICAgIHZhbHVlOiBhbnkgfCBudWxsO1xuICAgIGNhc2VTZW5zaXRpdmU6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBQcm9wZXJ0eU1vZGVsIHtcbiAgICBwcm9wZXJ0eTogc3RyaW5nO1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgZGlzYWJsZWQ6IGJvb2xlYW47XG59XG4iLCI8ZGl2PlxuICAgIDxkaXY+XG4gICAgICAgIDxoNT57eyBmaWx0ZXIoKSA/ICgnbW5nRmlsdGVyLnRpdGxlRWRpdCcgfCB0cmFuc2xhdGUpIDogKCdtbmdGaWx0ZXIudGl0bGVBZGQnIHwgdHJhbnNsYXRlKSB9fTwvaDU+XG4gICAgPC9kaXY+XG4gICAgPGZvcm0gI2ZpbHRlckZvcm09XCJuZ0Zvcm1cIiAobmdTdWJtaXQpPVwib25Gb3JtU3VibWl0KGZpbHRlckZvcm0pXCIgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlciBsZzpmbGV4LXJvdyBnYXAtM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGxnOnctYXV0b1wiPlxuICAgICAgICAgICAgPG1uZy1kcm9wZG93blxuICAgICAgICAgICAgICAgIG5hbWU9XCJwcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgaWQ9XCJwcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIxXCJcbiAgICAgICAgICAgICAgICAjcHJvcGVydHlDb250cm9sPVwibmdNb2RlbFwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwcm9wZXJ0eU1vZGVsXCJcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJwcm9wZXJ0eU9wdGlvbnNXaXRoVHJhbnNsYXRpb25zKClcIlxuICAgICAgICAgICAgICAgIG9wdGlvbnNWYWx1ZVByb3BlcnR5PVwicHJvcGVydHlcIlxuICAgICAgICAgICAgICAgIG9wdGlvbnNEaXNhYmxlZFByb3BlcnR5PVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIG9wdGlvbnNMYWJlbFByb3BlcnR5PVwibGFiZWxcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInbW5nRmlsdGVyLnByb3BlcnR5JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgW29wdGlvbnNMYWJlbFRyYW5zbGF0ZV09XCIhcHJvcGVydHlTZWFyY2goKVwiXG4gICAgICAgICAgICAgICAgW2lubGluZVNlYXJjaF09XCJwcm9wZXJ0eVNlYXJjaCgpXCJcbiAgICAgICAgICAgICAgICByZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRWRpdCgpXCJcbiAgICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwibnVsbFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGxnOnctYXV0b1wiPlxuICAgICAgICAgICAgPG1uZy1kcm9wZG93blxuICAgICAgICAgICAgICAgIG5hbWU9XCJtYXRjaE1vZGVcIlxuICAgICAgICAgICAgICAgIGlkPVwibWF0Y2hNb2RlXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1hdGNoTW9kZU1vZGVsXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGxcIlxuICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIm1hdGNoTW9kZU9wdGlvbnMoKVwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidtbmdGaWx0ZXIubWF0Y2hNb2RlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFwcm9wZXJ0eUNvbnRyb2wudmFsdWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxpZ24tc2VsZi1lbmRcIlxuICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2FwcGVuZFRvXT1cIm51bGxcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmICghKG1hdGNoTW9kZU1vZGVsKCkgPT09IEZpbHRlck1hdGNoTW9kZS5FeGlzdHMgfHwgbWF0Y2hNb2RlTW9kZWwoKSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkRvZXNOb3RFeGlzdCkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgbGc6dy1hdXRvIGZsZXggZmxleC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICBAc3dpdGNoIChzZWxlY3RlZERlc2NyaXB0b3IoKT8uZmlsdGVyVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBAY2FzZSAoRmlsdGVyVHlwZUVudW0uTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG1hdGNoTW9kZU1vZGVsKCkgPT09IEZpbHRlck1hdGNoTW9kZS5CZXR3ZWVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy1udW1iZXItcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibW5nLWNvbHVtbi1maWx0ZXItbnVtYmVyLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZU1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidtbmdGaWx0ZXIudmFsdWUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZUdyb3VwaW5nXT1cInNlbGVjdGVkRGVzY3JpcHRvcigpPy5udW1iZXJVc2VHcm91cGluZyA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5GcmFjdGlvbkRpZ2l0c109XCJudW1iZXJDb25maWcoKT8uZnJhY3Rpb25zTWluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heEZyYWN0aW9uRGlnaXRzXT1cIm51bWJlckNvbmZpZygpPy5mcmFjdGlvbnNNYXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1cInRydWVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHlsZUNsYXNzPVwibW5nLWNvbHVtbi1maWx0ZXItbnVtYmVyLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZU1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlQ2xhc3NdPVwiJ3ctZnVsbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ21uZ0ZpbHRlci52YWx1ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdXNlR3JvdXBpbmddPVwic2VsZWN0ZWREZXNjcmlwdG9yKCk/Lm51bWJlclVzZUdyb3VwaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cIm51bWJlckNvbmZpZygpPy5mcmFjdGlvbnNNaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4RnJhY3Rpb25EaWdpdHNdPVwibnVtYmVyQ29uZmlnKCk/LmZyYWN0aW9uc01heFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhbWF0Y2hNb2RlTW9kZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBAY2FzZSAoRmlsdGVyVHlwZUVudW0uQm9vbGVhbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2hlY2tib3ggWyhuZ01vZGVsKV09XCJ2YWx1ZU1vZGVsXCIgW2Rpc2FibGVkXT1cIiFtYXRjaE1vZGVNb2RlbCgpXCIgbmFtZT1cInZhbHVlXCIgYmluYXJ5PVwidHJ1ZVwiIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEZpbHRlclR5cGVFbnVtLkRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobWF0Y2hNb2RlTW9kZWwoKSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkJldHdlZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bW5nLWRhdGUtcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZU1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cImRhdGVDb25maWcoKT8uc2hvd1RpbWUgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1NlY29uZHNdPVwiZGF0ZUNvbmZpZygpPy5zaG93U2Vjb25kcyA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRlRm9ybWF0XT1cImRhdGVDb25maWcoKT8uZm9ybWF0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidtbmdGaWx0ZXIudmFsdWUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9XCJ0cnVlXCI+PC9tbmctZGF0ZS1yYW5nZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNhbGVuZGFyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZUNsYXNzXT1cIid3LWZ1bGwnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidtbmdGaWx0ZXIudmFsdWUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dJY29uXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RpbWVdPVwiZGF0ZUNvbmZpZygpPy5zaG93VGltZSA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93U2Vjb25kc109XCJkYXRlQ29uZmlnKCk/LnNob3dTZWNvbmRzID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGVGb3JtYXRdPVwiZGF0ZUNvbmZpZygpPy5mb3JtYXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlyc3REYXlPZldlZWtdPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhbWF0Y2hNb2RlTW9kZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jYWxlbmRhcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAY2FzZSAoRmlsdGVyVHlwZUVudW0uTG9va3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9va3VwRmlsdGVyXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEZpbHRlclR5cGVFbnVtLkxvb2t1cEVudW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb29rdXBGaWx0ZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNlbGVjdGVkRGVzY3JpcHRvcigpPy5nZW5lcmljVmFsdWVQcm92aWRlciAmJiBnZW5lcmljVmFsdWVEYXRhUHJvdmlkZXIoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gY29uZGl0aW9uYWwgcmVuZGVyaW5nIG9uIHRoZSBwbGFjZWhvbGRlciBpcyB0aGVyZSBiZWNhdXNlIG9mIHN0eWxpbmcgaXNzdWVzIHdpdGggUHJpbWVORyAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIChQcmltZU5HIGFwcGxpZXMgdGhlIC5wLXBsYWNlaG9sZGVyIGNsYXNzIHRvIHByb2dyYW1tYXRpY2FsbHkgc2V0IHZhbHVlcywgbWFraW5nIHRoZW0gZ3JleWVkIG91dCkgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bW5nLWRyb3Bkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhbHVlTW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhUHJvdmlkZXJdPVwiZ2VuZXJpY1ZhbHVlRGF0YVByb3ZpZGVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzTmFtZV09XCJzZWxlY3RlZERlc2NyaXB0b3IoKT8uY2xhc3NOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkcm9wZG93bkNsYXNzTmFtZV09XCJzZWxlY3RlZERlc2NyaXB0b3IoKT8uZHJvcGRvd25DbGFzc05hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInZhbHVlTW9kZWwoKSA/IHVuZGVmaW5lZCA6ICgnbW5nRmlsdGVyLnZhbHVlJyB8IHRyYW5zbGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dJbnB1dD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFtYXRjaE1vZGVNb2RlbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcHBlbmRUb109XCJudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwidHJ1ZVwiPjwvbW5nLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGVuYWJsZUNhc2VTZW5zaXRpdmUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtdG9nZ2xlQnV0dG9uIFsobmdNb2RlbCldPVwiY2FzZVNlbnNpdGl2ZU1vZGVsXCIgbmFtZT1cImNhc2VTZW5zaXRpdmVcIiBzdHlsZUNsYXNzPVwibWwtMiBwLTEgcC1idXR0b25cIiBvbkxhYmVsPVwiQWFcIiBvZmZMYWJlbD1cIkFhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1pbnB1dC1pY29uLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZU1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1uZy1jb2x1bW4tZmlsdGVyLXN0cmluZy1pbnB1dCB3LWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIucGxhY2Vob2xkZXJdPVwiJ21uZ0ZpbHRlci52YWx1ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21uZ0lucHV0VHJpbV09XCJzZWxlY3RlZERlc2NyaXB0b3IoKT8udHJpbU9wdGlvbiFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFtYXRjaE1vZGVNb2RlbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInbW5nRmlsdGVyLnZhbHVlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1cInRydWVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGVuYWJsZUNhc2VTZW5zaXRpdmUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtYnV0dG9uLWlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtdG9nZ2xlQnV0dG9uIFsobmdNb2RlbCldPVwiY2FzZVNlbnNpdGl2ZU1vZGVsXCIgbmFtZT1cImNhc2VTZW5zaXRpdmVcIiBzdHlsZUNsYXNzPVwibWwtMSBwLTEgcC1idXR0b24tc21cIiBvbkxhYmVsPVwiQWFcIiBvZmZMYWJlbD1cIkFhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xvb2t1cEZpbHRlcj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzZWxlY3RlZERlc2NyaXB0b3JBc0xvb2t1cCgpOyBhcyBsb29rdXBGaWx0ZXJEZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAc3dpdGNoIChsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLmxvb2t1cFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAobG9va3VwVHlwZUF1dG9jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bW5nLWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZU1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YVByb3ZpZGVyXT1cImxvb2t1cEZpbHRlckRlc2NyaXB0b3IuZGF0YVByb3ZpZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zVHJhY2tQcm9wZXJ0eV09XCJsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLm9wdGlvbnNWYWx1ZVByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zVmFsdWVQcm9wZXJ0eV09XCJsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLm9wdGlvbnNWYWx1ZVByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zTGFiZWxQcm9wZXJ0eV09XCJsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLm9wdGlvbnNMYWJlbFByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zTGFiZWxUcmFuc2xhdGVdPVwibG9va3VwRmlsdGVyRGVzY3JpcHRvci5vcHRpb25zTGFiZWxUcmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpc2VsZWN0XT1cImxvb2t1cEZpbHRlckRlc2NyaXB0b3IubXVsdGlzZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9DbGVhcl09XCJsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLmF1dG9jb21wbGV0ZUF1dG9DbGVhciA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3Blbk9uRm9jdXNdPVwibG9va3VwRmlsdGVyRGVzY3JpcHRvci5hdXRvY29tcGxldGVBdXRvQ2xlYXIgPz8gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5saW5lU2VhcmNoXT1cImxvb2t1cEZpbHRlckRlc2NyaXB0b3IuYXV0b2NvbXBsZXRlSW5saW5lU2VhcmNoID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInbW5nRmlsdGVyLnZhbHVlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3NOYW1lXT1cImxvb2t1cEZpbHRlckRlc2NyaXB0b3IuY2xhc3NOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkcm9wZG93bkNsYXNzTmFtZV09XCJsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLmRyb3Bkb3duQ2xhc3NOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWFyY2hUcmltXT1cInNlbGVjdGVkRGVzY3JpcHRvcigpPy50cmltT3B0aW9uIVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIW1hdGNoTW9kZU1vZGVsKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbW5nLWF1dG9jb21wbGV0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKGxvb2t1cFR5cGVEcm9wZG93bikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bW5nLWRyb3Bkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhbHVlTW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhUHJvdmlkZXJdPVwibG9va3VwRmlsdGVyRGVzY3JpcHRvci5kYXRhUHJvdmlkZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNWYWx1ZVByb3BlcnR5XT1cImxvb2t1cEZpbHRlckRlc2NyaXB0b3Iub3B0aW9uc1ZhbHVlUHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNMYWJlbFByb3BlcnR5XT1cImxvb2t1cEZpbHRlckRlc2NyaXB0b3Iub3B0aW9uc0xhYmVsUHJvcGVydHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNMYWJlbFRyYW5zbGF0ZV09XCJsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLm9wdGlvbnNMYWJlbFRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbXVsdGlzZWxlY3RdPVwibG9va3VwRmlsdGVyRGVzY3JpcHRvci5tdWx0aXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ21uZ0ZpbHRlci52YWx1ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzTmFtZV09XCJsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLmNsYXNzTmFtZSArICcgdy1mdWxsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZHJvcGRvd25DbGFzc05hbWVdPVwibG9va3VwRmlsdGVyRGVzY3JpcHRvci5kcm9wZG93bkNsYXNzTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q2xlYXI9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIW1hdGNoTW9kZU1vZGVsKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FwcGVuZFRvXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbW5nLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSBpZiAoc2VsZWN0ZWREZXNjcmlwdG9yKCk/LmlzR2VuZXJpY0ZpbHRlciAmJiBnZW5lcmljVmFsdWVEYXRhUHJvdmlkZXIoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy1kcm9wZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YVByb3ZpZGVyXT1cImdlbmVyaWNWYWx1ZURhdGFQcm92aWRlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ21uZ0ZpbHRlci52YWx1ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dDbGVhcj1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIW1hdGNoTW9kZU1vZGVsKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcHBlbmRUb109XCJudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbW5nLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICAgIDxidXR0b24gcEJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJhbGlnbi1zZWxmLWVuZFwiPlxuICAgICAgICAgICAgICAgIHt7IChmaWx0ZXIoKSA/ICdnZW5lcmFsLmFwcGx5JyA6ICdnZW5lcmFsLmFkZCcpIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9mb3JtPlxuICAgIEBpZiAoZm9ybVN1Ym1pdHRlZCgpICYmIGZpbHRlckZvcm0uaW52YWxpZCkge1xuICAgICAgICA8cC1tZXNzYWdlcyBbdmFsdWVdPVwiZm9ybUVycm9yTWVzc2FnZSgpXCIgY2xhc3M9XCJ3LWZ1bGxcIj48L3AtbWVzc2FnZXM+XG4gICAgfVxuPC9kaXY+XG4iXX0=
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGFibGUvc3JjL2NvbXBvbmVudHMvZmlsdGVyL2ZpbHRlci1mb3JtL2ZpbHRlci1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3RhYmxlL3NyYy9jb21wb25lbnRzL2ZpbHRlci9maWx0ZXItZm9ybS9maWx0ZXItZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFFLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0SyxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsWUFBWSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDNUUsT0FBTyxFQUFDLFdBQVcsRUFBUyxNQUFNLGdCQUFnQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxlQUFlLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRWhELE9B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Z0I7d0JBQ2hCLGNBQWM7d0JBQ2Qsa0JBQWtCO3FCQUNyQixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTSxRQUN6Qzt3QkFDRixLQUFLLEVBQUUsa0JBQWtCO3FCQUM1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TmdDbGFzcywgTmdUZW1wbGF0ZU91dGxldH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgYm9vbGVhbkF0dHJpYnV0ZSwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCwgdmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7Rm9ybXNNb2R1bGUsIE5nRm9ybX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0NhbGVuZGFyTW9kdWxlfSBmcm9tICdwcmltZW5nL2NhbGVuZGFyJztcbmltcG9ydCB7Q2hlY2tib3hNb2R1bGV9IGZyb20gJ3ByaW1lbmcvY2hlY2tib3gnO1xuaW1wb3J0IHtEcm9wZG93bk1vZHVsZX0gZnJvbSAncHJpbWVuZy9kcm9wZG93bic7XG5pbXBvcnQge0lucHV0TnVtYmVyTW9kdWxlfSBmcm9tICdwcmltZW5nL2lucHV0bnVtYmVyJztcbmltcG9ydCB7SW5wdXRUZXh0TW9kdWxlfSBmcm9tICdwcmltZW5nL2lucHV0dGV4dCc7XG5pbXBvcnQge01lc3NhZ2VzTW9kdWxlfSBmcm9tICdwcmltZW5nL21lc3NhZ2VzJztcbmltcG9ydCB7T3ZlcmxheVBhbmVsfSBmcm9tICdwcmltZW5nL292ZXJsYXlwYW5lbCc7XG5pbXBvcnQge1RvZ2dsZUJ1dHRvbk1vZHVsZX0gZnJvbSAncHJpbWVuZy90b2dnbGVidXR0b24nO1xuaW1wb3J0IHtORVZFUiwgc3dpdGNoTWFwfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtGaWx0ZXJNYXRjaE1vZGUsIEZpbHRlck1hdGNoTW9kZUV4dGVuZGVkVHlwZSwgSUxvb2t1cERhdGFQcm92aWRlciwgZ2V0STE4blR5cGVQcm9wZXJ0eUtleX0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9jb3JlJztcbmltcG9ydCB7RmlsdGVyRGVzY3JpcHRvciwgRmlsdGVyR2VuZXJpY0Rlc2NyaXB0b3IsIEZpbHRlckxvb2t1cERlc2NyaXB0b3IsIEZpbHRlckxvb2t1cFR5cGVFbnVtLCBGaWx0ZXJUeXBlRW51bX0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9maWx0ZXInO1xuaW1wb3J0IHtBdXRvY29tcGxldGVDb21wb25lbnQsIERhdGVSYW5nZUNvbXBvbmVudCwgRHJvcGRvd25Db21wb25lbnQsIElucHV0VHJpbURpcmVjdGl2ZSwgTnVtYmVyUmFuZ2VDb21wb25lbnR9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvZm9ybSc7XG5pbXBvcnQge2xvb2t1cERhdGFQcm92aWRlcldpdGhTZXJ2aWNlfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2Zvcm0vYXBpJztcbmltcG9ydCB7TW9kZWxEZXNjcmlwdG9yfSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL21vZGVsJztcblxuaW1wb3J0IHtmaWx0ZXJBZGp1c3REaXNwbGF5VmFsdWVPbk1hdGNoTW9kZUNoYW5nZSwgZmlsdGVyR2V0RGVmYXVsdE1hdGNoTW9kZX0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9maWx0ZXJzJztcbmltcG9ydCB7RmlsdGVyRm9ybUVtaXRFdmVudCwgRmlsdGVyTWV0YWRhdGEsIEZpbHRlclN0YXRlfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvZmlsdGVyLm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ21uZy10YWJsZS1maWx0ZXItZm9ybScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2ZpbHRlci1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybDogJy4vZmlsdGVyLWZvcm0uY29tcG9uZW50LnNjc3MnLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgRHJvcGRvd25Db21wb25lbnQsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIElucHV0VHJpbURpcmVjdGl2ZSxcbiAgICAgICAgTnVtYmVyUmFuZ2VDb21wb25lbnQsXG4gICAgICAgIElucHV0TnVtYmVyTW9kdWxlLFxuICAgICAgICBEYXRlUmFuZ2VDb21wb25lbnQsXG4gICAgICAgIENhbGVuZGFyTW9kdWxlLFxuICAgICAgICBBdXRvY29tcGxldGVDb21wb25lbnQsXG4gICAgICAgIENoZWNrYm94TW9kdWxlLFxuICAgICAgICBNZXNzYWdlc01vZHVsZSxcbiAgICAgICAgSW5wdXRUZXh0TW9kdWxlLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBEcm9wZG93bk1vZHVsZSxcbiAgICAgICAgVG9nZ2xlQnV0dG9uTW9kdWxlXG4gICAgXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiAnZmxleCBmbGV4LWdyb3ctMSdcbiAgICB9XG59KVxuZXhwb3J0IGNsYXNzIFRhYmxlRmlsdGVyRm9ybUNvbXBvbmVudCB7XG4gICAgcHVibGljIHJlYWRvbmx5IGxvb2t1cFR5cGVEcm9wZG93bjogRmlsdGVyTG9va3VwVHlwZUVudW0gPSBGaWx0ZXJMb29rdXBUeXBlRW51bS5Ecm9wZG93bjtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbG9va3VwVHlwZUF1dG9jb21wbGV0ZTogRmlsdGVyTG9va3VwVHlwZUVudW0gPSBGaWx0ZXJMb29rdXBUeXBlRW51bS5BdXRvY29tcGxldGU7XG4gICAgcHVibGljIHJlYWRvbmx5IEZpbHRlclR5cGVFbnVtID0gRmlsdGVyVHlwZUVudW07XG4gICAgcHVibGljIHJlYWRvbmx5IEZpbHRlck1hdGNoTW9kZSA9IEZpbHRlck1hdGNoTW9kZTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgZWxlbWVudFJlZiA9IGluamVjdChFbGVtZW50UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcblxuICAgIHB1YmxpYyB0aXRsZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgICBwdWJsaWMgbWV0YWRhdGEgPSBpbnB1dC5yZXF1aXJlZDxGaWx0ZXJNZXRhZGF0YVtdPigpO1xuICAgIHB1YmxpYyBnZW5lcmljRGVzY3JpcHRvciA9IGlucHV0PEZpbHRlckdlbmVyaWNEZXNjcmlwdG9yPigpO1xuICAgIHB1YmxpYyBtb2RlbCA9IGlucHV0LnJlcXVpcmVkPE1vZGVsRGVzY3JpcHRvcjxhbnk+PigpO1xuICAgIHB1YmxpYyBmaWx0ZXIgPSBpbnB1dDxGaWx0ZXJTdGF0ZT4oKTtcbiAgICBwdWJsaWMgb3ZlcmxheSA9IGlucHV0PE92ZXJsYXlQYW5lbD4oKTtcbiAgICBwdWJsaWMgZGlzYWJsZWRQcm9wZXJ0aWVzID0gaW5wdXQ8c3RyaW5nW10+KFtdKTtcbiAgICBwdWJsaWMgZW5hYmxlQ2FzZVNlbnNpdGl2ZSA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICAgIHB1YmxpYyBwcm9wZXJ0eVNlYXJjaCA9IGlucHV0KGZhbHNlLCB7dHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlfSk7XG5cbiAgICBwdWJsaWMgYXBwbHkgPSBvdXRwdXQ8RmlsdGVyRm9ybUVtaXRFdmVudD4oKTtcblxuICAgIHB1YmxpYyBwcm9wZXJ0eU9wdGlvbnNXaXRoVHJhbnNsYXRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBkaXNhYmxlZFByb3BlcnRpZXMgPSB0aGlzLmRpc2FibGVkUHJvcGVydGllcygpO1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmZpbHRlcigpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5tZXRhZGF0YSgpPy5tYXAoZCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDxQcm9wZXJ0eU1vZGVsPntcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGQuZGVzY3JpcHRvci5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IGQuZGVzY3JpcHRvci5pc0dlbmVyaWNGaWx0ZXIgPyBkLmRlc2NyaXB0b3IucHJvcGVydHkgOiB0aGlzLmdldFByb3BlcnR5TGFiZWxLZXkoZC5kZXNjcmlwdG9yKSxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ6ICFmaWx0ZXIgJiYgZGlzYWJsZWRQcm9wZXJ0aWVzLmluY2x1ZGVzKGQuZGVzY3JpcHRvci5wcm9wZXJ0eSlcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSkgPz8gW11cbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIHB1YmxpYyBzZWxlY3RlZEZpbHRlck1ldGFkYXRhID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IHRoaXMucHJvcGVydHlNb2RlbCgpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZXRhZGF0YSgpLmZpbmQoZCA9PiBkLmRlc2NyaXB0b3IucHJvcGVydHkgPT09IHByb3BlcnR5KTtcbiAgICB9KTtcblxuICAgIC8vIGNoYW5nZSB2YWx1ZSBsb29rdXAgZnVuY3Rpb24gdG8gaW5jbHVkZSB0aGUgcHJvcGVydHkgbmFtZSBvZiB0aGUgZ2VuZXJpYyBmaWx0ZXJcbiAgICBwdWJsaWMgZ2VuZXJpY1ZhbHVlRGF0YVByb3ZpZGVyID0gY29tcHV0ZWQ8SUxvb2t1cERhdGFQcm92aWRlcjxzdHJpbmcsIGFueSwgYW55LCAnZmllbGQnPiB8IHVuZGVmaW5lZD4oKCkgPT4ge1xuICAgICAgICBjb25zdCBnZW5lcmljVmFsdWVQcm92aWRlciA9IHRoaXMuZ2VuZXJpY0Rlc2NyaXB0b3IoKT8udmFsdWVMb29rdXA7XG5cbiAgICAgICAgaWYgKGdlbmVyaWNWYWx1ZVByb3ZpZGVyICYmIGdlbmVyaWNWYWx1ZVByb3ZpZGVyLnNlcnZpY2VUeXBlKSB7XG4gICAgICAgICAgICBjb25zdCBsb29rdXBGbiA9IGdlbmVyaWNWYWx1ZVByb3ZpZGVyLmxvb2t1cDtcbiAgICAgICAgICAgIHJldHVybiBsb29rdXBEYXRhUHJvdmlkZXJXaXRoU2VydmljZTxzdHJpbmcsIGFueSwgYW55LCAnZmllbGQnPihnZW5lcmljVmFsdWVQcm92aWRlci5zZXJ2aWNlVHlwZSkud2l0aExvb2t1cCgocGFyYW1zLCBzZXJ2aWNlLCBzZWFyY2gpID0+IHtcbiAgICAgICAgICAgICAgICBwYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ucGFyYW1zPy5maWx0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5zZWxlY3RlZEZpbHRlck1ldGFkYXRhKCk/LmRlc2NyaXB0b3IucHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hNb2RlOiB0aGlzLnNlbGVjdGVkRmlsdGVyTWV0YWRhdGEoKT8uZGVzY3JpcHRvci5maWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlRW51bS5Mb29rdXBFbnVtID8gRmlsdGVyTWF0Y2hNb2RlLkluIDogRmlsdGVyTWF0Y2hNb2RlLlN0YXJ0c1dpdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvb2t1cEZuKHBhcmFtcywgc2VydmljZSwgc2VhcmNoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9KTtcblxuICAgIHB1YmxpYyBzZWxlY3RlZERlc2NyaXB0b3JBc0xvb2t1cCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgZmlsdGVyRGVzY3JpcHRvciA9IHRoaXMuc2VsZWN0ZWRGaWx0ZXJNZXRhZGF0YSgpPy5kZXNjcmlwdG9yO1xuICAgICAgICByZXR1cm4gZmlsdGVyRGVzY3JpcHRvciAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAhZmlsdGVyRGVzY3JpcHRvci5pc0dlbmVyaWNGaWx0ZXIgJiZcbiAgICAgICAgICAgIChmaWx0ZXJEZXNjcmlwdG9yLmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLkxvb2t1cCB8fCBmaWx0ZXJEZXNjcmlwdG9yLmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLkxvb2t1cEVudW0pXG4gICAgICAgICAgICA/IChmaWx0ZXJEZXNjcmlwdG9yIGFzIEZpbHRlckxvb2t1cERlc2NyaXB0b3I8YW55LCBhbnk+KVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfSk7XG5cbiAgICBwdWJsaWMgaXNFZGl0ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5maWx0ZXIoKSAhPSBudWxsKTtcbiAgICBwdWJsaWMgZm9ybVN1Ym1pdHRlZCA9IHNpZ25hbChmYWxzZSk7XG4gICAgcHVibGljIGZvcm1FcnJvck1lc3NhZ2UgPSBzaWduYWw8YW55PihbXSk7XG5cbiAgICAvLyBVSSB1dGlsaXRpZXNcbiAgICBwcml2YXRlIGZpbHRlckZvcm0gPSB2aWV3Q2hpbGQucmVxdWlyZWQ8TmdGb3JtPignZmlsdGVyRm9ybScpO1xuXG4gICAgLy8gRmlsdGVyIGZvcm0gbW9kZWwgYW5kIGZvcm0gdXRpbGl0aWVzXG4gICAgcHVibGljIHByb3BlcnR5TW9kZWwgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gICAgcHVibGljIG1hdGNoTW9kZU1vZGVsID0gc2lnbmFsPEZpbHRlck1hdGNoTW9kZUV4dGVuZGVkVHlwZSB8IG51bGw+KG51bGwpO1xuICAgIHB1YmxpYyB2YWx1ZU1vZGVsID0gc2lnbmFsPGFueSB8IGFueVtdIHwgbnVsbD4obnVsbCk7XG4gICAgcHVibGljIGNhc2VTZW5zaXRpdmVNb2RlbCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgICBwdWJsaWMgaXNNdWx0aXNlbGVjdCA9IGNvbXB1dGVkKCgpID0+IHRoaXMubWF0Y2hNb2RlTW9kZWwoKSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkluIHx8IHRoaXMubWF0Y2hNb2RlTW9kZWwoKSA9PT0gRmlsdGVyTWF0Y2hNb2RlLk5vdEluKTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBlZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdCA9IHRoaXMuZmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgaWYgKGVkaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldEZvcm0oe1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGVkaXQubWV0YWRhdGEuZGVzY3JpcHRvci5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZTogZWRpdC5kaXNwbGF5TWF0Y2hNb2RlID8/IGVkaXQubWF0Y2hNb2RlID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZWRpdC5kaXNwbGF5VmFsdWUgPz8gZWRpdC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU6IGVkaXQuY2FzZVNlbnNpdGl2ZSA/PyBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7YWxsb3dTaWduYWxXcml0ZXM6IHRydWV9XG4gICAgICAgICk7XG5cbiAgICAgICAgZWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLnNlbGVjdGVkRmlsdGVyTWV0YWRhdGEoKT8uZGVzY3JpcHRvcjtcbiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHVudHJhY2tlZCgoKSA9PiB0aGlzLnZhbHVlTW9kZWwoKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyByZXNldCB2YWx1ZSBpZiBmaWx0ZXIgdHlwZSBhbmQgdmFsdWUgdHlwZSBtaXNtYXRjaFxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGVzY3JpcHRvcj8uZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZUVudW0uU3RyaW5nICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZSB8fCB2YWx1ZSA9PT0gJ3RydWUnIHx8IHZhbHVlID09PSAnZmFsc2UnIHx8IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAoZGVzY3JpcHRvcj8uZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZUVudW0uTnVtYmVyICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ251bWJlcicgJiYgaXNOYU4oK3ZhbHVlKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjcmlwdG9yPy5maWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlRW51bS5EYXRlICYmICEodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3I/LmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLkxvb2t1cCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcj8uZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZUVudW0uTG9va3VwRW51bVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWVNb2RlbC5zZXQobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRvcj8uZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZUVudW0uQm9vbGVhbiAmJiB0eXBlb2YgdmFsdWUgIT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZU1vZGVsLnNldChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge2FsbG93U2lnbmFsV3JpdGVzOiB0cnVlfVxuICAgICAgICApO1xuXG4gICAgICAgIGVmZmVjdChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaE1vZGVPcHRpb25zID0gdGhpcy5zZWxlY3RlZEZpbHRlck1ldGFkYXRhKCk/Lm1hdGNoTW9kZXMgPz8gW107XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hNb2RlID0gdW50cmFja2VkKCgpID0+IHRoaXMubWF0Y2hNb2RlTW9kZWwoKSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyRm9ybSA9IHVudHJhY2tlZCgoKSA9PiB0aGlzLmZpbHRlckZvcm0oKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZU9wdGlvbnMubGVuZ3RoID4gMCAmJlxuICAgICAgICAgICAgICAgICAgICAoIW1hdGNoTW9kZSB8fCBmaWx0ZXJGb3JtLmNvbnRyb2xzWydtYXRjaE1vZGUnXT8ucHJpc3RpbmUgfHwgZmlsdGVyRm9ybS5jb250cm9sc1snbWF0Y2hNb2RlJ10/LnVudG91Y2hlZCB8fCAhbWF0Y2hNb2RlT3B0aW9ucy5maW5kKG8gPT4gby52YWx1ZSA9PT0gbWF0Y2hNb2RlKSlcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRjaE1vZGVNb2RlbC5zZXQoZmlsdGVyR2V0RGVmYXVsdE1hdGNoTW9kZSh0aGlzLnNlbGVjdGVkRmlsdGVyTWV0YWRhdGEoKT8uZGVzY3JpcHRvciwgbWF0Y2hNb2RlT3B0aW9ucykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7YWxsb3dTaWduYWxXcml0ZXM6IHRydWV9XG4gICAgICAgICk7XG5cbiAgICAgICAgZWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHVudHJhY2tlZCgoKSA9PiB0aGlzLnZhbHVlTW9kZWwoKSk7XG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZU1vZGVsLnNldChmaWx0ZXJBZGp1c3REaXNwbGF5VmFsdWVPbk1hdGNoTW9kZUNoYW5nZSh0aGlzLm1hdGNoTW9kZU1vZGVsKCkgPz8gdW5kZWZpbmVkLCBjdXJyZW50VmFsdWUpKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7YWxsb3dTaWduYWxXcml0ZXM6IHRydWV9XG4gICAgICAgICk7XG5cbiAgICAgICAgdG9PYnNlcnZhYmxlKHRoaXMub3ZlcmxheSlcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcChvID0+IChvID8gby5vblNob3cgOiBORVZFUikpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCgpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtRmllbGRzID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICAgICAgICAgJ2lucHV0Om5vdChbZGlzYWJsZWRdKSwgc2VsZWN0Om5vdChbZGlzYWJsZWRdKSwgdGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pLCBbcm9sZT1cImNvbWJvYm94XCJdOm5vdChbZGlzYWJsZWRdKSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUVsID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVJbnB1dElkeCA9IGFjdGl2ZUVsID8gWy4uLmZvcm1GaWVsZHNdLmZpbmRJbmRleChlbCA9PiBhY3RpdmVFbC5pc0VxdWFsTm9kZShlbCkpIDogMDtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlSW5wdXRJZHggPD0gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3JtRmllbGRzWzBdLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Gb3JtU3VibWl0KGZvcm06IE5nRm9ybSkge1xuICAgICAgICB0aGlzLmZvcm1TdWJtaXR0ZWQuc2V0KHRydWUpO1xuXG4gICAgICAgIC8vIG1hcmsgYWxsIGFzIGRpcnR5XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZvcm0uY29udHJvbHMpIHtcbiAgICAgICAgICAgIGZvcm0uY29udHJvbHNba2V5XS5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLnByb3BlcnR5TW9kZWwoKTtcbiAgICAgICAgY29uc3QgbWF0Y2hNb2RlID0gdGhpcy5tYXRjaE1vZGVNb2RlbCgpO1xuICAgICAgICBpZiAoZm9ybS5pbnZhbGlkIHx8ICFwcm9wZXJ0eSB8fCAhbWF0Y2hNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmZvcm1FcnJvck1lc3NhZ2Uuc2V0KFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiAnd2FybicsXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnk6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21uZ0ZpbHRlci5tZXNzYWdlcy5pbnZhbGlkRm9ybVRpdGxlJyksXG4gICAgICAgICAgICAgICAgICAgIGRldGFpbDogdGhpcy50cmFuc2xhdGUuaW5zdGFudCgnbW5nRmlsdGVyLm1lc3NhZ2VzLmludmFsaWRGb3JtTWVzc2FnZScpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmFwcGx5LmVtaXQoe1xuICAgICAgICAgICAgcHJvcGVydHk6IHByb3BlcnR5LFxuICAgICAgICAgICAgbWF0Y2hNb2RlOiBtYXRjaE1vZGUsXG4gICAgICAgICAgICB2YWx1ZTogdGhpcy52YWx1ZU1vZGVsKCksXG4gICAgICAgICAgICBjYXNlU2Vuc2l0aXZlOiB0aGlzLmNhc2VTZW5zaXRpdmVNb2RlbCgpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHJlc2V0dGluZyB0aGUgZm9ybSBpcyBkb25lIGZyb20gdGhlIHBhcmVudCBjb21wb25lbnQgKGZpbHRlci1vdmVybGF5LXdpdGgtdGFnKSBmb3Igc21vb3RoZXIgYW5pbWF0aW9uc1xuICAgIH1cblxuICAgIHB1YmxpYyByZXNldEZvcm0odmFsdWU/OiBGaWx0ZXJGb3JtTW9kZWwpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJGb3JtKCkucmVzZXRGb3JtKHZhbHVlKTtcbiAgICAgICAgLy8gc29tZWhvdyBoYXZlIHRvIHNldCBjYXNlIHNlbnNpdGl2aXR5IG1hbnVhbGx5XG4gICAgICAgIHRoaXMuY2FzZVNlbnNpdGl2ZU1vZGVsLnNldCh2YWx1ZT8uY2FzZVNlbnNpdGl2ZSA/PyBmYWxzZSk7XG4gICAgICAgIHRoaXMuZm9ybVN1Ym1pdHRlZC5zZXQoZmFsc2UpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UHJvcGVydHlMYWJlbEtleShmaWx0ZXJEZXNjcmlwdG9yOiBGaWx0ZXJEZXNjcmlwdG9yPGFueSwgYW55Pikge1xuICAgICAgICBsZXQgbGFiZWxLZXk6IHN0cmluZztcbiAgICAgICAgaWYgKGZpbHRlckRlc2NyaXB0b3IudGl0bGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGFiZWxLZXkgPSBmaWx0ZXJEZXNjcmlwdG9yLnRpdGxlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFiZWxLZXkgPSBnZXRJMThuVHlwZVByb3BlcnR5S2V5KHRoaXMubW9kZWwoKS5pMThuQmFzZUtleSwgZmlsdGVyRGVzY3JpcHRvci5wcm9wZXJ0eSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxhYmVsS2V5O1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIEZpbHRlckZvcm1Nb2RlbCB7XG4gICAgcHJvcGVydHk6IHN0cmluZyB8IG51bGw7XG4gICAgbWF0Y2hNb2RlOiBGaWx0ZXJNYXRjaE1vZGVFeHRlbmRlZFR5cGUgfCBudWxsO1xuICAgIHZhbHVlOiBhbnkgfCBudWxsO1xuICAgIGNhc2VTZW5zaXRpdmU6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBQcm9wZXJ0eU1vZGVsIHtcbiAgICBwcm9wZXJ0eTogc3RyaW5nO1xuICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgZGlzYWJsZWQ6IGJvb2xlYW47XG59XG4iLCI8ZGl2PlxuICAgIDxkaXY+XG4gICAgICAgIDxoNT57eyBmaWx0ZXIoKSA/ICgnbW5nRmlsdGVyLnRpdGxlRWRpdCcgfCB0cmFuc2xhdGUpIDogKCdtbmdGaWx0ZXIudGl0bGVBZGQnIHwgdHJhbnNsYXRlKSB9fTwvaDU+XG4gICAgPC9kaXY+XG4gICAgPGZvcm0gI2ZpbHRlckZvcm09XCJuZ0Zvcm1cIiAobmdTdWJtaXQpPVwib25Gb3JtU3VibWl0KGZpbHRlckZvcm0pXCIgY2xhc3M9XCJmbGV4IGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLWNlbnRlciBsZzpmbGV4LXJvdyBnYXAtM1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGxnOnctYXV0b1wiPlxuICAgICAgICAgICAgPG1uZy1kcm9wZG93blxuICAgICAgICAgICAgICAgIG5hbWU9XCJwcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgaWQ9XCJwcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIxXCJcbiAgICAgICAgICAgICAgICAjcHJvcGVydHlDb250cm9sPVwibmdNb2RlbFwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwcm9wZXJ0eU1vZGVsXCJcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJwcm9wZXJ0eU9wdGlvbnNXaXRoVHJhbnNsYXRpb25zKClcIlxuICAgICAgICAgICAgICAgIG9wdGlvbnNWYWx1ZVByb3BlcnR5PVwicHJvcGVydHlcIlxuICAgICAgICAgICAgICAgIG9wdGlvbnNEaXNhYmxlZFByb3BlcnR5PVwiZGlzYWJsZWRcIlxuICAgICAgICAgICAgICAgIG9wdGlvbnNMYWJlbFByb3BlcnR5PVwibGFiZWxcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInbW5nRmlsdGVyLnByb3BlcnR5JyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgW29wdGlvbnNMYWJlbFRyYW5zbGF0ZV09XCIhcHJvcGVydHlTZWFyY2goKVwiXG4gICAgICAgICAgICAgICAgW2lubGluZVNlYXJjaF09XCJwcm9wZXJ0eVNlYXJjaCgpXCJcbiAgICAgICAgICAgICAgICByZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzRWRpdCgpXCJcbiAgICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwibnVsbFwiIC8+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGxnOnctYXV0b1wiPlxuICAgICAgICAgICAgPG1uZy1kcm9wZG93blxuICAgICAgICAgICAgICAgIG5hbWU9XCJtYXRjaE1vZGVcIlxuICAgICAgICAgICAgICAgIGlkPVwibWF0Y2hNb2RlXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm1hdGNoTW9kZU1vZGVsXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGxcIlxuICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInNlbGVjdGVkRmlsdGVyTWV0YWRhdGEoKT8ubWF0Y2hNb2RlcyA/PyBbXVwiXG4gICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidtbmdGaWx0ZXIubWF0Y2hNb2RlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFwcm9wZXJ0eUNvbnRyb2wudmFsdWVcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYWxpZ24tc2VsZi1lbmRcIlxuICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2FwcGVuZFRvXT1cIm51bGxcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgQGlmICghKG1hdGNoTW9kZU1vZGVsKCkgPT09IEZpbHRlck1hdGNoTW9kZS5FeGlzdHMgfHwgbWF0Y2hNb2RlTW9kZWwoKSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkRvZXNOb3RFeGlzdCkpIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgbGc6dy1hdXRvIGZsZXggZmxleC1jb2x1bW5cIj5cbiAgICAgICAgICAgICAgICBAc3dpdGNoIChzZWxlY3RlZEZpbHRlck1ldGFkYXRhKCk/LmRlc2NyaXB0b3I/LmZpbHRlclR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEZpbHRlclR5cGVFbnVtLk51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtYXRjaE1vZGVNb2RlbCgpID09PSBGaWx0ZXJNYXRjaE1vZGUuQmV0d2Vlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtbmctbnVtYmVyLXJhbmdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1uZy1jb2x1bW4tZmlsdGVyLW51bWJlci1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInbW5nRmlsdGVyLnZhbHVlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt1c2VHcm91cGluZ109XCJzZWxlY3RlZEZpbHRlck1ldGFkYXRhKCk/LmRlc2NyaXB0b3I/Lm51bWJlclVzZUdyb3VwaW5nID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cInNlbGVjdGVkRmlsdGVyTWV0YWRhdGEoKT8ubnVtYmVyQ29uZmlnPy5mcmFjdGlvbnNNaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4RnJhY3Rpb25EaWdpdHNdPVwic2VsZWN0ZWRGaWx0ZXJNZXRhZGF0YSgpPy5udW1iZXJDb25maWc/LmZyYWN0aW9uc01heFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0eWxlQ2xhc3M9XCJtbmctY29sdW1uLWZpbHRlci1udW1iZXItaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhbHVlTW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVDbGFzc109XCIndy1mdWxsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInbW5nRmlsdGVyLnZhbHVlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt1c2VHcm91cGluZ109XCJzZWxlY3RlZEZpbHRlck1ldGFkYXRhKCk/LmRlc2NyaXB0b3I/Lm51bWJlclVzZUdyb3VwaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbkZyYWN0aW9uRGlnaXRzXT1cInNlbGVjdGVkRmlsdGVyTWV0YWRhdGEoKT8ubnVtYmVyQ29uZmlnPy5mcmFjdGlvbnNNaW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4RnJhY3Rpb25EaWdpdHNdPVwic2VsZWN0ZWRGaWx0ZXJNZXRhZGF0YSgpPy5udW1iZXJDb25maWc/LmZyYWN0aW9uc01heFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhbWF0Y2hNb2RlTW9kZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBAY2FzZSAoRmlsdGVyVHlwZUVudW0uQm9vbGVhbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgPHAtY2hlY2tib3ggWyhuZ01vZGVsKV09XCJ2YWx1ZU1vZGVsXCIgW2Rpc2FibGVkXT1cIiFtYXRjaE1vZGVNb2RlbCgpXCIgbmFtZT1cInZhbHVlXCIgYmluYXJ5PVwidHJ1ZVwiIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEZpbHRlclR5cGVFbnVtLkRhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAobWF0Y2hNb2RlTW9kZWwoKSA9PT0gRmlsdGVyTWF0Y2hNb2RlLkJldHdlZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bW5nLWRhdGUtcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZU1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cInNlbGVjdGVkRmlsdGVyTWV0YWRhdGEoKT8uZGF0ZUNvbmZpZz8uc2hvd1RpbWUgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1NlY29uZHNdPVwic2VsZWN0ZWRGaWx0ZXJNZXRhZGF0YSgpPy5kYXRlQ29uZmlnPy5zaG93U2Vjb25kcyA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRlRm9ybWF0XT1cInNlbGVjdGVkRmlsdGVyTWV0YWRhdGEoKT8uZGF0ZUNvbmZpZz8uZm9ybWF0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidtbmdGaWx0ZXIudmFsdWUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9XCJ0cnVlXCI+PC9tbmctZGF0ZS1yYW5nZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNhbGVuZGFyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZUNsYXNzXT1cIid3LWZ1bGwnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidtbmdGaWx0ZXIudmFsdWUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dJY29uXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1RpbWVdPVwic2VsZWN0ZWRGaWx0ZXJNZXRhZGF0YSgpPy5kYXRlQ29uZmlnPy5zaG93VGltZSA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93U2Vjb25kc109XCJzZWxlY3RlZEZpbHRlck1ldGFkYXRhKCk/LmRhdGVDb25maWc/LnNob3dTZWNvbmRzID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGVGb3JtYXRdPVwic2VsZWN0ZWRGaWx0ZXJNZXRhZGF0YSgpPy5kYXRlQ29uZmlnPy5mb3JtYXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmlyc3REYXlPZldlZWtdPVwiMVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhbWF0Y2hNb2RlTW9kZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcC1jYWxlbmRhcj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAY2FzZSAoRmlsdGVyVHlwZUVudW0uTG9va3VwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9va3VwRmlsdGVyXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEZpbHRlclR5cGVFbnVtLkxvb2t1cEVudW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb29rdXBGaWx0ZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAZGVmYXVsdCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKHNlbGVjdGVkRmlsdGVyTWV0YWRhdGEoKT8uZGVzY3JpcHRvcj8uZ2VuZXJpY1ZhbHVlUHJvdmlkZXIgJiYgZ2VuZXJpY1ZhbHVlRGF0YVByb3ZpZGVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGNvbmRpdGlvbmFsIHJlbmRlcmluZyBvbiB0aGUgcGxhY2Vob2xkZXIgaXMgdGhlcmUgYmVjYXVzZSBvZiBzdHlsaW5nIGlzc3VlcyB3aXRoIFByaW1lTkcgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAoUHJpbWVORyBhcHBsaWVzIHRoZSAucC1wbGFjZWhvbGRlciBjbGFzcyB0byBwcm9ncmFtbWF0aWNhbGx5IHNldCB2YWx1ZXMsIG1ha2luZyB0aGVtIGdyZXllZCBvdXQpIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy1kcm9wZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZU1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YVByb3ZpZGVyXT1cImdlbmVyaWNWYWx1ZURhdGFQcm92aWRlcigpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc05hbWVdPVwic2VsZWN0ZWRGaWx0ZXJNZXRhZGF0YSgpPy5kZXNjcmlwdG9yPy5jbGFzc05hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Ryb3Bkb3duQ2xhc3NOYW1lXT1cInNlbGVjdGVkRmlsdGVyTWV0YWRhdGEoKT8uZGVzY3JpcHRvcj8uZHJvcGRvd25DbGFzc05hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cInZhbHVlTW9kZWwoKSA/IHVuZGVmaW5lZCA6ICgnbW5nRmlsdGVyLnZhbHVlJyB8IHRyYW5zbGF0ZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dJbnB1dD1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFtYXRjaE1vZGVNb2RlbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcHBlbmRUb109XCJudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwidHJ1ZVwiPjwvbW5nLWRyb3Bkb3duPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGVuYWJsZUNhc2VTZW5zaXRpdmUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtdG9nZ2xlQnV0dG9uIFsobmdNb2RlbCldPVwiY2FzZVNlbnNpdGl2ZU1vZGVsXCIgbmFtZT1cImNhc2VTZW5zaXRpdmVcIiBzdHlsZUNsYXNzPVwibWwtMiBwLTEgcC1idXR0b25cIiBvbkxhYmVsPVwiQWFcIiBvZmZMYWJlbD1cIkFhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicC1pbnB1dC1pY29uLXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZU1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1uZy1jb2x1bW4tZmlsdGVyLXN0cmluZy1pbnB1dCB3LWZ1bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIucGxhY2Vob2xkZXJdPVwiJ21uZ0ZpbHRlci52YWx1ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21uZ0lucHV0VHJpbV09XCJzZWxlY3RlZEZpbHRlck1ldGFkYXRhKCk/LmRlc2NyaXB0b3I/LnRyaW1PcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFtYXRjaE1vZGVNb2RlbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInbW5nRmlsdGVyLnZhbHVlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1cInRydWVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGVuYWJsZUNhc2VTZW5zaXRpdmUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtYnV0dG9uLWlucHV0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAtdG9nZ2xlQnV0dG9uIFsobmdNb2RlbCldPVwiY2FzZVNlbnNpdGl2ZU1vZGVsXCIgbmFtZT1cImNhc2VTZW5zaXRpdmVcIiBzdHlsZUNsYXNzPVwibWwtMSBwLTEgcC1idXR0b24tc21cIiBvbkxhYmVsPVwiQWFcIiBvZmZMYWJlbD1cIkFhXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2xvb2t1cEZpbHRlcj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChzZWxlY3RlZERlc2NyaXB0b3JBc0xvb2t1cCgpOyBhcyBsb29rdXBGaWx0ZXJEZXNjcmlwdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAc3dpdGNoIChsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLmxvb2t1cFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAobG9va3VwVHlwZUF1dG9jb21wbGV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bW5nLWF1dG9jb21wbGV0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZU1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YVByb3ZpZGVyXT1cImxvb2t1cEZpbHRlckRlc2NyaXB0b3IuZGF0YVByb3ZpZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zVHJhY2tQcm9wZXJ0eV09XCJsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLm9wdGlvbnNWYWx1ZVByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zVmFsdWVQcm9wZXJ0eV09XCJsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLm9wdGlvbnNWYWx1ZVByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zTGFiZWxQcm9wZXJ0eV09XCJsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLm9wdGlvbnNMYWJlbFByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zTGFiZWxUcmFuc2xhdGVdPVwibG9va3VwRmlsdGVyRGVzY3JpcHRvci5vcHRpb25zTGFiZWxUcmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpc2VsZWN0XT1cImlzTXVsdGlzZWxlY3QoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXV0b0NsZWFyXT1cImxvb2t1cEZpbHRlckRlc2NyaXB0b3IuYXV0b2NvbXBsZXRlQXV0b0NsZWFyID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcGVuT25Gb2N1c109XCJsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLmF1dG9jb21wbGV0ZUF1dG9DbGVhciA/PyB0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtpbmxpbmVTZWFyY2hdPVwibG9va3VwRmlsdGVyRGVzY3JpcHRvci5hdXRvY29tcGxldGVJbmxpbmVTZWFyY2ggPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidtbmdGaWx0ZXIudmFsdWUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc05hbWVdPVwibG9va3VwRmlsdGVyRGVzY3JpcHRvci5jbGFzc05hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Ryb3Bkb3duQ2xhc3NOYW1lXT1cImxvb2t1cEZpbHRlckRlc2NyaXB0b3IuZHJvcGRvd25DbGFzc05hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaFRyaW1dPVwic2VsZWN0ZWRGaWx0ZXJNZXRhZGF0YSgpPy5kZXNjcmlwdG9yPy50cmltT3B0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhbWF0Y2hNb2RlTW9kZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tbmctYXV0b2NvbXBsZXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAY2FzZSAobG9va3VwVHlwZURyb3Bkb3duKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtbmctZHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFQcm92aWRlcl09XCJsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLmRhdGFQcm92aWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc1ZhbHVlUHJvcGVydHldPVwibG9va3VwRmlsdGVyRGVzY3JpcHRvci5vcHRpb25zVmFsdWVQcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc0xhYmVsUHJvcGVydHldPVwibG9va3VwRmlsdGVyRGVzY3JpcHRvci5vcHRpb25zTGFiZWxQcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc0xhYmVsVHJhbnNsYXRlXT1cImxvb2t1cEZpbHRlckRlc2NyaXB0b3Iub3B0aW9uc0xhYmVsVHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXNlbGVjdF09XCJpc011bHRpc2VsZWN0KClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidtbmdGaWx0ZXIudmFsdWUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc05hbWVdPVwibG9va3VwRmlsdGVyRGVzY3JpcHRvci5jbGFzc05hbWUgKyAnIHctZnVsbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Ryb3Bkb3duQ2xhc3NOYW1lXT1cImxvb2t1cEZpbHRlckRlc2NyaXB0b3IuZHJvcGRvd25DbGFzc05hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NsZWFyPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFtYXRjaE1vZGVNb2RlbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcHBlbmRUb109XCJudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21uZy1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKHNlbGVjdGVkRmlsdGVyTWV0YWRhdGEoKT8uZGVzY3JpcHRvcj8uaXNHZW5lcmljRmlsdGVyICYmIGdlbmVyaWNWYWx1ZURhdGFQcm92aWRlcigpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bW5nLWRyb3Bkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZU1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRhUHJvdmlkZXJdPVwiZ2VuZXJpY1ZhbHVlRGF0YVByb3ZpZGVyKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInbW5nRmlsdGVyLnZhbHVlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NsZWFyPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhbWF0Y2hNb2RlTW9kZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FwcGVuZFRvXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9tbmctZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBwQnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImFsaWduLXNlbGYtZW5kXCI+XG4gICAgICAgICAgICAgICAge3sgKGZpbHRlcigpID8gJ2dlbmVyYWwuYXBwbHknIDogJ2dlbmVyYWwuYWRkJykgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Zvcm0+XG4gICAgQGlmIChmb3JtU3VibWl0dGVkKCkgJiYgZmlsdGVyRm9ybS5pbnZhbGlkKSB7XG4gICAgICAgIDxwLW1lc3NhZ2VzIFt2YWx1ZV09XCJmb3JtRXJyb3JNZXNzYWdlKClcIiBjbGFzcz1cInctZnVsbFwiPjwvcC1tZXNzYWdlcz5cbiAgICB9XG48L2Rpdj5cbiJdfQ==