ecabs-components 1.0.28 → 1.0.29

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 (159) hide show
  1. package/esm2022/ecabs-components.mjs +4 -4
  2. package/esm2022/lib/base/consts/date-mask.consts.mjs +56 -56
  3. package/esm2022/lib/base/directives/date-mask.directive.mjs +64 -64
  4. package/esm2022/lib/base/directives/date-mask.directive.module.mjs +21 -21
  5. package/esm2022/lib/base/directives/digits-only.directive.mjs +129 -129
  6. package/esm2022/lib/base/directives/digits-only.directive.module.mjs +21 -21
  7. package/esm2022/lib/base/directives/number-border.directive.mjs +53 -53
  8. package/esm2022/lib/base/directives/number-border.directive.module.mjs +21 -21
  9. package/esm2022/lib/base/element-base.mjs +99 -99
  10. package/esm2022/lib/base/element-wrapper/element-wrapper.component.mjs +52 -52
  11. package/esm2022/lib/base/element-wrapper/element-wrapper.module.mjs +51 -51
  12. package/esm2022/lib/base/hint/hint.component.mjs +20 -20
  13. package/esm2022/lib/base/hint/hint.module.mjs +19 -19
  14. package/esm2022/lib/base/validation/validation.component.mjs +69 -69
  15. package/esm2022/lib/base/validation/validation.module.mjs +19 -19
  16. package/esm2022/lib/ecabs-active-status-filter/ecabs-active-status-filter.component.mjs +30 -30
  17. package/esm2022/lib/ecabs-active-status-filter/ecabs-active-status-filter.module.mjs +19 -19
  18. package/esm2022/lib/ecabs-breadcrumb/ecabs-breadcrumb.component.mjs +15 -15
  19. package/esm2022/lib/ecabs-breadcrumb/ecabs-breadcrumb.module.mjs +19 -19
  20. package/esm2022/lib/ecabs-buttons/ecabs-buttons.component.mjs +62 -62
  21. package/esm2022/lib/ecabs-buttons/ecabs-buttons.module.mjs +20 -20
  22. package/esm2022/lib/ecabs-checkbox-toggle/ecabs-checkbox-toggle.component.mjs +100 -100
  23. package/esm2022/lib/ecabs-checkbox-toggle/ecabs-checkbox-toggle.module.mjs +35 -35
  24. package/esm2022/lib/ecabs-date-picker/components/ecabs-date-picker-header/ecabs-date-picker-header.component.mjs +16 -16
  25. package/esm2022/lib/ecabs-date-picker/ecabs-date-picker.component.mjs +84 -84
  26. package/esm2022/lib/ecabs-date-picker/ecabs-date-picker.module.mjs +47 -47
  27. package/esm2022/lib/ecabs-date-time-picker/components/ecabs-date-time-picker-header/ecabs-date-time-picker-header.component.mjs +16 -16
  28. package/esm2022/lib/ecabs-date-time-picker/ecabs-date-time-picker.component.mjs +203 -179
  29. package/esm2022/lib/ecabs-date-time-picker/ecabs-date-time-picker.module.mjs +63 -63
  30. package/esm2022/lib/ecabs-date-time-range-picker/components/ecabs-date-time-range-picker-header/ecabs-date-time-range-picker-header.component.mjs +16 -16
  31. package/esm2022/lib/ecabs-date-time-range-picker/ecabs-date-time-range-picker.component.mjs +192 -192
  32. package/esm2022/lib/ecabs-date-time-range-picker/ecabs-date-time-range-picker.module.mjs +64 -64
  33. package/esm2022/lib/ecabs-date-time-range-picker/time-range.directive.mjs +44 -44
  34. package/esm2022/lib/ecabs-dialog-confirm/ecabs-dialog-confirm.component.mjs +46 -46
  35. package/esm2022/lib/ecabs-dialog-confirm/ecabs-dialog-confirm.module.mjs +19 -19
  36. package/esm2022/lib/ecabs-dialog-message/ecabs-dialog-message.component.mjs +43 -43
  37. package/esm2022/lib/ecabs-dialog-message/ecabs-dialog-message.module.mjs +19 -19
  38. package/esm2022/lib/ecabs-empty-placeholder/ecabs-empty-placeholder.component.mjs +18 -18
  39. package/esm2022/lib/ecabs-empty-placeholder/ecabs-empty-placeholder.module.mjs +18 -18
  40. package/esm2022/lib/ecabs-expansion-panel/ecabs-expansion-panel.component.mjs +75 -75
  41. package/esm2022/lib/ecabs-expansion-panel/ecabs-expansion-panel.module.mjs +23 -23
  42. package/esm2022/lib/ecabs-increment/ecabs-increment.component.mjs +77 -77
  43. package/esm2022/lib/ecabs-increment/ecabs-increment.module.mjs +22 -22
  44. package/esm2022/lib/ecabs-input/ecabs-input.component.mjs +82 -82
  45. package/esm2022/lib/ecabs-input/ecabs-input.module.mjs +21 -21
  46. package/esm2022/lib/ecabs-language-selector/ecabs-language-selector.component.mjs +61 -61
  47. package/esm2022/lib/ecabs-language-selector/ecabs-language-selector.module.mjs +38 -38
  48. package/esm2022/lib/ecabs-loading/ecabs-loading.component.mjs +23 -23
  49. package/esm2022/lib/ecabs-loading/ecabs-loading.module.mjs +18 -18
  50. package/esm2022/lib/ecabs-loading/spinner/spinner.component.mjs +15 -15
  51. package/esm2022/lib/ecabs-note/ecabs-note.component.mjs +29 -29
  52. package/esm2022/lib/ecabs-note/ecabs-note.module.mjs +18 -18
  53. package/esm2022/lib/ecabs-phone/ecabs-phone.component.mjs +103 -103
  54. package/esm2022/lib/ecabs-phone/ecabs-phone.module.mjs +21 -21
  55. package/esm2022/lib/ecabs-picker-header/ecabs-picker-header.component.mjs +49 -49
  56. package/esm2022/lib/ecabs-picker-header/ecabs-picker-header.module.mjs +21 -21
  57. package/esm2022/lib/ecabs-radio-button-list/ecabs-radio-button-list.component.mjs +64 -64
  58. package/esm2022/lib/ecabs-radio-button-list/ecabs-radio-button-list.module.mjs +31 -31
  59. package/esm2022/lib/ecabs-select/ecabs-select.component.mjs +309 -309
  60. package/esm2022/lib/ecabs-select/ecabs-select.module.mjs +59 -59
  61. package/esm2022/lib/ecabs-table/ecabs-table-filter-wrapper/ecabs-table-filter-wrapper.component.mjs +16 -16
  62. package/esm2022/lib/ecabs-table/ecabs-table-filter-wrapper/ecabs-table-filter-wrapper.module.mjs +23 -23
  63. package/esm2022/lib/ecabs-table/ecabs-table.component.mjs +42 -42
  64. package/esm2022/lib/ecabs-table/ecabs-table.module.mjs +32 -32
  65. package/esm2022/lib/ecabs-textarea/ecabs-textarea.component.mjs +61 -61
  66. package/esm2022/lib/ecabs-textarea/ecabs-textarea.module.mjs +19 -19
  67. package/esm2022/lib/ecabs-timepicker/componets/ecabs-time-list-panel/ecabs-time-list-panel.component.mjs +136 -136
  68. package/esm2022/lib/ecabs-timepicker/config.model.mjs +1 -1
  69. package/esm2022/lib/ecabs-timepicker/ecabs-timepicker.component.mjs +311 -311
  70. package/esm2022/lib/ecabs-timepicker/ecabs-timepicker.module.mjs +19 -19
  71. package/esm2022/lib/ecabs-timepicker/ecabs-timepicker.service.mjs +30 -30
  72. package/esm2022/lib/ecabs-validation/ecabs-validation.component.mjs +18 -18
  73. package/esm2022/lib/ecabs-validation/ecabs-validation.module.mjs +18 -18
  74. package/esm2022/lib/models/bread-crumb.mjs +1 -1
  75. package/esm2022/lib/models/timepicker.models.mjs +1 -1
  76. package/esm2022/lib/models/validation.models.mjs +1 -1
  77. package/esm2022/lib/services/ecabs-components.service.mjs +31 -31
  78. package/esm2022/public-api.mjs +58 -58
  79. package/fesm2022/ecabs-components.mjs +3277 -3253
  80. package/fesm2022/ecabs-components.mjs.map +1 -1
  81. package/index.d.ts +5 -5
  82. package/lib/base/consts/date-mask.consts.d.ts +7 -7
  83. package/lib/base/directives/date-mask.directive.d.ts +16 -16
  84. package/lib/base/directives/date-mask.directive.module.d.ts +8 -8
  85. package/lib/base/directives/digits-only.directive.d.ts +26 -26
  86. package/lib/base/directives/digits-only.directive.module.d.ts +8 -8
  87. package/lib/base/directives/number-border.directive.d.ts +13 -13
  88. package/lib/base/directives/number-border.directive.module.d.ts +8 -8
  89. package/lib/base/element-base.d.ts +28 -28
  90. package/lib/base/element-wrapper/element-wrapper.component.d.ts +19 -19
  91. package/lib/base/element-wrapper/element-wrapper.module.d.ts +16 -16
  92. package/lib/base/hint/hint.component.d.ts +8 -8
  93. package/lib/base/hint/hint.module.d.ts +10 -10
  94. package/lib/base/validation/validation.component.d.ts +24 -24
  95. package/lib/base/validation/validation.module.d.ts +10 -10
  96. package/lib/ecabs-active-status-filter/ecabs-active-status-filter.component.d.ts +14 -14
  97. package/lib/ecabs-active-status-filter/ecabs-active-status-filter.module.d.ts +10 -10
  98. package/lib/ecabs-breadcrumb/ecabs-breadcrumb.component.d.ts +7 -7
  99. package/lib/ecabs-breadcrumb/ecabs-breadcrumb.module.d.ts +10 -10
  100. package/lib/ecabs-buttons/ecabs-buttons.component.d.ts +20 -20
  101. package/lib/ecabs-buttons/ecabs-buttons.module.d.ts +11 -11
  102. package/lib/ecabs-checkbox-toggle/ecabs-checkbox-toggle.component.d.ts +31 -31
  103. package/lib/ecabs-checkbox-toggle/ecabs-checkbox-toggle.module.d.ts +12 -12
  104. package/lib/ecabs-date-picker/components/ecabs-date-picker-header/ecabs-date-picker-header.component.d.ts +6 -6
  105. package/lib/ecabs-date-picker/ecabs-date-picker.component.d.ts +29 -29
  106. package/lib/ecabs-date-picker/ecabs-date-picker.module.d.ts +15 -15
  107. package/lib/ecabs-date-time-picker/components/ecabs-date-time-picker-header/ecabs-date-time-picker-header.component.d.ts +6 -6
  108. package/lib/ecabs-date-time-picker/ecabs-date-time-picker.component.d.ts +55 -51
  109. package/lib/ecabs-date-time-picker/ecabs-date-time-picker.module.d.ts +19 -19
  110. package/lib/ecabs-date-time-range-picker/components/ecabs-date-time-range-picker-header/ecabs-date-time-range-picker-header.component.d.ts +6 -6
  111. package/lib/ecabs-date-time-range-picker/ecabs-date-time-range-picker.component.d.ts +58 -58
  112. package/lib/ecabs-date-time-range-picker/ecabs-date-time-range-picker.module.d.ts +20 -20
  113. package/lib/ecabs-date-time-range-picker/time-range.directive.d.ts +15 -15
  114. package/lib/ecabs-dialog-confirm/ecabs-dialog-confirm.component.d.ts +31 -31
  115. package/lib/ecabs-dialog-confirm/ecabs-dialog-confirm.module.d.ts +11 -11
  116. package/lib/ecabs-dialog-message/ecabs-dialog-message.component.d.ts +28 -28
  117. package/lib/ecabs-dialog-message/ecabs-dialog-message.module.d.ts +11 -11
  118. package/lib/ecabs-empty-placeholder/ecabs-empty-placeholder.component.d.ts +12 -12
  119. package/lib/ecabs-empty-placeholder/ecabs-empty-placeholder.module.d.ts +9 -9
  120. package/lib/ecabs-expansion-panel/ecabs-expansion-panel.component.d.ts +28 -28
  121. package/lib/ecabs-expansion-panel/ecabs-expansion-panel.module.d.ts +14 -14
  122. package/lib/ecabs-increment/ecabs-increment.component.d.ts +26 -26
  123. package/lib/ecabs-increment/ecabs-increment.module.d.ts +13 -13
  124. package/lib/ecabs-input/ecabs-input.component.d.ts +27 -27
  125. package/lib/ecabs-input/ecabs-input.module.d.ts +12 -12
  126. package/lib/ecabs-language-selector/ecabs-language-selector.component.d.ts +20 -20
  127. package/lib/ecabs-language-selector/ecabs-language-selector.module.d.ts +12 -12
  128. package/lib/ecabs-loading/ecabs-loading.component.d.ts +8 -8
  129. package/lib/ecabs-loading/ecabs-loading.module.d.ts +9 -9
  130. package/lib/ecabs-loading/spinner/spinner.component.d.ts +6 -6
  131. package/lib/ecabs-note/ecabs-note.component.d.ts +7 -7
  132. package/lib/ecabs-note/ecabs-note.module.d.ts +9 -9
  133. package/lib/ecabs-phone/ecabs-phone.component.d.ts +33 -33
  134. package/lib/ecabs-phone/ecabs-phone.module.d.ts +12 -12
  135. package/lib/ecabs-picker-header/ecabs-picker-header.component.d.ts +19 -19
  136. package/lib/ecabs-picker-header/ecabs-picker-header.module.d.ts +12 -12
  137. package/lib/ecabs-radio-button-list/ecabs-radio-button-list.component.d.ts +24 -24
  138. package/lib/ecabs-radio-button-list/ecabs-radio-button-list.module.d.ts +11 -11
  139. package/lib/ecabs-select/ecabs-select.component.d.ts +71 -71
  140. package/lib/ecabs-select/ecabs-select.module.d.ts +15 -15
  141. package/lib/ecabs-table/ecabs-table-filter-wrapper/ecabs-table-filter-wrapper.component.d.ts +8 -8
  142. package/lib/ecabs-table/ecabs-table-filter-wrapper/ecabs-table-filter-wrapper.module.d.ts +9 -9
  143. package/lib/ecabs-table/ecabs-table.component.d.ts +18 -18
  144. package/lib/ecabs-table/ecabs-table.module.d.ts +12 -12
  145. package/lib/ecabs-textarea/ecabs-textarea.component.d.ts +20 -20
  146. package/lib/ecabs-textarea/ecabs-textarea.module.d.ts +10 -10
  147. package/lib/ecabs-timepicker/componets/ecabs-time-list-panel/ecabs-time-list-panel.component.d.ts +40 -40
  148. package/lib/ecabs-timepicker/config.model.d.ts +5 -5
  149. package/lib/ecabs-timepicker/ecabs-timepicker.component.d.ts +53 -53
  150. package/lib/ecabs-timepicker/ecabs-timepicker.module.d.ts +10 -10
  151. package/lib/ecabs-timepicker/ecabs-timepicker.service.d.ts +12 -12
  152. package/lib/ecabs-validation/ecabs-validation.component.d.ts +10 -10
  153. package/lib/ecabs-validation/ecabs-validation.module.d.ts +9 -9
  154. package/lib/models/bread-crumb.d.ts +5 -5
  155. package/lib/models/timepicker.models.d.ts +6 -6
  156. package/lib/models/validation.models.d.ts +7 -7
  157. package/lib/services/ecabs-components.service.d.ts +16 -16
  158. package/package.json +1 -1
  159. package/public-api.d.ts +58 -58
