mis-crystal-design-system 18.1.6-signal → 18.1.6

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 (82) hide show
  1. package/async-search-dropdown/async-dropdown.component.d.ts +44 -3
  2. package/datepicker_v2/tz-dp-container/tz-dp-container.component.d.ts +4 -0
  3. package/daterangepicker_v2/tz-drp-container/tz-drp-container.component.d.ts +14 -5
  4. package/esm2022/async-search-dropdown/async-dropdown.component.mjs +147 -37
  5. package/esm2022/checkbox/checkbox.component.mjs +4 -4
  6. package/esm2022/chip/chip.component.mjs +4 -4
  7. package/esm2022/datepicker_v2/tz-datepicker.directive.mjs +2 -34
  8. package/esm2022/datepicker_v2/tz-dp-container/tz-dp-container.component.mjs +87 -32
  9. package/esm2022/daterangepicker_v2/tz-daterangepicker.directive.mjs +6 -3
  10. package/esm2022/daterangepicker_v2/tz-drp-container/tz-drp-container.component.mjs +324 -142
  11. package/esm2022/drawer/drawer-body/drawer-body.component.mjs +4 -4
  12. package/esm2022/fab/fab.component.mjs +4 -4
  13. package/esm2022/input/mis-input.component.mjs +3 -11
  14. package/esm2022/loader/loader.component.mjs +13 -7
  15. package/esm2022/modal/module-wrapper/module-wrapper.component.mjs +4 -4
  16. package/esm2022/phone-input/phone-input.component.mjs +4 -4
  17. package/esm2022/radio-button/radio-button.component.mjs +4 -4
  18. package/esm2022/ske-loader/ske-loader.component.mjs +4 -4
  19. package/esm2022/slider/slider.component.mjs +4 -4
  20. package/esm2022/snackbar/snackbar/snackbar.component.mjs +4 -4
  21. package/esm2022/specificdatepicker/tz-sdp-container/tz-sdp-container.component.mjs +23 -19
  22. package/esm2022/table/sort-icons.directive.mjs +24 -5
  23. package/esm2022/table/sub-table/sub-table.component.mjs +18 -5
  24. package/esm2022/table/table.component.mjs +236 -101
  25. package/esm2022/table/table.module.mjs +7 -5
  26. package/esm2022/timepicker/timepicker.component.mjs +41 -14
  27. package/esm2022/timerangepicker/timerangepicker.component.mjs +29 -21
  28. package/esm2022/toast/toast.component.mjs +4 -4
  29. package/esm2022/tooltip/tooltip-container/tooltip.component.mjs +4 -4
  30. package/esm2022/virtual-scroll/virtual-scroll.component.mjs +4 -4
  31. package/fesm2022/mis-crystal-design-system-async-search-dropdown.mjs +146 -36
  32. package/fesm2022/mis-crystal-design-system-async-search-dropdown.mjs.map +1 -1
  33. package/fesm2022/mis-crystal-design-system-checkbox.mjs +3 -3
  34. package/fesm2022/mis-crystal-design-system-checkbox.mjs.map +1 -1
  35. package/fesm2022/mis-crystal-design-system-chip.mjs +3 -3
  36. package/fesm2022/mis-crystal-design-system-chip.mjs.map +1 -1
  37. package/fesm2022/mis-crystal-design-system-datepicker_v2.mjs +87 -64
  38. package/fesm2022/mis-crystal-design-system-datepicker_v2.mjs.map +1 -1
  39. package/fesm2022/mis-crystal-design-system-daterangepicker_v2.mjs +328 -143
  40. package/fesm2022/mis-crystal-design-system-daterangepicker_v2.mjs.map +1 -1
  41. package/fesm2022/mis-crystal-design-system-drawer.mjs +3 -3
  42. package/fesm2022/mis-crystal-design-system-drawer.mjs.map +1 -1
  43. package/fesm2022/mis-crystal-design-system-fab.mjs +3 -3
  44. package/fesm2022/mis-crystal-design-system-fab.mjs.map +1 -1
  45. package/fesm2022/mis-crystal-design-system-input.mjs +2 -10
  46. package/fesm2022/mis-crystal-design-system-input.mjs.map +1 -1
  47. package/fesm2022/mis-crystal-design-system-loader.mjs +12 -6
  48. package/fesm2022/mis-crystal-design-system-loader.mjs.map +1 -1
  49. package/fesm2022/mis-crystal-design-system-modal.mjs +3 -3
  50. package/fesm2022/mis-crystal-design-system-modal.mjs.map +1 -1
  51. package/fesm2022/mis-crystal-design-system-phone-input.mjs +3 -3
  52. package/fesm2022/mis-crystal-design-system-phone-input.mjs.map +1 -1
  53. package/fesm2022/mis-crystal-design-system-radio-button.mjs +3 -3
  54. package/fesm2022/mis-crystal-design-system-radio-button.mjs.map +1 -1
  55. package/fesm2022/mis-crystal-design-system-ske-loader.mjs +3 -3
  56. package/fesm2022/mis-crystal-design-system-ske-loader.mjs.map +1 -1
  57. package/fesm2022/mis-crystal-design-system-slider.mjs +3 -3
  58. package/fesm2022/mis-crystal-design-system-slider.mjs.map +1 -1
  59. package/fesm2022/mis-crystal-design-system-snackbar.mjs +3 -3
  60. package/fesm2022/mis-crystal-design-system-snackbar.mjs.map +1 -1
  61. package/fesm2022/mis-crystal-design-system-specificdatepicker.mjs +22 -18
  62. package/fesm2022/mis-crystal-design-system-specificdatepicker.mjs.map +1 -1
  63. package/fesm2022/mis-crystal-design-system-table.mjs +279 -111
  64. package/fesm2022/mis-crystal-design-system-table.mjs.map +1 -1
  65. package/fesm2022/mis-crystal-design-system-timepicker.mjs +40 -13
  66. package/fesm2022/mis-crystal-design-system-timepicker.mjs.map +1 -1
  67. package/fesm2022/mis-crystal-design-system-timerangepicker.mjs +28 -20
  68. package/fesm2022/mis-crystal-design-system-timerangepicker.mjs.map +1 -1
  69. package/fesm2022/mis-crystal-design-system-toast.mjs +3 -3
  70. package/fesm2022/mis-crystal-design-system-toast.mjs.map +1 -1
  71. package/fesm2022/mis-crystal-design-system-tooltip.mjs +3 -3
  72. package/fesm2022/mis-crystal-design-system-tooltip.mjs.map +1 -1
  73. package/fesm2022/mis-crystal-design-system-virtual-scroll.mjs +3 -3
  74. package/fesm2022/mis-crystal-design-system-virtual-scroll.mjs.map +1 -1
  75. package/input/mis-input.component.scss +2 -3
  76. package/loader/loader.component.d.ts +7 -1
  77. package/package.json +7 -7
  78. package/specificdatepicker/tz-sdp-container/tz-sdp-container.component.d.ts +2 -2
  79. package/table/table.component.d.ts +14 -1
  80. package/table/table.module.d.ts +2 -1
  81. package/timepicker/timepicker.component.d.ts +3 -1
  82. package/timerangepicker/timerangepicker.component.d.ts +3 -1
@@ -1,9 +1,9 @@
1
- import { ElementRef, Injector, NgZone, TemplateRef, ViewContainerRef } from '@angular/core';
1
+ import { ElementRef, Injector, NgZone, OnInit, OnDestroy, TemplateRef, ViewContainerRef } from '@angular/core';
2
2
  import { AbstractControl, UntypedFormControl } from '@angular/forms';
3
3
  import { Overlay } from '@angular/cdk/overlay';
4
4
  import * as i0 from "@angular/core";
5
5
  type IListData = any;
