ng-jvx-multiselect 1.1.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +330 -0
  2. package/_index.scss +1 -0
  3. package/esm2020/lib/directives/ng-jvx-disabled-option.directive.mjs +49 -0
  4. package/esm2020/lib/directives/ng-jvx-focus.directive.mjs +29 -0
  5. package/esm2020/lib/directives/ng-jvx-group-header.directive.mjs +25 -0
  6. package/esm2020/lib/directives/ng-jvx-options-template.directive.mjs +26 -0
  7. package/esm2020/lib/directives/ng-jvx-selection-template.directive.mjs +25 -0
  8. package/esm2020/lib/interfaces/ng-jvx-group-mapper.mjs +2 -0
  9. package/esm2020/lib/interfaces/ng-jvx-option-mapper.mjs +2 -0
  10. package/esm2020/lib/interfaces/ng-jvx-search-mapper.mjs +2 -0
  11. package/esm2020/lib/ng-jvx-multiselect.component.mjs +589 -0
  12. package/esm2020/lib/ng-jvx-multiselect.module.mjs +92 -0
  13. package/esm2020/lib/ng-jvx-multiselect.service.mjs +42 -0
  14. package/esm2020/lib/ng-jvx-option/ng-jvx-option.component.mjs +31 -0
  15. package/esm2020/lib/ng-jvx-panel/ng-jvx-panel.component.mjs +41 -0
  16. package/esm2020/ng-jvx-multiselect.mjs +5 -0
  17. package/esm2020/public-api.mjs +15 -0
  18. package/fesm2015/ng-jvx-multiselect.mjs +924 -0
  19. package/fesm2015/ng-jvx-multiselect.mjs.map +1 -0
  20. package/fesm2020/ng-jvx-multiselect.mjs +918 -0
  21. package/fesm2020/ng-jvx-multiselect.mjs.map +1 -0
  22. package/lib/directives/ng-jvx-disabled-option.directive.d.ts +14 -0
  23. package/lib/directives/ng-jvx-disabled-option.directive.d.ts.map +1 -0
  24. package/lib/directives/ng-jvx-focus.directive.d.ts +11 -0
  25. package/lib/directives/ng-jvx-focus.directive.d.ts.map +1 -0
  26. package/lib/directives/ng-jvx-group-header.directive.d.ts +10 -0
  27. package/lib/directives/ng-jvx-group-header.directive.d.ts.map +1 -0
  28. package/lib/directives/ng-jvx-options-template.directive.d.ts +11 -0
  29. package/lib/directives/ng-jvx-options-template.directive.d.ts.map +1 -0
  30. package/lib/directives/ng-jvx-selection-template.directive.d.ts +10 -0
  31. package/lib/directives/ng-jvx-selection-template.directive.d.ts.map +1 -0
  32. package/lib/interfaces/ng-jvx-group-mapper.d.ts +8 -0
  33. package/lib/interfaces/ng-jvx-group-mapper.d.ts.map +1 -0
  34. package/lib/interfaces/ng-jvx-option-mapper.d.ts +7 -0
  35. package/lib/interfaces/ng-jvx-option-mapper.d.ts.map +1 -0
  36. package/lib/interfaces/ng-jvx-search-mapper.d.ts +7 -0
  37. package/lib/interfaces/ng-jvx-search-mapper.d.ts.map +1 -0
  38. package/lib/ng-jvx-multiselect.component.d.ts +144 -0
  39. package/lib/ng-jvx-multiselect.component.d.ts.map +1 -0
  40. package/lib/ng-jvx-multiselect.module.d.ts +26 -0
  41. package/lib/ng-jvx-multiselect.module.d.ts.map +1 -0
  42. package/lib/ng-jvx-multiselect.service.d.ts +20 -0
  43. package/lib/ng-jvx-multiselect.service.d.ts.map +1 -0
  44. package/lib/ng-jvx-option/ng-jvx-option.component.d.ts +14 -0
  45. package/lib/ng-jvx-option/ng-jvx-option.component.d.ts.map +1 -0
  46. package/lib/ng-jvx-panel/ng-jvx-panel.component.d.ts +16 -0
  47. package/lib/ng-jvx-panel/ng-jvx-panel.component.d.ts.map +1 -0
  48. package/ng-jvx-multiselect.d.ts +5 -0
  49. package/ng-jvx-multiselect.d.ts.map +1 -0
  50. package/package.json +48 -0
  51. package/public-api.d.ts +11 -0
  52. package/public-api.d.ts.map +1 -0
  53. package/src/lib/mixins.scss +6 -0
  54. package/src/lib/ng-jvx-multiselect.component.scss +234 -0
  55. package/src/lib/ng-jvx-option/ng-jvx-option.component.scss +40 -0
  56. package/src/lib/ng-jvx-panel/ng-jvx-panel.component.scss +0 -0
