@fundamental-ngx/core 0.43.52 → 0.43.53
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/combobox/combobox.component.d.ts +0 -2
- package/dynamic-page/dynamic-page-header/header/dynamic-page-header.component.d.ts +3 -1
- package/esm2020/combobox/combobox.component.mjs +1 -7
- package/esm2020/datetime-picker/datetime-picker.component.mjs +8 -4
- package/esm2020/dynamic-page/dynamic-page-header/header/dynamic-page-header.component.mjs +8 -4
- package/esm2020/list/list-navigation-item/list-navigation-item.component.mjs +3 -5
- package/esm2020/multi-combobox/multi-combobox.component.mjs +3 -8
- package/esm2020/multi-input/multi-input.component.mjs +5 -15
- package/esm2020/popover/popover.component.mjs +14 -2
- package/esm2020/token/tokenizer.component.mjs +39 -13
- package/esm2020/vertical-navigation/vertical-navigation.component.mjs +3 -3
- package/fesm2015/fundamental-ngx-core-combobox.mjs +0 -6
- package/fesm2015/fundamental-ngx-core-combobox.mjs.map +1 -1
- package/fesm2015/fundamental-ngx-core-datetime-picker.mjs +7 -3
- package/fesm2015/fundamental-ngx-core-datetime-picker.mjs.map +1 -1
- package/fesm2015/fundamental-ngx-core-dynamic-page.mjs +7 -3
- package/fesm2015/fundamental-ngx-core-dynamic-page.mjs.map +1 -1
- package/fesm2015/fundamental-ngx-core-list.mjs +2 -4
- package/fesm2015/fundamental-ngx-core-list.mjs.map +1 -1
- package/fesm2015/fundamental-ngx-core-multi-combobox.mjs +2 -7
- package/fesm2015/fundamental-ngx-core-multi-combobox.mjs.map +1 -1
- package/fesm2015/fundamental-ngx-core-multi-input.mjs +4 -14
- package/fesm2015/fundamental-ngx-core-multi-input.mjs.map +1 -1
- package/fesm2015/fundamental-ngx-core-popover.mjs +13 -1
- package/fesm2015/fundamental-ngx-core-popover.mjs.map +1 -1
- package/fesm2015/fundamental-ngx-core-token.mjs +41 -15
- package/fesm2015/fundamental-ngx-core-token.mjs.map +1 -1
- package/fesm2015/fundamental-ngx-core-vertical-navigation.mjs +2 -2
- package/fesm2015/fundamental-ngx-core-vertical-navigation.mjs.map +1 -1
- package/fesm2020/fundamental-ngx-core-combobox.mjs +0 -6
- package/fesm2020/fundamental-ngx-core-combobox.mjs.map +1 -1
- package/fesm2020/fundamental-ngx-core-datetime-picker.mjs +7 -3
- package/fesm2020/fundamental-ngx-core-datetime-picker.mjs.map +1 -1
- package/fesm2020/fundamental-ngx-core-dynamic-page.mjs +7 -3
- package/fesm2020/fundamental-ngx-core-dynamic-page.mjs.map +1 -1
- package/fesm2020/fundamental-ngx-core-list.mjs +2 -4
- package/fesm2020/fundamental-ngx-core-list.mjs.map +1 -1
- package/fesm2020/fundamental-ngx-core-multi-combobox.mjs +2 -7
- package/fesm2020/fundamental-ngx-core-multi-combobox.mjs.map +1 -1
- package/fesm2020/fundamental-ngx-core-multi-input.mjs +4 -14
- package/fesm2020/fundamental-ngx-core-multi-input.mjs.map +1 -1
- package/fesm2020/fundamental-ngx-core-popover.mjs +13 -1
- package/fesm2020/fundamental-ngx-core-popover.mjs.map +1 -1
- package/fesm2020/fundamental-ngx-core-token.mjs +38 -14
- package/fesm2020/fundamental-ngx-core-token.mjs.map +1 -1
- package/fesm2020/fundamental-ngx-core-vertical-navigation.mjs +2 -2
- package/fesm2020/fundamental-ngx-core-vertical-navigation.mjs.map +1 -1
- package/fundamental-ngx-core-v0.43.53.tgz +0 -0
- package/multi-input/multi-input.component.d.ts +1 -5
- package/package.json +3 -3
- package/popover/popover.component.d.ts +2 -0
- package/schematics/add-dependencies/index.js +4 -4
- package/token/tokenizer.component.d.ts +13 -3
- package/fundamental-ngx-core-v0.43.52.tgz +0 -0
|
@@ -6,18 +6,22 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, Co
|
|
|
6
6
|
import { KeyUtil, RtlService, applyCssClass, resizeObservable } from '@fundamental-ngx/cdk/utils';
|
|
7
7
|
import { ContentDensityObserver, contentDensityObserverProviders } from '@fundamental-ngx/core/content-density';
|
|
8
8
|
import { FormControlComponent } from '@fundamental-ngx/core/form';
|
|
9
|
-
import { BehaviorSubject, Subject, Subscription, fromEvent, merge, startWith } from 'rxjs';
|
|
9
|
+
import { BehaviorSubject, Observable, Subject, Subscription, firstValueFrom, fromEvent, merge, startWith } from 'rxjs';
|
|
10
10
|
import { debounceTime, filter, map, takeUntil } from 'rxjs/operators';
|
|
11
11
|
import { TokenComponent } from './token.component';
|
|
12
|
+
import { LiveAnnouncer } from '@angular/cdk/a11y';
|
|
13
|
+
import { FD_LANGUAGE, TranslationResolver } from '@fundamental-ngx/i18n';
|
|
12
14
|
import * as i0 from "@angular/core";
|
|
13
15
|
import * as i1 from "@fundamental-ngx/core/content-density";
|
|
14
16
|
import * as i2 from "@fundamental-ngx/cdk/utils";
|
|
15
|
-
import * as i3 from "@angular/
|
|
16
|
-
import * as i4 from "@
|
|
17
|
-
import * as i5 from "@fundamental-ngx/core/
|
|
18
|
-
import * as i6 from "@fundamental-ngx/core/
|
|
19
|
-
import * as i7 from "@fundamental-ngx/core/
|
|
20
|
-
import * as i8 from "@fundamental-ngx/
|
|
17
|
+
import * as i3 from "@angular/cdk/a11y";
|
|
18
|
+
import * as i4 from "@angular/common";
|
|
19
|
+
import * as i5 from "@fundamental-ngx/core/input-group";
|
|
20
|
+
import * as i6 from "@fundamental-ngx/core/button";
|
|
21
|
+
import * as i7 from "@fundamental-ngx/core/popover";
|
|
22
|
+
import * as i8 from "@fundamental-ngx/core/list";
|
|
23
|
+
import * as i9 from "@fundamental-ngx/i18n";
|
|
24
|
+
import * as i10 from "rxjs";
|
|
21
25
|
export class TokenizerComponent {
|
|
22
26
|
/** @hidden */
|
|
23
27
|
set content(content) {
|
|
@@ -42,13 +46,15 @@ export class TokenizerComponent {
|
|
|
42
46
|
return this._contentDensityObserver.isCompact;
|
|
43
47
|
}
|
|
44
48
|
/** @hidden */
|
|
45
|
-
constructor(_contentDensityObserver, elementRef, _cdRef, _rtlService, _renderer, _document) {
|
|
49
|
+
constructor(_contentDensityObserver, elementRef, _cdRef, _rtlService, _renderer, _document, _liveAnnouncer, _language$) {
|
|
46
50
|
this._contentDensityObserver = _contentDensityObserver;
|
|
47
51
|
this.elementRef = elementRef;
|
|
48
52
|
this._cdRef = _cdRef;
|
|
49
53
|
this._rtlService = _rtlService;
|
|
50
54
|
this._renderer = _renderer;
|
|
51
55
|
this._document = _document;
|
|
56
|
+
this._liveAnnouncer = _liveAnnouncer;
|
|
57
|
+
this._language$ = _language$;
|
|
52
58
|
/** Disables possibility to remove tokens by keyboard */
|
|
53
59
|
this.disableKeyboardDeletion = false;
|
|
54
60
|
/** Whether to use cozy visuals but compact collapsing behavior. */
|
|
@@ -75,6 +81,8 @@ export class TokenizerComponent {
|
|
|
75
81
|
this._showMoreElement = false;
|
|
76
82
|
/** @hidden */
|
|
77
83
|
this._tokensContainerWidth = 'auto';
|
|
84
|
+
/** @hidden */
|
|
85
|
+
this._translationResolver = new TranslationResolver();
|
|
78
86
|
/** @hidden
|
|
79
87
|
* Variable which will keep the index of the first token pressed in the tokenizer
|
|
80
88
|
*/
|
|
@@ -108,7 +116,8 @@ export class TokenizerComponent {
|
|
|
108
116
|
/** @hidden */
|
|
109
117
|
ngAfterViewInit() {
|
|
110
118
|
if (this.input?.nativeElement) {
|
|
111
|
-
this.
|
|
119
|
+
this._setupInputKeydownEvent();
|
|
120
|
+
this._setupInputFocusEvent();
|
|
112
121
|
}
|
|
113
122
|
// watch for changes to the tokenList and attempt to expand/collapse tokens as needed
|
|
114
123
|
this.tokenList.changes.pipe(startWith(null)).subscribe(() => {
|
|
@@ -499,11 +508,25 @@ export class TokenizerComponent {
|
|
|
499
508
|
}
|
|
500
509
|
}
|
|
501
510
|
/** @hidden */
|
|
502
|
-
|
|
511
|
+
_setupInputKeydownEvent() {
|
|
503
512
|
this._eventListeners.push(this._renderer.listen(this.input.nativeElement, 'keydown', (event) => {
|
|
504
513
|
this.handleKeyDown(event, this.tokenList.length);
|
|
505
514
|
}));
|
|
506
515
|
}
|
|
516
|
+
/** @hidden */
|
|
517
|
+
_setupInputFocusEvent() {
|
|
518
|
+
this._eventListeners.push(this._renderer.listen(this.input.nativeElement, 'focus', () => {
|
|
519
|
+
this._makeTokenizerFocusCountAnnouncement();
|
|
520
|
+
}));
|
|
521
|
+
}
|
|
522
|
+
/** @hidden */
|
|
523
|
+
async _makeTokenizerFocusCountAnnouncement() {
|
|
524
|
+
const lang = await firstValueFrom(this._language$);
|
|
525
|
+
const message = this._translationResolver.resolve(lang, 'coreMultiInput.tokensCountText', {
|
|
526
|
+
length: this.tokenList.length ? this.tokenList.length : 0
|
|
527
|
+
});
|
|
528
|
+
this._liveAnnouncer.announce(message);
|
|
529
|
+
}
|
|
507
530
|
/** @hidden Method which handles what happens to token when it is clicked and no key is being held down.*/
|
|
508
531
|
_basicSelected(token, index) {
|
|
509
532
|
this.tokenList.forEach((shadowedToken) => {
|
|
@@ -651,8 +674,8 @@ export class TokenizerComponent {
|
|
|
651
674
|
this._cdRef.detectChanges();
|
|
652
675
|
}
|
|
653
676
|
}
|
|
654
|
-
TokenizerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TokenizerComponent, deps: [{ token: i1.ContentDensityObserver }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i2.RtlService, optional: true }, { token: i0.Renderer2 }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component });
|
|
655
|
-
TokenizerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: TokenizerComponent, selector: "fd-tokenizer", inputs: { class: "class", disableKeyboardDeletion: "disableKeyboardDeletion", compactCollapse: "compactCollapse", tokenizerFocusable: "tokenizerFocusable", inputValue: "inputValue", glyph: "glyph", moreTerm: "moreTerm", open: "open" }, outputs: { moreClickedEvent: "moreClickedEvent" }, host: { listeners: { "keydown": "keyDown($event)" } }, providers: [contentDensityObserverProviders()], queries: [{ propertyName: "input", first: true, predicate: i0.forwardRef(function () { return FormControlComponent; }), descendants: true, read: ElementRef }, { propertyName: "tokenList", predicate: i0.forwardRef(function () { return TokenComponent; }) }], viewQueries: [{ propertyName: "tokenizerInnerEl", first: true, predicate: ["tokenizerInner"], descendants: true }, { propertyName: "moreElement", first: true, predicate: ["moreElementSpan"], descendants: true }, { propertyName: "content", first: true, predicate: ["inputGroupAddOn"], descendants: true }, { propertyName: "_viewContainer", predicate: ["viewContainer"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: "<div class=\"fd-tokenizer fd-tokenizer--scrollable\" [class.is-focus]=\"_tokenizerHasFocus\">\n <div class=\"fd-tokenizer__inner\" #tokenizerInner>\n <div\n role=\"listbox\"\n [attr.aria-label]=\"'coreTokenizer.tokenizerLabel' | fdTranslate\"\n [style.width]=\"_tokensContainerWidth\"\n [attr.aria-hidden]=\"tokenList.length === 0\"\n >\n <ng-content select=\"fd-token\"></ng-content>\n </div>\n\n <ng-container *ngIf=\"_showOverflowPopover && ((_compact$ | async) || compactCollapse); else moreElement\">\n <ng-container *ngTemplateOutlet=\"tokensOverflow\"></ng-container>\n </ng-container>\n\n <ng-content select=\"[fd-form-control]\"></ng-content>\n </div>\n <span fd-input-group-addon *ngIf=\"glyph\" #inputGroupAddOn [button]=\"true\" placement=\"after\">\n <button fd-button class=\"fd-tokenizer-addon\" fdType=\"transparent\" [glyph]=\"glyph\" type=\"button\"></button>\n </span>\n</div>\n\n<ng-template #tokensOverflow>\n <fd-popover placement=\"bottom-start\" title=\"\" [noArrow]=\"false\" [focusTrapped]=\"true\" [focusAutoCapture]=\"true\">\n <fd-popover-control>\n <ng-container *ngTemplateOutlet=\"moreElement\"></ng-container>\n </fd-popover-control>\n\n <fd-popover-body>\n <ul fd-list class=\"fd-tokenizer__overflow-list\">\n <li fd-list-item class=\"fd-tokenizer__overflow-list-item\" *ngFor=\"let token of _hiddenTokens\">\n <ng-container #viewContainer></ng-container>\n\n <span\n *ngIf=\"!token.readOnly\"\n class=\"fd-token__close\"\n role=\"button\"\n [attr.aria-label]=\"token.deleteButtonLabel || ('coreToken.deleteButtonLabel' | fdTranslate)\"\n (click)=\"token.closeClickHandler($event)\"\n ></span>\n </li>\n </ul>\n </fd-popover-body>\n </fd-popover>\n</ng-template>\n\n<ng-template #moreElement>\n <span\n (click)=\"moreClicked()\"\n *ngIf=\"_showMoreElement && _hiddenTokens.length > 0 && !_tokenizerHasFocus\"\n #moreElementSpan\n class=\"fd-tokenizer-more\"\n role=\"button\"\n tabindex=\"-1\"\n >\n <ng-container *ngIf=\"(_compact$ | async) || compactCollapse\">\n {{ 'coreTokenizer.moreLabel' | fdTranslate : { count: moreTokensLeft.length + moreTokensRight.length } }}\n </ng-container>\n <ng-container *ngIf=\"(_compact$ | async) === false && !compactCollapse\">\n {{ 'coreTokenizer.moreLabel' | fdTranslate : { count: hiddenCozyTokenCount } }}\n </ng-container>\n </span>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.28.3\n * Copyright (c) 2023 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n */.fd-tokenizer{-webkit-box-sizing:border-box;-webkit-box-shadow:none;-moz-appearance:none;-webkit-appearance:none;align-items:center;appearance:none;background:var(--sapField_BackgroundStyle, var(--sapField_BackgroundStyle));background-color:var(--sapField_Background, var(--sapField_Background));border:none;border-radius:var(--sapField_BorderCornerRadius);box-shadow:none;box-sizing:border-box;color:var(--sapTextColor);color:var(--sapField_TextColor);cursor:text;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:2.25rem;height:auto;line-height:var(--sapContent_LineHeight);margin:0;min-height:2.25rem;min-width:var(2.75rem, 2.75rem);outline:none;overflow:hidden;padding:0;text-overflow:ellipsis;text-shadow:var(--fdInput_Text_Shadow);white-space:nowrap;width:100%;z-index:1}.fd-tokenizer:after,.fd-tokenizer:before{box-sizing:inherit;font-size:inherit}.fd-tokenizer::placeholder{color:var(--sapField_PlaceholderTextColor);font-style:var(--fdPlaceholder_Font_Style)}.fd-tokenizer[dir=rtl]::placeholder,[dir=rtl] .fd-tokenizer::placeholder{text-indent:.125rem}.fd-tokenizer::selection{background-color:var(--sapSelectedColor);color:var(--sapContent_ContrastTextColor)}.fd-tokenizer::-ms-clear{display:none}.fd-tokenizer.is-hover,.fd-tokenizer:hover{-webkit-box-shadow:var(--fdInput_Box_Shadow_Hover);background:var(--sapField_Hover_BackgroundStyle, var(--sapField_Hover_BackgroundStyle));background-color:var(--sapField_Hover_Background, var(--sapField_Hover_Background));border-color:var(--sapField_Hover_BorderColor);box-shadow:var(--fdInput_Box_Shadow_Hover)}.fd-tokenizer.is-focus,.fd-tokenizer:focus{background:var(--sapField_Focus_Background, var(--sapField_Focus_Background));outline-color:var(--fdInput_Outline_Color);outline-offset:var(--fdInput_Outline_Offset)}.fd-tokenizer.is-hover,.fd-tokenizer:hover{box-shadow:none}.fd-tokenizer__inner{-ms-overflow-style:none;-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:end;-ms-flex-pack:end;align-items:center;display:flex;float:right;justify-content:flex-end;overflow:hidden;padding:var(--fdTokenizer_Inner_Padding, 0 .3125rem);scrollbar-width:none;white-space:nowrap;width:100%}.fd-tokenizer__inner::-webkit-scrollbar{display:none}.fd-tokenizer .fd-token{margin-right:.3125rem;max-width:calc(100% - 3.3125rem)}.fd-tokenizer .fd-token[dir=rtl],[dir=rtl] .fd-tokenizer .fd-token{margin:0 0 0 .3125rem}.fd-tokenizer__indicator{-webkit-box-sizing:border-box;border:0;box-sizing:border-box;color:var(--sapTextColor);cursor:pointer;display:inline-block;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:var(--sapContent_LineHeight);margin:0;padding:0}.fd-tokenizer__indicator:after,.fd-tokenizer__indicator:before{box-sizing:inherit;font-size:inherit}.fd-tokenizer .fd-tokenizer__input{background:transparent}.fd-tokenizer .fd-tokenizer__input.fd-input{border:none;min-width:var(--fdTokenizer_Input_Width, 3rem);padding:0}.fd-tokenizer .fd-tokenizer__input:first-child{padding:0 .3125rem}.fd-tokenizer .fd-tokenizer__input:last-child{flex-basis:100%}.fd-tokenizer .fd-tokenizer__input.is-focus,.fd-tokenizer .fd-tokenizer__input:focus{border:none;outline:none;z-index:5}.fd-tokenizer .fd-tokenizer__input.is-focus,.fd-tokenizer .fd-tokenizer__input.is-hover,.fd-tokenizer .fd-tokenizer__input:focus,.fd-tokenizer .fd-tokenizer__input:hover{-webkit-box-shadow:none;background:none;background-color:var(transparent, transparent);box-shadow:none}.fd-tokenizer.is-focus,.fd-tokenizer:focus{-webkit-box-shadow:none;border:none;box-shadow:none;outline-color:var(--sapContent_FocusColor);outline-offset:-.0625rem;outline-style:var(--sapContent_FocusStyle);outline-width:var(--sapContent_FocusWidth);z-index:5}.fd-tokenizer[class*=-compact],.fd-tokenizer[class*=-condensed],[class*=-compact] .fd-tokenizer:not([class*=-cozy]),[class*=-condensed] .fd-tokenizer:not([class*=-cozy]){--fdTokenizer_Inner_Padding:0 .25rem;--fdInput_Field_Compact_Min_Width:2rem;height:1.625rem;min-height:1.625rem}.fd-tokenizer[class*=-compact] .fd-tokenizer__input:first-child,.fd-tokenizer[class*=-condensed] .fd-tokenizer__input:first-child,[class*=-compact] .fd-tokenizer:not([class*=-cozy]) .fd-tokenizer__input:first-child,[class*=-condensed] .fd-tokenizer:not([class*=-cozy]) .fd-tokenizer__input:first-child{padding:0 .25rem}.fd-tokenizer[class*=-compact] .fd-token,.fd-tokenizer[class*=-condensed] .fd-token,[class*=-compact] .fd-tokenizer:not([class*=-cozy]) .fd-token,[class*=-condensed] .fd-tokenizer:not([class*=-cozy]) .fd-token{margin-right:.25rem;max-width:calc(100% - 2.25rem)}.fd-tokenizer[class*=-compact] .fd-token[dir=rtl],.fd-tokenizer[class*=-condensed] .fd-token[dir=rtl],[class*=-compact] .fd-tokenizer:not([class*=-cozy]) .fd-token[dir=rtl],[class*=-condensed] .fd-tokenizer:not([class*=-cozy]) .fd-token[dir=rtl],[dir=rtl] .fd-tokenizer[class*=-compact] .fd-token,[dir=rtl] .fd-tokenizer[class*=-condensed] .fd-token,[dir=rtl] [class*=-compact] .fd-tokenizer:not([class*=-cozy]) .fd-token,[dir=rtl] [class*=-condensed] .fd-tokenizer:not([class*=-cozy]) .fd-token{margin:0 0 0 .3125rem}.fd-tokenizer--readonly{background-color:var(--sapField_ReadOnly_Background);overflow:visible}.fd-tokenizer--readonly .fd-tokenizer__inner{overflow:visible}.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true],.fd-tokenizer--readonly .fd-tokenizer__input[readonly]{-webkit-box-shadow:none;background:none;background-color:var(transparent, transparent);box-shadow:none}.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly.is-focus,.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly:focus,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true].is-focus,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true]:focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly].is-focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly]:focus{-webkit-box-shadow:none;background:none;background-color:var(transparent, transparent);box-shadow:none;z-index:5}.fd-tokenizer--scrollable .fd-tokenizer__inner{justify-content:normal;overflow:scroll}.fd-tokenizer .fd-token{max-width:inherit!important}input.fd-input.fd-tokenizer__input{background-color:transparent;margin-right:1px;border:none;outline:none}.fd-tokenizer-more{padding-right:.5rem;color:var(--sapLinkColor);cursor:pointer}[dir=rtl] .fd-tokenizer-more,.fd-tokenizer-more[dir=rtl]{padding-left:.5rem;padding-right:0}.fd-input-group__addon--button .fd-input-group__button.fd-tokenizer-addon{height:2.25rem}.fd-input-group__addon--button .fd-input-group__button.fd-tokenizer-addon--compact{height:1.625rem}.fd-tokenizer__overflow-list-item{display:flex;justify-content:space-between}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.InputGroupAddOnDirective, selector: "[fdInputGroupAddon], [fd-input-group-addon]", inputs: ["class", "placement", "type", "state", "button"] }, { kind: "component", type: i5.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i6.PopoverControlComponent, selector: "fd-popover-control" }, { kind: "component", type: i6.PopoverBodyComponent, selector: "fd-popover-body" }, { kind: "component", type: i6.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig", "preventSpaceKeyScroll"] }, { kind: "component", type: i7.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "unreadIndicator", "role"], outputs: ["focusEscapeList"] }, { kind: "component", type: i7.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "ariaDescribedBy", "noData", "action", "interactive", "growing", "counter", "unread", "byline", "selectedListItemScreenReaderText", "navigatedListItemScreenReaderText", "navigatableListItemScreenReaderText", "ariaRole", "preventClick"], outputs: ["keyDown"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
677
|
+
TokenizerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TokenizerComponent, deps: [{ token: i1.ContentDensityObserver }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i2.RtlService, optional: true }, { token: i0.Renderer2 }, { token: DOCUMENT }, { token: i3.LiveAnnouncer }, { token: FD_LANGUAGE }], target: i0.ɵɵFactoryTarget.Component });
|
|
678
|
+
TokenizerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: TokenizerComponent, selector: "fd-tokenizer", inputs: { class: "class", disableKeyboardDeletion: "disableKeyboardDeletion", compactCollapse: "compactCollapse", tokenizerFocusable: "tokenizerFocusable", inputValue: "inputValue", glyph: "glyph", moreTerm: "moreTerm", open: "open" }, outputs: { moreClickedEvent: "moreClickedEvent" }, host: { listeners: { "keydown": "keyDown($event)" } }, providers: [contentDensityObserverProviders()], queries: [{ propertyName: "input", first: true, predicate: i0.forwardRef(function () { return FormControlComponent; }), descendants: true, read: ElementRef }, { propertyName: "tokenList", predicate: i0.forwardRef(function () { return TokenComponent; }) }], viewQueries: [{ propertyName: "tokenizerInnerEl", first: true, predicate: ["tokenizerInner"], descendants: true }, { propertyName: "moreElement", first: true, predicate: ["moreElementSpan"], descendants: true }, { propertyName: "content", first: true, predicate: ["inputGroupAddOn"], descendants: true }, { propertyName: "_viewContainer", predicate: ["viewContainer"], descendants: true, read: ViewContainerRef }], usesOnChanges: true, ngImport: i0, template: "<div class=\"fd-tokenizer fd-tokenizer--scrollable\" [class.is-focus]=\"_tokenizerHasFocus\">\n <div class=\"fd-tokenizer__inner\" #tokenizerInner>\n <div\n role=\"listbox\"\n [attr.aria-label]=\"'coreTokenizer.tokenizerLabel' | fdTranslate\"\n [style.width]=\"_tokensContainerWidth\"\n [attr.aria-hidden]=\"tokenList.length === 0\"\n >\n <ng-content select=\"fd-token\"></ng-content>\n </div>\n\n <ng-container *ngIf=\"_showOverflowPopover && ((_compact$ | async) || compactCollapse); else moreElement\">\n <ng-container *ngTemplateOutlet=\"tokensOverflow\"></ng-container>\n </ng-container>\n\n <ng-content select=\"[fd-form-control]\"></ng-content>\n </div>\n <span fd-input-group-addon *ngIf=\"glyph\" #inputGroupAddOn [button]=\"true\" placement=\"after\">\n <button fd-button class=\"fd-tokenizer-addon\" fdType=\"transparent\" [glyph]=\"glyph\" type=\"button\"></button>\n </span>\n</div>\n\n<ng-template #tokensOverflow>\n <fd-popover placement=\"bottom-start\" title=\"\" [noArrow]=\"false\" [focusTrapped]=\"true\" [focusAutoCapture]=\"true\">\n <fd-popover-control>\n <ng-container *ngTemplateOutlet=\"moreElement\"></ng-container>\n </fd-popover-control>\n\n <fd-popover-body>\n <ul fd-list class=\"fd-tokenizer__overflow-list\">\n <li fd-list-item class=\"fd-tokenizer__overflow-list-item\" *ngFor=\"let token of _hiddenTokens\">\n <ng-container #viewContainer></ng-container>\n\n <span\n *ngIf=\"!token.readOnly\"\n class=\"fd-token__close\"\n role=\"button\"\n [attr.aria-label]=\"token.deleteButtonLabel || ('coreToken.deleteButtonLabel' | fdTranslate)\"\n (click)=\"token.closeClickHandler($event)\"\n ></span>\n </li>\n </ul>\n </fd-popover-body>\n </fd-popover>\n</ng-template>\n\n<ng-template #moreElement>\n <span\n (click)=\"moreClicked()\"\n *ngIf=\"_showMoreElement && _hiddenTokens.length > 0 && !_tokenizerHasFocus\"\n #moreElementSpan\n class=\"fd-tokenizer-more\"\n role=\"button\"\n tabindex=\"-1\"\n >\n <ng-container *ngIf=\"(_compact$ | async) || compactCollapse\">\n {{ 'coreTokenizer.moreLabel' | fdTranslate : { count: moreTokensLeft.length + moreTokensRight.length } }}\n </ng-container>\n <ng-container *ngIf=\"(_compact$ | async) === false && !compactCollapse\">\n {{ 'coreTokenizer.moreLabel' | fdTranslate : { count: hiddenCozyTokenCount } }}\n </ng-container>\n </span>\n</ng-template>\n", styles: ["/*!\n * Fundamental Library Styles v0.28.3\n * Copyright (c) 2023 SAP SE or an SAP affiliate company.\n * Licensed under Apache License 2.0 (https://github.com/SAP/fundamental-styles/blob/main/LICENSE)\n */.fd-tokenizer{-webkit-box-sizing:border-box;-webkit-box-shadow:none;-moz-appearance:none;-webkit-appearance:none;align-items:center;appearance:none;background:var(--sapField_BackgroundStyle, var(--sapField_BackgroundStyle));background-color:var(--sapField_Background, var(--sapField_Background));border:none;border-radius:var(--sapField_BorderCornerRadius);box-shadow:none;box-sizing:border-box;color:var(--sapTextColor);color:var(--sapField_TextColor);cursor:text;display:flex;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;height:2.25rem;height:auto;line-height:var(--sapContent_LineHeight);margin:0;min-height:2.25rem;min-width:var(2.75rem, 2.75rem);outline:none;overflow:hidden;padding:0;text-overflow:ellipsis;text-shadow:var(--fdInput_Text_Shadow);white-space:nowrap;width:100%;z-index:1}.fd-tokenizer:after,.fd-tokenizer:before{box-sizing:inherit;font-size:inherit}.fd-tokenizer::placeholder{color:var(--sapField_PlaceholderTextColor);font-style:var(--fdPlaceholder_Font_Style)}.fd-tokenizer[dir=rtl]::placeholder,[dir=rtl] .fd-tokenizer::placeholder{text-indent:.125rem}.fd-tokenizer::selection{background-color:var(--sapSelectedColor);color:var(--sapContent_ContrastTextColor)}.fd-tokenizer::-ms-clear{display:none}.fd-tokenizer.is-hover,.fd-tokenizer:hover{-webkit-box-shadow:var(--fdInput_Box_Shadow_Hover);background:var(--sapField_Hover_BackgroundStyle, var(--sapField_Hover_BackgroundStyle));background-color:var(--sapField_Hover_Background, var(--sapField_Hover_Background));border-color:var(--sapField_Hover_BorderColor);box-shadow:var(--fdInput_Box_Shadow_Hover)}.fd-tokenizer.is-focus,.fd-tokenizer:focus{background:var(--sapField_Focus_Background, var(--sapField_Focus_Background));outline-color:var(--fdInput_Outline_Color);outline-offset:var(--fdInput_Outline_Offset)}.fd-tokenizer.is-hover,.fd-tokenizer:hover{box-shadow:none}.fd-tokenizer__inner{-ms-overflow-style:none;-webkit-box-align:center;-ms-flex-align:center;-webkit-box-pack:end;-ms-flex-pack:end;align-items:center;display:flex;float:right;justify-content:flex-end;overflow:hidden;padding:var(--fdTokenizer_Inner_Padding, 0 .3125rem);scrollbar-width:none;white-space:nowrap;width:100%}.fd-tokenizer__inner::-webkit-scrollbar{display:none}.fd-tokenizer .fd-token{margin-right:.3125rem;max-width:calc(100% - 3.3125rem)}.fd-tokenizer .fd-token[dir=rtl],[dir=rtl] .fd-tokenizer .fd-token{margin:0 0 0 .3125rem}.fd-tokenizer__indicator{-webkit-box-sizing:border-box;border:0;box-sizing:border-box;color:var(--sapTextColor);cursor:pointer;display:inline-block;font-family:var(--sapFontFamily);font-size:var(--sapFontSize);font-weight:400;forced-color-adjust:none;line-height:var(--sapContent_LineHeight);margin:0;padding:0}.fd-tokenizer__indicator:after,.fd-tokenizer__indicator:before{box-sizing:inherit;font-size:inherit}.fd-tokenizer .fd-tokenizer__input{background:transparent}.fd-tokenizer .fd-tokenizer__input.fd-input{border:none;min-width:var(--fdTokenizer_Input_Width, 3rem);padding:0}.fd-tokenizer .fd-tokenizer__input:first-child{padding:0 .3125rem}.fd-tokenizer .fd-tokenizer__input:last-child{flex-basis:100%}.fd-tokenizer .fd-tokenizer__input.is-focus,.fd-tokenizer .fd-tokenizer__input:focus{border:none;outline:none;z-index:5}.fd-tokenizer .fd-tokenizer__input.is-focus,.fd-tokenizer .fd-tokenizer__input.is-hover,.fd-tokenizer .fd-tokenizer__input:focus,.fd-tokenizer .fd-tokenizer__input:hover{-webkit-box-shadow:none;background:none;background-color:var(transparent, transparent);box-shadow:none}.fd-tokenizer.is-focus,.fd-tokenizer:focus{-webkit-box-shadow:none;border:none;box-shadow:none;outline-color:var(--sapContent_FocusColor);outline-offset:-.0625rem;outline-style:var(--sapContent_FocusStyle);outline-width:var(--sapContent_FocusWidth);z-index:5}.fd-tokenizer[class*=-compact],.fd-tokenizer[class*=-condensed],[class*=-compact] .fd-tokenizer:not([class*=-cozy]),[class*=-condensed] .fd-tokenizer:not([class*=-cozy]){--fdTokenizer_Inner_Padding:0 .25rem;--fdInput_Field_Compact_Min_Width:2rem;height:1.625rem;min-height:1.625rem}.fd-tokenizer[class*=-compact] .fd-tokenizer__input:first-child,.fd-tokenizer[class*=-condensed] .fd-tokenizer__input:first-child,[class*=-compact] .fd-tokenizer:not([class*=-cozy]) .fd-tokenizer__input:first-child,[class*=-condensed] .fd-tokenizer:not([class*=-cozy]) .fd-tokenizer__input:first-child{padding:0 .25rem}.fd-tokenizer[class*=-compact] .fd-token,.fd-tokenizer[class*=-condensed] .fd-token,[class*=-compact] .fd-tokenizer:not([class*=-cozy]) .fd-token,[class*=-condensed] .fd-tokenizer:not([class*=-cozy]) .fd-token{margin-right:.25rem;max-width:calc(100% - 2.25rem)}.fd-tokenizer[class*=-compact] .fd-token[dir=rtl],.fd-tokenizer[class*=-condensed] .fd-token[dir=rtl],[class*=-compact] .fd-tokenizer:not([class*=-cozy]) .fd-token[dir=rtl],[class*=-condensed] .fd-tokenizer:not([class*=-cozy]) .fd-token[dir=rtl],[dir=rtl] .fd-tokenizer[class*=-compact] .fd-token,[dir=rtl] .fd-tokenizer[class*=-condensed] .fd-token,[dir=rtl] [class*=-compact] .fd-tokenizer:not([class*=-cozy]) .fd-token,[dir=rtl] [class*=-condensed] .fd-tokenizer:not([class*=-cozy]) .fd-token{margin:0 0 0 .3125rem}.fd-tokenizer--readonly{background-color:var(--sapField_ReadOnly_Background);overflow:visible}.fd-tokenizer--readonly .fd-tokenizer__inner{overflow:visible}.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true],.fd-tokenizer--readonly .fd-tokenizer__input[readonly]{-webkit-box-shadow:none;background:none;background-color:var(transparent, transparent);box-shadow:none}.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly.is-focus,.fd-tokenizer--readonly .fd-tokenizer__input.is-readonly:focus,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true].is-focus,.fd-tokenizer--readonly .fd-tokenizer__input[aria-readonly=true]:focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly].is-focus,.fd-tokenizer--readonly .fd-tokenizer__input[readonly]:focus{-webkit-box-shadow:none;background:none;background-color:var(transparent, transparent);box-shadow:none;z-index:5}.fd-tokenizer--scrollable .fd-tokenizer__inner{justify-content:normal;overflow:scroll}.fd-tokenizer .fd-token{max-width:inherit!important}input.fd-input.fd-tokenizer__input{background-color:transparent;margin-right:1px;border:none;outline:none}.fd-tokenizer-more{padding-right:.5rem;color:var(--sapLinkColor);cursor:pointer}[dir=rtl] .fd-tokenizer-more,.fd-tokenizer-more[dir=rtl]{padding-left:.5rem;padding-right:0}.fd-input-group__addon--button .fd-input-group__button.fd-tokenizer-addon{height:2.25rem}.fd-input-group__addon--button .fd-input-group__button.fd-tokenizer-addon--compact{height:1.625rem}.fd-tokenizer__overflow-list-item{display:flex;justify-content:space-between}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.InputGroupAddOnDirective, selector: "[fdInputGroupAddon], [fd-input-group-addon]", inputs: ["class", "placement", "type", "state", "button"] }, { kind: "component", type: i6.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i7.PopoverControlComponent, selector: "fd-popover-control" }, { kind: "component", type: i7.PopoverBodyComponent, selector: "fd-popover-body" }, { kind: "component", type: i7.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig", "preventSpaceKeyScroll"] }, { kind: "component", type: i8.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "unreadIndicator", "role"], outputs: ["focusEscapeList"] }, { kind: "component", type: i8.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "ariaDescribedBy", "noData", "action", "interactive", "growing", "counter", "unread", "byline", "selectedListItemScreenReaderText", "navigatedListItemScreenReaderText", "navigatableListItemScreenReaderText", "ariaRole", "preventClick"], outputs: ["keyDown"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.FdTranslatePipe, name: "fdTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
|
|
656
679
|
__decorate([
|
|
657
680
|
applyCssClass,
|
|
658
681
|
__metadata("design:type", Function),
|
|
@@ -667,6 +690,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
667
690
|
}] }, { type: i0.Renderer2 }, { type: Document, decorators: [{
|
|
668
691
|
type: Inject,
|
|
669
692
|
args: [DOCUMENT]
|
|
693
|
+
}] }, { type: i3.LiveAnnouncer }, { type: i10.Observable, decorators: [{
|
|
694
|
+
type: Inject,
|
|
695
|
+
args: [FD_LANGUAGE]
|
|
670
696
|
}] }]; }, propDecorators: { class: [{
|
|
671
697
|
type: Input
|
|
672
698
|
}], disableKeyboardDeletion: [{
|
|
@@ -707,4 +733,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
|
707
733
|
type: HostListener,
|
|
708
734
|
args: ['keydown', ['$event']]
|
|
709
735
|
}] } });
|
|
710
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5pemVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL3Rva2VuL3Rva2VuaXplci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi90b2tlbi90b2tlbml6ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQ0gsQ0FBQyxFQUNELFNBQVMsRUFDVCxNQUFNLEVBQ04sVUFBVSxFQUNWLEtBQUssRUFDTCxVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFDTCxRQUFRLEVBQ1gsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUgsT0FBTyxFQUVQLFVBQVUsRUFDVixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ25CLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLCtCQUErQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFB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TUFBTSxhQUNwQyxDQUFDLCtCQUErQixFQUFFLENBQUM7OzBCQW9LekMsUUFBUTs7MEJBRVIsTUFBTTsyQkFBQyxRQUFROzRDQWpLcEIsS0FBSztzQkFESixLQUFLO2dCQUtOLHVCQUF1QjtzQkFEdEIsS0FBSztnQkFLTixTQUFTO3NCQURSLGVBQWU7dUJBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGNBQWMsQ0FBQztnQkFLakQsS0FBSztzQkFESixZQUFZO3VCQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRTtnQkFLMUUsZ0JBQWdCO3NCQURmLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUszQixXQUFXO3NCQURWLFNBQVM7dUJBQUMsaUJBQWlCO2dCQUlNLE9BQU87c0JBQXhDLFNBQVM7dUJBQUMsaUJBQWlCO2dCQU1uQixjQUFjO3NCQUR0QixZQUFZO3VCQUFDLGVBQWUsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtnQkE2QnpELGVBQWU7c0JBRGQsS0FBSztnQkFLTixrQkFBa0I7c0JBRGpCLEtBQUs7Z0JBS04sVUFBVTtzQkFEVCxLQUFLO2dCQUtOLEtBQUs7c0JBREosS0FBSztnQkFLTixRQUFRO3NCQURQLEtBQUs7Z0JBS04sSUFBSTtzQkFESCxLQUFLO2dCQUtHLGdCQUFnQjtzQkFEeEIsTUFBTTtnQkF5SlAsc0JBQXNCLE1BZ0R0QixPQUFPO3NCQUROLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L21lbWJlci1vcmRlcmluZyAqL1xuaW1wb3J0IHtcbiAgICBBLFxuICAgIEJBQ0tTUEFDRSxcbiAgICBERUxFVEUsXG4gICAgRE9XTl9BUlJPVyxcbiAgICBFTlRFUixcbiAgICBMRUZUX0FSUk9XLFxuICAgIFJJR0hUX0FSUk9XLFxuICAgIFNQQUNFLFxuICAgIFVQX0FSUk9XXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9rZXljb2Rlcyc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZCxcbiAgICBDb250ZW50Q2hpbGRyZW4sXG4gICAgRWxlbWVudFJlZixcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIEluamVjdCxcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE9uSW5pdCxcbiAgICBPcHRpb25hbCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFJlbmRlcmVyMixcbiAgICBWaWV3Q2hpbGQsXG4gICAgVmlld0NoaWxkcmVuLFxuICAgIFZpZXdDb250YWluZXJSZWYsXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXG4gICAgZm9yd2FyZFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQ3NzQ2xhc3NCdWlsZGVyLFxuICAgIEtleVV0aWwsXG4gICAgTnVsbGFibGUsXG4gICAgUnRsU2VydmljZSxcbiAgICBhcHBseUNzc0NsYXNzLFxuICAgIHJlc2l6ZU9ic2VydmFibGVcbn0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jZGsvdXRpbHMnO1xuaW1wb3J0IHsgQ29udGVudERlbnNpdHlPYnNlcnZlciwgY29udGVudERlbnNpdHlPYnNlcnZlclByb3ZpZGVycyB9IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY29yZS9jb250ZW50LWRlbnNpdHknO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2xDb21wb25lbnQgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvZm9ybSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiwgZnJvbUV2ZW50LCBtZXJnZSwgc3RhcnRXaXRoIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGZpbHRlciwgbWFwLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBUb2tlbkNvbXBvbmVudCB9IGZyb20gJy4vdG9rZW4uY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC10b2tlbml6ZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90b2tlbml6ZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3Rva2VuaXplci5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbY29udGVudERlbnNpdHlPYnNlcnZlclByb3ZpZGVycygpXVxufSlcbmV4cG9ydCBjbGFzcyBUb2tlbml6ZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIENzc0NsYXNzQnVpbGRlciwgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgIC8qKiB1c2VyJ3MgY3VzdG9tIGNsYXNzZXMgKi9cbiAgICBASW5wdXQoKVxuICAgIGNsYXNzOiBzdHJpbmc7XG5cbiAgICAvKiogRGlzYWJsZXMgcG9zc2liaWxpdHkgdG8gcmVtb3ZlIHRva2VucyBieSBrZXlib2FyZCAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZUtleWJvYXJkRGVsZXRpb24gPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihmb3J3YXJkUmVmKCgpID0+IFRva2VuQ29tcG9uZW50KSlcbiAgICB0b2tlbkxpc3Q6IFF1ZXJ5TGlzdDxUb2tlbkNvbXBvbmVudD47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBDb250ZW50Q2hpbGQoZm9yd2FyZFJlZigoKSA9PiBGb3JtQ29udHJvbENvbXBvbmVudCksIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIGlucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCd0b2tlbml6ZXJJbm5lcicpXG4gICAgdG9rZW5pemVySW5uZXJFbDogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoJ21vcmVFbGVtZW50U3BhbicpXG4gICAgbW9yZUVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCdpbnB1dEdyb3VwQWRkT24nKSBzZXQgY29udGVudChjb250ZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pikge1xuICAgICAgICB0aGlzLmlucHV0R3JvdXBBZGRvbkVsID0gY29udGVudDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oJ3ZpZXdDb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgICByZWFkb25seSBfdmlld0NvbnRhaW5lcjogUXVlcnlMaXN0PFZpZXdDb250YWluZXJSZWY+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBnZXQgX2hpZGRlblRva2VucygpOiBUb2tlbkNvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5MaXN0LmZpbHRlcigodG9rZW4pID0+IHRva2VuLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBPYnNlcnZhYmxlIHN0YXRlIG9mIHRoZSBjb21wYWN0IG1vZGUuXG4gICAgICovXG4gICAgZ2V0IF9jb21wYWN0JCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnREZW5zaXR5T2JzZXJ2ZXIuaXNDb21wYWN0JDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQ29tcG9uZW50IGlzIGluIGNvbXBhY3QgbW9kZSwgZGV0ZXJtaW5lZCBieSB0aGUgY29uc3VtZXJcbiAgICAgKi9cbiAgICBnZXQgX2NvbXBhY3QoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50RGVuc2l0eU9ic2VydmVyLmlzQ29tcGFjdDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGlucHV0R3JvdXBBZGRvbkVsOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqIFdoZXRoZXIgdG8gdXNlIGNvenkgdmlzdWFscyBidXQgY29tcGFjdCBjb2xsYXBzaW5nIGJlaGF2aW9yLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgY29tcGFjdENvbGxhcHNlID0gZmFsc2U7XG5cbiAgICAvKiogV2hldGhlciB0b2tlbml6ZXIgc2hvdWxkIGhhdmUgZmFrZSBmb2N1cyBpbmRpY2F0b3IsIHdoZW4gaW5wdXQgaXMgZm9jdXNlZCBpbnNpZGUqL1xuICAgIEBJbnB1dCgpXG4gICAgdG9rZW5pemVyRm9jdXNhYmxlID0gdHJ1ZTtcblxuICAgIC8qKiBUaGUgdmFsdWUgZm9yIHRoZSB0b2tlbml6ZXIgaW5wdXQgKi9cbiAgICBASW5wdXQoKVxuICAgIGlucHV0VmFsdWU6IHN0cmluZztcblxuICAgIC8qKiBJY29uIG9mIHRoZSBidXR0b24gb24gdGhlIHJpZ2h0IG9mIHRoZSBpbnB1dCBmaWVsZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGdseXBoOiBzdHJpbmc7XG5cbiAgICAvKiogV29yZCB0byB1c2UgZm9yIHdoZW4gdGhlcmUgYXJlIGV4dHJhIHRva2Vucy4gKi9cbiAgICBASW5wdXQoKVxuICAgIG1vcmVUZXJtID0gJ21vcmUnO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASW5wdXQoKVxuICAgIG9wZW46IGJvb2xlYW47XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBzZWFyY2ggdGVybSBjaGFuZ2VzLiBVc2UgKiRldmVudCogdG8gYWNjZXNzIHRoZSBuZXcgdGVybS4gKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBtb3JlQ2xpY2tlZEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcmV2aW91c0VsZW1lbnRXaWR0aDogbnVtYmVyO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBtb3JlVG9rZW5zTGVmdDogQXJyYXk8VG9rZW5Db21wb25lbnQ+ID0gW107XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG1vcmVUb2tlbnNSaWdodDogQXJyYXk8VG9rZW5Db21wb25lbnQ+ID0gW107XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByZXZpb3VzVG9rZW5Db3VudDogbnVtYmVyO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICB0b2tlbkxpc3RDaGFuZ2VzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHRva2VuTGlzdENsaWNrU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgaGlkZGVuQ296eVRva2VuQ291bnQgPSAwO1xuXG4gICAgLyoqIEBoaWRkZW4gVXNlZCB0byBhZGQgZm9jdXMgdG8gdG9rZW5pemVyIGVsZW1lbnQgKi9cbiAgICBfdG9rZW5pemVySGFzRm9jdXMgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3Nob3dPdmVyZmxvd1BvcG92ZXIgPSB0cnVlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfc2hvd01vcmVFbGVtZW50ID0gZmFsc2U7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF90b2tlbnNDb250YWluZXJXaWR0aCA9ICdhdXRvJztcblxuICAgIC8qKiBAaGlkZGVuXG4gICAgICogVmFyaWFibGUgd2hpY2ggd2lsbCBrZWVwIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdG9rZW4gcHJlc3NlZCBpbiB0aGUgdG9rZW5pemVyXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZmlyc3RFbGVtZW50SW5TZWxlY3Rpb246IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqIEBoaWRkZW5cbiAgICAgKiBWYXJpYWJsZSB3aGljaCB3aWxsIGtlZXAgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHRva2VuIHByZXNzZWQgaW4gdGhlIHRva2VuaXplclxuICAgICAqL1xuICAgIHByaXZhdGUgX2xhc3RFbGVtZW50SW5TZWxlY3Rpb246IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqIEBoaWRkZW5cbiAgICAgKiBGbGFnIHdoaWNoIHdpbGwgc2F5IGlmIHRoZSBsYXN0IGtleWJvYXJkIGFuZCBjbGljayBvcGVyYXRpb24gdGhleSB1c2VkIHdhcyB1c2luZyBjb250cm9sXG4gICAgICovXG4gICAgcHJpdmF0ZSBfY3RybFByZXZpb3VzOiBib29sZWFuO1xuXG4gICAgLyoqIEBoaWRkZW5cbiAgICAgKiBGbGFnIHdoaWNoIHdpbGwgc2F5IGlmIHRoZXkgaGVsZCBzaGlmdCBhbmQgY2xpY2tlZCBoaWdobGlnaHRpbmcgZWxlbWVudHMgYmVmb3JlIG9yXG4gICAgICovXG4gICAgcHJpdmF0ZSBfZGlyZWN0aW9uU2hpZnRJc1JpZ2h0OiBib29sZWFuIHwgbnVsbCA9IG51bGw7XG5cbiAgICAvKiogQW4gUnhKUyBTdWJqZWN0IHRoYXQgd2lsbCBraWxsIHRoZSBkYXRhIHN0cmVhbSB1cG9uIGRlc3RydWN0aW9uIChmb3IgdW5zdWJzY3JpYmluZykgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBfb25EZXN0cm95JDogU3ViamVjdDx2b2lkPiA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX2V2ZW50TGlzdGVuZXJzOiAoKCkgPT4gdm9pZClbXSA9IFtdO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9mb3JjZUFsbFRva2Vuc1RvRGlzcGxheSA9IGZhbHNlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF90b2tlbkVsZW1lbnRGb2N1c2VkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2lucHV0RWxlbWVudEZvY3VzZWQgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfdG9rZW5FbGVtZW50Rm9jdXNlZFN1YjogTnVsbGFibGU8U3Vic2NyaXB0aW9uPjtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHJlYWRvbmx5IF9jb250ZW50RGVuc2l0eU9ic2VydmVyOiBDb250ZW50RGVuc2l0eU9ic2VydmVyLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICAgICAgcHJpdmF0ZSBfY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9ydGxTZXJ2aWNlOiBSdGxTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9yZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBwcml2YXRlIHJlYWRvbmx5IF9kb2N1bWVudDogRG9jdW1lbnRcbiAgICApIHtcbiAgICAgICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMucHVzaChcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmxpc3Rlbignd2luZG93JywgJ2NsaWNrJywgKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGUudGFyZ2V0KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2tlbkxpc3QuZm9yRWFjaCgodG9rZW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlucHV0Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9pbnB1dEtleWRvd25FdmVudCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2F0Y2ggZm9yIGNoYW5nZXMgdG8gdGhlIHRva2VuTGlzdCBhbmQgYXR0ZW1wdCB0byBleHBhbmQvY29sbGFwc2UgdG9rZW5zIGFzIG5lZWRlZFxuICAgICAgICB0aGlzLnRva2VuTGlzdC5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG51bGwpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50b2tlbkxpc3RDaGFuZ2VzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy50b2tlbkxpc3RDaGFuZ2VzU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5fcmVzZXRUb2tlbnMoKTtcbiAgICAgICAgICAgIHRoaXMudG9rZW5MaXN0LmZvckVhY2goKHRva2VuKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2tlbkxpc3RDaGFuZ2VzU3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4ub25DbG9zZUNsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXNldFRva2VucygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy50b2tlbkxpc3RDaGFuZ2VzU3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4uZWxlbWVudEZvY3VzZWQuc3Vic2NyaWJlKChpc0ZvY3VzZWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuRWxlbWVudEZvY3VzZWQubmV4dChpc0ZvY3VzZWQpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9jb21wYWN0ICYmICF0aGlzLmNvbXBhY3RDb2xsYXBzZSkge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlQ296eVRva2VuQ291bnQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9saXN0ZW5FbGVtZW50RXZlbnRzKCk7XG4gICAgICAgIHRoaXMucHJldmlvdXNFbGVtZW50V2lkdGggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgdGhpcy5fbGlzdGVuT25SZXNpemUoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRva2VuTGlzdENoYW5nZXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX3Rva2VuRWxlbWVudEZvY3VzZWRTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzLmZvckVhY2goKGUpID0+IGUoKSk7XG4gICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlQ2xpY2tzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5idWlsZENvbXBvbmVudENzc0NsYXNzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5idWlsZENvbXBvbmVudENzc0NsYXNzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW5cbiAgICAgKiBDc3NDbGFzc0J1aWxkZXIgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uXG4gICAgICogZnVuY3Rpb24gbXVzdCByZXR1cm4gc2luZ2xlIHN0cmluZ1xuICAgICAqIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBvcmRlciB3aGljaCBjc3MgY2xhc3NlcyBhcmUgYXBwbGllZFxuICAgICAqL1xuICAgIEBhcHBseUNzc0NsYXNzXG4gICAgYnVpbGRDb21wb25lbnRDc3NDbGFzcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5jbGFzc107XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBoYW5kbGVUb2tlbkNsaWNrU3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVDbGlja3MoKTtcbiAgICAgICAgdGhpcy50b2tlbkxpc3QuZm9yRWFjaCgodG9rZW4sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAodG9rZW4udG9rZW5XcmFwcGVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRva2VuLnRva2VuV3JhcHBlckVsZW1lbnQubmF0aXZlRWxlbWVudC50YWJJbmRleCA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50b2tlbkxpc3RDbGlja1N1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICB0b2tlbi5vblRva2VuQ2xpY2suc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c1Rva2VuRWxlbWVudChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc0NvbnRyb2xLZXkoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdHJsU2VsZWN0ZWQodG9rZW4sIGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZXZlbnQuc2hpZnRLZXkgfHwgdGhpcy5fY3RybFByZXZpb3VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iYXNpY1NlbGVjdGVkKHRva2VuLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGaXJzdEFuZExhc3RFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGlmdFNlbGVjdGVkKGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy50b2tlbkxpc3RDbGlja1N1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICB0b2tlbi5vblRva2VuS2V5ZG93bi5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlS2V5RG93bihldmVudCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGZvY3VzVG9rZW5FbGVtZW50KG5ld0luZGV4OiBudW1iZXIpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCBlbGVtZW50VG9Gb2N1czogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHRva2VuTGlzdEFycmF5OiBUb2tlbkNvbXBvbmVudFtdID0gdGhpcy50b2tlbkxpc3QudG9BcnJheSgpO1xuICAgICAgICBpZiAodG9rZW5MaXN0QXJyYXlbbmV3SW5kZXhdKSB7XG4gICAgICAgICAgICBlbGVtZW50VG9Gb2N1cyA9IHRva2VuTGlzdEFycmF5W25ld0luZGV4XS50b2tlbldyYXBwZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAvLyBlbGVtZW50IG5lZWRzIHRhYmluZGV4IGluIG9yZGVyIHRvIGJlIGZvY3VzZWRcbiAgICAgICAgICAgIGVsZW1lbnRUb0ZvY3VzIS5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRUb0ZvY3VzO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAga2V5RG93bihrZXlib2FyZEV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIEtleVV0aWwuaXNLZXlDb2RlKGtleWJvYXJkRXZlbnQsIFtERUxFVEUsIEJBQ0tTUEFDRV0pICYmXG4gICAgICAgICAgICAoIXRoaXMuX2lzSW5wdXRGb2N1c2VkKCkgfHwgdGhpcy5fdG9rZW5zU2VsZWN0ZWQoKSkgJiZcbiAgICAgICAgICAgICF0aGlzLmRpc2FibGVLZXlib2FyZERlbGV0aW9uXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IHRoaXMuX2dldEFjdGl2ZVRva2VucygpO1xuICAgICAgICAgICAgY29uc3QgZm9jdXNlZFRva2VuSW5kZXggPSB0aGlzLl9nZXRGb2N1c2VkVG9rZW5JbmRleCgpO1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiBlbGVtZW50Lm9uQ2xvc2VDbGljay5lbWl0KCkpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmIChLZXlVdGlsLmlzS2V5Q29kZShrZXlib2FyZEV2ZW50LCBERUxFVEUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzSW5wdXQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzVG9rZW5FbGVtZW50KGZvY3VzZWRUb2tlbkluZGV4IC0gMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgS2V5VXRpbC5pc0tleUNvZGUoa2V5Ym9hcmRFdmVudCwgQkFDS1NQQUNFKSAmJlxuICAgICAgICAgICAgdGhpcy5faXNJbnB1dEZvY3VzZWQoKSAmJlxuICAgICAgICAgICAgIXRoaXMuX2dldElucHV0VmFsdWUoKSAmJlxuICAgICAgICAgICAgIXRoaXMuZGlzYWJsZUtleWJvYXJkRGVsZXRpb25cbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzVG9rZW5FbGVtZW50KHRoaXMudG9rZW5MaXN0Lmxlbmd0aCAtIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvblJlc2l6ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudFJlZikge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudFdpZHRoID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgICAgICB0aGlzLl9yZXNldFRva2VucygpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c0VsZW1lbnRXaWR0aCA9IGVsZW1lbnRXaWR0aDtcbiAgICAgICAgICAgIGlmICghdGhpcy5fY29tcGFjdCAmJiAhdGhpcy5jb21wYWN0Q29sbGFwc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVDb3p5VG9rZW5Db3VudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBmcm9tSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBsZXQgbmV3SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcnRsID0gdGhpcy5fcnRsU2VydmljZSAmJiB0aGlzLl9ydGxTZXJ2aWNlLnJ0bCA/IHRoaXMuX3J0bFNlcnZpY2UucnRsLmdldFZhbHVlKCkgOiBmYWxzZTtcbiAgICAgICAgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBTUEFDRSkgJiYgIXRoaXMuX2lzSW5wdXRGb2N1c2VkKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy50b2tlbkxpc3QuZmluZCgoXywgaW5kZXgpID0+IGluZGV4ID09PSBmcm9tSW5kZXgpO1xuICAgICAgICAgICAgdGhpcy50b2tlbkxpc3QuZm9yRWFjaCgoc2hhZG93ZWRUb2tlbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzaGFkb3dlZFRva2VuICE9PSB0b2tlbikge1xuICAgICAgICAgICAgICAgICAgICBzaGFkb3dlZFRva2VuLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0b2tlbiAmJiAodG9rZW4uc2VsZWN0ZWQgPSAhdG9rZW4uc2VsZWN0ZWQpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgRU5URVIpKSB7XG4gICAgICAgICAgICB0aGlzLl9mb2N1c0lucHV0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZ29CYWNrUmVxdWVzdGVkKGV2ZW50LCBydGwpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlQXJyb3dMZWZ0KGZyb21JbmRleCk7XG4gICAgICAgICAgICBuZXdJbmRleCA9IGZyb21JbmRleCAtIDE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZ29Gb3J3YXJkUmVxdWVzdGVkKGV2ZW50LCBydGwpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlQXJyb3dSaWdodChmcm9tSW5kZXgpO1xuICAgICAgICAgICAgbmV3SW5kZXggPSBmcm9tSW5kZXggKyAxO1xuICAgICAgICB9IGVsc2UgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBBKSAmJiAhdGhpcy5fZ2V0SW5wdXRWYWx1ZSgpICYmIHRoaXMuX2lzQ29udHJvbEtleShldmVudCkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnRva2VuTGlzdC5mb3JFYWNoKCh0b2tlbikgPT4gKHRva2VuLnNlbGVjdGVkID0gdHJ1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdJbmRleCA9PT0gdGhpcy50b2tlbkxpc3QubGVuZ3RoICYmIHRoaXMuX2dvRm9yd2FyZFJlcXVlc3RlZChldmVudCwgcnRsKSkge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXNJbnB1dCgpO1xuICAgICAgICB9IGVsc2UgaWYgKG5ld0luZGV4ISA+IHRoaXMudG9rZW5MaXN0Lmxlbmd0aCAtIHRoaXMubW9yZVRva2Vuc1JpZ2h0Lmxlbmd0aCAmJiB0aGlzLl9pc0lucHV0Rm9jdXNlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzVG9rZW5FbGVtZW50KG5ld0luZGV4ISAtIHRoaXMubW9yZVRva2Vuc1JpZ2h0Lmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAobmV3SW5kZXggfHwgbmV3SW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNUb2tlbkVsZW1lbnQobmV3SW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBnZXRDb21iaW5lZFRva2VuV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHRvdGFsVG9rZW5XaWR0aCA9IHRoaXMuX2dldFRva2Vuc0FyZWFXaWR0aFdpdGhvdXRUb2tlbnMoKTtcbiAgICAgICAgLy8gZ2V0IHRoZSB3aWR0aCBvZiBlYWNoIHRva2VuXG4gICAgICAgIHRoaXMudG9rZW5MaXN0LmZvckVhY2goKHRva2VuKSA9PiB7XG4gICAgICAgICAgICB0b3RhbFRva2VuV2lkdGggPSB0b3RhbFRva2VuV2lkdGggKyB0b2tlbi5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0b3RhbFRva2VuV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgd2hldGhlciB1c2VyIGludGVuZHMgdG8gZ28gYmFjayB0byB0aGUgcHJldmlvdXMgdG9rZW5cbiAgICAgKiovXG4gICAgcHJpdmF0ZSBfZ29CYWNrUmVxdWVzdGVkKCRldmVudDogS2V5Ym9hcmRFdmVudCwgcnRsOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghcnRsKSB7XG4gICAgICAgICAgICByZXR1cm4gS2V5VXRpbC5pc0tleUNvZGUoJGV2ZW50LCBMRUZUX0FSUk9XKSB8fCBLZXlVdGlsLmlzS2V5Q29kZSgkZXZlbnQsIFVQX0FSUk9XKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gS2V5VXRpbC5pc0tleUNvZGUoJGV2ZW50LCBSSUdIVF9BUlJPVykgfHwgS2V5VXRpbC5pc0tleUNvZGUoJGV2ZW50LCBET1dOX0FSUk9XKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayB3aGV0aGVyIHVzZXIgaW50ZW5kcyB0byBnbyBmb3J3YXJkIHRvIHRoZSBuZXh0IHRva2VuXG4gICAgICoqL1xuICAgIHByaXZhdGUgX2dvRm9yd2FyZFJlcXVlc3RlZCgkZXZlbnQ6IEtleWJvYXJkRXZlbnQsIHJ0bDogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXJ0bCkge1xuICAgICAgICAgICAgcmV0dXJuIEtleVV0aWwuaXNLZXlDb2RlKCRldmVudCwgUklHSFRfQVJST1cpIHx8IEtleVV0aWwuaXNLZXlDb2RlKCRldmVudCwgRE9XTl9BUlJPVyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEtleVV0aWwuaXNLZXlDb2RlKCRldmVudCwgTEVGVF9BUlJPVykgfHwgS2V5VXRpbC5pc0tleUNvZGUoJGV2ZW50LCBVUF9BUlJPVyk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nZXRUb2tlbnNBcmVhV2lkdGhXaXRob3V0VG9rZW5zKCk6IG51bWJlciB7XG4gICAgICAgIGxldCB0b3RhbFRva2VuV2lkdGggPSAwO1xuICAgICAgICAvLyBhZGQgaW5wdXQgd2lkdGhcbiAgICAgICAgaWYgKHRoaXMuaW5wdXQ/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRvdGFsVG9rZW5XaWR0aCA9IHRvdGFsVG9rZW5XaWR0aCArIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgfVxuICAgICAgICAvLyBhZGQgdGhlIHdpZHRoIG9mIHRoZSBcIl9fX18gbW9yZVwiIGVsZW1lbnRcbiAgICAgICAgaWYgKHRoaXMubW9yZVRva2Vuc0xlZnQubGVuZ3RoID4gMCAmJiB0aGlzLm1vcmVFbGVtZW50ICYmIHRoaXMubW9yZUVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdG90YWxUb2tlbldpZHRoID0gdG90YWxUb2tlbldpZHRoICsgdGhpcy5tb3JlRWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFkZCB0aGUgaW5wdXQgZ3JvdXAgYWRkb25cbiAgICAgICAgaWYgKHRoaXMuaW5wdXRHcm91cEFkZG9uRWwgJiYgdGhpcy5pbnB1dEdyb3VwQWRkb25FbC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICB0b3RhbFRva2VuV2lkdGggPSB0b3RhbFRva2VuV2lkdGggKyB0aGlzLmlucHV0R3JvdXBBZGRvbkVsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG90YWxUb2tlbldpZHRoO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbW9yZUNsaWNrZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubW9yZUNsaWNrZWRFdmVudC5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqIFJlbW92ZXMgYWxsIHNlbGVjdGVkIHRva2VucyAqL1xuICAgIHJlbW92ZVNlbGVjdGVkVG9rZW5zKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gdGhpcy5fZ2V0QWN0aXZlVG9rZW5zKCk7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4gZWxlbWVudC5vblJlbW92ZS5lbWl0KCkpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfaGFuZGxlQXJyb3dMZWZ0KGZyb21JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIC8vIGlmIHRoZSBsZWZ0bW9zdCB2aXNpYmxlIHRva2VuIGlzIHNlbGVjdGVkLCBhbmQgdGhlcmUgYXJlIG1vcmVUb2tlbnNMZWZ0LCBuZWVkIHRvIGRpc3BsYXkgYSBtb3JlVG9rZW5MZWZ0XG4gICAgICAgIGlmIChmcm9tSW5kZXggPT09IHRoaXMubW9yZVRva2Vuc0xlZnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBwb3BwZWRUb2tlbiA9IHRoaXMubW9yZVRva2Vuc0xlZnQucG9wKCk7XG4gICAgICAgICAgICBpZiAocG9wcGVkVG9rZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYWtlRWxlbWVudFZpc2libGUocG9wcGVkVG9rZW4uZWxlbWVudFJlZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhbmQgdGhlbiBoaWRlIGFueSB0b2tlbnMgZnJvbSB0aGUgcmlnaHQgdGhhdCBubyBsb25nZXIgZml0XG4gICAgICAgICAgICB0aGlzLl9jb2xsYXBzZVRva2VucygncmlnaHQnKTtcblxuICAgICAgICAgICAgdGhpcy5fY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfc2hvd0FsbFRva2VucygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZm9yY2VBbGxUb2tlbnNUb0Rpc3BsYXkgPSB0cnVlO1xuICAgICAgICB0aGlzLl9pbnB1dEVsZW1lbnRGb2N1c2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50b2tlbkxpc3QuZm9yRWFjaCgodG9rZW4pID0+IHtcbiAgICAgICAgICAgIHRoaXMuX21ha2VFbGVtZW50VmlzaWJsZSh0b2tlbi5lbGVtZW50UmVmKTtcbiAgICAgICAgICAgIHRva2VuLl92aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0b2tlbi5fY29udGVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90b2tlbnNDb250YWluZXJXaWR0aCA9ICdhdXRvJztcbiAgICAgICAgdGhpcy5fc2hvd01vcmVFbGVtZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy50b2tlbml6ZXJJbm5lckVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IHRoaXMudG9rZW5pemVySW5uZXJFbC5uYXRpdmVFbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2hpZGVUb2tlbnMoKTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5faW5wdXRFbGVtZW50Rm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgdG9rZW5Gb2N1c2VkID0gdGhpcy5fZ2V0Rm9jdXNlZFRva2VuSW5kZXgoKSA+IC0xO1xuXG4gICAgICAgICAgICBpZiAodG9rZW5Gb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2FpdEZvckZvY3VzVG9EaXNhcHBlYXIoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9mb3JjZUFsbFRva2Vuc1RvRGlzcGxheSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fcmVzZXRUb2tlbnMoKTtcbiAgICAgICAgICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMudG9rZW5pemVySW5uZXJFbC5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSB0aGlzLnRva2VuaXplcklubmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF93YWl0Rm9yRm9jdXNUb0Rpc2FwcGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdG9rZW5FbGVtZW50Rm9jdXNlZFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgLy8gNSBtcyBkZWxheSBmb3Igb3RoZXIgdG9rZW4gdG8gcmVjZWl2ZSBmb2N1cywgY2hlY2sgaWYgX3Nob3dBbGxUb2tlbnMgd2FzIGNhbGxlZCBhZ2FpblxuICAgICAgICB0aGlzLl90b2tlbkVsZW1lbnRGb2N1c2VkU3ViID0gdGhpcy5fdG9rZW5FbGVtZW50Rm9jdXNlZFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDUpLFxuICAgICAgICAgICAgICAgIGZpbHRlcigoaXNGb2N1c2VkKSA9PiBpc0ZvY3VzZWQgJiYgIXRoaXMuX2lucHV0RWxlbWVudEZvY3VzZWQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oaWRlVG9rZW5zKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2hhbmRsZUFycm93UmlnaHQoZnJvbUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGZyb21JbmRleCA9PT0gdGhpcy50b2tlbkxpc3QubGVuZ3RoIC0gdGhpcy5tb3JlVG9rZW5zUmlnaHQubGVuZ3RoIC0gMSAmJiB0aGlzLm1vcmVUb2tlbnNSaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvcHBlZFRva2VuID0gdGhpcy5tb3JlVG9rZW5zUmlnaHQucG9wKCk7XG4gICAgICAgICAgICBpZiAocG9wcGVkVG9rZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYWtlRWxlbWVudFZpc2libGUocG9wcGVkVG9rZW4uZWxlbWVudFJlZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhbmQgdGhlbiBoaWRlIGFueSB0b2tlbnMgZnJvbSB0aGUgbGVmdCB0aGF0IG5vIGxvbmdlciBmaXRcbiAgICAgICAgICAgIHRoaXMuX2NvbGxhcHNlVG9rZW5zKCdsZWZ0Jyk7XG5cbiAgICAgICAgICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY29sbGFwc2VUb2tlbnMoc2lkZT86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fZm9yY2VBbGxUb2tlbnNUb0Rpc3BsYXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2NvbXBhY3QgJiYgIXRoaXMuY29tcGFjdENvbGxhcHNlKSB7XG4gICAgICAgICAgICB0aGlzLl9nZXRIaWRkZW5Db3p5VG9rZW5Db3VudCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lci5mb3JFYWNoKCh2aWV3Q29udGFpbmVyKSA9PiB2aWV3Q29udGFpbmVyLmNsZWFyKCkpO1xuXG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gdGhpcy5fZ2V0VG9rZW5zQXJlYVdpZHRoV2l0aG91dFRva2VucygpO1xuXG4gICAgICAgIGlmICh0aGlzLnRva2VuTGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuV2lkdGggPSB0aGlzLnRva2VuTGlzdC5nZXQoMCk/LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuX3Rva2Vuc0NvbnRhaW5lcldpZHRoID0gYXZhaWxhYmxlV2lkdGggPCB0b2tlbldpZHRoID8gYGNhbGMoMTAwJSAtICR7YXZhaWxhYmxlV2lkdGh9cHgpYCA6ICdhdXRvJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2Vuc0NvbnRhaW5lcldpZHRoID0gJ2F1dG8nO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2hlY2tNb3JlRWxlbWVudFZpc2liaWxpdHkoKTtcblxuICAgICAgICB0aGlzLnRva2VuTGlzdC5mb3JFYWNoKCh0b2tlbikgPT4gdG9rZW4uX3ZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRva2VuLl9jb250ZW50KSk7XG5cbiAgICAgICAgbGV0IGVsZW1lbnRXaWR0aCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICBsZXQgY29tYmluZWRUb2tlbldpZHRoID0gdGhpcy5nZXRDb21iaW5lZFRva2VuV2lkdGgoKTsgLy8gdGhlIGNvbWJpbmVkIHdpZHRoIG9mIGFsbCB0b2tlbnMsIHRoZSBcIl9fX18gbW9yZVwiIHRleHQsIGFuZCB0aGUgaW5wdXRcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAvKlxuICAgICAgICAgV2hlbiByZXNpemluZywgd2Ugd2FudCB0byBjb2xsYXBzZSB0aGUgdG9rZW5zIG9uIHRoZSBsZWZ0IGZpcnN0LiBIb3dldmVyLCB3aGVuIHRoZSB1c2VyIGlzIG5hdmlnYXRpbmcgdGhyb3VnaFxuICAgICAgICAgYSBncm91cCBvZiBvdmVyZmxvd2luZyB0b2tlbnMgdXNpbmcgdGhlIGFycm93IGxlZnQga2V5LCB3ZSBtYXkgbmVlZCB0byBoaWRlIHRva2VucyBvbiB0aGUgcmlnaHQuIFNvIGlmIHRoaXNcbiAgICAgICAgIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZCB3aXRoIHRoZSBwYXJhbSAncmlnaHQnIGl0IHdpbGwgY29sbGFwc2UgdG9rZW5zIGZyb20gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGxpc3QgcmF0aGVyXG4gICAgICAgICB0aGFuIHRoZSAoZGVmYXVsdCkgbGVmdCBzaWRlLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHNpZGUgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIGkgPSB0aGlzLnRva2VuTGlzdC5sZW5ndGggLSAxO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChjb21iaW5lZFRva2VuV2lkdGggPiBlbGVtZW50V2lkdGggJiYgKHNpZGUgPT09ICdyaWdodCcgPyBpID49IDAgOiBpIDwgdGhpcy50b2tlbkxpc3QubGVuZ3RoKSkge1xuICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHRoZSB0b2tlbnMgYW5kIGhpZGUgdGhlbSB1bnRpbCB0aGUgY29tYmluZWRUb2tlbldpZHRoIGZpdHMgaW4gdGhlIGVsZW1lbnRXaWR0aFxuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLnRva2VuTGlzdC5nZXQoaSk7XG4gICAgICAgICAgICBjb25zdCBtb3JlVG9rZW5zID0gc2lkZSA9PT0gJ3JpZ2h0JyA/IHRoaXMubW9yZVRva2Vuc1JpZ2h0IDogdGhpcy5tb3JlVG9rZW5zTGVmdDtcblxuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1vcmVUb2tlbnMuaW5kZXhPZih0b2tlbikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vcmVUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRva2VuLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZ2V0IHRoZSBuZXcgZWxlbWVudFdpZHRoIGFuZCBjb21iaW5lZFRva2VuV2lkdGggYXMgdGhlc2Ugd2lsbCBoYXZlIGNoYW5nZWQgYWZ0ZXIgc2V0dGluZyBhIHRva2VuIGRpc3BsYXkgdG8gJ25vbmUnXG4gICAgICAgICAgICBlbGVtZW50V2lkdGggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrTW9yZUVsZW1lbnRWaXNpYmlsaXR5KCk7XG4gICAgICAgICAgICBjb21iaW5lZFRva2VuV2lkdGggPSB0aGlzLmdldENvbWJpbmVkVG9rZW5XaWR0aCgpO1xuICAgICAgICAgICAgc2lkZSA9PT0gJ3JpZ2h0JyA/IGktLSA6IGkrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3dPdmVyZmxvd1BvcG92ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2hpZGRlblRva2Vucy5mb3JFYWNoKChoaWRkZW5Ub2tlbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBoaWRkZW5Ub2tlbi5fdmlld0NvbnRhaW5lci5jbGVhcigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIuZ2V0KGluZGV4KT8uY3JlYXRlRW1iZWRkZWRWaWV3KGhpZGRlblRva2VuLl9jb250ZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9yZXNldFRva2VucygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tb3JlVG9rZW5zTGVmdCA9IFtdO1xuICAgICAgICB0aGlzLm1vcmVUb2tlbnNSaWdodCA9IFtdO1xuICAgICAgICBpZiAodGhpcy5fY29tcGFjdCB8fCB0aGlzLmNvbXBhY3RDb2xsYXBzZSB8fCB0aGlzLl9mb3JjZUFsbFRva2Vuc1RvRGlzcGxheSkge1xuICAgICAgICAgICAgdGhpcy50b2tlbkxpc3QuZm9yRWFjaCgodG9rZW4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYWtlRWxlbWVudFZpc2libGUodG9rZW4uZWxlbWVudFJlZik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgdGhpcy5fY29sbGFwc2VUb2tlbnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2dldEhpZGRlbkNvenlUb2tlbkNvdW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYW5kbGVUb2tlbkNsaWNrU3Vic2NyaXB0aW9ucygpO1xuICAgICAgICB0aGlzLnByZXZpb3VzVG9rZW5Db3VudCA9IHRoaXMudG9rZW5MaXN0Lmxlbmd0aDtcbiAgICAgICAgdGhpcy50b2tlbkxpc3QuZm9yRWFjaCgodG9rZW4sIGluZGV4KSA9PiB0b2tlbi5fc2V0VG90YWxDb3VudCh0aGlzLnRva2VuTGlzdC5sZW5ndGgsIGluZGV4ICsgMSkpO1xuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2dldEhpZGRlbkNvenlUb2tlbkNvdW50KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbGVtZW50TGVmdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgICAgIHRoaXMuaGlkZGVuQ296eVRva2VuQ291bnQgPSAwO1xuICAgICAgICB0aGlzLnRva2VuTGlzdC5mb3JFYWNoKCh0b2tlbikgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRva2VuLnRva2VuV3JhcHBlckVsZW1lbnQgJiZcbiAgICAgICAgICAgICAgICB0b2tlbi50b2tlbldyYXBwZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQgPCBlbGVtZW50TGVmdFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRkZW5Db3p5VG9rZW5Db3VudCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9jaGVja01vcmVFbGVtZW50VmlzaWJpbGl0eSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfaGFuZGxlQ296eVRva2VuQ291bnQoKTogdm9pZCB7XG4gICAgICAgIC8vIGJlY2F1c2UganVzdGlmeS1jb250ZW50IGJyZWFrcyBzY3JvbGxiYXIsIGl0IGNhbm5vdCBiZSB1c2VkIG9uIGNvenkgc2NyZWVucywgc28gdXNlIEpTIHRvIHNjcm9sbCB0byB0aGUgZW5kXG4gICAgICAgIHRoaXMudG9rZW5pemVySW5uZXJFbC5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSB0aGlzLnRva2VuaXplcklubmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgICAgICAgdGhpcy5fZ2V0SGlkZGVuQ296eVRva2VuQ291bnQoKTtcbiAgICAgICAgaWYgKHRoaXMuaGlkZGVuQ296eVRva2VuQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAvLyBuZWVkIHRvIGRvIHRoaXMgYWdhaW4gaW4gY2FzZSBcIl9fX18gbW9yZVwiIHRleHQgd2FzIGFkZGVkXG4gICAgICAgICAgICB0aGlzLnRva2VuaXplcklubmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gdGhpcy50b2tlbml6ZXJJbm5lckVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgICAgICAgICB0aGlzLl9nZXRIaWRkZW5Db3p5VG9rZW5Db3VudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9tYWtlRWxlbWVudFZpc2libGUoZWxlbWVudFJlZjogRWxlbWVudFJlZik6IHZvaWQge1xuICAgICAgICBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snO1xuICAgICAgICBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Vuc3Vic2NyaWJlQ2xpY2tzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy50b2tlbkxpc3RDbGlja1N1YnNjcmlwdGlvbnMgJiYgdGhpcy50b2tlbkxpc3RDbGlja1N1YnNjcmlwdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnRva2VuTGlzdENsaWNrU3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWJzY3JpcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9pbnB1dEtleWRvd25FdmVudCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMucHVzaChcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmxpc3Rlbih0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQsICdrZXlkb3duJywgKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVLZXlEb3duKGV2ZW50LCB0aGlzLnRva2VuTGlzdC5sZW5ndGgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBNZXRob2Qgd2hpY2ggaGFuZGxlcyB3aGF0IGhhcHBlbnMgdG8gdG9rZW4gd2hlbiBpdCBpcyBjbGlja2VkIGFuZCBubyBrZXkgaXMgYmVpbmcgaGVsZCBkb3duLiovXG4gICAgcHJpdmF0ZSBfYmFzaWNTZWxlY3RlZCh0b2tlbiwgaW5kZXgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b2tlbkxpc3QuZm9yRWFjaCgoc2hhZG93ZWRUb2tlbikgPT4ge1xuICAgICAgICAgICAgaWYgKHNoYWRvd2VkVG9rZW4gIT09IHRva2VuKSB7XG4gICAgICAgICAgICAgICAgc2hhZG93ZWRUb2tlbi5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fZmlyc3RFbGVtZW50SW5TZWxlY3Rpb24gPSBpbmRleDtcbiAgICAgICAgdGhpcy5fbGFzdEVsZW1lbnRJblNlbGVjdGlvbiA9IGluZGV4O1xuICAgICAgICB0b2tlbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2N0cmxQcmV2aW91cyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIFJlc3RhcnQgZmlyc3QgYW5kIGxhc3QgZWxlbWVudHMgZm9yIHNoaWZ0IHNlbGVjdGlvbi4qL1xuICAgIHByaXZhdGUgcmVzZXRGaXJzdEFuZExhc3RFbGVtZW50KCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZXNldCA9ICF0aGlzLnRva2VuTGlzdC5zb21lKCh0b2tlbikgPT4gdG9rZW4uc2VsZWN0ZWQpO1xuICAgICAgICBpZiAocmVzZXQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpcnN0RWxlbWVudEluU2VsZWN0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RFbGVtZW50SW5TZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gTWV0aG9kIHdoaWNoIGhhbmRsZXMgd2hhdCBoYXBwZW5zIHRvIHRva2VuIHdoZW4gaXQgaXMgY2xpY2tlZCBhbmQgdGhlIHNoaWZ0IGtleSBpcyBiZWluZyBoZWxkIGRvd24uKi9cbiAgICBwcml2YXRlIF9zaGlmdFNlbGVjdGVkKGluZGV4KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fZmlyc3RFbGVtZW50SW5TZWxlY3Rpb24gJiYgIXRoaXMuX2xhc3RFbGVtZW50SW5TZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpcnN0RWxlbWVudEluU2VsZWN0aW9uID0gaW5kZXg7XG4gICAgICAgICAgICB0aGlzLl9sYXN0RWxlbWVudEluU2VsZWN0aW9uID0gaW5kZXg7XG4gICAgICAgICAgICB0aGlzLl9kaXJlY3Rpb25TaGlmdElzUmlnaHQgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2ZpcnN0RWxlbWVudEluU2VsZWN0aW9uICYmIGluZGV4IDwgdGhpcy5fZmlyc3RFbGVtZW50SW5TZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZGlyZWN0aW9uU2hpZnRJc1JpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RFbGVtZW50SW5TZWxlY3Rpb24gPSB0aGlzLl9maXJzdEVsZW1lbnRJblNlbGVjdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fZGlyZWN0aW9uU2hpZnRJc1JpZ2h0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlyc3RFbGVtZW50SW5TZWxlY3Rpb24gPSBpbmRleDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbGFzdEVsZW1lbnRJblNlbGVjdGlvbiAmJiBpbmRleCA+IHRoaXMuX2xhc3RFbGVtZW50SW5TZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2RpcmVjdGlvblNoaWZ0SXNSaWdodCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9maXJzdEVsZW1lbnRJblNlbGVjdGlvbiA9IHRoaXMuX2xhc3RFbGVtZW50SW5TZWxlY3Rpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2RpcmVjdGlvblNoaWZ0SXNSaWdodCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdEVsZW1lbnRJblNlbGVjdGlvbiA9IGluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl9kaXJlY3Rpb25TaGlmdElzUmlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maXJzdEVsZW1lbnRJblNlbGVjdGlvbiA9IGluZGV4O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9kaXJlY3Rpb25TaGlmdElzUmlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0RWxlbWVudEluU2VsZWN0aW9uID0gaW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRva2VuTGlzdC5mb3JFYWNoKCh0b2tlbiwgaW5kZXhPZlRva2VuKSA9PiB7XG4gICAgICAgICAgICB0b2tlbi5zZWxlY3RlZCA9XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlyc3RFbGVtZW50SW5TZWxlY3Rpb24gIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RFbGVtZW50SW5TZWxlY3Rpb24gIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIGluZGV4T2ZUb2tlbiA+PSB0aGlzLl9maXJzdEVsZW1lbnRJblNlbGVjdGlvbiAmJlxuICAgICAgICAgICAgICAgIGluZGV4T2ZUb2tlbiA8PSB0aGlzLl9sYXN0RWxlbWVudEluU2VsZWN0aW9uO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fY3RybFByZXZpb3VzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gTWV0aG9kIHdoaWNoIGhhbmRsZXMgd2hhdCBoYXBwZW5zIHRvIHRva2VuIHdoZW4gaXQgaXMgY2xpY2tlZCBhbmQgdGhlIGNvbnRyb2wgb3IgbWV0YSBrZXkgaXMgYmVpbmcgaGVsZCBkb3duLiovXG4gICAgcHJpdmF0ZSBfY3RybFNlbGVjdGVkKHRva2VuLCBpbmRleCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9maXJzdEVsZW1lbnRJblNlbGVjdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuX2xhc3RFbGVtZW50SW5TZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRva2VuLnNlbGVjdGVkO1xuICAgICAgICB0b2tlbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICAgICAgdG9rZW4uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudG9rZW5MaXN0LmZvckVhY2goKGVsZW1lbnQsIGluZGV4T2ZUb2tlbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZmlyc3RFbGVtZW50SW5TZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpcnN0RWxlbWVudEluU2VsZWN0aW9uID0gaW5kZXhPZlRva2VuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFzdEVsZW1lbnRJblNlbGVjdGlvbiA9IGluZGV4T2ZUb2tlbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdGhpcy5fbGFzdEVsZW1lbnRJblNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RFbGVtZW50SW5TZWxlY3Rpb24gPSB0aGlzLl9sYXN0RWxlbWVudEluU2VsZWN0aW9uISAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuX2ZpcnN0RWxlbWVudEluU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlyc3RFbGVtZW50SW5TZWxlY3Rpb24gPSB0aGlzLl9maXJzdEVsZW1lbnRJblNlbGVjdGlvbiEgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2N0cmxQcmV2aW91cyA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqIEdldCBzZWxlY3RlZCBhbmQgZm9jdXNlZCB0b2tlbnMgKi9cbiAgICBwcml2YXRlIF9nZXRBY3RpdmVUb2tlbnMoKTogVG9rZW5Db21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2VuTGlzdC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uc2VsZWN0ZWQgfHwgdGhpcy5faXNUb2tlbkZvY3VzZWQoaXRlbSkpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2V0Rm9jdXNlZFRva2VuSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5MaXN0LnRvQXJyYXkoKS5maW5kSW5kZXgoKHRva2VuKSA9PiB0aGlzLl9pc1Rva2VuRm9jdXNlZCh0b2tlbikpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfaXNUb2tlbkZvY3VzZWQodG9rZW46IFRva2VuQ29tcG9uZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0b2tlbi50b2tlbldyYXBwZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgPT09IHRoaXMuX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9pc0lucHV0Rm9jdXNlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Rva2Vuc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbkxpc3Quc29tZSgodCkgPT4gdC5zZWxlY3RlZCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nZXRJbnB1dFZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9mb2N1c0lucHV0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2lzQ29udHJvbEtleShrZXlib2FyZEV2ZW50OiBLZXlib2FyZEV2ZW50IHwgTW91c2VFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4ga2V5Ym9hcmRFdmVudC5jdHJsS2V5IHx8IGtleWJvYXJkRXZlbnQubWV0YUtleTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2xpc3RlbkVsZW1lbnRFdmVudHMoKTogdm9pZCB7XG4gICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgZnJvbUV2ZW50PEV2ZW50Pih0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2ZvY3VzJywgeyBjYXB0dXJlOiB0cnVlIH0pLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKChldmVudCkgPT4gKGV2ZW50Wyd0YXJnZXQnXSBhcyBhbnkpPy50YWdOYW1lID09PSAnSU5QVVQnICYmIHRoaXMudG9rZW5pemVyRm9jdXNhYmxlKSxcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4gdHJ1ZSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBmcm9tRXZlbnQ8RXZlbnQ+KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnYmx1cicsIHsgY2FwdHVyZTogdHJ1ZSB9KS5waXBlKG1hcCgoKSA9PiBmYWxzZSkpXG4gICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIC8vIGRlYm91bmNlVGltZSBpcyBuZWVkZWQgaW4gb3JkZXIgdG8gZmlsdGVyIHN1YnNlcXVlbnQgZm9jdXMtYmx1ciBldmVudHMsIHRoYXQgaGFwcGVuIHNpbXVsdGFuZW91c2x5XG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDEwKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGZvY3VzZWQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl90b2tlbml6ZXJIYXNGb2N1cyA9IGZvY3VzZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBMaXN0ZW4gd2luZG93IHJlc2l6ZSBhbmQgZGlzdHJpYnV0ZSBjYXJkcyBvbiBjb2x1bW4gY2hhbmdlICovXG4gICAgcHJpdmF0ZSBfbGlzdGVuT25SZXNpemUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25SZXNpemUoKTtcbiAgICAgICAgcmVzaXplT2JzZXJ2YWJsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgzMCksIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vblJlc2l6ZSgpKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2NoZWNrTW9yZUVsZW1lbnRWaXNpYmlsaXR5KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzaG93TW9yZUVsZW1lbnQgPVxuICAgICAgICAgICAgKHRoaXMubW9yZVRva2Vuc0xlZnQubGVuZ3RoID4gMCB8fCB0aGlzLm1vcmVUb2tlbnNSaWdodC5sZW5ndGggPiAwIHx8IHRoaXMuaGlkZGVuQ296eVRva2VuQ291bnQgPiAwKSAmJlxuICAgICAgICAgICAgIXRoaXMub3BlbiAmJlxuICAgICAgICAgICAgIXRoaXMuX3Rva2VuaXplckhhc0ZvY3VzO1xuXG4gICAgICAgIGlmIChzaG93TW9yZUVsZW1lbnQgPT09IHRoaXMuX3Nob3dNb3JlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2hvd01vcmVFbGVtZW50ID0gc2hvd01vcmVFbGVtZW50O1xuXG4gICAgICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmQtdG9rZW5pemVyIGZkLXRva2VuaXplci0tc2Nyb2xsYWJsZVwiIFtjbGFzcy5pcy1mb2N1c109XCJfdG9rZW5pemVySGFzRm9jdXNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmQtdG9rZW5pemVyX19pbm5lclwiICN0b2tlbml6ZXJJbm5lcj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInY29yZVRva2VuaXplci50b2tlbml6ZXJMYWJlbCcgfCBmZFRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiX3Rva2Vuc0NvbnRhaW5lcldpZHRoXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cInRva2VuTGlzdC5sZW5ndGggPT09IDBcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJmZC10b2tlblwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIl9zaG93T3ZlcmZsb3dQb3BvdmVyICYmICgoX2NvbXBhY3QkIHwgYXN5bmMpIHx8IGNvbXBhY3RDb2xsYXBzZSk7IGVsc2UgbW9yZUVsZW1lbnRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0b2tlbnNPdmVyZmxvd1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZmQtZm9ybS1jb250cm9sXVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiBmZC1pbnB1dC1ncm91cC1hZGRvbiAqbmdJZj1cImdseXBoXCIgI2lucHV0R3JvdXBBZGRPbiBbYnV0dG9uXT1cInRydWVcIiBwbGFjZW1lbnQ9XCJhZnRlclwiPlxuICAgICAgICA8YnV0dG9uIGZkLWJ1dHRvbiBjbGFzcz1cImZkLXRva2VuaXplci1hZGRvblwiIGZkVHlwZT1cInRyYW5zcGFyZW50XCIgW2dseXBoXT1cImdseXBoXCIgdHlwZT1cImJ1dHRvblwiPjwvYnV0dG9uPlxuICAgIDwvc3Bhbj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3Rva2Vuc092ZXJmbG93PlxuICAgIDxmZC1wb3BvdmVyIHBsYWNlbWVudD1cImJvdHRvbS1zdGFydFwiIHRpdGxlPVwiXCIgW25vQXJyb3ddPVwiZmFsc2VcIiBbZm9jdXNUcmFwcGVkXT1cInRydWVcIiBbZm9jdXNBdXRvQ2FwdHVyZV09XCJ0cnVlXCI+XG4gICAgICAgIDxmZC1wb3BvdmVyLWNvbnRyb2w+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibW9yZUVsZW1lbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9mZC1wb3BvdmVyLWNvbnRyb2w+XG5cbiAgICAgICAgPGZkLXBvcG92ZXItYm9keT5cbiAgICAgICAgICAgIDx1bCBmZC1saXN0IGNsYXNzPVwiZmQtdG9rZW5pemVyX19vdmVyZmxvdy1saXN0XCI+XG4gICAgICAgICAgICAgICAgPGxpIGZkLWxpc3QtaXRlbSBjbGFzcz1cImZkLXRva2VuaXplcl9fb3ZlcmZsb3ctbGlzdC1pdGVtXCIgKm5nRm9yPVwibGV0IHRva2VuIG9mIF9oaWRkZW5Ub2tlbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAjdmlld0NvbnRhaW5lcj48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhdG9rZW4ucmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmZC10b2tlbl9fY2xvc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRva2VuLmRlbGV0ZUJ1dHRvbkxhYmVsIHx8ICgnY29yZVRva2VuLmRlbGV0ZUJ1dHRvbkxhYmVsJyB8IGZkVHJhbnNsYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9rZW4uY2xvc2VDbGlja0hhbmRsZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZmQtcG9wb3Zlci1ib2R5PlxuICAgIDwvZmQtcG9wb3Zlcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9yZUVsZW1lbnQ+XG4gICAgPHNwYW5cbiAgICAgICAgKGNsaWNrKT1cIm1vcmVDbGlja2VkKClcIlxuICAgICAgICAqbmdJZj1cIl9zaG93TW9yZUVsZW1lbnQgJiYgX2hpZGRlblRva2Vucy5sZW5ndGggPiAwICYmICFfdG9rZW5pemVySGFzRm9jdXNcIlxuICAgICAgICAjbW9yZUVsZW1lbnRTcGFuXG4gICAgICAgIGNsYXNzPVwiZmQtdG9rZW5pemVyLW1vcmVcIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKF9jb21wYWN0JCB8IGFzeW5jKSB8fCBjb21wYWN0Q29sbGFwc2VcIj5cbiAgICAgICAgICAgIHt7ICdjb3JlVG9rZW5pemVyLm1vcmVMYWJlbCcgfCBmZFRyYW5zbGF0ZSA6IHsgY291bnQ6IG1vcmVUb2tlbnNMZWZ0Lmxlbmd0aCArIG1vcmVUb2tlbnNSaWdodC5sZW5ndGggfSB9fVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihfY29tcGFjdCQgfCBhc3luYykgPT09IGZhbHNlICYmICFjb21wYWN0Q29sbGFwc2VcIj5cbiAgICAgICAgICAgIHt7ICdjb3JlVG9rZW5pemVyLm1vcmVMYWJlbCcgfCBmZFRyYW5zbGF0ZSA6IHsgY291bnQ6IGhpZGRlbkNvenlUb2tlbkNvdW50IH0gfX1cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
736
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW5pemVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29yZS9zcmMvbGliL3Rva2VuL3Rva2VuaXplci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi90b2tlbi90b2tlbml6ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLHVEQUF1RDtBQUN2RCxPQUFPLEVBQ0gsQ0FBQyxFQUNELFNBQVMsRUFDVCxNQUFNLEVBQ04sVUFBVSxFQUNWLEtBQUssRUFDTCxVQUFVLEVBQ1YsV0FBVyxFQUNYLEtBQUssRUFDTCxRQUFRLEVBQ1gsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVILHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixlQUFlLEVBQ2YsVUFBVSxFQUNWLFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFJTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsRUFDVCxTQUFTLEVBQ1QsU0FBUyxFQUNULFlBQVksRUFDWixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLFVBQVUsRUFDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUgsT0FBTyxFQUVQLFVBQVUsRUFDVixhQUFhLEVBQ2IsZ0JBQWdCLEVBQ25CLE1BQU0sNEJBQTRCLENBQUM7QUFDcEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLCtCQUErQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDaEgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFB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QUFNOzJCQUFDLFFBQVE7OzBCQUVmLE1BQU07MkJBQUMsV0FBVzs0Q0F0S3ZCLEtBQUs7c0JBREosS0FBSztnQkFLTix1QkFBdUI7c0JBRHRCLEtBQUs7Z0JBS04sU0FBUztzQkFEUixlQUFlO3VCQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxjQUFjLENBQUM7Z0JBS2pELEtBQUs7c0JBREosWUFBWTt1QkFBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUU7Z0JBSzFFLGdCQUFnQjtzQkFEZixTQUFTO3VCQUFDLGdCQUFnQjtnQkFLM0IsV0FBVztzQkFEVixTQUFTO3VCQUFDLGlCQUFpQjtnQkFJTSxPQUFPO3NCQUF4QyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFNbkIsY0FBYztzQkFEdEIsWUFBWTt1QkFBQyxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBNkJ6RCxlQUFlO3NCQURkLEtBQUs7Z0JBS04sa0JBQWtCO3NCQURqQixLQUFLO2dCQUtOLFVBQVU7c0JBRFQsS0FBSztnQkFLTixLQUFLO3NCQURKLEtBQUs7Z0JBS04sUUFBUTtzQkFEUCxLQUFLO2dCQUtOLElBQUk7c0JBREgsS0FBSztnQkFLRyxnQkFBZ0I7c0JBRHhCLE1BQU07Z0JBK0pQLHNCQUFzQixNQWdEdEIsT0FBTztzQkFETixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9tZW1iZXItb3JkZXJpbmcgKi9cbmltcG9ydCB7XG4gICAgQSxcbiAgICBCQUNLU1BBQ0UsXG4gICAgREVMRVRFLFxuICAgIERPV05fQVJST1csXG4gICAgRU5URVIsXG4gICAgTEVGVF9BUlJPVyxcbiAgICBSSUdIVF9BUlJPVyxcbiAgICBTUEFDRSxcbiAgICBVUF9BUlJPV1xufSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBDb250ZW50Q2hpbGQsXG4gICAgQ29udGVudENoaWxkcmVuLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgT3V0cHV0LFxuICAgIFF1ZXJ5TGlzdCxcbiAgICBSZW5kZXJlcjIsXG4gICAgVmlld0NoaWxkLFxuICAgIFZpZXdDaGlsZHJlbixcbiAgICBWaWV3Q29udGFpbmVyUmVmLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENzc0NsYXNzQnVpbGRlcixcbiAgICBLZXlVdGlsLFxuICAgIE51bGxhYmxlLFxuICAgIFJ0bFNlcnZpY2UsXG4gICAgYXBwbHlDc3NDbGFzcyxcbiAgICByZXNpemVPYnNlcnZhYmxlXG59IGZyb20gJ0BmdW5kYW1lbnRhbC1uZ3gvY2RrL3V0aWxzJztcbmltcG9ydCB7IENvbnRlbnREZW5zaXR5T2JzZXJ2ZXIsIGNvbnRlbnREZW5zaXR5T2JzZXJ2ZXJQcm92aWRlcnMgfSBmcm9tICdAZnVuZGFtZW50YWwtbmd4L2NvcmUvY29udGVudC1kZW5zaXR5JztcbmltcG9ydCB7IEZvcm1Db250cm9sQ29tcG9uZW50IH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9jb3JlL2Zvcm0nO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0LCBTdWJzY3JpcHRpb24sIGZpcnN0VmFsdWVGcm9tLCBmcm9tRXZlbnQsIG1lcmdlLCBzdGFydFdpdGggfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyLCBtYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFRva2VuQ29tcG9uZW50IH0gZnJvbSAnLi90b2tlbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgTGl2ZUFubm91bmNlciB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9hMTF5JztcbmltcG9ydCB7IEZEX0xBTkdVQUdFLCBGZExhbmd1YWdlLCBUcmFuc2xhdGlvblJlc29sdmVyIH0gZnJvbSAnQGZ1bmRhbWVudGFsLW5neC9pMThuJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC10b2tlbml6ZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90b2tlbml6ZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3Rva2VuaXplci5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgcHJvdmlkZXJzOiBbY29udGVudERlbnNpdHlPYnNlcnZlclByb3ZpZGVycygpXVxufSlcbmV4cG9ydCBjbGFzcyBUb2tlbml6ZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3ksIENzc0NsYXNzQnVpbGRlciwgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgIC8qKiB1c2VyJ3MgY3VzdG9tIGNsYXNzZXMgKi9cbiAgICBASW5wdXQoKVxuICAgIGNsYXNzOiBzdHJpbmc7XG5cbiAgICAvKiogRGlzYWJsZXMgcG9zc2liaWxpdHkgdG8gcmVtb3ZlIHRva2VucyBieSBrZXlib2FyZCAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZUtleWJvYXJkRGVsZXRpb24gPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihmb3J3YXJkUmVmKCgpID0+IFRva2VuQ29tcG9uZW50KSlcbiAgICB0b2tlbkxpc3Q6IFF1ZXJ5TGlzdDxUb2tlbkNvbXBvbmVudD47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBDb250ZW50Q2hpbGQoZm9yd2FyZFJlZigoKSA9PiBGb3JtQ29udHJvbENvbXBvbmVudCksIHsgcmVhZDogRWxlbWVudFJlZiB9KVxuICAgIGlucHV0OiBFbGVtZW50UmVmPEhUTUxJbnB1dEVsZW1lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCd0b2tlbml6ZXJJbm5lcicpXG4gICAgdG9rZW5pemVySW5uZXJFbDogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGQoJ21vcmVFbGVtZW50U3BhbicpXG4gICAgbW9yZUVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkKCdpbnB1dEdyb3VwQWRkT24nKSBzZXQgY29udGVudChjb250ZW50OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pikge1xuICAgICAgICB0aGlzLmlucHV0R3JvdXBBZGRvbkVsID0gY29udGVudDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIEBWaWV3Q2hpbGRyZW4oJ3ZpZXdDb250YWluZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSlcbiAgICByZWFkb25seSBfdmlld0NvbnRhaW5lcjogUXVlcnlMaXN0PFZpZXdDb250YWluZXJSZWY+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBnZXQgX2hpZGRlblRva2VucygpOiBUb2tlbkNvbXBvbmVudFtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5MaXN0LmZpbHRlcigodG9rZW4pID0+IHRva2VuLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID09PSAnbm9uZScpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKiBPYnNlcnZhYmxlIHN0YXRlIG9mIHRoZSBjb21wYWN0IG1vZGUuXG4gICAgICovXG4gICAgZ2V0IF9jb21wYWN0JCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnREZW5zaXR5T2JzZXJ2ZXIuaXNDb21wYWN0JDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICogQ29tcG9uZW50IGlzIGluIGNvbXBhY3QgbW9kZSwgZGV0ZXJtaW5lZCBieSB0aGUgY29uc3VtZXJcbiAgICAgKi9cbiAgICBnZXQgX2NvbXBhY3QoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50RGVuc2l0eU9ic2VydmVyLmlzQ29tcGFjdDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGlucHV0R3JvdXBBZGRvbkVsOiBFbGVtZW50UmVmO1xuXG4gICAgLyoqIFdoZXRoZXIgdG8gdXNlIGNvenkgdmlzdWFscyBidXQgY29tcGFjdCBjb2xsYXBzaW5nIGJlaGF2aW9yLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgY29tcGFjdENvbGxhcHNlID0gZmFsc2U7XG5cbiAgICAvKiogV2hldGhlciB0b2tlbml6ZXIgc2hvdWxkIGhhdmUgZmFrZSBmb2N1cyBpbmRpY2F0b3IsIHdoZW4gaW5wdXQgaXMgZm9jdXNlZCBpbnNpZGUqL1xuICAgIEBJbnB1dCgpXG4gICAgdG9rZW5pemVyRm9jdXNhYmxlID0gdHJ1ZTtcblxuICAgIC8qKiBUaGUgdmFsdWUgZm9yIHRoZSB0b2tlbml6ZXIgaW5wdXQgKi9cbiAgICBASW5wdXQoKVxuICAgIGlucHV0VmFsdWU6IHN0cmluZztcblxuICAgIC8qKiBJY29uIG9mIHRoZSBidXR0b24gb24gdGhlIHJpZ2h0IG9mIHRoZSBpbnB1dCBmaWVsZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGdseXBoOiBzdHJpbmc7XG5cbiAgICAvKiogV29yZCB0byB1c2UgZm9yIHdoZW4gdGhlcmUgYXJlIGV4dHJhIHRva2Vucy4gKi9cbiAgICBASW5wdXQoKVxuICAgIG1vcmVUZXJtID0gJ21vcmUnO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASW5wdXQoKVxuICAgIG9wZW46IGJvb2xlYW47XG5cbiAgICAvKiogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBzZWFyY2ggdGVybSBjaGFuZ2VzLiBVc2UgKiRldmVudCogdG8gYWNjZXNzIHRoZSBuZXcgdGVybS4gKi9cbiAgICBAT3V0cHV0KClcbiAgICByZWFkb25seSBtb3JlQ2xpY2tlZEV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcmV2aW91c0VsZW1lbnRXaWR0aDogbnVtYmVyO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBtb3JlVG9rZW5zTGVmdDogQXJyYXk8VG9rZW5Db21wb25lbnQ+ID0gW107XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG1vcmVUb2tlbnNSaWdodDogQXJyYXk8VG9rZW5Db21wb25lbnQ+ID0gW107XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByZXZpb3VzVG9rZW5Db3VudDogbnVtYmVyO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICB0b2tlbkxpc3RDaGFuZ2VzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHRva2VuTGlzdENsaWNrU3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgaGlkZGVuQ296eVRva2VuQ291bnQgPSAwO1xuXG4gICAgLyoqIEBoaWRkZW4gVXNlZCB0byBhZGQgZm9jdXMgdG8gdG9rZW5pemVyIGVsZW1lbnQgKi9cbiAgICBfdG9rZW5pemVySGFzRm9jdXMgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX3Nob3dPdmVyZmxvd1BvcG92ZXIgPSB0cnVlO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfc2hvd01vcmVFbGVtZW50ID0gZmFsc2U7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIF90b2tlbnNDb250YWluZXJXaWR0aCA9ICdhdXRvJztcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfdHJhbnNsYXRpb25SZXNvbHZlciA9IG5ldyBUcmFuc2xhdGlvblJlc29sdmVyKCk7XG5cbiAgICAvKiogQGhpZGRlblxuICAgICAqIFZhcmlhYmxlIHdoaWNoIHdpbGwga2VlcCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHRva2VuIHByZXNzZWQgaW4gdGhlIHRva2VuaXplclxuICAgICAqL1xuICAgIHByaXZhdGUgX2ZpcnN0RWxlbWVudEluU2VsZWN0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKiBAaGlkZGVuXG4gICAgICogVmFyaWFibGUgd2hpY2ggd2lsbCBrZWVwIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB0b2tlbiBwcmVzc2VkIGluIHRoZSB0b2tlbml6ZXJcbiAgICAgKi9cbiAgICBwcml2YXRlIF9sYXN0RWxlbWVudEluU2VsZWN0aW9uOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICAgIC8qKiBAaGlkZGVuXG4gICAgICogRmxhZyB3aGljaCB3aWxsIHNheSBpZiB0aGUgbGFzdCBrZXlib2FyZCBhbmQgY2xpY2sgb3BlcmF0aW9uIHRoZXkgdXNlZCB3YXMgdXNpbmcgY29udHJvbFxuICAgICAqL1xuICAgIHByaXZhdGUgX2N0cmxQcmV2aW91czogYm9vbGVhbjtcblxuICAgIC8qKiBAaGlkZGVuXG4gICAgICogRmxhZyB3aGljaCB3aWxsIHNheSBpZiB0aGV5IGhlbGQgc2hpZnQgYW5kIGNsaWNrZWQgaGlnaGxpZ2h0aW5nIGVsZW1lbnRzIGJlZm9yZSBvclxuICAgICAqL1xuICAgIHByaXZhdGUgX2RpcmVjdGlvblNoaWZ0SXNSaWdodDogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqIEFuIFJ4SlMgU3ViamVjdCB0aGF0IHdpbGwga2lsbCB0aGUgZGF0YSBzdHJlYW0gdXBvbiBkZXN0cnVjdGlvbiAoZm9yIHVuc3Vic2NyaWJpbmcpICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgX29uRGVzdHJveSQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IF9ldmVudExpc3RlbmVyczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZm9yY2VBbGxUb2tlbnNUb0Rpc3BsYXkgPSBmYWxzZTtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfdG9rZW5FbGVtZW50Rm9jdXNlZCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9pbnB1dEVsZW1lbnRGb2N1c2VkID0gZmFsc2U7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Rva2VuRWxlbWVudEZvY3VzZWRTdWI6IE51bGxhYmxlPFN1YnNjcmlwdGlvbj47XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICByZWFkb25seSBfY29udGVudERlbnNpdHlPYnNlcnZlcjogQ29udGVudERlbnNpdHlPYnNlcnZlcixcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgX2NkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBfcnRsU2VydmljZTogUnRsU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSByZWFkb25seSBfZG9jdW1lbnQ6IERvY3VtZW50LFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9saXZlQW5ub3VuY2VyOiBMaXZlQW5ub3VuY2VyLFxuICAgICAgICBASW5qZWN0KEZEX0xBTkdVQUdFKSBwcml2YXRlIHJlYWRvbmx5IF9sYW5ndWFnZSQ6IE9ic2VydmFibGU8RmRMYW5ndWFnZT5cbiAgICApIHtcbiAgICAgICAgdGhpcy5fZXZlbnRMaXN0ZW5lcnMucHVzaChcbiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmxpc3Rlbignd2luZG93JywgJ2NsaWNrJywgKGU6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGUudGFyZ2V0KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2tlbkxpc3QuZm9yRWFjaCgodG9rZW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlucHV0Py5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLl9zZXR1cElucHV0S2V5ZG93bkV2ZW50KCk7XG4gICAgICAgICAgICB0aGlzLl9zZXR1cElucHV0Rm9jdXNFdmVudCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd2F0Y2ggZm9yIGNoYW5nZXMgdG8gdGhlIHRva2VuTGlzdCBhbmQgYXR0ZW1wdCB0byBleHBhbmQvY29sbGFwc2UgdG9rZW5zIGFzIG5lZWRlZFxuICAgICAgICB0aGlzLnRva2VuTGlzdC5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG51bGwpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50b2tlbkxpc3RDaGFuZ2VzU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgICAgICAgICAgdGhpcy50b2tlbkxpc3RDaGFuZ2VzU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5fcmVzZXRUb2tlbnMoKTtcbiAgICAgICAgICAgIHRoaXMudG9rZW5MaXN0LmZvckVhY2goKHRva2VuKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2tlbkxpc3RDaGFuZ2VzU3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4ub25DbG9zZUNsaWNrLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZXNldFRva2VucygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy50b2tlbkxpc3RDaGFuZ2VzU3Vic2NyaXB0aW9uLmFkZChcbiAgICAgICAgICAgICAgICAgICAgdG9rZW4uZWxlbWVudEZvY3VzZWQuc3Vic2NyaWJlKChpc0ZvY3VzZWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Rva2VuRWxlbWVudEZvY3VzZWQubmV4dChpc0ZvY3VzZWQpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCF0aGlzLl9jb21wYWN0ICYmICF0aGlzLmNvbXBhY3RDb2xsYXBzZSkge1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlQ296eVRva2VuQ291bnQoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9saXN0ZW5FbGVtZW50RXZlbnRzKCk7XG4gICAgICAgIHRoaXMucHJldmlvdXNFbGVtZW50V2lkdGggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgdGhpcy5fbGlzdGVuT25SZXNpemUoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRva2VuTGlzdENoYW5nZXNTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX3Rva2VuRWxlbWVudEZvY3VzZWRTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX29uRGVzdHJveSQubmV4dCgpO1xuICAgICAgICB0aGlzLl9vbkRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzLmZvckVhY2goKGUpID0+IGUoKSk7XG4gICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlQ2xpY2tzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5idWlsZENvbXBvbmVudENzc0NsYXNzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uQ2hhbmdlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5idWlsZENvbXBvbmVudENzc0NsYXNzKCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW5cbiAgICAgKiBDc3NDbGFzc0J1aWxkZXIgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uXG4gICAgICogZnVuY3Rpb24gbXVzdCByZXR1cm4gc2luZ2xlIHN0cmluZ1xuICAgICAqIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBvcmRlciB3aGljaCBjc3MgY2xhc3NlcyBhcmUgYXBwbGllZFxuICAgICAqL1xuICAgIEBhcHBseUNzc0NsYXNzXG4gICAgYnVpbGRDb21wb25lbnRDc3NDbGFzcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBbdGhpcy5jbGFzc107XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBoYW5kbGVUb2tlbkNsaWNrU3Vic2NyaXB0aW9ucygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVDbGlja3MoKTtcbiAgICAgICAgdGhpcy50b2tlbkxpc3QuZm9yRWFjaCgodG9rZW4sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAodG9rZW4udG9rZW5XcmFwcGVyRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHRva2VuLnRva2VuV3JhcHBlckVsZW1lbnQubmF0aXZlRWxlbWVudC50YWJJbmRleCA9IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50b2tlbkxpc3RDbGlja1N1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICB0b2tlbi5vblRva2VuQ2xpY2suc3Vic2NyaWJlKChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1c1Rva2VuRWxlbWVudChpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc0NvbnRyb2xLZXkoZXZlbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdHJsU2VsZWN0ZWQodG9rZW4sIGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZXZlbnQuc2hpZnRLZXkgfHwgdGhpcy5fY3RybFByZXZpb3VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9iYXNpY1NlbGVjdGVkKHRva2VuLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGaXJzdEFuZExhc3RFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaGlmdFNlbGVjdGVkKGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy50b2tlbkxpc3RDbGlja1N1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICB0b2tlbi5vblRva2VuS2V5ZG93bi5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlS2V5RG93bihldmVudCwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGZvY3VzVG9rZW5FbGVtZW50KG5ld0luZGV4OiBudW1iZXIpOiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGxldCBlbGVtZW50VG9Gb2N1czogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IHRva2VuTGlzdEFycmF5OiBUb2tlbkNvbXBvbmVudFtdID0gdGhpcy50b2tlbkxpc3QudG9BcnJheSgpO1xuICAgICAgICBpZiAodG9rZW5MaXN0QXJyYXlbbmV3SW5kZXhdKSB7XG4gICAgICAgICAgICBlbGVtZW50VG9Gb2N1cyA9IHRva2VuTGlzdEFycmF5W25ld0luZGV4XS50b2tlbldyYXBwZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAvLyBlbGVtZW50IG5lZWRzIHRhYmluZGV4IGluIG9yZGVyIHRvIGJlIGZvY3VzZWRcbiAgICAgICAgICAgIGVsZW1lbnRUb0ZvY3VzIS5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRUb0ZvY3VzO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bicsIFsnJGV2ZW50J10pXG4gICAga2V5RG93bihrZXlib2FyZEV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIEtleVV0aWwuaXNLZXlDb2RlKGtleWJvYXJkRXZlbnQsIFtERUxFVEUsIEJBQ0tTUEFDRV0pICYmXG4gICAgICAgICAgICAoIXRoaXMuX2lzSW5wdXRGb2N1c2VkKCkgfHwgdGhpcy5fdG9rZW5zU2VsZWN0ZWQoKSkgJiZcbiAgICAgICAgICAgICF0aGlzLmRpc2FibGVLZXlib2FyZERlbGV0aW9uXG4gICAgICAgICkge1xuICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IHRoaXMuX2dldEFjdGl2ZVRva2VucygpO1xuICAgICAgICAgICAgY29uc3QgZm9jdXNlZFRva2VuSW5kZXggPSB0aGlzLl9nZXRGb2N1c2VkVG9rZW5JbmRleCgpO1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiBlbGVtZW50Lm9uQ2xvc2VDbGljay5lbWl0KCkpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmIChLZXlVdGlsLmlzS2V5Q29kZShrZXlib2FyZEV2ZW50LCBERUxFVEUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzSW5wdXQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzVG9rZW5FbGVtZW50KGZvY3VzZWRUb2tlbkluZGV4IC0gMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgS2V5VXRpbC5pc0tleUNvZGUoa2V5Ym9hcmRFdmVudCwgQkFDS1NQQUNFKSAmJlxuICAgICAgICAgICAgdGhpcy5faXNJbnB1dEZvY3VzZWQoKSAmJlxuICAgICAgICAgICAgIXRoaXMuX2dldElucHV0VmFsdWUoKSAmJlxuICAgICAgICAgICAgIXRoaXMuZGlzYWJsZUtleWJvYXJkRGVsZXRpb25cbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzVG9rZW5FbGVtZW50KHRoaXMudG9rZW5MaXN0Lmxlbmd0aCAtIDEpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBvblJlc2l6ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudFJlZikge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudFdpZHRoID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgICAgICB0aGlzLl9yZXNldFRva2VucygpO1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91c0VsZW1lbnRXaWR0aCA9IGVsZW1lbnRXaWR0aDtcbiAgICAgICAgICAgIGlmICghdGhpcy5fY29tcGFjdCAmJiAhdGhpcy5jb21wYWN0Q29sbGFwc2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVDb3p5VG9rZW5Db3VudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBoYW5kbGVLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBmcm9tSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBsZXQgbmV3SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgcnRsID0gdGhpcy5fcnRsU2VydmljZSAmJiB0aGlzLl9ydGxTZXJ2aWNlLnJ0bCA/IHRoaXMuX3J0bFNlcnZpY2UucnRsLmdldFZhbHVlKCkgOiBmYWxzZTtcbiAgICAgICAgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBTUEFDRSkgJiYgIXRoaXMuX2lzSW5wdXRGb2N1c2VkKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuID0gdGhpcy50b2tlbkxpc3QuZmluZCgoXywgaW5kZXgpID0+IGluZGV4ID09PSBmcm9tSW5kZXgpO1xuICAgICAgICAgICAgdGhpcy50b2tlbkxpc3QuZm9yRWFjaCgoc2hhZG93ZWRUb2tlbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzaGFkb3dlZFRva2VuICE9PSB0b2tlbikge1xuICAgICAgICAgICAgICAgICAgICBzaGFkb3dlZFRva2VuLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0b2tlbiAmJiAodG9rZW4uc2VsZWN0ZWQgPSAhdG9rZW4uc2VsZWN0ZWQpO1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSBlbHNlIGlmIChLZXlVdGlsLmlzS2V5Q29kZShldmVudCwgRU5URVIpKSB7XG4gICAgICAgICAgICB0aGlzLl9mb2N1c0lucHV0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZ29CYWNrUmVxdWVzdGVkKGV2ZW50LCBydGwpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlQXJyb3dMZWZ0KGZyb21JbmRleCk7XG4gICAgICAgICAgICBuZXdJbmRleCA9IGZyb21JbmRleCAtIDE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5fZ29Gb3J3YXJkUmVxdWVzdGVkKGV2ZW50LCBydGwpKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5faGFuZGxlQXJyb3dSaWdodChmcm9tSW5kZXgpO1xuICAgICAgICAgICAgbmV3SW5kZXggPSBmcm9tSW5kZXggKyAxO1xuICAgICAgICB9IGVsc2UgaWYgKEtleVV0aWwuaXNLZXlDb2RlKGV2ZW50LCBBKSAmJiAhdGhpcy5fZ2V0SW5wdXRWYWx1ZSgpICYmIHRoaXMuX2lzQ29udHJvbEtleShldmVudCkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnRva2VuTGlzdC5mb3JFYWNoKCh0b2tlbikgPT4gKHRva2VuLnNlbGVjdGVkID0gdHJ1ZSkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdJbmRleCA9PT0gdGhpcy50b2tlbkxpc3QubGVuZ3RoICYmIHRoaXMuX2dvRm9yd2FyZFJlcXVlc3RlZChldmVudCwgcnRsKSkge1xuICAgICAgICAgICAgdGhpcy5fZm9jdXNJbnB1dCgpO1xuICAgICAgICB9IGVsc2UgaWYgKG5ld0luZGV4ISA+IHRoaXMudG9rZW5MaXN0Lmxlbmd0aCAtIHRoaXMubW9yZVRva2Vuc1JpZ2h0Lmxlbmd0aCAmJiB0aGlzLl9pc0lucHV0Rm9jdXNlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzVG9rZW5FbGVtZW50KG5ld0luZGV4ISAtIHRoaXMubW9yZVRva2Vuc1JpZ2h0Lmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSBpZiAobmV3SW5kZXggfHwgbmV3SW5kZXggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNUb2tlbkVsZW1lbnQobmV3SW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBnZXRDb21iaW5lZFRva2VuV2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHRvdGFsVG9rZW5XaWR0aCA9IHRoaXMuX2dldFRva2Vuc0FyZWFXaWR0aFdpdGhvdXRUb2tlbnMoKTtcbiAgICAgICAgLy8gZ2V0IHRoZSB3aWR0aCBvZiBlYWNoIHRva2VuXG4gICAgICAgIHRoaXMudG9rZW5MaXN0LmZvckVhY2goKHRva2VuKSA9PiB7XG4gICAgICAgICAgICB0b3RhbFRva2VuV2lkdGggPSB0b3RhbFRva2VuV2lkdGggKyB0b2tlbi5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0b3RhbFRva2VuV2lkdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgd2hldGhlciB1c2VyIGludGVuZHMgdG8gZ28gYmFjayB0byB0aGUgcHJldmlvdXMgdG9rZW5cbiAgICAgKiovXG4gICAgcHJpdmF0ZSBfZ29CYWNrUmVxdWVzdGVkKCRldmVudDogS2V5Ym9hcmRFdmVudCwgcnRsOiBib29sZWFuKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghcnRsKSB7XG4gICAgICAgICAgICByZXR1cm4gS2V5VXRpbC5pc0tleUNvZGUoJGV2ZW50LCBMRUZUX0FSUk9XKSB8fCBLZXlVdGlsLmlzS2V5Q29kZSgkZXZlbnQsIFVQX0FSUk9XKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gS2V5VXRpbC5pc0tleUNvZGUoJGV2ZW50LCBSSUdIVF9BUlJPVykgfHwgS2V5VXRpbC5pc0tleUNvZGUoJGV2ZW50LCBET1dOX0FSUk9XKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayB3aGV0aGVyIHVzZXIgaW50ZW5kcyB0byBnbyBmb3J3YXJkIHRvIHRoZSBuZXh0IHRva2VuXG4gICAgICoqL1xuICAgIHByaXZhdGUgX2dvRm9yd2FyZFJlcXVlc3RlZCgkZXZlbnQ6IEtleWJvYXJkRXZlbnQsIHJ0bDogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIXJ0bCkge1xuICAgICAgICAgICAgcmV0dXJuIEtleVV0aWwuaXNLZXlDb2RlKCRldmVudCwgUklHSFRfQVJST1cpIHx8IEtleVV0aWwuaXNLZXlDb2RlKCRldmVudCwgRE9XTl9BUlJPVyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEtleVV0aWwuaXNLZXlDb2RlKCRldmVudCwgTEVGVF9BUlJPVykgfHwgS2V5VXRpbC5pc0tleUNvZGUoJGV2ZW50LCBVUF9BUlJPVyk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nZXRUb2tlbnNBcmVhV2lkdGhXaXRob3V0VG9rZW5zKCk6IG51bWJlciB7XG4gICAgICAgIGxldCB0b3RhbFRva2VuV2lkdGggPSAwO1xuICAgICAgICAvLyBhZGQgaW5wdXQgd2lkdGhcbiAgICAgICAgaWYgKHRoaXMuaW5wdXQ/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRvdGFsVG9rZW5XaWR0aCA9IHRvdGFsVG9rZW5XaWR0aCArIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgfVxuICAgICAgICAvLyBhZGQgdGhlIHdpZHRoIG9mIHRoZSBcIl9fX18gbW9yZVwiIGVsZW1lbnRcbiAgICAgICAgaWYgKHRoaXMubW9yZVRva2Vuc0xlZnQubGVuZ3RoID4gMCAmJiB0aGlzLm1vcmVFbGVtZW50ICYmIHRoaXMubW9yZUVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdG90YWxUb2tlbldpZHRoID0gdG90YWxUb2tlbldpZHRoICsgdGhpcy5tb3JlRWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFkZCB0aGUgaW5wdXQgZ3JvdXAgYWRkb25cbiAgICAgICAgaWYgKHRoaXMuaW5wdXRHcm91cEFkZG9uRWwgJiYgdGhpcy5pbnB1dEdyb3VwQWRkb25FbC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgICB0b3RhbFRva2VuV2lkdGggPSB0b3RhbFRva2VuV2lkdGggKyB0aGlzLmlucHV0R3JvdXBBZGRvbkVsLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG90YWxUb2tlbldpZHRoO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbW9yZUNsaWNrZWQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubW9yZUNsaWNrZWRFdmVudC5lbWl0KCk7XG4gICAgfVxuXG4gICAgLyoqIFJlbW92ZXMgYWxsIHNlbGVjdGVkIHRva2VucyAqL1xuICAgIHJlbW92ZVNlbGVjdGVkVG9rZW5zKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gdGhpcy5fZ2V0QWN0aXZlVG9rZW5zKCk7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4gZWxlbWVudC5vblJlbW92ZS5lbWl0KCkpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfaGFuZGxlQXJyb3dMZWZ0KGZyb21JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIC8vIGlmIHRoZSBsZWZ0bW9zdCB2aXNpYmxlIHRva2VuIGlzIHNlbGVjdGVkLCBhbmQgdGhlcmUgYXJlIG1vcmVUb2tlbnNMZWZ0LCBuZWVkIHRvIGRpc3BsYXkgYSBtb3JlVG9rZW5MZWZ0XG4gICAgICAgIGlmIChmcm9tSW5kZXggPT09IHRoaXMubW9yZVRva2Vuc0xlZnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBwb3BwZWRUb2tlbiA9IHRoaXMubW9yZVRva2Vuc0xlZnQucG9wKCk7XG4gICAgICAgICAgICBpZiAocG9wcGVkVG9rZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYWtlRWxlbWVudFZpc2libGUocG9wcGVkVG9rZW4uZWxlbWVudFJlZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhbmQgdGhlbiBoaWRlIGFueSB0b2tlbnMgZnJvbSB0aGUgcmlnaHQgdGhhdCBubyBsb25nZXIgZml0XG4gICAgICAgICAgICB0aGlzLl9jb2xsYXBzZVRva2VucygncmlnaHQnKTtcblxuICAgICAgICAgICAgdGhpcy5fY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBfc2hvd0FsbFRva2VucygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZm9yY2VBbGxUb2tlbnNUb0Rpc3BsYXkgPSB0cnVlO1xuICAgICAgICB0aGlzLl9pbnB1dEVsZW1lbnRGb2N1c2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50b2tlbkxpc3QuZm9yRWFjaCgodG9rZW4pID0+IHtcbiAgICAgICAgICAgIHRoaXMuX21ha2VFbGVtZW50VmlzaWJsZSh0b2tlbi5lbGVtZW50UmVmKTtcbiAgICAgICAgICAgIHRva2VuLl92aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0b2tlbi5fY29udGVudCk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl90b2tlbnNDb250YWluZXJXaWR0aCA9ICdhdXRvJztcbiAgICAgICAgdGhpcy5fc2hvd01vcmVFbGVtZW50ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy50b2tlbml6ZXJJbm5lckVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IHRoaXMudG9rZW5pemVySW5uZXJFbC5uYXRpdmVFbGVtZW50LnNjcm9sbFdpZHRoO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgX2hpZGVUb2tlbnMoKTogdm9pZCB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5faW5wdXRFbGVtZW50Rm9jdXNlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgdG9rZW5Gb2N1c2VkID0gdGhpcy5fZ2V0Rm9jdXNlZFRva2VuSW5kZXgoKSA+IC0xO1xuXG4gICAgICAgICAgICBpZiAodG9rZW5Gb2N1c2VkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd2FpdEZvckZvY3VzVG9EaXNhcHBlYXIoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9mb3JjZUFsbFRva2Vuc1RvRGlzcGxheSA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5fcmVzZXRUb2tlbnMoKTtcbiAgICAgICAgICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIHRoaXMudG9rZW5pemVySW5uZXJFbC5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSB0aGlzLnRva2VuaXplcklubmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF93YWl0Rm9yRm9jdXNUb0Rpc2FwcGVhcigpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdG9rZW5FbGVtZW50Rm9jdXNlZFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgLy8gNSBtcyBkZWxheSBmb3Igb3RoZXIgdG9rZW4gdG8gcmVjZWl2ZSBmb2N1cywgY2hlY2sgaWYgX3Nob3dBbGxUb2tlbnMgd2FzIGNhbGxlZCBhZ2FpblxuICAgICAgICB0aGlzLl90b2tlbkVsZW1lbnRGb2N1c2VkU3ViID0gdGhpcy5fdG9rZW5FbGVtZW50Rm9jdXNlZFxuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDUpLFxuICAgICAgICAgICAgICAgIGZpbHRlcigoaXNGb2N1c2VkKSA9PiBpc0ZvY3VzZWQgJiYgIXRoaXMuX2lucHV0RWxlbWVudEZvY3VzZWQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9oaWRlVG9rZW5zKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2hhbmRsZUFycm93UmlnaHQoZnJvbUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKGZyb21JbmRleCA9PT0gdGhpcy50b2tlbkxpc3QubGVuZ3RoIC0gdGhpcy5tb3JlVG9rZW5zUmlnaHQubGVuZ3RoIC0gMSAmJiB0aGlzLm1vcmVUb2tlbnNSaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvcHBlZFRva2VuID0gdGhpcy5tb3JlVG9rZW5zUmlnaHQucG9wKCk7XG4gICAgICAgICAgICBpZiAocG9wcGVkVG9rZW4pIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYWtlRWxlbWVudFZpc2libGUocG9wcGVkVG9rZW4uZWxlbWVudFJlZik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhbmQgdGhlbiBoaWRlIGFueSB0b2tlbnMgZnJvbSB0aGUgbGVmdCB0aGF0IG5vIGxvbmdlciBmaXRcbiAgICAgICAgICAgIHRoaXMuX2NvbGxhcHNlVG9rZW5zKCdsZWZ0Jyk7XG5cbiAgICAgICAgICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfY29sbGFwc2VUb2tlbnMoc2lkZT86IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5fZm9yY2VBbGxUb2tlbnNUb0Rpc3BsYXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2NvbXBhY3QgJiYgIXRoaXMuY29tcGFjdENvbGxhcHNlKSB7XG4gICAgICAgICAgICB0aGlzLl9nZXRIaWRkZW5Db3p5VG9rZW5Db3VudCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lci5mb3JFYWNoKCh2aWV3Q29udGFpbmVyKSA9PiB2aWV3Q29udGFpbmVyLmNsZWFyKCkpO1xuXG4gICAgICAgIGNvbnN0IGF2YWlsYWJsZVdpZHRoID0gdGhpcy5fZ2V0VG9rZW5zQXJlYVdpZHRoV2l0aG91dFRva2VucygpO1xuXG4gICAgICAgIGlmICh0aGlzLnRva2VuTGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuV2lkdGggPSB0aGlzLnRva2VuTGlzdC5nZXQoMCk/LmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuX3Rva2Vuc0NvbnRhaW5lcldpZHRoID0gYXZhaWxhYmxlV2lkdGggPCB0b2tlbldpZHRoID8gYGNhbGMoMTAwJSAtICR7YXZhaWxhYmxlV2lkdGh9cHgpYCA6ICdhdXRvJztcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2Vuc0NvbnRhaW5lcldpZHRoID0gJ2F1dG8nO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fY2hlY2tNb3JlRWxlbWVudFZpc2liaWxpdHkoKTtcblxuICAgICAgICB0aGlzLnRva2VuTGlzdC5mb3JFYWNoKCh0b2tlbikgPT4gdG9rZW4uX3ZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRva2VuLl9jb250ZW50KSk7XG5cbiAgICAgICAgbGV0IGVsZW1lbnRXaWR0aCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICBsZXQgY29tYmluZWRUb2tlbldpZHRoID0gdGhpcy5nZXRDb21iaW5lZFRva2VuV2lkdGgoKTsgLy8gdGhlIGNvbWJpbmVkIHdpZHRoIG9mIGFsbCB0b2tlbnMsIHRoZSBcIl9fX18gbW9yZVwiIHRleHQsIGFuZCB0aGUgaW5wdXRcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAvKlxuICAgICAgICAgV2hlbiByZXNpemluZywgd2Ugd2FudCB0byBjb2xsYXBzZSB0aGUgdG9rZW5zIG9uIHRoZSBsZWZ0IGZpcnN0LiBIb3dldmVyLCB3aGVuIHRoZSB1c2VyIGlzIG5hdmlnYXRpbmcgdGhyb3VnaFxuICAgICAgICAgYSBncm91cCBvZiBvdmVyZmxvd2luZyB0b2tlbnMgdXNpbmcgdGhlIGFycm93IGxlZnQga2V5LCB3ZSBtYXkgbmVlZCB0byBoaWRlIHRva2VucyBvbiB0aGUgcmlnaHQuIFNvIGlmIHRoaXNcbiAgICAgICAgIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZCB3aXRoIHRoZSBwYXJhbSAncmlnaHQnIGl0IHdpbGwgY29sbGFwc2UgdG9rZW5zIGZyb20gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGxpc3QgcmF0aGVyXG4gICAgICAgICB0aGFuIHRoZSAoZGVmYXVsdCkgbGVmdCBzaWRlLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHNpZGUgPT09ICdyaWdodCcpIHtcbiAgICAgICAgICAgIGkgPSB0aGlzLnRva2VuTGlzdC5sZW5ndGggLSAxO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChjb21iaW5lZFRva2VuV2lkdGggPiBlbGVtZW50V2lkdGggJiYgKHNpZGUgPT09ICdyaWdodCcgPyBpID49IDAgOiBpIDwgdGhpcy50b2tlbkxpc3QubGVuZ3RoKSkge1xuICAgICAgICAgICAgLy8gbG9vcCB0aHJvdWdoIHRoZSB0b2tlbnMgYW5kIGhpZGUgdGhlbSB1bnRpbCB0aGUgY29tYmluZWRUb2tlbldpZHRoIGZpdHMgaW4gdGhlIGVsZW1lbnRXaWR0aFxuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0aGlzLnRva2VuTGlzdC5nZXQoaSk7XG4gICAgICAgICAgICBjb25zdCBtb3JlVG9rZW5zID0gc2lkZSA9PT0gJ3JpZ2h0JyA/IHRoaXMubW9yZVRva2Vuc1JpZ2h0IDogdGhpcy5tb3JlVG9rZW5zTGVmdDtcblxuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1vcmVUb2tlbnMuaW5kZXhPZih0b2tlbikgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIG1vcmVUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRva2VuLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gZ2V0IHRoZSBuZXcgZWxlbWVudFdpZHRoIGFuZCBjb21iaW5lZFRva2VuV2lkdGggYXMgdGhlc2Ugd2lsbCBoYXZlIGNoYW5nZWQgYWZ0ZXIgc2V0dGluZyBhIHRva2VuIGRpc3BsYXkgdG8gJ25vbmUnXG4gICAgICAgICAgICBlbGVtZW50V2lkdGggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrTW9yZUVsZW1lbnRWaXNpYmlsaXR5KCk7XG4gICAgICAgICAgICBjb21iaW5lZFRva2VuV2lkdGggPSB0aGlzLmdldENvbWJpbmVkVG9rZW5XaWR0aCgpO1xuICAgICAgICAgICAgc2lkZSA9PT0gJ3JpZ2h0JyA/IGktLSA6IGkrKztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3Nob3dPdmVyZmxvd1BvcG92ZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2hpZGRlblRva2Vucy5mb3JFYWNoKChoaWRkZW5Ub2tlbiwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICBoaWRkZW5Ub2tlbi5fdmlld0NvbnRhaW5lci5jbGVhcigpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIuZ2V0KGluZGV4KT8uY3JlYXRlRW1iZWRkZWRWaWV3KGhpZGRlblRva2VuLl9jb250ZW50KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9yZXNldFRva2VucygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5tb3JlVG9rZW5zTGVmdCA9IFtdO1xuICAgICAgICB0aGlzLm1vcmVUb2tlbnNSaWdodCA9IFtdO1xuICAgICAgICBpZiAodGhpcy5fY29tcGFjdCB8fCB0aGlzLmNvbXBhY3RDb2xsYXBzZSB8fCB0aGlzLl9mb3JjZUFsbFRva2Vuc1RvRGlzcGxheSkge1xuICAgICAgICAgICAgdGhpcy50b2tlbkxpc3QuZm9yRWFjaCgodG9rZW4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYWtlRWxlbWVudFZpc2libGUodG9rZW4uZWxlbWVudFJlZik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgICAgdGhpcy5fY29sbGFwc2VUb2tlbnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2dldEhpZGRlbkNvenlUb2tlbkNvdW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oYW5kbGVUb2tlbkNsaWNrU3Vic2NyaXB0aW9ucygpO1xuICAgICAgICB0aGlzLnByZXZpb3VzVG9rZW5Db3VudCA9IHRoaXMudG9rZW5MaXN0Lmxlbmd0aDtcbiAgICAgICAgdGhpcy50b2tlbkxpc3QuZm9yRWFjaCgodG9rZW4sIGluZGV4KSA9PiB0b2tlbi5fc2V0VG90YWxDb3VudCh0aGlzLnRva2VuTGlzdC5sZW5ndGgsIGluZGV4ICsgMSkpO1xuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2dldEhpZGRlbkNvenlUb2tlbkNvdW50KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBlbGVtZW50TGVmdCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG4gICAgICAgIHRoaXMuaGlkZGVuQ296eVRva2VuQ291bnQgPSAwO1xuICAgICAgICB0aGlzLnRva2VuTGlzdC5mb3JFYWNoKCh0b2tlbikgPT4ge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRva2VuLnRva2VuV3JhcHBlckVsZW1lbnQgJiZcbiAgICAgICAgICAgICAgICB0b2tlbi50b2tlbldyYXBwZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQgPCBlbGVtZW50TGVmdFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRkZW5Db3p5VG9rZW5Db3VudCArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl9jaGVja01vcmVFbGVtZW50VmlzaWJpbGl0eSgpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfaGFuZGxlQ296eVRva2VuQ291bnQoKTogdm9pZCB7XG4gICAgICAgIC8vIGJlY2F1c2UganVzdGlmeS1jb250ZW50IGJyZWFrcyBzY3JvbGxiYXIsIGl0IGNhbm5vdCBiZSB1c2VkIG9uIGNvenkgc2NyZWVucywgc28gdXNlIEpTIHRvIHNjcm9sbCB0byB0aGUgZW5kXG4gICAgICAgIHRoaXMudG9rZW5pemVySW5uZXJFbC5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSB0aGlzLnRva2VuaXplcklubmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aDtcbiAgICAgICAgdGhpcy5fZ2V0SGlkZGVuQ296eVRva2VuQ291bnQoKTtcbiAgICAgICAgaWYgKHRoaXMuaGlkZGVuQ296eVRva2VuQ291bnQgPiAwKSB7XG4gICAgICAgICAgICAvLyBuZWVkIHRvIGRvIHRoaXMgYWdhaW4gaW4gY2FzZSBcIl9fX18gbW9yZVwiIHRleHQgd2FzIGFkZGVkXG4gICAgICAgICAgICB0aGlzLnRva2VuaXplcklubmVyRWwubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gdGhpcy50b2tlbml6ZXJJbm5lckVsLm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGg7XG4gICAgICAgICAgICB0aGlzLl9nZXRIaWRkZW5Db3p5VG9rZW5Db3VudCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9tYWtlRWxlbWVudFZpc2libGUoZWxlbWVudFJlZjogRWxlbWVudFJlZik6IHZvaWQge1xuICAgICAgICBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snO1xuICAgICAgICBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJztcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Vuc3Vic2NyaWJlQ2xpY2tzKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy50b2tlbkxpc3RDbGlja1N1YnNjcmlwdGlvbnMgJiYgdGhpcy50b2tlbkxpc3RDbGlja1N1YnNjcmlwdGlvbnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnRva2VuTGlzdENsaWNrU3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWJzY3JpcHRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9zZXR1cElucHV0S2V5ZG93bkV2ZW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9ldmVudExpc3RlbmVycy5wdXNoKFxuICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIubGlzdGVuKHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudCwgJ2tleWRvd24nLCAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUtleURvd24oZXZlbnQsIHRoaXMudG9rZW5MaXN0Lmxlbmd0aCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfc2V0dXBJbnB1dEZvY3VzRXZlbnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2V2ZW50TGlzdGVuZXJzLnB1c2goXG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5saXN0ZW4odGhpcy5pbnB1dC5uYXRpdmVFbGVtZW50LCAnZm9jdXMnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFrZVRva2VuaXplckZvY3VzQ291bnRBbm5vdW5jZW1lbnQoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIGFzeW5jIF9tYWtlVG9rZW5pemVyRm9jdXNDb3VudEFubm91bmNlbWVudCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgY29uc3QgbGFuZyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMuX2xhbmd1YWdlJCk7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB0aGlzLl90cmFuc2xhdGlvblJlc29sdmVyLnJlc29sdmUobGFuZywgJ2NvcmVNdWx0aUlucHV0LnRva2Vuc0NvdW50VGV4dCcsIHtcbiAgICAgICAgICAgIGxlbmd0aDogdGhpcy50b2tlbkxpc3QubGVuZ3RoID8gdGhpcy50b2tlbkxpc3QubGVuZ3RoIDogMFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fbGl2ZUFubm91bmNlci5hbm5vdW5jZShtZXNzYWdlKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBNZXRob2Qgd2hpY2ggaGFuZGxlcyB3aGF0IGhhcHBlbnMgdG8gdG9rZW4gd2hlbiBpdCBpcyBjbGlja2VkIGFuZCBubyBrZXkgaXMgYmVpbmcgaGVsZCBkb3duLiovXG4gICAgcHJpdmF0ZSBfYmFzaWNTZWxlY3RlZCh0b2tlbiwgaW5kZXgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50b2tlbkxpc3QuZm9yRWFjaCgoc2hhZG93ZWRUb2tlbikgPT4ge1xuICAgICAgICAgICAgaWYgKHNoYWRvd2VkVG9rZW4gIT09IHRva2VuKSB7XG4gICAgICAgICAgICAgICAgc2hhZG93ZWRUb2tlbi5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fZmlyc3RFbGVtZW50SW5TZWxlY3Rpb24gPSBpbmRleDtcbiAgICAgICAgdGhpcy5fbGFzdEVsZW1lbnRJblNlbGVjdGlvbiA9IGluZGV4O1xuICAgICAgICB0b2tlbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2N0cmxQcmV2aW91cyA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuIFJlc3RhcnQgZmlyc3QgYW5kIGxhc3QgZWxlbWVudHMgZm9yIHNoaWZ0IHNlbGVjdGlvbi4qL1xuICAgIHByaXZhdGUgcmVzZXRGaXJzdEFuZExhc3RFbGVtZW50KCk6IHZvaWQge1xuICAgICAgICBjb25zdCByZXNldCA9ICF0aGlzLnRva2VuTGlzdC5zb21lKCh0b2tlbikgPT4gdG9rZW4uc2VsZWN0ZWQpO1xuICAgICAgICBpZiAocmVzZXQpIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpcnN0RWxlbWVudEluU2VsZWN0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RFbGVtZW50SW5TZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gTWV0aG9kIHdoaWNoIGhhbmRsZXMgd2hhdCBoYXBwZW5zIHRvIHRva2VuIHdoZW4gaXQgaXMgY2xpY2tlZCBhbmQgdGhlIHNoaWZ0IGtleSBpcyBiZWluZyBoZWxkIGRvd24uKi9cbiAgICBwcml2YXRlIF9zaGlmdFNlbGVjdGVkKGluZGV4KTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5fZmlyc3RFbGVtZW50SW5TZWxlY3Rpb24gJiYgIXRoaXMuX2xhc3RFbGVtZW50SW5TZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2ZpcnN0RWxlbWVudEluU2VsZWN0aW9uID0gaW5kZXg7XG4gICAgICAgICAgICB0aGlzLl9sYXN0RWxlbWVudEluU2VsZWN0aW9uID0gaW5kZXg7XG4gICAgICAgICAgICB0aGlzLl9kaXJlY3Rpb25TaGlmdElzUmlnaHQgPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2ZpcnN0RWxlbWVudEluU2VsZWN0aW9uICYmIGluZGV4IDwgdGhpcy5fZmlyc3RFbGVtZW50SW5TZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZGlyZWN0aW9uU2hpZnRJc1JpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RFbGVtZW50SW5TZWxlY3Rpb24gPSB0aGlzLl9maXJzdEVsZW1lbnRJblNlbGVjdGlvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fZGlyZWN0aW9uU2hpZnRJc1JpZ2h0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlyc3RFbGVtZW50SW5TZWxlY3Rpb24gPSBpbmRleDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbGFzdEVsZW1lbnRJblNlbGVjdGlvbiAmJiBpbmRleCA+IHRoaXMuX2xhc3RFbGVtZW50SW5TZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2RpcmVjdGlvblNoaWZ0SXNSaWdodCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9maXJzdEVsZW1lbnRJblNlbGVjdGlvbiA9IHRoaXMuX2xhc3RFbGVtZW50SW5TZWxlY3Rpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2RpcmVjdGlvblNoaWZ0SXNSaWdodCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdEVsZW1lbnRJblNlbGVjdGlvbiA9IGluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLl9kaXJlY3Rpb25TaGlmdElzUmlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9maXJzdEVsZW1lbnRJblNlbGVjdGlvbiA9IGluZGV4O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9kaXJlY3Rpb25TaGlmdElzUmlnaHQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0RWxlbWVudEluU2VsZWN0aW9uID0gaW5kZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRva2VuTGlzdC5mb3JFYWNoKCh0b2tlbiwgaW5kZXhPZlRva2VuKSA9PiB7XG4gICAgICAgICAgICB0b2tlbi5zZWxlY3RlZCA9XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlyc3RFbGVtZW50SW5TZWxlY3Rpb24gIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RFbGVtZW50SW5TZWxlY3Rpb24gIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIGluZGV4T2ZUb2tlbiA+PSB0aGlzLl9maXJzdEVsZW1lbnRJblNlbGVjdGlvbiAmJlxuICAgICAgICAgICAgICAgIGluZGV4T2ZUb2tlbiA8PSB0aGlzLl9sYXN0RWxlbWVudEluU2VsZWN0aW9uO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5fY3RybFByZXZpb3VzID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gTWV0aG9kIHdoaWNoIGhhbmRsZXMgd2hhdCBoYXBwZW5zIHRvIHRva2VuIHdoZW4gaXQgaXMgY2xpY2tlZCBhbmQgdGhlIGNvbnRyb2wgb3IgbWV0YSBrZXkgaXMgYmVpbmcgaGVsZCBkb3duLiovXG4gICAgcHJpdmF0ZSBfY3RybFNlbGVjdGVkKHRva2VuLCBpbmRleCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9maXJzdEVsZW1lbnRJblNlbGVjdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuX2xhc3RFbGVtZW50SW5TZWxlY3Rpb24gPSBudWxsO1xuICAgICAgICBjb25zdCBzZWxlY3RlZCA9IHRva2VuLnNlbGVjdGVkO1xuICAgICAgICB0b2tlbi5zZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIGlmIChzZWxlY3RlZCkge1xuICAgICAgICAgICAgdG9rZW4uc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMudG9rZW5MaXN0LmZvckVhY2goKGVsZW1lbnQsIGluZGV4T2ZUb2tlbikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZmlyc3RFbGVtZW50SW5TZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuc2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpcnN0RWxlbWVudEluU2VsZWN0aW9uID0gaW5kZXhPZlRva2VuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFzdEVsZW1lbnRJblNlbGVjdGlvbiA9IGluZGV4T2ZUb2tlbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gdGhpcy5fbGFzdEVsZW1lbnRJblNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RFbGVtZW50SW5TZWxlY3Rpb24gPSB0aGlzLl9sYXN0RWxlbWVudEluU2VsZWN0aW9uISAtIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IHRoaXMuX2ZpcnN0RWxlbWVudEluU2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZmlyc3RFbGVtZW50SW5TZWxlY3Rpb24gPSB0aGlzLl9maXJzdEVsZW1lbnRJblNlbGVjdGlvbiEgLSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2N0cmxQcmV2aW91cyA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqIEdldCBzZWxlY3RlZCBhbmQgZm9jdXNlZCB0b2tlbnMgKi9cbiAgICBwcml2YXRlIF9nZXRBY3RpdmVUb2tlbnMoKTogVG9rZW5Db21wb25lbnRbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRva2VuTGlzdC5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uc2VsZWN0ZWQgfHwgdGhpcy5faXNUb2tlbkZvY3VzZWQoaXRlbSkpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfZ2V0Rm9jdXNlZFRva2VuSW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudG9rZW5MaXN0LnRvQXJyYXkoKS5maW5kSW5kZXgoKHRva2VuKSA9PiB0aGlzLl9pc1Rva2VuRm9jdXNlZCh0b2tlbikpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgcHJpdmF0ZSBfaXNUb2tlbkZvY3VzZWQodG9rZW46IFRva2VuQ29tcG9uZW50KTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0b2tlbi50b2tlbldyYXBwZXJFbGVtZW50Lm5hdGl2ZUVsZW1lbnQgPT09IHRoaXMuX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9pc0lucHV0Rm9jdXNlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX3Rva2Vuc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50b2tlbkxpc3Quc29tZSgodCkgPT4gdC5zZWxlY3RlZCk7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9nZXRJbnB1dFZhbHVlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBwcml2YXRlIF9mb2N1c0lucHV0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2lzQ29udHJvbEtleShrZXlib2FyZEV2ZW50OiBLZXlib2FyZEV2ZW50IHwgTW91c2VFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4ga2V5Ym9hcmRFdmVudC5jdHJsS2V5IHx8IGtleWJvYXJkRXZlbnQubWV0YUtleTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2xpc3RlbkVsZW1lbnRFdmVudHMoKTogdm9pZCB7XG4gICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgZnJvbUV2ZW50PEV2ZW50Pih0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2ZvY3VzJywgeyBjYXB0dXJlOiB0cnVlIH0pLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKChldmVudCkgPT4gKGV2ZW50Wyd0YXJnZXQnXSBhcyBhbnkpPy50YWdOYW1lID09PSAnSU5QVVQnICYmIHRoaXMudG9rZW5pemVyRm9jdXNhYmxlKSxcbiAgICAgICAgICAgICAgICBtYXAoKCkgPT4gdHJ1ZSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBmcm9tRXZlbnQ8RXZlbnQ+KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnYmx1cicsIHsgY2FwdHVyZTogdHJ1ZSB9KS5waXBlKG1hcCgoKSA9PiBmYWxzZSkpXG4gICAgICAgIClcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIC8vIGRlYm91bmNlVGltZSBpcyBuZWVkZWQgaW4gb3JkZXIgdG8gZmlsdGVyIHN1YnNlcXVlbnQgZm9jdXMtYmx1ciBldmVudHMsIHRoYXQgaGFwcGVuIHNpbXVsdGFuZW91c2x5XG4gICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDEwKSxcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKGZvY3VzZWQpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl90b2tlbml6ZXJIYXNGb2N1cyA9IGZvY3VzZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiBMaXN0ZW4gd2luZG93IHJlc2l6ZSBhbmQgZGlzdHJpYnV0ZSBjYXJkcyBvbiBjb2x1bW4gY2hhbmdlICovXG4gICAgcHJpdmF0ZSBfbGlzdGVuT25SZXNpemUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25SZXNpemUoKTtcbiAgICAgICAgcmVzaXplT2JzZXJ2YWJsZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudClcbiAgICAgICAgICAgIC5waXBlKGRlYm91bmNlVGltZSgzMCksIHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vblJlc2l6ZSgpKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIHByaXZhdGUgX2NoZWNrTW9yZUVsZW1lbnRWaXNpYmlsaXR5KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzaG93TW9yZUVsZW1lbnQgPVxuICAgICAgICAgICAgKHRoaXMubW9yZVRva2Vuc0xlZnQubGVuZ3RoID4gMCB8fCB0aGlzLm1vcmVUb2tlbnNSaWdodC5sZW5ndGggPiAwIHx8IHRoaXMuaGlkZGVuQ296eVRva2VuQ291bnQgPiAwKSAmJlxuICAgICAgICAgICAgIXRoaXMub3BlbiAmJlxuICAgICAgICAgICAgIXRoaXMuX3Rva2VuaXplckhhc0ZvY3VzO1xuXG4gICAgICAgIGlmIChzaG93TW9yZUVsZW1lbnQgPT09IHRoaXMuX3Nob3dNb3JlRWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fc2hvd01vcmVFbGVtZW50ID0gc2hvd01vcmVFbGVtZW50O1xuXG4gICAgICAgIHRoaXMuX2NkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiZmQtdG9rZW5pemVyIGZkLXRva2VuaXplci0tc2Nyb2xsYWJsZVwiIFtjbGFzcy5pcy1mb2N1c109XCJfdG9rZW5pemVySGFzRm9jdXNcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmQtdG9rZW5pemVyX19pbm5lclwiICN0b2tlbml6ZXJJbm5lcj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICAgcm9sZT1cImxpc3Rib3hcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInY29yZVRva2VuaXplci50b2tlbml6ZXJMYWJlbCcgfCBmZFRyYW5zbGF0ZVwiXG4gICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiX3Rva2Vuc0NvbnRhaW5lcldpZHRoXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cInRva2VuTGlzdC5sZW5ndGggPT09IDBcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJmZC10b2tlblwiPjwvbmctY29udGVudD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIl9zaG93T3ZlcmZsb3dQb3BvdmVyICYmICgoX2NvbXBhY3QkIHwgYXN5bmMpIHx8IGNvbXBhY3RDb2xsYXBzZSk7IGVsc2UgbW9yZUVsZW1lbnRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0b2tlbnNPdmVyZmxvd1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbZmQtZm9ybS1jb250cm9sXVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgICA8c3BhbiBmZC1pbnB1dC1ncm91cC1hZGRvbiAqbmdJZj1cImdseXBoXCIgI2lucHV0R3JvdXBBZGRPbiBbYnV0dG9uXT1cInRydWVcIiBwbGFjZW1lbnQ9XCJhZnRlclwiPlxuICAgICAgICA8YnV0dG9uIGZkLWJ1dHRvbiBjbGFzcz1cImZkLXRva2VuaXplci1hZGRvblwiIGZkVHlwZT1cInRyYW5zcGFyZW50XCIgW2dseXBoXT1cImdseXBoXCIgdHlwZT1cImJ1dHRvblwiPjwvYnV0dG9uPlxuICAgIDwvc3Bhbj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI3Rva2Vuc092ZXJmbG93PlxuICAgIDxmZC1wb3BvdmVyIHBsYWNlbWVudD1cImJvdHRvbS1zdGFydFwiIHRpdGxlPVwiXCIgW25vQXJyb3ddPVwiZmFsc2VcIiBbZm9jdXNUcmFwcGVkXT1cInRydWVcIiBbZm9jdXNBdXRvQ2FwdHVyZV09XCJ0cnVlXCI+XG4gICAgICAgIDxmZC1wb3BvdmVyLWNvbnRyb2w+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibW9yZUVsZW1lbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9mZC1wb3BvdmVyLWNvbnRyb2w+XG5cbiAgICAgICAgPGZkLXBvcG92ZXItYm9keT5cbiAgICAgICAgICAgIDx1bCBmZC1saXN0IGNsYXNzPVwiZmQtdG9rZW5pemVyX19vdmVyZmxvdy1saXN0XCI+XG4gICAgICAgICAgICAgICAgPGxpIGZkLWxpc3QtaXRlbSBjbGFzcz1cImZkLXRva2VuaXplcl9fb3ZlcmZsb3ctbGlzdC1pdGVtXCIgKm5nRm9yPVwibGV0IHRva2VuIG9mIF9oaWRkZW5Ub2tlbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAjdmlld0NvbnRhaW5lcj48L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhdG9rZW4ucmVhZE9ubHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmZC10b2tlbl9fY2xvc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInRva2VuLmRlbGV0ZUJ1dHRvbkxhYmVsIHx8ICgnY29yZVRva2VuLmRlbGV0ZUJ1dHRvbkxhYmVsJyB8IGZkVHJhbnNsYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9rZW4uY2xvc2VDbGlja0hhbmRsZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvZmQtcG9wb3Zlci1ib2R5PlxuICAgIDwvZmQtcG9wb3Zlcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbW9yZUVsZW1lbnQ+XG4gICAgPHNwYW5cbiAgICAgICAgKGNsaWNrKT1cIm1vcmVDbGlja2VkKClcIlxuICAgICAgICAqbmdJZj1cIl9zaG93TW9yZUVsZW1lbnQgJiYgX2hpZGRlblRva2Vucy5sZW5ndGggPiAwICYmICFfdG9rZW5pemVySGFzRm9jdXNcIlxuICAgICAgICAjbW9yZUVsZW1lbnRTcGFuXG4gICAgICAgIGNsYXNzPVwiZmQtdG9rZW5pemVyLW1vcmVcIlxuICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKF9jb21wYWN0JCB8IGFzeW5jKSB8fCBjb21wYWN0Q29sbGFwc2VcIj5cbiAgICAgICAgICAgIHt7ICdjb3JlVG9rZW5pemVyLm1vcmVMYWJlbCcgfCBmZFRyYW5zbGF0ZSA6IHsgY291bnQ6IG1vcmVUb2tlbnNMZWZ0Lmxlbmd0aCArIG1vcmVUb2tlbnNSaWdodC5sZW5ndGggfSB9fVxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihfY29tcGFjdCQgfCBhc3luYykgPT09IGZhbHNlICYmICFjb21wYWN0Q29sbGFwc2VcIj5cbiAgICAgICAgICAgIHt7ICdjb3JlVG9rZW5pemVyLm1vcmVMYWJlbCcgfCBmZFRyYW5zbGF0ZSA6IHsgY291bnQ6IGhpZGRlbkNvenlUb2tlbkNvdW50IH0gfX1cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|