@mediusinc/mng-commons 5.4.0 → 5.5.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) 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/models/version.model.d.ts +16 -4
  6. package/core/reactivity/effect.d.ts +16 -0
  7. package/esm2022/core/components/notification/notification-wrapper.component.mjs +4 -4
  8. package/esm2022/core/components/pages/error/error.page.component.mjs +4 -4
  9. package/esm2022/core/components/pages/not-found/not-found.page.component.mjs +4 -4
  10. package/esm2022/core/data-list/data-list-params-helpers.mjs +18 -3
  11. package/esm2022/core/descriptors/table.descriptor.mjs +1 -1
  12. package/esm2022/core/directives/component.directive.mjs +4 -4
  13. package/esm2022/core/directives/rerender.directive.mjs +25 -0
  14. package/esm2022/core/directives/template.directive.mjs +4 -4
  15. package/esm2022/core/index.mjs +4 -1
  16. package/esm2022/core/models/version.model.mjs +1 -1
  17. package/esm2022/core/pipes/boolean.pipe.mjs +6 -6
  18. package/esm2022/core/pipes/class-map.pipe.mjs +4 -4
  19. package/esm2022/core/pipes/enum.pipe.mjs +4 -4
  20. package/esm2022/core/pipes/enumerate-async.pipe.mjs +4 -4
  21. package/esm2022/core/pipes/enumerate.pipe.mjs +4 -4
  22. package/esm2022/core/pipes/getter.pipe.mjs +5 -5
  23. package/esm2022/core/pipes/i18n-property.pipe.mjs +4 -4
  24. package/esm2022/core/pipes/json-path.pipe.mjs +4 -4
  25. package/esm2022/core/pipes/parametrize.pipe.mjs +4 -4
  26. package/esm2022/core/pipes/template.pipe.mjs +4 -4
  27. package/esm2022/core/reactivity/effect.mjs +22 -0
  28. package/esm2022/core/security/permission.service.mjs +4 -4
  29. package/esm2022/core/services/commons-init.service.mjs +4 -4
  30. package/esm2022/core/services/commons-router.service.mjs +4 -4
  31. package/esm2022/core/services/commons-storage.service.mjs +4 -4
  32. package/esm2022/core/services/commons.service.mjs +8 -8
  33. package/esm2022/filter/descriptors/filter-lookup.descriptor.mjs +32 -25
  34. package/esm2022/filter/descriptors/filter.descriptor.mjs +53 -1
  35. package/esm2022/form/components/autocomplete/autocomplete.component.mjs +4 -4
  36. package/esm2022/form/components/date-range/date-range.component.mjs +4 -4
  37. package/esm2022/form/components/dropdown/dropdown.component.mjs +4 -4
  38. package/esm2022/form/components/number-range/number-range.component.mjs +4 -4
  39. package/esm2022/form/directives/input-trim.directive.mjs +4 -4
  40. package/esm2022/table/api/descriptors/sort.descriptor.mjs +2 -2
  41. package/esm2022/table/api/descriptors/table.descriptor.mjs +31 -7
  42. package/esm2022/table/components/column-filter/column-filter.component.mjs +33 -40
  43. package/esm2022/table/components/column-value/column-value.component.mjs +6 -6
  44. package/esm2022/table/components/filter/filter-active-tag/filter-active-tag.component.mjs +7 -7
  45. package/esm2022/table/components/filter/filter-form/filter-form.component.mjs +28 -35
  46. package/esm2022/table/components/filter/filter-overlay-with-tag/filter-overlay-with-tag.component.mjs +44 -45
  47. package/esm2022/table/components/table/table.component.mjs +114 -430
  48. package/esm2022/table/helpers/filters.mjs +9 -25
  49. package/esm2022/table/helpers/table.mjs +24 -0
  50. package/esm2022/table/index.mjs +2 -2
  51. package/esm2022/table/models/column-preferences.model.mjs +1 -1
  52. package/esm2022/table/models/filter.model.mjs +1 -1
  53. package/esm2022/table/pipes/filter-value.pipe.mjs +4 -4
  54. package/esm2022/table/pipes/locale-default-row-class.pipe.mjs +4 -4
  55. package/esm2022/table/pipes/table-column-filter-class.pipe.mjs +4 -4
  56. package/esm2022/table/services/table-data.service.mjs +194 -0
  57. package/esm2022/table/services/table-metadata.service.mjs +136 -0
  58. package/esm2022/table/services/table-preferences.service.mjs +142 -0
  59. package/esm2022/tableview/action/components/action/action.component.mjs +6 -7
  60. package/esm2022/tableview/action/components/editor/action-editor.component.mjs +4 -4
  61. package/esm2022/tableview/action/components/editor/injector-context/action-editor-injector-context.component.mjs +69 -46
  62. package/esm2022/tableview/action/components/localization/data-language-dropdown.component.mjs +4 -4
  63. package/esm2022/tableview/action/components/route/action-route.component.mjs +5 -6
  64. package/esm2022/tableview/action/components/table/action-table.component.mjs +6 -6
  65. package/esm2022/tableview/action/helpers/action-execution.mjs +25 -0
  66. package/esm2022/tableview/action/models/execution/action-instance.model.mjs +2 -3
  67. package/esm2022/tableview/action/services/action-executor.service.mjs +12 -79
  68. package/esm2022/tableview/action/services/component-action-executor.service.mjs +4 -4
  69. package/esm2022/tableview/action/services/data-provider-executor.service.mjs +4 -4
  70. package/esm2022/tableview/action/services/navigation.service.mjs +4 -4
  71. package/esm2022/tableview/action/services/root-action-executor.service.mjs +4 -4
  72. package/esm2022/tableview/action/services/view-container.service.mjs +4 -4
  73. package/esm2022/tableview/api/action/descriptors/action-confirmation.descriptor.mjs +13 -1
  74. package/esm2022/tableview/api/action/descriptors/action-editor.descriptor.mjs +67 -10
  75. package/esm2022/tableview/api/action/descriptors/action-link-descriptor.factory.mjs +2 -2
  76. package/esm2022/tableview/api/action/descriptors/action-link.descriptor.mjs +17 -1
  77. package/esm2022/tableview/api/action/descriptors/action.descriptor.mjs +32 -7
  78. package/esm2022/tableview/api/action/models/execution/action-instance-state.model.mjs +2 -2
  79. package/esm2022/tableview/api/editor/descriptors/field-many.descriptor.mjs +2 -1
  80. package/esm2022/tableview/api/editor/models/formly-custom-field.model.mjs +4 -4
  81. package/esm2022/tableview/api/tableview/descriptors/tableview.descriptor.mjs +13 -5
  82. package/esm2022/tableview/api/tableview/helpers/tableview-default-actions.mjs +3 -2
  83. package/esm2022/tableview/api/tableview/helpers/tableview-descriptor-helpers.mjs +2 -2
  84. package/esm2022/tableview/editor/components/editor/auto-save-status/auto-save-status.component.mjs +4 -4
  85. package/esm2022/tableview/editor/components/editor/form-editor.component.mjs +31 -38
  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 +5 -6
  96. package/esm2022/tableview/editor/components/formly/fields/formly-field-table-dialog-multiselect/formly-field-table-dialog-multiselect.component.mjs +6 -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 +4 -4
  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 +31 -7
  116. package/fesm2022/mediusinc-mng-commons-table-api.mjs.map +1 -1
  117. package/fesm2022/mediusinc-mng-commons-table.mjs +704 -606
  118. package/fesm2022/mediusinc-mng-commons-table.mjs.map +1 -1
  119. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs +146 -26
  120. package/fesm2022/mediusinc-mng-commons-tableview-api.mjs.map +1 -1
  121. package/fesm2022/mediusinc-mng-commons-tableview.mjs +260 -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 +20 -6
  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 +4 -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/fields/formly-field-fieldset/formly-field-fieldset.component.d.ts +1 -1
  160. package/tableview/editor/components/formly/fields/formly-field-type.abstract.component.d.ts +2 -1
  161. package/tableview/index.d.ts +0 -1
  162. package/version-info.json +6 -6
  163. package/esm2022/table/services/data-list.service.mjs +0 -29
  164. package/esm2022/tableview/action/models/execution/action-instance-state.model.mjs +0 -32
  165. package/table/services/data-list.service.d.ts +0 -19
  166. package/tableview/action/models/execution/action-instance-state.model.d.ts +0 -30
