ng-jvx-multiselect 1.3.2 → 16.0.0
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.
- package/esm2020/lib/directives/ng-jvx-disabled-option.directive.mjs +19 -19
- package/esm2020/lib/directives/ng-jvx-focus.directive.mjs +12 -12
- package/esm2020/lib/directives/ng-jvx-group-header.directive.mjs +12 -12
- package/esm2020/lib/directives/ng-jvx-options-template.directive.mjs +12 -12
- package/esm2020/lib/directives/ng-jvx-selection-template.directive.mjs +12 -12
- package/esm2020/lib/ng-jvx-multiselect.component.mjs +487 -179
- package/esm2020/lib/ng-jvx-multiselect.module.mjs +56 -55
- package/esm2020/lib/ng-jvx-multiselect.service.mjs +9 -9
- package/esm2020/lib/ng-jvx-option/ng-jvx-option.component.mjs +29 -13
- package/esm2020/lib/ng-jvx-panel/ng-jvx-panel.component.mjs +44 -25
- package/esm2022/lib/directives/ng-jvx-disabled-option.directive.mjs +49 -0
- package/esm2022/lib/directives/ng-jvx-focus.directive.mjs +29 -0
- package/esm2022/lib/directives/ng-jvx-group-header.directive.mjs +25 -0
- package/esm2022/lib/directives/ng-jvx-options-template.directive.mjs +26 -0
- package/esm2022/lib/directives/ng-jvx-selection-template.directive.mjs +25 -0
- package/esm2022/lib/interfaces/ng-jvx-group-mapper.mjs +2 -0
- package/esm2022/lib/interfaces/ng-jvx-option-mapper.mjs +2 -0
- package/esm2022/lib/interfaces/ng-jvx-search-mapper.mjs +2 -0
- package/esm2022/lib/ng-jvx-multiselect.component.mjs +625 -0
- package/esm2022/lib/ng-jvx-multiselect.module.mjs +96 -0
- package/esm2022/lib/ng-jvx-multiselect.service.mjs +44 -0
- package/esm2022/lib/ng-jvx-option/ng-jvx-option.component.mjs +31 -0
- package/esm2022/lib/ng-jvx-panel/ng-jvx-panel.component.mjs +42 -0
- package/esm2022/lib/utils.mjs +4 -0
- package/esm2022/ng-jvx-multiselect.mjs +5 -0
- package/esm2022/public-api.mjs +16 -0
- package/fesm2015/ng-jvx-multiselect.mjs +615 -170
- package/fesm2015/ng-jvx-multiselect.mjs.map +1 -1
- package/fesm2020/ng-jvx-multiselect.mjs +688 -344
- package/fesm2020/ng-jvx-multiselect.mjs.map +1 -1
- package/fesm2022/ng-jvx-multiselect.mjs +964 -0
- package/fesm2022/ng-jvx-multiselect.mjs.map +1 -0
- package/lib/directives/ng-jvx-disabled-option.directive.d.ts +1 -1
- package/lib/directives/ng-jvx-focus.directive.d.ts +1 -1
- package/lib/directives/ng-jvx-group-header.directive.d.ts +1 -1
- package/lib/directives/ng-jvx-options-template.directive.d.ts +1 -1
- package/lib/directives/ng-jvx-selection-template.directive.d.ts +1 -1
- package/lib/ng-jvx-multiselect.component.d.ts +5 -5
- package/lib/ng-jvx-multiselect.module.d.ts +7 -7
- package/lib/ng-jvx-option/ng-jvx-option.component.d.ts +2 -2
- package/lib/ng-jvx-panel/ng-jvx-panel.component.d.ts +3 -2
- package/package.json +9 -15
- package/src/lib/ng-jvx-multiselect.component.scss +1 -0
|
@@ -0,0 +1,625 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, forwardRef, HostBinding, Input, Optional, Output, Self, ViewChild, ViewChildren, ViewEncapsulation } from '@angular/core';
|
|
2
|
+
import { NgJvxOptionsTemplateDirective } from './directives/ng-jvx-options-template.directive';
|
|
3
|
+
import { UntypedFormControl } from '@angular/forms';
|
|
4
|
+
import { NgJvxOptionComponent } from './ng-jvx-option/ng-jvx-option.component';
|
|
5
|
+
import { HttpHeaders } from '@angular/common/http';
|
|
6
|
+
import { debounceTime, distinctUntilChanged, map, switchMap, takeUntil, tap } from 'rxjs/operators';
|
|
7
|
+
import { forkJoin, fromEvent, noop, of, Subject, timer } from 'rxjs';
|
|
8
|
+
import { NgJvxSelectionTemplateDirective } from './directives/ng-jvx-selection-template.directive';
|
|
9
|
+
import { MatLegacyFormFieldControl as MatFormFieldControl } from '@angular/material/legacy-form-field';
|
|
10
|
+
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
11
|
+
import { NgJvxGroupHeaderDirective } from './directives/ng-jvx-group-header.directive';
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
import * as i1 from "@angular/forms";
|
|
14
|
+
import * as i2 from "./ng-jvx-multiselect.service";
|
|
15
|
+
import * as i3 from "@angular/material/legacy-menu";
|
|
16
|
+
import * as i4 from "@angular/common";
|
|
17
|
+
import * as i5 from "@angular/material/icon";
|
|
18
|
+
import * as i6 from "@angular/material/legacy-list";
|
|
19
|
+
import * as i7 from "@angular/material/legacy-chips";
|
|
20
|
+
import * as i8 from "ngx-scrollbar";
|
|
21
|
+
import * as i9 from "ngx-scrollbar/smooth-scroll";
|
|
22
|
+
import * as i10 from "./ng-jvx-option/ng-jvx-option.component";
|
|
23
|
+
import * as i11 from "./directives/ng-jvx-focus.directive";
|
|
24
|
+
export class NgJvxMultiselectComponent {
|
|
25
|
+
static { this.nextId = 0; }
|
|
26
|
+
get shouldLabelFloat() {
|
|
27
|
+
return this.focused || !this.empty;
|
|
28
|
+
}
|
|
29
|
+
set value(value) {
|
|
30
|
+
this.pValue = value ?? [];
|
|
31
|
+
if (value) {
|
|
32
|
+
this.form.get('selectionValue').setValue(this.pValue.map(v => v[this.itemValue]));
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
this.form.get('selectionValue').setValue(value);
|
|
36
|
+
}
|
|
37
|
+
this.stateChanges.next();
|
|
38
|
+
}
|
|
39
|
+
get value() {
|
|
40
|
+
return this.pValue;
|
|
41
|
+
}
|
|
42
|
+
get required() {
|
|
43
|
+
return this._required;
|
|
44
|
+
}
|
|
45
|
+
set required(req) {
|
|
46
|
+
this._required = coerceBooleanProperty(req);
|
|
47
|
+
this.stateChanges.next();
|
|
48
|
+
}
|
|
49
|
+
get disabled() {
|
|
50
|
+
return this._disabled;
|
|
51
|
+
}
|
|
52
|
+
set disabled(value) {
|
|
53
|
+
this._disabled = coerceBooleanProperty(value);
|
|
54
|
+
this._disabled ? this.parts.disable() : this.parts.enable();
|
|
55
|
+
this.stateChanges.next();
|
|
56
|
+
}
|
|
57
|
+
get pageSize() {
|
|
58
|
+
return this.intPageSize;
|
|
59
|
+
}
|
|
60
|
+
set pageSize(val) {
|
|
61
|
+
if (val < 15) {
|
|
62
|
+
this.intPageSize = 15;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
this.intPageSize = val;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
get errorState() {
|
|
69
|
+
if (this.ngControl != null) {
|
|
70
|
+
return this.ngControl.invalid && this.ngControl.touched;
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
constructor(formBuilder, service, elementRef, changeDetectorRef, ngControl, fb) {
|
|
77
|
+
this.formBuilder = formBuilder;
|
|
78
|
+
this.service = service;
|
|
79
|
+
this.elementRef = elementRef;
|
|
80
|
+
this.changeDetectorRef = changeDetectorRef;
|
|
81
|
+
this.ngControl = ngControl;
|
|
82
|
+
this.id = `jvx-multiselect-${NgJvxMultiselectComponent.nextId++}`;
|
|
83
|
+
this.optionsTemplate = null;
|
|
84
|
+
this.selectionTemplate = null;
|
|
85
|
+
this.groupHeaderTemplate = null;
|
|
86
|
+
// @ContentChild(NgJvxOptionComponent) optionComp: NgJvxOptionComponent;
|
|
87
|
+
// @ContentChild(TemplateRef) optionsTemplate: TemplateRef<any> | null = null;
|
|
88
|
+
this.options = [];
|
|
89
|
+
this.multi = false;
|
|
90
|
+
this.url = '';
|
|
91
|
+
this.requestType = 'get';
|
|
92
|
+
this.itemValue = 'value';
|
|
93
|
+
this.itemText = 'text';
|
|
94
|
+
this.ignorePagination = false;
|
|
95
|
+
this.clearable = false;
|
|
96
|
+
this.closeOnClick = true;
|
|
97
|
+
this.hasErrors = false;
|
|
98
|
+
this.searchMode = null;
|
|
99
|
+
this.searchInput = false;
|
|
100
|
+
this.searchLabel = 'search';
|
|
101
|
+
this.listProp = '';
|
|
102
|
+
this.totalRowsProp = '';
|
|
103
|
+
this.panelClass = '';
|
|
104
|
+
this.searchProp = 'search';
|
|
105
|
+
this.closeButton = false;
|
|
106
|
+
this.mapper = {
|
|
107
|
+
mapOption(source) {
|
|
108
|
+
return of(source);
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
this.multiMapper = {
|
|
112
|
+
mapOptions(source) {
|
|
113
|
+
return of(source);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
this.searchMapper = {
|
|
117
|
+
mapSearch: (source, options) => {
|
|
118
|
+
return of(options.filter(o => o[this.itemText].toString().toLowerCase().includes(source.toString().toLowerCase())));
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
this.requestHeaders = new HttpHeaders();
|
|
122
|
+
// tslint:disable-next-line:variable-name
|
|
123
|
+
this._required = false;
|
|
124
|
+
// tslint:disable-next-line:variable-name
|
|
125
|
+
this._disabled = false;
|
|
126
|
+
this.valueChange = new EventEmitter();
|
|
127
|
+
this.jvxMultiselectOpen = new EventEmitter();
|
|
128
|
+
this.jvxMultiselectOpened = new EventEmitter();
|
|
129
|
+
this.jvxMultiselectClose = new EventEmitter();
|
|
130
|
+
this.jvxMultiselectClosed = new EventEmitter();
|
|
131
|
+
this.scrollEnd = new EventEmitter();
|
|
132
|
+
this.controlType = 'ng-jvx-multiselect';
|
|
133
|
+
this.document = document;
|
|
134
|
+
this.window = window;
|
|
135
|
+
this.isOpen = false;
|
|
136
|
+
this.isLoading = false;
|
|
137
|
+
this.showList = true;
|
|
138
|
+
this.asyncOptions = [];
|
|
139
|
+
this.selectableOptions = [];
|
|
140
|
+
this.orderedOptions = [];
|
|
141
|
+
this.searchValue = '';
|
|
142
|
+
this.yPosition = 'above';
|
|
143
|
+
this.stateChanges = new Subject();
|
|
144
|
+
this.currentPage = 0;
|
|
145
|
+
this.listContainerSize = { height: 'auto', minHeight: '0', width: '100%' };
|
|
146
|
+
this.touched = false;
|
|
147
|
+
this.focused = false;
|
|
148
|
+
this.multiContainerWidth = 100;
|
|
149
|
+
this.searchValueSubject = new Subject();
|
|
150
|
+
this.searchValue$ = this.searchValueSubject.asObservable();
|
|
151
|
+
this.pValue = [];
|
|
152
|
+
this.shouldLoadMore = true;
|
|
153
|
+
this.unsubscribe = new Subject();
|
|
154
|
+
this.unsubscribe$ = this.unsubscribe.asObservable();
|
|
155
|
+
this.intPageSize = 15;
|
|
156
|
+
this.onTouched = () => {
|
|
157
|
+
};
|
|
158
|
+
if (this.ngControl != null) {
|
|
159
|
+
// Setting the value accessor directly (instead of using
|
|
160
|
+
// the providers) to avoid running into a circular import.
|
|
161
|
+
this.ngControl.valueAccessor = this;
|
|
162
|
+
}
|
|
163
|
+
this.parts = fb.group({
|
|
164
|
+
area: '',
|
|
165
|
+
exchange: '',
|
|
166
|
+
subscriber: '',
|
|
167
|
+
});
|
|
168
|
+
this.form = this.formBuilder.group({
|
|
169
|
+
selectionValue: new UntypedFormControl(this.selectionValue)
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
ngOnInit() {
|
|
173
|
+
this.stateChange$.pipe(takeUntil(this.unsubscribe)).subscribe(() => {
|
|
174
|
+
this.changeDetectorRef.markForCheck();
|
|
175
|
+
});
|
|
176
|
+
// this.setSelectableOptions(this.options).subscribe(noop);
|
|
177
|
+
this.selectableOptions = [...this.options];
|
|
178
|
+
this.updateOrderedOptions(this.selectableOptions).subscribe(noop);
|
|
179
|
+
fromEvent(window, 'resize').pipe(takeUntil(this.unsubscribe), debounceTime(100), map(() => {
|
|
180
|
+
return this.listContainerSize.width = this.jvxMultiselect.nativeElement.offsetWidth + 'px';
|
|
181
|
+
}), switchMap(() => timer(100)), tap(() => {
|
|
182
|
+
this.multiContainerWidth = this.multiContainer?.nativeElement?.offsetWidth ?? 100;
|
|
183
|
+
this.yPosition = window.innerHeight - this.jvxMultiselect.nativeElement?.getBoundingClientRect()?.top < 260 ? 'above' : 'below';
|
|
184
|
+
this.changeDetectorRef.markForCheck();
|
|
185
|
+
})).subscribe(noop);
|
|
186
|
+
this.searchValue$.pipe(takeUntil(this.unsubscribe), debounceTime(300), distinctUntilChanged((prev, curr) => {
|
|
187
|
+
return curr === this.searchValue;
|
|
188
|
+
}), switchMap((val) => {
|
|
189
|
+
this.searchValue = val;
|
|
190
|
+
this.currentPage = 0;
|
|
191
|
+
if (this.searchMode === 'client') {
|
|
192
|
+
return this.clientSearch();
|
|
193
|
+
}
|
|
194
|
+
else if (this.url && this.url.length > 0) {
|
|
195
|
+
return this.serverSearch();
|
|
196
|
+
}
|
|
197
|
+
})).subscribe((val) => {
|
|
198
|
+
this.changeDetectorRef.markForCheck();
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
clientSearch() {
|
|
202
|
+
let obs;
|
|
203
|
+
if (this.url && this.url.length > 0) {
|
|
204
|
+
this.selectableOptions = [];
|
|
205
|
+
this.updateOrderedOptions(this.selectableOptions).subscribe(noop);
|
|
206
|
+
this.shouldLoadMore = true;
|
|
207
|
+
obs = this.getList().pipe(map(() => {
|
|
208
|
+
return this.selectableOptions;
|
|
209
|
+
}));
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
obs = of(this.options);
|
|
213
|
+
}
|
|
214
|
+
return obs.pipe(switchMap((val) => this.searchMapper.mapSearch(this.searchValue, val)), switchMap((res) => {
|
|
215
|
+
// return this.setSelectableOptions(res);
|
|
216
|
+
this.selectableOptions = [];
|
|
217
|
+
this.selectableOptions.push(...res);
|
|
218
|
+
return this.updateOrderedOptions(this.selectableOptions);
|
|
219
|
+
}));
|
|
220
|
+
}
|
|
221
|
+
setSelectableOptions(options) {
|
|
222
|
+
this.selectableOptions = [];
|
|
223
|
+
const obs = options.reduce((acc, curr) => {
|
|
224
|
+
acc.push(this.mapper.mapOption(curr));
|
|
225
|
+
return acc;
|
|
226
|
+
}, []);
|
|
227
|
+
// this.mapper.mapOption(option);
|
|
228
|
+
return forkJoin([...obs]).pipe(switchMap((val) => {
|
|
229
|
+
this.selectableOptions.push(...val);
|
|
230
|
+
return this.updateOrderedOptions(this.selectableOptions);
|
|
231
|
+
}));
|
|
232
|
+
}
|
|
233
|
+
serverSearch() {
|
|
234
|
+
this.shouldLoadMore = true;
|
|
235
|
+
this.selectableOptions = [];
|
|
236
|
+
this.shouldLoadMore = true;
|
|
237
|
+
return this.getList();
|
|
238
|
+
}
|
|
239
|
+
ngOnDestroy() {
|
|
240
|
+
this.unsubscribe.next();
|
|
241
|
+
this.stateChanges.complete();
|
|
242
|
+
}
|
|
243
|
+
ngAfterViewInit() {
|
|
244
|
+
timer(0).subscribe(() => {
|
|
245
|
+
this.listContainerSize.width = this.jvxMultiselect.nativeElement.offsetWidth + 'px';
|
|
246
|
+
});
|
|
247
|
+
if (this.scrollbar) {
|
|
248
|
+
this.scrollbar.scrolled.pipe(takeUntil(this.unsubscribe$)).subscribe((e) => {
|
|
249
|
+
this.onScrolled(e);
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
timer(0).pipe(tap(() => {
|
|
253
|
+
this.multiContainerWidth = this.multiContainer?.nativeElement?.offsetWidth ?? 100;
|
|
254
|
+
this.yPosition = window.innerHeight - this.jvxMultiselect.nativeElement?.getBoundingClientRect()?.top < 260 ? 'above' : 'below';
|
|
255
|
+
this.changeDetectorRef.markForCheck();
|
|
256
|
+
})).subscribe(noop);
|
|
257
|
+
}
|
|
258
|
+
ngOnChanges(changes) {
|
|
259
|
+
if (changes.options) {
|
|
260
|
+
// this.setSelectableOptions(this.options).subscribe(noop);
|
|
261
|
+
this.selectableOptions = [...this.options];
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
get selectionValue() {
|
|
265
|
+
return this.value.map((v) => {
|
|
266
|
+
return v[this.itemValue];
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
get empty() {
|
|
270
|
+
const n = this.parts.value;
|
|
271
|
+
return !n.area && !n.exchange && !n.subscriber;
|
|
272
|
+
}
|
|
273
|
+
onCLickOnMenu(e) {
|
|
274
|
+
if (this.multi || this.closeOnClick === false) {
|
|
275
|
+
e.stopPropagation();
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
propagateChange(_) {
|
|
279
|
+
}
|
|
280
|
+
// this is the initial value set to the component
|
|
281
|
+
writeValue(obj) {
|
|
282
|
+
this.value = obj;
|
|
283
|
+
}
|
|
284
|
+
// registers 'fn' that will be fired when changes are made
|
|
285
|
+
// this is how we emit the changes back to the form
|
|
286
|
+
registerOnChange(fn) {
|
|
287
|
+
this.propagateChange = fn;
|
|
288
|
+
}
|
|
289
|
+
registerOnTouched(fn) {
|
|
290
|
+
this.onTouched = fn;
|
|
291
|
+
}
|
|
292
|
+
onChange(e) {
|
|
293
|
+
let vals = e.source.selectedOptions.selected.map(o => o.value);
|
|
294
|
+
vals = this.selectableOptions.filter(o => vals.includes(o[this.itemValue]));
|
|
295
|
+
const selectableIds = this.selectableOptions.map(s => s[this.itemValue]);
|
|
296
|
+
if (this.multi) {
|
|
297
|
+
// if search is active, probably some of the already selected values are not included in the selectable options,
|
|
298
|
+
// so we have to push them in the selected values of the list;
|
|
299
|
+
for (const v of this.value) {
|
|
300
|
+
if (!selectableIds.includes(v[this.itemValue])) {
|
|
301
|
+
vals = [v, ...vals];
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
vals.sort((a, b) => {
|
|
306
|
+
return typeof a[this.itemValue] === 'string' ?
|
|
307
|
+
a[this.itemValue].localeCompare(b[this.itemValue]) : a[this.itemValue] - b[this.itemValue];
|
|
308
|
+
});
|
|
309
|
+
this.value = [...vals];
|
|
310
|
+
this.form.get('selectionValue').setValue(this.value.map(v => v[this.itemValue]));
|
|
311
|
+
this.valueChange.emit(this.value);
|
|
312
|
+
this.propagateChange(this.value);
|
|
313
|
+
this.changeDetectorRef.markForCheck();
|
|
314
|
+
}
|
|
315
|
+
onFocusIn(event) {
|
|
316
|
+
if (!this.focused) {
|
|
317
|
+
this.focused = true;
|
|
318
|
+
this.stateChanges.next();
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
onFocusOut(event) {
|
|
322
|
+
if (!this.elementRef.nativeElement.contains(event.relatedTarget)) {
|
|
323
|
+
this.touched = true;
|
|
324
|
+
this.focused = false;
|
|
325
|
+
this.onTouched();
|
|
326
|
+
this.stateChanges.next();
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
onMenuOpen() {
|
|
330
|
+
this.isOpen = true;
|
|
331
|
+
this.jvxMultiselectOpen.emit();
|
|
332
|
+
}
|
|
333
|
+
onMenuClose() {
|
|
334
|
+
this.isOpen = false;
|
|
335
|
+
this.jvxMultiselectClose.emit();
|
|
336
|
+
}
|
|
337
|
+
deselect(val) {
|
|
338
|
+
this.value = [...this.value.filter(v => v[this.itemValue] !== val[this.itemValue])];
|
|
339
|
+
// this.value.splice(this.value.findIndex(v => v[this.itemValue] === val[this.itemValue]), 1);
|
|
340
|
+
this.form.get('selectionValue').setValue(this.value.map(m => m.value));
|
|
341
|
+
this.valueChange.emit(this.value);
|
|
342
|
+
this.propagateChange(this.value);
|
|
343
|
+
this.changeDetectorRef.markForCheck();
|
|
344
|
+
}
|
|
345
|
+
setSelectionContainerSize() {
|
|
346
|
+
timer(0).subscribe(() => {
|
|
347
|
+
if (this.selectionContainer) {
|
|
348
|
+
this.listContainerSize.height = this.selectionContainer.nativeElement.offsetHeight > 260 ? '260px' : 'auto';
|
|
349
|
+
this.listContainerSize.minHeight = this.selectionContainer.nativeElement.offsetHeight <= 260 ?
|
|
350
|
+
this.selectionContainer.nativeElement.offsetHeight + 'px' : '260px';
|
|
351
|
+
this.listContainerSize.width = this.jvxMultiselect.nativeElement.offsetWidth + 'px';
|
|
352
|
+
}
|
|
353
|
+
this.changeDetectorRef.detectChanges();
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
clickOnMenuTrigger(e) {
|
|
357
|
+
if (!this.disabled) {
|
|
358
|
+
this.showList = false;
|
|
359
|
+
this.shouldLoadMore = true;
|
|
360
|
+
timer(0).subscribe(() => {
|
|
361
|
+
this.showList = true;
|
|
362
|
+
if (this.url.length > 0) {
|
|
363
|
+
e.preventDefault();
|
|
364
|
+
this.selectableOptions.length = 0;
|
|
365
|
+
this.updateOrderedOptions(this.selectableOptions);
|
|
366
|
+
this.getList().subscribe(noop);
|
|
367
|
+
this.setSelectionContainerSize();
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
this.trigger.openMenu();
|
|
371
|
+
this.setSelectionContainerSize();
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
getList() {
|
|
377
|
+
this.isLoading = true;
|
|
378
|
+
return this.service.getList({
|
|
379
|
+
url: this.url,
|
|
380
|
+
requestType: this.requestType,
|
|
381
|
+
data: {},
|
|
382
|
+
currentPage: ++this.currentPage,
|
|
383
|
+
ignorePagination: this.ignorePagination,
|
|
384
|
+
requestHeaders: this.requestHeaders,
|
|
385
|
+
search: this.searchValue,
|
|
386
|
+
searchProp: this.searchProp,
|
|
387
|
+
pageSize: this.intPageSize
|
|
388
|
+
}).pipe(switchMap((val) => this.multiMapper.mapOptions(val)), switchMap((val) => {
|
|
389
|
+
let result = [];
|
|
390
|
+
if (this.listProp.length > 0) {
|
|
391
|
+
result = [...val[this.listProp]];
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
result = [...val];
|
|
395
|
+
}
|
|
396
|
+
if (result.length === 0) {
|
|
397
|
+
this.shouldLoadMore = false;
|
|
398
|
+
this.isLoading = false;
|
|
399
|
+
return of([]);
|
|
400
|
+
}
|
|
401
|
+
else {
|
|
402
|
+
const newOptions = [];
|
|
403
|
+
for (const opt of result) {
|
|
404
|
+
const newOption = this.mapper.mapOption(opt);
|
|
405
|
+
newOptions.push(newOption);
|
|
406
|
+
}
|
|
407
|
+
return forkJoin(newOptions);
|
|
408
|
+
}
|
|
409
|
+
}), switchMap((finVal) => {
|
|
410
|
+
this.selectableOptions.push(...finVal);
|
|
411
|
+
return this.updateOrderedOptions(this.selectableOptions);
|
|
412
|
+
}), map((val) => {
|
|
413
|
+
this.isLoading = false;
|
|
414
|
+
this.trigger.openMenu();
|
|
415
|
+
this.setSelectionContainerSize();
|
|
416
|
+
return val;
|
|
417
|
+
}), tap(() => {
|
|
418
|
+
this.changeDetectorRef.markForCheck();
|
|
419
|
+
}));
|
|
420
|
+
}
|
|
421
|
+
onScrolled(e) {
|
|
422
|
+
if (e.target.scrollTop + 220 + ((this.searchInput ? 0 : 1) * 40) === this.selectionContainer.nativeElement.offsetHeight
|
|
423
|
+
&& !this.isLoading) {
|
|
424
|
+
this.scrollEnd.emit();
|
|
425
|
+
if (this.url && this.url.length > 0 && !this.ignorePagination && this.shouldLoadMore) {
|
|
426
|
+
this.getList().subscribe(noop);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
onMenuOpened() {
|
|
431
|
+
this.jvxMultiselectOpened.emit();
|
|
432
|
+
}
|
|
433
|
+
onMenuClosed() {
|
|
434
|
+
if ((!this.url || this.url.length === 0) && this.searchMode === 'client') {
|
|
435
|
+
this.searchValueSubject.next('');
|
|
436
|
+
}
|
|
437
|
+
else {
|
|
438
|
+
this.searchValue = '';
|
|
439
|
+
this.currentPage = 0;
|
|
440
|
+
}
|
|
441
|
+
this.jvxMultiselectClosed.emit();
|
|
442
|
+
this.changeDetectorRef.markForCheck();
|
|
443
|
+
}
|
|
444
|
+
onSearchInputClick(e) {
|
|
445
|
+
e.stopPropagation();
|
|
446
|
+
}
|
|
447
|
+
onSearchValueChange(e) {
|
|
448
|
+
this.searchValueSubject.next(e.target.value);
|
|
449
|
+
}
|
|
450
|
+
clear(e) {
|
|
451
|
+
e.stopPropagation();
|
|
452
|
+
e.preventDefault();
|
|
453
|
+
this.value = [];
|
|
454
|
+
this.form.get('selectionValue').setValue(this.value.map(v => v[this.itemValue]));
|
|
455
|
+
this.propagateChange(this.value);
|
|
456
|
+
this.valueChange.emit(this.value);
|
|
457
|
+
this.changeDetectorRef.markForCheck();
|
|
458
|
+
}
|
|
459
|
+
setDescribedByIds(ids) {
|
|
460
|
+
const controlElement = this.elementRef.nativeElement
|
|
461
|
+
.querySelector('.ng-jvx-multiselect');
|
|
462
|
+
controlElement.setAttribute('aria-describedby', ids.join(' '));
|
|
463
|
+
}
|
|
464
|
+
onContainerClick(event) {
|
|
465
|
+
// if ((event.target as Element).tagName.toLowerCase() !== 'input') {
|
|
466
|
+
// this.elementRef.nativeElement.querySelector('input').focus();
|
|
467
|
+
// }
|
|
468
|
+
}
|
|
469
|
+
get stateChange$() {
|
|
470
|
+
return this.stateChanges.asObservable();
|
|
471
|
+
}
|
|
472
|
+
updateOrderedOptions(options) {
|
|
473
|
+
let obs = of(options);
|
|
474
|
+
if (this.groupBy) {
|
|
475
|
+
this.orderedOptions.length = 0;
|
|
476
|
+
const obsArr = [];
|
|
477
|
+
for (const option of options) {
|
|
478
|
+
if (typeof this.groupBy !== 'string') {
|
|
479
|
+
obsArr.push(this.groupBy.mapGroup(option));
|
|
480
|
+
}
|
|
481
|
+
else {
|
|
482
|
+
obsArr.push(of({ group: option[this.groupBy], option }));
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
obs = forkJoin(obsArr).pipe(map((res) => {
|
|
486
|
+
const groups = [...new Set(res.map(item => item.group))];
|
|
487
|
+
for (const group of groups) {
|
|
488
|
+
this.orderedOptions.push({
|
|
489
|
+
group,
|
|
490
|
+
options: res.filter(r => r.group === group).map(o => o.option)
|
|
491
|
+
});
|
|
492
|
+
}
|
|
493
|
+
return this.orderedOptions;
|
|
494
|
+
}));
|
|
495
|
+
}
|
|
496
|
+
return obs;
|
|
497
|
+
}
|
|
498
|
+
closeMenu() {
|
|
499
|
+
this.trigger.closeMenu();
|
|
500
|
+
}
|
|
501
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: NgJvxMultiselectComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.NgJvxMultiselectService }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.NgControl, optional: true, self: true }, { token: i1.UntypedFormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
502
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.0.2", type: NgJvxMultiselectComponent, selector: "ng-jvx-multiselect", inputs: { options: "options", multi: "multi", url: "url", requestType: "requestType", itemValue: "itemValue", itemText: "itemText", ignorePagination: "ignorePagination", clearable: "clearable", closeOnClick: "closeOnClick", hasErrors: "hasErrors", searchMode: "searchMode", searchInput: "searchInput", searchLabel: "searchLabel", listProp: "listProp", totalRowsProp: "totalRowsProp", panelClass: "panelClass", searchProp: "searchProp", closeButton: "closeButton", mapper: "mapper", multiMapper: "multiMapper", searchMapper: "searchMapper", groupBy: "groupBy", value: "value", requestHeaders: "requestHeaders", required: "required", disabled: "disabled", pageSize: "pageSize" }, outputs: { valueChange: "valueChange", jvxMultiselectOpen: "jvxMultiselectOpen", jvxMultiselectOpened: "jvxMultiselectOpened", jvxMultiselectClose: "jvxMultiselectClose", jvxMultiselectClosed: "jvxMultiselectClosed", scrollEnd: "scrollEnd" }, host: { properties: { "id": "this.id", "class.floating": "this.shouldLabelFloat" } }, providers: [
|
|
503
|
+
{
|
|
504
|
+
provide: MatFormFieldControl,
|
|
505
|
+
useExisting: forwardRef(() => NgJvxMultiselectComponent),
|
|
506
|
+
multi: true,
|
|
507
|
+
}
|
|
508
|
+
], queries: [{ propertyName: "optionsTemplate", first: true, predicate: NgJvxOptionsTemplateDirective, descendants: true }, { propertyName: "selectionTemplate", first: true, predicate: NgJvxSelectionTemplateDirective, descendants: true }, { propertyName: "groupHeaderTemplate", first: true, predicate: NgJvxGroupHeaderDirective, descendants: true }], viewQueries: [{ propertyName: "jvxMultiselect", first: true, predicate: ["jvxMultiselect"], descendants: true, static: true }, { propertyName: "selectionContainer", first: true, predicate: ["selectionContainer"], descendants: true }, { propertyName: "selection", first: true, predicate: ["selection"], descendants: true, static: true }, { propertyName: "trigger", first: true, predicate: ["trigger"], descendants: true, static: true }, { propertyName: "scrollbar", first: true, predicate: ["scrollbar"], descendants: true }, { propertyName: "multiContainer", first: true, predicate: ["multiContainer"], descendants: true }, { propertyName: "optionComp", predicate: NgJvxOptionComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"ng-jvx-multiselect\" [ngClass]=\"{'disabled': disabled, 'has-errors': hasErrors}\" #jvxMultiselect>\r\n <!-- START MENU -->\r\n <div [matMenuTriggerFor]=\"menuRef\" (onMenuOpen)=\"onMenuOpen()\" (menuOpened)=\"onMenuOpened()\"\r\n (onMenuClose)=\"onMenuClose()\" (menuClosed)=\"onMenuClosed()\"\r\n #trigger=\"matMenuTrigger\">\r\n <mat-menu #menuRef=\"matMenu\" [class]=\"['jvx-multiselect-panel', panelClass].join(' ')\" [formGroup]=\"form\"\r\n [yPosition]=\"yPosition\">\r\n <div *ngIf=\"closeButton\" class=\"closeMenuButton\"><mat-icon >close</mat-icon></div>\r\n <div class=\"menu-list-container\"\r\n #menuLIstContainer\r\n [ngStyle]=\"{'overflow-y': 'hidden', 'width': listContainerSize.width, 'max-height': '260px', 'height': listContainerSize.height, 'min-height': listContainerSize.minHeight}\">\r\n\r\n <div class=\"search-input-container\" *ngIf=\"!!searchInput\" (click)=\"onSearchInputClick($event)\">\r\n <input type=\"text\" [placeholder]=\"searchLabel\" [ngModel]=\"searchValue\" [ngModelOptions]=\"{standalone: true}\"\r\n [ngJvxFocus]=\"isOpen\"\r\n (input)=\"onSearchValueChange($event)\"/>\r\n </div>\r\n <div [ngStyle]=\"{height: searchInput && selectionContainer.clientHeight > 220 || selectionContainer.clientHeight > 260? 260 - (searchInput? 40 : 0) + 'px': 'auto'}\">\r\n <ng-scrollbar style=\"width: 100%\"\r\n smoothScroll\r\n [visibility]=\"'hover'\"\r\n [appearance]=\"'compact'\"\r\n [sensorDisabled]=\"isLoading\"\r\n [autoHeightDisabled]=\"false\" #scrollbar>\r\n <div #selectionContainer (click)=\"onCLickOnMenu($event)\">\r\n <mat-selection-list #selection [multiple]=\"multi\"\r\n *ngIf=\"showList\"\r\n [ngStyle]=\"{'padding': 0, 'width': listContainerSize.width, 'min-width.px': 112}\"\r\n (selectionChange)=\"onChange($event)\"\r\n formControlName=\"selectionValue\">\r\n <ng-content></ng-content>\r\n <ng-container *ngIf=\"!!groupBy\">\r\n <ng-container *ngFor=\"let opt of orderedOptions\">\r\n <ng-container [ngTemplateOutlet]=\"groupHeaderTemplate? groupHeaderTemplate.template: defaultGroupHeaderTemplate\" [ngTemplateOutletContext]=\"{$implicit: opt}\"></ng-container>\r\n\r\n <ng-jvx-option *ngFor=\"let option of opt.options\" [value]=\"option[itemValue]\">\r\n <!-- <ng-container [ngTemplateOutlet]=\"optionsTemplate\" [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>-->\r\n <span style=\"padding-inline: 10px\">\r\n <ng-container [ngTemplateOutlet]=\"optionsTemplate? optionsTemplate.template : defaultTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>\r\n </span>\r\n </ng-jvx-option>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!groupBy || groupBy.length === 0\">\r\n <ng-jvx-option *ngFor=\"let option of selectableOptions\" [value]=\"option[itemValue]\">\r\n <!-- <ng-container [ngTemplateOutlet]=\"optionsTemplate\" [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>-->\r\n <ng-container [ngTemplateOutlet]=\"optionsTemplate? optionsTemplate.template : defaultTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>\r\n </ng-jvx-option>\r\n </ng-container>\r\n </mat-selection-list>\r\n </div>\r\n </ng-scrollbar>\r\n </div>\r\n\r\n </div>\r\n <div class=\"menu-footer\">\r\n <ng-content select=\"[ng-jvx-footer]\"></ng-content>\r\n </div>\r\n\r\n </mat-menu>\r\n </div>\r\n <!-- END MENU -->\r\n <!-- START INPUT -->\r\n <div [ngClass]=\"{'ng-jvx-multiselect-value-container': true, 'is-open': isOpen}\"\r\n (click)=\"clickOnMenuTrigger($event)\"\r\n #valueContainer>\r\n\r\n <div class=\"ng-jvx-multiselect__placeholder\" *ngIf=\"value.length === 0\">\r\n <ng-content select=\"[placeholder]\"></ng-content>\r\n </div>\r\n\r\n <div class=\"ng-jvx-multiselect-value multi-value-container\" *ngIf=\"multi\" #multiContainer>\r\n\r\n <ng-container [ngTemplateOutlet]=\"selectionTemplate? selectionTemplate.template : defaultMultiSelectionTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: value}\"></ng-container>\r\n\r\n\r\n </div>\r\n\r\n <div class=\"ng-jvx-multiselect-value single-value-container\" *ngIf=\"!multi\">\r\n <div *ngFor=\"let val of value\" style=\"width: 100%;\">\r\n <ng-container [ngTemplateOutlet]=\"selectionTemplate? selectionTemplate.template : defaultSelectionTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: val}\"></ng-container></div>\r\n </div>\r\n <div class=\"ng-jvx-multiselect__remove-button\" *ngIf=\"clearable && value.length > 0\" (click)=\"clear($event)\">\r\n <mat-icon style=\"font-size: 18px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\">clear\r\n </mat-icon>\r\n </div>\r\n <div class=\"ng-jvx-multiselect-arrow\">\r\n <mat-icon *ngIf=\"!isLoading\">expand_more</mat-icon>\r\n <div *ngIf=\"isLoading\" class=\"lds-ring\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- END INPUT -->\r\n</div>\r\n<ng-template #defaultTemplate let-option>\r\n <div style=\"max-width: 100%;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\">{{option[itemText]}}\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectionTemplate let-value>\r\n {{value[itemText]}}\r\n</ng-template>\r\n\r\n<ng-template #defaultMultiSelectionTemplate let-value>\r\n <mat-chip-list #chipList [disabled]=\"this.disabled\">\r\n <mat-chip [color]=\"'primary'\" selected *ngFor=\"let val of value\" [selectable]=\"false\"\r\n class=\"ng-jvx-multiselect-chip\"\r\n [removable]=\"true\" (removed)=\"deselect(val)\">\r\n <span class=\"chip-content\"\r\n [ngStyle]=\"{'max-width': multiContainerWidth - 50 +'px'}\">{{val[itemText]}}</span>\r\n\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n </mat-chip-list>\r\n</ng-template>\r\n<ng-template #defaultGroupHeaderTemplate let-opt>\r\n <div style=\"padding-inline: 15px\"><strong>{{opt.group}}</strong></div>\r\n</ng-template>\r\n", styles: [""], dependencies: [{ kind: "component", type: i3.MatLegacyMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "directive", type: i3.MatLegacyMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatLegacySelectionList, selector: "mat-selection-list", inputs: ["disableRipple", "color", "compareWith", "disabled", "multiple"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i7.MatLegacyChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i7.MatLegacyChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i7.MatLegacyChipRemove, selector: "[matChipRemove]" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i8.NgScrollbar, selector: "ng-scrollbar", inputs: ["disabled", "sensorDisabled", "pointerEventsDisabled", "viewportPropagateMouseMove", "autoHeightDisabled", "autoWidthDisabled", "viewClass", "trackClass", "thumbClass", "minThumbSize", "trackClickScrollDuration", "pointerEventsMethod", "track", "visibility", "appearance", "position", "sensorDebounce", "scrollAuditTime"], outputs: ["updated"], exportAs: ["ngScrollbar"] }, { kind: "directive", type: i9.SmoothScroll, selector: "[smoothScroll], [smooth-scroll]", exportAs: ["smoothScroll"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i10.NgJvxOptionComponent, selector: "ng-jvx-option", inputs: ["value"] }, { kind: "directive", type: i11.NgJvxFocusDirective, selector: "[ngJvxFocus]", inputs: ["ngJvxFocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
509
|
+
}
|
|
510
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.0.2", ngImport: i0, type: NgJvxMultiselectComponent, decorators: [{
|
|
511
|
+
type: Component,
|
|
512
|
+
args: [{ selector: 'ng-jvx-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, providers: [
|
|
513
|
+
{
|
|
514
|
+
provide: MatFormFieldControl,
|
|
515
|
+
useExisting: forwardRef(() => NgJvxMultiselectComponent),
|
|
516
|
+
multi: true,
|
|
517
|
+
}
|
|
518
|
+
], template: "<div class=\"ng-jvx-multiselect\" [ngClass]=\"{'disabled': disabled, 'has-errors': hasErrors}\" #jvxMultiselect>\r\n <!-- START MENU -->\r\n <div [matMenuTriggerFor]=\"menuRef\" (onMenuOpen)=\"onMenuOpen()\" (menuOpened)=\"onMenuOpened()\"\r\n (onMenuClose)=\"onMenuClose()\" (menuClosed)=\"onMenuClosed()\"\r\n #trigger=\"matMenuTrigger\">\r\n <mat-menu #menuRef=\"matMenu\" [class]=\"['jvx-multiselect-panel', panelClass].join(' ')\" [formGroup]=\"form\"\r\n [yPosition]=\"yPosition\">\r\n <div *ngIf=\"closeButton\" class=\"closeMenuButton\"><mat-icon >close</mat-icon></div>\r\n <div class=\"menu-list-container\"\r\n #menuLIstContainer\r\n [ngStyle]=\"{'overflow-y': 'hidden', 'width': listContainerSize.width, 'max-height': '260px', 'height': listContainerSize.height, 'min-height': listContainerSize.minHeight}\">\r\n\r\n <div class=\"search-input-container\" *ngIf=\"!!searchInput\" (click)=\"onSearchInputClick($event)\">\r\n <input type=\"text\" [placeholder]=\"searchLabel\" [ngModel]=\"searchValue\" [ngModelOptions]=\"{standalone: true}\"\r\n [ngJvxFocus]=\"isOpen\"\r\n (input)=\"onSearchValueChange($event)\"/>\r\n </div>\r\n <div [ngStyle]=\"{height: searchInput && selectionContainer.clientHeight > 220 || selectionContainer.clientHeight > 260? 260 - (searchInput? 40 : 0) + 'px': 'auto'}\">\r\n <ng-scrollbar style=\"width: 100%\"\r\n smoothScroll\r\n [visibility]=\"'hover'\"\r\n [appearance]=\"'compact'\"\r\n [sensorDisabled]=\"isLoading\"\r\n [autoHeightDisabled]=\"false\" #scrollbar>\r\n <div #selectionContainer (click)=\"onCLickOnMenu($event)\">\r\n <mat-selection-list #selection [multiple]=\"multi\"\r\n *ngIf=\"showList\"\r\n [ngStyle]=\"{'padding': 0, 'width': listContainerSize.width, 'min-width.px': 112}\"\r\n (selectionChange)=\"onChange($event)\"\r\n formControlName=\"selectionValue\">\r\n <ng-content></ng-content>\r\n <ng-container *ngIf=\"!!groupBy\">\r\n <ng-container *ngFor=\"let opt of orderedOptions\">\r\n <ng-container [ngTemplateOutlet]=\"groupHeaderTemplate? groupHeaderTemplate.template: defaultGroupHeaderTemplate\" [ngTemplateOutletContext]=\"{$implicit: opt}\"></ng-container>\r\n\r\n <ng-jvx-option *ngFor=\"let option of opt.options\" [value]=\"option[itemValue]\">\r\n <!-- <ng-container [ngTemplateOutlet]=\"optionsTemplate\" [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>-->\r\n <span style=\"padding-inline: 10px\">\r\n <ng-container [ngTemplateOutlet]=\"optionsTemplate? optionsTemplate.template : defaultTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>\r\n </span>\r\n </ng-jvx-option>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!groupBy || groupBy.length === 0\">\r\n <ng-jvx-option *ngFor=\"let option of selectableOptions\" [value]=\"option[itemValue]\">\r\n <!-- <ng-container [ngTemplateOutlet]=\"optionsTemplate\" [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>-->\r\n <ng-container [ngTemplateOutlet]=\"optionsTemplate? optionsTemplate.template : defaultTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: option}\"></ng-container>\r\n </ng-jvx-option>\r\n </ng-container>\r\n </mat-selection-list>\r\n </div>\r\n </ng-scrollbar>\r\n </div>\r\n\r\n </div>\r\n <div class=\"menu-footer\">\r\n <ng-content select=\"[ng-jvx-footer]\"></ng-content>\r\n </div>\r\n\r\n </mat-menu>\r\n </div>\r\n <!-- END MENU -->\r\n <!-- START INPUT -->\r\n <div [ngClass]=\"{'ng-jvx-multiselect-value-container': true, 'is-open': isOpen}\"\r\n (click)=\"clickOnMenuTrigger($event)\"\r\n #valueContainer>\r\n\r\n <div class=\"ng-jvx-multiselect__placeholder\" *ngIf=\"value.length === 0\">\r\n <ng-content select=\"[placeholder]\"></ng-content>\r\n </div>\r\n\r\n <div class=\"ng-jvx-multiselect-value multi-value-container\" *ngIf=\"multi\" #multiContainer>\r\n\r\n <ng-container [ngTemplateOutlet]=\"selectionTemplate? selectionTemplate.template : defaultMultiSelectionTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: value}\"></ng-container>\r\n\r\n\r\n </div>\r\n\r\n <div class=\"ng-jvx-multiselect-value single-value-container\" *ngIf=\"!multi\">\r\n <div *ngFor=\"let val of value\" style=\"width: 100%;\">\r\n <ng-container [ngTemplateOutlet]=\"selectionTemplate? selectionTemplate.template : defaultSelectionTemplate\"\r\n [ngTemplateOutletContext]=\"{$implicit: val}\"></ng-container></div>\r\n </div>\r\n <div class=\"ng-jvx-multiselect__remove-button\" *ngIf=\"clearable && value.length > 0\" (click)=\"clear($event)\">\r\n <mat-icon style=\"font-size: 18px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\">clear\r\n </mat-icon>\r\n </div>\r\n <div class=\"ng-jvx-multiselect-arrow\">\r\n <mat-icon *ngIf=\"!isLoading\">expand_more</mat-icon>\r\n <div *ngIf=\"isLoading\" class=\"lds-ring\">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n </div>\r\n </div>\r\n </div>\r\n <!-- END INPUT -->\r\n</div>\r\n<ng-template #defaultTemplate let-option>\r\n <div style=\"max-width: 100%;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\">{{option[itemText]}}\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #defaultSelectionTemplate let-value>\r\n {{value[itemText]}}\r\n</ng-template>\r\n\r\n<ng-template #defaultMultiSelectionTemplate let-value>\r\n <mat-chip-list #chipList [disabled]=\"this.disabled\">\r\n <mat-chip [color]=\"'primary'\" selected *ngFor=\"let val of value\" [selectable]=\"false\"\r\n class=\"ng-jvx-multiselect-chip\"\r\n [removable]=\"true\" (removed)=\"deselect(val)\">\r\n <span class=\"chip-content\"\r\n [ngStyle]=\"{'max-width': multiContainerWidth - 50 +'px'}\">{{val[itemText]}}</span>\r\n\r\n <mat-icon matChipRemove>cancel</mat-icon>\r\n </mat-chip>\r\n </mat-chip-list>\r\n</ng-template>\r\n<ng-template #defaultGroupHeaderTemplate let-opt>\r\n <div style=\"padding-inline: 15px\"><strong>{{opt.group}}</strong></div>\r\n</ng-template>\r\n" }]
|
|
519
|
+
}], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }, { type: i2.NgJvxMultiselectService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.NgControl, decorators: [{
|
|
520
|
+
type: Optional
|
|
521
|
+
}, {
|
|
522
|
+
type: Self
|
|
523
|
+
}] }, { type: i1.UntypedFormBuilder }]; }, propDecorators: { id: [{
|
|
524
|
+
type: HostBinding
|
|
525
|
+
}], shouldLabelFloat: [{
|
|
526
|
+
type: HostBinding,
|
|
527
|
+
args: ['class.floating']
|
|
528
|
+
}], jvxMultiselect: [{
|
|
529
|
+
type: ViewChild,
|
|
530
|
+
args: ['jvxMultiselect', { static: true }]
|
|
531
|
+
}], selectionContainer: [{
|
|
532
|
+
type: ViewChild,
|
|
533
|
+
args: ['selectionContainer', { static: false }]
|
|
534
|
+
}], selection: [{
|
|
535
|
+
type: ViewChild,
|
|
536
|
+
args: ['selection', { static: true }]
|
|
537
|
+
}], trigger: [{
|
|
538
|
+
type: ViewChild,
|
|
539
|
+
args: ['trigger', { static: true }]
|
|
540
|
+
}], scrollbar: [{
|
|
541
|
+
type: ViewChild,
|
|
542
|
+
args: ['scrollbar', { static: false }]
|
|
543
|
+
}], multiContainer: [{
|
|
544
|
+
type: ViewChild,
|
|
545
|
+
args: ['multiContainer', { static: false }]
|
|
546
|
+
}], optionComp: [{
|
|
547
|
+
type: ViewChildren,
|
|
548
|
+
args: [NgJvxOptionComponent]
|
|
549
|
+
}], optionsTemplate: [{
|
|
550
|
+
type: ContentChild,
|
|
551
|
+
args: [NgJvxOptionsTemplateDirective]
|
|
552
|
+
}], selectionTemplate: [{
|
|
553
|
+
type: ContentChild,
|
|
554
|
+
args: [NgJvxSelectionTemplateDirective]
|
|
555
|
+
}], groupHeaderTemplate: [{
|
|
556
|
+
type: ContentChild,
|
|
557
|
+
args: [NgJvxGroupHeaderDirective]
|
|
558
|
+
}], options: [{
|
|
559
|
+
type: Input
|
|
560
|
+
}], multi: [{
|
|
561
|
+
type: Input
|
|
562
|
+
}], url: [{
|
|
563
|
+
type: Input
|
|
564
|
+
}], requestType: [{
|
|
565
|
+
type: Input
|
|
566
|
+
}], itemValue: [{
|
|
567
|
+
type: Input
|
|
568
|
+
}], itemText: [{
|
|
569
|
+
type: Input
|
|
570
|
+
}], ignorePagination: [{
|
|
571
|
+
type: Input
|
|
572
|
+
}], clearable: [{
|
|
573
|
+
type: Input
|
|
574
|
+
}], closeOnClick: [{
|
|
575
|
+
type: Input
|
|
576
|
+
}], hasErrors: [{
|
|
577
|
+
type: Input
|
|
578
|
+
}], searchMode: [{
|
|
579
|
+
type: Input
|
|
580
|
+
}], searchInput: [{
|
|
581
|
+
type: Input
|
|
582
|
+
}], searchLabel: [{
|
|
583
|
+
type: Input
|
|
584
|
+
}], listProp: [{
|
|
585
|
+
type: Input
|
|
586
|
+
}], totalRowsProp: [{
|
|
587
|
+
type: Input
|
|
588
|
+
}], panelClass: [{
|
|
589
|
+
type: Input
|
|
590
|
+
}], searchProp: [{
|
|
591
|
+
type: Input
|
|
592
|
+
}], closeButton: [{
|
|
593
|
+
type: Input
|
|
594
|
+
}], mapper: [{
|
|
595
|
+
type: Input
|
|
596
|
+
}], multiMapper: [{
|
|
597
|
+
type: Input
|
|
598
|
+
}], searchMapper: [{
|
|
599
|
+
type: Input
|
|
600
|
+
}], groupBy: [{
|
|
601
|
+
type: Input
|
|
602
|
+
}], value: [{
|
|
603
|
+
type: Input
|
|
604
|
+
}], requestHeaders: [{
|
|
605
|
+
type: Input
|
|
606
|
+
}], required: [{
|
|
607
|
+
type: Input
|
|
608
|
+
}], disabled: [{
|
|
609
|
+
type: Input
|
|
610
|
+
}], pageSize: [{
|
|
611
|
+
type: Input
|
|
612
|
+
}], valueChange: [{
|
|
613
|
+
type: Output
|
|
614
|
+
}], jvxMultiselectOpen: [{
|
|
615
|
+
type: Output
|
|
616
|
+
}], jvxMultiselectOpened: [{
|
|
617
|
+
type: Output
|
|
618
|
+
}], jvxMultiselectClose: [{
|
|
619
|
+
type: Output
|
|
620
|
+
}], jvxMultiselectClosed: [{
|
|
621
|
+
type: Output
|
|
622
|
+
}], scrollEnd: [{
|
|
623
|
+
type: Output
|
|
624
|
+
}] } });
|
|
625
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctanZ4LW11bHRpc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWp2eC1tdWx0aXNlbGVjdC9zcmMvbGliL25nLWp2eC1tdWx0aXNlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1qdngtbXVsdGlzZWxlY3Qvc3JjL2xpYi9uZy1qdngtbXVsdGlzZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUV2QixTQUFTLEVBQ1QsWUFBWSxFQUVaLFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUVOLElBQUksRUFFSixTQUFTLEVBQ1QsWUFBWSxFQUNaLGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFBTSxnREFBZ0QsQ0FBQztBQUM3RixPQUFPLEVBQXNELGtCQUFrQixFQUFtQixNQUFNLGdCQUFnQixDQUFDO0FBRXpILE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBRzdFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRCxPQUFPLEVBQUMsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xHLE9BQU8sRUFBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUUvRSxPQUFPLEVBQUMsK0JBQStCLEVBQUMsTUFBTSxrREFBa0QsQ0FBQztBQUNqRyxPQUFPLEVBQUMseUJBQXlCLElBQUksbUJBQW1CLEVBQUMsTUFBTSxxQ0FBcUMs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QUFXO3NCQUFuQixLQUFLO2dCQUtHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBS0csT0FBTztzQkFBZixLQUFLO2dCQUVPLEtBQUs7c0JBQWpCLEtBQUs7Z0JBY0csY0FBYztzQkFBdEIsS0FBSztnQkFHRixRQUFRO3NCQURYLEtBQUs7Z0JBY0YsUUFBUTtzQkFEWCxLQUFLO2dCQVlGLFFBQVE7c0JBRFgsS0FBSztnQkF3QkksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCxcclxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgQ29udGVudENoaWxkLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3B0aW9uYWwsXHJcbiAgT3V0cHV0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBTZWxmLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdDaGlsZHJlbixcclxuICBWaWV3RW5jYXBzdWxhdGlvblxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge05nSnZ4T3B0aW9uc1RlbXBsYXRlRGlyZWN0aXZlfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmctanZ4LW9wdGlvbnMtdGVtcGxhdGUuZGlyZWN0aXZlJztcclxuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sLCBVbnR5cGVkRm9ybUJ1aWxkZXIsIFVudHlwZWRGb3JtQ29udHJvbCwgVW50eXBlZEZvcm1Hcm91cH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge01hdExlZ2FjeVNlbGVjdGlvbkxpc3QgYXMgTWF0U2VsZWN0aW9uTGlzdCwgTWF0TGVnYWN5U2VsZWN0aW9uTGlzdENoYW5nZSBhcyBNYXRTZWxlY3Rpb25MaXN0Q2hhbmdlfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktbGlzdCc7XHJcbmltcG9ydCB7TmdKdnhPcHRpb25Db21wb25lbnR9IGZyb20gJy4vbmctanZ4LW9wdGlvbi9uZy1qdngtb3B0aW9uLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7TWF0TGVnYWN5TWVudVRyaWdnZXIgYXMgTWF0TWVudVRyaWdnZXJ9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xlZ2FjeS1tZW51JztcclxuaW1wb3J0IHtOZ0p2eE11bHRpc2VsZWN0U2VydmljZX0gZnJvbSAnLi9uZy1qdngtbXVsdGlzZWxlY3Quc2VydmljZSc7XHJcbmltcG9ydCB7SHR0cEhlYWRlcnN9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHtOZ1Njcm9sbGJhcn0gZnJvbSAnbmd4LXNjcm9sbGJhcic7XHJcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7Zm9ya0pvaW4sIGZyb21FdmVudCwgbm9vcCwgT2JzZXJ2YWJsZSwgb2YsIFN1YmplY3QsIHRpbWVyfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtOZ0p2eE11bHRpT3B0aW9uTWFwcGVyLCBOZ0p2eE9wdGlvbk1hcHBlcn0gZnJvbSAnLi9pbnRlcmZhY2VzL25nLWp2eC1vcHRpb24tbWFwcGVyJztcclxuaW1wb3J0IHtOZ0p2eFNlbGVjdGlvblRlbXBsYXRlRGlyZWN0aXZlfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmctanZ4LXNlbGVjdGlvbi10ZW1wbGF0ZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQge01hdExlZ2FjeUZvcm1GaWVsZENvbnRyb2wgYXMgTWF0Rm9ybUZpZWxkQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvbGVnYWN5LWZvcm0tZmllbGQnO1xyXG5pbXBvcnQge2NvZXJjZUJvb2xlYW5Qcm9wZXJ0eX0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcclxuaW1wb3J0IHtOZ0p2eEdyb3VwSGVhZGVyRGlyZWN0aXZlfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmctanZ4LWdyb3VwLWhlYWRlci5kaXJlY3RpdmUnO1xyXG5pbXBvcnQge05nSnZ4U2VhcmNoTWFwcGVyfSBmcm9tICcuL2ludGVyZmFjZXMvbmctanZ4LXNlYXJjaC1tYXBwZXInO1xyXG5pbXBvcnQge05nSnZ4R3JvdXAsIE5nSnZ4R3JvdXBNYXBwZXJ9IGZyb20gJy4vaW50ZXJmYWNlcy9uZy1qdngtZ3JvdXAtbWFwcGVyJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjb21wb25lbnQtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ25nLWp2eC1tdWx0aXNlbGVjdCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL25nLWp2eC1tdWx0aXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbmctanZ4LW11bHRpc2VsZWN0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTWF0Rm9ybUZpZWxkQ29udHJvbCxcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmdKdnhNdWx0aXNlbGVjdENvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgfV1cclxufSlcclxuZXhwb3J0IGNsYXNzIE5nSnZ4TXVsdGlzZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBNYXRGb3JtRmllbGRDb250cm9sPGFueT4sXHJcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG4gIHN0YXRpYyBuZXh0SWQgPSAwO1xyXG4gIEBIb3N0QmluZGluZygpIGlkID0gYGp2eC1tdWx0aXNlbGVjdC0ke05nSnZ4TXVsdGlzZWxlY3RDb21wb25lbnQubmV4dElkKyt9YDtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5mbG9hdGluZycpXHJcbiAgZ2V0IHNob3VsZExhYmVsRmxvYXQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5mb2N1c2VkIHx8ICF0aGlzLmVtcHR5O1xyXG4gIH1cclxuXHJcbiAgQFZpZXdDaGlsZCgnanZ4TXVsdGlzZWxlY3QnLCB7c3RhdGljOiB0cnVlfSkganZ4TXVsdGlzZWxlY3Q6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnc2VsZWN0aW9uQ29udGFpbmVyJywge3N0YXRpYzogZmFsc2V9KSBzZWxlY3Rpb25Db250YWluZXI6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnc2VsZWN0aW9uJywge3N0YXRpYzogdHJ1ZX0pIHNlbGVjdGlvbjogTWF0U2VsZWN0aW9uTGlzdDtcclxuICBAVmlld0NoaWxkKCd0cmlnZ2VyJywge3N0YXRpYzogdHJ1ZX0pIHRyaWdnZXI6IE1hdE1lbnVUcmlnZ2VyO1xyXG4gIEBWaWV3Q2hpbGQoJ3Njcm9sbGJhcicsIHtzdGF0aWM6IGZhbHNlfSkgc2Nyb2xsYmFyOiBOZ1Njcm9sbGJhcjtcclxuICBAVmlld0NoaWxkKCdtdWx0aUNvbnRhaW5lcicsIHtzdGF0aWM6IGZhbHNlfSkgbXVsdGlDb250YWluZXI6IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZHJlbihOZ0p2eE9wdGlvbkNvbXBvbmVudCkgb3B0aW9uQ29tcDogUXVlcnlMaXN0PE5nSnZ4T3B0aW9uQ29tcG9uZW50PjtcclxuICBAQ29udGVudENoaWxkKE5nSnZ4T3B0aW9uc1RlbXBsYXRlRGlyZWN0aXZlKSBvcHRpb25zVGVtcGxhdGU6IE5nSnZ4T3B0aW9uc1RlbXBsYXRlRGlyZWN0aXZlIHwgbnVsbCA9IG51bGw7XHJcbiAgQENvbnRlbnRDaGlsZChOZ0p2eFNlbGVjdGlvblRlbXBsYXRlRGlyZWN0aXZlKSBzZWxlY3Rpb25UZW1wbGF0ZTogTmdKdnhTZWxlY3Rpb25UZW1wbGF0ZURpcmVjdGl2ZSB8IG51bGwgPSBudWxsO1xyXG4gIEBDb250ZW50Q2hpbGQoTmdKdnhHcm91cEhlYWRlckRpcmVjdGl2ZSkgZ3JvdXBIZWFkZXJUZW1wbGF0ZTogTmdKdnhHcm91cEhlYWRlckRpcmVjdGl2ZSB8IG51bGwgPSBudWxsO1xyXG4gIC8vIEBDb250ZW50Q2hpbGQoTmdKdnhPcHRpb25Db21wb25lbnQpIG9wdGlvbkNvbXA6IE5nSnZ4T3B0aW9uQ29tcG9uZW50O1xyXG4gIC8vIEBDb250ZW50Q2hpbGQoVGVtcGxhdGVSZWYpIG9wdGlvbnNUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PiB8IG51bGwgPSBudWxsO1xyXG4gIEBJbnB1dCgpIG9wdGlvbnM6IGFueVtdID0gW107XHJcbiAgQElucHV0KCkgbXVsdGkgPSBmYWxzZTtcclxuICBASW5wdXQoKSB1cmwgPSAnJztcclxuICBASW5wdXQoKSByZXF1ZXN0VHlwZTogJ2dldCcgfCAncG9zdCcgPSAnZ2V0JztcclxuICBASW5wdXQoKSBpdGVtVmFsdWUgPSAndmFsdWUnO1xyXG4gIEBJbnB1dCgpIGl0ZW1UZXh0ID0gJ3RleHQnO1xyXG4gIEBJbnB1dCgpIGlnbm9yZVBhZ2luYXRpb24gPSBmYWxzZTtcclxuICBASW5wdXQoKSBjbGVhcmFibGUgPSBmYWxzZTtcclxuICBASW5wdXQoKSBjbG9zZU9uQ2xpY2sgPSB0cnVlO1xyXG4gIEBJbnB1dCgpIGhhc0Vycm9ycyA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNlYXJjaE1vZGU6IG51bGwgfCAnc2VydmVyJyB8ICdjbGllbnQnID0gbnVsbDtcclxuICBASW5wdXQoKSBzZWFyY2hJbnB1dCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNlYXJjaExhYmVsID0gJ3NlYXJjaCc7XHJcbiAgQElucHV0KCkgbGlzdFByb3AgPSAnJztcclxuICBASW5wdXQoKSB0b3RhbFJvd3NQcm9wID0gJyc7XHJcbiAgQElucHV0KCkgcGFuZWxDbGFzcyA9ICcnO1xyXG4gIEBJbnB1dCgpIHNlYXJjaFByb3AgPSAnc2VhcmNoJztcclxuICBASW5wdXQoKSBjbG9zZUJ1dHRvbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIG1hcHBlcjogTmdKdnhPcHRpb25NYXBwZXI8YW55PiA9IHtcclxuICAgIG1hcE9wdGlvbihzb3VyY2U6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiBvZihzb3VyY2UpO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgQElucHV0KCkgbXVsdGlNYXBwZXI6IE5nSnZ4TXVsdGlPcHRpb25NYXBwZXI8YW55PiA9IHtcclxuICAgIG1hcE9wdGlvbnMoc291cmNlOiBhbnlbXSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICAgIHJldHVybiBvZihzb3VyY2UpO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgQElucHV0KCkgc2VhcmNoTWFwcGVyOiBOZ0p2eFNlYXJjaE1hcHBlcjxhbnk+ID0ge1xyXG4gICAgbWFwU2VhcmNoOiAoc291cmNlOiBzdHJpbmcsIG9wdGlvbnM6IGFueVtdKTogT2JzZXJ2YWJsZTxhbnk+ID0+IHtcclxuICAgICAgcmV0dXJuIG9mKG9wdGlvbnMuZmlsdGVyKG8gPT4gb1t0aGlzLml0ZW1UZXh0XS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc291cmNlLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSkpKTtcclxuICAgIH1cclxuICB9O1xyXG4gIEBJbnB1dCgpIGdyb3VwQnk6IE5nSnZ4R3JvdXBNYXBwZXI8YW55PiB8IHN0cmluZyB8IG51bGw7XHJcblxyXG4gIEBJbnB1dCgpIHNldCB2YWx1ZSh2YWx1ZTogYW55W10pIHtcclxuICAgIHRoaXMucFZhbHVlID0gdmFsdWUgPz8gW107XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgdGhpcy5mb3JtLmdldCgnc2VsZWN0aW9uVmFsdWUnKS5zZXRWYWx1ZSh0aGlzLnBWYWx1ZS5tYXAodiA9PiB2W3RoaXMuaXRlbVZhbHVlXSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5mb3JtLmdldCgnc2VsZWN0aW9uVmFsdWUnKS5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICBnZXQgdmFsdWUoKTogYW55W10ge1xyXG4gICAgcmV0dXJuIHRoaXMucFZhbHVlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgcmVxdWVzdEhlYWRlcnM6IEh0dHBIZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xyXG4gIH1cclxuXHJcbiAgc2V0IHJlcXVpcmVkKHJlcSkge1xyXG4gICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkocmVxKTtcclxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfcmVxdWlyZWQgPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuX2Rpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcclxuICAgIHRoaXMuX2Rpc2FibGVkID8gdGhpcy5wYXJ0cy5kaXNhYmxlKCkgOiB0aGlzLnBhcnRzLmVuYWJsZSgpO1xyXG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgcGFnZVNpemUoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmludFBhZ2VTaXplO1xyXG4gIH1cclxuXHJcbiAgc2V0IHBhZ2VTaXplKHZhbDogbnVtYmVyKSB7XHJcbiAgICBpZiAodmFsIDwgMTUpIHtcclxuICAgICAgdGhpcy5pbnRQYWdlU2l6ZSA9IDE1O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pbnRQYWdlU2l6ZSA9IHZhbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXHJcbiAgcHJpdmF0ZSBfZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgZ2V0IGVycm9yU3RhdGUoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5uZ0NvbnRyb2wuaW52YWxpZCAmJiB0aGlzLm5nQ29udHJvbC50b3VjaGVkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgpIHZhbHVlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8YW55W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcclxuICBAT3V0cHV0KCkganZ4TXVsdGlzZWxlY3RPcGVuOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIGp2eE11bHRpc2VsZWN0T3BlbmVkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIGp2eE11bHRpc2VsZWN0Q2xvc2U6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkganZ4TXVsdGlzZWxlY3RDbG9zZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuICBAT3V0cHV0KCkgc2Nyb2xsRW5kOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIHB1YmxpYyBjb250cm9sVHlwZSA9ICduZy1qdngtbXVsdGlzZWxlY3QnO1xyXG4gIHB1YmxpYyBkb2N1bWVudCA9IGRvY3VtZW50O1xyXG4gIHB1YmxpYyB3aW5kb3cgPSB3aW5kb3c7XHJcbiAgcHVibGljIGZvcm06IFVudHlwZWRGb3JtR3JvdXA7XHJcbiAgcHVibGljIGlzT3BlbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBpc0xvYWRpbmcgPSBmYWxzZTtcclxuICBwdWJsaWMgc2hvd0xpc3QgPSB0cnVlO1xyXG4gIHB1YmxpYyBhc3luY09wdGlvbnM6IGFueSA9IFtdO1xyXG4gIHB1YmxpYyBzZWxlY3RhYmxlT3B0aW9ucyA9IFtdO1xyXG4gIHB1YmxpYyBvcmRlcmVkT3B0aW9uczogeyBncm91cDogYW55LCBvcHRpb25zOiBhbnlbXSB9W10gPSBbXTtcclxuICBwdWJsaWMgc2VhcmNoVmFsdWUgPSAnJztcclxuICBwdWJsaWMgeVBvc2l0aW9uOiAnYWJvdmUnIHwgJ2JlbG93JyA9ICdhYm92ZSc7XHJcbiAgcHVibGljIHN0YXRlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHVibGljIGN1cnJlbnRQYWdlID0gMDtcclxuICBwdWJsaWMgbGlzdENvbnRhaW5lclNpemU6IHsgaGVpZ2h0OiBzdHJpbmcsIG1pbkhlaWdodDogc3RyaW5nLCB3aWR0aDogc3RyaW5nIH0gPSB7aGVpZ2h0OiAnYXV0bycsIG1pbkhlaWdodDogJzAnLCB3aWR0aDogJzEwMCUnfTtcclxuICBwdWJsaWMgcGFydHM6IFVudHlwZWRGb3JtR3JvdXA7XHJcblxyXG4gIHB1YmxpYyB0b3VjaGVkID0gZmFsc2U7XHJcblxyXG4gIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nO1xyXG4gIHB1YmxpYyBmb2N1c2VkID0gZmFsc2U7XHJcbiAgcHVibGljIG11bHRpQ29udGFpbmVyV2lkdGggPSAxMDA7XHJcblxyXG4gIHByaXZhdGUgc2VhcmNoVmFsdWVTdWJqZWN0ID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG4gIHByaXZhdGUgc2VhcmNoVmFsdWUkID0gdGhpcy5zZWFyY2hWYWx1ZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XHJcbiAgcHJpdmF0ZSBwVmFsdWU6IGFueVtdID0gW107XHJcbiAgcHJpdmF0ZSBzaG91bGRMb2FkTW9yZSA9IHRydWU7XHJcbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSQgPSB0aGlzLnVuc3Vic2NyaWJlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIHByaXZhdGUgaW50UGFnZVNpemUgPSAxNTtcclxuICBwdWJsaWMgb25Ub3VjaGVkID0gKCkgPT4ge1xyXG4gIH07XHJcblxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsIHByaXZhdGUgc2VydmljZTogTmdKdnhNdWx0aXNlbGVjdFNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sLCBmYjogVW50eXBlZEZvcm1CdWlsZGVyKSB7XHJcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICAvLyBTZXR0aW5nIHRoZSB2YWx1ZSBhY2Nlc3NvciBkaXJlY3RseSAoaW5zdGVhZCBvZiB1c2luZ1xyXG4gICAgICAvLyB0aGUgcHJvdmlkZXJzKSB0byBhdm9pZCBydW5uaW5nIGludG8gYSBjaXJjdWxhciBpbXBvcnQuXHJcbiAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucGFydHMgPSBmYi5ncm91cCh7XHJcbiAgICAgIGFyZWE6ICcnLFxyXG4gICAgICBleGNoYW5nZTogJycsXHJcbiAgICAgIHN1YnNjcmliZXI6ICcnLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgc2VsZWN0aW9uVmFsdWU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wodGhpcy5zZWxlY3Rpb25WYWx1ZSlcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlJC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlKSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH0pO1xyXG4gICAgLy8gdGhpcy5zZXRTZWxlY3RhYmxlT3B0aW9ucyh0aGlzLm9wdGlvbnMpLnN1YnNjcmliZShub29wKTtcclxuICAgIHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMgPSBbLi4udGhpcy5vcHRpb25zXTtcclxuICAgIHRoaXMudXBkYXRlT3JkZXJlZE9wdGlvbnModGhpcy5zZWxlY3RhYmxlT3B0aW9ucykuc3Vic2NyaWJlKG5vb3ApO1xyXG4gICAgZnJvbUV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScpLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUpLCBkZWJvdW5jZVRpbWUoMTAwKSwgbWFwKCgpID0+IHtcclxuICAgICAgcmV0dXJuIHRoaXMubGlzdENvbnRhaW5lclNpemUud2lkdGggPSB0aGlzLmp2eE11bHRpc2VsZWN0Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggKyAncHgnO1xyXG5cclxuICAgIH0pLCBzd2l0Y2hNYXAoKCkgPT4gdGltZXIoMTAwKSksIHRhcCgoKSA9PiB7XHJcbiAgICAgIHRoaXMubXVsdGlDb250YWluZXJXaWR0aCA9IHRoaXMubXVsdGlDb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQ/Lm9mZnNldFdpZHRoID8/IDEwMDtcclxuICAgICAgdGhpcy55UG9zaXRpb24gPSB3aW5kb3cuaW5uZXJIZWlnaHQgLSB0aGlzLmp2eE11bHRpc2VsZWN0Lm5hdGl2ZUVsZW1lbnQ/LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpPy50b3AgPCAyNjAgPyAnYWJvdmUnIDogJ2JlbG93JztcclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH0pKS5zdWJzY3JpYmUobm9vcCk7XHJcblxyXG4gICAgdGhpcy5zZWFyY2hWYWx1ZSQucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSksIGRlYm91bmNlVGltZSgzMDApLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgocHJldiwgY3VycikgPT4ge1xyXG4gICAgICAgIHJldHVybiBjdXJyID09PSB0aGlzLnNlYXJjaFZhbHVlO1xyXG4gICAgICB9KSwgc3dpdGNoTWFwKCh2YWw6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9IHZhbDtcclxuICAgICAgICAgIHRoaXMuY3VycmVudFBhZ2UgPSAwO1xyXG4gICAgICAgICAgaWYgKHRoaXMuc2VhcmNoTW9kZSA9PT0gJ2NsaWVudCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xpZW50U2VhcmNoKCk7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXJsICYmIHRoaXMudXJsLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VydmVyU2VhcmNoKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICApXHJcbiAgICApLnN1YnNjcmliZSgodmFsOiBhbnlbXSkgPT4ge1xyXG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNsaWVudFNlYXJjaCgpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgbGV0IG9iczogT2JzZXJ2YWJsZTxhbnk+O1xyXG4gICAgaWYgKHRoaXMudXJsICYmIHRoaXMudXJsLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RhYmxlT3B0aW9ucyA9IFtdO1xyXG4gICAgICB0aGlzLnVwZGF0ZU9yZGVyZWRPcHRpb25zKHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMpLnN1YnNjcmliZShub29wKTtcclxuICAgICAgdGhpcy5zaG91bGRMb2FkTW9yZSA9IHRydWU7XHJcbiAgICAgIG9icyA9IHRoaXMuZ2V0TGlzdCgpLnBpcGUobWFwKCgpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RhYmxlT3B0aW9ucztcclxuICAgICAgfSkpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgb2JzID0gb2YodGhpcy5vcHRpb25zKTtcclxuICAgIH1cclxuICAgIHJldHVybiBvYnMucGlwZShzd2l0Y2hNYXAoKHZhbCkgPT4gdGhpcy5zZWFyY2hNYXBwZXIubWFwU2VhcmNoKHRoaXMuc2VhcmNoVmFsdWUsIHZhbCkpLCBzd2l0Y2hNYXAoKHJlcykgPT4ge1xyXG4gICAgICAgIC8vIHJldHVybiB0aGlzLnNldFNlbGVjdGFibGVPcHRpb25zKHJlcyk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RhYmxlT3B0aW9ucyA9IFtdO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMucHVzaCguLi5yZXMpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU9yZGVyZWRPcHRpb25zKHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMpO1xyXG4gICAgICB9XHJcbiAgICApKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0U2VsZWN0YWJsZU9wdGlvbnMob3B0aW9uczogYW55W10pOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgdGhpcy5zZWxlY3RhYmxlT3B0aW9ucyA9IFtdO1xyXG4gICAgY29uc3Qgb2JzOiBPYnNlcnZhYmxlPGFueT5bXSA9IG9wdGlvbnMucmVkdWNlKChhY2MsIGN1cnIpID0+IHtcclxuICAgICAgYWNjLnB1c2godGhpcy5tYXBwZXIubWFwT3B0aW9uKGN1cnIpKTtcclxuICAgICAgcmV0dXJuIGFjYztcclxuICAgIH0sIFtdKTtcclxuXHJcbiAgICAvLyB0aGlzLm1hcHBlci5tYXBPcHRpb24ob3B0aW9uKTtcclxuXHJcbiAgICByZXR1cm4gZm9ya0pvaW4oWy4uLm9ic10pLnBpcGUoc3dpdGNoTWFwKCh2YWwpID0+IHtcclxuICAgICAgdGhpcy5zZWxlY3RhYmxlT3B0aW9ucy5wdXNoKC4uLnZhbCk7XHJcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU9yZGVyZWRPcHRpb25zKHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMpO1xyXG4gICAgfSkpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXJ2ZXJTZWFyY2goKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHRoaXMuc2hvdWxkTG9hZE1vcmUgPSB0cnVlO1xyXG4gICAgdGhpcy5zZWxlY3RhYmxlT3B0aW9ucyA9IFtdO1xyXG4gICAgdGhpcy5zaG91bGRMb2FkTW9yZSA9IHRydWU7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRMaXN0KCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnVuc3Vic2NyaWJlLm5leHQoKTtcclxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLmNvbXBsZXRlKCk7XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aW1lcigwKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmxpc3RDb250YWluZXJTaXplLndpZHRoID0gdGhpcy5qdnhNdWx0aXNlbGVjdC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICsgJ3B4JztcclxuICAgIH0pO1xyXG5cclxuICAgIGlmICh0aGlzLnNjcm9sbGJhcikge1xyXG4gICAgICB0aGlzLnNjcm9sbGJhci5zY3JvbGxlZC5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlJCkpLnN1YnNjcmliZSgoZTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5vblNjcm9sbGVkKGUpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRpbWVyKDApLnBpcGUodGFwKCgpID0+IHtcclxuICAgICAgdGhpcy5tdWx0aUNvbnRhaW5lcldpZHRoID0gdGhpcy5tdWx0aUNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudD8ub2Zmc2V0V2lkdGggPz8gMTAwO1xyXG4gICAgICB0aGlzLnlQb3NpdGlvbiA9IHdpbmRvdy5pbm5lckhlaWdodCAtIHRoaXMuanZ4TXVsdGlzZWxlY3QubmF0aXZlRWxlbWVudD8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk/LnRvcCA8IDI2MCA/ICdhYm92ZScgOiAnYmVsb3cnO1xyXG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfSkpLnN1YnNjcmliZShub29wKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmIChjaGFuZ2VzLm9wdGlvbnMpIHtcclxuICAgICAgLy8gdGhpcy5zZXRTZWxlY3RhYmxlT3B0aW9ucyh0aGlzLm9wdGlvbnMpLnN1YnNjcmliZShub29wKTtcclxuICAgICAgdGhpcy5zZWxlY3RhYmxlT3B0aW9ucyA9IFsuLi50aGlzLm9wdGlvbnNdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGdldCBzZWxlY3Rpb25WYWx1ZSgpOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gdGhpcy52YWx1ZS5tYXAoKHYpID0+IHtcclxuICAgICAgcmV0dXJuIHZbdGhpcy5pdGVtVmFsdWVdO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBuID0gdGhpcy5wYXJ0cy52YWx1ZTtcclxuICAgIHJldHVybiAhbi5hcmVhICYmICFuLmV4Y2hhbmdlICYmICFuLnN1YnNjcmliZXI7XHJcbiAgfVxyXG5cclxuICBvbkNMaWNrT25NZW51KGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm11bHRpIHx8IHRoaXMuY2xvc2VPbkNsaWNrID09PSBmYWxzZSkge1xyXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgcHJvcGFnYXRlQ2hhbmdlKF86IGFueSk6IGFueSB7XHJcbiAgfVxyXG5cclxuICAvLyB0aGlzIGlzIHRoZSBpbml0aWFsIHZhbHVlIHNldCB0byB0aGUgY29tcG9uZW50XHJcbiAgcHVibGljIHdyaXRlVmFsdWUob2JqOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgdGhpcy52YWx1ZSA9IG9iajtcclxuICB9XHJcblxyXG4gIC8vIHJlZ2lzdGVycyAnZm4nIHRoYXQgd2lsbCBiZSBmaXJlZCB3aGVuIGNoYW5nZXMgYXJlIG1hZGVcclxuICAvLyB0aGlzIGlzIGhvdyB3ZSBlbWl0IHRoZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm1cclxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlKGU6IE1hdFNlbGVjdGlvbkxpc3RDaGFuZ2UpOiB2b2lkIHtcclxuXHJcbiAgICBsZXQgdmFscyA9IGUuc291cmNlLnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZC5tYXAobyA9PiBvLnZhbHVlKTtcclxuICAgIHZhbHMgPSB0aGlzLnNlbGVjdGFibGVPcHRpb25zLmZpbHRlcihvID0+IHZhbHMuaW5jbHVkZXMob1t0aGlzLml0ZW1WYWx1ZV0pKTtcclxuICAgIGNvbnN0IHNlbGVjdGFibGVJZHMgPSB0aGlzLnNlbGVjdGFibGVPcHRpb25zLm1hcChzID0+IHNbdGhpcy5pdGVtVmFsdWVdKTtcclxuICAgIGlmICh0aGlzLm11bHRpKSB7XHJcbiAgICAgIC8vIGlmIHNlYXJjaCBpcyBhY3RpdmUsIHByb2JhYmx5IHNvbWUgb2YgdGhlIGFscmVhZHkgc2VsZWN0ZWQgdmFsdWVzIGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIHNlbGVjdGFibGUgb3B0aW9ucyxcclxuICAgICAgLy8gc28gd2UgaGF2ZSB0byBwdXNoIHRoZW0gaW4gdGhlIHNlbGVjdGVkIHZhbHVlcyBvZiB0aGUgbGlzdDtcclxuICAgICAgZm9yIChjb25zdCB2IG9mIHRoaXMudmFsdWUpIHtcclxuICAgICAgICBpZiAoIXNlbGVjdGFibGVJZHMuaW5jbHVkZXModlt0aGlzLml0ZW1WYWx1ZV0pKSB7XHJcbiAgICAgICAgICB2YWxzID0gW3YsIC4uLnZhbHNdO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdmFscy5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgIHJldHVybiB0eXBlb2YgYVt0aGlzLml0ZW1WYWx1ZV0gPT09ICdzdHJpbmcnID9cclxuICAgICAgICBhW3RoaXMuaXRlbVZhbHVlXS5sb2NhbGVDb21wYXJlKGJbdGhpcy5pdGVtVmFsdWVdKSA6IGFbdGhpcy5pdGVtVmFsdWVdIC0gYlt0aGlzLml0ZW1WYWx1ZV07XHJcbiAgICB9KTtcclxuICAgIHRoaXMudmFsdWUgPSBbLi4udmFsc107XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdzZWxlY3Rpb25WYWx1ZScpLnNldFZhbHVlKHRoaXMudmFsdWUubWFwKHYgPT4gdlt0aGlzLml0ZW1WYWx1ZV0pKTtcclxuXHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnZhbHVlKTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgb25Gb2N1c0luKGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZm9jdXNlZCkge1xyXG4gICAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZvY3VzT3V0KGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgRWxlbWVudCkpIHtcclxuICAgICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uTWVudU9wZW4oKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5qdnhNdWx0aXNlbGVjdE9wZW4uZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgb25NZW51Q2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5qdnhNdWx0aXNlbGVjdENsb3NlLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIGRlc2VsZWN0KHZhbDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlID0gWy4uLnRoaXMudmFsdWUuZmlsdGVyKHYgPT4gdlt0aGlzLml0ZW1WYWx1ZV0gIT09IHZhbFt0aGlzLml0ZW1WYWx1ZV0pXTtcclxuICAgIC8vIHRoaXMudmFsdWUuc3BsaWNlKHRoaXMudmFsdWUuZmluZEluZGV4KHYgPT4gdlt0aGlzLml0ZW1WYWx1ZV0gPT09IHZhbFt0aGlzLml0ZW1WYWx1ZV0pLCAxKTtcclxuICAgIHRoaXMuZm9ybS5nZXQoJ3NlbGVjdGlvblZhbHVlJykuc2V0VmFsdWUodGhpcy52YWx1ZS5tYXAobSA9PiBtLnZhbHVlKSk7XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnZhbHVlKTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFNlbGVjdGlvbkNvbnRhaW5lclNpemUoKTogdm9pZCB7XHJcbiAgICB0aW1lcigwKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb25Db250YWluZXIpIHtcclxuICAgICAgICB0aGlzLmxpc3RDb250YWluZXJTaXplLmhlaWdodCA9IHRoaXMuc2VsZWN0aW9uQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gMjYwID8gJzI2MHB4JyA6ICdhdXRvJztcclxuICAgICAgICB0aGlzLmxpc3RDb250YWluZXJTaXplLm1pbkhlaWdodCA9IHRoaXMuc2VsZWN0aW9uQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IDw9IDI2MCA/XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCArICdweCcgOiAnMjYwcHgnO1xyXG4gICAgICAgIHRoaXMubGlzdENvbnRhaW5lclNpemUud2lkdGggPSB0aGlzLmp2eE11bHRpc2VsZWN0Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggKyAncHgnO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbGlja09uTWVudVRyaWdnZXIoZTogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuc2hvd0xpc3QgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zaG91bGRMb2FkTW9yZSA9IHRydWU7XHJcbiAgICAgIHRpbWVyKDApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zaG93TGlzdCA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMudXJsLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGFibGVPcHRpb25zLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZU9yZGVyZWRPcHRpb25zKHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMpO1xyXG4gICAgICAgICAgdGhpcy5nZXRMaXN0KCkuc3Vic2NyaWJlKG5vb3ApO1xyXG4gICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25Db250YWluZXJTaXplKCk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRyaWdnZXIub3Blbk1lbnUoKTtcclxuICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uQ29udGFpbmVyU2l6ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldExpc3QoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZ2V0TGlzdCh7XHJcbiAgICAgIHVybDogdGhpcy51cmwsXHJcbiAgICAgIHJlcXVlc3RUeXBlOiB0aGlzLnJlcXVlc3RUeXBlLFxyXG4gICAgICBkYXRhOiB7fSxcclxuICAgICAgY3VycmVudFBhZ2U6ICsrdGhpcy5jdXJyZW50UGFnZSxcclxuICAgICAgaWdub3JlUGFnaW5hdGlvbjogdGhpcy5pZ25vcmVQYWdpbmF0aW9uLFxyXG4gICAgICByZXF1ZXN0SGVhZGVyczogdGhpcy5yZXF1ZXN0SGVhZGVycyxcclxuICAgICAgc2VhcmNoOiB0aGlzLnNlYXJjaFZhbHVlLFxyXG4gICAgICBzZWFyY2hQcm9wOiB0aGlzLnNlYXJjaFByb3AsXHJcbiAgICAgIHBhZ2VTaXplOiB0aGlzLmludFBhZ2VTaXplXHJcbiAgICB9KS5waXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKHZhbCkgPT4gdGhpcy5tdWx0aU1hcHBlci5tYXBPcHRpb25zKHZhbCkpLCBzd2l0Y2hNYXAoKHZhbCkgPT4ge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcclxuICAgICAgICBpZiAodGhpcy5saXN0UHJvcC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICByZXN1bHQgPSBbLi4udmFsW3RoaXMubGlzdFByb3BdXTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmVzdWx0ID0gWy4uLnZhbF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgdGhpcy5zaG91bGRMb2FkTW9yZSA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IG5ld09wdGlvbnMgPSBbXTtcclxuXHJcbiAgICAgICAgICBmb3IgKGNvbnN0IG9wdCBvZiByZXN1bHQpIHtcclxuICAgICAgICAgICAgY29uc3QgbmV3T3B0aW9uID0gdGhpcy5tYXBwZXIubWFwT3B0aW9uKG9wdCk7XHJcbiAgICAgICAgICAgIG5ld09wdGlvbnMucHVzaChuZXdPcHRpb24pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIGZvcmtKb2luKG5ld09wdGlvbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSksIHN3aXRjaE1hcCgoZmluVmFsOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNlbGVjdGFibGVPcHRpb25zLnB1c2goLi4uZmluVmFsKTtcclxuICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVPcmRlcmVkT3B0aW9ucyh0aGlzLnNlbGVjdGFibGVPcHRpb25zKTtcclxuICAgICAgfSksIG1hcCgodmFsKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnRyaWdnZXIub3Blbk1lbnUoKTtcclxuICAgICAgICB0aGlzLnNldFNlbGVjdGlvbkNvbnRhaW5lclNpemUoKTtcclxuICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICB9KSwgdGFwKCgpID0+IHtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBvblNjcm9sbGVkKGU6IGFueSk6IHZvaWQge1xyXG4gICAgaWYgKGUudGFyZ2V0LnNjcm9sbFRvcCArIDIyMCArICgodGhpcy5zZWFyY2hJbnB1dCA/IDAgOiAxKSAqIDQwKSA9PT0gdGhpcy5zZWxlY3Rpb25Db250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHRcclxuICAgICAgJiYgIXRoaXMuaXNMb2FkaW5nKSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsRW5kLmVtaXQoKTtcclxuICAgICAgaWYgKHRoaXMudXJsICYmIHRoaXMudXJsLmxlbmd0aCA+IDAgJiYgIXRoaXMuaWdub3JlUGFnaW5hdGlvbiAmJiB0aGlzLnNob3VsZExvYWRNb3JlKSB7XHJcbiAgICAgICAgdGhpcy5nZXRMaXN0KCkuc3Vic2NyaWJlKG5vb3ApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbk1lbnVPcGVuZWQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmp2eE11bHRpc2VsZWN0T3BlbmVkLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIG9uTWVudUNsb3NlZCgpOiB2b2lkIHtcclxuICAgIGlmICgoIXRoaXMudXJsIHx8IHRoaXMudXJsLmxlbmd0aCA9PT0gMCkgJiYgdGhpcy5zZWFyY2hNb2RlID09PSAnY2xpZW50Jykge1xyXG4gICAgICB0aGlzLnNlYXJjaFZhbHVlU3ViamVjdC5uZXh0KCcnKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAnJztcclxuICAgICAgdGhpcy5jdXJyZW50UGFnZSA9IDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLmp2eE11bHRpc2VsZWN0Q2xvc2VkLmVtaXQoKTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBvblNlYXJjaElucHV0Q2xpY2soZTogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICB9XHJcblxyXG4gIG9uU2VhcmNoVmFsdWVDaGFuZ2UoZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnNlYXJjaFZhbHVlU3ViamVjdC5uZXh0KGUudGFyZ2V0LnZhbHVlKTtcclxuICB9XHJcblxyXG4gIGNsZWFyKGU6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgdGhpcy52YWx1ZSA9IFtdO1xyXG4gICAgdGhpcy5mb3JtLmdldCgnc2VsZWN0aW9uVmFsdWUnKS5zZXRWYWx1ZSh0aGlzLnZhbHVlLm1hcCh2ID0+IHZbdGhpcy5pdGVtVmFsdWVdKSk7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnZhbHVlKTtcclxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBzZXREZXNjcmliZWRCeUlkcyhpZHM6IHN0cmluZ1tdKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb250cm9sRWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50XHJcbiAgICAgIC5xdWVyeVNlbGVjdG9yKCcubmctanZ4LW11bHRpc2VsZWN0Jyk7XHJcbiAgICBjb250cm9sRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCBpZHMuam9pbignICcpKTtcclxuICB9XHJcblxyXG4gIG9uQ29udGFpbmVyQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIC8vIGlmICgoZXZlbnQudGFyZ2V0IGFzIEVsZW1lbnQpLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ2lucHV0Jykge1xyXG4gICAgLy8gICB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpLmZvY3VzKCk7XHJcbiAgICAvLyB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBzdGF0ZUNoYW5nZSQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLnN0YXRlQ2hhbmdlcy5hc09ic2VydmFibGUoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZU9yZGVyZWRPcHRpb25zKG9wdGlvbnMpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgbGV0IG9icyA9IG9mKG9wdGlvbnMpO1xyXG4gICAgaWYgKHRoaXMuZ3JvdXBCeSkge1xyXG4gICAgICB0aGlzLm9yZGVyZWRPcHRpb25zLmxlbmd0aCA9IDA7XHJcbiAgICAgIGNvbnN0IG9ic0FyciA9IFtdO1xyXG4gICAgICBmb3IgKGNvbnN0IG9wdGlvbiBvZiBvcHRpb25zKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmdyb3VwQnkgIT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBvYnNBcnIucHVzaCh0aGlzLmdyb3VwQnkubWFwR3JvdXAob3B0aW9uKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG9ic0Fyci5wdXNoKG9mKHtncm91cDogb3B0aW9uW3RoaXMuZ3JvdXBCeV0sIG9wdGlvbn0gYXMgTmdKdnhHcm91cDxhbnk+KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIG9icyA9IGZvcmtKb2luKG9ic0FycikucGlwZShtYXAoKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gWy4uLm5ldyBTZXQocmVzLm1hcChpdGVtID0+IGl0ZW0uZ3JvdXApKV07XHJcbiAgICAgICAgZm9yIChjb25zdCBncm91cCBvZiBncm91cHMpIHtcclxuICAgICAgICAgIHRoaXMub3JkZXJlZE9wdGlvbnMucHVzaCh7XHJcbiAgICAgICAgICAgIGdyb3VwLFxyXG4gICAgICAgICAgICBvcHRpb25zOiByZXMuZmlsdGVyKHIgPT4gci5ncm91cCA9PT0gZ3JvdXApLm1hcChvID0+IG8ub3B0aW9uKVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzLm9yZGVyZWRPcHRpb25zO1xyXG4gICAgICB9KSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlTWVudSgpOiB2b2lkIHtcclxuICAgIHRoaXMudHJpZ2dlci5jbG9zZU1lbnUoKTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cIm5nLWp2eC1tdWx0aXNlbGVjdFwiIFtuZ0NsYXNzXT1cInsnZGlzYWJsZWQnOiBkaXNhYmxlZCwgJ2hhcy1lcnJvcnMnOiBoYXNFcnJvcnN9XCIgI2p2eE11bHRpc2VsZWN0PlxyXG4gIDwhLS0gU1RBUlQgTUVOVSAtLT5cclxuICA8ZGl2IFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51UmVmXCIgKG9uTWVudU9wZW4pPVwib25NZW51T3BlbigpXCIgKG1lbnVPcGVuZWQpPVwib25NZW51T3BlbmVkKClcIlxyXG4gICAgICAgKG9uTWVudUNsb3NlKT1cIm9uTWVudUNsb3NlKClcIiAobWVudUNsb3NlZCk9XCJvbk1lbnVDbG9zZWQoKVwiXHJcbiAgICAgICAjdHJpZ2dlcj1cIm1hdE1lbnVUcmlnZ2VyXCI+XHJcbiAgICA8bWF0LW1lbnUgI21lbnVSZWY9XCJtYXRNZW51XCIgW2NsYXNzXT1cIlsnanZ4LW11bHRpc2VsZWN0LXBhbmVsJywgcGFuZWxDbGFzc10uam9pbignICcpXCIgW2Zvcm1Hcm91cF09XCJmb3JtXCJcclxuICAgICAgICAgICAgICBbeVBvc2l0aW9uXT1cInlQb3NpdGlvblwiPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiY2xvc2VCdXR0b25cIiBjbGFzcz1cImNsb3NlTWVudUJ1dHRvblwiPjxtYXQtaWNvbiA+Y2xvc2U8L21hdC1pY29uPjwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWVudS1saXN0LWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgI21lbnVMSXN0Q29udGFpbmVyXHJcbiAgICAgICAgICAgW25nU3R5bGVdPVwieydvdmVyZmxvdy15JzogJ2hpZGRlbicsICd3aWR0aCc6IGxpc3RDb250YWluZXJTaXplLndpZHRoLCAnbWF4LWhlaWdodCc6ICcyNjBweCcsICdoZWlnaHQnOiBsaXN0Q29udGFpbmVyU2l6ZS5oZWlnaHQsICdtaW4taGVpZ2h0JzogbGlzdENvbnRhaW5lclNpemUubWluSGVpZ2h0fVwiPlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWlucHV0LWNvbnRhaW5lclwiICpuZ0lmPVwiISFzZWFyY2hJbnB1dFwiIChjbGljayk9XCJvblNlYXJjaElucHV0Q2xpY2soJGV2ZW50KVwiPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW3BsYWNlaG9sZGVyXT1cInNlYXJjaExhYmVsXCIgW25nTW9kZWxdPVwic2VhcmNoVmFsdWVcIiBbbmdNb2RlbE9wdGlvbnNdPVwie3N0YW5kYWxvbmU6IHRydWV9XCJcclxuICAgICAgICAgICAgICAgICBbbmdKdnhGb2N1c109XCJpc09wZW5cIlxyXG4gICAgICAgICAgICAgICAgIChpbnB1dCk9XCJvblNlYXJjaFZhbHVlQ2hhbmdlKCRldmVudClcIi8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBbbmdTdHlsZV09XCJ7aGVpZ2h0OiBzZWFyY2hJbnB1dCAmJiBzZWxlY3Rpb25Db250YWluZXIuY2xpZW50SGVpZ2h0ID4gMjIwIHx8IHNlbGVjdGlvbkNvbnRhaW5lci5jbGllbnRIZWlnaHQgPiAyNjA/IDI2MCAtIChzZWFyY2hJbnB1dD8gNDAgOiAwKSArICdweCc6ICdhdXRvJ31cIj5cclxuICAgICAgICAgIDxuZy1zY3JvbGxiYXIgc3R5bGU9XCJ3aWR0aDogMTAwJVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNtb290aFNjcm9sbFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbdmlzaWJpbGl0eV09XCInaG92ZXInXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2FwcGVhcmFuY2VdPVwiJ2NvbXBhY3QnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW3NlbnNvckRpc2FibGVkXT1cImlzTG9hZGluZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvSGVpZ2h0RGlzYWJsZWRdPVwiZmFsc2VcIiAjc2Nyb2xsYmFyPlxyXG4gICAgICAgICAgICA8ZGl2ICNzZWxlY3Rpb25Db250YWluZXIgKGNsaWNrKT1cIm9uQ0xpY2tPbk1lbnUoJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgIDxtYXQtc2VsZWN0aW9uLWxpc3QgI3NlbGVjdGlvbiBbbXVsdGlwbGVdPVwibXVsdGlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93TGlzdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J3BhZGRpbmcnOiAwLCAnd2lkdGgnOiBsaXN0Q29udGFpbmVyU2l6ZS53aWR0aCwgJ21pbi13aWR0aC5weCc6IDExMn1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJvbkNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInNlbGVjdGlvblZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiISFncm91cEJ5XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IG9wdCBvZiBvcmRlcmVkT3B0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZ3JvdXBIZWFkZXJUZW1wbGF0ZT8gZ3JvdXBIZWFkZXJUZW1wbGF0ZS50ZW1wbGF0ZTogZGVmYXVsdEdyb3VwSGVhZGVyVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogb3B0fVwiPjwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8bmctanZ4LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIG9wdC5vcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvbltpdGVtVmFsdWVdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvbnNUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBvcHRpb259XCI+PC9uZy1jb250YWluZXI+LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT1cInBhZGRpbmctaW5saW5lOiAxMHB4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvbnNUZW1wbGF0ZT8gb3B0aW9uc1RlbXBsYXRlLnRlbXBsYXRlIDogZGVmYXVsdFRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IG9wdGlvbn1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctanZ4LW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZ3JvdXBCeSB8fCBncm91cEJ5Lmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bmctanZ4LW9wdGlvbiAqbmdGb3I9XCJsZXQgb3B0aW9uIG9mIHNlbGVjdGFibGVPcHRpb25zXCIgW3ZhbHVlXT1cIm9wdGlvbltpdGVtVmFsdWVdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJvcHRpb25zVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogb3B0aW9ufVwiPjwvbmctY29udGFpbmVyPi0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0aW9uc1RlbXBsYXRlPyBvcHRpb25zVGVtcGxhdGUudGVtcGxhdGUgOiBkZWZhdWx0VGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IG9wdGlvbn1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1qdngtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgPC9tYXQtc2VsZWN0aW9uLWxpc3Q+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9uZy1zY3JvbGxiYXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1lbnUtZm9vdGVyXCI+XHJcbiAgICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW25nLWp2eC1mb290ZXJdXCI+PC9uZy1jb250ZW50PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICA8L21hdC1tZW51PlxyXG4gIDwvZGl2PlxyXG4gIDwhLS0gRU5EIE1FTlUgLS0+XHJcbiAgPCEtLSBTVEFSVCBJTlBVVCAtLT5cclxuICA8ZGl2IFtuZ0NsYXNzXT1cInsnbmctanZ4LW11bHRpc2VsZWN0LXZhbHVlLWNvbnRhaW5lcic6IHRydWUsICdpcy1vcGVuJzogaXNPcGVufVwiXHJcbiAgICAgICAoY2xpY2spPVwiY2xpY2tPbk1lbnVUcmlnZ2VyKCRldmVudClcIlxyXG4gICAgICAgI3ZhbHVlQ29udGFpbmVyPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJuZy1qdngtbXVsdGlzZWxlY3RfX3BsYWNlaG9sZGVyXCIgKm5nSWY9XCJ2YWx1ZS5sZW5ndGggPT09IDBcIj5cclxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW3BsYWNlaG9sZGVyXVwiPjwvbmctY29udGVudD5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJuZy1qdngtbXVsdGlzZWxlY3QtdmFsdWUgbXVsdGktdmFsdWUtY29udGFpbmVyXCIgKm5nSWY9XCJtdWx0aVwiICNtdWx0aUNvbnRhaW5lcj5cclxuXHJcbiAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VsZWN0aW9uVGVtcGxhdGU/IHNlbGVjdGlvblRlbXBsYXRlLnRlbXBsYXRlIDogZGVmYXVsdE11bHRpU2VsZWN0aW9uVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiB2YWx1ZX1cIj48L25nLWNvbnRhaW5lcj5cclxuXHJcblxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm5nLWp2eC1tdWx0aXNlbGVjdC12YWx1ZSBzaW5nbGUtdmFsdWUtY29udGFpbmVyXCIgKm5nSWY9XCIhbXVsdGlcIj5cclxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdmFsIG9mIHZhbHVlXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VsZWN0aW9uVGVtcGxhdGU/IHNlbGVjdGlvblRlbXBsYXRlLnRlbXBsYXRlIDogZGVmYXVsdFNlbGVjdGlvblRlbXBsYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IHZhbH1cIj48L25nLWNvbnRhaW5lcj48L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm5nLWp2eC1tdWx0aXNlbGVjdF9fcmVtb3ZlLWJ1dHRvblwiICpuZ0lmPVwiY2xlYXJhYmxlICYmIHZhbHVlLmxlbmd0aCA+IDBcIiAoY2xpY2spPVwiY2xlYXIoJGV2ZW50KVwiPlxyXG4gICAgICA8bWF0LWljb24gc3R5bGU9XCJmb250LXNpemU6IDE4cHg7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1wiPmNsZWFyXHJcbiAgICAgIDwvbWF0LWljb24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJuZy1qdngtbXVsdGlzZWxlY3QtYXJyb3dcIj5cclxuICAgICAgPG1hdC1pY29uICpuZ0lmPVwiIWlzTG9hZGluZ1wiPmV4cGFuZF9tb3JlPC9tYXQtaWNvbj5cclxuICAgICAgPGRpdiAqbmdJZj1cImlzTG9hZGluZ1wiIGNsYXNzPVwibGRzLXJpbmdcIj5cclxuICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgPGRpdj48L2Rpdj5cclxuICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDwhLS0gRU5EIElOUFVUIC0tPlxyXG48L2Rpdj5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0VGVtcGxhdGUgbGV0LW9wdGlvbj5cclxuICA8ZGl2IHN0eWxlPVwibWF4LXdpZHRoOiAxMDAlO1xyXG4gICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcIj57e29wdGlvbltpdGVtVGV4dF19fVxyXG4gIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0U2VsZWN0aW9uVGVtcGxhdGUgbGV0LXZhbHVlPlxyXG4gIHt7dmFsdWVbaXRlbVRleHRdfX1cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdE11bHRpU2VsZWN0aW9uVGVtcGxhdGUgbGV0LXZhbHVlPlxyXG4gIDxtYXQtY2hpcC1saXN0ICNjaGlwTGlzdCBbZGlzYWJsZWRdPVwidGhpcy5kaXNhYmxlZFwiPlxyXG4gICAgPG1hdC1jaGlwIFtjb2xvcl09XCIncHJpbWFyeSdcIiBzZWxlY3RlZCAqbmdGb3I9XCJsZXQgdmFsIG9mIHZhbHVlXCIgW3NlbGVjdGFibGVdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwibmctanZ4LW11bHRpc2VsZWN0LWNoaXBcIlxyXG4gICAgICAgICAgICAgIFtyZW1vdmFibGVdPVwidHJ1ZVwiIChyZW1vdmVkKT1cImRlc2VsZWN0KHZhbClcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hpcC1jb250ZW50XCJcclxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnbWF4LXdpZHRoJzogbXVsdGlDb250YWluZXJXaWR0aCAtIDUwICsncHgnfVwiPnt7dmFsW2l0ZW1UZXh0XX19PC9zcGFuPlxyXG5cclxuICAgICAgPG1hdC1pY29uIG1hdENoaXBSZW1vdmU+Y2FuY2VsPC9tYXQtaWNvbj5cclxuICAgIDwvbWF0LWNoaXA+XHJcbiAgPC9tYXQtY2hpcC1saXN0PlxyXG48L25nLXRlbXBsYXRlPlxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRHcm91cEhlYWRlclRlbXBsYXRlIGxldC1vcHQ+XHJcbiAgPGRpdiBzdHlsZT1cInBhZGRpbmctaW5saW5lOiAxNXB4XCI+PHN0cm9uZz57e29wdC5ncm91cH19PC9zdHJvbmc+PC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
|