fundamental-ngx
Version:
SAP Fiori Fundamentals, implemented in Angular
625 lines • 42.3 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { ApplicationRef, ChangeDetectorRef, ComponentFactoryResolver, Directive, ElementRef, EventEmitter, HostListener, Injector, Input, Output, Renderer2 } from '@angular/core';
import { PopoverContainer } from './popover-container';
import Popper from 'popper.js';
/**
* Directive which manages the popper and popover components of the library.
* It can be attached to any element. To bind it to a body, use the following syntax.
* ```html
* <div [fdPopover]="template">Control Element</div>
* <ng-template #template>
* Popover Body
* </ng-template>
* ```
*/
var PopoverDirective = /** @class */ (function () {
/** @hidden */
function PopoverDirective(elRef, cdRef, resolver, injector, appRef, renderer) {
this.elRef = elRef;
this.cdRef = cdRef;
this.resolver = resolver;
this.injector = injector;
this.appRef = appRef;
this.renderer = renderer;
/**
* \@Input Whether the popover is open. Can be used through two-way binding.
*/
this.isOpen = false;
/**
* \@Input The trigger events that will open/close the popover.
* Accepts any [HTML DOM Events](https://www.w3schools.com/jsref/dom_obj_event.asp).
*/
this.triggers = ['click'];
/**
* \@Input Whether the popover should display the default arrow.
*/
this.defaultArrow = false;
/**
* \@Input Whether the popover should be focusTrapped.
*/
this.focusTrapped = false;
/**
* \@Input Whether the popover should close when the escape key is pressed.
*/
this.closeOnEscapeKey = true;
/**
* \@Input Whether the popover is disabled.
*/
this.disabled = false;
/**
* \@Input Whether the popover should close when a click is made outside its boundaries.
*/
this.closeOnOutsideClick = true;
/**
* \@Input The element to which the popover should be appended.
*/
this.appendTo = 'body';
/**
* \@Input The Popper.js options to attach to this popover.
* See the [Popper.js Documentation](https://popper.js.org/popper-documentation.html) for details.
*/
this.options = {
placement: 'bottom-start',
modifiers: {
preventOverflow: {
enabled: true,
escapeWithReference: true,
boundariesElement: 'scrollParent'
}
}
};
/**
* \@Input Whether the Popover Body should try to have the same width as the Popover Control.
*/
this.fillControl = false;
/**
* \@Output Event emitted when the state of the isOpen property changes.
*/
this.isOpenChange = new EventEmitter();
this.eventRef = [];
this.isSetup = false;
}
/** @hidden */
/**
* @hidden
* @return {?}
*/
PopoverDirective.prototype.ngOnInit = /**
* @hidden
* @return {?}
*/
function () {
if (this.isOpen) {
this.open();
}
this.initFillControl();
this.initPlacement();
this.addTriggerListeners();
this.isSetup = true;
};
/** @hidden */
/**
* @hidden
* @return {?}
*/
PopoverDirective.prototype.ngOnDestroy = /**
* @hidden
* @return {?}
*/
function () {
if (this.popper) {
this.popper.destroy();
}
if (this.containerRef) {
this.destroyContainer();
}
this.destroyTriggerListeners();
};
/** @hidden */
/**
* @hidden
* @param {?} changes
* @return {?}
*/
PopoverDirective.prototype.ngOnChanges = /**
* @hidden
* @param {?} changes
* @return {?}
*/
function (changes) {
var _this = this;
if (!this.isSetup) {
return;
}
if (changes.triggers) {
setTimeout((/**
* @return {?}
*/
function () {
_this.destroyTriggerListeners();
_this.addTriggerListeners();
}));
}
if (changes.isOpen) {
if (changes.isOpen.currentValue) {
setTimeout((/**
* @return {?}
*/
function () {
_this.isOpen = false;
_this.open(false);
}));
}
else {
setTimeout((/**
* @return {?}
*/
function () {
_this.isOpen = true;
_this.close(false);
}));
}
}
if (changes.placement) {
setTimeout((/**
* @return {?}
*/
function () {
_this.initPlacement();
}));
}
if (changes.fillControl) {
setTimeout((/**
* @return {?}
*/
function () {
_this.initFillControl();
}));
}
};
/**
* Toggles the popover open state.
*/
/**
* Toggles the popover open state.
* @param {?=} fireEvent
* @return {?}
*/
PopoverDirective.prototype.toggle = /**
* Toggles the popover open state.
* @param {?=} fireEvent
* @return {?}
*/
function (fireEvent) {
if (fireEvent === void 0) { fireEvent = true; }
if (this.isOpen) {
this.close(fireEvent);
}
else {
this.open(fireEvent);
}
};
/**
* Opens the popover.
*/
/**
* Opens the popover.
* @param {?=} fireEvent
* @return {?}
*/
PopoverDirective.prototype.open = /**
* Opens the popover.
* @param {?=} fireEvent
* @return {?}
*/
function (fireEvent) {
if (fireEvent === void 0) { fireEvent = true; }
if (!this.isOpen && !this.disabled) {
this.createContainer();
this.isOpen = true;
if (fireEvent) {
this.isOpenChange.emit(this.isOpen);
}
}
};
/**
* Closes the popover.
*/
/**
* Closes the popover.
* @param {?=} fireEvent
* @return {?}
*/
PopoverDirective.prototype.close = /**
* Closes the popover.
* @param {?=} fireEvent
* @return {?}
*/
function (fireEvent) {
if (fireEvent === void 0) { fireEvent = true; }
if (this.isOpen) {
this.destroyContainer();
this.isOpen = false;
if (fireEvent) {
this.isOpenChange.emit(this.isOpen);
}
}
};
/**
* Forces an update of the popover's positioning calculation.
*/
/**
* Forces an update of the popover's positioning calculation.
* @return {?}
*/
PopoverDirective.prototype.updatePopper = /**
* Forces an update of the popover's positioning calculation.
* @return {?}
*/
function () {
if (this.popper) {
this.popper.scheduleUpdate();
}
};
/**
* @private
* @return {?}
*/
PopoverDirective.prototype.createContainer = /**
* @private
* @return {?}
*/
function () {
var _this = this;
if (this.containerRef) {
return;
}
/** @type {?} */
var factory = this.resolver.resolveComponentFactory(PopoverContainer);
this.containerRef = factory.create(this.injector);
// Set instance properties
this.containerRef.instance.context = this;
this.containerRef.instance.content = this.content;
this.containerRef.instance.focusTrapped = this.focusTrapped;
this.containerRef.instance.defaultArrow = this.defaultArrow;
this.containerRef.instance.closeOnEscapeKey = this.closeOnEscapeKey;
if (!this.defaultArrow) {
this.containerRef.location.nativeElement.style.margin = 0;
}
this.appRef.attachView(this.containerRef.hostView);
/** @type {?} */
var setupRef = this.containerRef.instance.isSetup.subscribe((/**
* @return {?}
*/
function () {
_this.createPopper();
setupRef.unsubscribe();
}));
/** @type {?} */
var containerEl = (/** @type {?} */ (((/** @type {?} */ (this.containerRef.hostView))).rootNodes[0]));
if (this.appendTo === 'body') {
document.body.appendChild(containerEl);
}
else {
this.appendTo.appendChild(containerEl);
}
};
/**
* @private
* @return {?}
*/
PopoverDirective.prototype.destroyTriggerListeners = /**
* @private
* @return {?}
*/
function () {
if (this.eventRef && this.eventRef.length > 0) {
this.eventRef.forEach((/**
* @param {?} event
* @return {?}
*/
function (event) {
event();
}));
this.eventRef = [];
}
};
/**
* @private
* @return {?}
*/
PopoverDirective.prototype.addTriggerListeners = /**
* @private
* @return {?}
*/
function () {
var _this = this;
if (this.triggers && this.triggers.length > 0) {
this.triggers.forEach((/**
* @param {?} trigger
* @return {?}
*/
function (trigger) {
_this.eventRef.push(_this.renderer.listen(_this.elRef.nativeElement, trigger, (/**
* @return {?}
*/
function () {
_this.toggle();
})));
}));
}
};
/**
* @private
* @return {?}
*/
PopoverDirective.prototype.destroyContainer = /**
* @private
* @return {?}
*/
function () {
if (this.containerRef) {
this.appRef.detachView(this.containerRef.hostView);
this.containerRef.destroy();
this.containerRef = null;
}
if (this.popper) {
this.popper.destroy();
this.popper = null;
}
};
/**
* @private
* @return {?}
*/
PopoverDirective.prototype.createPopper = /**
* @private
* @return {?}
*/
function () {
this.popper = new Popper((/** @type {?} */ (this.elRef.nativeElement)), (/** @type {?} */ (this.containerRef.location.nativeElement)), this.options);
};
/**
* @private
* @param {?} data
* @return {?}
*/
PopoverDirective.prototype.fillReference = /**
* @private
* @param {?} data
* @return {?}
*/
function (data) {
data.offsets.popper.left = data.offsets.reference.left;
data.offsets.popper.right = data.offsets.reference.right;
data.offsets.popper.width = data.styles.width = data.offsets.reference.width;
return data;
};
/**
* @private
* @return {?}
*/
PopoverDirective.prototype.initPlacement = /**
* @private
* @return {?}
*/
function () {
if (this.placement) {
if (this.options) {
this.options.placement = this.placement;
}
else {
this.options = { placement: this.placement };
}
}
};
/**
* @private
* @return {?}
*/
PopoverDirective.prototype.initFillControl = /**
* @private
* @return {?}
*/
function () {
if (this.fillControl) {
if (this.options && this.options.modifiers) {
this.options.modifiers.fillReference = {
enabled: true,
fn: this.fillReference,
order: 840
};
}
else {
this.options = {
modifiers: {
fillReference: {
enabled: true,
fn: this.fillReference,
order: 840
}
}
};
}
}
};
/** @hidden */
/**
* @hidden
* @param {?} event
* @return {?}
*/
PopoverDirective.prototype.clickHandler = /**
* @hidden
* @param {?} event
* @return {?}
*/
function (event) {
if (this.containerRef &&
this.isOpen &&
this.closeOnOutsideClick &&
event.target !== this.elRef.nativeElement &&
!this.elRef.nativeElement.contains(event.target) &&
!this.containerRef.location.nativeElement.contains(event.target)) {
event.preventDefault();
event.stopPropagation();
this.close();
}
};
PopoverDirective.decorators = [
{ type: Directive, args: [{
selector: '[fdPopover]'
},] }
];
/** @nocollapse */
PopoverDirective.ctorParameters = function () { return [
{ type: ElementRef },
{ type: ChangeDetectorRef },
{ type: ComponentFactoryResolver },
{ type: Injector },
{ type: ApplicationRef },
{ type: Renderer2 }
]; };
PopoverDirective.propDecorators = {
content: [{ type: Input, args: ['fdPopover',] }],
isOpen: [{ type: Input }],
triggers: [{ type: Input }],
defaultArrow: [{ type: Input }],
placement: [{ type: Input }],
focusTrapped: [{ type: Input }],
closeOnEscapeKey: [{ type: Input }],
disabled: [{ type: Input }],
closeOnOutsideClick: [{ type: Input }],
appendTo: [{ type: Input }],
options: [{ type: Input }],
fillControl: [{ type: Input }],
isOpenChange: [{ type: Output }],
clickHandler: [{ type: HostListener, args: ['document:click', ['$event'],] }]
};
return PopoverDirective;
}());
export { PopoverDirective };
if (false) {
/**
* \@Input Content of the popover. Used through the actual directive tag. Accepts strings or TemplateRefs.
* @type {?}
*/
PopoverDirective.prototype.content;
/**
* \@Input Whether the popover is open. Can be used through two-way binding.
* @type {?}
*/
PopoverDirective.prototype.isOpen;
/**
* \@Input The trigger events that will open/close the popover.
* Accepts any [HTML DOM Events](https://www.w3schools.com/jsref/dom_obj_event.asp).
* @type {?}
*/
PopoverDirective.prototype.triggers;
/**
* \@Input Whether the popover should display the default arrow.
* @type {?}
*/
PopoverDirective.prototype.defaultArrow;
/**
* \@Input The placement of the popover. It can be one of: top, top-start, top-end, bottom,
* bottom-start, bottom-end, right, right-start, right-end, left, left-start, left-end.
* @type {?}
*/
PopoverDirective.prototype.placement;
/**
* \@Input Whether the popover should be focusTrapped.
* @type {?}
*/
PopoverDirective.prototype.focusTrapped;
/**
* \@Input Whether the popover should close when the escape key is pressed.
* @type {?}
*/
PopoverDirective.prototype.closeOnEscapeKey;
/**
* \@Input Whether the popover is disabled.
* @type {?}
*/
PopoverDirective.prototype.disabled;
/**
* \@Input Whether the popover should close when a click is made outside its boundaries.
* @type {?}
*/
PopoverDirective.prototype.closeOnOutsideClick;
/**
* \@Input The element to which the popover should be appended.
* @type {?}
*/
PopoverDirective.prototype.appendTo;
/**
* \@Input The Popper.js options to attach to this popover.
* See the [Popper.js Documentation](https://popper.js.org/popper-documentation.html) for details.
* @type {?}
*/
PopoverDirective.prototype.options;
/**
* \@Input Whether the Popover Body should try to have the same width as the Popover Control.
* @type {?}
*/
PopoverDirective.prototype.fillControl;
/**
* \@Output Event emitted when the state of the isOpen property changes.
* @type {?}
*/
PopoverDirective.prototype.isOpenChange;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.containerRef;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.popper;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.eventRef;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.isSetup;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.elRef;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.cdRef;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.resolver;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.injector;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.appRef;
/**
* @type {?}
* @private
*/
PopoverDirective.prototype.renderer;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9mdW5kYW1lbnRhbC1uZ3gvIiwic291cmNlcyI6WyJsaWIvcG9wb3Zlci9wb3BvdmVyLWRpcmVjdGl2ZS9wb3BvdmVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUNILGNBQWMsRUFDZCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBRXhCLFNBQVMsRUFDVCxVQUFVLEVBQW1CLFlBQVksRUFBRSxZQUFZLEVBQ3ZELFFBQVEsRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBRSxTQUFTLEVBRW5FLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sTUFBb0MsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7O0FBWTdEO0lBMEVJLGNBQWM7SUFDZCwwQkFBb0IsS0FBaUIsRUFDakIsS0FBd0IsRUFDeEIsUUFBa0MsRUFDbEMsUUFBa0IsRUFDbEIsTUFBc0IsRUFDdEIsUUFBbUI7UUFMbkIsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUNqQixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUN4QixhQUFRLEdBQVIsUUFBUSxDQUEwQjtRQUNsQyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ2xCLFdBQU0sR0FBTixNQUFNLENBQWdCO1FBQ3RCLGFBQVEsR0FBUixRQUFRLENBQVc7Ozs7UUFyRXZDLFdBQU0sR0FBWSxLQUFLLENBQUM7Ozs7O1FBS3hCLGFBQVEsR0FBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDOzs7O1FBSS9CLGlCQUFZLEdBQVksS0FBSyxDQUFDOzs7O1FBUzlCLGlCQUFZLEdBQVksS0FBSyxDQUFDOzs7O1FBSTlCLHFCQUFnQixHQUFZLElBQUksQ0FBQzs7OztRQUlqQyxhQUFRLEdBQVksS0FBSyxDQUFDOzs7O1FBSTFCLHdCQUFtQixHQUFZLElBQUksQ0FBQzs7OztRQUlwQyxhQUFRLEdB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QXdCO2dCQUl4QixRQUFRO2dCQU5SLGNBQWM7Z0JBTXlDLFNBQVM7OzswQkFzQi9ELEtBQUssU0FBQyxXQUFXO3lCQUlqQixLQUFLOzJCQUtMLEtBQUs7K0JBSUwsS0FBSzs0QkFLTCxLQUFLOytCQUlMLEtBQUs7bUNBSUwsS0FBSzsyQkFJTCxLQUFLO3NDQUlMLEtBQUs7MkJBSUwsS0FBSzswQkFLTCxLQUFLOzhCQWFMLEtBQUs7K0JBSUwsTUFBTTsrQkFzUE4sWUFBWSxTQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDOztJQWE5Qyx1QkFBQztDQUFBLEFBclVELElBcVVDO1NBbFVZLGdCQUFnQjs7Ozs7O0lBR3pCLG1DQUNtQzs7Ozs7SUFHbkMsa0NBQ3dCOzs7Ozs7SUFJeEIsb0NBQytCOzs7OztJQUcvQix3Q0FDOEI7Ozs7OztJQUk5QixxQ0FDcUI7Ozs7O0lBR3JCLHdDQUM4Qjs7Ozs7SUFHOUIsNENBQ2lDOzs7OztJQUdqQyxvQ0FDMEI7Ozs7O0lBRzFCLCtDQUNvQzs7Ozs7SUFHcEMsb0NBQ3dDOzs7Ozs7SUFJeEMsbUNBVUU7Ozs7O0lBR0YsdUNBQzZCOzs7OztJQUc3Qix3Q0FDa0U7Ozs7O0lBRWxFLHdDQUFxRDs7Ozs7SUFDckQsa0NBQXVCOzs7OztJQUN2QixvQ0FBa0M7Ozs7O0lBQ2xDLG1DQUFpQzs7Ozs7SUFHckIsaUNBQXlCOzs7OztJQUN6QixpQ0FBZ0M7Ozs7O0lBQ2hDLG9DQUEwQzs7Ozs7SUFDMUMsb0NBQTBCOzs7OztJQUMxQixrQ0FBOEI7Ozs7O0lBQzlCLG9DQUEyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQXBwbGljYXRpb25SZWYsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgIENvbXBvbmVudFJlZixcbiAgICBEaXJlY3RpdmUsXG4gICAgRWxlbWVudFJlZiwgRW1iZWRkZWRWaWV3UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lcixcbiAgICBJbmplY3RvciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgUmVuZGVyZXIyLCBTaW1wbGVDaGFuZ2VzLFxuICAgIFRlbXBsYXRlUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUG9wb3ZlckNvbnRhaW5lciB9IGZyb20gJy4vcG9wb3Zlci1jb250YWluZXInO1xuaW1wb3J0IFBvcHBlciwgeyBQbGFjZW1lbnQsIFBvcHBlck9wdGlvbnMgfSBmcm9tICdwb3BwZXIuanMnO1xuXG4vKipcbiAqIERpcmVjdGl2ZSB3aGljaCBtYW5hZ2VzIHRoZSBwb3BwZXIgYW5kIHBvcG92ZXIgY29tcG9uZW50cyBvZiB0aGUgbGlicmFyeS5cbiAqIEl0IGNhbiBiZSBhdHRhY2hlZCB0byBhbnkgZWxlbWVudC4gVG8gYmluZCBpdCB0byBhIGJvZHksIHVzZSB0aGUgZm9sbG93aW5nIHN5bnRheC5cbiAqIGBgYGh0bWxcbiAqIDxkaXYgW2ZkUG9wb3Zlcl09XCJ0ZW1wbGF0ZVwiPkNvbnRyb2wgRWxlbWVudDwvZGl2PlxuICogPG5nLXRlbXBsYXRlICN0ZW1wbGF0ZT5cbiAqICAgICBQb3BvdmVyIEJvZHlcbiAqIDwvbmctdGVtcGxhdGU+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbZmRQb3BvdmVyXSdcbn0pXG5leHBvcnQgY2xhc3MgUG9wb3ZlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXMge1xuXG4gICAgLyoqIEBJbnB1dCBDb250ZW50IG9mIHRoZSBwb3BvdmVyLiBVc2VkIHRocm91Z2ggdGhlIGFjdHVhbCBkaXJlY3RpdmUgdGFnLiBBY2NlcHRzIHN0cmluZ3Mgb3IgVGVtcGxhdGVSZWZzLiAqL1xuICAgIEBJbnB1dCgnZmRQb3BvdmVyJylcbiAgICBjb250ZW50OiBUZW1wbGF0ZVJlZjxhbnk+IHwgc3RyaW5nO1xuXG4gICAgLyoqIEBJbnB1dCBXaGV0aGVyIHRoZSBwb3BvdmVyIGlzIG9wZW4uIENhbiBiZSB1c2VkIHRocm91Z2ggdHdvLXdheSBiaW5kaW5nLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgaXNPcGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogQElucHV0IFRoZSB0cmlnZ2VyIGV2ZW50cyB0aGF0IHdpbGwgb3Blbi9jbG9zZSB0aGUgcG9wb3Zlci5cbiAgICAgKiAgQWNjZXB0cyBhbnkgW0hUTUwgRE9NIEV2ZW50c10oaHR0cHM6Ly93d3cudzNzY2hvb2xzLmNvbS9qc3JlZi9kb21fb2JqX2V2ZW50LmFzcCkuICovXG4gICAgQElucHV0KClcbiAgICB0cmlnZ2Vyczogc3RyaW5nW10gPSBbJ2NsaWNrJ107XG5cbiAgICAvKiogQElucHV0IFdoZXRoZXIgdGhlIHBvcG92ZXIgc2hvdWxkIGRpc3BsYXkgdGhlIGRlZmF1bHQgYXJyb3cuICovXG4gICAgQElucHV0KClcbiAgICBkZWZhdWx0QXJyb3c6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBASW5wdXQgVGhlIHBsYWNlbWVudCBvZiB0aGUgcG9wb3Zlci4gSXQgY2FuIGJlIG9uZSBvZjogdG9wLCB0b3Atc3RhcnQsIHRvcC1lbmQsIGJvdHRvbSxcbiAgICAgKiAgYm90dG9tLXN0YXJ0LCBib3R0b20tZW5kLCByaWdodCwgcmlnaHQtc3RhcnQsIHJpZ2h0LWVuZCwgbGVmdCwgbGVmdC1zdGFydCwgbGVmdC1lbmQuICovXG4gICAgQElucHV0KClcbiAgICBwbGFjZW1lbnQ6IFBsYWNlbWVudDtcblxuICAgIC8qKiBASW5wdXQgV2hldGhlciB0aGUgcG9wb3ZlciBzaG91bGQgYmUgZm9jdXNUcmFwcGVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZm9jdXNUcmFwcGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogQElucHV0IFdoZXRoZXIgdGhlIHBvcG92ZXIgc2hvdWxkIGNsb3NlIHdoZW4gdGhlIGVzY2FwZSBrZXkgaXMgcHJlc3NlZC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGNsb3NlT25Fc2NhcGVLZXk6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIEBJbnB1dCBXaGV0aGVyIHRoZSBwb3BvdmVyIGlzIGRpc2FibGVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKiBASW5wdXQgV2hldGhlciB0aGUgcG9wb3ZlciBzaG91bGQgY2xvc2Ugd2hlbiBhIGNsaWNrIGlzIG1hZGUgb3V0c2lkZSBpdHMgYm91bmRhcmllcy4gKi9cbiAgICBASW5wdXQoKVxuICAgIGNsb3NlT25PdXRzaWRlQ2xpY2s6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgLyoqIEBJbnB1dCBUaGUgZWxlbWVudCB0byB3aGljaCB0aGUgcG9wb3ZlciBzaG91bGQgYmUgYXBwZW5kZWQuICovXG4gICAgQElucHV0KClcbiAgICBhcHBlbmRUbzogSFRNTEVsZW1lbnQgfCAnYm9keScgPSAnYm9keSc7XG5cbiAgICAvKiogQElucHV0IFRoZSBQb3BwZXIuanMgb3B0aW9ucyB0byBhdHRhY2ggdG8gdGhpcyBwb3BvdmVyLlxuICAgICAqIFNlZSB0aGUgW1BvcHBlci5qcyBEb2N1bWVudGF0aW9uXShodHRwczovL3BvcHBlci5qcy5vcmcvcG9wcGVyLWRvY3VtZW50YXRpb24uaHRtbCkgZm9yIGRldGFpbHMuICovXG4gICAgQElucHV0KClcbiAgICBvcHRpb25zOiBQb3BwZXJPcHRpb25zID0ge1xuICAgICAgICBwbGFjZW1lbnQ6ICdib3R0b20tc3RhcnQnLFxuICAgICAgICBtb2RpZmllcnM6IHtcbiAgICAgICAgICAgIHByZXZlbnRPdmVyZmxvdzoge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZXNjYXBlV2l0aFJlZmVyZW5jZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBib3VuZGFyaWVzRWxlbWVudDogJ3Njcm9sbFBhcmVudCdcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvKiogQElucHV0IFdoZXRoZXIgdGhlIFBvcG92ZXIgQm9keSBzaG91bGQgdHJ5IHRvIGhhdmUgdGhlIHNhbWUgd2lkdGggYXMgdGhlIFBvcG92ZXIgQ29udHJvbC4gKi9cbiAgICBASW5wdXQoKVxuICAgIGZpbGxDb250cm9sOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogQE91dHB1dCBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHN0YXRlIG9mIHRoZSBpc09wZW4gcHJvcGVydHkgY2hhbmdlcy4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBpc09wZW5DaGFuZ2U6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAgIHByaXZhdGUgY29udGFpbmVyUmVmOiBDb21wb25lbnRSZWY8UG9wb3ZlckNvbnRhaW5lcj47XG4gICAgcHJpdmF0ZSBwb3BwZXI6IFBvcHBlcjtcbiAgICBwcml2YXRlIGV2ZW50UmVmOiBGdW5jdGlvbltdID0gW107XG4gICAgcHJpdmF0ZSBpc1NldHVwOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBjZFJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByZXNvbHZlcjogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgYXBwUmVmOiBBcHBsaWNhdGlvblJlZixcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5pbml0RmlsbENvbnRyb2woKTtcbiAgICAgICAgdGhpcy5pbml0UGxhY2VtZW50KCk7XG5cbiAgICAgICAgdGhpcy5hZGRUcmlnZ2VyTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMuaXNTZXR1cCA9IHRydWU7XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucG9wcGVyKSB7XG4gICAgICAgICAgICB0aGlzLnBvcHBlci5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb250YWluZXJSZWYpIHtcbiAgICAgICAgICAgIHRoaXMuZGVzdHJveUNvbnRhaW5lcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5kZXN0cm95VHJpZ2dlckxpc3RlbmVycygpO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuaXNTZXR1cCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMudHJpZ2dlcnMpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveVRyaWdnZXJMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZFRyaWdnZXJMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMuaXNPcGVuKSB7XG4gICAgICAgICAgICBpZiAoY2hhbmdlcy5pc09wZW4uY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbihmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRQbGFjZW1lbnQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoYW5nZXMuZmlsbENvbnRyb2wpIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdEZpbGxDb250cm9sKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRvZ2dsZXMgdGhlIHBvcG92ZXIgb3BlbiBzdGF0ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgdG9nZ2xlKGZpcmVFdmVudDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKGZpcmVFdmVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oZmlyZUV2ZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE9wZW5zIHRoZSBwb3BvdmVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBvcGVuKGZpcmVFdmVudDogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzT3BlbiAmJiAhdGhpcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVDb250YWluZXIoKTtcbiAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKGZpcmVFdmVudCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuQ2hhbmdlLmVtaXQodGhpcy5pc09wZW4pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2xvc2VzIHRoZSBwb3BvdmVyLlxuICAgICAqL1xuICAgIHB1YmxpYyBjbG9zZShmaXJlRXZlbnQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95Q29udGFpbmVyKCk7XG4gICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICBpZiAoZmlyZUV2ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW5DaGFuZ2UuZW1pdCh0aGlzLmlzT3Blbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGb3JjZXMgYW4gdXBkYXRlIG9mIHRoZSBwb3BvdmVyJ3MgcG9zaXRpb25pbmcgY2FsY3VsYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHVwZGF0ZVBvcHBlcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucG9wcGVyKSB7XG4gICAgICAgICAgICB0aGlzLnBvcHBlci5zY2hlZHVsZVVwZGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVDb250YWluZXIoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lclJlZikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5yZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShQb3BvdmVyQ29udGFpbmVyKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJSZWYgPSBmYWN0b3J5LmNyZWF0ZSh0aGlzLmluamVjdG9yKTtcblxuICAgICAgICAvLyBTZXQgaW5zdGFuY2UgcHJvcGVydGllc1xuICAgICAgICB0aGlzLmNvbnRhaW5lclJlZi5pbnN0YW5jZS5jb250ZXh0ID0gdGhpcztcbiAgICAgICAgdGhpcy5jb250YWluZXJSZWYuaW5zdGFuY2UuY29udGVudCA9IHRoaXMuY29udGVudDtcbiAgICAgICAgdGhpcy5jb250YWluZXJSZWYuaW5zdGFuY2UuZm9jdXNUcmFwcGVkID0gdGhpcy5mb2N1c1RyYXBwZWQ7XG4gICAgICAgIHRoaXMuY29udGFpbmVyUmVmLmluc3RhbmNlLmRlZmF1bHRBcnJvdyA9IHRoaXMuZGVmYXVsdEFycm93O1xuICAgICAgICB0aGlzLmNvbnRhaW5lclJlZi5pbnN0YW5jZS5jbG9zZU9uRXNjYXBlS2V5ID0gdGhpcy5jbG9zZU9uRXNjYXBlS2V5O1xuXG4gICAgICAgIGlmICghdGhpcy5kZWZhdWx0QXJyb3cpIHtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuc3R5bGUubWFyZ2luID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcodGhpcy5jb250YWluZXJSZWYuaG9zdFZpZXcpO1xuICAgICAgICBjb25zdCBzZXR1cFJlZiA9IHRoaXMuY29udGFpbmVyUmVmLmluc3RhbmNlLmlzU2V0dXAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY3JlYXRlUG9wcGVyKCk7XG4gICAgICAgICAgICBzZXR1cFJlZi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjb250YWluZXJFbCA9ICh0aGlzLmNvbnRhaW5lclJlZi5ob3N0VmlldyBhcyBFbWJlZGRlZFZpZXdSZWY8YW55Pikucm9vdE5vZGVzWzBdIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIGlmICh0aGlzLmFwcGVuZFRvID09PSAnYm9keScpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyRWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hcHBlbmRUby5hcHBlbmRDaGlsZChjb250YWluZXJFbCk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveVRyaWdnZXJMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmV2ZW50UmVmICYmIHRoaXMuZXZlbnRSZWYubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5ldmVudFJlZi5mb3JFYWNoKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICBldmVudCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLmV2ZW50UmVmID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZFRyaWdnZXJMaXN0ZW5lcnMoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnRyaWdnZXJzICYmIHRoaXMudHJpZ2dlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2Vycy5mb3JFYWNoKHRyaWdnZXIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRSZWYucHVzaCh0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQsIHRyaWdnZXIsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZGVzdHJveUNvbnRhaW5lcigpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyUmVmKSB7XG4gICAgICAgICAgICB0aGlzLmFwcFJlZi5kZXRhY2hWaWV3KHRoaXMuY29udGFpbmVyUmVmLmhvc3RWaWV3KTtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyUmVmLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyUmVmID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnBvcHBlcikge1xuICAgICAgICAgICAgdGhpcy5wb3BwZXIuZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5wb3BwZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVQb3BwZXIoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucG9wcGVyID0gbmV3IFBvcHBlcihcbiAgICAgICAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCxcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbGxSZWZlcmVuY2UoZGF0YSk6IGFueSB7XG4gICAgICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIubGVmdCA9IGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UubGVmdDtcbiAgICAgICAgZGF0YS5vZmZzZXRzLnBvcHBlci5yaWdodCA9IGRhdGEub2Zmc2V0cy5yZWZlcmVuY2UucmlnaHQ7XG4gICAgICAgIGRhdGEub2Zmc2V0cy5wb3BwZXIud2lkdGggPSBkYXRhLnN0eWxlcy53aWR0aCA9IGRhdGEub2Zmc2V0cy5yZWZlcmVuY2Uud2lkdGg7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdFBsYWNlbWVudCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBsYWNlbWVudCA9IHRoaXMucGxhY2VtZW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB7cGxhY2VtZW50OiB0aGlzLnBsYWNlbWVudH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdEZpbGxDb250cm9sKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5maWxsQ29udHJvbCkge1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMubW9kaWZpZXJzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1vZGlmaWVycy5maWxsUmVmZXJlbmNlID0ge1xuICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBmbjogdGhpcy5maWxsUmVmZXJlbmNlLFxuICAgICAgICAgICAgICAgICAgICBvcmRlcjogODQwXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbFJlZmVyZW5jZToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm46IHRoaXMuZmlsbFJlZmVyZW5jZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmRlcjogODQwXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gICAgY2xpY2tIYW5kbGVyKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lclJlZiAmJlxuICAgICAgICAgICAgdGhpcy5pc09wZW4gJiZcbiAgICAgICAgICAgIHRoaXMuY2xvc2VPbk91dHNpZGVDbGljayAmJlxuICAgICAgICAgICAgZXZlbnQudGFyZ2V0ICE9PSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQgJiZcbiAgICAgICAgICAgICF0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSAmJlxuICAgICAgICAgICAgIXRoaXMuY29udGFpbmVyUmVmLmxvY2F0aW9uLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19