@@ -3,19 +3,19 @@ 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';
10
9
  import { InputNumberModule } from 'primeng/inputnumber';
11
10
  import { InputTextModule } from 'primeng/inputtext';
12
11
  import { MessagesModule } from 'primeng/messages';
12
+ import { ToggleButtonModule } from 'primeng/togglebutton';
13
13
  import { NEVER, switchMap } from 'rxjs';
14
- import { COMMONS_MODULE_CONFIG_IT, FilterMatchMode, getI18nTypePropertyKey } from '@mediusinc/mng-commons/core';
14
+ import { FilterMatchMode, getI18nTypePropertyKey } from '@mediusinc/mng-commons/core';
15
15
  import { FilterLookupTypeEnum, FilterTypeEnum } from '@mediusinc/mng-commons/filter';
16
16
  import { AutocompleteComponent, DateRangeComponent, DropdownComponent, InputTrimDirective, NumberRangeComponent } from '@mediusinc/mng-commons/form';
17
17
  import { lookupDataProviderWithService } from '@mediusinc/mng-commons/form/api';
18
- import { filterAdjustDisplayValueOnMatchModeChange, filterApplySerializationConfigToCmp, filterGetDateConfig, filterGetDefaultMatchMode, filterGetNumberConfig, generateMatchModeOptions } from '../../../helpers/filters';
18
+ import { filterAdjustDisplayValueOnMatchModeChange, filterGetDefaultMatchMode } from '../../../helpers/filters';
19
19
  import * as i0 from "@angular/core";
20
20
  import * as i1 from "@angular/forms";
21
21
  import * as i2 from "@ngx-translate/core";
@@ -25,18 +25,17 @@ import * as i5 from "primeng/button";
25
25
  import * as i6 from "primeng/checkbox";
26
26
  import * as i7 from "primeng/messages";
27
27
  import * as i8 from "primeng/inputtext";