6
- export declare class AsyncDropdownComponent {
6
+ export declare class AsyncDropdownComponent implements OnInit, OnDestroy {
7
7
  private overlay;
8
8
  private viewContainerRef;
9
9
  private _ngZone;
@@ -42,12 +42,27 @@ export declare class AsyncDropdownComponent {
42
42
  searchInput: UntypedFormControl;
43
43
  private httpStreamTrigger;
44
44
  private overlayRef?;
45
+ private searchSubscription?;
46
+ private controlSubscription?;
45
47
  opened: import("@angular/core").WritableSignal<boolean>;
46
48
  loading: import("@angular/core").WritableSignal<boolean>;
47
49
  error: import("@angular/core").WritableSignal<boolean>;
48
50
  openPopUpOnTab: import("@angular/core").WritableSignal<boolean>;
49
51
  data: import("@angular/core").WritableSignal<any[]>;
50
- private searchEffect;
52
+ /**
53
+ * Tracks the last selected value to prevent dropdown from reopening when:
54
+ * - Input regains focus after selection (showing selected value)
55
+ * - Parent component re-renders and triggers change detection
56
+ * - User hasn't actually typed a new search query
57
+ *
58
+ * This is necessary because the input serves dual purposes:
59
+ * 1. Search input (user types, triggers API calls)
60
+ * 2. Display selected value (shows what was selected)
61
+ *
62
+ * Without this, setting the input value after selection would trigger
63
+ * the search subscription, causing unwanted API calls and dropdown reopening.
64
+ */
65
+ private lastSelectedValue;
51
66
  ngOnInit(): void;
52
67
  ngOnChanges(): void;
53
68
  ngOnDestroy(): void;
@@ -57,11 +72,37 @@ export declare class AsyncDropdownComponent {
57
72
  closeDropdown(): void;
58
73
  enablePopUpOnTab(): void;
59
74
  handleKeyDown(event: KeyboardEvent): void;
75
+ /**
76
+ * Handles item selection from dropdown.
77
+ *
78
+ * For single-select mode:
79
+ * - Sets input value to display selected item (standard UX pattern)
80
+ * - Stores selected value to prevent reopening dropdown on focus/change detection
81
+ * - Blurs input to prevent immediate focus-triggered searches
82
+ *
83
+ * For multi-select mode:
84
+ * - Clears input for next selection
85
+ * - Maintains focus for continuous selection
86
+ */
60
87
  selectData(item: IListData, effectedFromOutside?: boolean): void;
61
88
  removeItem(item: IListData): void;
62
89
  private setControlValue;
63
90
  get selectedItems(): any[];
91
+ /**
92
+ * Clears the input and resets selection state.
93
+ * Clearing lastSelectedValue allows new searches to proceed normally.
94
+ */
64
95
  removeInputValue(): void;
96
+ /**
97
+ * Called when input receives focus.
98
+ * Only opens dropdown if:
99
+ * 1. minInputLength allows it (-1 or 0 means open on focus)
100
+ * 2. Input value doesn't match last selected value (prevents reopening after selection)
101
+ *
102
+ * This handles the case where input regains focus after selection.
103
+ * The RxJS filter in searchObservable handles valueChanges, but focus events
104
+ * need separate handling since they bypass valueChanges.
105
+ */
65
106
  defaultCall(): void;
66
107
  static ɵfac: i0.ɵɵFactoryDeclaration<AsyncDropdownComponent, never>;
67
108
  static ɵcmp: i0.ɵɵComponentDeclaration<AsyncDropdownComponent, "mis-async-search-dropdown", never, { "height": { "alias": "height"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "httpStream": { "alias": "httpStream"; "required": true; "isSignal": true; }; "displayKey": { "alias": "displayKey"; "required": false; "isSignal": true; }; "secondaryDisplayKey": { "alias": "secondaryDisplayKey"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "debounceTime": { "alias": "debounceTime"; "required": false; "isSignal": true; }; "minInputLength": { "alias": "minInputLength"; "required": false; "isSignal": true; }; "multi": { "alias": "multi"; "required": false; "isSignal": true; }; "uniqueKey": { "alias": "uniqueKey"; "required": false; "isSignal": true; }; "control": { "alias": "control"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "disableCopyPaste": { "alias": "disableCopyPaste"; "required": false; "isSignal": true; }; "dropdownListWidth": { "alias": "dropdownListWidth"; "required": false; "isSignal": true; }; "dropdownListPosition": { "alias": "dropdownListPosition"; "required": false; "isSignal": true; }; "customPlaceholderIcon": { "alias": "customPlaceholderIcon"; "required": false; "isSignal": true; }; "selections": { "alias": "selections"; "required": false; "isSignal": true; }; "searchValue": { "alias": "searchValue"; "required": false; "isSignal": true; }; }, { "onSelect": "onSelect"; "searchQueryChange": "searchQueryChange"; "clear": "clear"; "itemSelected": "itemSelected"; "itemRemoved": "itemRemoved"; }, ["customItem", "customLoader"], never, false, never>;
@@ -6,6 +6,10 @@ export declare class TzDpContainerComponent implements OnInit {
6
6
  private toast;
7
7
  data: IDatePickerData;
8
8
  private parseZoneInstance;
9
+ /**
10
+ * Parse date string using configured format with fallback
11
+ */
12
+ private parseDateWithMultipleFormats;
9
13
  private rawWeekDays;
10
14
  private readonly weekDaysSignal;
11
15
  private readonly currentMonthNumberSignal;
@@ -3,10 +3,15 @@ import { ICurrentMonth, ICurrentMonthDates, IDatePickerData, IWeekDay, ISelected
3
3
  import { ToastService } from "mis-crystal-design-system/toast";
4
4
  import * as i0 from "@angular/core";
5
5
  export declare class TzDrpContainerComponent implements OnInit {
6
+ private injectedData;
6
7
  private toast;
7
8
  private readonly CUSTOM_RANGE_LABEL;
8
- data: IDatePickerData;
9
+ readonly data: import("@angular/core").WritableSignal<IDatePickerData>;
9
10
  private dayjsInstance;
11
+ /**
12
+ * Parse date string using configured format with fallback
13
+ */
14
+ private parseDateWithMultipleFormats;
10
15
  private rawWeekDays;
11
16
  private readonly weekDaysSignal;
12
17
  private readonly currentMonthNumberSignal;
@@ -35,17 +40,17 @@ export declare class TzDrpContainerComponent implements OnInit {
35
40
  currentMonthNumber: import("@angular/core").Signal<number>;
36
41
  currentMonth: import("@angular/core").Signal<ICurrentMonth>;
37
42
  currentYearNumber: import("@angular/core").Signal<number>;
38
- currentMonthDates: import("@angular/core").Signal<ICurrentMonthDates[]>;
39
43
  nextMonthNumber: import("@angular/core").Signal<number>;
40
44
  nextMonth: import("@angular/core").Signal<ICurrentMonth>;
41
45
  nextYearNumber: import("@angular/core").Signal<number>;
42
- nextMonthDates: import("@angular/core").Signal<ICurrentMonthDates[]>;
43
46
  isPreviousMonthDisabled: import("@angular/core").Signal<boolean>;
44
47
  isNextMonthDisabled: import("@angular/core").Signal<boolean>;
45
48
  selectionStarted: import("@angular/core").Signal<boolean>;
46
49
  localSelectedDates: import("@angular/core").Signal<ISelectedDatesConfig>;
47
50
  isDatesValid: import("@angular/core").Signal<boolean>;
48
51
  selectedItemLabel: import("@angular/core").Signal<string>;
52
+ currentMonthDates: import("@angular/core").Signal<ICurrentMonthDates[]>;
53
+ nextMonthDates: import("@angular/core").Signal<ICurrentMonthDates[]>;
49
54
  startHour: import("@angular/core").Signal<number>;
50
55
  startMinute: import("@angular/core").Signal<number>;
51
56
  startAmPm: import("@angular/core").Signal<string>;
@@ -54,13 +59,17 @@ export declare class TzDrpContainerComponent implements OnInit {
54
59
  endAmPm: import("@angular/core").Signal<string>;
55
60
  startHour24: import("@angular/core").Signal<number>;
56
61
  endHour24: import("@angular/core").Signal<number>;
57
- constructor(data: IDatePickerData, toast: ToastService);
62
+ constructor(injectedData: IDatePickerData, toast: ToastService);
58
63
  ngOnInit(): void;
59
64
  retractDayMonth(day: any, month: any, year: any): any;
60
65
  closeOnEsc(): void;
61
- private currentDateInstance;
62
66
  private calculateMinMaxDays;
63
67
  navigateMonth(direction: "NEXT" | "PREVIOUS"): void;
68
+ /**
69
+ * Update calendar month/year based on selected dates
70
+ * This method is called whenever localSelectedDatesSignal changes to keep calendar in sync
71
+ */
72
+ private updateCalendarFromSelectedDates;
64
73
  private generateDates;
65
74
  selectDay(from: "LEFT" | "RIGHT", day: ICurrentMonthDates): void;
66
75
  selectRange(item: RangeItem): void;
@@ -2,8 +2,8 @@ import { Component, ContentChild, HostListener, ViewChild, } from '@angular/core
2
2
  import { UntypedFormControl } from '@angular/forms';
3
3
  import { OverlayConfig, ConnectionPositionPair, } from '@angular/cdk/overlay';
4
4
  import { TemplatePortal } from '@angular/cdk/portal';
5
- import { signal, effect, input, output } from '@angular/core';
6
- import { debounceTime, distinctUntilChanged, tap } from 'rxjs/operators';
5
+ import { signal, input, output } from '@angular/core';
6
+ import { debounceTime, distinctUntilChanged, tap, filter } from 'rxjs/operators';
7
7
  import { merge, Subject } from 'rxjs';
8
8
  import * as i0 from "@angular/core";
9
9
  import * as i1 from "@angular/cdk/overlay";
@@ -227,34 +227,20 @@ export class AsyncDropdownComponent {
227
227
  this.error = signal(false);
228
228
  this.openPopUpOnTab = signal(false);
229
229
  this.data = signal([]);
230
- // === Effect to handle search ===
231
- this.searchEffect = effect(() => {
232
- // Merge form control changes and manual triggers
233
- merge(this.searchInput.valueChanges.pipe(tap((val) => this.searchQueryChange.emit(val)), debounceTime(this.debounceTime()), distinctUntilChanged()), this.httpStreamTrigger).subscribe((query) => {
234
- const q = query?.trim() ?? '';
235
- if (!q || q.length < this.minInputLength()) {
236
- this.closeDropdown();
237
- return;
238
- }
239
- this.loading.set(true);
240
- this.error.set(false);
241
- // Open overlay if not yet open
242
- if (!this.overlayRef?.hasAttached()) {
243
- this.openDropdown(this.dd, this.origin.nativeElement);
244
- }
245
- // Call HTTP stream
246
- this.httpStream()(q).subscribe({
247
- next: (list) => {
248
- this.loading.set(false);
249
- this.data.set(list);
250
- },
251
- error: () => {
252
- this.loading.set(false);
253
- this.error.set(true);
254
- },
255
- });
256
- });
257
- });
230
+ /**
231
+ * Tracks the last selected value to prevent dropdown from reopening when:
232
+ * - Input regains focus after selection (showing selected value)
233
+ * - Parent component re-renders and triggers change detection
234
+ * - User hasn't actually typed a new search query
235
+ *
236
+ * This is necessary because the input serves dual purposes:
237
+ * 1. Search input (user types, triggers API calls)
238
+ * 2. Display selected value (shows what was selected)
239
+ *
240
+ * Without this, setting the input value after selection would trigger
241
+ * the search subscription, causing unwanted API calls and dropdown reopening.
242
+ */
243
+ this.lastSelectedValue = signal(null);
258
244
  this.handleControlChanges = (values) => {
259
245
  values.forEach((el) => this.selectData(el, true));
260
246
  };
@@ -264,17 +250,92 @@ export class AsyncDropdownComponent {
264
250
  if (this.multi() && !this.uniqueKey()) {
265
251
  throw new Error('[uniqueKey] required in multi mode.');
266
252
  }
267
- if (this.disabled())
253
+ if (this.disabled()) {
268
254
  this.searchInput.disable();
255
+ }
256
+ /**
257
+ * Search observable pipeline with RxJS operators to filter at the source.
258
+ * This declarative approach prevents unwanted searches by filtering:
259
+ * 1. Empty queries or queries below minInputLength
260
+ * 2. Queries that match the last selected value (prevents reopening after selection)
261
+ *
262
+ * Filtering at the source is preferred over checking flags in subscribe()
263
+ * because it's more declarative, testable, and follows RxJS best practices.
264
+ */
265
+ const searchObservable = this.searchInput.valueChanges.pipe(tap((val) => this.searchQueryChange.emit(val)), debounceTime(this.debounceTime()), distinctUntilChanged(),
266
+ // Filter: Only process non-empty queries that meet minInputLength requirement
267
+ filter((query) => {
268
+ const q = query?.trim() ?? '';
269
+ if (!q || q.length < this.minInputLength()) {
270
+ // Close dropdown if query is too short
271
+ this.closeDropdown();
272
+ return false;
273
+ }
274
+ return true;
275
+ }),
276
+ // Filter: Ignore queries that match the last selected value
277
+ // This prevents dropdown from reopening when input shows selected value
278
+ filter((query) => {
279
+ const q = query?.trim() ?? '';
280
+ const lastSelected = this.lastSelectedValue();
281
+ // Allow search if no previous selection OR query is different from selected value
282
+ return !lastSelected || q !== lastSelected;
283
+ }));
284
+ /**
285
+ * Subscribe to search queries and trigger HTTP stream.
286
+ * All filtering is done in the pipe chain above, so this callback
287
+ * only handles the actual search execution.
288
+ */
289
+ this.searchSubscription = merge(searchObservable, this.httpStreamTrigger)
290
+ .pipe(
291
+ // Additional filter for httpStreamTrigger (manual refresh)
292
+ filter((query) => {
293
+ const q = query?.trim() ?? '';
294
+ // For manual triggers, still respect minInputLength and lastSelectedValue
295
+ if (!q || q.length < this.minInputLength()) {
296
+ return false;
297
+ }
298
+ const lastSelected = this.lastSelectedValue();
299
+ return !lastSelected || q !== lastSelected;
300
+ }))
301
+ .subscribe((query) => {
302
+ const q = query?.trim() ?? '';
303
+ this.loading.set(true);
304
+ this.error.set(false);
305
+ // Open overlay if not yet open
306
+ if (!this.overlayRef?.hasAttached()) {
307
+ this.openDropdown(this.dd, this.origin.nativeElement);
308
+ }
309
+ // Call HTTP stream
310
+ this.httpStream()(q).subscribe({
311
+ next: (list) => {
312
+ this.loading.set(false);
313
+ this.data.set(list);
314
+ if (!this.overlayRef?.hasAttached() && list.length > 0) {
315
+ this.openDropdown(this.dd, this.origin.nativeElement);
316
+ }
317
+ },
318
+ error: () => {
319
+ this.loading.set(false);
320
+ this.error.set(true);
321
+ },
322
+ });
323
+ });
269
324
  if (this.control()?.value) {
270
325
  this.handleControlChanges(this.control().value);
271
326
  }
272
- this.control()?.valueChanges.subscribe(this.handleControlChanges);
327
+ this.controlSubscription = this.control()?.valueChanges.subscribe(this.handleControlChanges);
328
+ // Handle searchValue input changes
329
+ if (this.searchValue()) {
330
+ this.searchInput.patchValue(this.searchValue(), { emitEvent: false });
331
+ }
273
332
  }
274
333
  ngOnChanges() {
275
- if (this.searchValue()) {
276
- this.searchInput.patchValue(this.searchValue());
334
+ // Handle searchValue changes
335
+ if (this.searchValue() !== undefined) {
336
+ this.searchInput.patchValue(this.searchValue(), { emitEvent: false });
277
337
  }
338
+ // Handle disabled changes
278
339
  if (this.disabled()) {
279
340
  this.searchInput.disable();
280
341
  }
@@ -283,6 +344,9 @@ export class AsyncDropdownComponent {
283
344
  }
284
345
  }
285
346
  ngOnDestroy() {
347
+ this.searchSubscription?.unsubscribe();
348
+ this.controlSubscription?.unsubscribe();
349
+ this.httpStreamTrigger.complete();
286
350
  this.overlayRef?.dispose();
287
351
  }
288
352
  // === Methods ===
@@ -314,10 +378,12 @@ export class AsyncDropdownComponent {
314
378
  width: origin.clientWidth,
315
379
  });
316
380
  this.overlayRef = this.overlay.create(configs);
317
- if (this.dropdownListWidth())
381
+ if (this.dropdownListWidth()) {
318
382
  this.overlayRef.updateSize({ width: this.dropdownListWidth() });
383
+ }
319
384
  this.overlayRef.attach(new TemplatePortal(template, this.viewContainerRef));
320
385
  this.overlayRef.backdropClick().subscribe(() => this.closeDropdown());
386
+ this.opened.set(true);
321
387
  }
322
388
  closeDropdown() {
323
389
  this.opened.set(false);
@@ -334,12 +400,29 @@ export class AsyncDropdownComponent {
334
400
  this.closeDropdown();
335
401
  }
336
402
  }
403
+ /**
404
+ * Handles item selection from dropdown.
405
+ *
406
+ * For single-select mode:
407
+ * - Sets input value to display selected item (standard UX pattern)
408
+ * - Stores selected value to prevent reopening dropdown on focus/change detection
409
+ * - Blurs input to prevent immediate focus-triggered searches
410
+ *
411
+ * For multi-select mode:
412
+ * - Clears input for next selection
413
+ * - Maintains focus for continuous selection
414
+ */
337
415
  selectData(item, effectedFromOutside = true) {
338
416
  if (item.disabled)
339
417
  return;
340
418
  this.itemSelected.emit(item);
341
419
  if (!this.multi()) {
342
- this.searchInput.patchValue(item[this.displayKey()], { emitEvent: false });
420
+ const selectedValue = item[this.displayKey()];
421
+ // Set input value to show selected item (standard UX - like Angular Material, etc.)
422
+ // Use emitEvent: false to prevent triggering valueChanges subscription
423
+ this.searchInput.patchValue(selectedValue, { emitEvent: false });
424
+ // Store selected value - RxJS filter will prevent reopening with same value
425
+ this.lastSelectedValue.set(selectedValue);
343
426
  this.setControlValue(item);
344
427
  }
345
428
  else {
@@ -357,6 +440,11 @@ export class AsyncDropdownComponent {
357
440
  this.data.set([]);
358
441
  }
359
442
  this.closeDropdown();
443
+ // Blur input to prevent focus events from immediately triggering search
444
+ // The lastSelectedValue filter will also prevent reopening if focus occurs
445
+ if (this.inputRef?.nativeElement) {
446
+ this.inputRef.nativeElement.blur();
447
+ }
360
448
  }
361
449
  removeItem(item) {
362
450
  this.itemRemoved.emit(item);
@@ -371,12 +459,34 @@ export class AsyncDropdownComponent {
371
459
  get selectedItems() {
372
460
  return Array.from(this.selections().values());
373
461
  }
462
+ /**
463
+ * Clears the input and resets selection state.
464
+ * Clearing lastSelectedValue allows new searches to proceed normally.
465
+ */
374
466
  removeInputValue() {
375
467
  this.searchInput.reset();
376
468
  this.data.set([]);
469
+ this.lastSelectedValue.set(null);
377
470
  this.clear.emit(true);
378
471
  }
472
+ /**
473
+ * Called when input receives focus.
474
+ * Only opens dropdown if:
475
+ * 1. minInputLength allows it (-1 or 0 means open on focus)
476
+ * 2. Input value doesn't match last selected value (prevents reopening after selection)
477
+ *
478
+ * This handles the case where input regains focus after selection.
479
+ * The RxJS filter in searchObservable handles valueChanges, but focus events
480
+ * need separate handling since they bypass valueChanges.
481
+ */
379
482
  defaultCall() {
483
+ const currentValue = this.searchInput.value?.trim() || '';
484
+ const lastSelected = this.lastSelectedValue();
485
+ // Don't open if value matches last selected (user hasn't typed new query)
486
+ if (lastSelected && currentValue === lastSelected) {
487
+ return;
488
+ }
489
+ // Only open on focus if minInputLength allows it
380
490
  if (this.minInputLength() === -1) {
381
491
  this.loading.set(true);
382
492
  this.httpStream()(this.searchInput.value || '').subscribe({
@@ -463,4 +573,4 @@ export class AsyncDropdownComponent {
463
573
  args: ['document:keydown', ['$event']]
464
574
  }] }); })();
465
575
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(AsyncDropdownComponent, { className: "AsyncDropdownComponent" }); })();
466
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWlzLWNvbXBvbmVudHMvYXN5bmMtc2VhcmNoLWRyb3Bkb3duL2FzeW5jLWRyb3Bkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL21pcy1jb21wb25lbnRzL2FzeW5jLXNlYXJjaC1kcm9wZG93bi9hc3luYy1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFFWixZQUFZLEVBSVosU0FBUyxHQUVWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBbUIsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRSxPQUFPLEVBRUwsYUFBYSxFQUViLHNCQUFzQixHQUN2QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlELE9BQU8sRUFBRSxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUNYaEMsQUFIRiwrQkFFd0MsZUFFTDtJQUMvQixZQUNGO0lBQUEsaUJBQU87SUFDUCxnQ0FJdUM7SUFBakMsQUFEQSxpTkFBUywwQkFBZ0IsS0FBQyxnTkFDWCwwQkFBZ0IsS0FBQztJQUV4QyxBQURFLGlCQUFPLEVBQ0g7Ozs7SUFaRCxvR0FBc0U7SUFFbkUsY0FBOEQ7SUFBOUQsb0dBQThEO0lBRWxFLGNBQ0Y7SUFERSw2REFDRjtJQUVNLGNBQWlG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LEdBQUcsS0FBSyxHQUFHLElBQUksS0FBQztZQVhoRCxpQkFXa0Q7WUFHbEQsd0VBSXdDO1lBRzVDLEFBREUsaUJBQU0sRUFDRjtZQUdOLDJIQUFpQjs7O1lBeERaLG9DQUF1QjtZQUR2QixtR0FBNEU7WUFLbkQsZUFBeUM7WUFBekMsa0VBQXlDO1lBb0I3RCxlQUErQjtZQUFBLEFBQS9CLGtEQUErQixtQ0FBc0I7WUFRcEQsZUFBa0U7WUFFbEUsQUFEQSxBQURBLCtGQUFrRSxrQ0FDckMsZ0NBQ0Y7O1lBYTVCLGVBQStCO1lBQS9CLDBGQUErQjs7O2lGRG5CNUIsc0JBQXNCO2NBTGxDLFNBQVM7MkJBQ0UsMkJBQTJCO21IQTBDRSxNQUFNO2tCQUE1QyxTQUFTO21CQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7WUFDRSxRQUFRO2tCQUE5QyxTQUFTO21CQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7WUFDRCxFQUFFO2tCQUFyQyxTQUFTO21CQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7WUFDZ0IsVUFBVTtrQkFBM0QsWUFBWTttQkFBQyxlQUFlLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO1lBQ00sWUFBWTtrQkFBakUsWUFBWTttQkFBQyxtQkFBbUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7WUE4SnBELGFBQWE7a0JBRFosWUFBWTttQkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQzs7a0ZBdk1qQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3RvcixcbiAgTmdab25lLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3Q29udGFpbmVyUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgVW50eXBlZEZvcm1Db250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgT3ZlcmxheSxcbiAgT3ZlcmxheUNvbmZpZyxcbiAgT3ZlcmxheVJlZixcbiAgQ29ubmVjdGlvblBvc2l0aW9uUGFpcixcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL292ZXJsYXknO1xuaW1wb3J0IHsgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IHNpZ25hbCwgZWZmZWN0LCBpbnB1dCwgb3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBtZXJnZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuXG50eXBlIElMaXN0RGF0YSA9IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWlzLWFzeW5jLXNlYXJjaC1kcm9wZG93bicsXG4gIHRlbXBsYXRlVXJsOiAnLi9hc3luYy1kcm9wZG93bi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FzeW5jLWRyb3Bkb3duLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEFzeW5jRHJvcGRvd25Db21wb25lbnQge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG92ZXJsYXk6IE92ZXJsYXksXG4gICAgcHJpdmF0ZSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgIHByaXZhdGUgX25nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yXG4gICkge31cblxuICAvLyA9PT0gSW5wdXRzID09PVxuICBoZWlnaHQgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHdpZHRoID0gaW5wdXQ8c3RyaW5nPigpO1xuICBzaXplID0gaW5wdXQ8J21kJyB8ICdzbSc+KCdtZCcpO1xuICBodHRwU3RyZWFtID0gaW5wdXQucmVxdWlyZWQ8KHNlYXJjaEtleTogc3RyaW5nKSA9PiBhbnk+KCk7XG4gIGRpc3BsYXlLZXkgPSBpbnB1dDxhbnk+KCk7XG4gIHNlY29uZGFyeURpc3BsYXlLZXkgPSBpbnB1dDxzdHJpbmc+KCcnKTtcbiAgcGxhY2Vob2xkZXIgPSBpbnB1dCgnU2VsZWN0Jyk7XG4gIGRlYm91bmNlVGltZSA9IGlucHV0KDQwMCk7XG4gIG1pbklucHV0TGVuZ3RoID0gaW5wdXQoMik7XG4gIG11bHRpID0gaW5wdXQoZmFsc2UpO1xuICB1bmlxdWVLZXkgPSBpbnB1dDxzdHJpbmc+KCk7XG4gIGNvbnRyb2wgPSBpbnB1dDxBYnN0cmFjdENvbnRyb2wgfCBudWxsPihudWxsKTtcbiAgZGlzYWJsZWQgPSBpbnB1dChmYWxzZSk7XG4gIHJlYWRvbmx5ID0gaW5wdXQoZmFsc2UpO1xuICBkaXNhYmxlQ29weVBhc3RlID0gaW5wdXQoZmFsc2UpO1xuICBkcm9wZG93bkxpc3RXaWR0aCA9IGlucHV0PHN0cmluZz4oKTtcbiAgZHJvcGRvd25MaXN0UG9zaXRpb24gPSBpbnB1dDwnTGVmdCcgfCAnUmlnaHQnPignTGVmdCcpO1xuICBjdXN0b21QbGFjZWhvbGRlckljb24gPSBpbnB1dDxzdHJpbmc+KCcnKTtcbiAgc2VsZWN0aW9ucyA9IGlucHV0PE1hcDxzdHJpbmcsIGFueT4+KG5ldyBNYXAoKSk7XG4gIHNlYXJjaFZhbHVlID0gaW5wdXQ8YW55PigpO1xuXG4gIC8vID09PSBPdXRwdXRzID09PVxuICBvblNlbGVjdCA9IG91dHB1dDxJTGlzdERhdGEgfCBJTGlzdERhdGFbXT4oKTtcbiAgc2VhcmNoUXVlcnlDaGFuZ2UgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICBjbGVhciA9IG91dHB1dDxib29sZWFuPigpO1xuICBpdGVtU2VsZWN0ZWQgPSBvdXRwdXQ8SUxpc3REYXRhPigpO1xuICBpdGVtUmVtb3ZlZCA9IG91dHB1dDxJTGlzdERhdGE+KCk7XG5cbiAgLy8gPT09IFRlbXBsYXRlIFJlZnMgPT09XG4gIEBWaWV3Q2hpbGQoJ2RkQnRuJywgeyBzdGF0aWM6IGZhbHNlIH0pIG9yaWdpbiE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2lucHV0JywgeyBzdGF0aWM6IGZhbHNlIH0pIGlucHV0UmVmITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnZGQnLCB7IHN0YXRpYzogZmFsc2UgfSkgZGQhOiBUZW1wbGF0ZVJlZjxFbGVtZW50PjtcbiAgQENvbnRlbnRDaGlsZCgnbWlzQ3VzdG9tSXRlbScsIHsgc3RhdGljOiBmYWxzZSB9KSBjdXN0b21JdGVtITogVGVtcGxhdGVSZWY8RWxlbWVudD47XG4gIEBDb250ZW50Q2hpbGQoJ2FzeW5jQ3VzdG9tTG9hZGVyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGN1c3RvbUxvYWRlciE6IFRlbXBsYXRlUmVmPEVsZW1lbnQ+O1xuXG4gIC8vID09PSBJbnRlcm5hbCBzdGF0ZSA9PT1cbiAgc2VhcmNoSW5wdXQ6IFVudHlwZWRGb3JtQ29udHJvbCA9IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woKTtcbiAgcHJpdmF0ZSBodHRwU3RyZWFtVHJpZ2dlciA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBvdmVybGF5UmVmPzogT3ZlcmxheVJlZjtcblxuICAvLyA9PT0gU2lnbmFscyA9PT1cbiAgb3BlbmVkID0gc2lnbmFsKGZhbHNlKTtcbiAgbG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIGVycm9yID0gc2lnbmFsKGZhbHNlKTtcbiAgb3BlblBvcFVwT25UYWIgPSBzaWduYWwoZmFsc2UpO1xuICBkYXRhID0gc2lnbmFsPElMaXN0RGF0YVtdPihbXSk7XG5cbiAgLy8gPT09IEVmZmVjdCB0byBoYW5kbGUgc2VhcmNoID09PVxuICBwcml2YXRlIHNlYXJjaEVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgLy8gTWVyZ2UgZm9ybSBjb250cm9sIGNoYW5nZXMgYW5kIG1hbnVhbCB0cmlnZ2Vyc1xuICAgIG1lcmdlKFxuICAgICAgdGhpcy5zZWFyY2hJbnB1dC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgICAgdGFwKCh2YWwpID0+IHRoaXMuc2VhcmNoUXVlcnlDaGFuZ2UuZW1pdCh2YWwpKSxcbiAgICAgICAgZGVib3VuY2VUaW1lKHRoaXMuZGVib3VuY2VUaW1lKCkpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgICApLFxuICAgICAgdGhpcy5odHRwU3RyZWFtVHJpZ2dlclxuICAgICkuc3Vic2NyaWJlKChxdWVyeTogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBxID0gcXVlcnk/LnRyaW0oKSA/PyAnJztcbiAgICAgIGlmICghcSB8fCBxLmxlbmd0aCA8IHRoaXMubWluSW5wdXRMZW5ndGgoKSkge1xuICAgICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5lcnJvci5zZXQoZmFsc2UpO1xuXG4gICAgICAvLyBPcGVuIG92ZXJsYXkgaWYgbm90IHlldCBvcGVuXG4gICAgICBpZiAoIXRoaXMub3ZlcmxheVJlZj8uaGFzQXR0YWNoZWQoKSkge1xuICAgICAgICB0aGlzLm9wZW5Ecm9wZG93bih0aGlzLmRkLCB0aGlzLm9yaWdpbi5uYXRpdmVFbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsbCBIVFRQIHN0cmVhbVxuICAgICAgdGhpcy5odHRwU3RyZWFtKCkocSkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGxpc3Q6IElMaXN0RGF0YVtdKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5kYXRhLnNldChsaXN0KTtcbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmVycm9yLnNldCh0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyA9PT0gTGlmZWN5Y2xlID09PVxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5tdWx0aSgpICYmICF0aGlzLnVuaXF1ZUtleSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1t1bmlxdWVLZXldIHJlcXVpcmVkIGluIG11bHRpIG1vZGUuJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkgdGhpcy5zZWFyY2hJbnB1dC5kaXNhYmxlKCk7XG5cbiAgICBpZiAodGhpcy5jb250cm9sKCk/LnZhbHVlKSB7XG4gICAgICB0aGlzLmhhbmRsZUNvbnRyb2xDaGFuZ2VzKHRoaXMuY29udHJvbCgpIS52YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5jb250cm9sKCk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUodGhpcy5oYW5kbGVDb250cm9sQ2hhbmdlcyk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICBpZiAodGhpcy5zZWFyY2hWYWx1ZSgpKSB7XG4gICAgICB0aGlzLnNlYXJjaElucHV0LnBhdGNoVmFsdWUodGhpcy5zZWFyY2hWYWx1ZSgpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgdGhpcy5zZWFyY2hJbnB1dC5kaXNhYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQuZW5hYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5vdmVybGF5UmVmPy5kaXNwb3NlKCk7XG4gIH1cblxuICAvLyA9PT0gTWV0aG9kcyA9PT1cbiAgcmVmcmVzaEh0dHBTdHJlYW0ocXVlcnk6IHN0cmluZykge1xuICAgIHRoaXMuaHR0cFN0cmVhbVRyaWdnZXIubmV4dChxdWVyeSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNvbnRyb2xDaGFuZ2VzID0gKHZhbHVlczogSUxpc3REYXRhW10pID0+IHtcbiAgICB2YWx1ZXMuZm9yRWFjaCgoZWwpID0+IHRoaXMuc2VsZWN0RGF0YShlbCwgdHJ1ZSkpO1xuICB9O1xuXG4gIHByaXZhdGUgb3BlbkRyb3Bkb3duKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxFbGVtZW50Piwgb3JpZ2luOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IHBvc2l0aW9uc0JvdHRvbSA9IFtcbiAgICAgIG5ldyBDb25uZWN0aW9uUG9zaXRpb25QYWlyKFxuICAgICAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICdib3R0b20nIH0sXG4gICAgICAgIHsgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAndG9wJyB9LFxuICAgICAgICAwLFxuICAgICAgICA0XG4gICAgICApLFxuICAgICAgbmV3IENvbm5lY3Rpb25Qb3NpdGlvblBhaXIoXG4gICAgICAgIHsgb3JpZ2luWDogJ2VuZCcsIG9yaWdpblk6ICdib3R0b20nIH0sXG4gICAgICAgIHsgb3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ3RvcCcgfSxcbiAgICAgICAgMCxcbiAgICAgICAgNFxuICAgICAgKSxcbiAgICBdO1xuICAgIGNvbnN0IHBvc2l0aW9uc1RvcCA9IFtcbiAgICAgIG5ldyBDb25uZWN0aW9uUG9zaXRpb25QYWlyKFxuICAgICAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICd0b3AnIH0sXG4gICAgICAgIHsgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAnYm90dG9tJyB9LFxuICAgICAgICAwLFxuICAgICAgICAtNFxuICAgICAgKSxcbiAgICAgIG5ldyBDb25uZWN0aW9uUG9zaXRpb25QYWlyKFxuICAgICAgICB7IG9yaWdpblg6ICdlbmQnLCBvcmlnaW5ZOiAndG9wJyB9LFxuICAgICAgICB7IG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICdib3R0b20nIH0sXG4gICAgICAgIDAsXG4gICAgICAgIC00XG4gICAgICApLFxuICAgIF07XG5cbiAgICBjb25zdCBwb3NpdGlvblN0cmF0ZWd5ID0gdGhpcy5vdmVybGF5XG4gICAgICAucG9zaXRpb24oKVxuICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8ob3JpZ2luKVxuICAgICAgLndpdGhQb3NpdGlvbnMoW1xuICAgICAgICAuLi4odGhpcy5kcm9wZG93bkxpc3RQb3NpdGlvbigpID09PSAnUmlnaHQnID8gcG9zaXRpb25zQm90dG9tLnJldmVyc2UoKSA6IHBvc2l0aW9uc0JvdHRvbSksXG4gICAgICAgIC4uLih0aGlzLmRyb3Bkb3duTGlzdFBvc2l0aW9uKCkgPT09ICdSaWdodCcgPyBwb3NpdGlvbnNUb3AucmV2ZXJzZSgpIDogcG9zaXRpb25zVG9wKSxcbiAgICAgIF0pXG4gICAgICAud2l0aFB1c2godHJ1ZSk7XG5cbiAgICBjb25zdCBjb25maWdzID0gbmV3IE92ZXJsYXlDb25maWcoe1xuICAgICAgaGFzQmFja2Ryb3A6IHRydWUsXG4gICAgICBiYWNrZHJvcENsYXNzOiAnY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AnLFxuICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMub3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKSxcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3ksXG4gICAgICB3aWR0aDogb3JpZ2luLmNsaWVudFdpZHRoLFxuICAgIH0pO1xuXG4gICAgdGhpcy5vdmVybGF5UmVmID0gdGhpcy5vdmVybGF5LmNyZWF0ZShjb25maWdzKTtcbiAgICBpZiAodGhpcy5kcm9wZG93bkxpc3RXaWR0aCgpKSB0aGlzLm92ZXJsYXlSZWYudXBkYXRlU2l6ZSh7IHdpZHRoOiB0aGlzLmRyb3Bkb3duTGlzdFdpZHRoKCkgfSk7XG5cbiAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0ZW1wbGF0ZSwgdGhpcy52aWV3Q29udGFpbmVyUmVmKSk7XG4gICAgdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jbG9zZURyb3Bkb3duKCkpO1xuICB9XG5cbiAgY2xvc2VEcm9wZG93bigpIHtcbiAgICB0aGlzLm9wZW5lZC5zZXQoZmFsc2UpO1xuICAgIHRoaXMub3BlblBvcFVwT25UYWIuc2V0KGZhbHNlKTtcbiAgICB0aGlzLm92ZXJsYXlSZWY/LmRldGFjaCgpO1xuICAgIHRoaXMuZGF0YS5zZXQoW10pO1xuICB9XG5cbiAgZW5hYmxlUG9wVXBPblRhYigpIHtcbiAgICB0aGlzLm9wZW5Qb3BVcE9uVGFiLnNldCh0cnVlKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleWRvd24nLCBbJyRldmVudCddKVxuICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VzY2FwZScpIHtcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQucmVzZXQoKTtcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdERhdGEoaXRlbTogSUxpc3REYXRhLCBlZmZlY3RlZEZyb21PdXRzaWRlID0gdHJ1ZSkge1xuICAgIGlmIChpdGVtLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICB0aGlzLml0ZW1TZWxlY3RlZC5lbWl0KGl0ZW0pO1xuXG4gICAgaWYgKCF0aGlzLm11bHRpKCkpIHtcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQucGF0Y2hWYWx1ZShpdGVtW3RoaXMuZGlzcGxheUtleSgpXSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgdGhpcy5zZXRDb250cm9sVmFsdWUoaXRlbSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5zZWxlY3Rpb25zKCkuaGFzKGl0ZW1bdGhpcy51bmlxdWVLZXkoKV0pKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9ucygpLnNldChpdGVtW3RoaXMudW5pcXVlS2V5KCldLCBpdGVtKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0Q29udHJvbFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtcyk7XG4gICAgICBpZiAoIWVmZmVjdGVkRnJvbU91dHNpZGUpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbnB1dFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgdGhpcy5pbnB1dFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgIH0sIDEwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQucGF0Y2hWYWx1ZSgnJyk7XG4gICAgICB0aGlzLmRhdGEuc2V0KFtdKTtcbiAgICB9XG4gICAgdGhpcy5jbG9zZURyb3Bkb3duKCk7XG4gIH1cblxuICByZW1vdmVJdGVtKGl0ZW06IElMaXN0RGF0YSkge1xuICAgIHRoaXMuaXRlbVJlbW92ZWQuZW1pdChpdGVtKTtcbiAgICB0aGlzLnNlbGVjdGlvbnMoKS5kZWxldGUoaXRlbVt0aGlzLnVuaXF1ZUtleSgpXSk7XG4gICAgdGhpcy5zZXRDb250cm9sVmFsdWUodGhpcy5zZWxlY3RlZEl0ZW1zKTtcbiAgICB0aGlzLmlucHV0UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29udHJvbFZhbHVlKHZhbHVlOiBJTGlzdERhdGEgfCBJTGlzdERhdGFbXSkge1xuICAgIHRoaXMub25TZWxlY3QuZW1pdCh2YWx1ZSk7XG4gICAgdGhpcy5jb250cm9sKCk/LnBhdGNoVmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZEl0ZW1zKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuc2VsZWN0aW9ucygpLnZhbHVlcygpKTtcbiAgfVxuXG4gIHJlbW92ZUlucHV0VmFsdWUoKSB7XG4gICAgdGhpcy5zZWFyY2hJbnB1dC5yZXNldCgpO1xuICAgIHRoaXMuZGF0YS5zZXQoW10pO1xuICAgIHRoaXMuY2xlYXIuZW1pdCh0cnVlKTtcbiAgfVxuXG4gIGRlZmF1bHRDYWxsKCkge1xuICAgIGlmICh0aGlzLm1pbklucHV0TGVuZ3RoKCkgPT09IC0xKSB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5odHRwU3RyZWFtKCkodGhpcy5zZWFyY2hJbnB1dC52YWx1ZSB8fCAnJykuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGxpc3Q6IElMaXN0RGF0YVtdKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5kYXRhLnNldChsaXN0KTtcbiAgICAgICAgICBpZiAoIXRoaXMub3ZlcmxheVJlZj8uaGFzQXR0YWNoZWQoKSAmJiBsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkRyb3Bkb3duKHRoaXMuZGQsIHRoaXMub3JpZ2luLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmVycm9yLnNldCh0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImRkLXdyYXBwZXJcIlxuICAgICBbbmdDbGFzc109XCJ7IG9wZW5lZDogb3BlbmVkKCksIGRpc2FibGVkOiBkaXNhYmxlZCgpLCByZWFkb25seTogcmVhZG9ubHkoKSB9XCJcbiAgICAgW3N0eWxlLndpZHRoXT1cIndpZHRoKClcIlxuICAgICAjZGRCdG4+XG4gIFxuICA8IS0tIFNlbGVjdGVkIGNoaXBzIGZvciBtdWx0aS1zZWxlY3QgLS0+XG4gIDxkaXYgY2xhc3M9XCJzZWxlY3RlZC1saXN0XCIgKm5nSWY9XCJtdWx0aSgpICYmIHNlbGVjdGVkSXRlbXMubGVuZ3RoID4gMFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjaGlwXCJcbiAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2NoaXAtbWQnOiBzaXplKCkgPT09ICdtZCcsICdjaGlwLXNtJzogc2l6ZSgpID09PSAnc20nIH1cIlxuICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc2VsZWN0ZWRJdGVtc1wiPlxuICAgICAgPHNwYW4gW25nQ2xhc3NdPVwieyAnaDYnOiBzaXplKCkgPT09ICdtZCcsICdoOC1iJzogc2l6ZSgpID09PSAnc20nIH1cIlxuICAgICAgICAgICAgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDRweDtcIj5cbiAgICAgICAge3sgaXRlbVtkaXNwbGF5S2V5KCldIH19XG4gICAgICA8L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cImljb24taWMtbmF2aWdhdGlvbi1jYW5jZWwtMjRcIlxuICAgICAgICAgICAgW25nU3R5bGVdPVwieyBjdXJzb3I6ICdwb2ludGVyJywgJ2ZvbnQtc2l6ZSc6IHNpemUoKSA9PT0gJ3NtJyA/ICcxMnB4JyA6ICcxNHB4JyB9XCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlSXRlbShpdGVtKVwiXG4gICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwicmVtb3ZlSXRlbShpdGVtKVwiPlxuICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8IS0tIFNlYXJjaCBpbnB1dCAtLT5cbiAgPGRpdiBjbGFzcz1cInNlYXJjaC1pbnB1dFwiPlxuICAgIDwhLS0gUGxhY2Vob2xkZXIgaWNvbiAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiY3VzdG9tUGxhY2Vob2xkZXJJY29uKCk7IGVsc2UgZGVmYXVsdFNlYXJjaEljb25cIiBjbGFzcz1cImN1c3RvbS1pY29uXCI+XG4gICAgICA8aW1nIFtzcmNdPVwiY3VzdG9tUGxhY2Vob2xkZXJJY29uKClcIiBhbHQ9XCJjdXN0b21JY29uXCIgLz5cbiAgICA8L2Rpdj5cbiAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRTZWFyY2hJY29uPlxuICAgICAgPHNwYW4gY2xhc3M9XCJpY29uLWljLWFjdGlvbi1zZWFyY2gtMjRcIj48L3NwYW4+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDwhLS0gSW5wdXQgZmllbGQgLS0+XG4gICAgPGlucHV0IFtuZ0NsYXNzXT1cInsgJ2lwLW1kJzogc2l6ZSgpID09PSAnbWQnLCAnaXAtc20nOiBzaXplKCkgPT09ICdzbScgfVwiXG4gICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlcigpXCJcbiAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInNlYXJjaElucHV0XCJcbiAgICAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwiMFwiXG4gICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgY2xhc3M9XCJibGFjay10ZXh0IGg2XCJcbiAgICAgICAgICAgI2lucHV0XG4gICAgICAgICAgIChmb2N1cyk9XCJkZWZhdWx0Q2FsbCgpXCJcbiAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImVuYWJsZVBvcFVwT25UYWIoKVwiXG4gICAgICAgICAgIChjb3B5KT1cImRpc2FibGVDb3B5UGFzdGUoKSA/IGZhbHNlIDogdHJ1ZVwiXG4gICAgICAgICAgIChwYXN0ZSk9XCJkaXNhYmxlQ29weVBhc3RlKCkgPyBmYWxzZSA6IHRydWVcIlxuICAgICAgICAgICAoY3V0KT1cImRpc2FibGVDb3B5UGFzdGUoKSA/IGZhbHNlIDogdHJ1ZVwiLz5cblxuICAgIDwhLS0gQ2xlYXIgaW5wdXQgLS0+XG4gICAgPGRpdiBjbGFzcz1cImljb24taWMtbmF2aWdhdGlvbi1jYW5jZWwtMjQgY3Jvb3MtaWNvblwiXG4gICAgICAgICAqbmdJZj1cInNlYXJjaElucHV0LnZhbHVlPy5sZW5ndGhcIlxuICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgIChjbGljayk9XCJyZW1vdmVJbnB1dFZhbHVlKClcIlxuICAgICAgICAgKGtleXVwLmVudGVyKT1cInJlbW92ZUlucHV0VmFsdWUoKVwiPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48IS0tIERyb3Bkb3duIHRlbXBsYXRlIC0tPlxuPG5nLXRlbXBsYXRlICNkZD5cbiAgPGRpdiBjbGFzcz1cImRkLWxpc3RcIlxuICAgICAgIFtuZ1N0eWxlXT1cInsgJ21heC1oZWlnaHQnOiBoZWlnaHQoKSwgJ3dpZHRoJzogZHJvcGRvd25MaXN0V2lkdGgoKSB9XCJcbiAgICAgICBbbmdDbGFzc109XCJ7ICdkZC1saXN0LXBkJzogZGF0YSgpLmxlbmd0aCA9PT0gMCB9XCJcbiAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgIGNka1RyYXBGb2N1c1xuICAgICAgIFtjZGtUcmFwRm9jdXNBdXRvQ2FwdHVyZV09XCJvcGVuUG9wVXBPblRhYigpXCI+XG5cbiAgICA8IS0tIExvYWRlciAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZygpXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VzdG9tTG9hZGVyOyBlbHNlIGRlZmF1bHRMb2FkZXJcIiBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXN0b21Mb2FkZXJcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdExvYWRlcj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy1jb250YWluZXJcIiAqbmdJZj1cImxvYWRpbmcoKSAmJiAhY3VzdG9tTG9hZGVyXCI+XG4gICAgICAgICAgPG1pcy1sb2FkZXIgW21vYmlsZVZpZXddPVwidHJ1ZVwiPjwvbWlzLWxvYWRlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBFcnJvciAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZXJyb3IoKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy1jb250YWluZXJcIj5cbiAgICAgICAgPHA+VW5rbm93biBlcnJvciBoYXMgb2NjdXJyZWQsIDxici8+IFBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIuPC9wPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8IS0tIERhdGEgbGlzdCAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWxvYWRpbmcoKSAmJiAhZXJyb3IoKSAmJiBkYXRhKCkubGVuZ3RoID4gMFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBkYXRhKClcIj5cbiAgICAgICAgPGRpdiAoY2xpY2spPVwic2VsZWN0RGF0YShpdGVtLCBmYWxzZSlcIiAoa2V5dXAuZW50ZXIpPVwic2VsZWN0RGF0YShpdGVtLCBmYWxzZSlcIj5cbiAgICAgICAgICA8ZGl2IHRhYmluZGV4PVwiLTFcIiBjZGtGb2N1c0luaXRpYWw+PC9kaXY+XG5cbiAgICAgICAgICA8IS0tIEN1c3RvbSBpdGVtIC0tPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXN0b21JdGVtOyBlbHNlIHN0YW5kYXJkSXRlbVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXN0b21JdGVtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBpdGVtIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgIDwhLS0gU3RhbmRhcmQgaXRlbSAtLT5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3N0YW5kYXJkSXRlbT5cbiAgICAgICAgICAgIDxkaXYgdGFiaW5kZXg9XCItMVwiIGNka0ZvY3VzSW5pdGlhbD48L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtXCJcbiAgICAgICAgICAgICAgICAgW3RhYmluZGV4XT1cIm9wZW5Qb3BVcE9uVGFiKCkgPyAwIDogLTFcIlxuICAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0RGF0YShpdGVtLCBmYWxzZSlcIlxuICAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwic2VsZWN0RGF0YShpdGVtLCBmYWxzZSlcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByaW1hcnlcIj57eyBpdGVtW2Rpc3BsYXlLZXkoKV0gfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2Vjb25kYXJ5XCI+e3sgaXRlbVtzZWNvbmRhcnlEaXNwbGF5S2V5KCldIH19PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cblxuICAgIDwhLS0gTm8gZGF0YSAtLT5cbiAgICA8ZGl2ICpuZ0lmPVwiIWxvYWRpbmcoKSAmJiAhZXJyb3IoKSAmJiBkYXRhKCkubGVuZ3RoID09PSAwICYmIHNlYXJjaElucHV0LnZhbHVlXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiZGF0YS1ub3QtZm91bmRcIj5ObyBEYXRhIEF2YWlsYWJsZTwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
576
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXN5bmMtZHJvcGRvd24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWlzLWNvbXBvbmVudHMvYXN5bmMtc2VhcmNoLWRyb3Bkb3duL2FzeW5jLWRyb3Bkb3duLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL21pcy1jb21wb25lbnRzL2FzeW5jLXNlYXJjaC1kcm9wZG93bi9hc3luYy1kcm9wZG93bi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFFWixZQUFZLEVBTVosU0FBUyxHQUVWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBbUIsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRSxPQUFPLEVBRUwsYUFBYSxFQUViLHNCQUFzQixHQUN2QixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakYsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lDYjlDLEFBSEYsK0JBRXdDLGVBRUw7SUFDL0IsWUFDRjtJQUFBLGlCQUFPO0lBQ1AsZ0NBSXVDO0lBQWpDLEFBREEsaU5BQVMsMEJBQWdCLEtBQUMsZ05BQ1gsMEJBQWdCLEtBQUM7SUFFeEMsQUFERSxpQkFBTyxFQUNIOzs7O0lBWkQsb0dBQXNFO0lBRW5FLGNBQThEO0lBQTlELG9HQUE4RDtJQUVsRSxjQUNGO0lBREUsNkRBQ0Y7SUFFTSxjQUFp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Q0FBQzs7a0ZBalJqQyxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBJbmplY3RvcixcbiAgTmdab25lLFxuICBPbkluaXQsXG4gIE9uRGVzdHJveSxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIFVudHlwZWRGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIE92ZXJsYXksXG4gIE92ZXJsYXlDb25maWcsXG4gIE92ZXJsYXlSZWYsXG4gIENvbm5lY3Rpb25Qb3NpdGlvblBhaXIsXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IFRlbXBsYXRlUG9ydGFsIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5pbXBvcnQgeyBzaWduYWwsIGlucHV0LCBvdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIHRhcCwgZmlsdGVyIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgbWVyZ2UsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG50eXBlIElMaXN0RGF0YSA9IGFueTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWlzLWFzeW5jLXNlYXJjaC1kcm9wZG93bicsXG4gIHRlbXBsYXRlVXJsOiAnLi9hc3luYy1kcm9wZG93bi5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FzeW5jLWRyb3Bkb3duLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEFzeW5jRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgb3ZlcmxheTogT3ZlcmxheSxcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3JcbiAgKSB7fVxuXG4gIC8vID09PSBJbnB1dHMgPT09XG4gIGhlaWdodCA9IGlucHV0PHN0cmluZz4oKTtcbiAgd2lkdGggPSBpbnB1dDxzdHJpbmc+KCk7XG4gIHNpemUgPSBpbnB1dDwnbWQnIHwgJ3NtJz4oJ21kJyk7XG4gIGh0dHBTdHJlYW0gPSBpbnB1dC5yZXF1aXJlZDwoc2VhcmNoS2V5OiBzdHJpbmcpID0+IGFueT4oKTtcbiAgZGlzcGxheUtleSA9IGlucHV0PGFueT4oKTtcbiAgc2Vjb25kYXJ5RGlzcGxheUtleSA9IGlucHV0PHN0cmluZz4oJycpO1xuICBwbGFjZWhvbGRlciA9IGlucHV0KCdTZWxlY3QnKTtcbiAgZGVib3VuY2VUaW1lID0gaW5wdXQoNDAwKTtcbiAgbWluSW5wdXRMZW5ndGggPSBpbnB1dCgyKTtcbiAgbXVsdGkgPSBpbnB1dChmYWxzZSk7XG4gIHVuaXF1ZUtleSA9IGlucHV0PHN0cmluZz4oKTtcbiAgY29udHJvbCA9IGlucHV0PEFic3RyYWN0Q29udHJvbCB8IG51bGw+KG51bGwpO1xuICBkaXNhYmxlZCA9IGlucHV0KGZhbHNlKTtcbiAgcmVhZG9ubHkgPSBpbnB1dChmYWxzZSk7XG4gIGRpc2FibGVDb3B5UGFzdGUgPSBpbnB1dChmYWxzZSk7XG4gIGRyb3Bkb3duTGlzdFdpZHRoID0gaW5wdXQ8c3RyaW5nPigpO1xuICBkcm9wZG93bkxpc3RQb3NpdGlvbiA9IGlucHV0PCdMZWZ0JyB8ICdSaWdodCc+KCdMZWZ0Jyk7XG4gIGN1c3RvbVBsYWNlaG9sZGVySWNvbiA9IGlucHV0PHN0cmluZz4oJycpO1xuICBzZWxlY3Rpb25zID0gaW5wdXQ8TWFwPHN0cmluZywgYW55Pj4obmV3IE1hcCgpKTtcbiAgc2VhcmNoVmFsdWUgPSBpbnB1dDxhbnk+KCk7XG5cbiAgLy8gPT09IE91dHB1dHMgPT09XG4gIG9uU2VsZWN0ID0gb3V0cHV0PElMaXN0RGF0YSB8IElMaXN0RGF0YVtdPigpO1xuICBzZWFyY2hRdWVyeUNoYW5nZSA9IG91dHB1dDxzdHJpbmc+KCk7XG4gIGNsZWFyID0gb3V0cHV0PGJvb2xlYW4+KCk7XG4gIGl0ZW1TZWxlY3RlZCA9IG91dHB1dDxJTGlzdERhdGE+KCk7XG4gIGl0ZW1SZW1vdmVkID0gb3V0cHV0PElMaXN0RGF0YT4oKTtcblxuICAvLyA9PT0gVGVtcGxhdGUgUmVmcyA9PT1cbiAgQFZpZXdDaGlsZCgnZGRCdG4nLCB7IHN0YXRpYzogZmFsc2UgfSkgb3JpZ2luITogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnaW5wdXQnLCB7IHN0YXRpYzogZmFsc2UgfSkgaW5wdXRSZWYhOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdkZCcsIHsgc3RhdGljOiBmYWxzZSB9KSBkZCE6IFRlbXBsYXRlUmVmPEVsZW1lbnQ+O1xuICBAQ29udGVudENoaWxkKCdtaXNDdXN0b21JdGVtJywgeyBzdGF0aWM6IGZhbHNlIH0pIGN1c3RvbUl0ZW0hOiBUZW1wbGF0ZVJlZjxFbGVtZW50PjtcbiAgQENvbnRlbnRDaGlsZCgnYXN5bmNDdXN0b21Mb2FkZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgY3VzdG9tTG9hZGVyITogVGVtcGxhdGVSZWY8RWxlbWVudD47XG5cbiAgLy8gPT09IEludGVybmFsIHN0YXRlID09PVxuICBzZWFyY2hJbnB1dDogVW50eXBlZEZvcm1Db250cm9sID0gbmV3IFVudHlwZWRGb3JtQ29udHJvbCgpO1xuICBwcml2YXRlIGh0dHBTdHJlYW1UcmlnZ2VyID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xuICBwcml2YXRlIG92ZXJsYXlSZWY/OiBPdmVybGF5UmVmO1xuICBwcml2YXRlIHNlYXJjaFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBjb250cm9sU3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xuXG4gIC8vID09PSBTaWduYWxzID09PVxuICBvcGVuZWQgPSBzaWduYWwoZmFsc2UpO1xuICBsb2FkaW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgZXJyb3IgPSBzaWduYWwoZmFsc2UpO1xuICBvcGVuUG9wVXBPblRhYiA9IHNpZ25hbChmYWxzZSk7XG4gIGRhdGEgPSBzaWduYWw8SUxpc3REYXRhW10+KFtdKTtcbiAgXG4gIC8qKlxuICAgKiBUcmFja3MgdGhlIGxhc3Qgc2VsZWN0ZWQgdmFsdWUgdG8gcHJldmVudCBkcm9wZG93biBmcm9tIHJlb3BlbmluZyB3aGVuOlxuICAgKiAtIElucHV0IHJlZ2FpbnMgZm9jdXMgYWZ0ZXIgc2VsZWN0aW9uIChzaG93aW5nIHNlbGVjdGVkIHZhbHVlKVxuICAgKiAtIFBhcmVudCBjb21wb25lbnQgcmUtcmVuZGVycyBhbmQgdHJpZ2dlcnMgY2hhbmdlIGRldGVjdGlvblxuICAgKiAtIFVzZXIgaGFzbid0IGFjdHVhbGx5IHR5cGVkIGEgbmV3IHNlYXJjaCBxdWVyeVxuICAgKiBcbiAgICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgaW5wdXQgc2VydmVzIGR1YWwgcHVycG9zZXM6XG4gICAqIDEuIFNlYXJjaCBpbnB1dCAodXNlciB0eXBlcywgdHJpZ2dlcnMgQVBJIGNhbGxzKVxuICAgKiAyLiBEaXNwbGF5IHNlbGVjdGVkIHZhbHVlIChzaG93cyB3aGF0IHdhcyBzZWxlY3RlZClcbiAgICogXG4gICAqIFdpdGhvdXQgdGhpcywgc2V0dGluZyB0aGUgaW5wdXQgdmFsdWUgYWZ0ZXIgc2VsZWN0aW9uIHdvdWxkIHRyaWdnZXJcbiAgICogdGhlIHNlYXJjaCBzdWJzY3JpcHRpb24sIGNhdXNpbmcgdW53YW50ZWQgQVBJIGNhbGxzIGFuZCBkcm9wZG93biByZW9wZW5pbmcuXG4gICAqL1xuICBwcml2YXRlIGxhc3RTZWxlY3RlZFZhbHVlID0gc2lnbmFsPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vID09PSBMaWZlY3ljbGUgPT09XG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0aGlzLm11bHRpKCkgJiYgIXRoaXMudW5pcXVlS2V5KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignW3VuaXF1ZUtleV0gcmVxdWlyZWQgaW4gbXVsdGkgbW9kZS4nKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kaXNhYmxlZCgpKSB7XG4gICAgICB0aGlzLnNlYXJjaElucHV0LmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZWFyY2ggb2JzZXJ2YWJsZSBwaXBlbGluZSB3aXRoIFJ4SlMgb3BlcmF0b3JzIHRvIGZpbHRlciBhdCB0aGUgc291cmNlLlxuICAgICAqIFRoaXMgZGVjbGFyYXRpdmUgYXBwcm9hY2ggcHJldmVudHMgdW53YW50ZWQgc2VhcmNoZXMgYnkgZmlsdGVyaW5nOlxuICAgICAqIDEuIEVtcHR5IHF1ZXJpZXMgb3IgcXVlcmllcyBiZWxvdyBtaW5JbnB1dExlbmd0aFxuICAgICAqIDIuIFF1ZXJpZXMgdGhhdCBtYXRjaCB0aGUgbGFzdCBzZWxlY3RlZCB2YWx1ZSAocHJldmVudHMgcmVvcGVuaW5nIGFmdGVyIHNlbGVjdGlvbilcbiAgICAgKiBcbiAgICAgKiBGaWx0ZXJpbmcgYXQgdGhlIHNvdXJjZSBpcyBwcmVmZXJyZWQgb3ZlciBjaGVja2luZyBmbGFncyBpbiBzdWJzY3JpYmUoKVxuICAgICAqIGJlY2F1c2UgaXQncyBtb3JlIGRlY2xhcmF0aXZlLCB0ZXN0YWJsZSwgYW5kIGZvbGxvd3MgUnhKUyBiZXN0IHByYWN0aWNlcy5cbiAgICAgKi9cbiAgICBjb25zdCBzZWFyY2hPYnNlcnZhYmxlID0gdGhpcy5zZWFyY2hJbnB1dC52YWx1ZUNoYW5nZXMucGlwZShcbiAgICAgIHRhcCgodmFsKSA9PiB0aGlzLnNlYXJjaFF1ZXJ5Q2hhbmdlLmVtaXQodmFsKSksXG4gICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZVRpbWUoKSksXG4gICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgLy8gRmlsdGVyOiBPbmx5IHByb2Nlc3Mgbm9uLWVtcHR5IHF1ZXJpZXMgdGhhdCBtZWV0IG1pbklucHV0TGVuZ3RoIHJlcXVpcmVtZW50XG4gICAgICBmaWx0ZXIoKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgcSA9IHF1ZXJ5Py50cmltKCkgPz8gJyc7XG4gICAgICAgIGlmICghcSB8fCBxLmxlbmd0aCA8IHRoaXMubWluSW5wdXRMZW5ndGgoKSkge1xuICAgICAgICAgIC8vIENsb3NlIGRyb3Bkb3duIGlmIHF1ZXJ5IGlzIHRvbyBzaG9ydFxuICAgICAgICAgIHRoaXMuY2xvc2VEcm9wZG93bigpO1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0pLFxuICAgICAgLy8gRmlsdGVyOiBJZ25vcmUgcXVlcmllcyB0aGF0IG1hdGNoIHRoZSBsYXN0IHNlbGVjdGVkIHZhbHVlXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIGRyb3Bkb3duIGZyb20gcmVvcGVuaW5nIHdoZW4gaW5wdXQgc2hvd3Mgc2VsZWN0ZWQgdmFsdWVcbiAgICAgIGZpbHRlcigocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBxID0gcXVlcnk/LnRyaW0oKSA/PyAnJztcbiAgICAgICAgY29uc3QgbGFzdFNlbGVjdGVkID0gdGhpcy5sYXN0U2VsZWN0ZWRWYWx1ZSgpO1xuICAgICAgICAvLyBBbGxvdyBzZWFyY2ggaWYgbm8gcHJldmlvdXMgc2VsZWN0aW9uIE9SIHF1ZXJ5IGlzIGRpZmZlcmVudCBmcm9tIHNlbGVjdGVkIHZhbHVlXG4gICAgICAgIHJldHVybiAhbGFzdFNlbGVjdGVkIHx8IHEgIT09IGxhc3RTZWxlY3RlZDtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqIFN1YnNjcmliZSB0byBzZWFyY2ggcXVlcmllcyBhbmQgdHJpZ2dlciBIVFRQIHN0cmVhbS5cbiAgICAgKiBBbGwgZmlsdGVyaW5nIGlzIGRvbmUgaW4gdGhlIHBpcGUgY2hhaW4gYWJvdmUsIHNvIHRoaXMgY2FsbGJhY2tcbiAgICAgKiBvbmx5IGhhbmRsZXMgdGhlIGFjdHVhbCBzZWFyY2ggZXhlY3V0aW9uLlxuICAgICAqL1xuICAgIHRoaXMuc2VhcmNoU3Vic2NyaXB0aW9uID0gbWVyZ2Uoc2VhcmNoT2JzZXJ2YWJsZSwgdGhpcy5odHRwU3RyZWFtVHJpZ2dlcilcbiAgICAgIC5waXBlKFxuICAgICAgICAvLyBBZGRpdGlvbmFsIGZpbHRlciBmb3IgaHR0cFN0cmVhbVRyaWdnZXIgKG1hbnVhbCByZWZyZXNoKVxuICAgICAgICBmaWx0ZXIoKHF1ZXJ5OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBjb25zdCBxID0gcXVlcnk/LnRyaW0oKSA/PyAnJztcbiAgICAgICAgICAvLyBGb3IgbWFudWFsIHRyaWdnZXJzLCBzdGlsbCByZXNwZWN0IG1pbklucHV0TGVuZ3RoIGFuZCBsYXN0U2VsZWN0ZWRWYWx1ZVxuICAgICAgICAgIGlmICghcSB8fCBxLmxlbmd0aCA8IHRoaXMubWluSW5wdXRMZW5ndGgoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBsYXN0U2VsZWN0ZWQgPSB0aGlzLmxhc3RTZWxlY3RlZFZhbHVlKCk7XG4gICAgICAgICAgcmV0dXJuICFsYXN0U2VsZWN0ZWQgfHwgcSAhPT0gbGFzdFNlbGVjdGVkO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocXVlcnk6IHN0cmluZykgPT4ge1xuICAgICAgICBjb25zdCBxID0gcXVlcnk/LnRyaW0oKSA/PyAnJztcbiAgICAgICAgXG4gICAgICAgIHRoaXMubG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgICAgIHRoaXMuZXJyb3Iuc2V0KGZhbHNlKTtcblxuICAgICAgICAvLyBPcGVuIG92ZXJsYXkgaWYgbm90IHlldCBvcGVuXG4gICAgICAgIGlmICghdGhpcy5vdmVybGF5UmVmPy5oYXNBdHRhY2hlZCgpKSB7XG4gICAgICAgICAgdGhpcy5vcGVuRHJvcGRvd24odGhpcy5kZCwgdGhpcy5vcmlnaW4ubmF0aXZlRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsIEhUVFAgc3RyZWFtXG4gICAgICAgIHRoaXMuaHR0cFN0cmVhbSgpKHEpLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKGxpc3Q6IElMaXN0RGF0YVtdKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgIHRoaXMuZGF0YS5zZXQobGlzdCk7XG4gICAgICAgICAgICBpZiAoIXRoaXMub3ZlcmxheVJlZj8uaGFzQXR0YWNoZWQoKSAmJiBsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgdGhpcy5vcGVuRHJvcGRvd24odGhpcy5kZCwgdGhpcy5vcmlnaW4ubmF0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgICB0aGlzLmVycm9yLnNldCh0cnVlKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuY29udHJvbCgpPy52YWx1ZSkge1xuICAgICAgdGhpcy5oYW5kbGVDb250cm9sQ2hhbmdlcyh0aGlzLmNvbnRyb2woKSEudmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuY29udHJvbFN1YnNjcmlwdGlvbiA9IHRoaXMuY29udHJvbCgpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKFxuICAgICAgdGhpcy5oYW5kbGVDb250cm9sQ2hhbmdlc1xuICAgICk7XG5cbiAgICAvLyBIYW5kbGUgc2VhcmNoVmFsdWUgaW5wdXQgY2hhbmdlc1xuICAgIGlmICh0aGlzLnNlYXJjaFZhbHVlKCkpIHtcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQucGF0Y2hWYWx1ZSh0aGlzLnNlYXJjaFZhbHVlKCksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcygpIHtcbiAgICAvLyBIYW5kbGUgc2VhcmNoVmFsdWUgY2hhbmdlc1xuICAgIGlmICh0aGlzLnNlYXJjaFZhbHVlKCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5zZWFyY2hJbnB1dC5wYXRjaFZhbHVlKHRoaXMuc2VhcmNoVmFsdWUoKSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBkaXNhYmxlZCBjaGFuZ2VzXG4gICAgaWYgKHRoaXMuZGlzYWJsZWQoKSkge1xuICAgICAgdGhpcy5zZWFyY2hJbnB1dC5kaXNhYmxlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQuZW5hYmxlKCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zZWFyY2hTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5jb250cm9sU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuaHR0cFN0cmVhbVRyaWdnZXIuY29tcGxldGUoKTtcbiAgICB0aGlzLm92ZXJsYXlSZWY/LmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8vID09PSBNZXRob2RzID09PVxuICByZWZyZXNoSHR0cFN0cmVhbShxdWVyeTogc3RyaW5nKSB7XG4gICAgdGhpcy5odHRwU3RyZWFtVHJpZ2dlci5uZXh0KHF1ZXJ5KTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ29udHJvbENoYW5nZXMgPSAodmFsdWVzOiBJTGlzdERhdGFbXSkgPT4ge1xuICAgIHZhbHVlcy5mb3JFYWNoKChlbCkgPT4gdGhpcy5zZWxlY3REYXRhKGVsLCB0cnVlKSk7XG4gIH07XG5cbiAgcHJpdmF0ZSBvcGVuRHJvcGRvd24odGVtcGxhdGU6IFRlbXBsYXRlUmVmPEVsZW1lbnQ+LCBvcmlnaW46IEhUTUxFbGVtZW50KSB7XG4gICAgY29uc3QgcG9zaXRpb25zQm90dG9tID0gW1xuICAgICAgbmV3IENvbm5lY3Rpb25Qb3NpdGlvblBhaXIoXG4gICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ2JvdHRvbScgfSxcbiAgICAgICAgeyBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICd0b3AnIH0sXG4gICAgICAgIDAsXG4gICAgICAgIDRcbiAgICAgICksXG4gICAgICBuZXcgQ29ubmVjdGlvblBvc2l0aW9uUGFpcihcbiAgICAgICAgeyBvcmlnaW5YOiAnZW5kJywgb3JpZ2luWTogJ2JvdHRvbScgfSxcbiAgICAgICAgeyBvdmVybGF5WDogJ2VuZCcsIG92ZXJsYXlZOiAndG9wJyB9LFxuICAgICAgICAwLFxuICAgICAgICA0XG4gICAgICApLFxuICAgIF07XG4gICAgY29uc3QgcG9zaXRpb25zVG9wID0gW1xuICAgICAgbmV3IENvbm5lY3Rpb25Qb3NpdGlvblBhaXIoXG4gICAgICAgIHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ3RvcCcgfSxcbiAgICAgICAgeyBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICdib3R0b20nIH0sXG4gICAgICAgIDAsXG4gICAgICAgIC00XG4gICAgICApLFxuICAgICAgbmV3IENvbm5lY3Rpb25Qb3NpdGlvblBhaXIoXG4gICAgICAgIHsgb3JpZ2luWDogJ2VuZCcsIG9yaWdpblk6ICd0b3AnIH0sXG4gICAgICAgIHsgb3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ2JvdHRvbScgfSxcbiAgICAgICAgMCxcbiAgICAgICAgLTRcbiAgICAgICksXG4gICAgXTtcblxuICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLm92ZXJsYXlcbiAgICAgIC5wb3NpdGlvbigpXG4gICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyhvcmlnaW4pXG4gICAgICAud2l0aFBvc2l0aW9ucyhbXG4gICAgICAgIC4uLih0aGlzLmRyb3Bkb3duTGlzdFBvc2l0aW9uKCkgPT09ICdSaWdodCcgPyBwb3NpdGlvbnNCb3R0b20ucmV2ZXJzZSgpIDogcG9zaXRpb25zQm90dG9tKSxcbiAgICAgICAgLi4uKHRoaXMuZHJvcGRvd25MaXN0UG9zaXRpb24oKSA9PT0gJ1JpZ2h0JyA/IHBvc2l0aW9uc1RvcC5yZXZlcnNlKCkgOiBwb3NpdGlvbnNUb3ApLFxuICAgICAgXSlcbiAgICAgIC53aXRoUHVzaCh0cnVlKTtcblxuICAgIGNvbnN0IGNvbmZpZ3MgPSBuZXcgT3ZlcmxheUNvbmZpZyh7XG4gICAgICBoYXNCYWNrZHJvcDogdHJ1ZSxcbiAgICAgIGJhY2tkcm9wQ2xhc3M6ICdjZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCcsXG4gICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5vdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpLFxuICAgICAgcG9zaXRpb25TdHJhdGVneSxcbiAgICAgIHdpZHRoOiBvcmlnaW4uY2xpZW50V2lkdGgsXG4gICAgfSk7XG5cbiAgICB0aGlzLm92ZXJsYXlSZWYgPSB0aGlzLm92ZXJsYXkuY3JlYXRlKGNvbmZpZ3MpO1xuICAgIGlmICh0aGlzLmRyb3Bkb3duTGlzdFdpZHRoKCkpIHtcbiAgICAgIHRoaXMub3ZlcmxheVJlZi51cGRhdGVTaXplKHsgd2lkdGg6IHRoaXMuZHJvcGRvd25MaXN0V2lkdGgoKSB9KTtcbiAgICB9XG5cbiAgICB0aGlzLm92ZXJsYXlSZWYuYXR0YWNoKG5ldyBUZW1wbGF0ZVBvcnRhbCh0ZW1wbGF0ZSwgdGhpcy52aWV3Q29udGFpbmVyUmVmKSk7XG4gICAgdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5jbG9zZURyb3Bkb3duKCkpO1xuICAgIHRoaXMub3BlbmVkLnNldCh0cnVlKTtcbiAgfVxuXG4gIGNsb3NlRHJvcGRvd24oKSB7XG4gICAgdGhpcy5vcGVuZWQuc2V0KGZhbHNlKTtcbiAgICB0aGlzLm9wZW5Qb3BVcE9uVGFiLnNldChmYWxzZSk7XG4gICAgdGhpcy5vdmVybGF5UmVmPy5kZXRhY2goKTtcbiAgICB0aGlzLmRhdGEuc2V0KFtdKTtcbiAgfVxuXG4gIGVuYWJsZVBvcFVwT25UYWIoKSB7XG4gICAgdGhpcy5vcGVuUG9wVXBPblRhYi5zZXQodHJ1ZSk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICB0aGlzLnNlYXJjaElucHV0LnJlc2V0KCk7XG4gICAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyBpdGVtIHNlbGVjdGlvbiBmcm9tIGRyb3Bkb3duLlxuICAgKiBcbiAgICogRm9yIHNpbmdsZS1zZWxlY3QgbW9kZTpcbiAgICogLSBTZXRzIGlucHV0IHZhbHVlIHRvIGRpc3BsYXkgc2VsZWN0ZWQgaXRlbSAoc3RhbmRhcmQgVVggcGF0dGVybilcbiAgICogLSBTdG9yZXMgc2VsZWN0ZWQgdmFsdWUgdG8gcHJldmVudCByZW9wZW5pbmcgZHJvcGRvd24gb24gZm9jdXMvY2hhbmdlIGRldGVjdGlvblxuICAgKiAtIEJsdXJzIGlucHV0IHRvIHByZXZlbnQgaW1tZWRpYXRlIGZvY3VzLXRyaWdnZXJlZCBzZWFyY2hlc1xuICAgKiBcbiAgICogRm9yIG11bHRpLXNlbGVjdCBtb2RlOlxuICAgKiAtIENsZWFycyBpbnB1dCBmb3IgbmV4dCBzZWxlY3Rpb25cbiAgICogLSBNYWludGFpbnMgZm9jdXMgZm9yIGNvbnRpbnVvdXMgc2VsZWN0aW9uXG4gICAqL1xuICBzZWxlY3REYXRhKGl0ZW06IElMaXN0RGF0YSwgZWZmZWN0ZWRGcm9tT3V0c2lkZSA9IHRydWUpIHtcbiAgICBpZiAoaXRlbS5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgdGhpcy5pdGVtU2VsZWN0ZWQuZW1pdChpdGVtKTtcblxuICAgIGlmICghdGhpcy5tdWx0aSgpKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZFZhbHVlID0gaXRlbVt0aGlzLmRpc3BsYXlLZXkoKV07XG4gICAgICAvLyBTZXQgaW5wdXQgdmFsdWUgdG8gc2hvdyBzZWxlY3RlZCBpdGVtIChzdGFuZGFyZCBVWCAtIGxpa2UgQW5ndWxhciBNYXRlcmlhbCwgZXRjLilcbiAgICAgIC8vIFVzZSBlbWl0RXZlbnQ6IGZhbHNlIHRvIHByZXZlbnQgdHJpZ2dlcmluZyB2YWx1ZUNoYW5nZXMgc3Vic2NyaXB0aW9uXG4gICAgICB0aGlzLnNlYXJjaElucHV0LnBhdGNoVmFsdWUoc2VsZWN0ZWRWYWx1ZSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgXG4gICAgICAvLyBTdG9yZSBzZWxlY3RlZCB2YWx1ZSAtIFJ4SlMgZmlsdGVyIHdpbGwgcHJldmVudCByZW9wZW5pbmcgd2l0aCBzYW1lIHZhbHVlXG4gICAgICB0aGlzLmxhc3RTZWxlY3RlZFZhbHVlLnNldChzZWxlY3RlZFZhbHVlKTtcbiAgICAgIHRoaXMuc2V0Q29udHJvbFZhbHVlKGl0ZW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXRoaXMuc2VsZWN0aW9ucygpLmhhcyhpdGVtW3RoaXMudW5pcXVlS2V5KCkhXSkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3Rpb25zKCkuc2V0KGl0ZW1bdGhpcy51bmlxdWVLZXkoKSFdLCBpdGVtKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0Q29udHJvbFZhbHVlKHRoaXMuc2VsZWN0ZWRJdGVtcyk7XG4gICAgICBpZiAoIWVmZmVjdGVkRnJvbU91dHNpZGUpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbnB1dFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgdGhpcy5pbnB1dFJlZi5uYXRpdmVFbGVtZW50LnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgIH0sIDEwKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VhcmNoSW5wdXQucGF0Y2hWYWx1ZSgnJyk7XG4gICAgICB0aGlzLmRhdGEuc2V0KFtdKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsb3NlRHJvcGRvd24oKTtcblxuICAgIC8vIEJsdXIgaW5wdXQgdG8gcHJldmVudCBmb2N1cyBldmVudHMgZnJvbSBpbW1lZGlhdGVseSB0cmlnZ2VyaW5nIHNlYXJjaFxuICAgIC8vIFRoZSBsYXN0U2VsZWN0ZWRWYWx1ZSBmaWx0ZXIgd2lsbCBhbHNvIHByZXZlbnQgcmVvcGVuaW5nIGlmIGZvY3VzIG9jY3Vyc1xuICAgIGlmICh0aGlzLmlucHV0UmVmPy5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLmlucHV0UmVmLm5hdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUl0ZW0oaXRlbTogSUxpc3REYXRhKSB7XG4gICAgdGhpcy5pdGVtUmVtb3ZlZC5lbWl0KGl0ZW0pO1xuICAgIHRoaXMuc2VsZWN0aW9ucygpLmRlbGV0ZShpdGVtW3RoaXMudW5pcXVlS2V5KCkhXSk7XG4gICAgdGhpcy5zZXRDb250cm9sVmFsdWUodGhpcy5zZWxlY3RlZEl0ZW1zKTtcbiAgICB0aGlzLmlucHV0UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0Q29udHJvbFZhbHVlKHZhbHVlOiBJTGlzdERhdGEgfCBJTGlzdERhdGFbXSkge1xuICAgIHRoaXMub25TZWxlY3QuZW1pdCh2YWx1ZSk7XG4gICAgdGhpcy5jb250cm9sKCk/LnBhdGNoVmFsdWUodmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgfVxuXG4gIGdldCBzZWxlY3RlZEl0ZW1zKCkge1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuc2VsZWN0aW9ucygpLnZhbHVlcygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIGlucHV0IGFuZCByZXNldHMgc2VsZWN0aW9uIHN0YXRlLlxuICAgKiBDbGVhcmluZyBsYXN0U2VsZWN0ZWRWYWx1ZSBhbGxvd3MgbmV3IHNlYXJjaGVzIHRvIHByb2NlZWQgbm9ybWFsbHkuXG4gICAqL1xuICByZW1vdmVJbnB1dFZhbHVlKCkge1xuICAgIHRoaXMuc2VhcmNoSW5wdXQucmVzZXQoKTtcbiAgICB0aGlzLmRhdGEuc2V0KFtdKTtcbiAgICB0aGlzLmxhc3RTZWxlY3RlZFZhbHVlLnNldChudWxsKTtcbiAgICB0aGlzLmNsZWFyLmVtaXQodHJ1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gaW5wdXQgcmVjZWl2ZXMgZm9jdXMuXG4gICAqIE9ubHkgb3BlbnMgZHJvcGRvd24gaWY6XG4gICAqIDEuIG1pbklucHV0TGVuZ3RoIGFsbG93cyBpdCAoLTEgb3IgMCBtZWFucyBvcGVuIG9uIGZvY3VzKVxuICAgKiAyLiBJbnB1dCB2YWx1ZSBkb2Vzbid0IG1hdGNoIGxhc3Qgc2VsZWN0ZWQgdmFsdWUgKHByZXZlbnRzIHJlb3BlbmluZyBhZnRlciBzZWxlY3Rpb24pXG4gICAqIFxuICAgKiBUaGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgaW5wdXQgcmVnYWlucyBmb2N1cyBhZnRlciBzZWxlY3Rpb24uXG4gICAqIFRoZSBSeEpTIGZpbHRlciBpbiBzZWFyY2hPYnNlcnZhYmxlIGhhbmRsZXMgdmFsdWVDaGFuZ2VzLCBidXQgZm9jdXMgZXZlbnRzXG4gICAqIG5lZWQgc2VwYXJhdGUgaGFuZGxpbmcgc2luY2UgdGhleSBieXBhc3MgdmFsdWVDaGFuZ2VzLlxuICAgKi9cbiAgZGVmYXVsdENhbGwoKSB7XG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpcy5zZWFyY2hJbnB1dC52YWx1ZT8udHJpbSgpIHx8ICcnO1xuICAgIGNvbnN0IGxhc3RTZWxlY3RlZCA9IHRoaXMubGFzdFNlbGVjdGVkVmFsdWUoKTtcbiAgICBcbiAgICAvLyBEb24ndCBvcGVuIGlmIHZhbHVlIG1hdGNoZXMgbGFzdCBzZWxlY3RlZCAodXNlciBoYXNuJ3QgdHlwZWQgbmV3IHF1ZXJ5KVxuICAgIGlmIChsYXN0U2VsZWN0ZWQgJiYgY3VycmVudFZhbHVlID09PSBsYXN0U2VsZWN0ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgXG4gICAgLy8gT25seSBvcGVuIG9uIGZvY3VzIGlmIG1pbklucHV0TGVuZ3RoIGFsbG93cyBpdFxuICAgIGlmICh0aGlzLm1pbklucHV0TGVuZ3RoKCkgPT09IC0xKSB7XG4gICAgICB0aGlzLmxvYWRpbmcuc2V0KHRydWUpO1xuICAgICAgdGhpcy5odHRwU3RyZWFtKCkodGhpcy5zZWFyY2hJbnB1dC52YWx1ZSB8fCAnJykuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKGxpc3Q6IElMaXN0RGF0YVtdKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgICAgICAgdGhpcy5kYXRhLnNldChsaXN0KTtcbiAgICAgICAgICBpZiAoIXRoaXMub3ZlcmxheVJlZj8uaGFzQXR0YWNoZWQoKSAmJiBsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMub3BlbkRyb3Bkb3duKHRoaXMuZGQsIHRoaXMub3JpZ2luLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmVycm9yLnNldCh0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufSIsIjxkaXYgY2xhc3M9XCJkZC13cmFwcGVyXCJcbiAgICAgW25nQ2xhc3NdPVwieyBvcGVuZWQ6IG9wZW5lZCgpLCBkaXNhYmxlZDogZGlzYWJsZWQoKSwgcmVhZG9ubHk6IHJlYWRvbmx5KCkgfVwiXG4gICAgIFtzdHlsZS53aWR0aF09XCJ3aWR0aCgpXCJcbiAgICAgI2RkQnRuPlxuICBcbiAgPCEtLSBTZWxlY3RlZCBjaGlwcyBmb3IgbXVsdGktc2VsZWN0IC0tPlxuICA8ZGl2IGNsYXNzPVwic2VsZWN0ZWQtbGlzdFwiICpuZ0lmPVwibXVsdGkoKSAmJiBzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDBcIj5cbiAgICA8ZGl2IGNsYXNzPVwiY2hpcFwiXG4gICAgICAgICBbbmdDbGFzc109XCJ7ICdjaGlwLW1kJzogc2l6ZSgpID09PSAnbWQnLCAnY2hpcC1zbSc6IHNpemUoKSA9PT0gJ3NtJyB9XCJcbiAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtIG9mIHNlbGVjdGVkSXRlbXNcIj5cbiAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInsgJ2g2Jzogc2l6ZSgpID09PSAnbWQnLCAnaDgtYic6IHNpemUoKSA9PT0gJ3NtJyB9XCJcbiAgICAgICAgICAgIHN0eWxlPVwibWFyZ2luLXJpZ2h0OiA0cHg7XCI+XG4gICAgICAgIHt7IGl0ZW1bZGlzcGxheUtleSgpXSB9fVxuICAgICAgPC9zcGFuPlxuICAgICAgPHNwYW4gY2xhc3M9XCJpY29uLWljLW5hdmlnYXRpb24tY2FuY2VsLTI0XCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgY3Vyc29yOiAncG9pbnRlcicsICdmb250LXNpemUnOiBzaXplKCkgPT09ICdzbScgPyAnMTJweCcgOiAnMTRweCcgfVwiXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUl0ZW0oaXRlbSlcIlxuICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInJlbW92ZUl0ZW0oaXRlbSlcIj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPCEtLSBTZWFyY2ggaW5wdXQgLS0+XG4gIDxkaXYgY2xhc3M9XCJzZWFyY2gtaW5wdXRcIj5cbiAgICA8IS0tIFBsYWNlaG9sZGVyIGljb24gLS0+XG4gICAgPGRpdiAqbmdJZj1cImN1c3RvbVBsYWNlaG9sZGVySWNvbigpOyBlbHNlIGRlZmF1bHRTZWFyY2hJY29uXCIgY2xhc3M9XCJjdXN0b20taWNvblwiPlxuICAgICAgPGltZyBbc3JjXT1cImN1c3RvbVBsYWNlaG9sZGVySWNvbigpXCIgYWx0PVwiY3VzdG9tSWNvblwiIC8+XG4gICAgPC9kaXY+XG4gICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0U2VhcmNoSWNvbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiaWNvbi1pYy1hY3Rpb24tc2VhcmNoLTI0XCI+PC9zcGFuPlxuICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICA8IS0tIElucHV0IGZpZWxkIC0tPlxuICAgIDxpbnB1dCBbbmdDbGFzc109XCJ7ICdpcC1tZCc6IHNpemUoKSA9PT0gJ21kJywgJ2lwLXNtJzogc2l6ZSgpID09PSAnc20nIH1cIlxuICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIoKVwiXG4gICAgICAgICAgIFtmb3JtQ29udHJvbF09XCJzZWFyY2hJbnB1dFwiXG4gICAgICAgICAgIFthdHRyLnRhYmluZGV4XT1cIjBcIlxuICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgIGNsYXNzPVwiYmxhY2stdGV4dCBoNlwiXG4gICAgICAgICAgICNpbnB1dFxuICAgICAgICAgICAoZm9jdXMpPVwiZGVmYXVsdENhbGwoKVwiXG4gICAgICAgICAgIChrZXl1cC5lbnRlcik9XCJlbmFibGVQb3BVcE9uVGFiKClcIlxuICAgICAgICAgICAoY29weSk9XCJkaXNhYmxlQ29weVBhc3RlKCkgPyBmYWxzZSA6IHRydWVcIlxuICAgICAgICAgICAocGFzdGUpPVwiZGlzYWJsZUNvcHlQYXN0ZSgpID8gZmFsc2UgOiB0cnVlXCJcbiAgICAgICAgICAgKGN1dCk9XCJkaXNhYmxlQ29weVBhc3RlKCkgPyBmYWxzZSA6IHRydWVcIi8+XG5cbiAgICA8IS0tIENsZWFyIGlucHV0IC0tPlxuICAgIDxkaXYgY2xhc3M9XCJpY29uLWljLW5hdmlnYXRpb24tY2FuY2VsLTI0IGNyb29zLWljb25cIlxuICAgICAgICAgKm5nSWY9XCJzZWFyY2hJbnB1dC52YWx1ZT8ubGVuZ3RoXCJcbiAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAoY2xpY2spPVwicmVtb3ZlSW5wdXRWYWx1ZSgpXCJcbiAgICAgICAgIChrZXl1cC5lbnRlcik9XCJyZW1vdmVJbnB1dFZhbHVlKClcIj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPCEtLSBEcm9wZG93biB0ZW1wbGF0ZSAtLT5cbjxuZy10ZW1wbGF0ZSAjZGQ+XG4gIDxkaXYgY2xhc3M9XCJkZC1saXN0XCJcbiAgICAgICBbbmdTdHlsZV09XCJ7ICdtYXgtaGVpZ2h0JzogaGVpZ2h0KCksICd3aWR0aCc6IGRyb3Bkb3duTGlzdFdpZHRoKCkgfVwiXG4gICAgICAgW25nQ2xhc3NdPVwieyAnZGQtbGlzdC1wZCc6IGRhdGEoKS5sZW5ndGggPT09IDAgfVwiXG4gICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICBjZGtUcmFwRm9jdXNcbiAgICAgICBbY2RrVHJhcEZvY3VzQXV0b0NhcHR1cmVdPVwib3BlblBvcFVwT25UYWIoKVwiPlxuXG4gICAgPCEtLSBMb2FkZXIgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRpbmcoKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1c3RvbUxvYWRlcjsgZWxzZSBkZWZhdWx0TG9hZGVyXCIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VzdG9tTG9hZGVyXCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRMb2FkZXI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtY29udGFpbmVyXCIgKm5nSWY9XCJsb2FkaW5nKCkgJiYgIWN1c3RvbUxvYWRlclwiPlxuICAgICAgICAgIDxtaXMtbG9hZGVyIFttb2JpbGVWaWV3XT1cInRydWVcIj48L21pcy1sb2FkZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gRXJyb3IgLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImVycm9yKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdGF0dXMtY29udGFpbmVyXCI+XG4gICAgICAgIDxwPlVua25vd24gZXJyb3IgaGFzIG9jY3VycmVkLCA8YnIvPiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLjwvcD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBEYXRhIGxpc3QgLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFsb2FkaW5nKCkgJiYgIWVycm9yKCkgJiYgZGF0YSgpLmxlbmd0aCA+IDBcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgZGF0YSgpXCI+XG4gICAgICAgIDxkaXYgKGNsaWNrKT1cInNlbGVjdERhdGEoaXRlbSwgZmFsc2UpXCIgKGtleXVwLmVudGVyKT1cInNlbGVjdERhdGEoaXRlbSwgZmFsc2UpXCI+XG4gICAgICAgICAgPGRpdiB0YWJpbmRleD1cIi0xXCIgY2RrRm9jdXNJbml0aWFsPjwvZGl2PlxuXG4gICAgICAgICAgPCEtLSBDdXN0b20gaXRlbSAtLT5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VzdG9tSXRlbTsgZWxzZSBzdGFuZGFyZEl0ZW1cIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VzdG9tSXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7ICRpbXBsaWNpdDogaXRlbSB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8IS0tIFN0YW5kYXJkIGl0ZW0gLS0+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNzdGFuZGFyZEl0ZW0+XG4gICAgICAgICAgICA8ZGl2IHRhYmluZGV4PVwiLTFcIiBjZGtGb2N1c0luaXRpYWw+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaXRlbVwiXG4gICAgICAgICAgICAgICAgIFt0YWJpbmRleF09XCJvcGVuUG9wVXBPblRhYigpID8gMCA6IC0xXCJcbiAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdERhdGEoaXRlbSwgZmFsc2UpXCJcbiAgICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cInNlbGVjdERhdGEoaXRlbSwgZmFsc2UpXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2YWx1ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcmltYXJ5XCI+e3sgaXRlbVtkaXNwbGF5S2V5KCldIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY29uZGFyeVwiPnt7IGl0ZW1bc2Vjb25kYXJ5RGlzcGxheUtleSgpXSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIE5vIGRhdGEgLS0+XG4gICAgPGRpdiAqbmdJZj1cIiFsb2FkaW5nKCkgJiYgIWVycm9yKCkgJiYgZGF0YSgpLmxlbmd0aCA9PT0gMCAmJiBzZWFyY2hJbnB1dC52YWx1ZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cImRhdGEtbm90LWZvdW5kXCI+Tm8gRGF0YSBBdmFpbGFibGU8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19