@@ -1,310 +1,310 @@
1
- import { Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
2
- import { UntypedFormControl, NgControl, NG_VALUE_ACCESSOR, } from '@angular/forms';
3
- import { MatSelectSearchComponent } from 'ngx-mat-select-search';
4
- import { BehaviorSubject, combineLatest, debounceTime, map, Subscription, } from 'rxjs';
5
- import ElementBaseComponent from '../base/element-base';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/common";
8
- import * as i2 from "../base/element-wrapper/element-wrapper.component";
9
- import * as i3 from "@angular/material/legacy-form-field";
10
- import * as i4 from "@angular/material/legacy-select";
11
- import * as i5 from "@angular/material/legacy-core";
12
- import * as i6 from "@angular/forms";
13
- import * as i7 from "ngx-mat-select-search";
14
- export class EcabsSelectComponent extends ElementBaseComponent {
15
- get value() {
16
- return this.val;
17
- }
18
- set value(val) {
19
- if (this.val !== val) {
20
- this.val = val;
21
- this.setSelectedItems();
22
- this.onChange(val);
23
- this.onTouch(val);
24
- }
25
- }
26
- constructor(injector, changeDetectorRef) {
27
- super();
28
- this.injector = injector;
29
- this.changeDetectorRef = changeDetectorRef;
30
- this.multiple = false;
31
- this.useNoneOption = false;
32
- this.useOnlyDisabledClass = false;
33
- this.searchFieldPlaceholder = 'Search';
34
- this.useSearchOption = false;
35
- this.useSelectAllOption = false;
36
- this.setAllOptionAfterChosenAllItems = true;
37
- this.selectAllValue = 0;
38
- this.noEntriesFoundLabel = 'No matching found';
39
- this.noneLabel = 'None';
40
- this.allLabel = 'All';
41
- this.otherLabel = 'Other';
42
- this.othersLabel = 'Others';
43
- this.updateFilterItems = new EventEmitter();
44
- this.selectionChange = new EventEmitter();
45
- this.filteredItems$ = new BehaviorSubject([]);
46
- this.itemFilterCtrl = new UntypedFormControl();
47
- this.isClearAll = false;
48
- this.showFilteredAllOption = true;
49
- this.selectedItems = [];
50
- this.notSelectedItems = [];
51
- this.subscriptions = new Subscription();
52
- // eslint-disable-next-line @typescript-eslint/no-empty-function
53
- this.onChange = () => {
54
- };
55
- // eslint-disable-next-line @typescript-eslint/no-empty-function
56
- this.onTouch = () => {
57
- };
58
- }
59
- ngOnChanges(changes) {
60
- const { items } = changes;
61
- if (items && items.currentValue) {
62
- this.filterItems();
63
- if (this.multiple && this.useSelectAllOption && this.allSelected?.selected) {
64
- setTimeout(() => {
65
- this.control.patchValue([...this.filteredItems$.value.map((item) => item.value), this.selectAllValue], {
66
- emitEvent: false,
67
- });
68
- }, 100);
69
- }
70
- }
71
- }
72
- ngAfterViewInit() {
73
- const ngControl = this.injector.get(NgControl, null);
74
- if (ngControl) {
75
- this.control = ngControl.control;
76
- }
77
- if (this.matSelectSearchComponent) {
78
- this.matSelectSearchComponent._showNoEntriesFound$ = combineLatest([
79
- this.itemFilterCtrl.valueChanges,
80
- this.filteredItems$,
81
- ]).pipe(map(([value, items]) => this.matSelectSearchComponent.noEntriesFoundLabel &&
82
- value &&
83
- items.length === 0));
84
- }
85
- }
86
- ngOnInit() {
87
- this.subscriptions.add(this.itemFilterCtrl.valueChanges
88
- .pipe(debounceTime(200))
89
- .subscribe((value) => {
90
- this.filterItems();
91
- this.updateFilterItems.emit(value);
92
- if (this.isClearAll) {
93
- this.control.patchValue([], { emitEvent: false });
94
- this.isClearAll = false;
95
- }
96
- }));
97
- }
98
- toggleAllSelection() {
99
- if (this.allSelected.selected) {
100
- if (this.useSearchOption) {
101
- this.control.patchValue([...this.filteredItems$.value.map((item) => item.value), this.selectAllValue]);
102
- }
103
- else {
104
- this.control.patchValue([...this.items.map((item) => item.value), this.selectAllValue]);
105
- }
106
- }
107
- else {
108
- this.control.patchValue([]);
109
- this.isClearAll = true;
110
- }
111
- }
112
- togglePerOne() {
113
- setTimeout(() => {
114
- if (this.allSelected) {
115
- if (this.allSelected.selected) {
116
- this.allSelected.deselect();
117
- }
118
- if (this.setAllOptionAfterChosenAllItems && this.control.value.length === this.items.length) {
119
- this.allSelected.select();
120
- }
121
- }
122
- });
123
- this.isClearAll = false;
124
- }
125
- toggleNone() {
126
- this.selectedItems = [];
127
- }
128
- getAllSelectedChecked() {
129
- return this.allSelected !== undefined && this.allSelected.selected;
130
- }
131
- getLabel(val) {
132
- if (this.useSelectAllOption && this.allSelected?.selected && this.items && this.items.length > 0) {
133
- return this.items[0].label;
134
- }
135
- let item;
136
- if (val !== undefined) {
137
- if (this.useSearchOption) {
138
- if (this.selectedItems && this.selectedItems.length > 0) {
139
- // eslint-disable-next-line @typescript-eslint/no-shadow
140
- item = this.selectedItems.find((item) => item.value === val);
141
- }
142
- }
143
- else {
144
- if (this.items && this.items.length > 0) {
145
- // eslint-disable-next-line @typescript-eslint/no-shadow
146
- item = this.items.find((item) => item.value === val);
147
- }
148
- }
149
- return item ? item.label : '';
150
- }
151
- return '';
152
- }
153
- writeValue(value) {
154
- this.value = value;
155
- }
156
- registerOnChange(fn) {
157
- this.onChange = fn;
158
- }
159
- registerOnTouched(fn) {
160
- this.onTouch = fn;
161
- }
162
- ngOnDestroy() {
163
- this.subscriptions.unsubscribe();
164
- }
165
- onSelectionChanged($event) {
166
- this.selectionChange.emit($event);
167
- }
168
- filterItems() {
169
- this.setSelectedItems();
170
- if (!this.items) {
171
- return;
172
- }
173
- // get the search keyword
174
- let search = this.itemFilterCtrl.value;
175
- if (!search || search === '') {
176
- if (this.useSearchOption && !this.items?.length) {
177
- this.filteredItems$.next([...this.selectedItems]);
178
- }
179
- else {
180
- this.filteredItems$.next(this.items?.slice());
181
- }
182
- this.showFilteredAllOption = true;
183
- return;
184
- }
185
- search = search.toLowerCase();
186
- this.showFilteredAllOption =
187
- this.allLabel.toLowerCase().includes(search.toLowerCase()) ||
188
- (this.value instanceof Array && this.value.includes(this.selectAllValue)) ||
189
- (!(this.value instanceof Array) && this.value === this.selectAllValue);
190
- this.changeDetectorRef.detectChanges();
191
- if (this.useSearchOption) {
192
- const filteredItems = this.notSelectedItems?.length > 0
193
- ? this.notSelectedItems.filter((item) => item.label.toLowerCase().includes(search.toLowerCase()))
194
- : [];
195
- this.filteredItems$.next([...this.selectedItems, ...filteredItems]);
196
- }
197
- else {
198
- this.filteredItems$.next(this.items?.length > 0
199
- ? this.items.filter((item) => item.label.toLowerCase().includes(search.toLowerCase()))
200
- : []);
201
- }
202
- }
203
- setSelectedItems() {
204
- if (this.useSearchOption) {
205
- const selectedItems = [];
206
- if (this.value) {
207
- if (this.value instanceof Array) {
208
- const skipSteps = this.value.includes(this.selectAllValue);
209
- if (!skipSteps) {
210
- this.value.forEach((value) => {
211
- const index = this.selectedItems.findIndex((selectedItem) => selectedItem.value === value);
212
- if (index !== -1) {
213
- selectedItems.push(this.selectedItems[index]);
214
- }
215
- else {
216
- // eslint-disable-next-line @typescript-eslint/no-shadow
217
- const item = this.items.find((item) => item.value === value);
218
- if (item) {
219
- selectedItems.push(item);
220
- }
221
- }
222
- });
223
- this.selectedItems.forEach((selectedItem) => {
224
- const index = this.value.find((value) => selectedItem.value === value);
225
- if (index === -1) {
226
- selectedItems.splice(index, 1);
227
- }
228
- });
229
- }
230
- }
231
- else {
232
- const index = this.selectedItems.findIndex((selectedItem) => selectedItem.value === this.value);
233
- if (index !== -1) {
234
- selectedItems.push(this.selectedItems[index]);
235
- }
236
- else {
237
- // eslint-disable-next-line @typescript-eslint/no-shadow
238
- const item = this.items.find((item) => item.value === this.value);
239
- // eslint-disable-next-line max-depth
240
- if (item) {
241
- selectedItems.push(item);
242
- }
243
- }
244
- }
245
- this.selectedItems = [...selectedItems];
246
- this.notSelectedItems = this.items?.filter((item) => this.selectedItems.findIndex((selectedItem) => selectedItem.value === item.value) === -1);
247
- }
248
- else {
249
- this.notSelectedItems = this.items?.slice();
250
- }
251
- }
252
- }
253
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EcabsSelectComponent, deps: [{ token: i0.Injector }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
254
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: EcabsSelectComponent, selector: "ecabs-select", inputs: { items: "items", multiple: "multiple", useNoneOption: "useNoneOption", useOnlyDisabledClass: "useOnlyDisabledClass", searchFieldPlaceholder: "searchFieldPlaceholder", useSearchOption: "useSearchOption", useSelectAllOption: "useSelectAllOption", setAllOptionAfterChosenAllItems: "setAllOptionAfterChosenAllItems", selectAllValue: "selectAllValue", noEntriesFoundLabel: "noEntriesFoundLabel", noneLabel: "noneLabel", allLabel: "allLabel", otherLabel: "otherLabel", othersLabel: "othersLabel" }, outputs: { updateFilterItems: "updateFilterItems", selectionChange: "selectionChange" }, providers: [
255
- {
256
- provide: NG_VALUE_ACCESSOR,
257
- useExisting: EcabsSelectComponent,
258
- multi: true,
259
- },
260
- ], viewQueries: [{ propertyName: "allSelected", first: true, predicate: ["allSelected"], descendants: true }, { propertyName: "matSelectSearchComponent", first: true, predicate: MatSelectSearchComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<app-element-wrapper [data]=\"getData()\">\r\n <mat-form-field [ngClass]=\"{ disabled: useOnlyDisabledClass }\">\r\n <mat-select\r\n class=\"form-field__select\"\r\n [(ngModel)]=\"value\"\r\n (closed)=\"onTouch()\"\r\n [id]=\"name\"\r\n appearance=\"outline\"\r\n [multiple]=\"multiple\"\r\n [disabled]=\"disabled\"\r\n [placeholder]=\"placeholder\"\r\n [disableRipple]=\"true\"\r\n (selectionChange)=\"onSelectionChanged($event)\"\r\n >\r\n <mat-select-trigger>\r\n <span *ngIf=\"getAllSelectedChecked()\">{{ allLabel }}</span>\r\n <span *ngIf=\"!getAllSelectedChecked()\"\r\n >{{ val && multiple ? getLabel(val[0]) : getLabel(val) }}\r\n <span *ngIf=\"multiple && value?.length > 1\" class=\"additional-selection\">\r\n (+{{ useSelectAllOption && this.allSelected?.selected ? value?.length - 2 : value?.length - 1 }}\r\n {{ (value?.length === 2 ? otherLabel : othersLabel) }})\r\n </span>\r\n </span>\r\n </mat-select-trigger>\r\n <mat-option *ngIf=\"useSearchOption\">\r\n <ngx-mat-select-search\r\n [formControl]=\"itemFilterCtrl\"\r\n [placeholderLabel]=\"searchFieldPlaceholder\"\r\n [noEntriesFoundLabel]=\"noEntriesFoundLabel\"\r\n ></ngx-mat-select-search>\r\n </mat-option>\r\n <mat-option *ngIf=\"useNoneOption\" (click)=\"toggleNone()\">{{ noneLabel }}</mat-option>\r\n <mat-option\r\n #allSelected\r\n *ngIf=\"useSelectAllOption && showFilteredAllOption\"\r\n (click)=\"toggleAllSelection()\"\r\n [value]=\"selectAllValue\">{{\r\n allLabel\r\n }}</mat-option>\r\n <mat-option *ngFor=\"let item of filteredItems$ | async\" [value]=\"item.value\" (click)=\"togglePerOne()\">\r\n {{ item.label }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n</app-element-wrapper>\r\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.ElementWrapperComponent, selector: "app-element-wrapper", inputs: ["data", "showCloseIcon", "focusedFlag", "showPassword", "control"], outputs: ["showHidePassword", "clear", "increase", "decrease"] }, { kind: "component", type: i3.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i4.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "directive", type: i4.MatLegacySelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i5.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.MatSelectSearchComponent, selector: "ngx-mat-select-search", inputs: ["placeholderLabel", "type", "closeIcon", "closeSvgIcon", "noEntriesFoundLabel", "clearSearchInput", "searching", "disableInitialFocus", "enableClearOnEscapePressed", "preventHomeEndKeyPropagation", "disableScrollToActiveOnOptionsChanged", "ariaLabel", "showToggleAllCheckbox", "toggleAllCheckboxChecked", "toggleAllCheckboxIndeterminate", "toggleAllCheckboxTooltipMessage", "toggleAllCheckboxTooltipPosition", "hideClearSearchButton", "alwaysRestoreSelectedOptionsMulti"], outputs: ["toggleAll"] }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] }); }
261
- }
262
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EcabsSelectComponent, decorators: [{
263
- type: Component,
264
- args: [{ selector: 'ecabs-select', providers: [
265
- {
266
- provide: NG_VALUE_ACCESSOR,
267
- useExisting: EcabsSelectComponent,
268
- multi: true,
269
- },
270
- ], template: "<app-element-wrapper [data]=\"getData()\">\r\n <mat-form-field [ngClass]=\"{ disabled: useOnlyDisabledClass }\">\r\n <mat-select\r\n class=\"form-field__select\"\r\n [(ngModel)]=\"value\"\r\n (closed)=\"onTouch()\"\r\n [id]=\"name\"\r\n appearance=\"outline\"\r\n [multiple]=\"multiple\"\r\n [disabled]=\"disabled\"\r\n [placeholder]=\"placeholder\"\r\n [disableRipple]=\"true\"\r\n (selectionChange)=\"onSelectionChanged($event)\"\r\n >\r\n <mat-select-trigger>\r\n <span *ngIf=\"getAllSelectedChecked()\">{{ allLabel }}</span>\r\n <span *ngIf=\"!getAllSelectedChecked()\"\r\n >{{ val && multiple ? getLabel(val[0]) : getLabel(val) }}\r\n <span *ngIf=\"multiple && value?.length > 1\" class=\"additional-selection\">\r\n (+{{ useSelectAllOption && this.allSelected?.selected ? value?.length - 2 : value?.length - 1 }}\r\n {{ (value?.length === 2 ? otherLabel : othersLabel) }})\r\n </span>\r\n </span>\r\n </mat-select-trigger>\r\n <mat-option *ngIf=\"useSearchOption\">\r\n <ngx-mat-select-search\r\n [formControl]=\"itemFilterCtrl\"\r\n [placeholderLabel]=\"searchFieldPlaceholder\"\r\n [noEntriesFoundLabel]=\"noEntriesFoundLabel\"\r\n ></ngx-mat-select-search>\r\n </mat-option>\r\n <mat-option *ngIf=\"useNoneOption\" (click)=\"toggleNone()\">{{ noneLabel }}</mat-option>\r\n <mat-option\r\n #allSelected\r\n *ngIf=\"useSelectAllOption && showFilteredAllOption\"\r\n (click)=\"toggleAllSelection()\"\r\n [value]=\"selectAllValue\">{{\r\n allLabel\r\n }}</mat-option>\r\n <mat-option *ngFor=\"let item of filteredItems$ | async\" [value]=\"item.value\" (click)=\"togglePerOne()\">\r\n {{ item.label }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n</app-element-wrapper>\r\n" }]
271
- }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { items: [{
272
- type: Input
273
- }], multiple: [{
274
- type: Input
275
- }], useNoneOption: [{
276
- type: Input
277
- }], useOnlyDisabledClass: [{
278
- type: Input
279
- }], searchFieldPlaceholder: [{
280
- type: Input
281
- }], useSearchOption: [{
282
- type: Input
283
- }], useSelectAllOption: [{
284
- type: Input
285
- }], setAllOptionAfterChosenAllItems: [{
286
- type: Input
287
- }], selectAllValue: [{
288
- type: Input
289
- }], noEntriesFoundLabel: [{
290
- type: Input
291
- }], noneLabel: [{
292
- type: Input
293
- }], allLabel: [{
294
- type: Input
295
- }], otherLabel: [{
296
- type: Input
297
- }], othersLabel: [{
298
- type: Input
299
- }], updateFilterItems: [{
300
- type: Output
301
- }], selectionChange: [{
302
- type: Output
303
- }], allSelected: [{
304
- type: ViewChild,
305
- args: ['allSelected']
306
- }], matSelectSearchComponent: [{
307
- type: ViewChild,
308
- args: [MatSelectSearchComponent]
309
- }] } });
1
+ import { Component, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
2
+ import { UntypedFormControl, NgControl, NG_VALUE_ACCESSOR, } from '@angular/forms';
3
+ import { MatSelectSearchComponent } from 'ngx-mat-select-search';
4
+ import { BehaviorSubject, combineLatest, debounceTime, map, Subscription, } from 'rxjs';
5
+ import ElementBaseComponent from '../base/element-base';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/common";
8
+ import * as i2 from "../base/element-wrapper/element-wrapper.component";
9
+ import * as i3 from "@angular/material/legacy-form-field";
10
+ import * as i4 from "@angular/material/legacy-select";
11
+ import * as i5 from "@angular/material/legacy-core";
12
+ import * as i6 from "@angular/forms";
13
+ import * as i7 from "ngx-mat-select-search";
14
+ export class EcabsSelectComponent extends ElementBaseComponent {
15
+ get value() {
16
+ return this.val;
17
+ }
18
+ set value(val) {
19
+ if (this.val !== val) {
20
+ this.val = val;
21
+ this.setSelectedItems();
22
+ this.onChange(val);
23
+ this.onTouch(val);
24
+ }
25
+ }
26
+ constructor(injector, changeDetectorRef) {
27
+ super();
28
+ this.injector = injector;
29
+ this.changeDetectorRef = changeDetectorRef;
30
+ this.multiple = false;
31
+ this.useNoneOption = false;
32
+ this.useOnlyDisabledClass = false;
33
+ this.searchFieldPlaceholder = 'Search';
34
+ this.useSearchOption = false;
35
+ this.useSelectAllOption = false;
36
+ this.setAllOptionAfterChosenAllItems = true;
37
+ this.selectAllValue = 0;
38
+ this.noEntriesFoundLabel = 'No matching found';
39
+ this.noneLabel = 'None';
40
+ this.allLabel = 'All';
41
+ this.otherLabel = 'Other';
42
+ this.othersLabel = 'Others';
43
+ this.updateFilterItems = new EventEmitter();
44
+ this.selectionChange = new EventEmitter();
45
+ this.filteredItems$ = new BehaviorSubject([]);
46
+ this.itemFilterCtrl = new UntypedFormControl();
47
+ this.isClearAll = false;
48
+ this.showFilteredAllOption = true;
49
+ this.selectedItems = [];
50
+ this.notSelectedItems = [];
51
+ this.subscriptions = new Subscription();
52
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
53
+ this.onChange = () => {
54
+ };
55
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
56
+ this.onTouch = () => {
57
+ };
58
+ }
59
+ ngOnChanges(changes) {
60
+ const { items } = changes;
61
+ if (items && items.currentValue) {
62
+ this.filterItems();
63
+ if (this.multiple && this.useSelectAllOption && this.allSelected?.selected) {
64
+ setTimeout(() => {
65
+ this.control.patchValue([...this.filteredItems$.value.map((item) => item.value), this.selectAllValue], {
66
+ emitEvent: false,
67
+ });
68
+ }, 100);
69
+ }
70
+ }
71
+ }
72
+ ngAfterViewInit() {
73
+ const ngControl = this.injector.get(NgControl, null);
74
+ if (ngControl) {
75
+ this.control = ngControl.control;
76
+ }
77
+ if (this.matSelectSearchComponent) {
78
+ this.matSelectSearchComponent._showNoEntriesFound$ = combineLatest([
79
+ this.itemFilterCtrl.valueChanges,
80
+ this.filteredItems$,
81
+ ]).pipe(map(([value, items]) => this.matSelectSearchComponent.noEntriesFoundLabel &&
82
+ value &&
83
+ items.length === 0));
84
+ }
85
+ }
86
+ ngOnInit() {
87
+ this.subscriptions.add(this.itemFilterCtrl.valueChanges
88
+ .pipe(debounceTime(200))
89
+ .subscribe((value) => {
90
+ this.filterItems();
91
+ this.updateFilterItems.emit(value);
92
+ if (this.isClearAll) {
93
+ this.control.patchValue([], { emitEvent: false });
94
+ this.isClearAll = false;
95
+ }
96
+ }));
97
+ }
98
+ toggleAllSelection() {
99
+ if (this.allSelected.selected) {
100
+ if (this.useSearchOption) {
101
+ this.control.patchValue([...this.filteredItems$.value.map((item) => item.value), this.selectAllValue]);
102
+ }
103
+ else {
104
+ this.control.patchValue([...this.items.map((item) => item.value), this.selectAllValue]);
105
+ }
106
+ }
107
+ else {
108
+ this.control.patchValue([]);
109
+ this.isClearAll = true;
110
+ }
111
+ }
112
+ togglePerOne() {
113
+ setTimeout(() => {
114
+ if (this.allSelected) {
115
+ if (this.allSelected.selected) {
116
+ this.allSelected.deselect();
117
+ }
118
+ if (this.setAllOptionAfterChosenAllItems && this.control.value.length === this.items.length) {
119
+ this.allSelected.select();
120
+ }
121
+ }
122
+ });
123
+ this.isClearAll = false;
124
+ }
125
+ toggleNone() {
126
+ this.selectedItems = [];
127
+ }
128
+ getAllSelectedChecked() {
129
+ return this.allSelected !== undefined && this.allSelected.selected;
130
+ }
131
+ getLabel(val) {
132
+ if (this.useSelectAllOption && this.allSelected?.selected && this.items && this.items.length > 0) {
133
+ return this.items[0].label;
134
+ }
135
+ let item;
136
+ if (val !== undefined) {
137
+ if (this.useSearchOption) {
138
+ if (this.selectedItems && this.selectedItems.length > 0) {
139
+ // eslint-disable-next-line @typescript-eslint/no-shadow
140
+ item = this.selectedItems.find((item) => item.value === val);
141
+ }
142
+ }
143
+ else {
144
+ if (this.items && this.items.length > 0) {
145
+ // eslint-disable-next-line @typescript-eslint/no-shadow
146
+ item = this.items.find((item) => item.value === val);
147
+ }
148
+ }
149
+ return item ? item.label : '';
150
+ }
151
+ return '';
152
+ }
153
+ writeValue(value) {
154
+ this.value = value;
155
+ }
156
+ registerOnChange(fn) {
157
+ this.onChange = fn;
158
+ }
159
+ registerOnTouched(fn) {
160
+ this.onTouch = fn;
161
+ }
162
+ ngOnDestroy() {
163
+ this.subscriptions.unsubscribe();
164
+ }
165
+ onSelectionChanged($event) {
166
+ this.selectionChange.emit($event);
167
+ }
168
+ filterItems() {
169
+ this.setSelectedItems();
170
+ if (!this.items) {
171
+ return;
172
+ }
173
+ // get the search keyword
174
+ let search = this.itemFilterCtrl.value;
175
+ if (!search || search === '') {
176
+ if (this.useSearchOption && !this.items?.length) {
177
+ this.filteredItems$.next([...this.selectedItems]);
178
+ }
179
+ else {
180
+ this.filteredItems$.next(this.items?.slice());
181
+ }
182
+ this.showFilteredAllOption = true;
183
+ return;
184
+ }
185
+ search = search.toLowerCase();
186
+ this.showFilteredAllOption =
187
+ this.allLabel.toLowerCase().includes(search.toLowerCase()) ||
188
+ (this.value instanceof Array && this.value.includes(this.selectAllValue)) ||
189
+ (!(this.value instanceof Array) && this.value === this.selectAllValue);
190
+ this.changeDetectorRef.detectChanges();
191
+ if (this.useSearchOption) {
192
+ const filteredItems = this.notSelectedItems?.length > 0
193
+ ? this.notSelectedItems.filter((item) => item.label.toLowerCase().includes(search.toLowerCase()))
194
+ : [];
195
+ this.filteredItems$.next([...this.selectedItems, ...filteredItems]);
196
+ }
197
+ else {
198
+ this.filteredItems$.next(this.items?.length > 0
199
+ ? this.items.filter((item) => item.label.toLowerCase().includes(search.toLowerCase()))
200
+ : []);
201
+ }
202
+ }
203
+ setSelectedItems() {
204
+ if (this.useSearchOption) {
205
+ const selectedItems = [];
206
+ if (this.value) {
207
+ if (this.value instanceof Array) {
208
+ const skipSteps = this.value.includes(this.selectAllValue);
209
+ if (!skipSteps) {
210
+ this.value.forEach((value) => {
211
+ const index = this.selectedItems.findIndex((selectedItem) => selectedItem.value === value);
212
+ if (index !== -1) {
213
+ selectedItems.push(this.selectedItems[index]);
214
+ }
215
+ else {
216
+ // eslint-disable-next-line @typescript-eslint/no-shadow
217
+ const item = this.items.find((item) => item.value === value);
218
+ if (item) {
219
+ selectedItems.push(item);
220
+ }
221
+ }
222
+ });
223
+ this.selectedItems.forEach((selectedItem) => {
224
+ const index = this.value.find((value) => selectedItem.value === value);
225
+ if (index === -1) {
226
+ selectedItems.splice(index, 1);
227
+ }
228
+ });
229
+ }
230
+ }
231
+ else {
232
+ const index = this.selectedItems.findIndex((selectedItem) => selectedItem.value === this.value);
233
+ if (index !== -1) {
234
+ selectedItems.push(this.selectedItems[index]);
235
+ }
236
+ else {
237
+ // eslint-disable-next-line @typescript-eslint/no-shadow
238
+ const item = this.items.find((item) => item.value === this.value);
239
+ // eslint-disable-next-line max-depth
240
+ if (item) {
241
+ selectedItems.push(item);
242
+ }
243
+ }
244
+ }
245
+ this.selectedItems = [...selectedItems];
246
+ this.notSelectedItems = this.items?.filter((item) => this.selectedItems.findIndex((selectedItem) => selectedItem.value === item.value) === -1);
247
+ }
248
+ else {
249
+ this.notSelectedItems = this.items?.slice();
250
+ }
251
+ }
252
+ }
253
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EcabsSelectComponent, deps: [{ token: i0.Injector }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
254
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: EcabsSelectComponent, selector: "ecabs-select", inputs: { items: "items", multiple: "multiple", useNoneOption: "useNoneOption", useOnlyDisabledClass: "useOnlyDisabledClass", searchFieldPlaceholder: "searchFieldPlaceholder", useSearchOption: "useSearchOption", useSelectAllOption: "useSelectAllOption", setAllOptionAfterChosenAllItems: "setAllOptionAfterChosenAllItems", selectAllValue: "selectAllValue", noEntriesFoundLabel: "noEntriesFoundLabel", noneLabel: "noneLabel", allLabel: "allLabel", otherLabel: "otherLabel", othersLabel: "othersLabel" }, outputs: { updateFilterItems: "updateFilterItems", selectionChange: "selectionChange" }, providers: [
255
+ {
256
+ provide: NG_VALUE_ACCESSOR,
257
+ useExisting: EcabsSelectComponent,
258
+ multi: true,
259
+ },
260
+ ], viewQueries: [{ propertyName: "allSelected", first: true, predicate: ["allSelected"], descendants: true }, { propertyName: "matSelectSearchComponent", first: true, predicate: MatSelectSearchComponent, descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<app-element-wrapper [data]=\"getData()\">\r\n <mat-form-field [ngClass]=\"{ disabled: useOnlyDisabledClass }\">\r\n <mat-select\r\n class=\"form-field__select\"\r\n [(ngModel)]=\"value\"\r\n (closed)=\"onTouch()\"\r\n [id]=\"name\"\r\n appearance=\"outline\"\r\n [multiple]=\"multiple\"\r\n [disabled]=\"disabled\"\r\n [placeholder]=\"placeholder\"\r\n [disableRipple]=\"true\"\r\n (selectionChange)=\"onSelectionChanged($event)\"\r\n >\r\n <mat-select-trigger>\r\n <span *ngIf=\"getAllSelectedChecked()\">{{ allLabel }}</span>\r\n <span *ngIf=\"!getAllSelectedChecked()\"\r\n >{{ val && multiple ? getLabel(val[0]) : getLabel(val) }}\r\n <span *ngIf=\"multiple && value?.length > 1\" class=\"additional-selection\">\r\n (+{{ useSelectAllOption && this.allSelected?.selected ? value?.length - 2 : value?.length - 1 }}\r\n {{ (value?.length === 2 ? otherLabel : othersLabel) }})\r\n </span>\r\n </span>\r\n </mat-select-trigger>\r\n <mat-option *ngIf=\"useSearchOption\">\r\n <ngx-mat-select-search\r\n [formControl]=\"itemFilterCtrl\"\r\n [placeholderLabel]=\"searchFieldPlaceholder\"\r\n [noEntriesFoundLabel]=\"noEntriesFoundLabel\"\r\n ></ngx-mat-select-search>\r\n </mat-option>\r\n <mat-option *ngIf=\"useNoneOption\" (click)=\"toggleNone()\">{{ noneLabel }}</mat-option>\r\n <mat-option\r\n #allSelected\r\n *ngIf=\"useSelectAllOption && showFilteredAllOption\"\r\n (click)=\"toggleAllSelection()\"\r\n [value]=\"selectAllValue\">{{\r\n allLabel\r\n }}</mat-option>\r\n <mat-option *ngFor=\"let item of filteredItems$ | async\" [value]=\"item.value\" (click)=\"togglePerOne()\">\r\n {{ item.label }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n</app-element-wrapper>\r\n", dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.ElementWrapperComponent, selector: "app-element-wrapper", inputs: ["data", "showCloseIcon", "focusedFlag", "showPassword", "control"], outputs: ["showHidePassword", "clear", "increase", "decrease"] }, { kind: "component", type: i3.MatLegacyFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "component", type: i4.MatLegacySelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex"], exportAs: ["matSelect"] }, { kind: "directive", type: i4.MatLegacySelectTrigger, selector: "mat-select-trigger" }, { kind: "component", type: i5.MatLegacyOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i7.MatSelectSearchComponent, selector: "ngx-mat-select-search", inputs: ["placeholderLabel", "type", "closeIcon", "closeSvgIcon", "noEntriesFoundLabel", "clearSearchInput", "searching", "disableInitialFocus", "enableClearOnEscapePressed", "preventHomeEndKeyPropagation", "disableScrollToActiveOnOptionsChanged", "ariaLabel", "showToggleAllCheckbox", "toggleAllCheckboxChecked", "toggleAllCheckboxIndeterminate", "toggleAllCheckboxTooltipMessage", "toggleAllCheckboxTooltipPosition", "hideClearSearchButton", "alwaysRestoreSelectedOptionsMulti"], outputs: ["toggleAll"] }, { kind: "directive", type: i6.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }] }); }
261
+ }
262
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EcabsSelectComponent, decorators: [{
263
+ type: Component,
264
+ args: [{ selector: 'ecabs-select', providers: [
265
+ {
266
+ provide: NG_VALUE_ACCESSOR,
267
+ useExisting: EcabsSelectComponent,
268
+ multi: true,
269
+ },
270
+ ], template: "<app-element-wrapper [data]=\"getData()\">\r\n <mat-form-field [ngClass]=\"{ disabled: useOnlyDisabledClass }\">\r\n <mat-select\r\n class=\"form-field__select\"\r\n [(ngModel)]=\"value\"\r\n (closed)=\"onTouch()\"\r\n [id]=\"name\"\r\n appearance=\"outline\"\r\n [multiple]=\"multiple\"\r\n [disabled]=\"disabled\"\r\n [placeholder]=\"placeholder\"\r\n [disableRipple]=\"true\"\r\n (selectionChange)=\"onSelectionChanged($event)\"\r\n >\r\n <mat-select-trigger>\r\n <span *ngIf=\"getAllSelectedChecked()\">{{ allLabel }}</span>\r\n <span *ngIf=\"!getAllSelectedChecked()\"\r\n >{{ val && multiple ? getLabel(val[0]) : getLabel(val) }}\r\n <span *ngIf=\"multiple && value?.length > 1\" class=\"additional-selection\">\r\n (+{{ useSelectAllOption && this.allSelected?.selected ? value?.length - 2 : value?.length - 1 }}\r\n {{ (value?.length === 2 ? otherLabel : othersLabel) }})\r\n </span>\r\n </span>\r\n </mat-select-trigger>\r\n <mat-option *ngIf=\"useSearchOption\">\r\n <ngx-mat-select-search\r\n [formControl]=\"itemFilterCtrl\"\r\n [placeholderLabel]=\"searchFieldPlaceholder\"\r\n [noEntriesFoundLabel]=\"noEntriesFoundLabel\"\r\n ></ngx-mat-select-search>\r\n </mat-option>\r\n <mat-option *ngIf=\"useNoneOption\" (click)=\"toggleNone()\">{{ noneLabel }}</mat-option>\r\n <mat-option\r\n #allSelected\r\n *ngIf=\"useSelectAllOption && showFilteredAllOption\"\r\n (click)=\"toggleAllSelection()\"\r\n [value]=\"selectAllValue\">{{\r\n allLabel\r\n }}</mat-option>\r\n <mat-option *ngFor=\"let item of filteredItems$ | async\" [value]=\"item.value\" (click)=\"togglePerOne()\">\r\n {{ item.label }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n</app-element-wrapper>\r\n" }]
271
+ }], ctorParameters: function () { return [{ type: i0.Injector }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { items: [{
272
+ type: Input
273
+ }], multiple: [{
274
+ type: Input
275
+ }], useNoneOption: [{
276
+ type: Input
277
+ }], useOnlyDisabledClass: [{
278
+ type: Input
279
+ }], searchFieldPlaceholder: [{
280
+ type: Input
281
+ }], useSearchOption: [{
282
+ type: Input
283
+ }], useSelectAllOption: [{
284
+ type: Input
285
+ }], setAllOptionAfterChosenAllItems: [{
286
+ type: Input
287
+ }], selectAllValue: [{
288
+ type: Input
289
+ }], noEntriesFoundLabel: [{
290
+ type: Input
291
+ }], noneLabel: [{
292
+ type: Input
293
+ }], allLabel: [{
294
+ type: Input
295
+ }], otherLabel: [{
296
+ type: Input
297
+ }], othersLabel: [{
298
+ type: Input
299
+ }], updateFilterItems: [{
300
+ type: Output
301
+ }], selectionChange: [{
302
+ type: Output
303
+ }], allSelected: [{
304
+ type: ViewChild,
305
+ args: ['allSelected']
306
+ }], matSelectSearchComponent: [{
307
+ type: ViewChild,
308
+ args: [MatSelectSearchComponent]
309
+ }] } });
310
310
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWNhYnMtc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VjYWJzLWNvbXBvbmVudHMvc3JjL2xpYi9lY2Ficy1zZWxlY3QvZWNhYnMtc2VsZWN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VjYWJzLWNvbXBvbmVudHMvc3JjL2xpYi9lY2Ficy1zZWxlY3QvZWNhYnMtc2VsZWN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFHTCxTQUFTLEVBQ1QsWUFBWSxFQUVaLEtBQUssRUFJTCxNQUFNLEVBRU4sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQy9ELE9BQU8sRUFDTCxlQUFlLEVBQ2YsYUFBYSxFQUNiLFlBQVksRUFDWixHQUFHLEVBQ0gsWUFBWSxHQUNiLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxvQkFBb0IsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7O0FBYXhELE1BQU0sT0FBTyxvQkFDWCxTQUFRLG9CQUFvQjtJQW1DNUIsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxHQUFHO1FBQ1gsSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRTtZQUNwQixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUNmLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMs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UzsrQkFDRSxjQUFjLGFBRWI7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLGlCQUFpQjs0QkFDMUIsV0FBVyxzQkFBc0I7NEJBQ2pDLEtBQUssRUFBRSxJQUFJO3lCQUNaO3FCQUNGOytIQUtRLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRywrQkFBK0I7c0JBQXZDLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDSSxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBRUcsZUFBZTtzQkFBeEIsTUFBTTtnQkFFbUIsV0FBVztzQkFBcEMsU0FBUzt1QkFBQyxhQUFhO2dCQUV4Qix3QkFBd0I7c0JBRHZCLFNBQVM7dUJBQUMsd0JBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5qZWN0b3IsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIFVudHlwZWRGb3JtQ29udHJvbCxcclxuICBOZ0NvbnRyb2wsXHJcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge01hdE9wdGlvbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY29yZSc7XHJcbmltcG9ydCB7TWF0U2VsZWN0U2VhcmNoQ29tcG9uZW50fSBmcm9tICduZ3gtbWF0LXNlbGVjdC1zZWFyY2gnO1xyXG5pbXBvcnQge1xyXG4gIEJlaGF2aW9yU3ViamVjdCxcclxuICBjb21iaW5lTGF0ZXN0LFxyXG4gIGRlYm91bmNlVGltZSxcclxuICBtYXAsXHJcbiAgU3Vic2NyaXB0aW9uLFxyXG59IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgRWxlbWVudEJhc2VDb21wb25lbnQgZnJvbSAnLi4vYmFzZS9lbGVtZW50LWJhc2UnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdlY2Ficy1zZWxlY3QnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9lY2Ficy1zZWxlY3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcclxuICAgICAgdXNlRXhpc3Rpbmc6IEVjYWJzU2VsZWN0Q29tcG9uZW50LFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH0sXHJcbiAgXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEVjYWJzU2VsZWN0Q29tcG9uZW50XHJcbiAgZXh0ZW5kcyBFbGVtZW50QmFzZUNvbXBvbmVudFxyXG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgaXRlbXMhOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBhbnkgfVtdO1xyXG4gIEBJbnB1dCgpIG11bHRpcGxlID0gZmFsc2U7XHJcbiAgQElucHV0KCkgdXNlTm9uZU9wdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHVzZU9ubHlEaXNhYmxlZENsYXNzID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2VhcmNoRmllbGRQbGFjZWhvbGRlcjogc3RyaW5nID0gJ1NlYXJjaCc7XHJcbiAgQElucHV0KCkgdXNlU2VhcmNoT3B0aW9uID0gZmFsc2U7XHJcbiAgQElucHV0KCkgdXNlU2VsZWN0QWxsT3B0aW9uID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2V0QWxsT3B0aW9uQWZ0ZXJDaG9zZW5BbGxJdGVtcyA9IHRydWU7XHJcbiAgQElucHV0KCkgc2VsZWN0QWxsVmFsdWU6IGFueSA9IDA7XHJcbiAgQElucHV0KCkgbm9FbnRyaWVzRm91bmRMYWJlbCA9ICdObyBtYXRjaGluZyBmb3VuZCc7XHJcbiAgQElucHV0KCkgbm9uZUxhYmVsID0gJ05vbmUnO1xyXG4gIEBJbnB1dCgpIGFsbExhYmVsID0gJ0FsbCc7XHJcbiAgQElucHV0KCkgb3RoZXJMYWJlbCA9ICdPdGhlcic7XHJcbiAgQElucHV0KCkgb3RoZXJzTGFiZWwgPSAnT3RoZXJzJztcclxuICBAT3V0cHV0KCkgdXBkYXRlRmlsdGVySXRlbXM6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID1cclxuICAgIG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xyXG4gIEBPdXRwdXQoKSBzZWxlY3Rpb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2FsbFNlbGVjdGVkJykgYWxsU2VsZWN0ZWQhOiBNYXRPcHRpb247XHJcbiAgQFZpZXdDaGlsZChNYXRTZWxlY3RTZWFyY2hDb21wb25lbnQpXHJcbiAgbWF0U2VsZWN0U2VhcmNoQ29tcG9uZW50ITogTWF0U2VsZWN0U2VhcmNoQ29tcG9uZW50O1xyXG5cclxuICB2YWwhOiBhbnk7XHJcbiAgZmlsdGVyZWRJdGVtcyQ6IEJlaGF2aW9yU3ViamVjdDx7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBhbnkgfVtdPiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XHJcbiAgICB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBhbnkgfVtdXHJcbiAgPihbXSk7XHJcbiAgaXRlbUZpbHRlckN0cmw6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcclxuICBpc0NsZWFyQWxsID0gZmFsc2U7XHJcbiAgc2hvd0ZpbHRlcmVkQWxsT3B0aW9uID0gdHJ1ZTtcclxuICBzZWxlY3RlZEl0ZW1zOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBhbnkgfVtdID0gW107XHJcbiAgbm90U2VsZWN0ZWRJdGVtczogeyBsYWJlbDogc3RyaW5nOyB2YWx1ZTogYW55IH1bXSA9IFtdO1xyXG4gIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gIGdldCB2YWx1ZSgpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMudmFsO1xyXG4gIH1cclxuXHJcbiAgc2V0IHZhbHVlKHZhbCkge1xyXG4gICAgaWYgKHRoaXMudmFsICE9PSB2YWwpIHtcclxuICAgICAgdGhpcy52YWwgPSB2YWw7XHJcbiAgICAgIHRoaXMuc2V0U2VsZWN0ZWRJdGVtcygpO1xyXG4gICAgICB0aGlzLm9uQ2hhbmdlKHZhbCk7XHJcbiAgICAgIHRoaXMub25Ub3VjaCh2YWwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGluamVjdG9yOiBJbmplY3RvcixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmXHJcbiAgKSB7XHJcbiAgICBzdXBlcigpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgY29uc3Qge2l0ZW1zfSA9IGNoYW5nZXM7XHJcblxyXG4gICAgaWYgKGl0ZW1zICYmIGl0ZW1zLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5tdWx0aXBsZSAmJiB0aGlzLnVzZVNlbGVjdEFsbE9wdGlvbiAmJiB0aGlzLmFsbFNlbGVjdGVkPy5zZWxlY3RlZCkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jb250cm9sLnBhdGNoVmFsdWUoWy4uLnRoaXMuZmlsdGVyZWRJdGVtcyQudmFsdWUubWFwKChpdGVtKSA9PiBpdGVtLnZhbHVlKSwgdGhpcy5zZWxlY3RBbGxWYWx1ZV0sIHtcclxuICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0sIDEwMCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IG5nQ29udHJvbDogTmdDb250cm9sID0gdGhpcy5pbmplY3Rvci5nZXQoXHJcbiAgICAgIE5nQ29udHJvbCxcclxuICAgICAgbnVsbFxyXG4gICAgKSBhcyBOZ0NvbnRyb2w7XHJcblxyXG4gICAgaWYgKG5nQ29udHJvbCkge1xyXG4gICAgICB0aGlzLmNvbnRyb2wgPSBuZ0NvbnRyb2wuY29udHJvbCBhcyBVbnR5cGVkRm9ybUNvbnRyb2w7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMubWF0U2VsZWN0U2VhcmNoQ29tcG9uZW50KSB7XHJcbiAgICAgIHRoaXMubWF0U2VsZWN0U2VhcmNoQ29tcG9uZW50Ll9zaG93Tm9FbnRyaWVzRm91bmQkID0gY29tYmluZUxhdGVzdChbXHJcbiAgICAgICAgdGhpcy5pdGVtRmlsdGVyQ3RybC52YWx1ZUNoYW5nZXMsXHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zJCxcclxuICAgICAgXSkucGlwZShcclxuICAgICAgICBtYXAoXHJcbiAgICAgICAgICAoW3ZhbHVlLCBpdGVtc10pID0+XHJcbiAgICAgICAgICAgIHRoaXMubWF0U2VsZWN0U2VhcmNoQ29tcG9uZW50Lm5vRW50cmllc0ZvdW5kTGFiZWwgJiZcclxuICAgICAgICAgICAgdmFsdWUgJiZcclxuICAgICAgICAgICAgaXRlbXMubGVuZ3RoID09PSAwXHJcbiAgICAgICAgKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKFxyXG4gICAgICB0aGlzLml0ZW1GaWx0ZXJDdHJsLnZhbHVlQ2hhbmdlc1xyXG4gICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgyMDApKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKHZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcclxuICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVySXRlbXMuZW1pdCh2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuaXNDbGVhckFsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2wucGF0Y2hWYWx1ZShbXSwge2VtaXRFdmVudDogZmFsc2V9KTtcclxuICAgICAgICAgICAgdGhpcy5pc0NsZWFyQWxsID0gZmFsc2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWVtcHR5LWZ1bmN0aW9uXHJcbiAgb25DaGFuZ2U6IGFueSA9ICgpID0+IHtcclxuICB9O1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZW1wdHktZnVuY3Rpb25cclxuICBvblRvdWNoOiBhbnkgPSAoKSA9PiB7XHJcbiAgfTtcclxuXHJcbiAgdG9nZ2xlQWxsU2VsZWN0aW9uKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYWxsU2VsZWN0ZWQuc2VsZWN0ZWQpIHtcclxuICAgICAgaWYgKHRoaXMudXNlU2VhcmNoT3B0aW9uKSB7XHJcbiAgICAgICAgdGhpcy5jb250cm9sLnBhdGNoVmFsdWUoWy4uLnRoaXMuZmlsdGVyZWRJdGVtcyQudmFsdWUubWFwKChpdGVtKSA9PiBpdGVtLnZhbHVlKSwgdGhpcy5zZWxlY3RBbGxWYWx1ZV0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuY29udHJvbC5wYXRjaFZhbHVlKFsuLi50aGlzLml0ZW1zLm1hcCgoaXRlbSkgPT4gaXRlbS52YWx1ZSksIHRoaXMuc2VsZWN0QWxsVmFsdWVdKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jb250cm9sLnBhdGNoVmFsdWUoW10pO1xyXG4gICAgICB0aGlzLmlzQ2xlYXJBbGwgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlUGVyT25lKCk6IHZvaWQge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIGlmICh0aGlzLmFsbFNlbGVjdGVkKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuYWxsU2VsZWN0ZWQuc2VsZWN0ZWQpIHtcclxuICAgICAgICAgIHRoaXMuYWxsU2VsZWN0ZWQuZGVzZWxlY3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuc2V0QWxsT3B0aW9uQWZ0ZXJDaG9zZW5BbGxJdGVtcyAmJiB0aGlzLmNvbnRyb2wudmFsdWUubGVuZ3RoID09PSB0aGlzLml0ZW1zLmxlbmd0aCkge1xyXG4gICAgICAgICAgdGhpcy5hbGxTZWxlY3RlZC5zZWxlY3QoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaXNDbGVhckFsbCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdG9nZ2xlTm9uZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgZ2V0QWxsU2VsZWN0ZWRDaGVja2VkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuYWxsU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCAmJiB0aGlzLmFsbFNlbGVjdGVkLnNlbGVjdGVkO1xyXG4gIH1cclxuXHJcbiAgZ2V0TGFiZWwodmFsOiBhbnkpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMudXNlU2VsZWN0QWxsT3B0aW9uICYmIHRoaXMuYWxsU2VsZWN0ZWQ/LnNlbGVjdGVkICYmIHRoaXMuaXRlbXMgJiYgdGhpcy5pdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLml0ZW1zWzBdLmxhYmVsO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBpdGVtOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBhbnkgfTtcclxuXHJcbiAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKHRoaXMudXNlU2VhcmNoT3B0aW9uKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtcyAmJiB0aGlzLnNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1zaGFkb3dcclxuICAgICAgICAgIGl0ZW0gPSB0aGlzLnNlbGVjdGVkSXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gdmFsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgdGhpcy5pdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXNoYWRvd1xyXG4gICAgICAgICAgaXRlbSA9IHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gdmFsKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBpdGVtID8gaXRlbS5sYWJlbCA6ICcnO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAnJztcclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2ggPSBmbjtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuICBvblNlbGVjdGlvbkNoYW5nZWQoJGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlLmVtaXQoJGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmlsdGVySXRlbXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNldFNlbGVjdGVkSXRlbXMoKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuaXRlbXMpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldCB0aGUgc2VhcmNoIGtleXdvcmRcclxuICAgIGxldCBzZWFyY2g6IHN0cmluZyA9IHRoaXMuaXRlbUZpbHRlckN0cmwudmFsdWU7XHJcblxyXG4gICAgaWYgKCFzZWFyY2ggfHwgc2VhcmNoID09PSAnJykge1xyXG4gICAgICBpZiAodGhpcy51c2VTZWFyY2hPcHRpb24gJiYgIXRoaXMuaXRlbXM/Lmxlbmd0aCkge1xyXG4gICAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyQubmV4dChbLi4udGhpcy5zZWxlY3RlZEl0ZW1zXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5maWx0ZXJlZEl0ZW1zJC5uZXh0KHRoaXMuaXRlbXM/LnNsaWNlKCkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0aGlzLnNob3dGaWx0ZXJlZEFsbE9wdGlvbiA9IHRydWU7XHJcblxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgc2VhcmNoID0gc2VhcmNoLnRvTG93ZXJDYXNlKCk7XHJcblxyXG4gICAgdGhpcy5zaG93RmlsdGVyZWRBbGxPcHRpb24gPVxyXG4gICAgICB0aGlzLmFsbExhYmVsLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc2VhcmNoLnRvTG93ZXJDYXNlKCkpIHx8XHJcbiAgICAgICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgQXJyYXkgJiYgdGhpcy52YWx1ZS5pbmNsdWRlcyh0aGlzLnNlbGVjdEFsbFZhbHVlKSkgfHxcclxuICAgICAgKCEodGhpcy52YWx1ZSBpbnN0YW5jZW9mIEFycmF5KSAmJiB0aGlzLnZhbHVlID09PSB0aGlzLnNlbGVjdEFsbFZhbHVlKTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgIGlmICh0aGlzLnVzZVNlYXJjaE9wdGlvbikge1xyXG4gICAgICBjb25zdCBmaWx0ZXJlZEl0ZW1zID1cclxuICAgICAgICB0aGlzLm5vdFNlbGVjdGVkSXRlbXM/Lmxlbmd0aCA+IDBcclxuICAgICAgICAgID8gdGhpcy5ub3RTZWxlY3RlZEl0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5sYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaC50b0xvd2VyQ2FzZSgpKSlcclxuICAgICAgICAgIDogW107XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRJdGVtcyQubmV4dChbLi4udGhpcy5zZWxlY3RlZEl0ZW1zLCAuLi5maWx0ZXJlZEl0ZW1zXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZpbHRlcmVkSXRlbXMkLm5leHQoXHJcbiAgICAgICAgdGhpcy5pdGVtcz8ubGVuZ3RoID4gMFxyXG4gICAgICAgICAgPyB0aGlzLml0ZW1zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5sYWJlbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaC50b0xvd2VyQ2FzZSgpKSlcclxuICAgICAgICAgIDogW11cclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0U2VsZWN0ZWRJdGVtcygpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnVzZVNlYXJjaE9wdGlvbikge1xyXG4gICAgICBjb25zdCBzZWxlY3RlZEl0ZW1zID0gW107XHJcblxyXG4gICAgICBpZiAodGhpcy52YWx1ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgIGNvbnN0IHNraXBTdGVwcyA9IHRoaXMudmFsdWUuaW5jbHVkZXModGhpcy5zZWxlY3RBbGxWYWx1ZSk7XHJcblxyXG4gICAgICAgICAgaWYgKCFza2lwU3RlcHMpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZS5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5zZWxlY3RlZEl0ZW1zLmZpbmRJbmRleCgoc2VsZWN0ZWRJdGVtKSA9PiBzZWxlY3RlZEl0ZW0udmFsdWUgPT09IHZhbHVlKTtcclxuXHJcbiAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcy5wdXNoKHRoaXMuc2VsZWN0ZWRJdGVtc1tpbmRleF0pO1xyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXNoYWRvd1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuaXRlbXMuZmluZCgoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PT0gdmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgICAgIGlmIChpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmZvckVhY2goKHNlbGVjdGVkSXRlbSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy52YWx1ZS5maW5kKCh2YWx1ZSkgPT4gc2VsZWN0ZWRJdGVtLnZhbHVlID09PSB2YWx1ZSk7XHJcblxyXG4gICAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VsZWN0ZWRJdGVtcy5maW5kSW5kZXgoKHNlbGVjdGVkSXRlbSkgPT4gc2VsZWN0ZWRJdGVtLnZhbHVlID09PSB0aGlzLnZhbHVlKTtcclxuXHJcbiAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMucHVzaCh0aGlzLnNlbGVjdGVkSXRlbXNbaW5kZXhdKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tc2hhZG93XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLml0ZW1zLmZpbmQoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT09IHRoaXMudmFsdWUpO1xyXG5cclxuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1kZXB0aFxyXG4gICAgICAgICAgICBpZiAoaXRlbSkge1xyXG4gICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gWy4uLnNlbGVjdGVkSXRlbXNdO1xyXG4gICAgICAgIHRoaXMubm90U2VsZWN0ZWRJdGVtcyA9IHRoaXMuaXRlbXM/LmZpbHRlcihcclxuICAgICAgICAgIChpdGVtKSA9PiB0aGlzLnNlbGVjdGVkSXRlbXMuZmluZEluZGV4KChzZWxlY3RlZEl0ZW0pID0+IHNlbGVjdGVkSXRlbS52YWx1ZSA9PT0gaXRlbS52YWx1ZSkgPT09IC0xXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm5vdFNlbGVjdGVkSXRlbXMgPSB0aGlzLml0ZW1zPy5zbGljZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiIsIjxhcHAtZWxlbWVudC13cmFwcGVyIFtkYXRhXT1cImdldERhdGEoKVwiPlxyXG4gIDxtYXQtZm9ybS1maWVsZCBbbmdDbGFzc109XCJ7IGRpc2FibGVkOiB1c2VPbmx5RGlzYWJsZWRDbGFzcyB9XCI+XHJcbiAgICA8bWF0LXNlbGVjdFxyXG4gICAgICBjbGFzcz1cImZvcm0tZmllbGRfX3NlbGVjdFwiXHJcbiAgICAgIFsobmdNb2RlbCldPVwidmFsdWVcIlxyXG4gICAgICAoY2xvc2VkKT1cIm9uVG91Y2goKVwiXHJcbiAgICAgIFtpZF09XCJuYW1lXCJcclxuICAgICAgYXBwZWFyYW5jZT1cIm91dGxpbmVcIlxyXG4gICAgICBbbXVsdGlwbGVdPVwibXVsdGlwbGVcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxyXG4gICAgICBbZGlzYWJsZVJpcHBsZV09XCJ0cnVlXCJcclxuICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZWQoJGV2ZW50KVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtc2VsZWN0LXRyaWdnZXI+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCJnZXRBbGxTZWxlY3RlZENoZWNrZWQoKVwiPnt7IGFsbExhYmVsIH19PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIWdldEFsbFNlbGVjdGVkQ2hlY2tlZCgpXCJcclxuICAgICAgICAgID57eyB2YWwgJiYgbXVsdGlwbGUgPyBnZXRMYWJlbCh2YWxbMF0pIDogZ2V0TGFiZWwodmFsKSB9fVxyXG4gICAgICAgICAgPHNwYW4gKm5nSWY9XCJtdWx0aXBsZSAmJiB2YWx1ZT8ubGVuZ3RoID4gMVwiIGNsYXNzPVwiYWRkaXRpb25hbC1zZWxlY3Rpb25cIj5cclxuICAgICAgICAgICAgKCt7eyB1c2VTZWxlY3RBbGxPcHRpb24gJiYgdGhpcy5hbGxTZWxlY3RlZD8uc2VsZWN0ZWQgPyB2YWx1ZT8ubGVuZ3RoIC0gMiA6IHZhbHVlPy5sZW5ndGggLSAxIH19XHJcbiAgICAgICAgICAgIHt7ICh2YWx1ZT8ubGVuZ3RoID09PSAyID8gb3RoZXJMYWJlbCA6IG90aGVyc0xhYmVsKSB9fSlcclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvbWF0LXNlbGVjdC10cmlnZ2VyPlxyXG4gICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cInVzZVNlYXJjaE9wdGlvblwiPlxyXG4gICAgICAgIDxuZ3gtbWF0LXNlbGVjdC1zZWFyY2hcclxuICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJpdGVtRmlsdGVyQ3RybFwiXHJcbiAgICAgICAgICBbcGxhY2Vob2xkZXJMYWJlbF09XCJzZWFyY2hGaWVsZFBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgIFtub0VudHJpZXNGb3VuZExhYmVsXT1cIm5vRW50cmllc0ZvdW5kTGFiZWxcIlxyXG4gICAgICAgID48L25neC1tYXQtc2VsZWN0LXNlYXJjaD5cclxuICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICA8bWF0LW9wdGlvbiAqbmdJZj1cInVzZU5vbmVPcHRpb25cIiAoY2xpY2spPVwidG9nZ2xlTm9uZSgpXCI+e3sgbm9uZUxhYmVsIH19PC9tYXQtb3B0aW9uPlxyXG4gICAgICA8bWF0LW9wdGlvblxyXG4gICAgICAjYWxsU2VsZWN0ZWRcclxuICAgICAgKm5nSWY9XCJ1c2VTZWxlY3RBbGxPcHRpb24gJiYgc2hvd0ZpbHRlcmVkQWxsT3B0aW9uXCJcclxuICAgICAgKGNsaWNrKT1cInRvZ2dsZUFsbFNlbGVjdGlvbigpXCJcclxuICAgICAgW3ZhbHVlXT1cInNlbGVjdEFsbFZhbHVlXCI+e3tcclxuICAgICAgICBhbGxMYWJlbFxyXG4gICAgICB9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgPG1hdC1vcHRpb24gKm5nRm9yPVwibGV0IGl0ZW0gb2YgZmlsdGVyZWRJdGVtcyQgfCBhc3luY1wiIFt2YWx1ZV09XCJpdGVtLnZhbHVlXCIgKGNsaWNrKT1cInRvZ2dsZVBlck9uZSgpXCI+XHJcbiAgICAgICAge3sgaXRlbS5sYWJlbCB9fVxyXG4gICAgICA8L21hdC1vcHRpb24+XHJcbiAgICA8L21hdC1zZWxlY3Q+XHJcbiAgPC9tYXQtZm9ybS1maWVsZD5cclxuPC9hcHAtZWxlbWVudC13cmFwcGVyPlxyXG4iXX0=