ngx-st-tables 17.0.64 → 17.0.65

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.
@@ -0,0 +1,302 @@
1
+ import { ChangeDetectionStrategy, Component, input, output, } from '@angular/core';
2
+ import { StSubscribeDestroyComponent } from 'ngx-st-base-functions';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../../../../services/st-tables-translations.service";
5
+ import * as i2 from "@angular/forms";
6
+ import * as i3 from "@angular/material/form-field";
7
+ import * as i4 from "@angular/material/input";
8
+ import * as i5 from "@angular/material/select";
9
+ import * as i6 from "@angular/material/core";
10
+ import * as i7 from "@angular/material/datepicker";
11
+ export class MaterialTableFilterComponent extends StSubscribeDestroyComponent {
12
+ constructor(stTableTranslations, fb) {
13
+ super();
14
+ this.stTableTranslations = stTableTranslations;
15
+ this.fb = fb;
16
+ this.column = input.required({});
17
+ this.filterValue = input({}, {
18
+ transform: (filterValue) => {
19
+ this.setFilterValue(filterValue);
20
+ return filterValue || {};
21
+ },
22
+ });
23
+ this.filterValueChanged = output();
24
+ this.formGroup = this.fb.group({
25
+ matchMode: {
26
+ value: 'contains',
27
+ disabled: true,
28
+ },
29
+ value: '',
30
+ dateFrom: null,
31
+ dateTo: null,
32
+ });
33
+ this.isUpdatingFromOutside = false;
34
+ }
35
+ ngOnInit() {
36
+ this.formGroup.valueChanges.subscribe(() => {
37
+ if (!this.isUpdatingFromOutside) {
38
+ this.updateAfterFormValueChanged();
39
+ }
40
+ });
41
+ // this.filtersValue.subscribe(filtersValue => {
42
+ // console.log('Filters updated child');
43
+ // });
44
+ }
45
+ setFilterValue(newFilterValue) {
46
+ if (newFilterValue) {
47
+ this.formGroup.controls.matchMode.setValue(newFilterValue.matchMode, {
48
+ emitEvent: false,
49
+ });
50
+ if (this.column().filterType === 'date') {
51
+ const tmpValue = newFilterValue.value;
52
+ this.formGroup.controls.dateFrom.setValue(tmpValue[0] ? new Date(tmpValue[0]) : null, { emitEvent: false });
53
+ this.formGroup.controls.dateTo.setValue(tmpValue[1] ? new Date(tmpValue[1]) : null, { emitEvent: false });
54
+ }
55
+ else {
56
+ this.formGroup.controls.value.setValue(newFilterValue.value || '', { emitEvent: false });
57
+ }
58
+ }
59
+ }
60
+ updateAfterFormValueChanged() {
61
+ const tmpValue = this.column().filterType === 'date'
62
+ ? [
63
+ this.formGroup.controls.dateFrom.value
64
+ ? this.formGroup.controls.dateFrom.value.toISOString()
65
+ : null,
66
+ this.formGroup.controls.dateTo.value
67
+ ? this.formGroup.controls.dateTo.value.toISOString()
68
+ : null,
69
+ ]
70
+ : this.formGroup.controls.value.value;
71
+ const newFilter = {
72
+ matchMode: this.formGroup.controls.matchMode.value,
73
+ value: tmpValue,
74
+ };
75
+ this.filterValueChanged.emit(newFilter);
76
+ // const newValue = {
77
+ // ...this.filtersValue(),
78
+ // [this.column().field]: newFilter,
79
+ // };
80
+ //
81
+ // this.filtersValue.set(newValue);
82
+ }
83
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MaterialTableFilterComponent, deps: [{ token: i1.StTablesTranslationsService }, { token: i2.NonNullableFormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
84
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: MaterialTableFilterComponent, selector: "ngx-st-material-table-filter", inputs: { column: { classPropertyName: "column", publicName: "column", isSignal: true, isRequired: true, transformFunction: null }, filterValue: { classPropertyName: "filterValue", publicName: "filterValue", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filterValueChanged: "filterValueChanged" }, usesInheritance: true, ngImport: i0, template: `
85
+ <form class="row" [formGroup]="formGroup" style="width: 100%;">
86
+ <div class="col-auto">
87
+ <mat-form-field appearance="outline" style="width: 120px">
88
+ <mat-label>
89
+ {{ stTableTranslations.getTranslations()().matchMode }}</mat-label
90
+ >
91
+ <input matInput type="text" [formControlName]="'matchMode'" />
92
+ </mat-form-field>
93
+ </div>
94
+
95
+ @if (
96
+ column().filterType === 'string' || column().filterType === 'number'
97
+ ) {
98
+ <div class="col">
99
+ <mat-form-field appearance="outline" style="width: 100%">
100
+ <mat-label>{{
101
+ stTableTranslations.getTranslations()().searchFilter
102
+ }}</mat-label>
103
+ <input
104
+ matInput
105
+ [type]="column().filterType === 'string' ? 'text' : 'number'"
106
+ [formControlName]="'value'"
107
+ />
108
+ </mat-form-field>
109
+ </div>
110
+ }
111
+
112
+ @if (column().filterType === 'date') {
113
+ <div class="col">
114
+ <mat-form-field appearance="outline" style="width: 170px">
115
+ <mat-label>{{
116
+ stTableTranslations.getTranslations()().dateFrom
117
+ }}</mat-label>
118
+ <input
119
+ matInput
120
+ [matDatepicker]="picker1"
121
+ [formControlName]="'dateFrom'"
122
+ />
123
+ <mat-datepicker-toggle
124
+ matIconSuffix
125
+ [for]="picker1"
126
+ ></mat-datepicker-toggle>
127
+ <mat-datepicker #picker1></mat-datepicker>
128
+ </mat-form-field>
129
+ </div>
130
+ <div class="col">
131
+ <mat-form-field appearance="outline" style="width: 170px">
132
+ <mat-label>{{
133
+ stTableTranslations.getTranslations()().dateTo
134
+ }}</mat-label>
135
+ <input
136
+ matInput
137
+ [matDatepicker]="picker2"
138
+ [formControlName]="'dateTo'"
139
+ />
140
+ <mat-datepicker-toggle
141
+ matIconSuffix
142
+ [for]="picker2"
143
+ ></mat-datepicker-toggle>
144
+ <mat-datepicker #picker2></mat-datepicker>
145
+ </mat-form-field>
146
+ </div>
147
+ }
148
+
149
+ @if (column().filterType === 'boolean') {
150
+ <div class="col">
151
+ <mat-form-field appearance="outline" style="width: 100%">
152
+ <mat-label>{{
153
+ stTableTranslations.getTranslations()().booleanPickValue
154
+ }}</mat-label>
155
+ <mat-select [formControlName]="'value'">
156
+ <mat-option value="">{{
157
+ stTableTranslations.getTranslations()().booleanNone
158
+ }}</mat-option>
159
+ <mat-option [value]="true">{{
160
+ stTableTranslations.getTranslations()().booleanYes
161
+ }}</mat-option>
162
+ <mat-option [value]="false">{{
163
+ stTableTranslations.getTranslations()().booleanNo
164
+ }}</mat-option>
165
+ </mat-select>
166
+ </mat-form-field>
167
+ </div>
168
+ }
169
+
170
+ @if (column().filterType === 'custom') {
171
+ <div class="col">
172
+ <mat-form-field appearance="outline" style="width: 100%">
173
+ <mat-label>{{
174
+ stTableTranslations.getTranslations()().customPickValue
175
+ }}</mat-label>
176
+ <mat-select [formControlName]="'value'">
177
+ <mat-option value="">{{
178
+ stTableTranslations.getTranslations()().customNone
179
+ }}</mat-option>
180
+ @for (option of column().customFilterOptions; track option) {
181
+ <mat-option [value]="option.value">
182
+ {{ option.label }}
183
+ </mat-option>
184
+ }
185
+ </mat-select>
186
+ </mat-form-field>
187
+ </div>
188
+ }
189
+ </form>
190
+ `, isInline: true, styles: [":host{width:100%}form.row{gap:8px}form.row>:is(.col-auto,.col){padding:0}\n"], dependencies: [{ kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: i7.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i7.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i7.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
191
+ }
192
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: MaterialTableFilterComponent, decorators: [{
193
+ type: Component,
194
+ args: [{ selector: 'ngx-st-material-table-filter', template: `
195
+ <form class="row" [formGroup]="formGroup" style="width: 100%;">
196
+ <div class="col-auto">
197
+ <mat-form-field appearance="outline" style="width: 120px">
198
+ <mat-label>
199
+ {{ stTableTranslations.getTranslations()().matchMode }}</mat-label
200
+ >
201
+ <input matInput type="text" [formControlName]="'matchMode'" />
202
+ </mat-form-field>
203
+ </div>
204
+
205
+ @if (
206
+ column().filterType === 'string' || column().filterType === 'number'
207
+ ) {
208
+ <div class="col">
209
+ <mat-form-field appearance="outline" style="width: 100%">
210
+ <mat-label>{{
211
+ stTableTranslations.getTranslations()().searchFilter
212
+ }}</mat-label>
213
+ <input
214
+ matInput
215
+ [type]="column().filterType === 'string' ? 'text' : 'number'"
216
+ [formControlName]="'value'"
217
+ />
218
+ </mat-form-field>
219
+ </div>
220
+ }
221
+
222
+ @if (column().filterType === 'date') {
223
+ <div class="col">
224
+ <mat-form-field appearance="outline" style="width: 170px">
225
+ <mat-label>{{
226
+ stTableTranslations.getTranslations()().dateFrom
227
+ }}</mat-label>
228
+ <input
229
+ matInput
230
+ [matDatepicker]="picker1"
231
+ [formControlName]="'dateFrom'"
232
+ />
233
+ <mat-datepicker-toggle
234
+ matIconSuffix
235
+ [for]="picker1"
236
+ ></mat-datepicker-toggle>
237
+ <mat-datepicker #picker1></mat-datepicker>
238
+ </mat-form-field>
239
+ </div>
240
+ <div class="col">
241
+ <mat-form-field appearance="outline" style="width: 170px">
242
+ <mat-label>{{
243
+ stTableTranslations.getTranslations()().dateTo
244
+ }}</mat-label>
245
+ <input
246
+ matInput
247
+ [matDatepicker]="picker2"
248
+ [formControlName]="'dateTo'"
249
+ />
250
+ <mat-datepicker-toggle
251
+ matIconSuffix
252
+ [for]="picker2"
253
+ ></mat-datepicker-toggle>
254
+ <mat-datepicker #picker2></mat-datepicker>
255
+ </mat-form-field>
256
+ </div>
257
+ }
258
+
259
+ @if (column().filterType === 'boolean') {
260
+ <div class="col">
261
+ <mat-form-field appearance="outline" style="width: 100%">
262
+ <mat-label>{{
263
+ stTableTranslations.getTranslations()().booleanPickValue
264
+ }}</mat-label>
265
+ <mat-select [formControlName]="'value'">
266
+ <mat-option value="">{{
267
+ stTableTranslations.getTranslations()().booleanNone
268
+ }}</mat-option>
269
+ <mat-option [value]="true">{{
270
+ stTableTranslations.getTranslations()().booleanYes
271
+ }}</mat-option>
272
+ <mat-option [value]="false">{{
273
+ stTableTranslations.getTranslations()().booleanNo
274
+ }}</mat-option>
275
+ </mat-select>
276
+ </mat-form-field>
277
+ </div>
278
+ }
279
+
280
+ @if (column().filterType === 'custom') {
281
+ <div class="col">
282
+ <mat-form-field appearance="outline" style="width: 100%">
283
+ <mat-label>{{
284
+ stTableTranslations.getTranslations()().customPickValue
285
+ }}</mat-label>
286
+ <mat-select [formControlName]="'value'">
287
+ <mat-option value="">{{
288
+ stTableTranslations.getTranslations()().customNone
289
+ }}</mat-option>
290
+ @for (option of column().customFilterOptions; track option) {
291
+ <mat-option [value]="option.value">
292
+ {{ option.label }}
293
+ </mat-option>
294
+ }
295
+ </mat-select>
296
+ </mat-form-field>
297
+ </div>
298
+ }
299
+ </form>
300
+ `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{width:100%}form.row{gap:8px}form.row>:is(.col-auto,.col){padding:0}\n"] }]
301
+ }], ctorParameters: () => [{ type: i1.StTablesTranslationsService }, { type: i2.NonNullableFormBuilder }] });
302
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwtdGFibGUtZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1zdC10YWJsZXMvc3JjL2xpYi9jb21wb25lbnRzL21hdGVyaWFsLXRhYmxlL21hdGVyaWFsLXRhYmxlLWNhcHRpb24vbWF0ZXJpYWwtdGFibGUtZmlsdGVyLWRpYWxvZy9tYXRlcmlhbC10YWJsZS1maWx0ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULEtBQUssRUFJTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFJdkIsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7OztBQW9JcEUsTUFBTSxPQUFPLDRCQUNYLFNBQVEsMkJBQTJCO0lBdUJuQyxZQUNTLG1CQUFnRCxFQUMvQyxFQUEwQjtRQUVsQyxLQUFLLEVBQUUsQ0FBQztRQUhELHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBNkI7UUFDL0MsT0FBRSxHQUFGLEVBQUUsQ0FBd0I7UUF0QnBDLFdBQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFpQyxFQUFFLENBQUMsQ0FBQztRQUM1RCxnQkFBVyxHQUFHLEtBQUssQ0FBQyxFQUEyQixFQUFFO1lBQy9DLFNBQVMsRUFBRSxDQUFDLFdBQWtDLEVBQUUsRUFBRTtnQkFDaEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDakMsT0FBTyxXQUFXLElBQUksRUFBRSxDQUFDO1lBQzNCLENBQUM7U0FDRixDQUFDLENBQUM7UUFFSCx1QkFBa0IsR0FBRyxNQUFNLEVBQXlCLENBQUM7UUFFckQsY0FBUyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3hCLFNBQVMsRUFBRTtnQkFDVCxLQUFLLEVBQXNDLFVBQVU7Z0JBQ3JE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U0FBUyxDQUFDLENBQUM7UUFDeEMscUJBQXFCO1FBQ3JCLDRCQUE0QjtRQUM1QixzQ0FBc0M7UUFDdEMsS0FBSztRQUNMLEVBQUU7UUFDRixtQ0FBbUM7SUFDckMsQ0FBQzsrR0E5RlUsNEJBQTRCO21HQUE1Qiw0QkFBNEIsa2FBNUg3Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBHVDs7NEZBa0JVLDRCQUE0QjtrQkE5SHhDLFNBQVM7K0JBQ0UsOEJBQThCLFlBQzlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEdULG1CQWdCZ0IsdUJBQXVCLENBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ29tcG9uZW50LFxyXG4gIGlucHV0LFxyXG4gIG1vZGVsLFxyXG4gIE9uSW5pdCxcclxuICBlZmZlY3QsXHJcbiAgb3V0cHV0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdFRhYmxlc1RyYW5zbGF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9zdC10YWJsZXMtdHJhbnNsYXRpb25zLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBWaWV3U3RNYXRlcmlhbFRhYmxlQ29sdW1uTW9kZWwgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvdmlldy92aWV3LXN0LW1hdGVyaWFsLXRhYmxlLWNvbHVtbi5tb2RlbCc7XHJcbmltcG9ydCB7IE5vbk51bGxhYmxlRm9ybUJ1aWxkZXIgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFN0U3Vic2NyaWJlRGVzdHJveUNvbXBvbmVudCB9IGZyb20gJ25neC1zdC1iYXNlLWZ1bmN0aW9ucyc7XHJcbmltcG9ydCB7XHJcbiAgU3RNYXRlcmlhbFRhYmxlRmlsdGVyLFxyXG4gIFN0TWF0ZXJpYWxUYWJsZUZpbHRlck1hdGNoTW9kZVR5cGUsXHJcbn0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL21vZGVscyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25neC1zdC1tYXRlcmlhbC10YWJsZS1maWx0ZXInLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8Zm9ybSBjbGFzcz1cInJvd1wiIFtmb3JtR3JvdXBdPVwiZm9ybUdyb3VwXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1hdXRvXCI+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3R5bGU9XCJ3aWR0aDogMTIwcHhcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+XHJcbiAgICAgICAgICAgIHt7IHN0VGFibGVUcmFuc2xhdGlvbnMuZ2V0VHJhbnNsYXRpb25zKCkoKS5tYXRjaE1vZGUgfX08L21hdC1sYWJlbFxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IHR5cGU9XCJ0ZXh0XCIgW2Zvcm1Db250cm9sTmFtZV09XCInbWF0Y2hNb2RlJ1wiIC8+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICBAaWYgKFxyXG4gICAgICAgIGNvbHVtbigpLmZpbHRlclR5cGUgPT09ICdzdHJpbmcnIHx8IGNvbHVtbigpLmZpbHRlclR5cGUgPT09ICdudW1iZXInXHJcbiAgICAgICkge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbD57e1xyXG4gICAgICAgICAgICAgIHN0VGFibGVUcmFuc2xhdGlvbnMuZ2V0VHJhbnNsYXRpb25zKCkoKS5zZWFyY2hGaWx0ZXJcclxuICAgICAgICAgICAgfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgbWF0SW5wdXRcclxuICAgICAgICAgICAgICBbdHlwZV09XCJjb2x1bW4oKS5maWx0ZXJUeXBlID09PSAnc3RyaW5nJyA/ICd0ZXh0JyA6ICdudW1iZXInXCJcclxuICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cIid2YWx1ZSdcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG5cclxuICAgICAgQGlmIChjb2x1bW4oKS5maWx0ZXJUeXBlID09PSAnZGF0ZScpIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBzdHlsZT1cIndpZHRoOiAxNzBweFwiPlxyXG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7XHJcbiAgICAgICAgICAgICAgc3RUYWJsZVRyYW5zbGF0aW9ucy5nZXRUcmFuc2xhdGlvbnMoKSgpLmRhdGVGcm9tXHJcbiAgICAgICAgICAgIH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgIDxpbnB1dFxyXG4gICAgICAgICAgICAgIG1hdElucHV0XHJcbiAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwicGlja2VyMVwiXHJcbiAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCInZGF0ZUZyb20nXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZVxyXG4gICAgICAgICAgICAgIG1hdEljb25TdWZmaXhcclxuICAgICAgICAgICAgICBbZm9yXT1cInBpY2tlcjFcIlxyXG4gICAgICAgICAgICA+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XHJcbiAgICAgICAgICAgIDxtYXQtZGF0ZXBpY2tlciAjcGlja2VyMT48L21hdC1kYXRlcGlja2VyPlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBzdHlsZT1cIndpZHRoOiAxNzBweFwiPlxyXG4gICAgICAgICAgICA8bWF0LWxhYmVsPnt7XHJcbiAgICAgICAgICAgICAgc3RUYWJsZVRyYW5zbGF0aW9ucy5nZXRUcmFuc2xhdGlvbnMoKSgpLmRhdGVUb1xyXG4gICAgICAgICAgICB9fTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICBtYXRJbnB1dFxyXG4gICAgICAgICAgICAgIFttYXREYXRlcGlja2VyXT1cInBpY2tlcjJcIlxyXG4gICAgICAgICAgICAgIFtmb3JtQ29udHJvbE5hbWVdPVwiJ2RhdGVUbydcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlXHJcbiAgICAgICAgICAgICAgbWF0SWNvblN1ZmZpeFxyXG4gICAgICAgICAgICAgIFtmb3JdPVwicGlja2VyMlwiXHJcbiAgICAgICAgICAgID48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cclxuICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXIyPjwvbWF0LWRhdGVwaWNrZXI+XHJcbiAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcblxyXG4gICAgICBAaWYgKGNvbHVtbigpLmZpbHRlclR5cGUgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbD57e1xyXG4gICAgICAgICAgICAgIHN0VGFibGVUcmFuc2xhdGlvbnMuZ2V0VHJhbnNsYXRpb25zKCkoKS5ib29sZWFuUGlja1ZhbHVlXHJcbiAgICAgICAgICAgIH19PC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgIDxtYXQtc2VsZWN0IFtmb3JtQ29udHJvbE5hbWVdPVwiJ3ZhbHVlJ1wiPlxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIHZhbHVlPVwiXCI+e3tcclxuICAgICAgICAgICAgICAgIHN0VGFibGVUcmFuc2xhdGlvbnMuZ2V0VHJhbnNsYXRpb25zKCkoKS5ib29sZWFuTm9uZVxyXG4gICAgICAgICAgICAgIH19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCJ0cnVlXCI+e3tcclxuICAgICAgICAgICAgICAgIHN0VGFibGVUcmFuc2xhdGlvbnMuZ2V0VHJhbnNsYXRpb25zKCkoKS5ib29sZWFuWWVzXHJcbiAgICAgICAgICAgICAgfX08L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cImZhbHNlXCI+e3tcclxuICAgICAgICAgICAgICAgIHN0VGFibGVUcmFuc2xhdGlvbnMuZ2V0VHJhbnNsYXRpb25zKCkoKS5ib29sZWFuTm9cclxuICAgICAgICAgICAgICB9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG5cclxuICAgICAgQGlmIChjb2x1bW4oKS5maWx0ZXJUeXBlID09PSAnY3VzdG9tJykge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiIHN0eWxlPVwid2lkdGg6IDEwMCVcIj5cclxuICAgICAgICAgICAgPG1hdC1sYWJlbD57e1xyXG4gICAgICAgICAgICAgIHN0VGFibGVUcmFuc2xhdGlvbnMuZ2V0VHJhbnNsYXRpb25zKCkoKS5jdXN0b21QaWNrVmFsdWVcclxuICAgICAgICAgICAgfX08L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sTmFtZV09XCIndmFsdWUnXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1vcHRpb24gdmFsdWU9XCJcIj57e1xyXG4gICAgICAgICAgICAgICAgc3RUYWJsZVRyYW5zbGF0aW9ucy5nZXRUcmFuc2xhdGlvbnMoKSgpLmN1c3RvbU5vbmVcclxuICAgICAgICAgICAgICB9fTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgICBAZm9yIChvcHRpb24gb2YgY29sdW1uKCkuY3VzdG9tRmlsdGVyT3B0aW9uczsgdHJhY2sgb3B0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwib3B0aW9uLnZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICAgIHt7IG9wdGlvbi5sYWJlbCB9fVxyXG4gICAgICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgfVxyXG4gICAgPC9mb3JtPlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbXHJcbiAgICBgXHJcbiAgICAgIDpob3N0IHtcclxuICAgICAgICB3aWR0aDogMTAwJTtcclxuICAgICAgfVxyXG4gICAgICBmb3JtLnJvdyB7XHJcbiAgICAgICAgZ2FwOiA4cHg7XHJcblxyXG4gICAgICAgICYgPiAuY29sLWF1dG8sXHJcbiAgICAgICAgJiA+IC5jb2wge1xyXG4gICAgICAgICAgcGFkZGluZzogMDtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIGAsXHJcbiAgXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxufSlcclxuZXhwb3J0IGNsYXNzIE1hdGVyaWFsVGFibGVGaWx0ZXJDb21wb25lbnRcclxuICBleHRlbmRzIFN0U3Vic2NyaWJlRGVzdHJveUNvbXBvbmVudFxyXG4gIGltcGxlbWVudHMgT25Jbml0XHJcbntcclxuICBjb2x1bW4gPSBpbnB1dC5yZXF1aXJlZDxWaWV3U3RNYXRlcmlhbFRhYmxlQ29sdW1uTW9kZWw+KHt9KTtcclxuICBmaWx0ZXJWYWx1ZSA9IGlucHV0KHt9IGFzIFN0TWF0ZXJpYWxUYWJsZUZpbHRlciwge1xyXG4gICAgdHJhbnNmb3JtOiAoZmlsdGVyVmFsdWU6IFN0TWF0ZXJpYWxUYWJsZUZpbHRlcikgPT4ge1xyXG4gICAgICB0aGlzLnNldEZpbHRlclZhbHVlKGZpbHRlclZhbHVlKTtcclxuICAgICAgcmV0dXJuIGZpbHRlclZhbHVlIHx8IHt9O1xyXG4gICAgfSxcclxuICB9KTtcclxuXHJcbiAgZmlsdGVyVmFsdWVDaGFuZ2VkID0gb3V0cHV0PFN0TWF0ZXJpYWxUYWJsZUZpbHRlcj4oKTtcclxuXHJcbiAgZm9ybUdyb3VwID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICBtYXRjaE1vZGU6IHtcclxuICAgICAgdmFsdWU6IDxTdE1hdGVyaWFsVGFibGVGaWx0ZXJNYXRjaE1vZGVUeXBlPidjb250YWlucycsXHJcbiAgICAgIGRpc2FibGVkOiB0cnVlLFxyXG4gICAgfSxcclxuICAgIHZhbHVlOiA8bnVsbCB8IHN0cmluZyB8IG51bWJlcj4nJyxcclxuICAgIGRhdGVGcm9tOiA8bnVsbCB8IERhdGU+bnVsbCxcclxuICAgIGRhdGVUbzogPG51bGwgfCBEYXRlPm51bGwsXHJcbiAgfSk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHVibGljIHN0VGFibGVUcmFuc2xhdGlvbnM6IFN0VGFibGVzVHJhbnNsYXRpb25zU2VydmljZSxcclxuICAgIHByaXZhdGUgZmI6IE5vbk51bGxhYmxlRm9ybUJ1aWxkZXJcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuZm9ybUdyb3VwLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuaXNVcGRhdGluZ0Zyb21PdXRzaWRlKSB7XHJcbiAgICAgICAgdGhpcy51cGRhdGVBZnRlckZvcm1WYWx1ZUNoYW5nZWQoKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICAvLyB0aGlzLmZpbHRlcnNWYWx1ZS5zdWJzY3JpYmUoZmlsdGVyc1ZhbHVlID0+IHtcclxuICAgIC8vICAgY29uc29sZS5sb2coJ0ZpbHRlcnMgdXBkYXRlZCBjaGlsZCcpO1xyXG4gICAgLy8gfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGlzVXBkYXRpbmdGcm9tT3V0c2lkZSA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIHNldEZpbHRlclZhbHVlKG5ld0ZpbHRlclZhbHVlOiBTdE1hdGVyaWFsVGFibGVGaWx0ZXIpIHtcclxuICAgIGlmIChuZXdGaWx0ZXJWYWx1ZSkge1xyXG4gICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5tYXRjaE1vZGUuc2V0VmFsdWUobmV3RmlsdGVyVmFsdWUubWF0Y2hNb2RlLCB7XHJcbiAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5jb2x1bW4oKS5maWx0ZXJUeXBlID09PSAnZGF0ZScpIHtcclxuICAgICAgICBjb25zdCB0bXBWYWx1ZSA9IG5ld0ZpbHRlclZhbHVlLnZhbHVlIGFzIFtzdHJpbmcgfCBudWxsLCBzdHJpbmcgfCBudWxsXTtcclxuICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlRnJvbS5zZXRWYWx1ZShcclxuICAgICAgICAgIHRtcFZhbHVlWzBdID8gbmV3IERhdGUodG1wVmFsdWVbMF0hKSA6IG51bGwsXHJcbiAgICAgICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdGhpcy5mb3JtR3JvdXAuY29udHJvbHMuZGF0ZVRvLnNldFZhbHVlKFxyXG4gICAgICAgICAgdG1wVmFsdWVbMV0gPyBuZXcgRGF0ZSh0bXBWYWx1ZVsxXSkgOiBudWxsLFxyXG4gICAgICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH1cclxuICAgICAgICApO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLnZhbHVlLnNldFZhbHVlKFxyXG4gICAgICAgICAgKG5ld0ZpbHRlclZhbHVlLnZhbHVlIGFzIHN0cmluZyB8IG51bWJlciB8IG51bGwpIHx8ICcnLFxyXG4gICAgICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH1cclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUFmdGVyRm9ybVZhbHVlQ2hhbmdlZCgpIHtcclxuICAgIGNvbnN0IHRtcFZhbHVlID1cclxuICAgICAgdGhpcy5jb2x1bW4oKS5maWx0ZXJUeXBlID09PSAnZGF0ZSdcclxuICAgICAgICA/IChbXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmRhdGVGcm9tLnZhbHVlXHJcbiAgICAgICAgICAgICAgPyB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlRnJvbS52YWx1ZS50b0lTT1N0cmluZygpXHJcbiAgICAgICAgICAgICAgOiBudWxsLFxyXG4gICAgICAgICAgICB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5kYXRlVG8udmFsdWVcclxuICAgICAgICAgICAgICA/IHRoaXMuZm9ybUdyb3VwLmNvbnRyb2xzLmRhdGVUby52YWx1ZS50b0lTT1N0cmluZygpXHJcbiAgICAgICAgICAgICAgOiBudWxsLFxyXG4gICAgICAgICAgXSBhcyBbc3RyaW5nIHwgbnVsbCwgc3RyaW5nIHwgbnVsbF0pXHJcbiAgICAgICAgOiB0aGlzLmZvcm1Hcm91cC5jb250cm9scy52YWx1ZS52YWx1ZTtcclxuXHJcbiAgICBjb25zdCBuZXdGaWx0ZXI6IFN0TWF0ZXJpYWxUYWJsZUZpbHRlciA9IHtcclxuICAgICAgbWF0Y2hNb2RlOiB0aGlzLmZvcm1Hcm91cC5jb250cm9scy5tYXRjaE1vZGUudmFsdWUsXHJcbiAgICAgIHZhbHVlOiB0bXBWYWx1ZSxcclxuICAgIH07XHJcblxyXG4gICAgdGhpcy5maWx0ZXJWYWx1ZUNoYW5nZWQuZW1pdChuZXdGaWx0ZXIpO1xyXG4gICAgLy8gY29uc3QgbmV3VmFsdWUgPSB7XHJcbiAgICAvLyAgIC4uLnRoaXMuZmlsdGVyc1ZhbHVlKCksXHJcbiAgICAvLyAgIFt0aGlzLmNvbHVtbigpLmZpZWxkXTogbmV3RmlsdGVyLFxyXG4gICAgLy8gfTtcclxuICAgIC8vXHJcbiAgICAvLyB0aGlzLmZpbHRlcnNWYWx1ZS5zZXQobmV3VmFsdWUpO1xyXG4gIH1cclxufVxyXG4iXX0=