28
- export class FilterFormComponent {
28
+ import * as i9 from "primeng/togglebutton";
29
+ export class TableFilterFormComponent {
29
30
  constructor() {
30
31
  this.lookupTypeDropdown = FilterLookupTypeEnum.Dropdown;
31
32
  this.lookupTypeAutocomplete = FilterLookupTypeEnum.Autocomplete;
32
33
  this.FilterTypeEnum = FilterTypeEnum;
33
34
  this.FilterMatchMode = FilterMatchMode;
34
35
  this.elementRef = inject(ElementRef);
35
- this.moduleConfig = inject(COMMONS_MODULE_CONFIG_IT, { optional: true });
36
- this.primeConfig = inject(PrimeNGConfig);
37
36
  this.translate = inject(TranslateService);
38
37
  this.title = input();
39
- this.descriptors = input.required();
38
+ this.metadata = input.required();
40
39
  this.genericDescriptor = input();
41
40
  this.model = input.required();
42
41
  this.filter = input();
@@ -48,17 +47,17 @@ export class FilterFormComponent {
48
47
  this.propertyOptionsWithTranslations = computed(() => {
49
48
  const disabledProperties = this.disabledProperties();
50
49
  const filter = this.filter();
51
- return (this.descriptors()?.map(d => {
50
+ return (this.metadata()?.map(d => {
52
51
  return {
53
- property: d.property,
54
- label: d.isGenericFilter ? d.property : this.getPropertyLabelKey(d),
55
- 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)
56
55
  };
57
56
  }) ?? []);
58
57
  });
59
- this.selectedDescriptor = computed(() => {
58
+ this.selectedFilterMetadata = computed(() => {
60
59
  const property = this.propertyModel();
61
- return this.descriptors().find(filterDescriptor => filterDescriptor.property === property);
60
+ return this.metadata().find(d => d.descriptor.property === property);
62
61
  });
63
62
  // change value lookup function to include the property name of the generic filter
64
63
  this.genericValueDataProvider = computed(() => {
@@ -71,8 +70,8 @@ export class FilterFormComponent {
71
70
  filters: {
72
71
  ...params?.filters,
73
72
  field: {
74
- value: this.selectedDescriptor()?.property,
75
- 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
76
75
  }
77
76
  }
78
77
  };
@@ -82,22 +81,16 @@ export class FilterFormComponent {
82
81
  return;
83
82
  });
84
83
  this.selectedDescriptorAsLookup = computed(() => {
85
- const filterDescriptor = this.selectedDescriptor();
84
+ const filterDescriptor = this.selectedFilterMetadata()?.descriptor;
86
85
  return filterDescriptor !== undefined &&
87
86
  !filterDescriptor.isGenericFilter &&
88
87
  (filterDescriptor.filterType === FilterTypeEnum.Lookup || filterDescriptor.filterType === FilterTypeEnum.LookupEnum)
89
88
  ? filterDescriptor
90
89
  : undefined;
91
90
  });
92
- this.matchModeOptions = computed(() => {
93
- return generateMatchModeOptions(this.primeConfig, this.selectedDescriptor(), this.serializationCfg);
94
- });
95
91
  this.isEdit = computed(() => this.filter() != null);
96
92
  this.formSubmitted = signal(false);
97
93
  this.formErrorMessage = signal([]);
98
- // display configs
99
- this.dateConfig = computed(() => filterGetDateConfig(this.selectedDescriptor(), this.serializationCfg));
100
- this.numberConfig = computed(() => filterGetNumberConfig(this.selectedDescriptor()));
101
94
  // UI utilities
102
95
  this.filterForm = viewChild.required('filterForm');
103
96
  // Filter form model and form utilities
@@ -105,13 +98,12 @@ export class FilterFormComponent {
105
98
  this.matchModeModel = signal(null);
106
99
  this.valueModel = signal(null);
107
100
  this.caseSensitiveModel = signal(false);
108
- this.serializationCfg = {};
109
- filterApplySerializationConfigToCmp(this.moduleConfig, this.serializationCfg);
101
+ this.isMultiselect = computed(() => this.matchModeModel() === FilterMatchMode.In || this.matchModeModel() === FilterMatchMode.NotIn);
110
102
  effect(() => {
111
103
  const edit = this.filter();
112
104
  if (edit) {
113
105
  this.resetForm({
114
- property: edit.descriptor.property,
106
+ property: edit.metadata.descriptor.property,
115
107
  matchMode: edit.displayMatchMode ?? edit.matchMode ?? null,
116
108
  value: edit.displayValue ?? edit.value,
117
109
  caseSensitive: edit.caseSensitive ?? false
@@ -122,7 +114,7 @@ export class FilterFormComponent {
122
114
  }
123
115
  }, { allowSignalWrites: true });
124
116
  effect(() => {
125
- const descriptor = this.selectedDescriptor();
117
+ const descriptor = this.selectedFilterMetadata()?.descriptor;
126
118
  const value = untracked(() => this.valueModel());
127
119
  if (value != null) {
128
120
  // reset value if filter type and value type mismatch
@@ -140,12 +132,12 @@ export class FilterFormComponent {
140
132
  }
141
133
  }, { allowSignalWrites: true });
142
134
  effect(() => {
143
- const matchModeOptions = this.matchModeOptions();
135
+ const matchModeOptions = this.selectedFilterMetadata()?.matchModes ?? [];
144
136
  const matchMode = untracked(() => this.matchModeModel());
145
137
  const filterForm = untracked(() => this.filterForm());
146
138
  if (matchModeOptions.length > 0 &&
147
139
  (!matchMode || filterForm.controls['matchMode']?.pristine || filterForm.controls['matchMode']?.untouched || !matchModeOptions.find(o => o.value === matchMode))) {
148
- this.matchModeModel.set(filterGetDefaultMatchMode(this.selectedDescriptor(), matchModeOptions));
140
+ this.matchModeModel.set(filterGetDefaultMatchMode(this.selectedFilterMetadata()?.descriptor, matchModeOptions));
149
141
  }
150
142
  }, { allowSignalWrites: true });
151
143
  effect(() => {
@@ -205,12 +197,12 @@ export class FilterFormComponent {
205
197
  }
206
198
  return labelKey;
207
199
  }
208
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.5", ngImport: i0, type: FilterFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
209
- 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 <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 } @else {\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 }\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 @if (\n enableCaseSensitive() &&\n selectedDescriptor()?.filterType === FilterTypeEnum.String &&\n matchModeModel() !== FilterMatchMode.Exists &&\n matchModeModel() !== FilterMatchMode.DoesNotExist\n ) {\n <div class=\"flex align-items-center gap-2\">\n <p-checkbox [(ngModel)]=\"caseSensitiveModel\" name=\"caseSensitive\" binary=\"true\" id=\"caseSensitive\" />\n <label for=\"caseSensitive\">{{ 'mngFilter.caseSensitive' | translate }}</label>\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", 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 }], 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 }); }
210
202
  }
211
- 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: [{
212
204
  type: Component,
213
- args: [{ standalone: true, selector: 'mng-filter-form', imports: [
205
+ args: [{ standalone: true, selector: 'mng-table-filter-form', imports: [
214
206
  DropdownComponent,
215
207
  FormsModule,
216
208
  NgClass,
@@ -225,9 +217,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.5", ngImpor
225
217
  MessagesModule,
226
218
  InputTextModule,
227
219
  NgTemplateOutlet,
228
- DropdownModule
220
+ DropdownModule,
221
+ ToggleButtonModule
229
222
  ], changeDetection: ChangeDetectionStrategy.OnPush, host: {
230
223
  class: 'flex flex-grow-1'
231
- }, 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 <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 } @else {\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 }\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 @if (\n enableCaseSensitive() &&\n selectedDescriptor()?.filterType === FilterTypeEnum.String &&\n matchModeModel() !== FilterMatchMode.Exists &&\n matchModeModel() !== FilterMatchMode.DoesNotExist\n ) {\n <div class=\"flex align-items-center gap-2\">\n <p-checkbox [(ngModel)]=\"caseSensitiveModel\" name=\"caseSensitive\" binary=\"true\" id=\"caseSensitive\" />\n <label for=\"caseSensitive\">{{ 'mngFilter.caseSensitive' | translate }}</label>\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" }]
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"] }]
232
225
  }], ctorParameters: () => [] });
233
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGFibGUvc3JjL2NvbXBvbmVudHMvZmlsdGVyL2ZpbHRlci1mb3JtL2ZpbHRlci1mb3JtLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3RhYmxlL3NyYy9jb21wb25lbnRzL2ZpbHRlci9maWx0ZXItZm9ybS9maWx0ZXItZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFFLGdCQUFnQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDMUQsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0SyxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsWUFBWSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDNUUsT0FBTyxFQUFDLFdBQVcsRUFBUyxNQUFNLGdCQUFnQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxlQUFlLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsYUFBYSxFQUFhLE1BQU0sYUFBYSxDQUFDO0FBQ3RELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFP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a0IscUZBQ2xCLG9CQUFvQiw0TEFDcEIsaUJBQWlCLDB2QkFDakIsa0JBQWtCLGlLQUNsQixjQUFjLHlnREFDZCxxQkFBcUIsMlhBQ3JCLGNBQWMsZ1pBQ2QsY0FBYywyUkFDZCxlQUFlLHlIQUNmLGdCQUFnQixtSkFDaEIsY0FBYzs7MkZBT1QsbUJBQW1CO2tCQTFCL0IsU0FBUztpQ0FDTSxJQUFJLFlBQ04saUJBQWlCLFdBRWxCO3dCQUNMLGlCQUFpQjt3QkFDakIsV0FBVzt3QkFDWCxPQUFPO3dCQUNQLGVBQWU7d0JBQ2Ysa0JBQWtCO3dCQUNsQixvQkFBb0I7d0JBQ3BCLGlCQUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQixjQUFjO3dCQUNkLHFCQUFxQjt3QkFDckIsY0FBYzt3QkFDZCxjQUFjO3dCQUNkLGVBQWU7d0JBQ2YsZ0JBQWdCO3dCQUNoQixjQUFjO3FCQUNqQixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTSxRQUN6Qzt3QkFDRixLQUFLLEVBQUUsa0JBQWtCO3FCQUM1QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TmdDbGFzcywgTmdUZW1wbGF0ZU91dGxldH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgYm9vbGVhbkF0dHJpYnV0ZSwgY29tcHV0ZWQsIGVmZmVjdCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0LCBzaWduYWwsIHVudHJhY2tlZCwgdmlld0NoaWxkfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7dGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7Rm9ybXNNb2R1bGUsIE5nRm9ybX0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQge1RyYW5zbGF0ZU1vZHVsZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1ByaW1lTkdDb25maWcsIFNlbGVjdEl0ZW19IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7Q2FsZW5kYXJNb2R1bGV9IGZyb20gJ3ByaW1lbmcvY2FsZW5kYXInO1xuaW1wb3J0IHtDaGVja2JveE1vZHVsZX0gZnJvbSAncHJpbWVuZy9jaGVja2JveCc7XG5pbXBvcnQge0Ryb3Bkb3duTW9kdWxlfSBmcm9tICdwcmltZW5nL2Ryb3Bkb3duJztcbmltcG9ydCB7SW5wdXROdW1iZXJNb2R1bGV9IGZyb20gJ3ByaW1lbmcvaW5wdXRudW1iZXInO1xuaW1wb3J0IHtJbnB1dFRleHRNb2R1bGV9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0JztcbmltcG9ydCB7TWVzc2FnZXNNb2R1bGV9IGZyb20gJ3ByaW1lbmcvbWVzc2FnZXMnO1xuaW1wb3J0IHtPdmVybGF5UGFuZWx9IGZyb20gJ3ByaW1lbmcvb3ZlcmxheXBhbmVsJztcbmltcG9ydCB7TkVWRVIsIHN3aXRjaE1hcH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7XG4gICAgQ09NTU9OU19NT0RVTEVfQ09ORklHX0lULFxuICAgIENvbW1vbnNTZXJpYWxpemF0aW9uQ29uZmlnLFxuICAgIEZpbHRlck1hdGNoTW9kZSxcbiAgICBGaWx0ZXJNYXRjaE1vZGVFeHRlbmRlZFR5cGUsXG4gICAgSUxvb2t1cERhdGFQcm92aWRlcixcbiAgICBnZXRJMThuVHlwZVByb3BlcnR5S2V5XG59IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5pbXBvcnQge0ZpbHRlckRlc2NyaXB0b3IsIEZpbHRlckdlbmVyaWNEZXNjcmlwdG9yLCBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yLCBGaWx0ZXJMb29rdXBUeXBlRW51bSwgRmlsdGVyVHlwZUVudW19IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvZmlsdGVyJztcbmltcG9ydCB7QXV0b2NvbXBsZXRlQ29tcG9uZW50LCBEYXRlUmFuZ2VDb21wb25lbnQsIERyb3Bkb3duQ29tcG9uZW50LCBJbnB1dFRyaW1EaXJlY3RpdmUsIE51bWJlclJhbmdlQ29tcG9uZW50fSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL2Zvcm0nO1xuaW1wb3J0IHtsb29rdXBEYXRhUHJvdmlkZXJXaXRoU2VydmljZX0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9mb3JtL2FwaSc7XG5pbXBvcnQge01vZGVsRGVzY3JpcHRvcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9tb2RlbCc7XG5cbmltcG9ydCB7XG4gICAgZmlsdGVyQWRqdXN0RGlzcGxheVZhbHVlT25NYXRjaE1vZGVDaGFuZ2UsXG4gICAgZmlsdGVyQXBwbHlTZXJpYWxpemF0aW9uQ29uZmlnVG9DbXAsXG4gICAgZmlsdGVyR2V0RGF0ZUNvbmZpZyxcbiAgICBmaWx0ZXJHZXREZWZhdWx0TWF0Y2hNb2RlLFxuICAgIGZpbHRlckdldE51bWJlckNvbmZpZyxcbiAgICBnZW5lcmF0ZU1hdGNoTW9kZU9wdGlvbnNcbn0gZnJvbSAnLi4vLi4vLi4vaGVscGVycy9maWx0ZXJzJztcbmltcG9ydCB7Q29tbW9uc0ZpbHRlck1ldGFkYXRhV2l0aERlc2NyaXB0b3IsIEZpbHRlckZvcm1FbWl0RXZlbnR9IGZyb20gJy4uLy4uLy4uL21vZGVscy9maWx0ZXIubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnbW5nLWZpbHRlci1mb3JtJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZmlsdGVyLWZvcm0uY29tcG9uZW50Lmh0bWwnLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgRHJvcGRvd25Db21wb25lbnQsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBOZ0NsYXNzLFxuICAgICAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgICAgIElucHV0VHJpbURpcmVjdGl2ZSxcbiAgICAgICAgTnVtYmVyUmFuZ2VDb21wb25lbnQsXG4gICAgICAgIElucHV0TnVtYmVyTW9kdWxlLFxuICAgICAgICBEYXRlUmFuZ2VDb21wb25lbnQsXG4gICAgICAgIENhbGVuZGFyTW9kdWxlLFxuICAgICAgICBBdXRvY29tcGxldGVDb21wb25lbnQsXG4gICAgICAgIENoZWNrYm94TW9kdWxlLFxuICAgICAgICBNZXNzYWdlc01vZHVsZSxcbiAgICAgICAgSW5wdXRUZXh0TW9kdWxlLFxuICAgICAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgICAgICBEcm9wZG93bk1vZHVsZVxuICAgIF0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgaG9zdDoge1xuICAgICAgICBjbGFzczogJ2ZsZXggZmxleC1ncm93LTEnXG4gICAgfVxufSlcbmV4cG9ydCBjbGFzcyBGaWx0ZXJGb3JtQ29tcG9uZW50IHtcbiAgICBwdWJsaWMgcmVhZG9ubHkgbG9va3VwVHlwZURyb3Bkb3duOiBGaWx0ZXJMb29rdXBUeXBlRW51bSA9IEZpbHRlckxvb2t1cFR5cGVFbnVtLkRyb3Bkb3duO1xuICAgIHB1YmxpYyByZWFkb25seSBsb29rdXBUeXBlQXV0b2NvbXBsZXRlOiBGaWx0ZXJMb29rdXBUeXBlRW51bSA9IEZpbHRlckxvb2t1cFR5cGVFbnVtLkF1dG9jb21wbGV0ZTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgRmlsdGVyVHlwZUVudW0gPSBGaWx0ZXJUeXBlRW51bTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgRmlsdGVyTWF0Y2hNb2RlID0gRmlsdGVyTWF0Y2hNb2RlO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgbW9kdWxlQ29uZmlnID0gaW5qZWN0KENPTU1PTlNfTU9EVUxFX0NPTkZJR19JVCwge29wdGlvbmFsOiB0cnVlfSk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBwcmltZUNvbmZpZyA9IGluamVjdChQcmltZU5HQ29uZmlnKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRyYW5zbGF0ZSA9IGluamVjdChUcmFuc2xhdGVTZXJ2aWNlKTtcblxuICAgIHB1YmxpYyB0aXRsZSA9IGlucHV0PHN0cmluZz4oKTtcbiAgICBwdWJsaWMgZGVzY3JpcHRvcnMgPSBpbnB1dC5yZXF1aXJlZDxGaWx0ZXJEZXNjcmlwdG9yPGFueSwgYW55PltdPigpO1xuICAgIHB1YmxpYyBnZW5lcmljRGVzY3JpcHRvciA9IGlucHV0PEZpbHRlckdlbmVyaWNEZXNjcmlwdG9yPigpO1xuICAgIHB1YmxpYyBtb2RlbCA9IGlucHV0LnJlcXVpcmVkPE1vZGVsRGVzY3JpcHRvcjxhbnk+PigpO1xuICAgIHB1YmxpYyBmaWx0ZXIgPSBpbnB1dDxDb21tb25zRmlsdGVyTWV0YWRhdGFXaXRoRGVzY3JpcHRvcj4oKTtcbiAgICBwdWJsaWMgb3ZlcmxheSA9IGlucHV0PE92ZXJsYXlQYW5lbD4oKTtcbiAgICBwdWJsaWMgZGlzYWJsZWRQcm9wZXJ0aWVzID0gaW5wdXQ8c3RyaW5nW10+KFtdKTtcbiAgICBwdWJsaWMgZW5hYmxlQ2FzZVNlbnNpdGl2ZSA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICAgIHB1YmxpYyBwcm9wZXJ0eVNlYXJjaCA9IGlucHV0KGZhbHNlLCB7dHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlfSk7XG5cbiAgICBwdWJsaWMgYXBwbHkgPSBvdXRwdXQ8RmlsdGVyRm9ybUVtaXRFdmVudD4oKTtcblxuICAgIHB1YmxpYyBwcm9wZXJ0eU9wdGlvbnNXaXRoVHJhbnNsYXRpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBkaXNhYmxlZFByb3BlcnRpZXMgPSB0aGlzLmRpc2FibGVkUHJvcGVydGllcygpO1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmZpbHRlcigpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5kZXNjcmlwdG9ycygpPy5tYXAoZCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDxQcm9wZXJ0eU1vZGVsPntcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGQucHJvcGVydHksXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBkLmlzR2VuZXJpY0ZpbHRlciA/IGQucHJvcGVydHkgOiB0aGlzLmdldFByb3BlcnR5TGFiZWxLZXkoZCksXG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiAhZmlsdGVyICYmIGRpc2FibGVkUHJvcGVydGllcy5pbmNsdWRlcyhkLnByb3BlcnR5KVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSA/PyBbXVxuICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgcHVibGljIHNlbGVjdGVkRGVzY3JpcHRvciA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgICAgY29uc3QgcHJvcGVydHkgPSB0aGlzLnByb3BlcnR5TW9kZWwoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRvcnMoKS5maW5kKGZpbHRlckRlc2NyaXB0b3IgPT4gZmlsdGVyRGVzY3JpcHRvci5wcm9wZXJ0eSA9PT0gcHJvcGVydHkpO1xuICAgIH0pO1xuXG4gICAgLy8gY2hhbmdlIHZhbHVlIGxvb2t1cCBmdW5jdGlvbiB0byBpbmNsdWRlIHRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSBnZW5lcmljIGZpbHRlclxuICAgIHB1YmxpYyBnZW5lcmljVmFsdWVEYXRhUHJvdmlkZXIgPSBjb21wdXRlZDxJTG9va3VwRGF0YVByb3ZpZGVyPHN0cmluZywgYW55LCBhbnksICdmaWVsZCc+IHwgdW5kZWZpbmVkPigoKSA9PiB7XG4gICAgICAgIGNvbnN0IGdlbmVyaWNWYWx1ZVByb3ZpZGVyID0gdGhpcy5nZW5lcmljRGVzY3JpcHRvcigpPy52YWx1ZUxvb2t1cDtcblxuICAgICAgICBpZiAoZ2VuZXJpY1ZhbHVlUHJvdmlkZXIgJiYgZ2VuZXJpY1ZhbHVlUHJvdmlkZXIuc2VydmljZVR5cGUpIHtcbiAgICAgICAgICAgIGNvbnN0IGxvb2t1cEZuID0gZ2VuZXJpY1ZhbHVlUHJvdmlkZXIubG9va3VwO1xuICAgICAgICAgICAgcmV0dXJuIGxvb2t1cERhdGFQcm92aWRlcldpdGhTZXJ2aWNlPHN0cmluZywgYW55LCBhbnksICdmaWVsZCc+KGdlbmVyaWNWYWx1ZVByb3ZpZGVyLnNlcnZpY2VUeXBlKS53aXRoTG9va3VwKChwYXJhbXMsIHNlcnZpY2UsIHNlYXJjaCkgPT4ge1xuICAgICAgICAgICAgICAgIHBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5wYXJhbXM/LmZpbHRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnNlbGVjdGVkRGVzY3JpcHRvcigpPy5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaE1vZGU6IHRoaXMuc2VsZWN0ZWREZXNjcmlwdG9yKCk/LmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLkxvb2t1cEVudW0gPyBGaWx0ZXJNYXRjaE1vZGUuSW4gOiBGaWx0ZXJNYXRjaE1vZGUuU3RhcnRzV2l0aFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbG9va3VwRm4ocGFyYW1zLCBzZXJ2aWNlLCBzZWFyY2gpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgIH0pO1xuXG4gICAgcHVibGljIHNlbGVjdGVkRGVzY3JpcHRvckFzTG9va3VwID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJEZXNjcmlwdG9yID0gdGhpcy5zZWxlY3RlZERlc2NyaXB0b3IoKTtcbiAgICAgICAgcmV0dXJuIGZpbHRlckRlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgIWZpbHRlckRlc2NyaXB0b3IuaXNHZW5lcmljRmlsdGVyICYmXG4gICAgICAgICAgICAoZmlsdGVyRGVzY3JpcHRvci5maWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlRW51bS5Mb29rdXAgfHwgZmlsdGVyRGVzY3JpcHRvci5maWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlRW51bS5Mb29rdXBFbnVtKVxuICAgICAgICAgICAgPyAoZmlsdGVyRGVzY3JpcHRvciBhcyBGaWx0ZXJMb29rdXBEZXNjcmlwdG9yPGFueSwgYW55PilcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgIH0pO1xuICAgIHB1YmxpYyBtYXRjaE1vZGVPcHRpb25zID0gY29tcHV0ZWQ8U2VsZWN0SXRlbVtdPigoKSA9PiB7XG4gICAgICAgIHJldHVybiBnZW5lcmF0ZU1hdGNoTW9kZU9wdGlvbnModGhpcy5wcmltZUNvbmZpZywgdGhpcy5zZWxlY3RlZERlc2NyaXB0b3IoKSwgdGhpcy5zZXJpYWxpemF0aW9uQ2ZnKTtcbiAgICB9KTtcblxuICAgIHB1YmxpYyBpc0VkaXQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLmZpbHRlcigpICE9IG51bGwpO1xuICAgIHB1YmxpYyBmb3JtU3VibWl0dGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgICBwdWJsaWMgZm9ybUVycm9yTWVzc2FnZSA9IHNpZ25hbDxhbnk+KFtdKTtcblxuICAgIC8vIGRpc3BsYXkgY29uZmlnc1xuICAgIHB1YmxpYyBkYXRlQ29uZmlnID0gY29tcHV0ZWQoKCkgPT4gZmlsdGVyR2V0RGF0ZUNvbmZpZyh0aGlzLnNlbGVjdGVkRGVzY3JpcHRvcigpLCB0aGlzLnNlcmlhbGl6YXRpb25DZmcpKTtcbiAgICBwdWJsaWMgbnVtYmVyQ29uZmlnID0gY29tcHV0ZWQoKCkgPT4gZmlsdGVyR2V0TnVtYmVyQ29uZmlnKHRoaXMuc2VsZWN0ZWREZXNjcmlwdG9yKCkpKTtcblxuICAgIC8vIFVJIHV0aWxpdGllc1xuICAgIHByaXZhdGUgZmlsdGVyRm9ybSA9IHZpZXdDaGlsZC5yZXF1aXJlZDxOZ0Zvcm0+KCdmaWx0ZXJGb3JtJyk7XG5cbiAgICAvLyBGaWx0ZXIgZm9ybSBtb2RlbCBhbmQgZm9ybSB1dGlsaXRpZXNcbiAgICBwdWJsaWMgcHJvcGVydHlNb2RlbCA9IHNpZ25hbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgICBwdWJsaWMgbWF0Y2hNb2RlTW9kZWwgPSBzaWduYWw8RmlsdGVyTWF0Y2hNb2RlRXh0ZW5kZWRUeXBlIHwgbnVsbD4obnVsbCk7XG4gICAgcHVibGljIHZhbHVlTW9kZWwgPSBzaWduYWw8YW55IHwgYW55W10gfCBudWxsPihudWxsKTtcbiAgICBwdWJsaWMgY2FzZVNlbnNpdGl2ZU1vZGVsID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIHByaXZhdGUgc2VyaWFsaXphdGlvbkNmZzogQ29tbW9uc1NlcmlhbGl6YXRpb25Db25maWcgPSB7fTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBmaWx0ZXJBcHBseVNlcmlhbGl6YXRpb25Db25maWdUb0NtcCh0aGlzLm1vZHVsZUNvbmZpZywgdGhpcy5zZXJpYWxpemF0aW9uQ2ZnKTtcblxuICAgICAgICBlZmZlY3QoXG4gICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdCA9IHRoaXMuZmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgaWYgKGVkaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNldEZvcm0oe1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHk6IGVkaXQuZGVzY3JpcHRvci5wcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoTW9kZTogZWRpdC5kaXNwbGF5TWF0Y2hNb2RlID8/IGVkaXQubWF0Y2hNb2RlID8/IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZWRpdC5kaXNwbGF5VmFsdWUgPz8gZWRpdC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmU6IGVkaXQuY2FzZVNlbnNpdGl2ZSA/PyBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7YWxsb3dTaWduYWxXcml0ZXM6IHRydWV9XG4gICAgICAgICk7XG5cbiAgICAgICAgZWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NyaXB0b3IgPSB0aGlzLnNlbGVjdGVkRGVzY3JpcHRvcigpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdW50cmFja2VkKCgpID0+IHRoaXMudmFsdWVNb2RlbCgpKTtcblxuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHZhbHVlIGlmIGZpbHRlciB0eXBlIGFuZCB2YWx1ZSB0eXBlIG1pc21hdGNoXG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjcmlwdG9yPy5maWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlRW51bS5TdHJpbmcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlIHx8IHZhbHVlID09PSAndHJ1ZScgfHwgdmFsdWUgPT09ICdmYWxzZScgfHwgdmFsdWUgaW5zdGFuY2VvZiBEYXRlKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjcmlwdG9yPy5maWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlRW51bS5OdW1iZXIgJiYgdHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJyAmJiBpc05hTigrdmFsdWUpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKGRlc2NyaXB0b3I/LmZpbHRlclR5cGUgPT09IEZpbHRlclR5cGVFbnVtLkRhdGUgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcj8uZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZUVudW0uTG9va3VwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yPy5maWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlRW51bS5Mb29rdXBFbnVtXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZU1vZGVsLnNldChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXNjcmlwdG9yPy5maWx0ZXJUeXBlID09PSBGaWx0ZXJUeXBlRW51bS5Cb29sZWFuICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbHVlTW9kZWwuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7YWxsb3dTaWduYWxXcml0ZXM6IHRydWV9XG4gICAgICAgICk7XG5cbiAgICAgICAgZWZmZWN0KFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoTW9kZU9wdGlvbnMgPSB0aGlzLm1hdGNoTW9kZU9wdGlvbnMoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaE1vZGUgPSB1bnRyYWNrZWQoKCkgPT4gdGhpcy5tYXRjaE1vZGVNb2RlbCgpKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJGb3JtID0gdW50cmFja2VkKCgpID0+IHRoaXMuZmlsdGVyRm9ybSgpKTtcblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hNb2RlT3B0aW9ucy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICghbWF0Y2hNb2RlIHx8IGZpbHRlckZvcm0uY29udHJvbHNbJ21hdGNoTW9kZSddPy5wcmlzdGluZSB8fCBmaWx0ZXJGb3JtLmNvbnRyb2xzWydtYXRjaE1vZGUnXT8udW50b3VjaGVkIHx8ICFtYXRjaE1vZGVPcHRpb25zLmZpbmQobyA9PiBvLnZhbHVlID09PSBtYXRjaE1vZGUpKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoTW9kZU1vZGVsLnNldChmaWx0ZXJHZXREZWZhdWx0TWF0Y2hNb2RlKHRoaXMuc2VsZWN0ZWREZXNjcmlwdG9yKCksIG1hdGNoTW9kZU9wdGlvbnMpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge2FsbG93U2lnbmFsV3JpdGVzOiB0cnVlfVxuICAgICAgICApO1xuXG4gICAgICAgIGVmZmVjdChcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VmFsdWUgPSB1bnRyYWNrZWQoKCkgPT4gdGhpcy52YWx1ZU1vZGVsKCkpO1xuICAgICAgICAgICAgICAgIHRoaXMudmFsdWVNb2RlbC5zZXQoZmlsdGVyQWRqdXN0RGlzcGxheVZhbHVlT25NYXRjaE1vZGVDaGFuZ2UodGhpcy5tYXRjaE1vZGVNb2RlbCgpID8/IHVuZGVmaW5lZCwgY3VycmVudFZhbHVlKSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge2FsbG93U2lnbmFsV3JpdGVzOiB0cnVlfVxuICAgICAgICApO1xuXG4gICAgICAgIHRvT2JzZXJ2YWJsZSh0aGlzLm92ZXJsYXkpXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAobyA9PiAobyA/IG8ub25TaG93IDogTkVWRVIpKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZm9ybUZpZWxkcyA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXG4gICAgICAgICAgICAgICAgICAgICdpbnB1dDpub3QoW2Rpc2FibGVkXSksIHNlbGVjdDpub3QoW2Rpc2FibGVkXSksIHRleHRhcmVhOm5vdChbZGlzYWJsZWRdKSwgW3JvbGU9XCJjb21ib2JveFwiXTpub3QoW2Rpc2FibGVkXSknXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVFbCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlSW5wdXRJZHggPSBhY3RpdmVFbCA/IFsuLi5mb3JtRmllbGRzXS5maW5kSW5kZXgoZWwgPT4gYWN0aXZlRWwuaXNFcXVhbE5vZGUoZWwpKSA6IDA7XG4gICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUlucHV0SWR4IDw9IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybUZpZWxkc1swXS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uRm9ybVN1Ym1pdChmb3JtOiBOZ0Zvcm0pIHtcbiAgICAgICAgdGhpcy5mb3JtU3VibWl0dGVkLnNldCh0cnVlKTtcblxuICAgICAgICAvLyBtYXJrIGFsbCBhcyBkaXJ0eVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBmb3JtLmNvbnRyb2xzKSB7XG4gICAgICAgICAgICBmb3JtLmNvbnRyb2xzW2tleV0ubWFya0FzRGlydHkoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb3BlcnR5ID0gdGhpcy5wcm9wZXJ0eU1vZGVsKCk7XG4gICAgICAgIGNvbnN0IG1hdGNoTW9kZSA9IHRoaXMubWF0Y2hNb2RlTW9kZWwoKTtcbiAgICAgICAgaWYgKGZvcm0uaW52YWxpZCB8fCAhcHJvcGVydHkgfHwgIW1hdGNoTW9kZSkge1xuICAgICAgICAgICAgdGhpcy5mb3JtRXJyb3JNZXNzYWdlLnNldChbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBzZXZlcml0eTogJ3dhcm4nLFxuICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdtbmdGaWx0ZXIubWVzc2FnZXMuaW52YWxpZEZvcm1UaXRsZScpLFxuICAgICAgICAgICAgICAgICAgICBkZXRhaWw6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ21uZ0ZpbHRlci5tZXNzYWdlcy5pbnZhbGlkRm9ybU1lc3NhZ2UnKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hcHBseS5lbWl0KHtcbiAgICAgICAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eSxcbiAgICAgICAgICAgIG1hdGNoTW9kZTogbWF0Y2hNb2RlLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWVNb2RlbCgpLFxuICAgICAgICAgICAgY2FzZVNlbnNpdGl2ZTogdGhpcy5jYXNlU2Vuc2l0aXZlTW9kZWwoKVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyByZXNldHRpbmcgdGhlIGZvcm0gaXMgZG9uZSBmcm9tIHRoZSBwYXJlbnQgY29tcG9uZW50IChmaWx0ZXItb3ZlcmxheS13aXRoLXRhZykgZm9yIHNtb290aGVyIGFuaW1hdGlvbnNcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRGb3JtKHZhbHVlPzogRmlsdGVyRm9ybU1vZGVsKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyRm9ybSgpLnJlc2V0Rm9ybSh2YWx1ZSk7XG4gICAgICAgIC8vIHNvbWVob3cgaGF2ZSB0byBzZXQgY2FzZSBzZW5zaXRpdml0eSBtYW51YWxseVxuICAgICAgICB0aGlzLmNhc2VTZW5zaXRpdmVNb2RlbC5zZXQodmFsdWU/LmNhc2VTZW5zaXRpdmUgPz8gZmFsc2UpO1xuICAgICAgICB0aGlzLmZvcm1TdWJtaXR0ZWQuc2V0KGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFByb3BlcnR5TGFiZWxLZXkoZmlsdGVyRGVzY3JpcHRvcjogRmlsdGVyRGVzY3JpcHRvcjxhbnksIGFueT4pIHtcbiAgICAgICAgbGV0IGxhYmVsS2V5OiBzdHJpbmc7XG4gICAgICAgIGlmIChmaWx0ZXJEZXNjcmlwdG9yLnRpdGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxhYmVsS2V5ID0gZmlsdGVyRGVzY3JpcHRvci50aXRsZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxhYmVsS2V5ID0gZ2V0STE4blR5cGVQcm9wZXJ0eUtleSh0aGlzLm1vZGVsKCkuaTE4bkJhc2VLZXksIGZpbHRlckRlc2NyaXB0b3IucHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYWJlbEtleTtcbiAgICB9XG59XG5cbmludGVyZmFjZSBGaWx0ZXJGb3JtTW9kZWwge1xuICAgIHByb3BlcnR5OiBzdHJpbmcgfCBudWxsO1xuICAgIG1hdGNoTW9kZTogRmlsdGVyTWF0Y2hNb2RlRXh0ZW5kZWRUeXBlIHwgbnVsbDtcbiAgICB2YWx1ZTogYW55IHwgbnVsbDtcbiAgICBjYXNlU2Vuc2l0aXZlOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgUHJvcGVydHlNb2RlbCB7XG4gICAgcHJvcGVydHk6IHN0cmluZztcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGRpc2FibGVkOiBib29sZWFuO1xufVxuIiwiPGRpdj5cbiAgICA8ZGl2PlxuICAgICAgICA8aDU+e3sgZmlsdGVyKCkgPyAoJ21uZ0ZpbHRlci50aXRsZUVkaXQnIHwgdHJhbnNsYXRlKSA6ICgnbW5nRmlsdGVyLnRpdGxlQWRkJyB8IHRyYW5zbGF0ZSkgfX08L2g1PlxuICAgIDwvZGl2PlxuICAgIDxmb3JtICNmaWx0ZXJGb3JtPVwibmdGb3JtXCIgKG5nU3VibWl0KT1cIm9uRm9ybVN1Ym1pdChmaWx0ZXJGb3JtKVwiIGNsYXNzPVwiZmxleCBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1jZW50ZXIgbGc6ZmxleC1yb3cgZ2FwLTNcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBsZzp3LWF1dG9cIj5cbiAgICAgICAgICAgIDxtbmctZHJvcGRvd25cbiAgICAgICAgICAgICAgICBuYW1lPVwicHJvcGVydHlcIlxuICAgICAgICAgICAgICAgIGlkPVwicHJvcGVydHlcIlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMVwiXG4gICAgICAgICAgICAgICAgI3Byb3BlcnR5Q29udHJvbD1cIm5nTW9kZWxcIlxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicHJvcGVydHlNb2RlbFwiXG4gICAgICAgICAgICAgICAgW29wdGlvbnNdPVwicHJvcGVydHlPcHRpb25zV2l0aFRyYW5zbGF0aW9ucygpXCJcbiAgICAgICAgICAgICAgICBvcHRpb25zVmFsdWVQcm9wZXJ0eT1cInByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICBvcHRpb25zRGlzYWJsZWRQcm9wZXJ0eT1cImRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICBvcHRpb25zTGFiZWxQcm9wZXJ0eT1cImxhYmVsXCJcbiAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ21uZ0ZpbHRlci5wcm9wZXJ0eScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFtvcHRpb25zTGFiZWxUcmFuc2xhdGVdPVwiIXByb3BlcnR5U2VhcmNoKClcIlxuICAgICAgICAgICAgICAgIFtpbmxpbmVTZWFyY2hdPVwicHJvcGVydHlTZWFyY2goKVwiXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGxcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc0VkaXQoKVwiXG4gICAgICAgICAgICAgICAgW2FwcGVuZFRvXT1cIm51bGxcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBsZzp3LWF1dG9cIj5cbiAgICAgICAgICAgIDxtbmctZHJvcGRvd25cbiAgICAgICAgICAgICAgICBuYW1lPVwibWF0Y2hNb2RlXCJcbiAgICAgICAgICAgICAgICBpZD1cIm1hdGNoTW9kZVwiXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJtYXRjaE1vZGVNb2RlbFwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy1mdWxsXCJcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJtYXRjaE1vZGVPcHRpb25zKClcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInbW5nRmlsdGVyLm1hdGNoTW9kZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhcHJvcGVydHlDb250cm9sLnZhbHVlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImFsaWduLXNlbGYtZW5kXCJcbiAgICAgICAgICAgICAgICByZXF1aXJlZD1cInRydWVcIlxuICAgICAgICAgICAgICAgIFthcHBlbmRUb109XCJudWxsXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIEBpZiAoIShtYXRjaE1vZGVNb2RlbCgpID09PSBGaWx0ZXJNYXRjaE1vZGUuRXhpc3RzIHx8IG1hdGNoTW9kZU1vZGVsKCkgPT09IEZpbHRlck1hdGNoTW9kZS5Eb2VzTm90RXhpc3QpKSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGxnOnctYXV0byBmbGV4IGZsZXgtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgQHN3aXRjaCAoc2VsZWN0ZWREZXNjcmlwdG9yKCk/LmZpbHRlclR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEZpbHRlclR5cGVFbnVtLk51bWJlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChtYXRjaE1vZGVNb2RlbCgpID09PSBGaWx0ZXJNYXRjaE1vZGUuQmV0d2Vlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtbmctbnVtYmVyLXJhbmdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm1uZy1jb2x1bW4tZmlsdGVyLW51bWJlci1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInbW5nRmlsdGVyLnZhbHVlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt1c2VHcm91cGluZ109XCJzZWxlY3RlZERlc2NyaXB0b3IoKT8ubnVtYmVyVXNlR3JvdXBpbmcgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluRnJhY3Rpb25EaWdpdHNdPVwibnVtYmVyQ29uZmlnKCk/LmZyYWN0aW9uc01pblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhGcmFjdGlvbkRpZ2l0c109XCJudW1iZXJDb25maWcoKT8uZnJhY3Rpb25zTWF4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3R5bGVDbGFzcz1cIm1uZy1jb2x1bW4tZmlsdGVyLW51bWJlci1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZUNsYXNzXT1cIid3LWZ1bGwnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidtbmdGaWx0ZXIudmFsdWUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZUdyb3VwaW5nXT1cInNlbGVjdGVkRGVzY3JpcHRvcigpPy5udW1iZXJVc2VHcm91cGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttaW5GcmFjdGlvbkRpZ2l0c109XCJudW1iZXJDb25maWcoKT8uZnJhY3Rpb25zTWluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heEZyYWN0aW9uRGlnaXRzXT1cIm51bWJlckNvbmZpZygpPy5mcmFjdGlvbnNNYXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIW1hdGNoTW9kZU1vZGVsKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1cInRydWVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEZpbHRlclR5cGVFbnVtLkJvb2xlYW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWNoZWNrYm94IFsobmdNb2RlbCldPVwidmFsdWVNb2RlbFwiIFtkaXNhYmxlZF09XCIhbWF0Y2hNb2RlTW9kZWwoKVwiIG5hbWU9XCJ2YWx1ZVwiIGJpbmFyeT1cInRydWVcIiByZXF1aXJlZD1cInRydWVcIiAvPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChGaWx0ZXJUeXBlRW51bS5EYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYgKG1hdGNoTW9kZU1vZGVsKCkgPT09IEZpbHRlck1hdGNoTW9kZS5CZXR3ZWVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy1kYXRlLXJhbmdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93VGltZV09XCJkYXRlQ29uZmlnKCk/LnNob3dUaW1lID8/IGZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dTZWNvbmRzXT1cImRhdGVDb25maWcoKT8uc2hvd1NlY29uZHMgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0ZUZvcm1hdF09XCJkYXRlQ29uZmlnKCk/LmZvcm1hdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInbW5nRmlsdGVyLnZhbHVlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwidHJ1ZVwiPjwvbW5nLWRhdGUtcmFuZ2U+XG4gICAgICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cC1jYWxlbmRhclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhbHVlTW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGVDbGFzc109XCIndy1mdWxsJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInbW5nRmlsdGVyLnZhbHVlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93SWNvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cImRhdGVDb25maWcoKT8uc2hvd1RpbWUgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvd1NlY29uZHNdPVwiZGF0ZUNvbmZpZygpPy5zaG93U2Vjb25kcyA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXRlRm9ybWF0XT1cImRhdGVDb25maWcoKT8uZm9ybWF0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpcnN0RGF5T2ZXZWVrXT1cIjFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIW1hdGNoTW9kZU1vZGVsKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3AtY2FsZW5kYXI+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGNhc2UgKEZpbHRlclR5cGVFbnVtLkxvb2t1cCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvb2t1cEZpbHRlclwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBjYXNlIChGaWx0ZXJUeXBlRW51bS5Mb29rdXBFbnVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9va3VwRmlsdGVyXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGRlZmF1bHQge1xuICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChzZWxlY3RlZERlc2NyaXB0b3IoKT8uZ2VuZXJpY1ZhbHVlUHJvdmlkZXIgJiYgZ2VuZXJpY1ZhbHVlRGF0YVByb3ZpZGVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGNvbmRpdGlvbmFsIHJlbmRlcmluZyBvbiB0aGUgcGxhY2Vob2xkZXIgaXMgdGhlcmUgYmVjYXVzZSBvZiBzdHlsaW5nIGlzc3VlcyB3aXRoIFByaW1lTkcgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAoUHJpbWVORyBhcHBsaWVzIHRoZSAucC1wbGFjZWhvbGRlciBjbGFzcyB0byBwcm9ncmFtbWF0aWNhbGx5IHNldCB2YWx1ZXMsIG1ha2luZyB0aGVtIGdyZXllZCBvdXQpIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtbmctZHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZU1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFQcm92aWRlcl09XCJnZW5lcmljVmFsdWVEYXRhUHJvdmlkZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc05hbWVdPVwic2VsZWN0ZWREZXNjcmlwdG9yKCk/LmNsYXNzTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkcm9wZG93bkNsYXNzTmFtZV09XCJzZWxlY3RlZERlc2NyaXB0b3IoKT8uZHJvcGRvd25DbGFzc05hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwidmFsdWVNb2RlbCgpID8gdW5kZWZpbmVkIDogKCdtbmdGaWx0ZXIudmFsdWUnIHwgdHJhbnNsYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93SW5wdXQ9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFtYXRjaE1vZGVNb2RlbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FwcGVuZFRvXT1cIm51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1cInRydWVcIj48L21uZy1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhbHVlTW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dFRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtbmctY29sdW1uLWZpbHRlci1zdHJpbmctaW5wdXQgdy1mdWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIucGxhY2Vob2xkZXJdPVwiJ21uZ0ZpbHRlci52YWx1ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW5nSW5wdXRUcmltXT1cInNlbGVjdGVkRGVzY3JpcHRvcigpPy50cmltT3B0aW9uIVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhbWF0Y2hNb2RlTW9kZWwoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInbW5nRmlsdGVyLnZhbHVlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNsb29rdXBGaWx0ZXI+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoc2VsZWN0ZWREZXNjcmlwdG9yQXNMb29rdXAoKTsgYXMgbG9va3VwRmlsdGVyRGVzY3JpcHRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgQHN3aXRjaCAobG9va3VwRmlsdGVyRGVzY3JpcHRvci5sb29rdXBUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGNhc2UgKGxvb2t1cFR5cGVBdXRvY29tcGxldGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy1hdXRvY29tcGxldGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidmFsdWVNb2RlbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFQcm92aWRlcl09XCJsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLmRhdGFQcm92aWRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc1RyYWNrUHJvcGVydHldPVwibG9va3VwRmlsdGVyRGVzY3JpcHRvci5vcHRpb25zVmFsdWVQcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc1ZhbHVlUHJvcGVydHldPVwibG9va3VwRmlsdGVyRGVzY3JpcHRvci5vcHRpb25zVmFsdWVQcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc0xhYmVsUHJvcGVydHldPVwibG9va3VwRmlsdGVyRGVzY3JpcHRvci5vcHRpb25zTGFiZWxQcm9wZXJ0eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbb3B0aW9uc0xhYmVsVHJhbnNsYXRlXT1cImxvb2t1cEZpbHRlckRlc2NyaXB0b3Iub3B0aW9uc0xhYmVsVHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttdWx0aXNlbGVjdF09XCJsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLm11bHRpc2VsZWN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvQ2xlYXJdPVwibG9va3VwRmlsdGVyRGVzY3JpcHRvci5hdXRvY29tcGxldGVBdXRvQ2xlYXIgPz8gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW29wZW5PbkZvY3VzXT1cImxvb2t1cEZpbHRlckRlc2NyaXB0b3IuYXV0b2NvbXBsZXRlQXV0b0NsZWFyID8/IHRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubGluZVNlYXJjaF09XCJsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLmF1dG9jb21wbGV0ZUlubGluZVNlYXJjaCA/PyBmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ21uZ0ZpbHRlci52YWx1ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzTmFtZV09XCJsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLmNsYXNzTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZHJvcGRvd25DbGFzc05hbWVdPVwibG9va3VwRmlsdGVyRGVzY3JpcHRvci5kcm9wZG93bkNsYXNzTmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2VhcmNoVHJpbV09XCJzZWxlY3RlZERlc2NyaXB0b3IoKT8udHJpbU9wdGlvbiFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFtYXRjaE1vZGVNb2RlbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21uZy1hdXRvY29tcGxldGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBjYXNlIChsb29rdXBUeXBlRHJvcGRvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1uZy1kcm9wZG93blxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZU1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YVByb3ZpZGVyXT1cImxvb2t1cEZpbHRlckRlc2NyaXB0b3IuZGF0YVByb3ZpZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zVmFsdWVQcm9wZXJ0eV09XCJsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLm9wdGlvbnNWYWx1ZVByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zTGFiZWxQcm9wZXJ0eV09XCJsb29rdXBGaWx0ZXJEZXNjcmlwdG9yLm9wdGlvbnNMYWJlbFByb3BlcnR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvcHRpb25zTGFiZWxUcmFuc2xhdGVdPVwibG9va3VwRmlsdGVyRGVzY3JpcHRvci5vcHRpb25zTGFiZWxUcmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW211bHRpc2VsZWN0XT1cImxvb2t1cEZpbHRlckRlc2NyaXB0b3IubXVsdGlzZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidtbmdGaWx0ZXIudmFsdWUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzc05hbWVdPVwibG9va3VwRmlsdGVyRGVzY3JpcHRvci5jbGFzc05hbWUgKyAnIHctZnVsbCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Ryb3Bkb3duQ2xhc3NOYW1lXT1cImxvb2t1cEZpbHRlckRlc2NyaXB0b3IuZHJvcGRvd25DbGFzc05hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0NsZWFyPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFtYXRjaE1vZGVNb2RlbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthcHBlbmRUb109XCJudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21uZy1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2UgaWYgKHNlbGVjdGVkRGVzY3JpcHRvcigpPy5pc0dlbmVyaWNGaWx0ZXIgJiYgZ2VuZXJpY1ZhbHVlRGF0YVByb3ZpZGVyKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtbmctZHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInZhbHVlTW9kZWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGFQcm92aWRlcl09XCJnZW5lcmljVmFsdWVEYXRhUHJvdmlkZXIoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidtbmdGaWx0ZXIudmFsdWUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG93Q2xlYXI9XCJmYWxzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFtYXRjaE1vZGVNb2RlbCgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYXBwZW5kVG9dPVwibnVsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L21uZy1kcm9wZG93bj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICBAaWYgKFxuICAgICAgICAgICAgZW5hYmxlQ2FzZVNlbnNpdGl2ZSgpICYmXG4gICAgICAgICAgICBzZWxlY3RlZERlc2NyaXB0b3IoKT8uZmlsdGVyVHlwZSA9PT0gRmlsdGVyVHlwZUVudW0uU3RyaW5nICYmXG4gICAgICAgICAgICBtYXRjaE1vZGVNb2RlbCgpICE9PSBGaWx0ZXJNYXRjaE1vZGUuRXhpc3RzICYmXG4gICAgICAgICAgICBtYXRjaE1vZGVNb2RlbCgpICE9PSBGaWx0ZXJNYXRjaE1vZGUuRG9lc05vdEV4aXN0XG4gICAgICAgICkge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggYWxpZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPHAtY2hlY2tib3ggWyhuZ01vZGVsKV09XCJjYXNlU2Vuc2l0aXZlTW9kZWxcIiBuYW1lPVwiY2FzZVNlbnNpdGl2ZVwiIGJpbmFyeT1cInRydWVcIiBpZD1cImNhc2VTZW5zaXRpdmVcIiAvPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjYXNlU2Vuc2l0aXZlXCI+e3sgJ21uZ0ZpbHRlci5jYXNlU2Vuc2l0aXZlJyB8IHRyYW5zbGF0ZSB9fTwvbGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+XG4gICAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYWxpZ24tc2VsZi1lbmRcIj5cbiAgICAgICAgICAgICAgICB7eyAoZmlsdGVyKCkgPyAnZ2VuZXJhbC5hcHBseScgOiAnZ2VuZXJhbC5hZGQnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZm9ybT5cbiAgICBAaWYgKGZvcm1TdWJtaXR0ZWQoKSAmJiBmaWx0ZXJGb3JtLmludmFsaWQpIHtcbiAgICAgICAgPHAtbWVzc2FnZXMgW3ZhbHVlXT1cImZvcm1FcnJvck1lc3NhZ2UoKVwiIGNsYXNzPVwidy1mdWxsXCI+PC9wLW1lc3NhZ2VzPlxuICAgIH1cbjwvZGl2PlxuIl19
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==