@ngrdt/menu 0.0.11 → 0.0.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +157 -3
- package/esm2022/index.mjs +2 -2
- package/esm2022/lib/menu/rdt-menu.component.mjs +57 -32
- package/esm2022/lib/menu-bar/rdt-menu-bar.component.mjs +13 -6
- package/esm2022/lib/menu-base/rdt-menu-base.component.mjs +106 -31
- package/esm2022/lib/menu-overlay/rdt-menu-overlay.component.mjs +36 -33
- package/esm2022/lib/private-models.mjs +8 -1
- package/esm2022/lib/rdt-menu.module.mjs +5 -5
- package/fesm2022/ngrdt-menu.mjs +309 -194
- package/fesm2022/ngrdt-menu.mjs.map +1 -1
- package/index.d.ts +1 -1
- package/lib/menu/rdt-menu.component.d.ts +15 -9
- package/lib/menu-bar/rdt-menu-bar.component.d.ts +3 -0
- package/lib/menu-base/rdt-menu-base.component.d.ts +24 -6
- package/lib/menu-overlay/rdt-menu-overlay.component.d.ts +9 -6
- package/lib/private-models.d.ts +17 -7
- package/package.json +2 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DOCUMENT } from '@angular/common';
|
|
2
|
-
import { booleanAttribute, ChangeDetectorRef, DestroyRef, Directive, ElementRef, EnvironmentInjector, HostBinding, HostListener, inject, Input, QueryList, Renderer2, ViewChildren, } from '@angular/core';
|
|
2
|
+
import { booleanAttribute, ChangeDetectorRef, DestroyRef, Directive, ElementRef, EnvironmentInjector, HostBinding, HostListener, inject, Input, numberAttribute, QueryList, Renderer2, ViewChildren, } from '@angular/core';
|
|
3
3
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
4
4
|
import { Router } from '@angular/router';
|
|
5
5
|
import { RdtRouterService } from '@ngrdt/router';
|
|
@@ -8,6 +8,7 @@ import { KB_CODE, RdtStringUtils, } from '@ngrdt/utils';
|
|
|
8
8
|
import { animationFrameScheduler, fromEvent, Subscription, throttleTime, } from 'rxjs';
|
|
9
9
|
import { RdtMenuOverlayComponent } from '../menu-overlay/rdt-menu-overlay.component';
|
|
10
10
|
import { DEFAULT_MENU_HORIZONTAL_DIR, DEFAULT_MENU_VERTICAL_DIR, RDT_MENU_MARGIN_BOTTOM_PROPERTY_NAME, RDT_MENU_MARGIN_LEFT_PROPERTY_NAME, RDT_MENU_MARGIN_RIGHT_PROPERTY_NAME, RDT_MENU_MARGIN_TOP_PROPERTY_NAME, RdtMenuShortcutMode, } from '../models';
|
|
11
|
+
import { RdtMenuExpandSource, } from '../private-models';
|
|
11
12
|
import { findNextItemWithPrefix, FOCUS_VISIBLE, getChildRoutesMap, getMenuItemsShortcuts, menuItemHasChildren, menuItemHasRoute, } from '../utils';
|
|
12
13
|
import * as i0 from "@angular/core";
|
|
13
14
|
export class RdtMenuBaseComponent {
|
|
@@ -18,8 +19,9 @@ export class RdtMenuBaseComponent {
|
|
|
18
19
|
// OPEN_SUBMENU will open its submenu and put focus on the first item in it
|
|
19
20
|
// If item has command or routerLink, it will always be activated and everything closed
|
|
20
21
|
shortcutMode = RdtMenuShortcutMode.OPEN_SUBMENU;
|
|
21
|
-
closeOnFocusOut =
|
|
22
|
+
closeOnFocusOut = false;
|
|
22
23
|
openOnHover = false;
|
|
24
|
+
hitboxMargin = 10;
|
|
23
25
|
cd = inject(ChangeDetectorRef);
|
|
24
26
|
destroyRef = inject(DestroyRef);
|
|
25
27
|
rdtRouter = inject(RdtRouterService);
|
|
@@ -32,7 +34,7 @@ export class RdtMenuBaseComponent {
|
|
|
32
34
|
children;
|
|
33
35
|
focusableElements;
|
|
34
36
|
classes = 'rdt-menu-base';
|
|
35
|
-
|
|
37
|
+
expandedChild = null;
|
|
36
38
|
autofocusSubmenuItem = null;
|
|
37
39
|
parsedItems;
|
|
38
40
|
get clientSize() {
|
|
@@ -43,6 +45,10 @@ export class RdtMenuBaseComponent {
|
|
|
43
45
|
return this._bodyMargin;
|
|
44
46
|
}
|
|
45
47
|
_bodyMargin;
|
|
48
|
+
get buttonContainerRect() {
|
|
49
|
+
return this._buttonContainerRect;
|
|
50
|
+
}
|
|
51
|
+
_buttonContainerRect;
|
|
46
52
|
allParsedItems;
|
|
47
53
|
childRoutesMap = new Map();
|
|
48
54
|
shortcutSub = new Subscription();
|
|
@@ -50,8 +56,8 @@ export class RdtMenuBaseComponent {
|
|
|
50
56
|
keyActions = {
|
|
51
57
|
[KB_CODE.ARROW.LEFT]: (index) => this.focusPrevItem(index),
|
|
52
58
|
[KB_CODE.ARROW.RIGHT]: (index) => this.focusNextItem(index),
|
|
53
|
-
[KB_CODE.ARROW.DOWN]: (index) => this.openSubmenu(index, 'first'),
|
|
54
|
-
[KB_CODE.ARROW.UP]: (index) => this.openSubmenu(index, 'last'),
|
|
59
|
+
[KB_CODE.ARROW.DOWN]: (index) => this.openSubmenu(index, 'first', RdtMenuExpandSource.Shortcut),
|
|
60
|
+
[KB_CODE.ARROW.UP]: (index) => this.openSubmenu(index, 'last', RdtMenuExpandSource.Shortcut),
|
|
55
61
|
[KB_CODE.HOME]: () => this.focusItem(0),
|
|
56
62
|
[KB_CODE.END]: () => this.focusItem(this.parsedItems.length - 1),
|
|
57
63
|
[KB_CODE.ENTER]: (index) => this.invokeItemClickByIndex(index),
|
|
@@ -86,35 +92,36 @@ export class RdtMenuBaseComponent {
|
|
|
86
92
|
});
|
|
87
93
|
}
|
|
88
94
|
closeSubmenus(focusExpanded = false) {
|
|
89
|
-
if (focusExpanded && this.
|
|
90
|
-
this.focusItem(this.
|
|
95
|
+
if (focusExpanded && this.expandedChild) {
|
|
96
|
+
this.focusItem(this.expandedChild.item);
|
|
91
97
|
}
|
|
92
|
-
this.
|
|
98
|
+
this.expandedChild = null;
|
|
93
99
|
this.cd.markForCheck();
|
|
94
100
|
}
|
|
95
101
|
onItemClick(item) {
|
|
96
|
-
if (menuItemHasChildren(item) && this.
|
|
102
|
+
if ((menuItemHasChildren(item) && this.expandedChild?.item !== item) ||
|
|
103
|
+
(this.openOnHover &&
|
|
104
|
+
this.expandedChild?.src === RdtMenuExpandSource.Hover)) {
|
|
97
105
|
this.autofocusSubmenuItem = null;
|
|
98
|
-
this.
|
|
106
|
+
this.expandedChild = { item, src: RdtMenuExpandSource.Click };
|
|
99
107
|
}
|
|
100
108
|
else {
|
|
101
|
-
this.
|
|
109
|
+
this.expandedChild = null;
|
|
102
110
|
}
|
|
103
111
|
if (typeof item.command === 'function') {
|
|
104
112
|
item.command();
|
|
105
113
|
}
|
|
106
114
|
}
|
|
107
115
|
onItemPointerEnter(item) {
|
|
108
|
-
if (this.openOnHover
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
this.expanded = null;
|
|
116
|
+
if (this.openOnHover) {
|
|
117
|
+
if (menuItemHasChildren(item) &&
|
|
118
|
+
this.expandedChild?.src !== RdtMenuExpandSource.Click) {
|
|
119
|
+
this.autofocusSubmenuItem = null;
|
|
120
|
+
this.expandedChild = { item, src: RdtMenuExpandSource.Hover };
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
this.expandedChild = null;
|
|
124
|
+
}
|
|
118
125
|
}
|
|
119
126
|
}
|
|
120
127
|
onKeyDown(itemIndex, event) {
|
|
@@ -203,12 +210,12 @@ export class RdtMenuBaseComponent {
|
|
|
203
210
|
}
|
|
204
211
|
this.invokeItemClick(item);
|
|
205
212
|
}
|
|
206
|
-
openSubmenu(itemIndex, visibleFocus) {
|
|
213
|
+
openSubmenu(itemIndex, visibleFocus, src) {
|
|
207
214
|
if (itemIndex < this.parsedItems.length &&
|
|
208
215
|
menuItemHasChildren(this.parsedItems[itemIndex])) {
|
|
209
216
|
const item = this.parsedItems[itemIndex];
|
|
210
217
|
this.autofocusSubmenuItem = visibleFocus;
|
|
211
|
-
this.
|
|
218
|
+
this.expandedChild = { item, src };
|
|
212
219
|
}
|
|
213
220
|
}
|
|
214
221
|
focusItem(item) {
|
|
@@ -242,13 +249,27 @@ export class RdtMenuBaseComponent {
|
|
|
242
249
|
elRef.nativeElement.focus();
|
|
243
250
|
}
|
|
244
251
|
}
|
|
252
|
+
onPointerMove(event) {
|
|
253
|
+
if (this.openOnHover && this.expandedChild) {
|
|
254
|
+
const hitboxes = this.getHitboxes();
|
|
255
|
+
const isInside = hitboxes.some((hitbox) => this.isPointerInsideHitbox(hitbox.rect, event));
|
|
256
|
+
for (let i = hitboxes.length - 1; i >= 0; i--) {
|
|
257
|
+
const hitbox = hitboxes[i];
|
|
258
|
+
if (!hitbox.fixed && !isInside) {
|
|
259
|
+
hitbox.close();
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
245
265
|
// Closes menu if user navigates outside it using Tab.
|
|
246
266
|
checkActiveElement(event) {
|
|
247
|
-
if (this.closeOnFocusOut) {
|
|
267
|
+
if (this.closeOnFocusOut && !this.openOnHover) {
|
|
268
|
+
console.log('focusout', event);
|
|
248
269
|
const thisEl = this.elRef.nativeElement;
|
|
249
270
|
const target = event.relatedTarget;
|
|
250
271
|
if (!(target instanceof HTMLElement) || !thisEl.contains(target)) {
|
|
251
|
-
this.
|
|
272
|
+
this.expandedChild = null;
|
|
252
273
|
}
|
|
253
274
|
}
|
|
254
275
|
}
|
|
@@ -260,6 +281,7 @@ export class RdtMenuBaseComponent {
|
|
|
260
281
|
}
|
|
261
282
|
}
|
|
262
283
|
measure() {
|
|
284
|
+
this.measureButtonContainer();
|
|
263
285
|
this.measureClientSize();
|
|
264
286
|
this.readMargin();
|
|
265
287
|
}
|
|
@@ -282,6 +304,15 @@ export class RdtMenuBaseComponent {
|
|
|
282
304
|
height: this.document.body.clientHeight,
|
|
283
305
|
};
|
|
284
306
|
}
|
|
307
|
+
measureButtonContainer() {
|
|
308
|
+
const el = this.buttonContainer;
|
|
309
|
+
if (el) {
|
|
310
|
+
this._buttonContainerRect = el.getBoundingClientRect();
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
this._buttonContainerRect = undefined;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
285
316
|
listenWindowResize() {
|
|
286
317
|
fromEvent(window, 'resize')
|
|
287
318
|
.pipe(throttleTime(0, animationFrameScheduler, { trailing: true }), takeUntilDestroyed(this.destroyRef))
|
|
@@ -325,10 +356,10 @@ export class RdtMenuBaseComponent {
|
|
|
325
356
|
}
|
|
326
357
|
}
|
|
327
358
|
else {
|
|
328
|
-
this.activateItemRecursively(path);
|
|
359
|
+
this.activateItemRecursively(path, RdtMenuExpandSource.Shortcut);
|
|
329
360
|
}
|
|
330
361
|
}
|
|
331
|
-
activateItemRecursively(path) {
|
|
362
|
+
activateItemRecursively(path, src) {
|
|
332
363
|
const children = [...path];
|
|
333
364
|
if (this.shortcutMode === RdtMenuShortcutMode.OPEN_SUBMENU) {
|
|
334
365
|
const last = children[children.length - 1];
|
|
@@ -338,17 +369,55 @@ export class RdtMenuBaseComponent {
|
|
|
338
369
|
}
|
|
339
370
|
const thisItem = children.shift();
|
|
340
371
|
if (children.length > 0) {
|
|
341
|
-
this.
|
|
372
|
+
this.expandedChild = { item: thisItem, src };
|
|
342
373
|
const overlay = this.children.find((child) => child.item === thisItem);
|
|
343
374
|
overlay.focusItemRecursively(children);
|
|
344
375
|
}
|
|
345
376
|
else {
|
|
346
|
-
this.
|
|
377
|
+
this.expandedChild = null;
|
|
347
378
|
this.focusItem(thisItem);
|
|
348
379
|
}
|
|
349
380
|
}
|
|
381
|
+
isPointerInsideHitbox(hitbox, event) {
|
|
382
|
+
const rect = hitbox;
|
|
383
|
+
const x = event.clientX;
|
|
384
|
+
const y = event.clientY;
|
|
385
|
+
return (x >= rect.left - this.hitboxMargin &&
|
|
386
|
+
x <= rect.right + this.hitboxMargin &&
|
|
387
|
+
y >= rect.top - this.hitboxMargin &&
|
|
388
|
+
y <= rect.bottom + this.hitboxMargin);
|
|
389
|
+
}
|
|
390
|
+
getHitboxes() {
|
|
391
|
+
const boxes = this.getOpenMenuBoundingBoxes();
|
|
392
|
+
const buttonContainerRect = this.buttonContainerRect;
|
|
393
|
+
if (buttonContainerRect) {
|
|
394
|
+
boxes.push({ rect: buttonContainerRect, fixed: true, close: () => { } });
|
|
395
|
+
}
|
|
396
|
+
return boxes;
|
|
397
|
+
}
|
|
398
|
+
getOpenMenuBoundingBoxes() {
|
|
399
|
+
const boxes = [];
|
|
400
|
+
this.children.forEach((overlay) => {
|
|
401
|
+
this.getOpenMenuBoundingBoxesRec(overlay, boxes);
|
|
402
|
+
});
|
|
403
|
+
return boxes;
|
|
404
|
+
}
|
|
405
|
+
getOpenMenuBoundingBoxesRec(overlay, boxes) {
|
|
406
|
+
if (overlay.expanded) {
|
|
407
|
+
let someByClick = false;
|
|
408
|
+
overlay.children.forEach((child) => (someByClick ||= this.getOpenMenuBoundingBoxesRec(child, boxes)));
|
|
409
|
+
const fixed = someByClick || overlay.selfExpandSrc === RdtMenuExpandSource.Click;
|
|
410
|
+
boxes.push({
|
|
411
|
+
rect: overlay.box,
|
|
412
|
+
fixed: fixed,
|
|
413
|
+
close: () => overlay.closeSelf(),
|
|
414
|
+
});
|
|
415
|
+
return fixed;
|
|
416
|
+
}
|
|
417
|
+
return false;
|
|
418
|
+
}
|
|
350
419
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtMenuBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
351
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.7", type: RdtMenuBaseComponent, inputs: { preferredVerticalDir: "preferredVerticalDir", preferredHorizontalDir: "preferredHorizontalDir", shortcutMode: "shortcutMode", closeOnFocusOut: ["closeOnFocusOut", "closeOnFocusOut", booleanAttribute], openOnHover: ["openOnHover", "openOnHover", booleanAttribute] }, host: { listeners: { "window:focusout": "checkActiveElement($event)", "document:click": "onDocumentClick($event)" }, properties: { "class": "this.classes" } }, viewQueries: [{ propertyName: "children", predicate: RdtMenuOverlayComponent, descendants: true }, { propertyName: "focusableElements", predicate: ["focusableItem"], descendants: true }], usesOnChanges: true, ngImport: i0 });
|
|
420
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.7", type: RdtMenuBaseComponent, inputs: { preferredVerticalDir: "preferredVerticalDir", preferredHorizontalDir: "preferredHorizontalDir", shortcutMode: "shortcutMode", closeOnFocusOut: ["closeOnFocusOut", "closeOnFocusOut", booleanAttribute], openOnHover: ["openOnHover", "openOnHover", booleanAttribute], hitboxMargin: ["hitboxMargin", "hitboxMargin", numberAttribute] }, host: { listeners: { "window:pointermove": "onPointerMove($event)", "window:focusout": "checkActiveElement($event)", "document:click": "onDocumentClick($event)" }, properties: { "class": "this.classes" } }, viewQueries: [{ propertyName: "children", predicate: RdtMenuOverlayComponent, descendants: true }, { propertyName: "focusableElements", predicate: ["focusableItem"], descendants: true }], usesOnChanges: true, ngImport: i0 });
|
|
352
421
|
}
|
|
353
422
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtMenuBaseComponent, decorators: [{
|
|
354
423
|
type: Directive
|
|
@@ -364,6 +433,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
364
433
|
}], openOnHover: [{
|
|
365
434
|
type: Input,
|
|
366
435
|
args: [{ transform: booleanAttribute }]
|
|
436
|
+
}], hitboxMargin: [{
|
|
437
|
+
type: Input,
|
|
438
|
+
args: [{ transform: numberAttribute }]
|
|
367
439
|
}], children: [{
|
|
368
440
|
type: ViewChildren,
|
|
369
441
|
args: [RdtMenuOverlayComponent]
|
|
@@ -373,6 +445,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
373
445
|
}], classes: [{
|
|
374
446
|
type: HostBinding,
|
|
375
447
|
args: ['class']
|
|
448
|
+
}], onPointerMove: [{
|
|
449
|
+
type: HostListener,
|
|
450
|
+
args: ['window:pointermove', ['$event']]
|
|
376
451
|
}], checkActiveElement: [{
|
|
377
452
|
type: HostListener,
|
|
378
453
|
args: ['window:focusout', ['$event']]
|
|
@@ -380,4 +455,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
380
455
|
type: HostListener,
|
|
381
456
|
args: ['document:click', ['$event']]
|
|
382
457
|
}] } });
|
|
383
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LW1lbnUtYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9AbmdyZHQvbWVudS9zcmMvbGliL21lbnUtYmFzZS9yZHQtbWVudS1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVMLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsVUFBVSxFQUNWLFNBQVMsRUFDVCxVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxTQUFTLEVBQ1QsU0FBUyxFQUVULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFZLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBZSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxPQUFPLEVBRVAsY0FBYyxHQUVmLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEdBQ2IsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNyRixPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLHlCQUF5QixFQUN6QixvQ0FBb0MsRUFDcEMsa0NBQWtDLEVBQ2xDLG1DQUFtQyxFQUNuQyxpQ0FBaUMsRUFDakMsbUJBQW1CLEdBQ3BCLE1BQU0sV0FBVyxDQUFDO0FBRW5CLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsYUFBYSxFQUNiLGlCQUFp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QUUsZ0JBQWdCLEVBQUU7Z0JBSXRDLFdBQVc7c0JBRFYsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFjNUIsUUFBUTtzQkFEakIsWUFBWTt1QkFBQyx1QkFBdUI7Z0JBSTNCLGlCQUFpQjtzQkFEMUIsWUFBWTt1QkFBQyxlQUFlO2dCQUk3QixPQUFPO3NCQUROLFdBQVc7dUJBQUMsT0FBTztnQkEwUVYsa0JBQWtCO3NCQUQzQixZQUFZO3VCQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVlqQyxlQUFlO3NCQUR4QixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBEZXN0cm95UmVmLFxyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIEVudmlyb25tZW50SW5qZWN0b3IsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIGluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25Jbml0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBSZW5kZXJlcjIsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgUmR0Um91dGUsIFJkdFJvdXRlclNlcnZpY2UgfSBmcm9tICdAbmdyZHQvcm91dGVyJztcclxuaW1wb3J0IHsgUmR0U2hvcnRjdXQsIFJkdFNob3J0Y3V0U2VydmljZSB9IGZyb20gJ0BuZ3JkdC9zaG9ydGN1dHMnO1xyXG5pbXBvcnQge1xyXG4gIEtCX0NPREUsXHJcbiAgUmR0SG9yaXpvbnRhbERpcmVjdGlvbixcclxuICBSZHRTdHJpbmdVdGlscyxcclxuICBSZHRWZXJ0aWNhbERpcmVjdGlvbixcclxufSBmcm9tICdAbmdyZHQvdXRpbHMnO1xyXG5pbXBvcnQge1xyXG4gIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLFxyXG4gIGZyb21FdmVudCxcclxuICBTdWJzY3JpcHRpb24sXHJcbiAgdGhyb3R0bGVUaW1lLFxyXG59IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBSZHRNZW51T3ZlcmxheUNvbXBvbmVudCB9IGZyb20gJy4uL21lbnUtb3ZlcmxheS9yZHQtbWVudS1vdmVybGF5LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgREVGQVVMVF9NRU5VX0hPUklaT05UQUxfRElSLFxyXG4gIERFRkFVTFRfTUVOVV9WRVJUSUNBTF9ESVIsXHJcbiAgUkRUX01FTlVfTUFSR0lOX0JPVFRPTV9QUk9QRVJUWV9OQU1FLFxyXG4gIFJEVF9NRU5VX01BUkdJTl9MRUZUX1BST1BFUlRZX05BTUUsXHJcbiAgUkRUX01FTlVfTUFSR0lOX1JJR0hUX1BST1BFUlRZX05BTUUsXHJcbiAgUkRUX01FTlVfTUFSR0lOX1RPUF9QUk9QRVJUWV9OQU1FLFxyXG4gIFJkdE1lbnVTaG9ydGN1dE1vZGUsXHJcbn0gZnJvbSAnLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgUGFyc2VkUmR0TWVudUl0ZW0gfSBmcm9tICcuLi9wcml2YXRlLW1vZGVscyc7XHJcbmltcG9ydCB7XHJcbiAgZmluZE5leHRJdGVtV2l0aFByZWZpeCxcclxuICBGT0NVU19WSVNJQkxFLFxyXG4gIGdldENoaWxkUm91dGVzTWFwLFxyXG4gIGdldE1lbnVJdGVtc1Nob3J0Y3V0cyxcclxuICBtZW51SXRlbUhhc0NoaWxkcmVuLFxyXG4gIG1lbnVJdGVtSGFzUm91dGUsXHJcbiAgUGFyc2VkUmR0TWVudUl0ZW1XaXRoU2hvcnRjdXQsXHJcbiAgU2l6ZSxcclxufSBmcm9tICcuLi91dGlscyc7XHJcblxyXG5ARGlyZWN0aXZlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJkdE1lbnVCYXNlQ29tcG9uZW50XHJcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdFxyXG57XHJcbiAgQElucHV0KClcclxuICBwcmVmZXJyZWRWZXJ0aWNhbERpcjogUmR0VmVydGljYWxEaXJlY3Rpb24gPSBERUZBVUxUX01FTlVfVkVSVElDQUxfRElSO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHByZWZlcnJlZEhvcml6b250YWxEaXI6IFJkdEhvcml6b250YWxEaXJlY3Rpb24gPSBERUZBVUxUX01FTlVfSE9SSVpPTlRBTF9ESVI7XHJcblxyXG4gIC8vIE1vZGUgb25seSBtYXR0ZXJzIGlmIGl0ZW0gaGFzIHNob3J0Y3V0IGFuZCBvbmx5IGNoaWxkcmVuLCBubyBjb21tYW5kIG5vciByb3V0ZXJMaW5rXHJcbiAgLy8gRk9DVVNfSVRFTSB3aWxsIHB1dCBmb2N1cyBvbiBpdGVtIHdpdGggc2hvcnRjdXRcclxuICAvLyBPUEVOX1NVQk1FTlUgd2lsbCBvcGVuIGl0cyBzdWJtZW51IGFuZCBwdXQgZm9jdXMgb24gdGhlIGZpcnN0IGl0ZW0gaW4gaXRcclxuICAvLyBJZiBpdGVtIGhhcyBjb21tYW5kIG9yIHJvdXRlckxpbmssIGl0IHdpbGwgYWx3YXlzIGJlIGFjdGl2YXRlZCBhbmQgZXZlcnl0aGluZyBjbG9zZWRcclxuICBASW5wdXQoKVxyXG4gIHNob3J0Y3V0TW9kZTogJ2ZvY3VzLWl0ZW0nIHwgJ29wZW4tc3VibWVudScgPVxyXG4gICAgUmR0TWVudVNob3J0Y3V0TW9kZS5PUEVOX1NVQk1FTlU7XHJcblxyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxyXG4gIGNsb3NlT25Gb2N1c091dCA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxyXG4gIG9wZW5PbkhvdmVyID0gZmFsc2U7XHJcblxyXG4gIHJlYWRvbmx5IGNkID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcclxuICByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSByZHRSb3V0ZXIgPSBpbmplY3QoUmR0Um91dGVyU2VydmljZSk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVsUmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiA9IGluamVjdChFbGVtZW50UmVmKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvcnRjdXRTZXJ2aWNlID0gaW5qZWN0KFJkdFNob3J0Y3V0U2VydmljZSk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGluamVjdG9yID0gaW5qZWN0KEVudmlyb25tZW50SW5qZWN0b3IpO1xyXG5cclxuICBAVmlld0NoaWxkcmVuKFJkdE1lbnVPdmVybGF5Q29tcG9uZW50KVxyXG4gIHByb3RlY3RlZCBjaGlsZHJlbiE6IFF1ZXJ5TGlzdDxSZHRNZW51T3ZlcmxheUNvbXBvbmVudD47XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oJ2ZvY3VzYWJsZUl0ZW0nKVxyXG4gIHByb3RlY3RlZCBmb2N1c2FibGVFbGVtZW50cyE6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj47XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxyXG4gIGNsYXNzZXMgPSAncmR0LW1lbnUtYmFzZSc7XHJcblxyXG4gIHByb3RlY3RlZCBleHBhbmRlZDogUGFyc2VkUmR0TWVudUl0ZW0gfCBudWxsID0gbnVsbDtcclxuICBwcm90ZWN0ZWQgYXV0b2ZvY3VzU3VibWVudUl0ZW06ICdmaXJzdCcgfCAnbGFzdCcgfCBudWxsID0gbnVsbDtcclxuICBwcm90ZWN0ZWQgcGFyc2VkSXRlbXMhOiBQYXJzZWRSZHRNZW51SXRlbVtdO1xyXG5cclxuICBnZXQgY2xpZW50U2l6ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9jbGllbnRTaXplO1xyXG4gIH1cclxuICBwcml2YXRlIF9jbGllbnRTaXplITogU2l6ZTtcclxuXHJcbiAgZ2V0IGJvZHlNYXJnaW4oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYm9keU1hcmdpbjtcclxuICB9XHJcbiAgcHJpdmF0ZSBfYm9keU1hcmdpbiE6IHtcclxuICAgIHRvcDogbnVtYmVyO1xyXG4gICAgYm90dG9tOiBudW1iZXI7XHJcbiAgICBsZWZ0OiBudW1iZXI7XHJcbiAgICByaWdodDogbnVtYmVyO1xyXG4gIH07XHJcblxyXG4gIHByb3RlY3RlZCBhbGxQYXJzZWRJdGVtcyE6IFBhcnNlZFJkdE1lbnVJdGVtW107XHJcbiAgcHJvdGVjdGVkIGNoaWxkUm91dGVzTWFwOiBNYXA8UGFyc2VkUmR0TWVudUl0ZW0sIHN0cmluZ1tdW10+ID0gbmV3IE1hcCgpO1xyXG4gIHByb3RlY3RlZCBzaG9ydGN1dFN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICBwcm90ZWN0ZWQgc2hvcnRjdXRNYXA6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFJkdE1lbnVJdGVtW10+ID0ge307XHJcblxyXG4gIHJlYWRvbmx5IGtleUFjdGlvbnMgPSB7XHJcbiAgICBbS0JfQ09ERS5BUlJPVy5MRUZUXTogKGluZGV4OiBudW1iZXIpID0+IHRoaXMuZm9jdXNQcmV2SXRlbShpbmRleCksXHJcbiAgICBbS0JfQ09ERS5BUlJPVy5SSUdIVF06IChpbmRleDogbnVtYmVyKSA9PiB0aGlzLmZvY3VzTmV4dEl0ZW0oaW5kZXgpLFxyXG4gICAgW0tCX0NPREUuQVJST1cuRE9XTl06IChpbmRleDogbnVtYmVyKSA9PiB0aGlzLm9wZW5TdWJtZW51KGluZGV4LCAnZmlyc3QnKSxcclxuICAgIFtLQl9DT0RFLkFSUk9XLlVQXTogKGluZGV4OiBudW1iZXIpID0+IHRoaXMub3BlblN1Ym1lbnUoaW5kZXgsICdsYXN0JyksXHJcbiAgICBbS0JfQ09ERS5IT01FXTogKCkgPT4gdGhpcy5mb2N1c0l0ZW0oMCksXHJcbiAgICBbS0JfQ09ERS5FTkRdOiAoKSA9PiB0aGlzLmZvY3VzSXRlbSh0aGlzLnBhcnNlZEl0ZW1zLmxlbmd0aCAtIDEpLFxyXG4gICAgW0tCX0NPREUuRU5URVJdOiAoaW5kZXg6IG51bWJlcikgPT4gdGhpcy5pbnZva2VJdGVtQ2xpY2tCeUluZGV4KGluZGV4KSxcclxuICAgIFtLQl9DT0RFLlNQQUNFQkFSXTogKGluZGV4OiBudW1iZXIpID0+IHRoaXMuaW52b2tlSXRlbUNsaWNrQnlJbmRleChpbmRleCksXHJcbiAgfTtcclxuXHJcbiAgLy8gUmV0dXJucyBhbGwgcm91dGVzIGFzb2NpYXRlZCB3aXRoIGl0ZW0gb3IgaXRzIHN1Yml0ZW1zLlxyXG4gIGdldENoaWxkUm91dGVzKGl0ZW06IFBhcnNlZFJkdE1lbnVJdGVtKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGlsZFJvdXRlc01hcC5nZXQoaXRlbSkgPz8gW107XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMucmR0Um91dGVyLm5hdmlnYXRpb25FbmQkXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxyXG4gICAgICAuc3Vic2NyaWJlKChldikgPT4gdGhpcy5maWx0ZXJJdGVtcygpKTtcclxuICAgIHRoaXMubWVhc3VyZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKHRoaXMuY2hpbGRyZW4pIHtcclxuICAgICAgdGhpcy5yZWNhbGN1bGF0ZUNoaWxkcmVuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmxpc3RlbldpbmRvd1Jlc2l6ZSgpO1xyXG5cclxuICAgIC8vIE5vdCB1c2luZyB0aW1lb3V0IHJlc3VsdHMgaW4gaG9yaXpvbnRhbCBvdmVyZmxvdyBvbiBodG1sIGVsZW1lbnRcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLm1lYXN1cmUoKTtcclxuICAgICAgdGhpcy5yZWNhbGN1bGF0ZUNoaWxkcmVuKCk7XHJcbiAgICB9LCA1MCk7XHJcbiAgfVxyXG5cclxuICByZWNhbGN1bGF0ZUNoaWxkcmVuKCkge1xyXG4gICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgICBjaGlsZC5yZWNhbGN1bGF0ZVBvc2l0aW9uKFxyXG4gICAgICAgIHRoaXMucHJlZmVycmVkSG9yaXpvbnRhbERpcixcclxuICAgICAgICB0aGlzLnByZWZlcnJlZFZlcnRpY2FsRGlyXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNsb3NlU3VibWVudXMoZm9jdXNFeHBhbmRlZCA9IGZhbHNlKSB7XHJcbiAgICBpZiAoZm9jdXNFeHBhbmRlZCAmJiB0aGlzLmV4cGFuZGVkKSB7XHJcbiAgICAgIHRoaXMuZm9jdXNJdGVtKHRoaXMuZXhwYW5kZWQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5leHBhbmRlZCA9IG51bGw7XHJcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uSXRlbUNsaWNrKGl0ZW06IFBhcnNlZFJkdE1lbnVJdGVtKSB7XHJcbiAgICBpZiAobWVudUl0ZW1IYXNDaGlsZHJlbihpdGVtKSAmJiB0aGlzLmV4cGFuZGVkICE9PSBpdGVtKSB7XHJcbiAgICAgIHRoaXMuYXV0b2ZvY3VzU3VibWVudUl0ZW0gPSBudWxsO1xyXG4gICAgICB0aGlzLmV4cGFuZGVkID0gaXRlbTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZXhwYW5kZWQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBpdGVtLmNvbW1hbmQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgaXRlbS5jb21tYW5kKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25JdGVtUG9pbnRlckVudGVyKGl0ZW06IFBhcnNlZFJkdE1lbnVJdGVtKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3Blbk9uSG92ZXIgJiZcclxuICAgICAgdGhpcy5leHBhbmRlZCAhPT0gaXRlbSAmJlxyXG4gICAgICBtZW51SXRlbUhhc0NoaWxkcmVuKGl0ZW0pXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5hdXRvZm9jdXNTdWJtZW51SXRlbSA9IG51bGw7XHJcbiAgICAgIHRoaXMuZXhwYW5kZWQgPSBpdGVtO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uSXRlbVBvaW50ZXJMZWF2ZShpdGVtOiBQYXJzZWRSZHRNZW51SXRlbSkge1xyXG4gICAgaWYgKHRoaXMub3Blbk9uSG92ZXIgJiYgdGhpcy5leHBhbmRlZCA9PT0gaXRlbSkge1xyXG4gICAgICB0aGlzLmV4cGFuZGVkID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbktleURvd24oaXRlbUluZGV4OiBudW1iZXIsIGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBjb25zdCBoYXNBY3Rpb24gPSBldmVudC5jb2RlIGluIHRoaXMua2V5QWN0aW9ucztcclxuICAgIGNvbnN0IGlzTGV0dGVyID1cclxuICAgICAgUmR0U3RyaW5nVXRpbHMuaXNBbHBoYWJldENoYXJhY3RlcihldmVudC5rZXkpIHx8XHJcbiAgICAgIFJkdFN0cmluZ1V0aWxzLmlzTnVtZXJpY0NoYXJhY3RlcihldmVudC5rZXkpO1xyXG5cclxuICAgIGlmIChoYXNBY3Rpb24gfHwgaXNMZXR0ZXIpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaGFzQWN0aW9uKSB7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChoYXNBY3Rpb24pIHtcclxuICAgICAgdGhpcy5rZXlBY3Rpb25zW2V2ZW50LmNvZGVdKGl0ZW1JbmRleCk7XHJcbiAgICB9IGVsc2UgaWYgKGlzTGV0dGVyKSB7XHJcbiAgICAgIGNvbnN0IG5leHQgPSBmaW5kTmV4dEl0ZW1XaXRoUHJlZml4KFxyXG4gICAgICAgIHRoaXMucGFyc2VkSXRlbXMsXHJcbiAgICAgICAgaXRlbUluZGV4LFxyXG4gICAgICAgIGV2ZW50LmtleVxyXG4gICAgICApO1xyXG4gICAgICBpZiAobmV4dCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuZm9jdXNJdGVtKG5leHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaW52b2tlSXRlbUNsaWNrKGl0ZW06IFBhcnNlZFJkdE1lbnVJdGVtKSB7XHJcbiAgICBpZiAobWVudUl0ZW1IYXNSb3V0ZShpdGVtKSAmJiBpdGVtLnJvdXRlckxpbmspIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoaXRlbS5yb3V0ZXJMaW5rKTtcclxuICAgIH1cclxuICAgIHRoaXMub25JdGVtQ2xpY2soaXRlbSk7XHJcbiAgICB0aGlzLmF1dG9mb2N1c1N1Ym1lbnVJdGVtID0gJ2ZpcnN0JztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmaWx0ZXJJdGVtcygpIHtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJkdFJvdXRlci5wYXJzZUFic29sdXRlVXJsKCk7XHJcbiAgICBpZiAoIWN1cnJlbnQpIHtcclxuICAgICAgdGhpcy5wYXJzZWRJdGVtcyA9IHRoaXMuYWxsUGFyc2VkSXRlbXM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBhcnNlZEl0ZW1zID0gdGhpcy5maWx0ZXJSZWModGhpcy5hbGxQYXJzZWRJdGVtcywgY3VycmVudCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNoaWxkUm91dGVzTWFwID0gZ2V0Q2hpbGRSb3V0ZXNNYXAodGhpcy5wYXJzZWRJdGVtcyk7XHJcbiAgICB0aGlzLmxpc3RlblNob3J0Y3V0cygpO1xyXG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmaWx0ZXJSZWMoXHJcbiAgICBpdGVtczogUGFyc2VkUmR0TWVudUl0ZW1bXSxcclxuICAgIGN1cnJlbnQ6IHsgcm91dGU6IFJkdFJvdXRlOyBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfVxyXG4gICk6IFBhcnNlZFJkdE1lbnVJdGVtW10ge1xyXG4gICAgbGV0IGN1cnJlbnRQYXJlbnQgPSBjdXJyZW50LnJvdXRlO1xyXG4gICAgY29uc3QgY3VycmVudFBhcmFtcyA9IGN1cnJlbnQucGFyYW1zO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlcmVkID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgIGlmICghaXRlbS5yZXF1aXJlZFBhcmVudCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHJlcXVpcmVkID0gaXRlbS5yZXF1aXJlZFBhcmVudDtcclxuICAgICAgd2hpbGUgKGN1cnJlbnRQYXJlbnQuYWJzb2x1dGVQYXRoICE9PSByZXF1aXJlZC5hYnNvbHV0ZVBhdGgpIHtcclxuICAgICAgICBjdXJyZW50UGFyZW50ID0gY3VycmVudFBhcmVudC5wYXJlbnQhO1xyXG4gICAgICAgIGlmICghY3VycmVudFBhcmVudCkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgcmVxdWlyZWRQYXJlbnQ6IFJkdFJvdXRlIHwgbnVsbCA9IHJlcXVpcmVkO1xyXG4gICAgICBkbyB7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHJlcXVpcmVkUGFyZW50LmFic29sdXRlUGF0aDtcclxuICAgICAgICBpZiAocGF0aCBpbiBjdXJyZW50UGFyYW1zKSB7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiByZXF1aXJlZFBhcmVudC5zdGF0aWNQYXJhbXMpIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRQYXJhbXNbcGF0aF1ba2V5XSAhPT0gcmVxdWlyZWRQYXJlbnQuc3RhdGljUGFyYW1zW2tleV0pIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmVxdWlyZWRQYXJlbnQgPSByZXF1aXJlZFBhcmVudC5wYXJlbnQ7XHJcbiAgICAgIH0gd2hpbGUgKHJlcXVpcmVkUGFyZW50KTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZmlsdGVyZWQubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLml0ZW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICBpdGVtczogdGhpcy5maWx0ZXJSZWMoaXRlbS5pdGVtcywgY3VycmVudCksXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaW52b2tlSXRlbUNsaWNrQnlJbmRleChpdGVtSW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMucGFyc2VkSXRlbXNbaXRlbUluZGV4XTtcclxuICAgIGlmICghaXRlbSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmludm9rZUl0ZW1DbGljayhpdGVtKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvcGVuU3VibWVudShpdGVtSW5kZXg6IG51bWJlciwgdmlzaWJsZUZvY3VzOiAnZmlyc3QnIHwgJ2xhc3QnKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIGl0ZW1JbmRleCA8IHRoaXMucGFyc2VkSXRlbXMubGVuZ3RoICYmXHJcbiAgICAgIG1lbnVJdGVtSGFzQ2hpbGRyZW4odGhpcy5wYXJzZWRJdGVtc1tpdGVtSW5kZXhdKVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnBhcnNlZEl0ZW1zW2l0ZW1JbmRleF07XHJcbiAgICAgIHRoaXMuYXV0b2ZvY3VzU3VibWVudUl0ZW0gPSB2aXNpYmxlRm9jdXM7XHJcbiAgICAgIHRoaXMuZXhwYW5kZWQgPSBpdGVtO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZvY3VzSXRlbShpdGVtOiBudW1iZXIgfCBQYXJzZWRSZHRNZW51SXRlbSkge1xyXG4gICAgbGV0IGl0ZW1JbmRleDogbnVtYmVyO1xyXG5cclxuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgaXRlbUluZGV4ID0gaXRlbTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1JbmRleCA9IHRoaXMucGFyc2VkSXRlbXMuaW5kZXhPZihpdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXRlbUluZGV4ID49IDAgJiYgaXRlbUluZGV4IDwgdGhpcy5mb2N1c2FibGVFbGVtZW50cy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5ibHVyQWxsRm9jdXNhYmxlKCk7XHJcbiAgICAgIHRoaXMuZm9jdXNGb2N1c2FibGUoaXRlbUluZGV4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmb2N1c05leHRJdGVtKGl0ZW1JbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBuZXh0ID0gKGl0ZW1JbmRleCArIDEpICUgdGhpcy5wYXJzZWRJdGVtcy5sZW5ndGg7XHJcbiAgICB0aGlzLmZvY3VzSXRlbShuZXh0KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmb2N1c1ByZXZJdGVtKGl0ZW1JbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBwcmV2ID1cclxuICAgICAgKGl0ZW1JbmRleCAtIDEgKyB0aGlzLnBhcnNlZEl0ZW1zLmxlbmd0aCkgJSB0aGlzLnBhcnNlZEl0ZW1zLmxlbmd0aDtcclxuICAgIHRoaXMuZm9jdXNJdGVtKHByZXYpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGJsdXJBbGxGb2N1c2FibGUoKSB7XHJcbiAgICB0aGlzLmZvY3VzYWJsZUVsZW1lbnRzLmZvckVhY2goKGVsKSA9PlxyXG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsLm5hdGl2ZUVsZW1lbnQsIEZPQ1VTX1ZJU0lCTEUpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZvY3VzRm9jdXNhYmxlKGl0ZW1JbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBlbFJlZiA9IHRoaXMuZm9jdXNhYmxlRWxlbWVudHMuZ2V0KGl0ZW1JbmRleCk7XHJcbiAgICBpZiAoZWxSZWYpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbFJlZi5uYXRpdmVFbGVtZW50LCBGT0NVU19WSVNJQkxFKTtcclxuICAgICAgZWxSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQ2xvc2VzIG1lbnUgaWYgdXNlciBuYXZpZ2F0ZXMgb3V0c2lkZSBpdCB1c2luZyBUYWIuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmZvY3Vzb3V0JywgWyckZXZlbnQnXSlcclxuICBwcm90ZWN0ZWQgY2hlY2tBY3RpdmVFbGVtZW50KGV2ZW50OiBGb2N1c0V2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5jbG9zZU9uRm9jdXNPdXQpIHtcclxuICAgICAgY29uc3QgdGhpc0VsID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0O1xyXG4gICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgfHwgIXRoaXNFbC5jb250YWlucyh0YXJnZXQpKSB7XHJcbiAgICAgICAgdGhpcy5leHBhbmRlZCA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBwcm90ZWN0ZWQgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGNvbnN0IGVsUmVmID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCFlbFJlZi5jb250YWlucyh0YXJnZXQpKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VTdWJtZW51cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG1lYXN1cmUoKSB7XHJcbiAgICB0aGlzLm1lYXN1cmVDbGllbnRTaXplKCk7XHJcbiAgICB0aGlzLnJlYWRNYXJnaW4oKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZWFkTWFyZ2luKCkge1xyXG4gICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50KTtcclxuICAgIGNvbnN0IHRvcFZhbCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcclxuICAgICAgUkRUX01FTlVfTUFSR0lOX1RPUF9QUk9QRVJUWV9OQU1FXHJcbiAgICApO1xyXG4gICAgY29uc3QgYm90dG9tVmFsID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFxyXG4gICAgICBSRFRfTUVOVV9NQVJHSU5fQk9UVE9NX1BST1BFUlRZX05BTUVcclxuICAgICk7XHJcbiAgICBjb25zdCBsZWZ0VmFsID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFxyXG4gICAgICBSRFRfTUVOVV9NQVJHSU5fTEVGVF9QUk9QRVJUWV9OQU1FXHJcbiAgICApO1xyXG4gICAgY29uc3QgcmlnaHRWYWwgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoXHJcbiAgICAgIFJEVF9NRU5VX01BUkdJTl9SSUdIVF9QUk9QRVJUWV9OQU1FXHJcbiAgICApO1xyXG4gICAgdGhpcy5fYm9keU1hcmdpbiA9IHtcclxuICAgICAgdG9wOiBwYXJzZUludCh0b3BWYWwpIHx8IDAsXHJcbiAgICAgIGJvdHRvbTogcGFyc2VJbnQoYm90dG9tVmFsKSB8fCAwLFxyXG4gICAgICBsZWZ0OiBwYXJzZUludChsZWZ0VmFsKSB8fCAwLFxyXG4gICAgICByaWdodDogcGFyc2VJbnQocmlnaHRWYWwpIHx8IDAsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG1lYXN1cmVDbGllbnRTaXplKCkge1xyXG4gICAgdGhpcy5fY2xpZW50U2l6ZSA9IHtcclxuICAgICAgd2lkdGg6IHRoaXMuZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCxcclxuICAgICAgaGVpZ2h0OiB0aGlzLmRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBsaXN0ZW5XaW5kb3dSZXNpemUoKSB7XHJcbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGhyb3R0bGVUaW1lKDAsIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCB7IHRyYWlsaW5nOiB0cnVlIH0pLFxyXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZWFzdXJlKCk7XHJcbiAgICAgICAgdGhpcy5yZWNhbGN1bGF0ZUNoaWxkcmVuKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGxpc3RlblNob3J0Y3V0cygpIHtcclxuICAgIGNvbnN0IGl0ZW1zV2l0aFNob3J0Y3V0cyA9IGdldE1lbnVJdGVtc1Nob3J0Y3V0cyh0aGlzLnBhcnNlZEl0ZW1zKTtcclxuICAgIGNvbnN0IHNob3J0Y3V0czogUmR0U2hvcnRjdXRbXSA9IGl0ZW1zV2l0aFNob3J0Y3V0cy5tYXAoXHJcbiAgICAgIChpdCkgPT4gaXQuc2hvcnRjdXRcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5zaG9ydGN1dE1hcCA9IHRoaXMuZ2V0U2hvcnRjdXRNYXAoaXRlbXNXaXRoU2hvcnRjdXRzKTtcclxuICAgIHRoaXMuc2hvcnRjdXRTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuc2hvcnRjdXRTdWIgPSB0aGlzLnNob3J0Y3V0U2VydmljZVxyXG4gICAgICAubGlzdGVuKHNob3J0Y3V0cylcclxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGV2dCkgPT4gdGhpcy5vblNob3J0Y3V0KGV2dC5zaG9ydGN1dCkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldFNob3J0Y3V0TWFwKFxyXG4gICAgaXRlbXNXaXRoU2hvcnRjdXRzOiBQYXJzZWRSZHRNZW51SXRlbVdpdGhTaG9ydGN1dFtdXHJcbiAgKSB7XHJcbiAgICBjb25zdCBzaG9ydGN1dE1hcDogUmVjb3JkPHN0cmluZywgUGFyc2VkUmR0TWVudUl0ZW1bXT4gPSB7fTtcclxuICAgIGl0ZW1zV2l0aFNob3J0Y3V0cy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIHNob3J0Y3V0TWFwW2l0ZW0uc2hvcnRjdXQuaG90a2V5c1ZhbHVlXSA9IGl0ZW0ucGF0aDtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHNob3J0Y3V0TWFwO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uU2hvcnRjdXQoc2hvcnRjdXQ6IFJkdFNob3J0Y3V0KSB7XHJcbiAgICBjb25zdCBwYXRoID0gdGhpcy5zaG9ydGN1dE1hcFtzaG9ydGN1dC5ob3RrZXlzVmFsdWVdO1xyXG4gICAgaWYgKCFwYXRoKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBgTWVudSBzaG9ydGN1dCAke3Nob3J0Y3V0LmhvdGtleXNWYWx1ZX0gd2FzIGRldGVjdGVkLCBidXQgdGhlcmUgaXMgbm8gcGF0aCBhc3NvY2lhdGVkIHdpdGggaXQuYCxcclxuICAgICAgICB0aGlzLnNob3J0Y3V0TWFwXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBsYXN0ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xyXG4gICAgY29uc3QgaGFzUm91dGUgPSBtZW51SXRlbUhhc1JvdXRlKGxhc3QpO1xyXG4gICAgY29uc3QgaGFzQ29tbWFuZCA9IHR5cGVvZiBsYXN0LmNvbW1hbmQgPT09ICdmdW5jdGlvbic7XHJcbiAgICBpZiAoaGFzUm91dGUgfHwgaGFzQ29tbWFuZCkge1xyXG4gICAgICB0aGlzLmNsb3NlU3VibWVudXMoZmFsc2UpO1xyXG4gICAgICBpZiAoaGFzQ29tbWFuZCkge1xyXG4gICAgICAgIGxhc3QuY29tbWFuZCEoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaGFzUm91dGUpIHtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShsYXN0LnJvdXRlckxpbmshKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3RpdmF0ZUl0ZW1SZWN1cnNpdmVseShwYXRoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhY3RpdmF0ZUl0ZW1SZWN1cnNpdmVseShwYXRoOiBQYXJzZWRSZHRNZW51SXRlbVtdKSB7XHJcbiAgICBjb25zdCBjaGlsZHJlbiA9IFsuLi5wYXRoXTtcclxuXHJcbiAgICBpZiAodGhpcy5zaG9ydGN1dE1vZGUgPT09IFJkdE1lbnVTaG9ydGN1dE1vZGUuT1BFTl9TVUJNRU5VKSB7XHJcbiAgICAgIGNvbnN0IGxhc3QgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXTtcclxuICAgICAgaWYgKG1lbnVJdGVtSGFzQ2hpbGRyZW4obGFzdCkgJiYgbGFzdC5pdGVtc1swXSkge1xyXG4gICAgICAgIGNoaWxkcmVuLnB1c2gobGFzdC5pdGVtc1swXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0aGlzSXRlbSA9IGNoaWxkcmVuLnNoaWZ0KCkhO1xyXG5cclxuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuZXhwYW5kZWQgPSB0aGlzSXRlbTtcclxuICAgICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMuY2hpbGRyZW4uZmluZCgoY2hpbGQpID0+IGNoaWxkLml0ZW0gPT09IHRoaXNJdGVtKTtcclxuICAgICAgb3ZlcmxheSEuZm9jdXNJdGVtUmVjdXJzaXZlbHkoY2hpbGRyZW4pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5leHBhbmRlZCA9IG51bGw7XHJcbiAgICAgIHRoaXMuZm9jdXNJdGVtKHRoaXNJdGVtKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|
|
458
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LW1lbnUtYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9AbmdyZHQvbWVudS9zcmMvbGliL21lbnUtYmFzZS9yZHQtbWVudS1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVMLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsVUFBVSxFQUNWLFNBQVMsRUFDVCxVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxlQUFlLEVBR2YsU0FBUyxFQUNULFNBQVMsRUFFVCxZQUFZLEdBQ2IsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBWSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQWUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsT0FBTyxFQUVQLGNBQWMsR0FFZixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osWUFBWSxHQUNiLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDckYsT0FBTyxFQUNMLDJCQUEyQixFQUMzQix5QkFBeUIsRUFDekIsb0NBQW9DLEVBQ3BDLGtDQUFrQyxFQUNsQyxtQ0FBbUMsRUFDbkMsaUNBQWlDLEVBQ2pDLG1CQUFtQixHQUNwQixNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLEVBR0wsbUJBQW1CLEdBQ3BCLE1BQU0s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RGQsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFJdEMsV0FBVztzQkFEVixLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFO2dCQUl0QyxZQUFZO3NCQURYLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQWMzQixRQUFRO3NCQURqQixZQUFZO3VCQUFDLHVCQUF1QjtnQkFJM0IsaUJBQWlCO3NCQUQxQixZQUFZO3VCQUFDLGVBQWU7Z0JBTTdCLE9BQU87c0JBRE4sV0FBVzt1QkFBQyxPQUFPO2dCQXNSVixhQUFhO3NCQUR0QixZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQW1CcEMsa0JBQWtCO3NCQUQzQixZQUFZO3VCQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWNqQyxlQUFlO3NCQUR4QixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBEZXN0cm95UmVmLFxyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIEVudmlyb25tZW50SW5qZWN0b3IsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIGluamVjdCxcclxuICBJbnB1dCxcclxuICBudW1iZXJBdHRyaWJ1dGUsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE9uSW5pdCxcclxuICBRdWVyeUxpc3QsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgVmlld0NoaWxkcmVuLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IFJkdFJvdXRlLCBSZHRSb3V0ZXJTZXJ2aWNlIH0gZnJvbSAnQG5ncmR0L3JvdXRlcic7XHJcbmltcG9ydCB7IFJkdFNob3J0Y3V0LCBSZHRTaG9ydGN1dFNlcnZpY2UgfSBmcm9tICdAbmdyZHQvc2hvcnRjdXRzJztcclxuaW1wb3J0IHtcclxuICBLQl9DT0RFLFxyXG4gIFJkdEhvcml6b250YWxEaXJlY3Rpb24sXHJcbiAgUmR0U3RyaW5nVXRpbHMsXHJcbiAgUmR0VmVydGljYWxEaXJlY3Rpb24sXHJcbn0gZnJvbSAnQG5ncmR0L3V0aWxzJztcclxuaW1wb3J0IHtcclxuICBhbmltYXRpb25GcmFtZVNjaGVkdWxlcixcclxuICBmcm9tRXZlbnQsXHJcbiAgU3Vic2NyaXB0aW9uLFxyXG4gIHRocm90dGxlVGltZSxcclxufSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgUmR0TWVudU92ZXJsYXlDb21wb25lbnQgfSBmcm9tICcuLi9tZW51LW92ZXJsYXkvcmR0LW1lbnUtb3ZlcmxheS5jb21wb25lbnQnO1xyXG5pbXBvcnQge1xyXG4gIERFRkFVTFRfTUVOVV9IT1JJWk9OVEFMX0RJUixcclxuICBERUZBVUxUX01FTlVfVkVSVElDQUxfRElSLFxyXG4gIFJEVF9NRU5VX01BUkdJTl9CT1RUT01fUFJPUEVSVFlfTkFNRSxcclxuICBSRFRfTUVOVV9NQVJHSU5fTEVGVF9QUk9QRVJUWV9OQU1FLFxyXG4gIFJEVF9NRU5VX01BUkdJTl9SSUdIVF9QUk9QRVJUWV9OQU1FLFxyXG4gIFJEVF9NRU5VX01BUkdJTl9UT1BfUFJPUEVSVFlfTkFNRSxcclxuICBSZHRNZW51U2hvcnRjdXRNb2RlLFxyXG59IGZyb20gJy4uL21vZGVscyc7XHJcbmltcG9ydCB7XHJcbiAgUGFyc2VkUmR0TWVudUl0ZW0sXHJcbiAgUmR0TWVudUV4cGFuZGVkQ2hpbGQsXHJcbiAgUmR0TWVudUV4cGFuZFNvdXJjZSxcclxufSBmcm9tICcuLi9wcml2YXRlLW1vZGVscyc7XHJcbmltcG9ydCB7XHJcbiAgZmluZE5leHRJdGVtV2l0aFByZWZpeCxcclxuICBGT0NVU19WSVNJQkxFLFxyXG4gIGdldENoaWxkUm91dGVzTWFwLFxyXG4gIGdldE1lbnVJdGVtc1Nob3J0Y3V0cyxcclxuICBtZW51SXRlbUhhc0NoaWxkcmVuLFxyXG4gIG1lbnVJdGVtSGFzUm91dGUsXHJcbiAgUGFyc2VkUmR0TWVudUl0ZW1XaXRoU2hvcnRjdXQsXHJcbiAgU2l6ZSxcclxufSBmcm9tICcuLi91dGlscyc7XHJcblxyXG5ARGlyZWN0aXZlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJkdE1lbnVCYXNlQ29tcG9uZW50XHJcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdFxyXG57XHJcbiAgQElucHV0KClcclxuICBwcmVmZXJyZWRWZXJ0aWNhbERpcjogUmR0VmVydGljYWxEaXJlY3Rpb24gPSBERUZBVUxUX01FTlVfVkVSVElDQUxfRElSO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHByZWZlcnJlZEhvcml6b250YWxEaXI6IFJkdEhvcml6b250YWxEaXJlY3Rpb24gPSBERUZBVUxUX01FTlVfSE9SSVpPTlRBTF9ESVI7XHJcblxyXG4gIC8vIE1vZGUgb25seSBtYXR0ZXJzIGlmIGl0ZW0gaGFzIHNob3J0Y3V0IGFuZCBvbmx5IGNoaWxkcmVuLCBubyBjb21tYW5kIG5vciByb3V0ZXJMaW5rXHJcbiAgLy8gRk9DVVNfSVRFTSB3aWxsIHB1dCBmb2N1cyBvbiBpdGVtIHdpdGggc2hvcnRjdXRcclxuICAvLyBPUEVOX1NVQk1FTlUgd2lsbCBvcGVuIGl0cyBzdWJtZW51IGFuZCBwdXQgZm9jdXMgb24gdGhlIGZpcnN0IGl0ZW0gaW4gaXRcclxuICAvLyBJZiBpdGVtIGhhcyBjb21tYW5kIG9yIHJvdXRlckxpbmssIGl0IHdpbGwgYWx3YXlzIGJlIGFjdGl2YXRlZCBhbmQgZXZlcnl0aGluZyBjbG9zZWRcclxuICBASW5wdXQoKVxyXG4gIHNob3J0Y3V0TW9kZTogJ2ZvY3VzLWl0ZW0nIHwgJ29wZW4tc3VibWVudScgPVxyXG4gICAgUmR0TWVudVNob3J0Y3V0TW9kZS5PUEVOX1NVQk1FTlU7XHJcblxyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxyXG4gIGNsb3NlT25Gb2N1c091dCA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IGJvb2xlYW5BdHRyaWJ1dGUgfSlcclxuICBvcGVuT25Ib3ZlciA9IGZhbHNlO1xyXG5cclxuICBASW5wdXQoeyB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxyXG4gIGhpdGJveE1hcmdpbiA9IDEwO1xyXG5cclxuICByZWFkb25seSBjZCA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XHJcbiAgcmVhZG9ubHkgZGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmR0Um91dGVyID0gaW5qZWN0KFJkdFJvdXRlclNlcnZpY2UpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBlbFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4gPSBpbmplY3QoRWxlbWVudFJlZik7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVuZGVyZXIgPSBpbmplY3QoUmVuZGVyZXIyKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNob3J0Y3V0U2VydmljZSA9IGluamVjdChSZHRTaG9ydGN1dFNlcnZpY2UpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBpbmplY3RvciA9IGluamVjdChFbnZpcm9ubWVudEluamVjdG9yKTtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbihSZHRNZW51T3ZlcmxheUNvbXBvbmVudClcclxuICBwcm90ZWN0ZWQgY2hpbGRyZW4hOiBRdWVyeUxpc3Q8UmR0TWVudU92ZXJsYXlDb21wb25lbnQ+O1xyXG5cclxuICBAVmlld0NoaWxkcmVuKCdmb2N1c2FibGVJdGVtJylcclxuICBwcm90ZWN0ZWQgZm9jdXNhYmxlRWxlbWVudHMhOiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+O1xyXG5cclxuICBhYnN0cmFjdCBnZXQgYnV0dG9uQ29udGFpbmVyKCk6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcclxuICBjbGFzc2VzID0gJ3JkdC1tZW51LWJhc2UnO1xyXG5cclxuICBleHBhbmRlZENoaWxkOiBSZHRNZW51RXhwYW5kZWRDaGlsZCB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcm90ZWN0ZWQgYXV0b2ZvY3VzU3VibWVudUl0ZW06ICdmaXJzdCcgfCAnbGFzdCcgfCBudWxsID0gbnVsbDtcclxuICBwcm90ZWN0ZWQgcGFyc2VkSXRlbXMhOiBQYXJzZWRSZHRNZW51SXRlbVtdO1xyXG5cclxuICBnZXQgY2xpZW50U2l6ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9jbGllbnRTaXplO1xyXG4gIH1cclxuICBwcml2YXRlIF9jbGllbnRTaXplITogU2l6ZTtcclxuXHJcbiAgZ2V0IGJvZHlNYXJnaW4oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYm9keU1hcmdpbjtcclxuICB9XHJcbiAgcHJpdmF0ZSBfYm9keU1hcmdpbiE6IHtcclxuICAgIHRvcDogbnVtYmVyO1xyXG4gICAgYm90dG9tOiBudW1iZXI7XHJcbiAgICBsZWZ0OiBudW1iZXI7XHJcbiAgICByaWdodDogbnVtYmVyO1xyXG4gIH07XHJcblxyXG4gIGdldCBidXR0b25Db250YWluZXJSZWN0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2J1dHRvbkNvbnRhaW5lclJlY3Q7XHJcbiAgfVxyXG4gIHByaXZhdGUgX2J1dHRvbkNvbnRhaW5lclJlY3Q/OiBET01SZWN0O1xyXG5cclxuICBwcm90ZWN0ZWQgYWxsUGFyc2VkSXRlbXMhOiBQYXJzZWRSZHRNZW51SXRlbVtdO1xyXG4gIHByb3RlY3RlZCBjaGlsZFJvdXRlc01hcDogTWFwPFBhcnNlZFJkdE1lbnVJdGVtLCBzdHJpbmdbXVtdPiA9IG5ldyBNYXAoKTtcclxuICBwcm90ZWN0ZWQgc2hvcnRjdXRTdWIgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcbiAgcHJvdGVjdGVkIHNob3J0Y3V0TWFwOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRSZHRNZW51SXRlbVtdPiA9IHt9O1xyXG5cclxuICByZWFkb25seSBrZXlBY3Rpb25zID0ge1xyXG4gICAgW0tCX0NPREUuQVJST1cuTEVGVF06IChpbmRleDogbnVtYmVyKSA9PiB0aGlzLmZvY3VzUHJldkl0ZW0oaW5kZXgpLFxyXG4gICAgW0tCX0NPREUuQVJST1cuUklHSFRdOiAoaW5kZXg6IG51bWJlcikgPT4gdGhpcy5mb2N1c05leHRJdGVtKGluZGV4KSxcclxuICAgIFtLQl9DT0RFLkFSUk9XLkRPV05dOiAoaW5kZXg6IG51bWJlcikgPT5cclxuICAgICAgdGhpcy5vcGVuU3VibWVudShpbmRleCwgJ2ZpcnN0JywgUmR0TWVudUV4cGFuZFNvdXJjZS5TaG9ydGN1dCksXHJcbiAgICBbS0JfQ09ERS5BUlJPVy5VUF06IChpbmRleDogbnVtYmVyKSA9PlxyXG4gICAgICB0aGlzLm9wZW5TdWJtZW51KGluZGV4LCAnbGFzdCcsIFJkdE1lbnVFeHBhbmRTb3VyY2UuU2hvcnRjdXQpLFxyXG4gICAgW0tCX0NPREUuSE9NRV06ICgpID0+IHRoaXMuZm9jdXNJdGVtKDApLFxyXG4gICAgW0tCX0NPREUuRU5EXTogKCkgPT4gdGhpcy5mb2N1c0l0ZW0odGhpcy5wYXJzZWRJdGVtcy5sZW5ndGggLSAxKSxcclxuICAgIFtLQl9DT0RFLkVOVEVSXTogKGluZGV4OiBudW1iZXIpID0+IHRoaXMuaW52b2tlSXRlbUNsaWNrQnlJbmRleChpbmRleCksXHJcbiAgICBbS0JfQ09ERS5TUEFDRUJBUl06IChpbmRleDogbnVtYmVyKSA9PiB0aGlzLmludm9rZUl0ZW1DbGlja0J5SW5kZXgoaW5kZXgpLFxyXG4gIH07XHJcblxyXG4gIC8vIFJldHVybnMgYWxsIHJvdXRlcyBhc29jaWF0ZWQgd2l0aCBpdGVtIG9yIGl0cyBzdWJpdGVtcy5cclxuICBnZXRDaGlsZFJvdXRlcyhpdGVtOiBQYXJzZWRSZHRNZW51SXRlbSkge1xyXG4gICAgcmV0dXJuIHRoaXMuY2hpbGRSb3V0ZXNNYXAuZ2V0KGl0ZW0pID8/IFtdO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnJkdFJvdXRlci5uYXZpZ2F0aW9uRW5kJFxyXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcclxuICAgICAgLnN1YnNjcmliZSgoZXYpID0+IHRoaXMuZmlsdGVySXRlbXMoKSk7XHJcbiAgICB0aGlzLm1lYXN1cmUoKTtcclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmICh0aGlzLmNoaWxkcmVuKSB7XHJcbiAgICAgIHRoaXMucmVjYWxjdWxhdGVDaGlsZHJlbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5saXN0ZW5XaW5kb3dSZXNpemUoKTtcclxuXHJcbiAgICAvLyBOb3QgdXNpbmcgdGltZW91dCByZXN1bHRzIGluIGhvcml6b250YWwgb3ZlcmZsb3cgb24gaHRtbCBlbGVtZW50XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5tZWFzdXJlKCk7XHJcbiAgICAgIHRoaXMucmVjYWxjdWxhdGVDaGlsZHJlbigpO1xyXG4gICAgfSwgNTApO1xyXG4gIH1cclxuXHJcbiAgcmVjYWxjdWxhdGVDaGlsZHJlbigpIHtcclxuICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcclxuICAgICAgY2hpbGQucmVjYWxjdWxhdGVQb3NpdGlvbihcclxuICAgICAgICB0aGlzLnByZWZlcnJlZEhvcml6b250YWxEaXIsXHJcbiAgICAgICAgdGhpcy5wcmVmZXJyZWRWZXJ0aWNhbERpclxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZVN1Ym1lbnVzKGZvY3VzRXhwYW5kZWQgPSBmYWxzZSkge1xyXG4gICAgaWYgKGZvY3VzRXhwYW5kZWQgJiYgdGhpcy5leHBhbmRlZENoaWxkKSB7XHJcbiAgICAgIHRoaXMuZm9jdXNJdGVtKHRoaXMuZXhwYW5kZWRDaGlsZC5pdGVtKTtcclxuICAgIH1cclxuICAgIHRoaXMuZXhwYW5kZWRDaGlsZCA9IG51bGw7XHJcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uSXRlbUNsaWNrKGl0ZW06IFBhcnNlZFJkdE1lbnVJdGVtKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIChtZW51SXRlbUhhc0NoaWxkcmVuKGl0ZW0pICYmIHRoaXMuZXhwYW5kZWRDaGlsZD8uaXRlbSAhPT0gaXRlbSkgfHxcclxuICAgICAgKHRoaXMub3Blbk9uSG92ZXIgJiZcclxuICAgICAgICB0aGlzLmV4cGFuZGVkQ2hpbGQ/LnNyYyA9PT0gUmR0TWVudUV4cGFuZFNvdXJjZS5Ib3ZlcilcclxuICAgICkge1xyXG4gICAgICB0aGlzLmF1dG9mb2N1c1N1Ym1lbnVJdGVtID0gbnVsbDtcclxuICAgICAgdGhpcy5leHBhbmRlZENoaWxkID0geyBpdGVtLCBzcmM6IFJkdE1lbnVFeHBhbmRTb3VyY2UuQ2xpY2sgfTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZXhwYW5kZWRDaGlsZCA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mIGl0ZW0uY29tbWFuZCA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBpdGVtLmNvbW1hbmQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbkl0ZW1Qb2ludGVyRW50ZXIoaXRlbTogUGFyc2VkUmR0TWVudUl0ZW0pIHtcclxuICAgIGlmICh0aGlzLm9wZW5PbkhvdmVyKSB7XHJcbiAgICAgIGlmIChcclxuICAgICAgICBtZW51SXRlbUhhc0NoaWxkcmVuKGl0ZW0pICYmXHJcbiAgICAgICAgdGhpcy5leHBhbmRlZENoaWxkPy5zcmMgIT09IFJkdE1lbnVFeHBhbmRTb3VyY2UuQ2xpY2tcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy5hdXRvZm9jdXNTdWJtZW51SXRlbSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5leHBhbmRlZENoaWxkID0geyBpdGVtLCBzcmM6IFJkdE1lbnVFeHBhbmRTb3VyY2UuSG92ZXIgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmV4cGFuZGVkQ2hpbGQgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25LZXlEb3duKGl0ZW1JbmRleDogbnVtYmVyLCBldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgY29uc3QgaGFzQWN0aW9uID0gZXZlbnQuY29kZSBpbiB0aGlzLmtleUFjdGlvbnM7XHJcbiAgICBjb25zdCBpc0xldHRlciA9XHJcbiAgICAgIFJkdFN0cmluZ1V0aWxzLmlzQWxwaGFiZXRDaGFyYWN0ZXIoZXZlbnQua2V5KSB8fFxyXG4gICAgICBSZHRTdHJpbmdVdGlscy5pc051bWVyaWNDaGFyYWN0ZXIoZXZlbnQua2V5KTtcclxuXHJcbiAgICBpZiAoaGFzQWN0aW9uIHx8IGlzTGV0dGVyKSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhhc0FjdGlvbikge1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaGFzQWN0aW9uKSB7XHJcbiAgICAgIHRoaXMua2V5QWN0aW9uc1tldmVudC5jb2RlXShpdGVtSW5kZXgpO1xyXG4gICAgfSBlbHNlIGlmIChpc0xldHRlcikge1xyXG4gICAgICBjb25zdCBuZXh0ID0gZmluZE5leHRJdGVtV2l0aFByZWZpeChcclxuICAgICAgICB0aGlzLnBhcnNlZEl0ZW1zLFxyXG4gICAgICAgIGl0ZW1JbmRleCxcclxuICAgICAgICBldmVudC5rZXlcclxuICAgICAgKTtcclxuICAgICAgaWYgKG5leHQgIT09IG51bGwpIHtcclxuICAgICAgICB0aGlzLmZvY3VzSXRlbShuZXh0KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGludm9rZUl0ZW1DbGljayhpdGVtOiBQYXJzZWRSZHRNZW51SXRlbSkge1xyXG4gICAgaWYgKG1lbnVJdGVtSGFzUm91dGUoaXRlbSkgJiYgaXRlbS5yb3V0ZXJMaW5rKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKGl0ZW0ucm91dGVyTGluayk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm9uSXRlbUNsaWNrKGl0ZW0pO1xyXG4gICAgdGhpcy5hdXRvZm9jdXNTdWJtZW51SXRlbSA9ICdmaXJzdCc7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZmlsdGVySXRlbXMoKSB7XHJcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5yZHRSb3V0ZXIucGFyc2VBYnNvbHV0ZVVybCgpO1xyXG4gICAgaWYgKCFjdXJyZW50KSB7XHJcbiAgICAgIHRoaXMucGFyc2VkSXRlbXMgPSB0aGlzLmFsbFBhcnNlZEl0ZW1zO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5wYXJzZWRJdGVtcyA9IHRoaXMuZmlsdGVyUmVjKHRoaXMuYWxsUGFyc2VkSXRlbXMsIGN1cnJlbnQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jaGlsZFJvdXRlc01hcCA9IGdldENoaWxkUm91dGVzTWFwKHRoaXMucGFyc2VkSXRlbXMpO1xyXG4gICAgdGhpcy5saXN0ZW5TaG9ydGN1dHMoKTtcclxuICAgIHRoaXMuY2QubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZmlsdGVyUmVjKFxyXG4gICAgaXRlbXM6IFBhcnNlZFJkdE1lbnVJdGVtW10sXHJcbiAgICBjdXJyZW50OiB7IHJvdXRlOiBSZHRSb3V0ZTsgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IH1cclxuICApOiBQYXJzZWRSZHRNZW51SXRlbVtdIHtcclxuICAgIGxldCBjdXJyZW50UGFyZW50ID0gY3VycmVudC5yb3V0ZTtcclxuICAgIGNvbnN0IGN1cnJlbnRQYXJhbXMgPSBjdXJyZW50LnBhcmFtcztcclxuXHJcbiAgICBjb25zdCBmaWx0ZXJlZCA9IGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoIWl0ZW0ucmVxdWlyZWRQYXJlbnQpIHtcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCByZXF1aXJlZCA9IGl0ZW0ucmVxdWlyZWRQYXJlbnQ7XHJcbiAgICAgIHdoaWxlIChjdXJyZW50UGFyZW50LmFic29sdXRlUGF0aCAhPT0gcmVxdWlyZWQuYWJzb2x1dGVQYXRoKSB7XHJcbiAgICAgICAgY3VycmVudFBhcmVudCA9IGN1cnJlbnRQYXJlbnQucGFyZW50ITtcclxuICAgICAgICBpZiAoIWN1cnJlbnRQYXJlbnQpIHtcclxuICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgbGV0IHJlcXVpcmVkUGFyZW50OiBSZHRSb3V0ZSB8IG51bGwgPSByZXF1aXJlZDtcclxuICAgICAgZG8ge1xyXG4gICAgICAgIGNvbnN0IHBhdGggPSByZXF1aXJlZFBhcmVudC5hYnNvbHV0ZVBhdGg7XHJcbiAgICAgICAgaWYgKHBhdGggaW4gY3VycmVudFBhcmFtcykge1xyXG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmVxdWlyZWRQYXJlbnQuc3RhdGljUGFyYW1zKSB7XHJcbiAgICAgICAgICAgIGlmIChjdXJyZW50UGFyYW1zW3BhdGhdW2tleV0gIT09IHJlcXVpcmVkUGFyZW50LnN0YXRpY1BhcmFtc1trZXldKSB7XHJcbiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlcXVpcmVkUGFyZW50ID0gcmVxdWlyZWRQYXJlbnQucGFyZW50O1xyXG4gICAgICB9IHdoaWxlIChyZXF1aXJlZFBhcmVudCk7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIGZpbHRlcmVkLm1hcCgoaXRlbSkgPT4ge1xyXG4gICAgICBpZiAoaXRlbS5pdGVtcykge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAuLi5pdGVtLFxyXG4gICAgICAgICAgaXRlbXM6IHRoaXMuZmlsdGVyUmVjKGl0ZW0uaXRlbXMsIGN1cnJlbnQpLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGl0ZW07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGludm9rZUl0ZW1DbGlja0J5SW5kZXgoaXRlbUluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnBhcnNlZEl0ZW1zW2l0ZW1JbmRleF07XHJcbiAgICBpZiAoIWl0ZW0pIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5pbnZva2VJdGVtQ2xpY2soaXRlbSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb3BlblN1Ym1lbnUoXHJcbiAgICBpdGVtSW5kZXg6IG51bWJlcixcclxuICAgIHZpc2libGVGb2N1czogJ2ZpcnN0JyB8ICdsYXN0JyxcclxuICAgIHNyYzogUmR0TWVudUV4cGFuZFNvdXJjZVxyXG4gICkge1xyXG4gICAgaWYgKFxyXG4gICAgICBpdGVtSW5kZXggPCB0aGlzLnBhcnNlZEl0ZW1zLmxlbmd0aCAmJlxyXG4gICAgICBtZW51SXRlbUhhc0NoaWxkcmVuKHRoaXMucGFyc2VkSXRlbXNbaXRlbUluZGV4XSlcclxuICAgICkge1xyXG4gICAgICBjb25zdCBpdGVtID0gdGhpcy5wYXJzZWRJdGVtc1tpdGVtSW5kZXhdO1xyXG4gICAgICB0aGlzLmF1dG9mb2N1c1N1Ym1lbnVJdGVtID0gdmlzaWJsZUZvY3VzO1xyXG4gICAgICB0aGlzLmV4cGFuZGVkQ2hpbGQgPSB7IGl0ZW0sIHNyYyB9O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZvY3VzSXRlbShpdGVtOiBudW1iZXIgfCBQYXJzZWRSZHRNZW51SXRlbSkge1xyXG4gICAgbGV0IGl0ZW1JbmRleDogbnVtYmVyO1xyXG5cclxuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgaXRlbUluZGV4ID0gaXRlbTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1JbmRleCA9IHRoaXMucGFyc2VkSXRlbXMuaW5kZXhPZihpdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXRlbUluZGV4ID49IDAgJiYgaXRlbUluZGV4IDwgdGhpcy5mb2N1c2FibGVFbGVtZW50cy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5ibHVyQWxsRm9jdXNhYmxlKCk7XHJcbiAgICAgIHRoaXMuZm9jdXNGb2N1c2FibGUoaXRlbUluZGV4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmb2N1c05leHRJdGVtKGl0ZW1JbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBuZXh0ID0gKGl0ZW1JbmRleCArIDEpICUgdGhpcy5wYXJzZWRJdGVtcy5sZW5ndGg7XHJcbiAgICB0aGlzLmZvY3VzSXRlbShuZXh0KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmb2N1c1ByZXZJdGVtKGl0ZW1JbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBwcmV2ID1cclxuICAgICAgKGl0ZW1JbmRleCAtIDEgKyB0aGlzLnBhcnNlZEl0ZW1zLmxlbmd0aCkgJSB0aGlzLnBhcnNlZEl0ZW1zLmxlbmd0aDtcclxuICAgIHRoaXMuZm9jdXNJdGVtKHByZXYpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGJsdXJBbGxGb2N1c2FibGUoKSB7XHJcbiAgICB0aGlzLmZvY3VzYWJsZUVsZW1lbnRzLmZvckVhY2goKGVsKSA9PlxyXG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsLm5hdGl2ZUVsZW1lbnQsIEZPQ1VTX1ZJU0lCTEUpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZvY3VzRm9jdXNhYmxlKGl0ZW1JbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBlbFJlZiA9IHRoaXMuZm9jdXNhYmxlRWxlbWVudHMuZ2V0KGl0ZW1JbmRleCk7XHJcbiAgICBpZiAoZWxSZWYpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbFJlZi5uYXRpdmVFbGVtZW50LCBGT0NVU19WSVNJQkxFKTtcclxuICAgICAgZWxSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OnBvaW50ZXJtb3ZlJywgWyckZXZlbnQnXSlcclxuICBwcm90ZWN0ZWQgb25Qb2ludGVyTW92ZShldmVudDogUG9pbnRlckV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5vcGVuT25Ib3ZlciAmJiB0aGlzLmV4cGFuZGVkQ2hpbGQpIHtcclxuICAgICAgY29uc3QgaGl0Ym94ZXMgPSB0aGlzLmdldEhpdGJveGVzKCk7XHJcbiAgICAgIGNvbnN0IGlzSW5zaWRlID0gaGl0Ym94ZXMuc29tZSgoaGl0Ym94KSA9PlxyXG4gICAgICAgIHRoaXMuaXNQb2ludGVySW5zaWRlSGl0Ym94KGhpdGJveC5yZWN0LCBldmVudClcclxuICAgICAgKTtcclxuICAgICAgZm9yIChsZXQgaSA9IGhpdGJveGVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgICAgY29uc3QgaGl0Ym94ID0gaGl0Ym94ZXNbaV07XHJcbiAgICAgICAgaWYgKCFoaXRib3guZml4ZWQgJiYgIWlzSW5zaWRlKSB7XHJcbiAgICAgICAgICBoaXRib3guY2xvc2UoKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQ2xvc2VzIG1lbnUgaWYgdXNlciBuYXZpZ2F0ZXMgb3V0c2lkZSBpdCB1c2luZyBUYWIuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmZvY3Vzb3V0JywgWyckZXZlbnQnXSlcclxuICBwcm90ZWN0ZWQgY2hlY2tBY3RpdmVFbGVtZW50KGV2ZW50OiBGb2N1c0V2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5jbG9zZU9uRm9jdXNPdXQgJiYgIXRoaXMub3Blbk9uSG92ZXIpIHtcclxuICAgICAgY29uc29sZS5sb2coJ2ZvY3Vzb3V0JywgZXZlbnQpO1xyXG5cclxuICAgICAgY29uc3QgdGhpc0VsID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0O1xyXG4gICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgfHwgIXRoaXNFbC5jb250YWlucyh0YXJnZXQpKSB7XHJcbiAgICAgICAgdGhpcy5leHBhbmRlZENoaWxkID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxyXG4gIHByb3RlY3RlZCBvbkRvY3VtZW50Q2xpY2soZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgY29uc3QgZWxSZWYgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAoIWVsUmVmLmNvbnRhaW5zKHRhcmdldCkpIHtcclxuICAgICAgdGhpcy5jbG9zZVN1Ym1lbnVzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgbWVhc3VyZSgpIHtcclxuICAgIHRoaXMubWVhc3VyZUJ1dHRvbkNvbnRhaW5lcigpO1xyXG4gICAgdGhpcy5tZWFzdXJlQ2xpZW50U2l6ZSgpO1xyXG4gICAgdGhpcy5yZWFkTWFyZ2luKCk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVhZE1hcmdpbigpIHtcclxuICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCk7XHJcbiAgICBjb25zdCB0b3BWYWwgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoXHJcbiAgICAgIFJEVF9NRU5VX01BUkdJTl9UT1BfUFJPUEVSVFlfTkFNRVxyXG4gICAgKTtcclxuICAgIGNvbnN0IGJvdHRvbVZhbCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcclxuICAgICAgUkRUX01FTlVfTUFSR0lOX0JPVFRPTV9QUk9QRVJUWV9OQU1FXHJcbiAgICApO1xyXG4gICAgY29uc3QgbGVmdFZhbCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcclxuICAgICAgUkRUX01FTlVfTUFSR0lOX0xFRlRfUFJPUEVSVFlfTkFNRVxyXG4gICAgKTtcclxuICAgIGNvbnN0IHJpZ2h0VmFsID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFxyXG4gICAgICBSRFRfTUVOVV9NQVJHSU5fUklHSFRfUFJPUEVSVFlfTkFNRVxyXG4gICAgKTtcclxuICAgIHRoaXMuX2JvZHlNYXJnaW4gPSB7XHJcbiAgICAgIHRvcDogcGFyc2VJbnQodG9wVmFsKSB8fCAwLFxyXG4gICAgICBib3R0b206IHBhcnNlSW50KGJvdHRvbVZhbCkgfHwgMCxcclxuICAgICAgbGVmdDogcGFyc2VJbnQobGVmdFZhbCkgfHwgMCxcclxuICAgICAgcmlnaHQ6IHBhcnNlSW50KHJpZ2h0VmFsKSB8fCAwLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBtZWFzdXJlQ2xpZW50U2l6ZSgpIHtcclxuICAgIHRoaXMuX2NsaWVudFNpemUgPSB7XHJcbiAgICAgIHdpZHRoOiB0aGlzLmRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgsXHJcbiAgICAgIGhlaWdodDogdGhpcy5kb2N1bWVudC5ib2R5LmNsaWVudEhlaWdodCxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgbWVhc3VyZUJ1dHRvbkNvbnRhaW5lcigpIHtcclxuICAgIGNvbnN0IGVsID0gdGhpcy5idXR0b25Db250YWluZXI7XHJcbiAgICBpZiAoZWwpIHtcclxuICAgICAgdGhpcy5fYnV0dG9uQ29udGFpbmVyUmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fYnV0dG9uQ29udGFpbmVyUmVjdCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBsaXN0ZW5XaW5kb3dSZXNpemUoKSB7XHJcbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGhyb3R0bGVUaW1lKDAsIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCB7IHRyYWlsaW5nOiB0cnVlIH0pLFxyXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZWFzdXJlKCk7XHJcbiAgICAgICAgdGhpcy5yZWNhbGN1bGF0ZUNoaWxkcmVuKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGxpc3RlblNob3J0Y3V0cygpIHtcclxuICAgIGNvbnN0IGl0ZW1zV2l0aFNob3J0Y3V0cyA9IGdldE1lbnVJdGVtc1Nob3J0Y3V0cyh0aGlzLnBhcnNlZEl0ZW1zKTtcclxuICAgIGNvbnN0IHNob3J0Y3V0czogUmR0U2hvcnRjdXRbXSA9IGl0ZW1zV2l0aFNob3J0Y3V0cy5tYXAoXHJcbiAgICAgIChpdCkgPT4gaXQuc2hvcnRjdXRcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5zaG9ydGN1dE1hcCA9IHRoaXMuZ2V0U2hvcnRjdXRNYXAoaXRlbXNXaXRoU2hvcnRjdXRzKTtcclxuICAgIHRoaXMuc2hvcnRjdXRTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuc2hvcnRjdXRTdWIgPSB0aGlzLnNob3J0Y3V0U2VydmljZVxyXG4gICAgICAubGlzdGVuKHNob3J0Y3V0cylcclxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGV2dCkgPT4gdGhpcy5vblNob3J0Y3V0KGV2dC5zaG9ydGN1dCkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldFNob3J0Y3V0TWFwKFxyXG4gICAgaXRlbXNXaXRoU2hvcnRjdXRzOiBQYXJzZWRSZHRNZW51SXRlbVdpdGhTaG9ydGN1dFtdXHJcbiAgKSB7XHJcbiAgICBjb25zdCBzaG9ydGN1dE1hcDogUmVjb3JkPHN0cmluZywgUGFyc2VkUmR0TWVudUl0ZW1bXT4gPSB7fTtcclxuICAgIGl0ZW1zV2l0aFNob3J0Y3V0cy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIHNob3J0Y3V0TWFwW2l0ZW0uc2hvcnRjdXQuaG90a2V5c1ZhbHVlXSA9IGl0ZW0ucGF0aDtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHNob3J0Y3V0TWFwO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uU2hvcnRjdXQoc2hvcnRjdXQ6IFJkdFNob3J0Y3V0KSB7XHJcbiAgICBjb25zdCBwYXRoID0gdGhpcy5zaG9ydGN1dE1hcFtzaG9ydGN1dC5ob3RrZXlzVmFsdWVdO1xyXG4gICAgaWYgKCFwYXRoKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBgTWVudSBzaG9ydGN1dCAke3Nob3J0Y3V0LmhvdGtleXNWYWx1ZX0gd2FzIGRldGVjdGVkLCBidXQgdGhlcmUgaXMgbm8gcGF0aCBhc3NvY2lhdGVkIHdpdGggaXQuYCxcclxuICAgICAgICB0aGlzLnNob3J0Y3V0TWFwXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBsYXN0ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xyXG4gICAgY29uc3QgaGFzUm91dGUgPSBtZW51SXRlbUhhc1JvdXRlKGxhc3QpO1xyXG4gICAgY29uc3QgaGFzQ29tbWFuZCA9IHR5cGVvZiBsYXN0LmNvbW1hbmQgPT09ICdmdW5jdGlvbic7XHJcbiAgICBpZiAoaGFzUm91dGUgfHwgaGFzQ29tbWFuZCkge1xyXG4gICAgICB0aGlzLmNsb3NlU3VibWVudXMoZmFsc2UpO1xyXG4gICAgICBpZiAoaGFzQ29tbWFuZCkge1xyXG4gICAgICAgIGxhc3QuY29tbWFuZCEoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaGFzUm91dGUpIHtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShsYXN0LnJvdXRlckxpbmshKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3RpdmF0ZUl0ZW1SZWN1cnNpdmVseShwYXRoLCBSZHRNZW51RXhwYW5kU291cmNlLlNob3J0Y3V0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhY3RpdmF0ZUl0ZW1SZWN1cnNpdmVseShcclxuICAgIHBhdGg6IFBhcnNlZFJkdE1lbnVJdGVtW10sXHJcbiAgICBzcmM6IFJkdE1lbnVFeHBhbmRTb3VyY2VcclxuICApIHtcclxuICAgIGNvbnN0IGNoaWxkcmVuID0gWy4uLnBhdGhdO1xyXG5cclxuICAgIGlmICh0aGlzLnNob3J0Y3V0TW9kZSA9PT0gUmR0TWVudVNob3J0Y3V0TW9kZS5PUEVOX1NVQk1FTlUpIHtcclxuICAgICAgY29uc3QgbGFzdCA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdO1xyXG4gICAgICBpZiAobWVudUl0ZW1IYXNDaGlsZHJlbihsYXN0KSAmJiBsYXN0Lml0ZW1zWzBdKSB7XHJcbiAgICAgICAgY2hpbGRyZW4ucHVzaChsYXN0Lml0ZW1zWzBdKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHRoaXNJdGVtID0gY2hpbGRyZW4uc2hpZnQoKSE7XHJcblxyXG4gICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5leHBhbmRlZENoaWxkID0geyBpdGVtOiB0aGlzSXRlbSwgc3JjIH07XHJcbiAgICAgIGNvbnN0IG92ZXJsYXkgPSB0aGlzLmNoaWxkcmVuLmZpbmQoKGNoaWxkKSA9PiBjaGlsZC5pdGVtID09PSB0aGlzSXRlbSk7XHJcbiAgICAgIG92ZXJsYXkhLmZvY3VzSXRlbVJlY3Vyc2l2ZWx5KGNoaWxkcmVuKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZXhwYW5kZWRDaGlsZCA9IG51bGw7XHJcbiAgICAgIHRoaXMuZm9jdXNJdGVtKHRoaXNJdGVtKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzUG9pbnRlckluc2lkZUhpdGJveChoaXRib3g6IERPTVJlY3QsIGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcclxuICAgIGNvbnN0IHJlY3QgPSBoaXRib3g7XHJcbiAgICBjb25zdCB4ID0gZXZlbnQuY2xpZW50WDtcclxuICAgIGNvbnN0IHkgPSBldmVudC5jbGllbnRZO1xyXG5cclxuICAgIHJldHVybiAoXHJcbiAgICAgIHggPj0gcmVjdC5sZWZ0IC0gdGhpcy5oaXRib3hNYXJnaW4gJiZcclxuICAgICAgeCA8PSByZWN0LnJpZ2h0ICsgdGhpcy5oaXRib3hNYXJnaW4gJiZcclxuICAgICAgeSA+PSByZWN0LnRvcCAtIHRoaXMuaGl0Ym94TWFyZ2luICYmXHJcbiAgICAgIHkgPD0gcmVjdC5ib3R0b20gKyB0aGlzLmhpdGJveE1hcmdpblxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdldEhpdGJveGVzKCk6IHsgcmVjdDogRE9NUmVjdDsgZml4ZWQ6IGJvb2xlYW47IGNsb3NlOiAoKSA9PiB2b2lkIH1bXSB7XHJcbiAgICBjb25zdCBib3hlcyA9IHRoaXMuZ2V0T3Blbk1lbnVCb3VuZGluZ0JveGVzKCk7XHJcbiAgICBjb25zdCBidXR0b25Db250YWluZXJSZWN0ID0gdGhpcy5idXR0b25Db250YWluZXJSZWN0O1xyXG4gICAgaWYgKGJ1dHRvbkNvbnRhaW5lclJlY3QpIHtcclxuICAgICAgYm94ZXMucHVzaCh7IHJlY3Q6IGJ1dHRvbkNvbnRhaW5lclJlY3QsIGZpeGVkOiB0cnVlLCBjbG9zZTogKCkgPT4ge30gfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYm94ZXM7XHJcbiAgfVxyXG5cclxuICBnZXRPcGVuTWVudUJvdW5kaW5nQm94ZXMoKSB7XHJcbiAgICBjb25zdCBib3hlczogeyByZWN0OiBET01SZWN0OyBmaXhlZDogYm9vbGVhbjsgY2xvc2U6ICgpID0+IHZvaWQgfVtdID0gW107XHJcbiAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goKG92ZXJsYXkpID0+IHtcclxuICAgICAgdGhpcy5nZXRPcGVuTWVudUJvdW5kaW5nQm94ZXNSZWMob3ZlcmxheSwgYm94ZXMpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gYm94ZXM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE9wZW5NZW51Qm91bmRpbmdCb3hlc1JlYyhcclxuICAgIG92ZXJsYXk6IFJkdE1lbnVPdmVybGF5Q29tcG9uZW50LFxyXG4gICAgYm94ZXM6IHsgcmVjdDogRE9NUmVjdDsgZml4ZWQ6IGJvb2xlYW47IGNsb3NlOiAoKSA9PiB2b2lkIH1bXVxyXG4gICk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKG92ZXJsYXkuZXhwYW5kZWQpIHtcclxuICAgICAgbGV0IHNvbWVCeUNsaWNrID0gZmFsc2U7XHJcbiAgICAgIG92ZXJsYXkuY2hpbGRyZW4uZm9yRWFjaChcclxuICAgICAgICAoY2hpbGQpID0+XHJcbiAgICAgICAgICAoc29tZUJ5Q2xpY2sgfHw9IHRoaXMuZ2V0T3Blbk1lbnVCb3VuZGluZ0JveGVzUmVjKGNoaWxkLCBib3hlcykpXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnN0IGZpeGVkID1cclxuICAgICAgICBzb21lQnlDbGljayB8fCBvdmVybGF5LnNlbGZFeHBhbmRTcmMgPT09IFJkdE1lbnVFeHBhbmRTb3VyY2UuQ2xpY2s7XHJcbiAgICAgIGJveGVzLnB1c2goe1xyXG4gICAgICAgIHJlY3Q6IG92ZXJsYXkuYm94LFxyXG4gICAgICAgIGZpeGVkOiBmaXhlZCxcclxuICAgICAgICBjbG9zZTogKCkgPT4gb3ZlcmxheS5jbG9zZVNlbGYoKSxcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiBmaXhlZDtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcbn1cclxuIl19
|