@koobiq/components 18.17.0 → 18.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,3 @@
1
1
  import { Version } from '@angular/core';
2
- export const VERSION = new Version('18.17.0+sha-ebfe616');
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBvbmVudHMvY29yZS92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEMsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWZXJzaW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gbmV3IFZlcnNpb24oJzE4LjE3LjArc2hhLWViZmU2MTYnKTtcbiJdfQ==
2
+ export const VERSION = new Version('18.18.0+sha-2bb3828');
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBvbmVudHMvY29yZS92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEMsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWZXJzaW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gbmV3IFZlcnNpb24oJzE4LjE4LjArc2hhLTJiYjM4MjgnKTtcbiJdfQ==
@@ -1,7 +1,6 @@
1
- import { ContentObserver } from '@angular/cdk/observers';
2
1
  import { SharedResizeObserver } from '@angular/cdk/observers/private';
3
2
  import { NgTemplateOutlet } from '@angular/common';
4
- import { booleanAttribute, ChangeDetectionStrategy, Component, computed, contentChild, contentChildren, Directive, ElementRef, inject, input, signal, TemplateRef, viewChild, viewChildren } from '@angular/core';
3
+ import { booleanAttribute, ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, contentChild, contentChildren, Directive, ElementRef, inject, input, numberAttribute, signal, TemplateRef, viewChild, viewChildren } from '@angular/core';
5
4
  import { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';
6
5
  import { debounceTime, merge, skip } from 'rxjs';
7
6
  import * as i0 from "@angular/core";
@@ -43,7 +42,7 @@ export class KbqOverflowItem {
43
42
  *
44
43
  * @docs-private
45
44
  */
46
- this.hidden = signal(false);
45
+ this.hidden = false;
47
46
  /**
48
47
  * TemplateRef for the item.
49
48
  *
@@ -86,20 +85,19 @@ export class KbqOverflowItems {
86
85
  * @docs-private
87
86
  */
88
87
  this.resultTemplateContext = computed(() => {
89
- const hiddenItemIDs = new Set(this.items()
90
- .filter(({ hidden }) => hidden())
91
- .map(({ id }) => id()));
88
+ const hiddenItemIDs = this.hiddenItemIDs();
92
89
  return {
93
90
  $implicit: hiddenItemIDs,
94
91
  hiddenItemIDs: hiddenItemIDs
95
92
  };
96
93
  });
94
+ this.hiddenItemIDs = signal(new Set([]));
97
95
  /**
98
96
  * Whether the overflow result is hidden.
99
97
  *
100
98
  * @docs-private
101
99
  */
102
- this.resultHidden = computed(() => !this.items().some(({ hidden }) => hidden()));
100
+ this.resultHidden = computed(() => this.hiddenItemIDs().size === 0);
103
101
  /**
104
102
  * Whether the overflow order should be reversed.
105
103
  * Also changes the position of the `resultTemplateRef`.
@@ -107,102 +105,70 @@ export class KbqOverflowItems {
107
105
  * @default false
108
106
  */
109
107
  this.reverseOverflowOrder = input(false, { transform: booleanAttribute });
108
+ /**
109
+ * Debounce time for recalculating items visibility.
110
+ *
111
+ * @default 100
112
+ */
113
+ this.debounceTime = input(100, { transform: numberAttribute });
110
114
  this.elementRef = inject(ElementRef);
111
115
  this.resizeObserver = inject(SharedResizeObserver);
112
- this.contentObserver = inject(ContentObserver);
113
- toObservable(this.reverseOverflowOrder)
114
- .pipe(skip(1), takeUntilDestroyed())
115
- .subscribe(() => {
116
- this.items().forEach(({ hidden }) => hidden.set(false));
117
- });
118
- merge(toObservable(this.items), this.resizeObserver.observe(this.elementRef.nativeElement), this.contentObserver.observe(this.elementRef.nativeElement).pipe(debounceTime(0)))
119
- .pipe(takeUntilDestroyed())
116
+ this.changeDetectorRef = inject(ChangeDetectorRef);
117
+ /**
118
+ * Determines if the given item is hidden.
119
+ */
120
+ this.isHiddenItem = ({ hidden }) => hidden;
121
+ merge(toObservable(this.items), toObservable(this.reverseOverflowOrder).pipe(skip(1)), this.resizeObserver.observe(this.elementRef.nativeElement))
122
+ .pipe(debounceTime(this.debounceTime()), takeUntilDestroyed())
120
123
  .subscribe(() => {
121
- this.updateItemsVisibility();
124
+ const items = this.items();
125
+ this.updateItemsVisibility(items, this.itemElementRefs(), this.reverseOverflowOrder(), this.resultElementRef(), this.elementRef.nativeElement);
126
+ this.hiddenItemIDs.set(new Set(items.filter(this.isHiddenItem).map(({ id }) => id())));
127
+ this.changeDetectorRef.markForCheck();
122
128
  });
123
129
  }
124
130
  /**
125
- * Updates the visibility of items based on the container width.
126
- *
127
- * This method calculates whether items should be hidden or shown by comparing the scroll width of the container
128
- * with its visible width. It determines which items are visible and which are hidden, and applies the hiding logic
129
- * based on the `reverseOverflowOrder` flag.
130
- *
131
- * The function operates recursively to adjust the visibility of items until the overflow condition is resolved.
132
- *
133
- * - If the container is overflown, it hides the last visible item from the end (or start if `reverseOverflowOrder`)
134
- * and checks if further adjustments are needed.
135
- * - If the container is not overflown, it reveals the first hidden item from the start
136
- * (or end if `reverseOverflowOrder`), ensuring it fits within the visible area.
131
+ * Updates items visibility, based on the container width and the `reverseOverflowOrder` flag.
137
132
  */
138
- updateItemsVisibility() {
139
- const itemElementRefs = this.itemElementRefs();
140
- const items = this.items().map(({ hidden }, index, _items) => {
141
- return {
142
- hidden,
143
- isFirst: index === 0,
144
- isLast: index === _items.length - 1,
145
- elementRef: itemElementRefs[index]
146
- };
133
+ updateItemsVisibility(items, itemElementRefs, reverseOverflowOrder, resultElementRef, { offsetWidth: totalWidth }) {
134
+ items.forEach((item) => {
135
+ item.hidden = false;
147
136
  });
148
- const reverseOverflowOrder = this.reverseOverflowOrder();
149
- const isEdgeItem = ({ isFirst, isLast }) => (reverseOverflowOrder ? isFirst : isLast);
150
- const { offsetWidth: totalWidth, scrollWidth } = this.elementRef.nativeElement;
151
- const isOverflown = scrollWidth > totalWidth;
152
- if (isOverflown) {
153
- const isVisibleItem = ({ hidden }) => !hidden();
154
- const lastVisibleItem = !reverseOverflowOrder
155
- ? this.findLast(items, isVisibleItem)
156
- : items.find(isVisibleItem);
157
- if (lastVisibleItem) {
158
- lastVisibleItem.hidden.set(true);
159
- if (!isEdgeItem(lastVisibleItem)) {
160
- this.updateItemsVisibility();
161
- }
137
+ let itemsWidth = items.reduce((width, _, index) => width + itemElementRefs[index].nativeElement.offsetWidth, 0);
138
+ const startIndex = reverseOverflowOrder ? 0 : items.length - 1;
139
+ const endIndex = reverseOverflowOrder ? items.length : -1;
140
+ const step = reverseOverflowOrder ? 1 : -1;
141
+ const resultWidth = resultElementRef?.nativeElement.offsetWidth || 0;
142
+ for (let index = startIndex; index !== endIndex; index += step) {
143
+ const current = items[index];
144
+ const currentWidth = itemElementRefs[index].nativeElement.offsetWidth;
145
+ const _resultWidth = items.some(this.isHiddenItem) ? resultWidth : 0;
146
+ if (itemsWidth + _resultWidth > totalWidth) {
147
+ current.hidden = true;
148
+ itemsWidth -= currentWidth;
162
149
  }
163
- }
164
- else {
165
- const isHiddenItem = ({ hidden }) => hidden();
166
- const firstHiddenItem = !reverseOverflowOrder
167
- ? items.find(isHiddenItem)
168
- : this.findLast(items, isHiddenItem);
169
- if (firstHiddenItem) {
170
- const firstHiddenItemWidth = firstHiddenItem.elementRef.nativeElement.offsetWidth;
171
- const visibleItemsTotalWidth = items
172
- .filter(({ hidden }) => !hidden())
173
- .reduce((width, { elementRef }) => width + elementRef.nativeElement.offsetWidth, 0);
174
- const _isEdgeItem = isEdgeItem(firstHiddenItem);
175
- const resultWidth = _isEdgeItem ? 0 : this.resultElementRef()?.nativeElement.offsetWidth || 0;
176
- if (firstHiddenItemWidth + visibleItemsTotalWidth + resultWidth <= totalWidth) {
177
- firstHiddenItem.hidden.set(false);
178
- if (!_isEdgeItem) {
179
- this.updateItemsVisibility();
180
- }
150
+ else {
151
+ const isEdgeElement = reverseOverflowOrder ? index === 0 : index === items.length - 1;
152
+ const _resultWidth = isEdgeElement ? 0 : resultWidth;
153
+ if (itemsWidth + currentWidth + _resultWidth <= totalWidth) {
154
+ current.hidden = false;
155
+ itemsWidth += currentWidth;
181
156
  }
182
157
  }
183
158
  }
184
159
  }
185
- /** @TODO Should use `Array.prototype.findLast` after migrating to ES2023 */
186
- findLast(array, predicate) {
187
- for (let i = array.length - 1; i >= 0; i--) {
188
- if (predicate(array[i], i, array)) {
189
- return array[i];
190
- }
191
- }
192
- return undefined;
193
- }
194
160
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: KbqOverflowItems, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
195
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.6", type: KbqOverflowItems, isStandalone: true, selector: "kbq-overflow-items", inputs: { reverseOverflowOrder: { classPropertyName: "reverseOverflowOrder", publicName: "reverseOverflowOrder", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "kbq-overflow-items" }, queries: [{ propertyName: "items", predicate: KbqOverflowItem, isSignal: true }, { propertyName: "result", first: true, predicate: KbqOverflowItemsResult, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "itemElementRefs", predicate: ["itemRef"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "resultElementRef", first: true, predicate: ["resultRef"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: `
161
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.6", type: KbqOverflowItems, isStandalone: true, selector: "kbq-overflow-items", inputs: { reverseOverflowOrder: { classPropertyName: "reverseOverflowOrder", publicName: "reverseOverflowOrder", isSignal: true, isRequired: false, transformFunction: null }, debounceTime: { classPropertyName: "debounceTime", publicName: "debounceTime", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "kbq-overflow-items" }, queries: [{ propertyName: "items", predicate: KbqOverflowItem, isSignal: true }, { propertyName: "result", first: true, predicate: KbqOverflowItemsResult, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "itemElementRefs", predicate: ["itemRef"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "resultElementRef", first: true, predicate: ["resultRef"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: `
196
162
  @if (reverseOverflowOrder()) {
197
163
  <ng-container [ngTemplateOutlet]="template" />
198
164
  }
199
165
 
200
- @for (item of items(); track item.id()) {
166
+ @for (item of items(); track item) {
201
167
  <div
202
168
  class="kbq-overflow-items__item"
203
169
  #itemRef
204
- [attr.aria-hidden]="item.hidden()"
205
- [class.kbq-overflow-items__item_hidden]="item.hidden()"
170
+ [attr.aria-hidden]="item.hidden"
171
+ [class.kbq-overflow-items__item_hidden]="item.hidden"
206
172
  >
207
173
  <ng-container [ngTemplateOutlet]="item.templateRef" />
208
174
  </div>
@@ -234,12 +200,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImpor
234
200
  <ng-container [ngTemplateOutlet]="template" />
235
201
  }
236
202
 
237
- @for (item of items(); track item.id()) {
203
+ @for (item of items(); track item) {
238
204
  <div
239
205
  class="kbq-overflow-items__item"
240
206
  #itemRef
241
- [attr.aria-hidden]="item.hidden()"
242
- [class.kbq-overflow-items__item_hidden]="item.hidden()"
207
+ [attr.aria-hidden]="item.hidden"
208
+ [class.kbq-overflow-items__item_hidden]="item.hidden"
243
209
  >
244
210
  <ng-container [ngTemplateOutlet]="item.templateRef" />
245
211
  </div>
@@ -266,4 +232,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImpor
266
232
  class: 'kbq-overflow-items'
267
233
  }, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{position:relative;display:flex;flex-grow:1;overflow:hidden;flex-wrap:nowrap;white-space:nowrap}.kbq-overflow-items__item,.kbq-overflow-items__result{display:flex;align-items:center}.kbq-overflow-items__item.kbq-overflow-items__item_hidden,.kbq-overflow-items__item.kbq-overflow-items__result_hidden,.kbq-overflow-items__result.kbq-overflow-items__item_hidden,.kbq-overflow-items__result.kbq-overflow-items__result_hidden{visibility:hidden;position:absolute}\n"] }]
268
234
  }], ctorParameters: () => [] });
269
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmZsb3ctaXRlbXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21wb25lbnRzL292ZXJmbG93LWl0ZW1zL292ZXJmbG93LWl0ZW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0gsZ0JBQWdCLEVBQ2hCLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsUUFBUSxFQUNSLFlBQVksRUFDWixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxFQUNULFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDOUUsT0FBTyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQWtDakQ7Ozs7R0FJRztBQUtILE1BQU0sT0FBTyxzQkFBc0I7SUFKbkM7UUFLSTs7OztXQUlHO1FBQ00sZ0JBQVcsR0FBRyxNQUFNLENBQTZDLFdBQVcsQ0FBQyxDQUFDO0tBQzFGO2lJQVBZLHNCQUFzQjtxSEFBdEIsc0JBQXNCOzsyRkFBdEIsc0JBQXNCO2tCQUpsQyxTQUFTO21CQUFDO29CQUNQLFVBQVUsRUFBRSxJQUFJO29CQUNoQixRQUFRLEVBQUUscUNBQXFDO2lCQUNsRDs7QUFVRDs7R0FFRztBQUtILE1BQU0sT0FBTyxlQUFlO0lBSjVCO1FBS0k7O1dBRUc7UUFDTSxPQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssRUFBRSxp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LCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250ZW50T2JzZXJ2ZXIgfSBmcm9tICdAYW5ndWxhci9jZGsvb2JzZXJ2ZXJzJztcbmltcG9ydCB7IFNoYXJlZFJlc2l6ZU9ic2VydmVyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL29ic2VydmVycy9wcml2YXRlJztcbmltcG9ydCB7IE5nVGVtcGxhdGVPdXRsZXQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBib29sZWFuQXR0cmlidXRlLFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBjb21wdXRlZCxcbiAgICBjb250ZW50Q2hpbGQsXG4gICAgY29udGVudENoaWxkcmVuLFxuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIGluamVjdCxcbiAgICBpbnB1dCxcbiAgICBzaWduYWwsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgdmlld0NoaWxkLFxuICAgIHZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCwgdG9PYnNlcnZhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBtZXJnZSwgc2tpcCB9IGZyb20gJ3J4anMnO1xuXG4vKipcbiAqIFRlbXBsYXRlIGNvbnRleHQgZm9yIHRoZSBgS2JxT3ZlcmZsb3dJdGVtc1Jlc3VsdGAgZGlyZWN0aXZlLlxuICpcbiAqIEBzZWUgYEticU92ZXJmbG93SXRlbXNSZXN1bHRgXG4gKi9cbmV4cG9ydCB0eXBlIEticU92ZXJmbG93SXRlbXNSZXN1bHRDb250ZXh0ID0ge1xuICAgIC8qKlxuICAgICAqIFNldCBvZiBoaWRkZW4gaXRlbSBJRCdzLlxuICAgICAqXG4gICAgICogRXhhbXBsZTpcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8bmctdGVtcGxhdGUga2JxT3ZlcmZsb3dJdGVtc1Jlc3VsdCBsZXQtaGlkZGVuSXRlbUlEcz5cbiAgICAgKiAge3sgaGlkZGVuSXRlbUlEcy5zaXplIH19XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBgXG4gICAgICovXG4gICAgJGltcGxpY2l0OiBSZWFkb25seVNldDx1bmtub3duPjtcbiAgICAvKipcbiAgICAgKiBTZXQgb2YgaGlkZGVuIGl0ZW0gSUQncy5cbiAgICAgKlxuICAgICAqIEV4YW1wbGU6XG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogPG5nLXRlbXBsYXRlIGticU92ZXJmbG93SXRlbXNSZXN1bHQgbGV0LWhpZGRlbkl0ZW1JRHM9XCJoaWRkZW5JdGVtSURzXCI+XG4gICAgICogIEBpZiAoaGlkZGVuSXRlbUlEcy5oYXMoU09NRV9JRCkpIHsuLi59XG4gICAgICogPC9uZy10ZW1wbGF0ZT5cbiAgICAgKiBgYGBgXG4gICAgICovXG4gICAgaGlkZGVuSXRlbUlEczogUmVhZG9ubHlTZXQ8dW5rbm93bj47XG59O1xuXG4vKipcbiAqIERpcmVjdGl2ZSBmb3IgcHJvdmlkaW5nIGBLYnFPdmVyZmxvd0l0ZW1zUmVzdWx0Q29udGV4dGAgdG8gdGhlIGBLYnFPdmVyZmxvd0l0ZW1zYCBjb21wb25lbnQuXG4gKlxuICogQHNlZSBgS2JxT3ZlcmZsb3dJdGVtc1Jlc3VsdENvbnRleHRgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICduZy10ZW1wbGF0ZVtrYnFPdmVyZmxvd0l0ZW1zUmVzdWx0XSdcbn0pXG5leHBvcnQgY2xhc3MgS2JxT3ZlcmZsb3dJdGVtc1Jlc3VsdCB7XG4gICAgLyoqXG4gICAgICogVGVtcGxhdGVSZWYgZm9yIHRoZSBvdmVyZmxvdyByZXN1bHQuXG4gICAgICpcbiAgICAgKiBAZG9jcy1wcml2YXRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgdGVtcGxhdGVSZWYgPSBpbmplY3Q8VGVtcGxhdGVSZWY8S2JxT3ZlcmZsb3dJdGVtc1Jlc3VsdENvbnRleHQ+PihUZW1wbGF0ZVJlZik7XG59XG5cbi8qKlxuICogU3RydWN0dXJlIGRpcmVjdGl2ZSBmb3IgcHJvdmlkaW5nIGl0ZW1zIHRvIHRoZSBgS2JxT3ZlcmZsb3dJdGVtc2AuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdba2JxT3ZlcmZsb3dJdGVtXSdcbn0pXG5leHBvcnQgY2xhc3MgS2JxT3ZlcmZsb3dJdGVtIHtcbiAgICAvKipcbiAgICAgKiBJZGVudGlmaWVyIGZvciB0aGUgaXRlbS5cbiAgICAgKi9cbiAgICByZWFkb25seSBpZCA9IGlucHV0LnJlcXVpcmVkKHsgYWxpYXM6ICdrYnFPdmVyZmxvd0l0ZW0nIH0pO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgaXRlbSBpcyBoaWRkZW4uXG4gICAgICpcbiAgICAgKiBAZG9jcy1wcml2YXRlXG4gICAgICovXG4gICAgcmVhZG9ubHkgaGlkZGVuID0gc2lnbmFsPGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqIFRlbXBsYXRlUmVmIGZvciB0aGUgaXRlbS5cbiAgICAgKlxuICAgICAqIEBkb2NzLXByaXZhdGVcbiAgICAgKi9cbiAgICByZWFkb25seSB0ZW1wbGF0ZVJlZiA9IGluamVjdChUZW1wbGF0ZVJlZik7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGZvciBhdXRvbWF0aWNhbGx5IGhpZGluZyBlbGVtZW50cyB3aXRoIGR5bmFtaWMgYWRhcHRhdGlvbiB0byB0aGUgY29udGFpbmVyIHdpZHRoLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAna2JxLW92ZXJmbG93LWl0ZW1zJyxcbiAgICBpbXBvcnRzOiBbTmdUZW1wbGF0ZU91dGxldF0sXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgQGlmIChyZXZlcnNlT3ZlcmZsb3dPcmRlcigpKSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlXCIgLz5cbiAgICAgICAgfVxuXG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXMoKTsgdHJhY2sgaXRlbS5pZCgpKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJrYnEtb3ZlcmZsb3ctaXRlbXNfX2l0ZW1cIlxuICAgICAgICAgICAgICAgICNpdGVtUmVmXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiaXRlbS5oaWRkZW4oKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmticS1vdmVyZmxvdy1pdGVtc19faXRlbV9oaWRkZW5dPVwiaXRlbS5oaWRkZW4oKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtLnRlbXBsYXRlUmVmXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmICghcmV2ZXJzZU92ZXJmbG93T3JkZXIoKSkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiIC8+XG4gICAgICAgIH1cblxuICAgICAgICA8bmctdGVtcGxhdGUgI3RlbXBsYXRlPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwia2JxLW92ZXJmbG93LWl0ZW1zX19yZXN1bHRcIlxuICAgICAgICAgICAgICAgICNyZXN1bHRSZWZcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWhpZGRlbl09XCJyZXN1bHRIaWRkZW4oKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmticS1vdmVyZmxvdy1pdGVtc19fcmVzdWx0X2hpZGRlbl09XCJyZXN1bHRIaWRkZW4oKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJyZXN1bHQoKT8udGVtcGxhdGVSZWYgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJyZXN1bHRUZW1wbGF0ZUNvbnRleHQoKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIGAsXG4gICAgc3R5bGVVcmw6ICcuL292ZXJmbG93LWl0ZW1zLnNjc3MnLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgY2xhc3M6ICdrYnEtb3ZlcmZsb3ctaXRlbXMnXG4gICAgfSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBLYnFPdmVyZmxvd0l0ZW1zIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGl0ZW1FbGVtZW50UmVmcyA9IHZpZXdDaGlsZHJlbjxzdHJpbmcsIEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PignaXRlbVJlZicsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcblxuICAgIC8qKlxuICAgICAqIGBLYnFPdmVyZmxvd0l0ZW1gIGRpcmVjdGl2ZSByZWZlcmVuY2VzLlxuICAgICAqXG4gICAgICogQGRvY3MtcHJpdmF0ZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpdGVtcyA9IGNvbnRlbnRDaGlsZHJlbihLYnFPdmVyZmxvd0l0ZW0pO1xuXG4gICAgLyoqXG4gICAgICogYEticU92ZXJmbG93SXRlbXNSZXN1bHRgIGRpcmVjdGl2ZSByZWZlcmVuY2UuXG4gICAgICpcbiAgICAgKiBAZG9jcy1wcml2YXRlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc3VsdCA9IGNvbnRlbnRDaGlsZChLYnFPdmVyZmxvd0l0ZW1zUmVzdWx0KTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzdWx0RWxlbWVudFJlZiA9IHZpZXdDaGlsZDxzdHJpbmcsIEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PigncmVzdWx0UmVmJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGVtcGxhdGUgY29udGV4dCBmb3IgdGhlIGBLYnFPdmVyZmxvd0l0ZW1zUmVzdWx0YCBkaXJlY3RpdmUuXG4gICAgICpcbiAgICAgKiBAZG9jcy1wcml2YXRlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc3VsdFRlbXBsYXRlQ29udGV4dCA9IGNvbXB1dGVkPEticU92ZXJmbG93SXRlbXNSZXN1bHRDb250ZXh0PigoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhpZGRlbkl0ZW1JRHMgPSBuZXcgU2V0KFxuICAgICAgICAgICAgdGhpcy5pdGVtcygpXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoeyBoaWRkZW4gfSkgPT4gaGlkZGVuKCkpXG4gICAgICAgICAgICAgICAgLm1hcCgoeyBpZCB9KSA9PiBpZCgpKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJGltcGxpY2l0OiBoaWRkZW5JdGVtSURzLFxuICAgICAgICAgICAgaGlkZGVuSXRlbUlEczogaGlkZGVuSXRlbUlEc1xuICAgICAgICB9O1xuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgb3ZlcmZsb3cgcmVzdWx0IGlzIGhpZGRlbi5cbiAgICAgKlxuICAgICAqIEBkb2NzLXByaXZhdGVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzdWx0SGlkZGVuID0gY29tcHV0ZWQoKCkgPT4gIXRoaXMuaXRlbXMoKS5zb21lKCh7IGhpZGRlbiB9KSA9PiBoaWRkZW4oKSkpO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgb3ZlcmZsb3cgb3JkZXIgc2hvdWxkIGJlIHJldmVyc2VkLlxuICAgICAqIEFsc28gY2hhbmdlcyB0aGUgcG9zaXRpb24gb2YgdGhlIGByZXN1bHRUZW1wbGF0ZVJlZmAuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAqL1xuICAgIHJlYWRvbmx5IHJldmVyc2VPdmVyZmxvd09yZGVyID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pO1xuXG4gICAgcHJpdmF0ZSByZWFkb25seSBlbGVtZW50UmVmID0gaW5qZWN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PihFbGVtZW50UmVmKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJlc2l6ZU9ic2VydmVyID0gaW5qZWN0KFNoYXJlZFJlc2l6ZU9ic2VydmVyKTtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRlbnRPYnNlcnZlciA9IGluamVjdChDb250ZW50T2JzZXJ2ZXIpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRvT2JzZXJ2YWJsZSh0aGlzLnJldmVyc2VPdmVyZmxvd09yZGVyKVxuICAgICAgICAgICAgLnBpcGUoc2tpcCgxKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zKCkuZm9yRWFjaCgoeyBoaWRkZW4gfSkgPT4gaGlkZGVuLnNldChmYWxzZSkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgbWVyZ2UoXG4gICAgICAgICAgICB0b09ic2VydmFibGUodGhpcy5pdGVtcyksXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLFxuICAgICAgICAgICAgdGhpcy5jb250ZW50T2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkucGlwZShkZWJvdW5jZVRpbWUoMCkpXG4gICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVJdGVtc1Zpc2liaWxpdHkoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgdGhlIHZpc2liaWxpdHkgb2YgaXRlbXMgYmFzZWQgb24gdGhlIGNvbnRhaW5lciB3aWR0aC5cbiAgICAgKlxuICAgICAqIFRoaXMgbWV0aG9kIGNhbGN1bGF0ZXMgd2hldGhlciBpdGVtcyBzaG91bGQgYmUgaGlkZGVuIG9yIHNob3duIGJ5IGNvbXBhcmluZyB0aGUgc2Nyb2xsIHdpZHRoIG9mIHRoZSBjb250YWluZXJcbiAgICAgKiB3aXRoIGl0cyB2aXNpYmxlIHdpZHRoLiBJdCBkZXRlcm1pbmVzIHdoaWNoIGl0ZW1zIGFyZSB2aXNpYmxlIGFuZCB3aGljaCBhcmUgaGlkZGVuLCBhbmQgYXBwbGllcyB0aGUgaGlkaW5nIGxvZ2ljXG4gICAgICogYmFzZWQgb24gdGhlIGByZXZlcnNlT3ZlcmZsb3dPcmRlcmAgZmxhZy5cbiAgICAgKlxuICAgICAqIFRoZSBmdW5jdGlvbiBvcGVyYXRlcyByZWN1cnNpdmVseSB0byBhZGp1c3QgdGhlIHZpc2liaWxpdHkgb2YgaXRlbXMgdW50aWwgdGhlIG92ZXJmbG93IGNvbmRpdGlvbiBpcyByZXNvbHZlZC5cbiAgICAgKlxuICAgICAqIC0gSWYgdGhlIGNvbnRhaW5lciBpcyBvdmVyZmxvd24sIGl0IGhpZGVzIHRoZSBsYXN0IHZpc2libGUgaXRlbSBmcm9tIHRoZSBlbmQgKG9yIHN0YXJ0IGlmIGByZXZlcnNlT3ZlcmZsb3dPcmRlcmApXG4gICAgICogYW5kIGNoZWNrcyBpZiBmdXJ0aGVyIGFkanVzdG1lbnRzIGFyZSBuZWVkZWQuXG4gICAgICogLSBJZiB0aGUgY29udGFpbmVyIGlzIG5vdCBvdmVyZmxvd24sIGl0IHJldmVhbHMgdGhlIGZpcnN0IGhpZGRlbiBpdGVtIGZyb20gdGhlIHN0YXJ0XG4gICAgICogKG9yIGVuZCBpZiBgcmV2ZXJzZU92ZXJmbG93T3JkZXJgKSwgZW5zdXJpbmcgaXQgZml0cyB3aXRoaW4gdGhlIHZpc2libGUgYXJlYS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHVwZGF0ZUl0ZW1zVmlzaWJpbGl0eSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbUVsZW1lbnRSZWZzID0gdGhpcy5pdGVtRWxlbWVudFJlZnMoKTtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLml0ZW1zKCkubWFwKCh7IGhpZGRlbiB9LCBpbmRleCwgX2l0ZW1zKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGhpZGRlbixcbiAgICAgICAgICAgICAgICBpc0ZpcnN0OiBpbmRleCA9PT0gMCxcbiAgICAgICAgICAgICAgICBpc0xhc3Q6IGluZGV4ID09PSBfaXRlbXMubGVuZ3RoIC0gMSxcbiAgICAgICAgICAgICAgICBlbGVtZW50UmVmOiBpdGVtRWxlbWVudFJlZnNbaW5kZXhdXG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgcmV2ZXJzZU92ZXJmbG93T3JkZXIgPSB0aGlzLnJldmVyc2VPdmVyZmxvd09yZGVyKCk7XG4gICAgICAgIGNvbnN0IGlzRWRnZUl0ZW0gPSAoeyBpc0ZpcnN0LCBpc0xhc3QgfTogKHR5cGVvZiBpdGVtcylbbnVtYmVyXSkgPT4gKHJldmVyc2VPdmVyZmxvd09yZGVyID8gaXNGaXJzdCA6IGlzTGFzdCk7XG4gICAgICAgIGNvbnN0IHsgb2Zmc2V0V2lkdGg6IHRvdGFsV2lkdGgsIHNjcm9sbFdpZHRoIH0gPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgaXNPdmVyZmxvd24gPSBzY3JvbGxXaWR0aCA+IHRvdGFsV2lkdGg7XG4gICAgICAgIGlmIChpc092ZXJmbG93bikge1xuICAgICAgICAgICAgY29uc3QgaXNWaXNpYmxlSXRlbSA9ICh7IGhpZGRlbiB9OiAodHlwZW9mIGl0ZW1zKVtudW1iZXJdKSA9PiAhaGlkZGVuKCk7XG4gICAgICAgICAgICBjb25zdCBsYXN0VmlzaWJsZUl0ZW0gPSAhcmV2ZXJzZU92ZXJmbG93T3JkZXJcbiAgICAgICAgICAgICAgICA/IHRoaXMuZmluZExhc3QoaXRlbXMsIGlzVmlzaWJsZUl0ZW0pXG4gICAgICAgICAgICAgICAgOiBpdGVtcy5maW5kKGlzVmlzaWJsZUl0ZW0pO1xuICAgICAgICAgICAgaWYgKGxhc3RWaXNpYmxlSXRlbSkge1xuICAgICAgICAgICAgICAgIGxhc3RWaXNpYmxlSXRlbS5oaWRkZW4uc2V0KHRydWUpO1xuICAgICAgICAgICAgICAgIGlmICghaXNFZGdlSXRlbShsYXN0VmlzaWJsZUl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbXNWaXNpYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgaXNIaWRkZW5JdGVtID0gKHsgaGlkZGVuIH06ICh0eXBlb2YgaXRlbXMpW251bWJlcl0pID0+IGhpZGRlbigpO1xuICAgICAgICAgICAgY29uc3QgZmlyc3RIaWRkZW5JdGVtID0gIXJldmVyc2VPdmVyZmxvd09yZGVyXG4gICAgICAgICAgICAgICAgPyBpdGVtcy5maW5kKGlzSGlkZGVuSXRlbSlcbiAgICAgICAgICAgICAgICA6IHRoaXMuZmluZExhc3QoaXRlbXMsIGlzSGlkZGVuSXRlbSk7XG4gICAgICAgICAgICBpZiAoZmlyc3RIaWRkZW5JdGVtKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3RIaWRkZW5JdGVtV2lkdGggPSBmaXJzdEhpZGRlbkl0ZW0uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IHZpc2libGVJdGVtc1RvdGFsV2lkdGggPSBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCh7IGhpZGRlbiB9KSA9PiAhaGlkZGVuKCkpXG4gICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKHdpZHRoLCB7IGVsZW1lbnRSZWYgfSkgPT4gd2lkdGggKyBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgsIDApO1xuICAgICAgICAgICAgICAgIGNvbnN0IF9pc0VkZ2VJdGVtID0gaXNFZGdlSXRlbShmaXJzdEhpZGRlbkl0ZW0pO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdFdpZHRoID0gX2lzRWRnZUl0ZW0gPyAwIDogdGhpcy5yZXN1bHRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMDtcbiAgICAgICAgICAgICAgICBpZiAoZmlyc3RIaWRkZW5JdGVtV2lkdGggKyB2aXNpYmxlSXRlbXNUb3RhbFdpZHRoICsgcmVzdWx0V2lkdGggPD0gdG90YWxXaWR0aCkge1xuICAgICAgICAgICAgICAgICAgICBmaXJzdEhpZGRlbkl0ZW0uaGlkZGVuLnNldChmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghX2lzRWRnZUl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbXNWaXNpYmlsaXR5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQFRPRE8gU2hvdWxkIHVzZSBgQXJyYXkucHJvdG90eXBlLmZpbmRMYXN0YCBhZnRlciBtaWdyYXRpbmcgdG8gRVMyMDIzICovXG4gICAgcHJpdmF0ZSBmaW5kTGFzdDxUPihhcnJheTogVFtdLCBwcmVkaWNhdGU6ICh2YWx1ZTogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IFRbXSkgPT4gYm9vbGVhbik6IFQgfCB1bmRlZmluZWQge1xuICAgICAgICBmb3IgKGxldCBpID0gYXJyYXkubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaV0sIGksIGFycmF5KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVtpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cbiJdfQ==
235
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3ZlcmZsb3ctaXRlbXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21wb25lbnRzL292ZXJmbG93LWl0ZW1zL292ZXJmbG93LWl0ZW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFDSCxnQkFBZ0IsRUFDaEIsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsUUFBUSxFQUNSLFlBQVksRUFDWixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixNQUFNLEVBQ04sS0FBSyxFQUNMLGVBQWUsRUFDZixNQUFNLEVBQ04sV0FBVyxFQUNYLFNBQVMsRUFDVCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFrQ2pEOzs7O0dBSUc7QUFLSCxNQUFNLE9BQU8sc0JBQXNCO0lBSm5DO1FBS0k7Ozs7V0FJRztRQUNNLGdCQUFXLEdBQUcsTUFBTSxDQUE2QyxXQUFXLENBQUMsQ0FBQztLQUMxRjtpSUFQWSxzQkFBc0I7cUhBQXRCLHNCQUFzQjs7MkZBQXRCLHNCQUFzQjtrQkFKbEMsU0FBUzttQkFBQztvQkFDUCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLHFDQUFxQztpQkFDbEQ7O0FBVUQ7O0dBRUc7QUFLSCxNQUFNLE9BQU8sZUFBZTtJQUo1QjtRQUtJOztXQUVHO1FBQ00sT0FBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFD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a0JBNUM1QixTQUFTO2lDQUNNLElBQUksWUFDTixvQkFBb0IsV0FDckIsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUNqQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBaUNULFFBRUs7d0JBQ0YsS0FBSyxFQUFFLG9CQUFvQjtxQkFDOUIsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTaGFyZWRSZXNpemVPYnNlcnZlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vYnNlcnZlcnMvcHJpdmF0ZSc7XG5pbXBvcnQgeyBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICBDb21wb25lbnQsXG4gICAgY29tcHV0ZWQsXG4gICAgY29udGVudENoaWxkLFxuICAgIGNvbnRlbnRDaGlsZHJlbixcbiAgICBEaXJlY3RpdmUsXG4gICAgRWxlbWVudFJlZixcbiAgICBpbmplY3QsXG4gICAgaW5wdXQsXG4gICAgbnVtYmVyQXR0cmlidXRlLFxuICAgIHNpZ25hbCxcbiAgICBUZW1wbGF0ZVJlZixcbiAgICB2aWV3Q2hpbGQsXG4gICAgdmlld0NoaWxkcmVuXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkLCB0b09ic2VydmFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIG1lcmdlLCBza2lwIH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogVGVtcGxhdGUgY29udGV4dCBmb3IgdGhlIGBLYnFPdmVyZmxvd0l0ZW1zUmVzdWx0YCBkaXJlY3RpdmUuXG4gKlxuICogQHNlZSBgS2JxT3ZlcmZsb3dJdGVtc1Jlc3VsdGBcbiAqL1xuZXhwb3J0IHR5cGUgS2JxT3ZlcmZsb3dJdGVtc1Jlc3VsdENvbnRleHQgPSB7XG4gICAgLyoqXG4gICAgICogU2V0IG9mIGhpZGRlbiBpdGVtIElEJ3MuXG4gICAgICpcbiAgICAgKiBFeGFtcGxlOlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxuZy10ZW1wbGF0ZSBrYnFPdmVyZmxvd0l0ZW1zUmVzdWx0IGxldC1oaWRkZW5JdGVtSURzPlxuICAgICAqICB7eyBoaWRkZW5JdGVtSURzLnNpemUgfX1cbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYGBcbiAgICAgKi9cbiAgICAkaW1wbGljaXQ6IFJlYWRvbmx5U2V0PHVua25vd24+O1xuICAgIC8qKlxuICAgICAqIFNldCBvZiBoaWRkZW4gaXRlbSBJRCdzLlxuICAgICAqXG4gICAgICogRXhhbXBsZTpcbiAgICAgKlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8bmctdGVtcGxhdGUga2JxT3ZlcmZsb3dJdGVtc1Jlc3VsdCBsZXQtaGlkZGVuSXRlbUlEcz1cImhpZGRlbkl0ZW1JRHNcIj5cbiAgICAgKiAgQGlmIChoaWRkZW5JdGVtSURzLmhhcyhTT01FX0lEKSkgey4uLn1cbiAgICAgKiA8L25nLXRlbXBsYXRlPlxuICAgICAqIGBgYGBcbiAgICAgKi9cbiAgICBoaWRkZW5JdGVtSURzOiBSZWFkb25seVNldDx1bmtub3duPjtcbn07XG5cbi8qKlxuICogRGlyZWN0aXZlIGZvciBwcm92aWRpbmcgYEticU92ZXJmbG93SXRlbXNSZXN1bHRDb250ZXh0YCB0byB0aGUgYEticU92ZXJmbG93SXRlbXNgIGNvbXBvbmVudC5cbiAqXG4gKiBAc2VlIGBLYnFPdmVyZmxvd0l0ZW1zUmVzdWx0Q29udGV4dGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ25nLXRlbXBsYXRlW2ticU92ZXJmbG93SXRlbXNSZXN1bHRdJ1xufSlcbmV4cG9ydCBjbGFzcyBLYnFPdmVyZmxvd0l0ZW1zUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBUZW1wbGF0ZVJlZiBmb3IgdGhlIG92ZXJmbG93IHJlc3VsdC5cbiAgICAgKlxuICAgICAqIEBkb2NzLXByaXZhdGVcbiAgICAgKi9cbiAgICByZWFkb25seSB0ZW1wbGF0ZVJlZiA9IGluamVjdDxUZW1wbGF0ZVJlZjxLYnFPdmVyZmxvd0l0ZW1zUmVzdWx0Q29udGV4dD4+KFRlbXBsYXRlUmVmKTtcbn1cblxuLyoqXG4gKiBTdHJ1Y3R1cmUgZGlyZWN0aXZlIGZvciBwcm92aWRpbmcgaXRlbXMgdG8gdGhlIGBLYnFPdmVyZmxvd0l0ZW1zYC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ1trYnFPdmVyZmxvd0l0ZW1dJ1xufSlcbmV4cG9ydCBjbGFzcyBLYnFPdmVyZmxvd0l0ZW0ge1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgZm9yIHRoZSBpdGVtLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IGlkID0gaW5wdXQucmVxdWlyZWQoeyBhbGlhczogJ2ticU92ZXJmbG93SXRlbScgfSk7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBpdGVtIGlzIGhpZGRlbi5cbiAgICAgKlxuICAgICAqIEBkb2NzLXByaXZhdGVcbiAgICAgKi9cbiAgICBoaWRkZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFRlbXBsYXRlUmVmIGZvciB0aGUgaXRlbS5cbiAgICAgKlxuICAgICAqIEBkb2NzLXByaXZhdGVcbiAgICAgKi9cbiAgICByZWFkb25seSB0ZW1wbGF0ZVJlZiA9IGluamVjdChUZW1wbGF0ZVJlZik7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGZvciBhdXRvbWF0aWNhbGx5IGhpZGluZyBlbGVtZW50cyB3aXRoIGR5bmFtaWMgYWRhcHRhdGlvbiB0byB0aGUgY29udGFpbmVyIHdpZHRoLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAna2JxLW92ZXJmbG93LWl0ZW1zJyxcbiAgICBpbXBvcnRzOiBbTmdUZW1wbGF0ZU91dGxldF0sXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgQGlmIChyZXZlcnNlT3ZlcmZsb3dPcmRlcigpKSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRlbXBsYXRlXCIgLz5cbiAgICAgICAgfVxuXG4gICAgICAgIEBmb3IgKGl0ZW0gb2YgaXRlbXMoKTsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwia2JxLW92ZXJmbG93LWl0ZW1zX19pdGVtXCJcbiAgICAgICAgICAgICAgICAjaXRlbVJlZlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cIml0ZW0uaGlkZGVuXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Mua2JxLW92ZXJmbG93LWl0ZW1zX19pdGVtX2hpZGRlbl09XCJpdGVtLmhpZGRlblwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJpdGVtLnRlbXBsYXRlUmVmXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmICghcmV2ZXJzZU92ZXJmbG93T3JkZXIoKSkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJ0ZW1wbGF0ZVwiIC8+XG4gICAgICAgIH1cblxuICAgICAgICA8bmctdGVtcGxhdGUgI3RlbXBsYXRlPlxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzPVwia2JxLW92ZXJmbG93LWl0ZW1zX19yZXN1bHRcIlxuICAgICAgICAgICAgICAgICNyZXN1bHRSZWZcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWhpZGRlbl09XCJyZXN1bHRIaWRkZW4oKVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmticS1vdmVyZmxvdy1pdGVtc19fcmVzdWx0X2hpZGRlbl09XCJyZXN1bHRIaWRkZW4oKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJyZXN1bHQoKT8udGVtcGxhdGVSZWYgfHwgbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJyZXN1bHRUZW1wbGF0ZUNvbnRleHQoKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgIGAsXG4gICAgc3R5bGVVcmw6ICcuL292ZXJmbG93LWl0ZW1zLnNjc3MnLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgY2xhc3M6ICdrYnEtb3ZlcmZsb3ctaXRlbXMnXG4gICAgfSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBLYnFPdmVyZmxvd0l0ZW1zIHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGl0ZW1FbGVtZW50UmVmcyA9IHZpZXdDaGlsZHJlbjxzdHJpbmcsIEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PignaXRlbVJlZicsIHsgcmVhZDogRWxlbWVudFJlZiB9KTtcblxuICAgIC8qKlxuICAgICAqIGBLYnFPdmVyZmxvd0l0ZW1gIGRpcmVjdGl2ZSByZWZlcmVuY2VzLlxuICAgICAqXG4gICAgICogQGRvY3MtcHJpdmF0ZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpdGVtcyA9IGNvbnRlbnRDaGlsZHJlbihLYnFPdmVyZmxvd0l0ZW0pO1xuXG4gICAgLyoqXG4gICAgICogYEticU92ZXJmbG93SXRlbXNSZXN1bHRgIGRpcmVjdGl2ZSByZWZlcmVuY2UuXG4gICAgICpcbiAgICAgKiBAZG9jcy1wcml2YXRlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc3VsdCA9IGNvbnRlbnRDaGlsZChLYnFPdmVyZmxvd0l0ZW1zUmVzdWx0KTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzdWx0RWxlbWVudFJlZiA9IHZpZXdDaGlsZDxzdHJpbmcsIEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PigncmVzdWx0UmVmJywgeyByZWFkOiBFbGVtZW50UmVmIH0pO1xuXG4gICAgLyoqXG4gICAgICogVGVtcGxhdGUgY29udGV4dCBmb3IgdGhlIGBLYnFPdmVyZmxvd0l0ZW1zUmVzdWx0YCBkaXJlY3RpdmUuXG4gICAgICpcbiAgICAgKiBAZG9jcy1wcml2YXRlXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlc3VsdFRlbXBsYXRlQ29udGV4dCA9IGNvbXB1dGVkPEticU92ZXJmbG93SXRlbXNSZXN1bHRDb250ZXh0PigoKSA9PiB7XG4gICAgICAgIGNvbnN0IGhpZGRlbkl0ZW1JRHMgPSB0aGlzLmhpZGRlbkl0ZW1JRHMoKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICRpbXBsaWNpdDogaGlkZGVuSXRlbUlEcyxcbiAgICAgICAgICAgIGhpZGRlbkl0ZW1JRHM6IGhpZGRlbkl0ZW1JRHNcbiAgICAgICAgfTtcbiAgICB9KTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgaGlkZGVuSXRlbUlEcyA9IHNpZ25hbDxSZWFkb25seVNldDx1bmtub3duPj4obmV3IFNldChbXSkpO1xuXG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgb3ZlcmZsb3cgcmVzdWx0IGlzIGhpZGRlbi5cbiAgICAgKlxuICAgICAqIEBkb2NzLXByaXZhdGVcbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzdWx0SGlkZGVuID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5oaWRkZW5JdGVtSURzKCkuc2l6ZSA9PT0gMCk7XG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBvdmVyZmxvdyBvcmRlciBzaG91bGQgYmUgcmV2ZXJzZWQuXG4gICAgICogQWxzbyBjaGFuZ2VzIHRoZSBwb3NpdGlvbiBvZiB0aGUgYHJlc3VsdFRlbXBsYXRlUmVmYC5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICovXG4gICAgcmVhZG9ubHkgcmV2ZXJzZU92ZXJmbG93T3JkZXIgPSBpbnB1dChmYWxzZSwgeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSk7XG5cbiAgICAvKipcbiAgICAgKiBEZWJvdW5jZSB0aW1lIGZvciByZWNhbGN1bGF0aW5nIGl0ZW1zIHZpc2liaWxpdHkuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAxMDBcbiAgICAgKi9cbiAgICByZWFkb25seSBkZWJvdW5jZVRpbWUgPSBpbnB1dCgxMDAsIHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSk7XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsZW1lbnRSZWYgPSBpbmplY3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+KEVsZW1lbnRSZWYpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzaXplT2JzZXJ2ZXIgPSBpbmplY3QoU2hhcmVkUmVzaXplT2JzZXJ2ZXIpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2hhbmdlRGV0ZWN0b3JSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgdG9PYnNlcnZhYmxlKHRoaXMuaXRlbXMpLFxuICAgICAgICAgICAgdG9PYnNlcnZhYmxlKHRoaXMucmV2ZXJzZU92ZXJmbG93T3JkZXIpLnBpcGUoc2tpcCgxKSksXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZSgpKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuaXRlbXMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUl0ZW1zVmlzaWJpbGl0eShcbiAgICAgICAgICAgICAgICAgICAgaXRlbXMsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXRlbUVsZW1lbnRSZWZzKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmV2ZXJzZU92ZXJmbG93T3JkZXIoKSxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRFbGVtZW50UmVmKCksXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGRlbkl0ZW1JRHMuc2V0KG5ldyBTZXQoaXRlbXMuZmlsdGVyKHRoaXMuaXNIaWRkZW5JdGVtKS5tYXAoKHsgaWQgfSkgPT4gaWQoKSkpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBpdGVtcyB2aXNpYmlsaXR5LCBiYXNlZCBvbiB0aGUgY29udGFpbmVyIHdpZHRoIGFuZCB0aGUgYHJldmVyc2VPdmVyZmxvd09yZGVyYCBmbGFnLlxuICAgICAqL1xuICAgIHByaXZhdGUgdXBkYXRlSXRlbXNWaXNpYmlsaXR5KFxuICAgICAgICBpdGVtczogcmVhZG9ubHkgS2JxT3ZlcmZsb3dJdGVtW10sXG4gICAgICAgIGl0ZW1FbGVtZW50UmVmczogcmVhZG9ubHkgRWxlbWVudFJlZjxIVE1MRWxlbWVudD5bXSxcbiAgICAgICAgcmV2ZXJzZU92ZXJmbG93T3JkZXI6IGJvb2xlYW4sXG4gICAgICAgIHJlc3VsdEVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+IHwgdW5kZWZpbmVkLFxuICAgICAgICB7IG9mZnNldFdpZHRoOiB0b3RhbFdpZHRoIH06IEhUTUxFbGVtZW50XG4gICAgKTogdm9pZCB7XG4gICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGl0ZW0uaGlkZGVuID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgaXRlbXNXaWR0aCA9IGl0ZW1zLnJlZHVjZSgod2lkdGgsIF8sIGluZGV4KSA9PiB3aWR0aCArIGl0ZW1FbGVtZW50UmVmc1tpbmRleF0ubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCwgMCk7XG4gICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSByZXZlcnNlT3ZlcmZsb3dPcmRlciA/IDAgOiBpdGVtcy5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCBlbmRJbmRleCA9IHJldmVyc2VPdmVyZmxvd09yZGVyID8gaXRlbXMubGVuZ3RoIDogLTE7XG4gICAgICAgIGNvbnN0IHN0ZXAgPSByZXZlcnNlT3ZlcmZsb3dPcmRlciA/IDEgOiAtMTtcbiAgICAgICAgY29uc3QgcmVzdWx0V2lkdGggPSByZXN1bHRFbGVtZW50UmVmPy5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIHx8IDA7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gc3RhcnRJbmRleDsgaW5kZXggIT09IGVuZEluZGV4OyBpbmRleCArPSBzdGVwKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gaXRlbXNbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFdpZHRoID0gaXRlbUVsZW1lbnRSZWZzW2luZGV4XS5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgY29uc3QgX3Jlc3VsdFdpZHRoID0gaXRlbXMuc29tZSh0aGlzLmlzSGlkZGVuSXRlbSkgPyByZXN1bHRXaWR0aCA6IDA7XG4gICAgICAgICAgICBpZiAoaXRlbXNXaWR0aCArIF9yZXN1bHRXaWR0aCA+IHRvdGFsV2lkdGgpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50LmhpZGRlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgaXRlbXNXaWR0aCAtPSBjdXJyZW50V2lkdGg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzRWRnZUVsZW1lbnQgPSByZXZlcnNlT3ZlcmZsb3dPcmRlciA/IGluZGV4ID09PSAwIDogaW5kZXggPT09IGl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgICAgICAgICAgICAgY29uc3QgX3Jlc3VsdFdpZHRoID0gaXNFZGdlRWxlbWVudCA/IDAgOiByZXN1bHRXaWR0aDtcbiAgICAgICAgICAgICAgICBpZiAoaXRlbXNXaWR0aCArIGN1cnJlbnRXaWR0aCArIF9yZXN1bHRXaWR0aCA8PSB0b3RhbFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuaGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zV2lkdGggKz0gY3VycmVudFdpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIGl0ZW0gaXMgaGlkZGVuLlxuICAgICAqL1xuICAgIHByaXZhdGUgaXNIaWRkZW5JdGVtID0gKHsgaGlkZGVuIH06IEticU92ZXJmbG93SXRlbSkgPT4gaGlkZGVuO1xufVxuIl19