@@ -0,0 +1,589 @@
1
+ import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, forwardRef, HostBinding, Input, Optional, Output, Self, ViewChild, ViewChildren } from '@angular/core';
2
+ import { NgJvxOptionsTemplateDirective } from './directives/ng-jvx-options-template.directive';
3
+ import { FormControl } 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 { MatFormFieldControl } from '@angular/material/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/menu";
16
+ import * as i4 from "ngx-scrollbar";
17
+ import * as i5 from "@angular/material/list";
18
+ import * as i6 from "./ng-jvx-option/ng-jvx-option.component";
19
+ import * as i7 from "@angular/material/icon";
20
+ import * as i8 from "@angular/material/chips";
21
+ import * as i9 from "@angular/common";
22
+ import * as i10 from "./directives/ng-jvx-focus.directive";
23
+ import * as i11 from "ngx-scrollbar/smooth-scroll";
24
+ export class NgJvxMultiselectComponent {
25
+ constructor(formBuilder, service, elementRef, changeDetectorRef, ngControl, fb) {
26
+ this.formBuilder = formBuilder;
27
+ this.service = service;
28
+ this.elementRef = elementRef;
29
+ this.changeDetectorRef = changeDetectorRef;
30
+ this.ngControl = ngControl;
31
+ this.id = `jvx-multiselect-${NgJvxMultiselectComponent.nextId++}`;
32
+ this.optionsTemplate = null;
33
+ this.selectionTemplate = null;
34
+ this.groupHeaderTemplate = null;
35
+ // @ContentChild(NgJvxOptionComponent) optionComp: NgJvxOptionComponent;
36
+ // @ContentChild(TemplateRef) optionsTemplate: TemplateRef<any> | null = null;
37
+ this.options = [];
38
+ this.multi = false;
39
+ this.url = '';
40
+ this.requestType = 'get';
41
+ this.itemValue = 'value';
42
+ this.itemText = 'text';
43
+ this.ignorePagination = false;
44
+ this.clearable = false;
45
+ this.closeOnClick = true;
46
+ this.hasErrors = false;
47
+ this.searchMode = null;
48
+ this.searchInput = false;
49
+ this.searchLabel = 'search';
50
+ this.listProp = '';
51
+ this.totalRowsProp = '';
52
+ this.panelClass = '';
53
+ this.searchProp = 'search';
54
+ this.mapper = {
55
+ mapOption(source) {
56
+ return of(source);
57
+ }
58
+ };
59
+ this.searchMapper = {
60
+ mapSearch: (source, options) => {
61
+ return of(options.filter(o => o[this.itemText].toString().toLowerCase().includes(source.toString().toLowerCase())));
62
+ }
63
+ };
64
+ this.requestHeaders = new HttpHeaders();
65
+ // tslint:disable-next-line:variable-name
66
+ this._required = false;
67
+ // tslint:disable-next-line:variable-name
68
+ this._disabled = false;
69
+ this.valueChange = new EventEmitter();
70
+ this.jvxMultiselectOpen = new EventEmitter();
71
+ this.jvxMultiselectOpened = new EventEmitter();
72
+ this.jvxMultiselectClose = new EventEmitter();
73
+ this.jvxMultiselectClosed = new EventEmitter();
74
+ this.scrollEnd = new EventEmitter();
75
+ this.controlType = 'ng-jvx-multiselect';
76
+ this.document = document;
77
+ this.window = window;
78
+ this.isOpen = false;
79
+ this.isLoading = false;
80
+ this.showList = true;
81
+ this.asyncOptions = [];
82
+ this.selectableOptions = [];
83
+ this.orderedOptions = [];
84
+ this.searchValue = '';
85
+ this.yPosition = 'above';
86
+ this.stateChanges = new Subject();
87
+ this.currentPage = 0;
88
+ this.listContainerSize = { height: 'auto', minHeight: '0', width: '100%' };
89
+ this.touched = false;
90
+ this.focused = false;
91
+ this.multiContainerWidth = 100;
92
+ this.searchValueSubject = new Subject();
93
+ this.searchValue$ = this.searchValueSubject.asObservable();
94
+ this.pValue = [];
95
+ this.shouldLoadMore = true;
96
+ this.pageSize = 15;
97
+ this.unsubscribe = new Subject();
98
+ this.unsubscribe$ = this.unsubscribe.asObservable();
99
+ this.onTouched = () => {
100
+ };
101
+ if (this.ngControl != null) {
102
+ // Setting the value accessor directly (instead of using
103
+ // the providers) to avoid running into a circular import.
104
+ this.ngControl.valueAccessor = this;
105
+ }
106
+ this.parts = fb.group({
107
+ area: '',
108
+ exchange: '',
109
+ subscriber: '',
110
+ });
111
+ this.form = this.formBuilder.group({
112
+ selectionValue: new FormControl(this.selectionValue)
113
+ });
114
+ }
115
+ get shouldLabelFloat() {
116
+ return this.focused || !this.empty;
117
+ }
118
+ set value(value) {
119
+ this.pValue = value ?? [];
120
+ if (value) {
121
+ this.form.get('selectionValue').setValue(this.pValue.map(v => v[this.itemValue]));
122
+ }
123
+ else {
124
+ this.form.get('selectionValue').setValue(value);
125
+ }
126
+ this.stateChanges.next();
127
+ }
128
+ get value() {
129
+ return this.pValue;
130
+ }
131
+ get required() {
132
+ return this._required;
133
+ }
134
+ set required(req) {
135
+ this._required = coerceBooleanProperty(req);
136
+ this.stateChanges.next();
137
+ }
138
+ get disabled() {
139
+ return this._disabled;
140
+ }
141
+ set disabled(value) {
142
+ this._disabled = coerceBooleanProperty(value);
143
+ this._disabled ? this.parts.disable() : this.parts.enable();
144
+ this.stateChanges.next();
145
+ }
146
+ get errorState() {
147
+ if (this.ngControl != null) {
148
+ return this.ngControl.invalid && this.ngControl.touched;
149
+ }
150
+ else {
151
+ return false;
152
+ }
153
+ }
154
+ ngOnInit() {
155
+ this.stateChange$.pipe(takeUntil(this.unsubscribe)).subscribe(() => {
156
+ this.changeDetectorRef.markForCheck();
157
+ });
158
+ this.selectableOptions = [...this.options];
159
+ this.updateOrderedOptions(this.selectableOptions).subscribe(noop);
160
+ fromEvent(window, 'resize').pipe(takeUntil(this.unsubscribe), debounceTime(100), map(() => {
161
+ return this.listContainerSize.width = this.jvxMultiselect.nativeElement.offsetWidth + 'px';
162
+ }), switchMap(() => timer(100)), tap(() => {
163
+ this.multiContainerWidth = this.multiContainer?.nativeElement?.offsetWidth ?? 100;
164
+ this.yPosition = window.innerHeight - this.jvxMultiselect.nativeElement?.getBoundingClientRect()?.top < 260 ? 'above' : 'below';
165
+ this.changeDetectorRef.markForCheck();
166
+ })).subscribe(noop);
167
+ this.searchValue$.pipe(takeUntil(this.unsubscribe), debounceTime(300), distinctUntilChanged((prev, curr) => {
168
+ return curr === this.searchValue;
169
+ }), switchMap((val) => {
170
+ this.searchValue = val;
171
+ this.currentPage = 0;
172
+ if (this.searchMode === 'client') {
173
+ return this.clientSearch();
174
+ }
175
+ else if (this.url && this.url.length > 0) {
176
+ return this.serverSearch();
177
+ }
178
+ })).subscribe((val) => {
179
+ this.changeDetectorRef.markForCheck();
180
+ });
181
+ }
182
+ clientSearch() {
183
+ let obs;
184
+ if (this.url && this.url.length > 0) {
185
+ this.selectableOptions = [];
186
+ this.updateOrderedOptions(this.selectableOptions).subscribe(noop);
187
+ this.shouldLoadMore = true;
188
+ obs = this.getList().pipe(map(() => {
189
+ return this.selectableOptions;
190
+ }));
191
+ }
192
+ else {
193
+ obs = of(this.options);
194
+ }
195
+ return obs.pipe(switchMap((val) => this.searchMapper.mapSearch(this.searchValue, val)), tap((res) => {
196
+ this.selectableOptions = [];
197
+ this.selectableOptions.push(...res);
198
+ }), switchMap(() => this.updateOrderedOptions(this.selectableOptions)));
199
+ }
200
+ serverSearch() {
201
+ this.shouldLoadMore = true;
202
+ this.selectableOptions = [];
203
+ this.shouldLoadMore = true;
204
+ return this.getList();
205
+ }
206
+ ngOnDestroy() {
207
+ this.unsubscribe.next();
208
+ this.stateChanges.complete();
209
+ }
210
+ ngAfterViewInit() {
211
+ timer(0).subscribe(() => {
212
+ this.listContainerSize.width = this.jvxMultiselect.nativeElement.offsetWidth + 'px';
213
+ });
214
+ if (this.scrollbar) {
215
+ this.scrollbar.scrolled.pipe(takeUntil(this.unsubscribe$)).subscribe((e) => {
216
+ this.onScrolled(e);
217
+ });
218
+ }
219
+ timer(0).pipe(tap(() => {
220
+ this.multiContainerWidth = this.multiContainer?.nativeElement?.offsetWidth ?? 100;
221
+ this.yPosition = window.innerHeight - this.jvxMultiselect.nativeElement?.getBoundingClientRect()?.top < 260 ? 'above' : 'below';
222
+ this.changeDetectorRef.markForCheck();
223
+ })).subscribe(noop);
224
+ }
225
+ ngOnChanges(changes) {
226
+ if (changes.options) {
227
+ this.selectableOptions = [...this.options];
228
+ this.updateOrderedOptions(this.selectableOptions).subscribe(noop);
229
+ }
230
+ }
231
+ get selectionValue() {
232
+ return this.value.map((v) => {
233
+ return v[this.itemValue];
234
+ });
235
+ }
236
+ get empty() {
237
+ const n = this.parts.value;
238
+ return !n.area && !n.exchange && !n.subscriber;
239
+ }
240
+ onCLickOnMenu(e) {
241
+ if (this.multi || this.closeOnClick === false) {
242
+ e.stopPropagation();
243
+ }
244
+ }
245
+ propagateChange(_) {
246
+ }
247
+ // this is the initial value set to the component
248
+ writeValue(obj) {
249
+ this.value = obj;
250
+ }
251
+ // registers 'fn' that will be fired when changes are made
252
+ // this is how we emit the changes back to the form
253
+ registerOnChange(fn) {
254
+ this.propagateChange = fn;
255
+ }
256
+ registerOnTouched(fn) {
257
+ this.onTouched = fn;
258
+ }
259
+ onChange(e) {
260
+ let vals = e.source.selectedOptions.selected.map(o => o.value);
261
+ vals = this.selectableOptions.filter(o => vals.includes(o[this.itemValue]));
262
+ console.log(vals);
263
+ const selectableIds = this.selectableOptions.map(s => s[this.itemValue]);
264
+ console.log(selectableIds);
265
+ if (this.multi) {
266
+ // if search is active, probably some of the already selected values are not included in the selectable options,
267
+ // so we have to push them in the selected values of the list;
268
+ for (const v of this.value) {
269
+ if (!selectableIds.includes(v[this.itemValue])) {
270
+ vals = [v, ...vals];
271
+ }
272
+ }
273
+ }
274
+ vals.sort((a, b) => {
275
+ return typeof a[this.itemValue] === 'string' ?
276
+ a[this.itemValue].localeCompare(b[this.itemValue]) : a[this.itemValue] - b[this.itemValue];
277
+ });
278
+ console.log(vals);
279
+ this.value = [...vals];
280
+ this.form.get('selectionValue').setValue(this.value.map(v => v[this.itemValue]));
281
+ this.valueChange.emit(this.value);
282
+ this.propagateChange(this.value);
283
+ this.changeDetectorRef.markForCheck();
284
+ }
285
+ onFocusIn(event) {
286
+ if (!this.focused) {
287
+ this.focused = true;
288
+ this.stateChanges.next();
289
+ }
290
+ }
291
+ onFocusOut(event) {
292
+ if (!this.elementRef.nativeElement.contains(event.relatedTarget)) {
293
+ this.touched = true;
294
+ this.focused = false;
295
+ this.onTouched();
296
+ this.stateChanges.next();
297
+ }
298
+ }
299
+ onMenuOpen() {
300
+ this.isOpen = true;
301
+ this.jvxMultiselectOpen.emit();
302
+ }
303
+ onMenuClose() {
304
+ this.isOpen = false;
305
+ this.jvxMultiselectClose.emit();
306
+ }
307
+ deselect(val) {
308
+ this.value = [...this.value.filter(v => v[this.itemValue] !== val[this.itemValue])];
309
+ // this.value.splice(this.value.findIndex(v => v[this.itemValue] === val[this.itemValue]), 1);
310
+ this.form.get('selectionValue').setValue(this.value.map(m => m.value));
311
+ this.valueChange.emit(this.value);
312
+ this.propagateChange(this.value);
313
+ this.changeDetectorRef.markForCheck();
314
+ }
315
+ setSelectionContainerSize() {
316
+ timer(0).subscribe(() => {
317
+ if (this.selectionContainer) {
318
+ this.listContainerSize.height = this.selectionContainer.nativeElement.offsetHeight > 260 ? '260px' : 'auto';
319
+ this.listContainerSize.minHeight = this.selectionContainer.nativeElement.offsetHeight <= 260 ?
320
+ this.selectionContainer.nativeElement.offsetHeight + 'px' : '260px';
321
+ this.listContainerSize.width = this.jvxMultiselect.nativeElement.offsetWidth + 'px';
322
+ }
323
+ this.changeDetectorRef.detectChanges();
324
+ });
325
+ }
326
+ clickOnMenuTrigger(e) {
327
+ if (!this.disabled) {
328
+ this.showList = false;
329
+ this.shouldLoadMore = true;
330
+ timer(0).subscribe(() => {
331
+ this.showList = true;
332
+ if (this.url.length > 0) {
333
+ e.preventDefault();
334
+ this.selectableOptions.length = 0;
335
+ this.updateOrderedOptions(this.selectableOptions);
336
+ this.getList().subscribe(noop);
337
+ this.setSelectionContainerSize();
338
+ }
339
+ else {
340
+ this.trigger.openMenu();
341
+ this.setSelectionContainerSize();
342
+ }
343
+ });
344
+ }
345
+ }
346
+ getList() {
347
+ this.isLoading = true;
348
+ return this.service.getList({
349
+ url: this.url,
350
+ requestType: this.requestType,
351
+ data: {},
352
+ currentPage: ++this.currentPage,
353
+ ignorePagination: this.ignorePagination,
354
+ requestHeaders: this.requestHeaders,
355
+ search: this.searchValue,
356
+ searchProp: this.searchProp,
357
+ pageSize: this.pageSize
358
+ }).pipe(switchMap((val) => {
359
+ let result = [];
360
+ if (this.listProp.length > 0) {
361
+ result = [...val[this.listProp]];
362
+ }
363
+ else {
364
+ result = [...val];
365
+ }
366
+ if (result.length === 0) {
367
+ this.shouldLoadMore = false;
368
+ this.isLoading = false;
369
+ return forkJoin([]);
370
+ }
371
+ else {
372
+ const newOptions = [];
373
+ for (const opt of result) {
374
+ const newOption = this.mapper.mapOption(opt);
375
+ newOptions.push(newOption);
376
+ }
377
+ return forkJoin(newOptions);
378
+ }
379
+ }), switchMap((finVal) => {
380
+ this.selectableOptions.push(...finVal);
381
+ return this.updateOrderedOptions(this.selectableOptions);
382
+ }), map((val) => {
383
+ this.isLoading = false;
384
+ this.trigger.openMenu();
385
+ this.setSelectionContainerSize();
386
+ this.changeDetectorRef.markForCheck();
387
+ return val;
388
+ }));
389
+ }
390
+ onScrolled(e) {
391
+ if (e.target.scrollTop + 220 + ((this.searchInput ? 0 : 1) * 40) === this.selectionContainer.nativeElement.offsetHeight
392
+ && !this.isLoading) {
393
+ this.scrollEnd.emit();
394
+ if (this.url && this.url.length > 0 && !this.ignorePagination && this.shouldLoadMore) {
395
+ this.getList().subscribe(noop);
396
+ }
397
+ }
398
+ }
399
+ onMenuOpened() {
400
+ this.jvxMultiselectOpened.emit();
401
+ }
402
+ onMenuClosed() {
403
+ if ((!this.url || this.url.length === 0) && this.searchMode === 'client') {
404
+ this.searchValueSubject.next('');
405
+ }
406
+ else {
407
+ this.searchValue = '';
408
+ this.currentPage = 0;
409
+ }
410
+ this.jvxMultiselectClosed.emit();
411
+ this.changeDetectorRef.markForCheck();
412
+ }
413
+ onSearchInputClick(e) {
414
+ e.stopPropagation();
415
+ }
416
+ onSearchValueChange(e) {
417
+ this.searchValueSubject.next(e.target.value);
418
+ }
419
+ clear(e) {
420
+ e.stopPropagation();
421
+ e.preventDefault();
422
+ this.value = [];
423
+ this.form.get('selectionValue').setValue(this.value.map(v => v[this.itemValue]));
424
+ this.propagateChange(this.value);
425
+ this.valueChange.emit(this.value);
426
+ this.changeDetectorRef.markForCheck();
427
+ }
428
+ setDescribedByIds(ids) {
429
+ const controlElement = this.elementRef.nativeElement
430
+ .querySelector('.ng-jvx-multiselect');
431
+ controlElement.setAttribute('aria-describedby', ids.join(' '));
432
+ }
433
+ onContainerClick(event) {
434
+ // if ((event.target as Element).tagName.toLowerCase() !== 'input') {
435
+ // this.elementRef.nativeElement.querySelector('input').focus();
436
+ // }
437
+ }
438
+ get stateChange$() {
439
+ return this.stateChanges.asObservable();
440
+ }
441
+ updateOrderedOptions(options) {
442
+ let obs = of(options);
443
+ if (this.groupBy) {
444
+ this.orderedOptions.length = 0;
445
+ const obsArr = [];
446
+ for (const option of options) {
447
+ if (typeof this.groupBy !== 'string') {
448
+ obsArr.push(this.groupBy.mapGroup(option));
449
+ }
450
+ else {
451
+ obsArr.push(of({ group: option[this.groupBy], option }));
452
+ }
453
+ }
454
+ obs = forkJoin(obsArr).pipe(map((res) => {
455
+ const groups = [...new Set(res.map(item => item.group))];
456
+ for (const group of groups) {
457
+ this.orderedOptions.push({
458
+ group,
459
+ options: res.filter(r => r.group === group).map(o => o.option)
460
+ });
461
+ }
462
+ return this.orderedOptions;
463
+ }));
464
+ }
465
+ return obs;
466
+ }
467
+ closeMenu() {
468
+ this.trigger.closeMenu();
469
+ }
470
+ }
471
+ NgJvxMultiselectComponent.nextId = 0;
472
+ NgJvxMultiselectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: NgJvxMultiselectComponent, deps: [{ token: i1.FormBuilder }, { token: i2.NgJvxMultiselectService }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1.NgControl, optional: true, self: true }, { token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
473
+ NgJvxMultiselectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.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", mapper: "mapper", searchMapper: "searchMapper", groupBy: "groupBy", value: "value", requestHeaders: "requestHeaders", required: "required", disabled: "disabled" }, outputs: { valueChange: "valueChange", jvxMultiselectOpen: "jvxMultiselectOpen", jvxMultiselectOpened: "jvxMultiselectOpened", jvxMultiselectClose: "jvxMultiselectClose", jvxMultiselectClosed: "jvxMultiselectClosed", scrollEnd: "scrollEnd" }, host: { properties: { "id": "this.id", "class.floating": "this.shouldLabelFloat" } }, providers: [
474
+ {
475
+ provide: MatFormFieldControl,
476
+ useExisting: forwardRef(() => NgJvxMultiselectComponent),
477
+ multi: true,
478
+ }
479
+ ], 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\r\n [yPosition]=\"yPosition\">\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 <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: [""], components: [{ type: i3.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i4.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"] }, { type: i5.MatSelectionList, selector: "mat-selection-list", inputs: ["disableRipple", "tabIndex", "color", "compareWith", "disabled", "multiple"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { type: i6.NgJvxOptionComponent, selector: "ng-jvx-option", inputs: ["value"] }, { type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i8.MatChipList, selector: "mat-chip-list", inputs: ["errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }], directives: [{ type: i9.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i3.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i9.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i10.NgJvxFocusDirective, selector: "[ngJvxFocus]", inputs: ["ngJvxFocus"] }, { type: i11.SmoothScroll, selector: "[smoothScroll], [smooth-scroll]", exportAs: ["smoothScroll"] }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i9.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i8.MatChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { type: i8.MatChipRemove, selector: "[matChipRemove]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
480
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.0.2", ngImport: i0, type: NgJvxMultiselectComponent, decorators: [{
481
+ type: Component,
482
+ args: [{ selector: 'ng-jvx-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
483
+ {
484
+ provide: MatFormFieldControl,
485
+ useExisting: forwardRef(() => NgJvxMultiselectComponent),
486
+ multi: true,
487
+ }
488
+ ], 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\r\n [yPosition]=\"yPosition\">\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 <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: [""] }]
489
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.NgJvxMultiselectService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i1.NgControl, decorators: [{
490
+ type: Optional
491
+ }, {
492
+ type: Self
493
+ }] }, { type: i1.FormBuilder }]; }, propDecorators: { id: [{
494
+ type: HostBinding
495
+ }], shouldLabelFloat: [{
496
+ type: HostBinding,
497
+ args: ['class.floating']
498
+ }], jvxMultiselect: [{
499
+ type: ViewChild,
500
+ args: ['jvxMultiselect', { static: true }]
501
+ }], selectionContainer: [{
502
+ type: ViewChild,
503
+ args: ['selectionContainer', { static: false }]
504
+ }], selection: [{
505
+ type: ViewChild,
506
+ args: ['selection', { static: true }]
507
+ }], trigger: [{
508
+ type: ViewChild,
509
+ args: ['trigger', { static: true }]
510
+ }], scrollbar: [{
511
+ type: ViewChild,
512
+ args: ['scrollbar', { static: false }]
513
+ }], multiContainer: [{
514
+ type: ViewChild,
515
+ args: ['multiContainer', { static: false }]
516
+ }], optionComp: [{
517
+ type: ViewChildren,
518
+ args: [NgJvxOptionComponent]
519
+ }], optionsTemplate: [{
520
+ type: ContentChild,
521
+ args: [NgJvxOptionsTemplateDirective]
522
+ }], selectionTemplate: [{
523
+ type: ContentChild,
524
+ args: [NgJvxSelectionTemplateDirective]
525
+ }], groupHeaderTemplate: [{
526
+ type: ContentChild,
527
+ args: [NgJvxGroupHeaderDirective]
528
+ }], options: [{
529
+ type: Input
530
+ }], multi: [{
531
+ type: Input
532
+ }], url: [{
533
+ type: Input
534
+ }], requestType: [{
535
+ type: Input
536
+ }], itemValue: [{
537
+ type: Input
538
+ }], itemText: [{
539
+ type: Input
540
+ }], ignorePagination: [{
541
+ type: Input
542
+ }], clearable: [{
543
+ type: Input
544
+ }], closeOnClick: [{
545
+ type: Input
546
+ }], hasErrors: [{
547
+ type: Input
548
+ }], searchMode: [{
549
+ type: Input
550
+ }], searchInput: [{
551
+ type: Input
552
+ }], searchLabel: [{
553
+ type: Input
554
+ }], listProp: [{
555
+ type: Input
556
+ }], totalRowsProp: [{
557
+ type: Input
558
+ }], panelClass: [{
559
+ type: Input
560
+ }], searchProp: [{
561
+ type: Input
562
+ }], mapper: [{
563
+ type: Input
564
+ }], searchMapper: [{
565
+ type: Input
566
+ }], groupBy: [{
567
+ type: Input
568
+ }], value: [{
569
+ type: Input
570
+ }], requestHeaders: [{
571
+ type: Input
572
+ }], required: [{
573
+ type: Input
574
+ }], disabled: [{
575
+ type: Input
576
+ }], valueChange: [{
577
+ type: Output
578
+ }], jvxMultiselectOpen: [{
579
+ type: Output
580
+ }], jvxMultiselectOpened: [{
581
+ type: Output
582
+ }], jvxMultiselectClose: [{
583
+ type: Output
584
+ }], jvxMultiselectClosed: [{
585
+ type: Output
586
+ }], scrollEnd: [{
587
+ type: Output
588
+ }] } });
589
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctanZ4LW11bHRpc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWp2eC1tdWx0aXNlbGVjdC9zcmMvbGliL25nLWp2eC1tdWx0aXNlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1qdngtbXVsdGlzZWxlY3Qvc3JjL2xpYi9uZy1qdngtbXVsdGlzZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNVLHVCQUF1QixFQUN0QyxTQUFTLEVBQ1QsWUFBWSxFQUNBLFlBQVksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUNqRCxLQUFLLEVBRUcsUUFBUSxFQUFFLE1BQU0sRUFBYSxJQUFJLEVBRXpDLFNBQVMsRUFBRSxZQUFZLEVBQ3hCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBQzdGLE9BQU8sRUFBb0MsV0FBVyxFQUEwQyxNQUFNLGdCQUFnQixDQUFDO0FBRXZILE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBRzdFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVqRCxPQUFPLEVBQUMsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xHLE9BQU8sRUFBZ0IsUUFBUSxFQUFRLFNBQVMsRUFBTyxJQUFJLEVBQTBCLEVBQUUsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXJILE9BQU8sRUFBQywrQkFBK0IsRUFBQyxNQUFNLGtEQUFrRCxDQUFDO0FBQ2pHLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQ2pFLE9BQU8sRUFBQyxx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QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFLRyxZQUFZO3NCQUFwQixLQUFLO2dCQUtHLE9BQU87c0JBQWYsS0FBSztnQkFFTyxLQUFLO3NCQUFqQixLQUFLO2dCQWNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBR0YsUUFBUTtzQkFEWCxLQUFLO2dCQWNGLFFBQVE7c0JBRFgsS0FBSztnQkFzQkksV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBQ0csb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBDb250ZW50Q2hpbGQsXHJcbiAgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBmb3J3YXJkUmVmLCBIb3N0QmluZGluZyxcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsIE9uRGVzdHJveSxcclxuICBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFF1ZXJ5TGlzdCwgU2VsZixcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7TmdKdnhPcHRpb25zVGVtcGxhdGVEaXJlY3RpdmV9IGZyb20gJy4vZGlyZWN0aXZlcy9uZy1qdngtb3B0aW9ucy10ZW1wbGF0ZS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQnVpbGRlciwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgTkdfVkFMVUVfQUNDRVNTT1IsIE5nQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQge01hdFNlbGVjdGlvbkxpc3QsIE1hdFNlbGVjdGlvbkxpc3RDaGFuZ2V9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2xpc3QnO1xyXG5pbXBvcnQge05nSnZ4T3B0aW9uQ29tcG9uZW50fSBmcm9tICcuL25nLWp2eC1vcHRpb24vbmctanZ4LW9wdGlvbi5jb21wb25lbnQnO1xyXG5pbXBvcnQge01hdE1lbnVUcmlnZ2VyfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcclxuaW1wb3J0IHtOZ0p2eE11bHRpc2VsZWN0U2VydmljZX0gZnJvbSAnLi9uZy1qdngtbXVsdGlzZWxlY3Quc2VydmljZSc7XHJcbmltcG9ydCB7SHR0cEhlYWRlcnN9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHtOZ1Njcm9sbGJhcn0gZnJvbSAnbmd4LXNjcm9sbGJhcic7XHJcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7Y29tYmluZUxhdGVzdCwgZm9ya0pvaW4sIGZyb20sIGZyb21FdmVudCwgaWlmLCBub29wLCBvYnNlcnZhYmxlLCBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCwgdGltZXJ9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQge05nSnZ4T3B0aW9uTWFwcGVyfSBmcm9tICcuL2ludGVyZmFjZXMvbmctanZ4LW9wdGlvbi1tYXBwZXInO1xyXG5pbXBvcnQge05nSnZ4U2VsZWN0aW9uVGVtcGxhdGVEaXJlY3RpdmV9IGZyb20gJy4vZGlyZWN0aXZlcy9uZy1qdngtc2VsZWN0aW9uLXRlbXBsYXRlLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7TWF0Rm9ybUZpZWxkQ29udHJvbH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7Y29lcmNlQm9vbGVhblByb3BlcnR5fSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xyXG5pbXBvcnQge05nSnZ4R3JvdXBIZWFkZXJEaXJlY3RpdmV9IGZyb20gJy4vZGlyZWN0aXZlcy9uZy1qdngtZ3JvdXAtaGVhZGVyLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7TmdKdnhTZWFyY2hNYXBwZXJ9IGZyb20gJy4vaW50ZXJmYWNlcy9uZy1qdngtc2VhcmNoLW1hcHBlcic7XHJcbmltcG9ydCB7TmdKdnhHcm91cCwgTmdKdnhHcm91cE1hcHBlcn0gZnJvbSAnLi9pbnRlcmZhY2VzL25nLWp2eC1ncm91cC1tYXBwZXInO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNvbXBvbmVudC1zZWxlY3RvclxyXG4gIHNlbGVjdG9yOiAnbmctanZ4LW11bHRpc2VsZWN0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbmctanZ4LW11bHRpc2VsZWN0LmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9uZy1qdngtbXVsdGlzZWxlY3QuY29tcG9uZW50LnNjc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTWF0Rm9ybUZpZWxkQ29udHJvbCxcclxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmdKdnhNdWx0aXNlbGVjdENvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlLFxyXG4gICAgfV1cclxufSlcclxuZXhwb3J0IGNsYXNzIE5nSnZ4TXVsdGlzZWxlY3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzLCBNYXRGb3JtRmllbGRDb250cm9sPGFueT4sIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcclxuICBzdGF0aWMgbmV4dElkID0gMDtcclxuICBASG9zdEJpbmRpbmcoKSBpZCA9IGBqdngtbXVsdGlzZWxlY3QtJHtOZ0p2eE11bHRpc2VsZWN0Q29tcG9uZW50Lm5leHRJZCsrfWA7XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZmxvYXRpbmcnKVxyXG4gIGdldCBzaG91bGRMYWJlbEZsb2F0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuZm9jdXNlZCB8fCAhdGhpcy5lbXB0eTtcclxuICB9XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2p2eE11bHRpc2VsZWN0Jywge3N0YXRpYzogdHJ1ZX0pIGp2eE11bHRpc2VsZWN0OiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdGlvbkNvbnRhaW5lcicsIHtzdGF0aWM6IGZhbHNlfSkgc2VsZWN0aW9uQ29udGFpbmVyOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ3NlbGVjdGlvbicsIHtzdGF0aWM6IHRydWV9KSBzZWxlY3Rpb246IE1hdFNlbGVjdGlvbkxpc3Q7XHJcbiAgQFZpZXdDaGlsZCgndHJpZ2dlcicsIHtzdGF0aWM6IHRydWV9KSB0cmlnZ2VyOiBNYXRNZW51VHJpZ2dlcjtcclxuICBAVmlld0NoaWxkKCdzY3JvbGxiYXInLCB7c3RhdGljOiBmYWxzZX0pIHNjcm9sbGJhcjogTmdTY3JvbGxiYXI7XHJcbiAgQFZpZXdDaGlsZCgnbXVsdGlDb250YWluZXInLCB7c3RhdGljOiBmYWxzZX0pIG11bHRpQ29udGFpbmVyOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGRyZW4oTmdKdnhPcHRpb25Db21wb25lbnQpIG9wdGlvbkNvbXA6IFF1ZXJ5TGlzdDxOZ0p2eE9wdGlvbkNvbXBvbmVudD47XHJcbiAgQENvbnRlbnRDaGlsZChOZ0p2eE9wdGlvbnNUZW1wbGF0ZURpcmVjdGl2ZSkgb3B0aW9uc1RlbXBsYXRlOiBOZ0p2eE9wdGlvbnNUZW1wbGF0ZURpcmVjdGl2ZSB8IG51bGwgPSBudWxsO1xyXG4gIEBDb250ZW50Q2hpbGQoTmdKdnhTZWxlY3Rpb25UZW1wbGF0ZURpcmVjdGl2ZSkgc2VsZWN0aW9uVGVtcGxhdGU6IE5nSnZ4U2VsZWN0aW9uVGVtcGxhdGVEaXJlY3RpdmUgfCBudWxsID0gbnVsbDtcclxuICBAQ29udGVudENoaWxkKE5nSnZ4R3JvdXBIZWFkZXJEaXJlY3RpdmUpIGdyb3VwSGVhZGVyVGVtcGxhdGU6IE5nSnZ4R3JvdXBIZWFkZXJEaXJlY3RpdmUgfCBudWxsID0gbnVsbDtcclxuICAvLyBAQ29udGVudENoaWxkKE5nSnZ4T3B0aW9uQ29tcG9uZW50KSBvcHRpb25Db21wOiBOZ0p2eE9wdGlvbkNvbXBvbmVudDtcclxuICAvLyBAQ29udGVudENoaWxkKFRlbXBsYXRlUmVmKSBvcHRpb25zVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsID0gbnVsbDtcclxuICBASW5wdXQoKSBvcHRpb25zOiBhbnlbXSA9IFtdO1xyXG4gIEBJbnB1dCgpIG11bHRpID0gZmFsc2U7XHJcbiAgQElucHV0KCkgdXJsID0gJyc7XHJcbiAgQElucHV0KCkgcmVxdWVzdFR5cGU6ICdnZXQnIHwgJ3Bvc3QnID0gJ2dldCc7XHJcbiAgQElucHV0KCkgaXRlbVZhbHVlID0gJ3ZhbHVlJztcclxuICBASW5wdXQoKSBpdGVtVGV4dCA9ICd0ZXh0JztcclxuICBASW5wdXQoKSBpZ25vcmVQYWdpbmF0aW9uID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY2xlYXJhYmxlID0gZmFsc2U7XHJcbiAgQElucHV0KCkgY2xvc2VPbkNsaWNrID0gdHJ1ZTtcclxuICBASW5wdXQoKSBoYXNFcnJvcnMgPSBmYWxzZTtcclxuICBASW5wdXQoKSBzZWFyY2hNb2RlOiBudWxsIHwgJ3NlcnZlcicgfCAnY2xpZW50JyA9IG51bGw7XHJcbiAgQElucHV0KCkgc2VhcmNoSW5wdXQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBzZWFyY2hMYWJlbCA9ICdzZWFyY2gnO1xyXG4gIEBJbnB1dCgpIGxpc3RQcm9wID0gJyc7XHJcbiAgQElucHV0KCkgdG90YWxSb3dzUHJvcCA9ICcnO1xyXG4gIEBJbnB1dCgpIHBhbmVsQ2xhc3MgPSAnJztcclxuICBASW5wdXQoKSBzZWFyY2hQcm9wID0gJ3NlYXJjaCc7XHJcbiAgQElucHV0KCkgbWFwcGVyOiBOZ0p2eE9wdGlvbk1hcHBlcjxhbnk+ID0ge1xyXG4gICAgbWFwT3B0aW9uKHNvdXJjZTogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgICAgcmV0dXJuIG9mKHNvdXJjZSk7XHJcbiAgICB9XHJcbiAgfTtcclxuICBASW5wdXQoKSBzZWFyY2hNYXBwZXI6IE5nSnZ4U2VhcmNoTWFwcGVyPGFueT4gPSB7XHJcbiAgICBtYXBTZWFyY2g6IChzb3VyY2U6IHN0cmluZywgb3B0aW9uczogYW55W10pOiBPYnNlcnZhYmxlPGFueT4gPT4ge1xyXG4gICAgICByZXR1cm4gb2Yob3B0aW9ucy5maWx0ZXIobyA9PiBvW3RoaXMuaXRlbVRleHRdLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzb3VyY2UudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSkpO1xyXG4gICAgfVxyXG4gIH07XHJcbiAgQElucHV0KCkgZ3JvdXBCeTogTmdKdnhHcm91cE1hcHBlcjxhbnk+IHwgc3RyaW5nIHwgbnVsbDtcclxuXHJcbiAgQElucHV0KCkgc2V0IHZhbHVlKHZhbHVlOiBhbnlbXSkge1xyXG4gICAgdGhpcy5wVmFsdWUgPSB2YWx1ZSA/PyBbXTtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KCdzZWxlY3Rpb25WYWx1ZScpLnNldFZhbHVlKHRoaXMucFZhbHVlLm1hcCh2ID0+IHZbdGhpcy5pdGVtVmFsdWVdKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmZvcm0uZ2V0KCdzZWxlY3Rpb25WYWx1ZScpLnNldFZhbHVlKHZhbHVlKTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICB9XHJcblxyXG4gIGdldCB2YWx1ZSgpOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5wVmFsdWU7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSByZXF1ZXN0SGVhZGVyczogSHR0cEhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuXHJcbiAgQElucHV0KClcclxuICBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XHJcbiAgfVxyXG5cclxuICBzZXQgcmVxdWlyZWQocmVxKSB7XHJcbiAgICB0aGlzLl9yZXF1aXJlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eShyZXEpO1xyXG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xyXG4gIH1cclxuXHJcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcclxuICBwcml2YXRlIF9yZXF1aXJlZCA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcclxuICB9XHJcblxyXG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xyXG4gICAgdGhpcy5fZGlzYWJsZWQgPyB0aGlzLnBhcnRzLmRpc2FibGUoKSA6IHRoaXMucGFydHMuZW5hYmxlKCk7XHJcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgfVxyXG5cclxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dmFyaWFibGUtbmFtZVxyXG4gIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XHJcblxyXG4gIGdldCBlcnJvclN0YXRlKCk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMubmdDb250cm9sICE9IG51bGwpIHtcclxuICAgICAgcmV0dXJuIHRoaXMubmdDb250cm9sLmludmFsaWQgJiYgdGhpcy5uZ0NvbnRyb2wudG91Y2hlZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZTogRXZlbnRFbWl0dGVyPGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XHJcbiAgQE91dHB1dCgpIGp2eE11bHRpc2VsZWN0T3BlbjogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBqdnhNdWx0aXNlbGVjdE9wZW5lZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG4gIEBPdXRwdXQoKSBqdnhNdWx0aXNlbGVjdENsb3NlOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIGp2eE11bHRpc2VsZWN0Q2xvc2VkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQE91dHB1dCgpIHNjcm9sbEVuZDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBwdWJsaWMgY29udHJvbFR5cGUgPSAnbmctanZ4LW11bHRpc2VsZWN0JztcclxuICBwdWJsaWMgZG9jdW1lbnQgPSBkb2N1bWVudDtcclxuICBwdWJsaWMgd2luZG93ID0gd2luZG93O1xyXG4gIHB1YmxpYyBmb3JtOiBGb3JtR3JvdXA7XHJcbiAgcHVibGljIGlzT3BlbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBpc0xvYWRpbmcgPSBmYWxzZTtcclxuICBwdWJsaWMgc2hvd0xpc3QgPSB0cnVlO1xyXG4gIHB1YmxpYyBhc3luY09wdGlvbnM6IGFueSA9IFtdO1xyXG4gIHB1YmxpYyBzZWxlY3RhYmxlT3B0aW9ucyA9IFtdO1xyXG4gIHB1YmxpYyBvcmRlcmVkT3B0aW9uczogeyBncm91cDogYW55LCBvcHRpb25zOiBhbnlbXSB9W10gPSBbXTtcclxuICBwdWJsaWMgc2VhcmNoVmFsdWUgPSAnJztcclxuICBwdWJsaWMgeVBvc2l0aW9uOiAnYWJvdmUnIHwgJ2JlbG93JyA9ICdhYm92ZSc7XHJcbiAgcHVibGljIHN0YXRlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHVibGljIGN1cnJlbnRQYWdlID0gMDtcclxuICBwdWJsaWMgbGlzdENvbnRhaW5lclNpemU6IHsgaGVpZ2h0OiBzdHJpbmcsIG1pbkhlaWdodDogc3RyaW5nLCB3aWR0aDogc3RyaW5nIH0gPSB7aGVpZ2h0OiAnYXV0bycsIG1pbkhlaWdodDogJzAnLCB3aWR0aDogJzEwMCUnfTtcclxuICBwdWJsaWMgcGFydHM6IEZvcm1Hcm91cDtcclxuXHJcbiAgcHVibGljIHRvdWNoZWQgPSBmYWxzZTtcclxuXHJcbiAgcHVibGljIHBsYWNlaG9sZGVyOiBzdHJpbmc7XHJcbiAgcHVibGljIGZvY3VzZWQgPSBmYWxzZTtcclxuICBwdWJsaWMgbXVsdGlDb250YWluZXJXaWR0aCA9IDEwMDtcclxuXHJcbiAgcHJpdmF0ZSBzZWFyY2hWYWx1ZVN1YmplY3QgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcbiAgcHJpdmF0ZSBzZWFyY2hWYWx1ZSQgPSB0aGlzLnNlYXJjaFZhbHVlU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuICBwcml2YXRlIHBWYWx1ZTogYW55W10gPSBbXTtcclxuICBwcml2YXRlIHNob3VsZExvYWRNb3JlID0gdHJ1ZTtcclxuICBwcml2YXRlIHBhZ2VTaXplID0gMTU7XHJcbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSQgPSB0aGlzLnVuc3Vic2NyaWJlLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIHB1YmxpYyBvblRvdWNoZWQgPSAoKSA9PiB7XHJcbiAgfTtcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLCBwcml2YXRlIHNlcnZpY2U6IE5nSnZ4TXVsdGlzZWxlY3RTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgICAgICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBAU2VsZigpIHB1YmxpYyBuZ0NvbnRyb2w6IE5nQ29udHJvbCwgZmI6IEZvcm1CdWlsZGVyKSB7XHJcbiAgICBpZiAodGhpcy5uZ0NvbnRyb2wgIT0gbnVsbCkge1xyXG4gICAgICAvLyBTZXR0aW5nIHRoZSB2YWx1ZSBhY2Nlc3NvciBkaXJlY3RseSAoaW5zdGVhZCBvZiB1c2luZ1xyXG4gICAgICAvLyB0aGUgcHJvdmlkZXJzKSB0byBhdm9pZCBydW5uaW5nIGludG8gYSBjaXJjdWxhciBpbXBvcnQuXHJcbiAgICAgIHRoaXMubmdDb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucGFydHMgPSBmYi5ncm91cCh7XHJcbiAgICAgIGFyZWE6ICcnLFxyXG4gICAgICBleGNoYW5nZTogJycsXHJcbiAgICAgIHN1YnNjcmliZXI6ICcnLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgc2VsZWN0aW9uVmFsdWU6IG5ldyBGb3JtQ29udHJvbCh0aGlzLnNlbGVjdGlvblZhbHVlKVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdGVDaGFuZ2UkLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUpKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnNlbGVjdGFibGVPcHRpb25zID0gWy4uLnRoaXMub3B0aW9uc107XHJcbiAgICB0aGlzLnVwZGF0ZU9yZGVyZWRPcHRpb25zKHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMpLnN1YnNjcmliZShub29wKTtcclxuICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKS5waXBlKHRha2VVbnRpbCh0aGlzLnVuc3Vic2NyaWJlKSwgZGVib3VuY2VUaW1lKDEwMCksIG1hcCgoKSA9PiB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxpc3RDb250YWluZXJTaXplLndpZHRoID0gdGhpcy5qdnhNdWx0aXNlbGVjdC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICsgJ3B4JztcclxuXHJcbiAgICB9KSwgc3dpdGNoTWFwKCgpID0+IHRpbWVyKDEwMCkpLCB0YXAoKCkgPT4ge1xyXG4gICAgICB0aGlzLm11bHRpQ29udGFpbmVyV2lkdGggPSB0aGlzLm11bHRpQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5vZmZzZXRXaWR0aCA/PyAxMDA7XHJcbiAgICAgIHRoaXMueVBvc2l0aW9uID0gd2luZG93LmlubmVySGVpZ2h0IC0gdGhpcy5qdnhNdWx0aXNlbGVjdC5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKT8udG9wIDwgMjYwID8gJ2Fib3ZlJyA6ICdiZWxvdyc7XHJcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9KSkuc3Vic2NyaWJlKG5vb3ApO1xyXG5cclxuICAgIHRoaXMuc2VhcmNoVmFsdWUkLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUpLCBkZWJvdW5jZVRpbWUoMzAwKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKHByZXYsIGN1cnIpID0+IHtcclxuICAgICAgICByZXR1cm4gY3VyciA9PT0gdGhpcy5zZWFyY2hWYWx1ZTtcclxuICAgICAgfSksIHN3aXRjaE1hcCgodmFsOiBzdHJpbmcpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2VhcmNoVmFsdWUgPSB2YWw7XHJcbiAgICAgICAgICB0aGlzLmN1cnJlbnRQYWdlID0gMDtcclxuICAgICAgICAgIGlmICh0aGlzLnNlYXJjaE1vZGUgPT09ICdjbGllbnQnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsaWVudFNlYXJjaCgpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnVybCAmJiB0aGlzLnVybC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcnZlclNlYXJjaCgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKVxyXG4gICAgKS5zdWJzY3JpYmUoKHZhbDogYW55W10pID0+IHtcclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjbGllbnRTZWFyY2goKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGxldCBvYnM6IE9ic2VydmFibGU8YW55PjtcclxuICAgIGlmICh0aGlzLnVybCAmJiB0aGlzLnVybC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMgPSBbXTtcclxuICAgICAgdGhpcy51cGRhdGVPcmRlcmVkT3B0aW9ucyh0aGlzLnNlbGVjdGFibGVPcHRpb25zKS5zdWJzY3JpYmUobm9vcCk7XHJcbiAgICAgIHRoaXMuc2hvdWxkTG9hZE1vcmUgPSB0cnVlO1xyXG4gICAgICBvYnMgPSB0aGlzLmdldExpc3QoKS5waXBlKG1hcCgoKSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0YWJsZU9wdGlvbnM7XHJcbiAgICAgIH0pKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG9icyA9IG9mKHRoaXMub3B0aW9ucyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JzLnBpcGUoc3dpdGNoTWFwKCh2YWwpID0+IHRoaXMuc2VhcmNoTWFwcGVyLm1hcFNlYXJjaCh0aGlzLnNlYXJjaFZhbHVlLCB2YWwpKSwgdGFwKChyZXMpID0+IHtcclxuICAgICAgdGhpcy5zZWxlY3RhYmxlT3B0aW9ucyA9IFtdO1xyXG4gICAgICB0aGlzLnNlbGVjdGFibGVPcHRpb25zLnB1c2goLi4ucmVzKTtcclxuICAgIH0pLCBzd2l0Y2hNYXAoKCkgPT5cclxuICAgICAgdGhpcy51cGRhdGVPcmRlcmVkT3B0aW9ucyh0aGlzLnNlbGVjdGFibGVPcHRpb25zKVxyXG4gICAgKSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlcnZlclNlYXJjaCgpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgdGhpcy5zaG91bGRMb2FkTW9yZSA9IHRydWU7XHJcbiAgICB0aGlzLnNlbGVjdGFibGVPcHRpb25zID0gW107XHJcbiAgICB0aGlzLnNob3VsZExvYWRNb3JlID0gdHJ1ZTtcclxuICAgIHJldHVybiB0aGlzLmdldExpc3QoKTtcclxuICB9XHJcblxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMudW5zdWJzY3JpYmUubmV4dCgpO1xyXG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcclxuICAgIHRpbWVyKDApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgIHRoaXMubGlzdENvbnRhaW5lclNpemUud2lkdGggPSB0aGlzLmp2eE11bHRpc2VsZWN0Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggKyAncHgnO1xyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKHRoaXMuc2Nyb2xsYmFyKSB7XHJcbiAgICAgIHRoaXMuc2Nyb2xsYmFyLnNjcm9sbGVkLnBpcGUodGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKSkuc3Vic2NyaWJlKChlOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLm9uU2Nyb2xsZWQoZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGltZXIoMCkucGlwZSh0YXAoKCkgPT4ge1xyXG4gICAgICB0aGlzLm11bHRpQ29udGFpbmVyV2lkdGggPSB0aGlzLm11bHRpQ29udGFpbmVyPy5uYXRpdmVFbGVtZW50Py5vZmZzZXRXaWR0aCA/PyAxMDA7XHJcbiAgICAgIHRoaXMueVBvc2l0aW9uID0gd2luZG93LmlubmVySGVpZ2h0IC0gdGhpcy5qdnhNdWx0aXNlbGVjdC5uYXRpdmVFbGVtZW50Py5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKT8udG9wIDwgMjYwID8gJ2Fib3ZlJyA6ICdiZWxvdyc7XHJcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9KSkuc3Vic2NyaWJlKG5vb3ApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXMub3B0aW9ucykge1xyXG4gICAgICB0aGlzLnNlbGVjdGFibGVPcHRpb25zID0gWy4uLnRoaXMub3B0aW9uc107XHJcbiAgICAgIHRoaXMudXBkYXRlT3JkZXJlZE9wdGlvbnModGhpcy5zZWxlY3RhYmxlT3B0aW9ucykuc3Vic2NyaWJlKG5vb3ApO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGdldCBzZWxlY3Rpb25WYWx1ZSgpOiBhbnlbXSB7XHJcbiAgICByZXR1cm4gdGhpcy52YWx1ZS5tYXAoKHYpID0+IHtcclxuICAgICAgcmV0dXJuIHZbdGhpcy5pdGVtVmFsdWVdO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXQgZW1wdHkoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBuID0gdGhpcy5wYXJ0cy52YWx1ZTtcclxuICAgIHJldHVybiAhbi5hcmVhICYmICFuLmV4Y2hhbmdlICYmICFuLnN1YnNjcmliZXI7XHJcbiAgfVxyXG5cclxuICBvbkNMaWNrT25NZW51KGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm11bHRpIHx8IHRoaXMuY2xvc2VPbkNsaWNrID09PSBmYWxzZSkge1xyXG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgcHJvcGFnYXRlQ2hhbmdlKF86IGFueSk6IGFueSB7XHJcbiAgfVxyXG5cclxuICAvLyB0aGlzIGlzIHRoZSBpbml0aWFsIHZhbHVlIHNldCB0byB0aGUgY29tcG9uZW50XHJcbiAgcHVibGljIHdyaXRlVmFsdWUob2JqOiBhbnlbXSk6IHZvaWQge1xyXG4gICAgdGhpcy52YWx1ZSA9IG9iajtcclxuICB9XHJcblxyXG4gIC8vIHJlZ2lzdGVycyAnZm4nIHRoYXQgd2lsbCBiZSBmaXJlZCB3aGVuIGNoYW5nZXMgYXJlIG1hZGVcclxuICAvLyB0aGlzIGlzIGhvdyB3ZSBlbWl0IHRoZSBjaGFuZ2VzIGJhY2sgdG8gdGhlIGZvcm1cclxuICBwdWJsaWMgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlKGU6IE1hdFNlbGVjdGlvbkxpc3RDaGFuZ2UpOiB2b2lkIHtcclxuXHJcbiAgICBsZXQgdmFscyA9IGUuc291cmNlLnNlbGVjdGVkT3B0aW9ucy5zZWxlY3RlZC5tYXAobyA9PiBvLnZhbHVlKTtcclxuICAgIHZhbHMgPSB0aGlzLnNlbGVjdGFibGVPcHRpb25zLmZpbHRlcihvID0+IHZhbHMuaW5jbHVkZXMob1t0aGlzLml0ZW1WYWx1ZV0pKTtcclxuICAgIGNvbnNvbGUubG9nKHZhbHMpO1xyXG4gICAgY29uc3Qgc2VsZWN0YWJsZUlkcyA9IHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMubWFwKHMgPT4gc1t0aGlzLml0ZW1WYWx1ZV0pO1xyXG4gICAgY29uc29sZS5sb2coc2VsZWN0YWJsZUlkcyk7XHJcbiAgICBpZiAodGhpcy5tdWx0aSkge1xyXG4gICAgICAvLyBpZiBzZWFyY2ggaXMgYWN0aXZlLCBwcm9iYWJseSBzb21lIG9mIHRoZSBhbHJlYWR5IHNlbGVjdGVkIHZhbHVlcyBhcmUgbm90IGluY2x1ZGVkIGluIHRoZSBzZWxlY3RhYmxlIG9wdGlvbnMsXHJcbiAgICAgIC8vIHNvIHdlIGhhdmUgdG8gcHVzaCB0aGVtIGluIHRoZSBzZWxlY3RlZCB2YWx1ZXMgb2YgdGhlIGxpc3Q7XHJcbiAgICAgIGZvciAoY29uc3QgdiBvZiB0aGlzLnZhbHVlKSB7XHJcbiAgICAgICAgaWYgKCFzZWxlY3RhYmxlSWRzLmluY2x1ZGVzKHZbdGhpcy5pdGVtVmFsdWVdKSkge1xyXG4gICAgICAgICAgdmFscyA9IFt2LCAuLi52YWxzXTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHZhbHMuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICByZXR1cm4gdHlwZW9mIGFbdGhpcy5pdGVtVmFsdWVdID09PSAnc3RyaW5nJyA/XHJcbiAgICAgICAgYVt0aGlzLml0ZW1WYWx1ZV0ubG9jYWxlQ29tcGFyZShiW3RoaXMuaXRlbVZhbHVlXSkgOiBhW3RoaXMuaXRlbVZhbHVlXSAtIGJbdGhpcy5pdGVtVmFsdWVdO1xyXG4gICAgfSk7XHJcbiAgICBjb25zb2xlLmxvZyh2YWxzKTtcclxuICAgIHRoaXMudmFsdWUgPSBbLi4udmFsc107XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdzZWxlY3Rpb25WYWx1ZScpLnNldFZhbHVlKHRoaXMudmFsdWUubWFwKHYgPT4gdlt0aGlzLml0ZW1WYWx1ZV0pKTtcclxuXHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnZhbHVlKTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgb25Gb2N1c0luKGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZm9jdXNlZCkge1xyXG4gICAgICB0aGlzLmZvY3VzZWQgPSB0cnVlO1xyXG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZvY3VzT3V0KGV2ZW50OiBGb2N1c0V2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgRWxlbWVudCkpIHtcclxuICAgICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcclxuICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XHJcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uTWVudU9wZW4oKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5qdnhNdWx0aXNlbGVjdE9wZW4uZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgb25NZW51Q2xvc2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5qdnhNdWx0aXNlbGVjdENsb3NlLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIGRlc2VsZWN0KHZhbDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlID0gWy4uLnRoaXMudmFsdWUuZmlsdGVyKHYgPT4gdlt0aGlzLml0ZW1WYWx1ZV0gIT09IHZhbFt0aGlzLml0ZW1WYWx1ZV0pXTtcclxuICAgIC8vIHRoaXMudmFsdWUuc3BsaWNlKHRoaXMudmFsdWUuZmluZEluZGV4KHYgPT4gdlt0aGlzLml0ZW1WYWx1ZV0gPT09IHZhbFt0aGlzLml0ZW1WYWx1ZV0pLCAxKTtcclxuICAgIHRoaXMuZm9ybS5nZXQoJ3NlbGVjdGlvblZhbHVlJykuc2V0VmFsdWUodGhpcy52YWx1ZS5tYXAobSA9PiBtLnZhbHVlKSk7XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodGhpcy52YWx1ZSk7XHJcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnZhbHVlKTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFNlbGVjdGlvbkNvbnRhaW5lclNpemUoKTogdm9pZCB7XHJcbiAgICB0aW1lcigwKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb25Db250YWluZXIpIHtcclxuICAgICAgICB0aGlzLmxpc3RDb250YWluZXJTaXplLmhlaWdodCA9IHRoaXMuc2VsZWN0aW9uQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gMjYwID8gJzI2MHB4JyA6ICdhdXRvJztcclxuICAgICAgICB0aGlzLmxpc3RDb250YWluZXJTaXplLm1pbkhlaWdodCA9IHRoaXMuc2VsZWN0aW9uQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0IDw9IDI2MCA/XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCArICdweCcgOiAnMjYwcHgnO1xyXG4gICAgICAgIHRoaXMubGlzdENvbnRhaW5lclNpemUud2lkdGggPSB0aGlzLmp2eE11bHRpc2VsZWN0Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggKyAncHgnO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbGlja09uTWVudVRyaWdnZXIoZTogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuc2hvd0xpc3QgPSBmYWxzZTtcclxuICAgICAgdGhpcy5zaG91bGRMb2FkTW9yZSA9IHRydWU7XHJcbiAgICAgIHRpbWVyKDApLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5zaG93TGlzdCA9IHRydWU7XHJcbiAgICAgICAgaWYgKHRoaXMudXJsLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGFibGVPcHRpb25zLmxlbmd0aCA9IDA7XHJcbiAgICAgICAgICB0aGlzLnVwZGF0ZU9yZGVyZWRPcHRpb25zKHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMpO1xyXG4gICAgICAgICAgdGhpcy5nZXRMaXN0KCkuc3Vic2NyaWJlKG5vb3ApO1xyXG4gICAgICAgICAgdGhpcy5zZXRTZWxlY3Rpb25Db250YWluZXJTaXplKCk7XHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLnRyaWdnZXIub3Blbk1lbnUoKTtcclxuICAgICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uQ29udGFpbmVyU2l6ZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldExpc3QoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHJldHVybiB0aGlzLnNlcnZpY2UuZ2V0TGlzdCh7XHJcbiAgICAgIHVybDogdGhpcy51cmwsXHJcbiAgICAgIHJlcXVlc3RUeXBlOiB0aGlzLnJlcXVlc3RUeXBlLFxyXG4gICAgICBkYXRhOiB7fSxcclxuICAgICAgY3VycmVudFBhZ2U6ICsrdGhpcy5jdXJyZW50UGFnZSxcclxuICAgICAgaWdub3JlUGFnaW5hdGlvbjogdGhpcy5pZ25vcmVQYWdpbmF0aW9uLFxyXG4gICAgICByZXF1ZXN0SGVhZGVyczogdGhpcy5yZXF1ZXN0SGVhZGVycyxcclxuICAgICAgc2VhcmNoOiB0aGlzLnNlYXJjaFZhbHVlLFxyXG4gICAgICBzZWFyY2hQcm9wOiB0aGlzLnNlYXJjaFByb3AsXHJcbiAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplXHJcbiAgICB9KS5waXBlKHN3aXRjaE1hcCgodmFsKSA9PiB7XHJcbiAgICAgIGxldCByZXN1bHQgPSBbXTtcclxuICAgICAgaWYgKHRoaXMubGlzdFByb3AubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHJlc3VsdCA9IFsuLi52YWxbdGhpcy5saXN0UHJvcF1dO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJlc3VsdCA9IFsuLi52YWxdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgIHRoaXMuc2hvdWxkTG9hZE1vcmUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHJldHVybiBmb3JrSm9pbihbXSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgbmV3T3B0aW9ucyA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IG9wdCBvZiByZXN1bHQpIHtcclxuICAgICAgICAgIGNvbnN0IG5ld09wdGlvbiA9IHRoaXMubWFwcGVyLm1hcE9wdGlvbihvcHQpO1xyXG4gICAgICAgICAgbmV3T3B0aW9ucy5wdXNoKG5ld09wdGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmb3JrSm9pbihuZXdPcHRpb25zKTtcclxuICAgICAgfVxyXG4gICAgfSksIHN3aXRjaE1hcCgoZmluVmFsOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zZWxlY3RhYmxlT3B0aW9ucy5wdXNoKC4uLmZpblZhbCk7XHJcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZU9yZGVyZWRPcHRpb25zKHRoaXMuc2VsZWN0YWJsZU9wdGlvbnMpO1xyXG4gICAgfSksIG1hcCgodmFsKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIHRoaXMudHJpZ2dlci5vcGVuTWVudSgpO1xyXG4gICAgICB0aGlzLnNldFNlbGVjdGlvbkNvbnRhaW5lclNpemUoKTtcclxuICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICAgICAgcmV0dXJuIHZhbDtcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIG9uU2Nyb2xsZWQoZTogYW55KTogdm9pZCB7XHJcbiAgICBpZiAoZS50YXJnZXQuc2Nyb2xsVG9wICsgMjIwICsgKCh0aGlzLnNlYXJjaElucHV0ID8gMCA6IDEpICogNDApID09PSB0aGlzLnNlbGVjdGlvbkNvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodFxyXG4gICAgICAmJiAhdGhpcy5pc0xvYWRpbmcpIHtcclxuICAgICAgdGhpcy5zY3JvbGxFbmQuZW1pdCgpO1xyXG4gICAgICBpZiAodGhpcy51cmwgJiYgdGhpcy51cmwubGVuZ3RoID4gMCAmJiAhdGhpcy5pZ25vcmVQYWdpbmF0aW9uICYmIHRoaXMuc2hvdWxkTG9hZE1vcmUpIHtcclxuICAgICAgICB0aGlzLmdldExpc3QoKS5zdWJzY3JpYmUobm9vcCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uTWVudU9wZW5lZCgpOiB2b2lkIHtcclxuICAgIHRoaXMuanZ4TXVsdGlzZWxlY3RPcGVuZWQuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgb25NZW51Q2xvc2VkKCk6IHZvaWQge1xyXG4gICAgaWYgKCghdGhpcy51cmwgfHwgdGhpcy51cmwubGVuZ3RoID09PSAwKSAmJiB0aGlzLnNlYXJjaE1vZGUgPT09ICdjbGllbnQnKSB7XHJcbiAgICAgIHRoaXMuc2VhcmNoVmFsdWVTdWJqZWN0Lm5leHQoJycpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWFyY2hWYWx1ZSA9ICcnO1xyXG4gICAgICB0aGlzLmN1cnJlbnRQYWdlID0gMDtcclxuICAgIH1cclxuICAgIHRoaXMuanZ4TXVsdGlzZWxlY3RDbG9zZWQuZW1pdCgpO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIG9uU2VhcmNoSW5wdXRDbGljayhlOiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgb25TZWFyY2hWYWx1ZUNoYW5nZShlOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuc2VhcmNoVmFsdWVTdWJqZWN0Lm5leHQoZS50YXJnZXQudmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgY2xlYXIoZTogRXZlbnQpOiB2b2lkIHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLnZhbHVlID0gW107XHJcbiAgICB0aGlzLmZvcm0uZ2V0KCdzZWxlY3Rpb25WYWx1ZScpLnNldFZhbHVlKHRoaXMudmFsdWUubWFwKHYgPT4gdlt0aGlzLml0ZW1WYWx1ZV0pKTtcclxuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMudmFsdWUpO1xyXG4gICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpO1xyXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHNldERlc2NyaWJlZEJ5SWRzKGlkczogc3RyaW5nW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IGNvbnRyb2xFbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnRcclxuICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5uZy1qdngtbXVsdGlzZWxlY3QnKTtcclxuICAgIGNvbnRyb2xFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIGlkcy5qb2luKCcgJykpO1xyXG4gIH1cclxuXHJcbiAgb25Db250YWluZXJDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgLy8gaWYgKChldmVudC50YXJnZXQgYXMgRWxlbWVudCkudGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnaW5wdXQnKSB7XHJcbiAgICAvLyAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lucHV0JykuZm9jdXMoKTtcclxuICAgIC8vIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0IHN0YXRlQ2hhbmdlJCgpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhdGVDaGFuZ2VzLmFzT2JzZXJ2YWJsZSgpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlT3JkZXJlZE9wdGlvbnMob3B0aW9ucyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICBsZXQgb2JzID0gb2Yob3B0aW9ucyk7XHJcbiAgICBpZiAodGhpcy5ncm91cEJ5KSB7XHJcbiAgICAgIHRoaXMub3JkZXJlZE9wdGlvbnMubGVuZ3RoID0gMDtcclxuICAgICAgY29uc3Qgb2JzQXJyID0gW107XHJcbiAgICAgIGZvciAoY29uc3Qgb3B0aW9uIG9mIG9wdGlvbnMpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuZ3JvdXBCeSAhPT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIG9ic0Fyci5wdXNoKHRoaXMuZ3JvdXBCeS5tYXBHcm91cChvcHRpb24pKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgb2JzQXJyLnB1c2gob2Yoe2dyb3VwOiBvcHRpb25bdGhpcy5ncm91cEJ5XSwgb3B0aW9ufSBhcyBOZ0p2eEdyb3VwPGFueT4pKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgb2JzID0gZm9ya0pvaW4ob2JzQXJyKS5waXBlKG1hcCgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCBncm91cHMgPSBbLi4ubmV3IFNldChyZXMubWFwKGl0ZW0gPT4gaXRlbS5ncm91cCkpXTtcclxuICAgICAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIGdyb3Vwcykge1xyXG4gICAgICAgICAgdGhpcy5vcmRlcmVkT3B0aW9ucy5wdXNoKHtcclxuICAgICAgICAgICAgZ3JvdXAsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHJlcy5maWx0ZXIociA9PiByLmdyb3VwID09PSBncm91cCkubWFwKG8gPT4gby5vcHRpb24pXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRoaXMub3JkZXJlZE9wdGlvbnM7XHJcbiAgICAgIH0pKTtcclxuICAgIH1cclxuICAgIHJldHVybiBvYnM7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VNZW51KCk6IHZvaWQge1xyXG4gICAgdGhpcy50cmlnZ2VyLmNsb3NlTWVudSgpO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibmctanZ4LW11bHRpc2VsZWN0XCIgW25nQ2xhc3NdPVwieydkaXNhYmxlZCc6IGRpc2FibGVkLCAnaGFzLWVycm9ycyc6IGhhc0Vycm9yc31cIiAjanZ4TXVsdGlzZWxlY3Q+XHJcbiAgPCEtLSBTVEFSVCBNRU5VIC0tPlxyXG4gIDxkaXYgW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVSZWZcIiAob25NZW51T3Blbik9XCJvbk1lbnVPcGVuKClcIiAobWVudU9wZW5lZCk9XCJvbk1lbnVPcGVuZWQoKVwiXHJcbiAgICAgICAob25NZW51Q2xvc2UpPVwib25NZW51Q2xvc2UoKVwiIChtZW51Q2xvc2VkKT1cIm9uTWVudUNsb3NlZCgpXCJcclxuICAgICAgICN0cmlnZ2VyPVwibWF0TWVudVRyaWdnZXJcIj5cclxuICAgIDxtYXQtbWVudSAjbWVudVJlZj1cIm1hdE1lbnVcIiBbY2xhc3NdPVwiWydqdngtbXVsdGlzZWxlY3QtcGFuZWwnLCBwYW5lbENsYXNzXS5qb2luKCcgJylcIiBbZm9ybUdyb3VwXT1cImZvcm1cIlxyXG5cclxuICAgICAgICAgICAgICBbeVBvc2l0aW9uXT1cInlQb3NpdGlvblwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWVudS1saXN0LWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgI21lbnVMSXN0Q29udGFpbmVyXHJcbiAgICAgICAgICAgW25nU3R5bGVdPVwieydvdmVyZmxvdy15JzogJ2hpZGRlbicsICd3aWR0aCc6IGxpc3RDb250YWluZXJTaXplLndpZHRoLCAnbWF4LWhlaWdodCc6ICcyNjBweCcsICdoZWlnaHQnOiBsaXN0Q29udGFpbmVyU2l6ZS5oZWlnaHQsICdtaW4taGVpZ2h0JzogbGlzdENvbnRhaW5lclNpemUubWluSGVpZ2h0fVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtaW5wdXQtY29udGFpbmVyXCIgKm5nSWY9XCIhIXNlYXJjaElucHV0XCIgKGNsaWNrKT1cIm9uU2VhcmNoSW5wdXRDbGljaygkZXZlbnQpXCI+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBbcGxhY2Vob2xkZXJdPVwic2VhcmNoTGFiZWxcIiBbbmdNb2RlbF09XCJzZWFyY2hWYWx1ZVwiIFtuZ01vZGVsT3B0aW9uc109XCJ7c3RhbmRhbG9uZTogdHJ1ZX1cIlxyXG4gICAgICAgICAgICAgICAgIFtuZ0p2eEZvY3VzXT1cImlzT3BlblwiXHJcbiAgICAgICAgICAgICAgICAgKGlucHV0KT1cIm9uU2VhcmNoVmFsdWVDaGFuZ2UoJGV2ZW50KVwiLz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IFtuZ1N0eWxlXT1cIntoZWlnaHQ6IHNlYXJjaElucHV0ICYmIHNlbGVjdGlvbkNvbnRhaW5lci5jbGllbnRIZWlnaHQgPiAyMjAgfHwgc2VsZWN0aW9uQ29udGFpbmVyLmNsaWVudEhlaWdodCA+IDI2MD8gMjYwIC0gKHNlYXJjaElucHV0PyA0MCA6IDApICsgJ3B4JzogJ2F1dG8nfVwiPlxyXG4gICAgICAgICAgPG5nLXNjcm9sbGJhciBzdHlsZT1cIndpZHRoOiAxMDAlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgc21vb3RoU2Nyb2xsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFt2aXNpYmlsaXR5XT1cIidob3ZlcidcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXBwZWFyYW5jZV09XCInY29tcGFjdCdcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbc2Vuc29yRGlzYWJsZWRdPVwiaXNMb2FkaW5nXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2F1dG9IZWlnaHREaXNhYmxlZF09XCJmYWxzZVwiICNzY3JvbGxiYXI+XHJcbiAgICAgICAgICAgIDxkaXYgI3NlbGVjdGlvbkNvbnRhaW5lciAoY2xpY2spPVwib25DTGlja09uTWVudSgkZXZlbnQpXCI+XHJcbiAgICAgICAgICAgICAgPG1hdC1zZWxlY3Rpb24tbGlzdCAjc2VsZWN0aW9uIFttdWx0aXBsZV09XCJtdWx0aVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsncGFkZGluZyc6IDAsICd3aWR0aCc6IGxpc3RDb250YWluZXJTaXplLndpZHRoLCAnbWluLXdpZHRoLnB4JzogMTEyfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0aW9uQ2hhbmdlKT1cIm9uQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2VsZWN0aW9uVmFsdWVcIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhIWdyb3VwQnlcIj5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgb3B0IG9mIG9yZGVyZWRPcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJncm91cEhlYWRlclRlbXBsYXRlPyBncm91cEhlYWRlclRlbXBsYXRlLnRlbXBsYXRlOiBkZWZhdWx0R3JvdXBIZWFkZXJUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBvcHR9XCI+PC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1qdngtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygb3B0Lm9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uW2l0ZW1WYWx1ZV1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0aW9uc1RlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IG9wdGlvbn1cIj48L25nLWNvbnRhaW5lcj4tLT5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwicGFkZGluZy1pbmxpbmU6IDEwcHhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwib3B0aW9uc1RlbXBsYXRlPyBvcHRpb25zVGVtcGxhdGUudGVtcGxhdGUgOiBkZWZhdWx0VGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogb3B0aW9ufVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy1qdngtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFncm91cEJ5IHx8IGdyb3VwQnkubGVuZ3RoID09PSAwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1qdngtb3B0aW9uICpuZ0Zvcj1cImxldCBvcHRpb24gb2Ygc2VsZWN0YWJsZU9wdGlvbnNcIiBbdmFsdWVdPVwib3B0aW9uW2l0ZW1WYWx1ZV1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm9wdGlvbnNUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7JGltcGxpY2l0OiBvcHRpb259XCI+PC9uZy1jb250YWluZXI+LS0+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJvcHRpb25zVGVtcGxhdGU/IG9wdGlvbnNUZW1wbGF0ZS50ZW1wbGF0ZSA6IGRlZmF1bHRUZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogb3B0aW9ufVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWp2eC1vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICA8L21hdC1zZWxlY3Rpb24tbGlzdD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLXNjcm9sbGJhcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWVudS1mb290ZXJcIj5cclxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbbmctanZ4LWZvb3Rlcl1cIj48L25nLWNvbnRlbnQ+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgIDwvbWF0LW1lbnU+XHJcbiAgPC9kaXY+XHJcbiAgPCEtLSBFTkQgTUVOVSAtLT5cclxuICA8IS0tIFNUQVJUIElOUFVUIC0tPlxyXG4gIDxkaXYgW25nQ2xhc3NdPVwieyduZy1qdngtbXVsdGlzZWxlY3QtdmFsdWUtY29udGFpbmVyJzogdHJ1ZSwgJ2lzLW9wZW4nOiBpc09wZW59XCJcclxuICAgICAgIChjbGljayk9XCJjbGlja09uTWVudVRyaWdnZXIoJGV2ZW50KVwiXHJcbiAgICAgICAjdmFsdWVDb250YWluZXI+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm5nLWp2eC1tdWx0aXNlbGVjdF9fcGxhY2Vob2xkZXJcIiAqbmdJZj1cInZhbHVlLmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbcGxhY2Vob2xkZXJdXCI+PC9uZy1jb250ZW50PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cIm5nLWp2eC1tdWx0aXNlbGVjdC12YWx1ZSBtdWx0aS12YWx1ZS1jb250YWluZXJcIiAqbmdJZj1cIm11bHRpXCIgI211bHRpQ29udGFpbmVyPlxyXG5cclxuICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWxlY3Rpb25UZW1wbGF0ZT8gc2VsZWN0aW9uVGVtcGxhdGUudGVtcGxhdGUgOiBkZWZhdWx0TXVsdGlTZWxlY3Rpb25UZW1wbGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInskaW1wbGljaXQ6IHZhbHVlfVwiPjwvbmctY29udGFpbmVyPlxyXG5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibmctanZ4LW11bHRpc2VsZWN0LXZhbHVlIHNpbmdsZS12YWx1ZS1jb250YWluZXJcIiAqbmdJZj1cIiFtdWx0aVwiPlxyXG4gICAgICA8ZGl2ICpuZ0Zvcj1cImxldCB2YWwgb2YgdmFsdWVcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJzZWxlY3Rpb25UZW1wbGF0ZT8gc2VsZWN0aW9uVGVtcGxhdGUudGVtcGxhdGUgOiBkZWZhdWx0U2VsZWN0aW9uVGVtcGxhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyRpbXBsaWNpdDogdmFsfVwiPjwvbmctY29udGFpbmVyPjwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibmctanZ4LW11bHRpc2VsZWN0X19yZW1vdmUtYnV0dG9uXCIgKm5nSWY9XCJjbGVhcmFibGUgJiYgdmFsdWUubGVuZ3RoID4gMFwiIChjbGljayk9XCJjbGVhcigkZXZlbnQpXCI+XHJcbiAgICAgIDxtYXQtaWNvbiBzdHlsZT1cImZvbnQtc2l6ZTogMThweDtcclxuICAgICAgZGlzcGxheTogZmxleDtcclxuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XCI+Y2xlYXJcclxuICAgICAgPC9tYXQtaWNvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm5nLWp2eC1tdWx0aXNlbGVjdC1hcnJvd1wiPlxyXG4gICAgICA8bWF0LWljb24gKm5nSWY9XCIhaXNMb2FkaW5nXCI+ZXhwYW5kX21vcmU8L21hdC1pY29uPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwiaXNMb2FkaW5nXCIgY2xhc3M9XCJsZHMtcmluZ1wiPlxyXG4gICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgICAgPGRpdj48L2Rpdj5cclxuICAgICAgICA8ZGl2PjwvZGl2PlxyXG4gICAgICAgIDxkaXY+PC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPCEtLSBFTkQgSU5QVVQgLS0+XHJcbjwvZGl2PlxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRUZW1wbGF0ZSBsZXQtb3B0aW9uPlxyXG4gIDxkaXYgc3R5bGU9XCJtYXgtd2lkdGg6IDEwMCU7XHJcbiAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxuICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1wiPnt7b3B0aW9uW2l0ZW1UZXh0XX19XHJcbiAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2RlZmF1bHRTZWxlY3Rpb25UZW1wbGF0ZSBsZXQtdmFsdWU+XHJcbiAge3t2YWx1ZVtpdGVtVGV4dF19fVxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNkZWZhdWx0TXVsdGlTZWxlY3Rpb25UZW1wbGF0ZSBsZXQtdmFsdWU+XHJcbiAgPG1hdC1jaGlwLWxpc3QgI2NoaXBMaXN0IFtkaXNhYmxlZF09XCJ0aGlzLmRpc2FibGVkXCI+XHJcbiAgICA8bWF0LWNoaXAgW2NvbG9yXT1cIidwcmltYXJ5J1wiIHNlbGVjdGVkICpuZ0Zvcj1cImxldCB2YWwgb2YgdmFsdWVcIiBbc2VsZWN0YWJsZV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJuZy1qdngtbXVsdGlzZWxlY3QtY2hpcFwiXHJcbiAgICAgICAgICAgICAgW3JlbW92YWJsZV09XCJ0cnVlXCIgKHJlbW92ZWQpPVwiZGVzZWxlY3QodmFsKVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaGlwLWNvbnRlbnRcIlxyXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydtYXgtd2lkdGgnOiBtdWx0aUNvbnRhaW5lcldpZHRoIC0gNTAgKydweCd9XCI+e3t2YWxbaXRlbVRleHRdfX08L3NwYW4+XHJcblxyXG4gICAgICA8bWF0LWljb24gbWF0Q2hpcFJlbW92ZT5jYW5jZWw8L21hdC1pY29uPlxyXG4gICAgPC9tYXQtY2hpcD5cclxuICA8L21hdC1jaGlwLWxpc3Q+XHJcbjwvbmctdGVtcGxhdGU+XHJcbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEdyb3VwSGVhZGVyVGVtcGxhdGUgbGV0LW9wdD5cclxuICA8ZGl2IHN0eWxlPVwicGFkZGluZy1pbmxpbmU6IDE1cHhcIj48c3Ryb25nPnt7b3B0Lmdyb3VwfX08L3N0cm9uZz48L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19