ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
578 lines • 43.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: modal-container.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { __assign, __extends } from "tslib";
/**
* @license
* Copyright Alibaba.com All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { BasePortalOutlet } from '@angular/cdk/portal';
import { EventEmitter } from '@angular/core';
import { getElementOffset } from 'ng-zorro-antd/core/util';
/**
* @return {?}
*/
export function throwNzModalContentAlreadyAttachedError() {
throw Error('Attempting to attach modal content after content is already attached');
}
/** @type {?} */
var ZOOM_CLASS_NAME_MAP = {
enter: 'zoom-enter',
enterActive: 'zoom-enter-active',
leave: 'zoom-leave',
leaveActive: 'zoom-leave-active'
};
/** @type {?} */
var FADE_CLASS_NAME_MAP = {
enter: 'fade-enter',
enterActive: 'fade-enter-active',
leave: 'fade-leave',
leaveActive: 'fade-leave-active'
};
var BaseModalContainer = /** @class */ (function (_super) {
__extends(BaseModalContainer, _super);
function BaseModalContainer(elementRef, focusTrapFactory, cdr, render, zone, overlayRef, config, document, animationType) {
var _this = _super.call(this) || this;
_this.elementRef = elementRef;
_this.focusTrapFactory = focusTrapFactory;
_this.cdr = cdr;
_this.render = render;
_this.zone = zone;
_this.overlayRef = overlayRef;
_this.config = config;
_this.animationType = animationType;
_this.animationStateChanged = new EventEmitter();
_this.containerClick = new EventEmitter();
_this.cancelTriggered = new EventEmitter();
_this.okTriggered = new EventEmitter();
_this.state = 'enter';
_this.isStringContent = false;
_this.elementFocusedBeforeModalWasOpened = null;
_this.latestMousedownTarget = null;
_this.oldMaskStyle = null;
_this.document = document;
_this.isStringContent = typeof config.nzContent === 'string';
_this.setContainer();
return _this;
}
/**
* @param {?} e
* @return {?}
*/
BaseModalContainer.prototype.onMousedown = /**
* @param {?} e
* @return {?}
*/
function (e) {
this.latestMousedownTarget = ((/** @type {?} */ (e.target))) || null;
};
/**
* @param {?} e
* @return {?}
*/
BaseModalContainer.prototype.onMouseup = /**
* @param {?} e
* @return {?}
*/
function (e) {
if (e.target === this.latestMousedownTarget && e.target === this.elementRef.nativeElement) {
this.containerClick.emit();
}
this.latestMousedownTarget = null;
};
/**
* @return {?}
*/
BaseModalContainer.prototype.onCloseClick = /**
* @return {?}
*/
function () {
this.cancelTriggered.emit();
};
/**
* @return {?}
*/
BaseModalContainer.prototype.onOkClick = /**
* @return {?}
*/
function () {
this.okTriggered.emit();
};
/**
* @template T
* @param {?} portal
* @return {?}
*/
BaseModalContainer.prototype.attachComponentPortal = /**
* @template T
* @param {?} portal
* @return {?}
*/
function (portal) {
if (this.portalOutlet.hasAttached()) {
throwNzModalContentAlreadyAttachedError();
}
this.savePreviouslyFocusedElement();
this.setModalTransformOrigin();
return this.portalOutlet.attachComponentPortal(portal);
};
/**
* @template C
* @param {?} portal
* @return {?}
*/
BaseModalContainer.prototype.attachTemplatePortal = /**
* @template C
* @param {?} portal
* @return {?}
*/
function (portal) {
if (this.portalOutlet.hasAttached()) {
throwNzModalContentAlreadyAttachedError();
}
this.savePreviouslyFocusedElement();
return this.portalOutlet.attachTemplatePortal(portal);
};
/**
* @return {?}
*/
BaseModalContainer.prototype.getNativeElement = /**
* @return {?}
*/
function () {
return this.elementRef.nativeElement;
};
/**
* @private
* @return {?}
*/
BaseModalContainer.prototype.animationDisabled = /**
* @private
* @return {?}
*/
function () {
return this.config.nzNoAnimation || this.animationType === 'NoopAnimations';
};
/**
* @private
* @return {?}
*/
BaseModalContainer.prototype.setModalTransformOrigin = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var modalElement = this.modalElementRef.nativeElement;
if ((/** @type {?} */ (this.elementFocusedBeforeModalWasOpened))) {
/** @type {?} */
var previouslyDOMRect = (/** @type {?} */ (this.elementFocusedBeforeModalWasOpened)).getBoundingClientRect();
/** @type {?} */
var lastPosition = getElementOffset((/** @type {?} */ (this.elementFocusedBeforeModalWasOpened)));
/** @type {?} */
var x = lastPosition.left + previouslyDOMRect.width / 2;
/** @type {?} */
var y = lastPosition.top + previouslyDOMRect.height / 2;
/** @type {?} */
var transformOrigin = x - modalElement.offsetLeft + "px " + (y - modalElement.offsetTop) + "px 0px";
this.render.setStyle(modalElement, 'transform-origin', transformOrigin);
}
};
/**
* @private
* @return {?}
*/
BaseModalContainer.prototype.savePreviouslyFocusedElement = /**
* @private
* @return {?}
*/
function () {
var _this = this;
if (this.document) {
this.elementFocusedBeforeModalWasOpened = (/** @type {?} */ (this.document.activeElement));
if (this.elementRef.nativeElement.focus) {
Promise.resolve().then((/**
* @return {?}
*/
function () { return _this.elementRef.nativeElement.focus(); }));
}
}
};
/**
* @private
* @return {?}
*/
BaseModalContainer.prototype.trapFocus = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var element = this.elementRef.nativeElement;
if (!this.focusTrap) {
this.focusTrap = this.focusTrapFactory.create(element);
}
if (this.config.nzAutofocus) {
this.focusTrap.focusInitialElementWhenReady().then();
}
else {
/** @type {?} */
var activeElement = this.document.activeElement;
if (activeElement !== element && !element.contains(activeElement)) {
element.focus();
}
}
};
/**
* @private
* @return {?}
*/
BaseModalContainer.prototype.restoreFocus = /**
* @private
* @return {?}
*/
function () {
/** @type {?} */
var toFocus = (/** @type {?} */ (this.elementFocusedBeforeModalWasOpened));
// We need the extra check, because IE can set the `activeElement` to null in some cases.
if (toFocus && typeof toFocus.focus === 'function') {
/** @type {?} */
var activeElement = (/** @type {?} */ (this.document.activeElement));
/** @type {?} */
var element = this.elementRef.nativeElement;
if (!activeElement || activeElement === this.document.body || activeElement === element || element.contains(activeElement)) {
toFocus.focus();
}
}
if (this.focusTrap) {
this.focusTrap.destroy();
}
};
/**
* @private
* @return {?}
*/
BaseModalContainer.prototype.setEnterAnimationClass = /**
* @private
* @return {?}
*/
function () {
var _this = this;
if (this.animationDisabled()) {
return;
}
this.zone.runOutsideAngular((/**
* @return {?}
*/
function () {
// Make sure to set the `TransformOrigin` style before set the modelElement's class names
_this.setModalTransformOrigin();
/** @type {?} */
var modalElement = _this.modalElementRef.nativeElement;
/** @type {?} */
var backdropElement = _this.overlayRef.backdropElement;
_this.render.addClass(modalElement, ZOOM_CLASS_NAME_MAP.enter);
_this.render.addClass(modalElement, ZOOM_CLASS_NAME_MAP.enterActive);
_this.render.addClass(backdropElement, FADE_CLASS_NAME_MAP.enter);
_this.render.addClass(backdropElement, FADE_CLASS_NAME_MAP.enterActive);
}));
};
/**
* @private
* @return {?}
*/
BaseModalContainer.prototype.setExitAnimationClass = /**
* @private
* @return {?}
*/
function () {
var _this = this;
if (this.animationDisabled()) {
return;
}
this.zone.runOutsideAngular((/**
* @return {?}
*/
function () {
/** @type {?} */
var modalElement = _this.modalElementRef.nativeElement;
/** @type {?} */
var backdropElement = _this.overlayRef.backdropElement;
_this.render.addClass(modalElement, ZOOM_CLASS_NAME_MAP.leave);
_this.render.addClass(modalElement, ZOOM_CLASS_NAME_MAP.leaveActive);
_this.render.addClass(backdropElement, FADE_CLASS_NAME_MAP.leave);
_this.render.addClass(backdropElement, FADE_CLASS_NAME_MAP.leaveActive);
}));
};
/**
* @private
* @return {?}
*/
BaseModalContainer.prototype.cleanAnimationClass = /**
* @private
* @return {?}
*/
function () {
var _this = this;
if (this.animationDisabled()) {
return;
}
this.zone.runOutsideAngular((/**
* @return {?}
*/
function () {
/** @type {?} */
var backdropElement = _this.overlayRef.backdropElement;
/** @type {?} */
var modalElement = _this.modalElementRef.nativeElement;
_this.render.removeClass(modalElement, ZOOM_CLASS_NAME_MAP.enter);
_this.render.removeClass(modalElement, ZOOM_CLASS_NAME_MAP.enterActive);
_this.render.removeClass(modalElement, ZOOM_CLASS_NAME_MAP.leave);
_this.render.removeClass(modalElement, ZOOM_CLASS_NAME_MAP.leaveActive);
_this.render.removeClass(backdropElement, FADE_CLASS_NAME_MAP.enter);
_this.render.removeClass(backdropElement, FADE_CLASS_NAME_MAP.enterActive);
}));
};
/**
* @private
* @return {?}
*/
BaseModalContainer.prototype.bindBackdropStyle = /**
* @private
* @return {?}
*/
function () {
var _this = this;
this.zone.runOutsideAngular((/**
* @return {?}
*/
function () {
if (_this.oldMaskStyle) {
/** @type {?} */
var backdropElement_1 = _this.overlayRef.backdropElement;
/** @type {?} */
var styles = (/** @type {?} */ (_this.oldMaskStyle));
Object.keys(styles).forEach((/**
* @param {?} key
* @return {?}
*/
function (key) {
_this.render.removeStyle(backdropElement_1, key);
}));
_this.oldMaskStyle = null;
}
if (typeof _this.config.nzMaskStyle === 'object' && Object.keys(_this.config.nzMaskStyle).length) {
/** @type {?} */
var backdropElement_2 = _this.overlayRef.backdropElement;
/** @type {?} */
var styles_1 = __assign({}, _this.config.nzMaskStyle);
Object.keys(styles_1).forEach((/**
* @param {?} key
* @return {?}
*/
function (key) {
_this.render.setStyle(backdropElement_2, key, styles_1[key]);
}));
_this.oldMaskStyle = styles_1;
}
}));
};
/**
* Set the container element.
* @deprecated Not supported.
* @breaking-change 10.0.0
*/
/**
* Set the container element.
* @deprecated Not supported.
* \@breaking-change 10.0.0
* @private
* @return {?}
*/
BaseModalContainer.prototype.setContainer = /**
* Set the container element.
* @deprecated Not supported.
* \@breaking-change 10.0.0
* @private
* @return {?}
*/
function () {
/** @type {?} */
var container = this.getContainer();
if (container) {
this.render.appendChild(container, this.elementRef.nativeElement);
}
};
/**
* Reset the container element.
* @deprecated Not supported.
* @breaking-change 10.0.0
*/
/**
* Reset the container element.
* @deprecated Not supported.
* \@breaking-change 10.0.0
* @private
* @return {?}
*/
BaseModalContainer.prototype.resetContainer = /**
* Reset the container element.
* @deprecated Not supported.
* \@breaking-change 10.0.0
* @private
* @return {?}
*/
function () {
/** @type {?} */
var container = this.getContainer();
if (container) {
this.render.appendChild(this.overlayRef.overlayElement, this.elementRef.nativeElement);
}
};
/**
* @private
* @return {?}
*/
BaseModalContainer.prototype.getContainer = /**
* @private
* @return {?}
*/
function () {
var nzGetContainer = this.config.nzGetContainer;
/** @type {?} */
var container = typeof nzGetContainer === 'function' ? nzGetContainer() : nzGetContainer;
return container instanceof HTMLElement ? container : null;
};
/**
* @param {?} event
* @return {?}
*/
BaseModalContainer.prototype.onAnimationDone = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.toState === 'enter') {
this.setContainer();
this.trapFocus();
}
else if (event.toState === 'exit') {
this.restoreFocus();
}
this.cleanAnimationClass();
this.animationStateChanged.emit(event);
};
/**
* @param {?} event
* @return {?}
*/
BaseModalContainer.prototype.onAnimationStart = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.toState === 'enter') {
this.setEnterAnimationClass();
this.bindBackdropStyle();
}
else if (event.toState === 'exit') {
this.resetContainer();
this.setExitAnimationClass();
}
this.animationStateChanged.emit(event);
};
/**
* @return {?}
*/
BaseModalContainer.prototype.startExitAnimation = /**
* @return {?}
*/
function () {
this.state = 'exit';
this.cdr.markForCheck();
};
return BaseModalContainer;
}(BasePortalOutlet));
export { BaseModalContainer };
if (false) {
/** @type {?} */
BaseModalContainer.prototype.portalOutlet;
/** @type {?} */
BaseModalContainer.prototype.modalElementRef;
/** @type {?} */
BaseModalContainer.prototype.animationStateChanged;
/** @type {?} */
BaseModalContainer.prototype.containerClick;
/** @type {?} */
BaseModalContainer.prototype.cancelTriggered;
/** @type {?} */
BaseModalContainer.prototype.okTriggered;
/** @type {?} */
BaseModalContainer.prototype.state;
/** @type {?} */
BaseModalContainer.prototype.document;
/** @type {?} */
BaseModalContainer.prototype.modalRef;
/** @type {?} */
BaseModalContainer.prototype.isStringContent;
/**
* @type {?}
* @private
*/
BaseModalContainer.prototype.elementFocusedBeforeModalWasOpened;
/**
* @type {?}
* @private
*/
BaseModalContainer.prototype.focusTrap;
/**
* @type {?}
* @private
*/
BaseModalContainer.prototype.latestMousedownTarget;
/**
* @type {?}
* @private
*/
BaseModalContainer.prototype.oldMaskStyle;
/**
* @type {?}
* @protected
*/
BaseModalContainer.prototype.elementRef;
/**
* @type {?}
* @protected
*/
BaseModalContainer.prototype.focusTrapFactory;
/** @type {?} */
BaseModalContainer.prototype.cdr;
/**
* @type {?}
* @protected
*/
BaseModalContainer.prototype.render;
/**
* @type {?}
* @protected
*/
BaseModalContainer.prototype.zone;
/**
* @type {?}
* @protected
*/
BaseModalContainer.prototype.overlayRef;
/** @type {?} */
BaseModalContainer.prototype.config;
/**
* @type {?}
* @protected
*/
BaseModalContainer.prototype.animationType;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC9tb2RhbC8iLCJzb3VyY2VzIjpbIm1vZGFsLWNvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBV0EsT0FBTyxFQUFFLGdCQUFnQixFQUFvRCxNQUFNLHFCQUFxQixDQUFDO0FBQ3pHLE9BQU8sRUFBZ0UsWUFBWSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUU5SCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7OztBQUszRCxNQUFNLFVBQVUsdUNBQXVDO0lBQ3JELE1BQU0sS0FBSyxDQUFDLHNFQUFzRSxDQUFDLENBQUM7QUFDdEYsQ0FBQzs7SUFFSyxtQkFBbUIsR0FBRztJQUMxQixLQUFLLEVBQUUsWUFBWTtJQUNuQixXQUFXLEVBQUUsbUJBQW1CO0lBQ2hDLEtBQUssRUFBRSxZQUFZO0lBQ25CLFdBQVcsRUFBRSxtQkFBbUI7Q0FDakM7O0lBRUssbUJBQW1CLEdBQUc7SUFDMUIsS0FBSyxFQUFFLFlBQVk7SUFDbkIsV0FBVyxFQUFFLG1CQUFtQjtJQUNoQyxLQUFLLEVBQUUsWUFBWTtJQUNuQixXQUFXLEVBQUUsbUJBQW1CO0NBQ2pDO0FBRUQ7SUFBd0Msc0NBQWdCO0lBa0J0RCw0QkFDWSxVQUFzQixFQUN0QixnQkFBa0MsRUFDckMsR0FBc0IsRUFDbkIsTUFBaUIsRUFDakIsSUFBWSxFQUNaLFVBQXNCLEVBQ3pCLE1BQW9CLEVBQzNCLFFBQW9CLEVBQ1YsYUFBc0I7UUFUbEMsWUFXRSxpQkFBTyxTQUlSO1FBZFcsZ0JBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsc0JBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNyQyxTQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUNuQixZQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2pCLFVBQUksR0FBSixJQUFJLENBQVE7UUFDWixnQkFBVSxHQUFWLFVBQVUsQ0FBWTtR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RTtZQUNuQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7U0FDOUI7UUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7Ozs7SUFFRCwrQ0FBa0I7OztJQUFsQjtRQUNFLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUNILHlCQUFDO0FBQUQsQ0FBQyxBQW5RRCxDQUF3QyxnQkFBZ0IsR0FtUXZEOzs7O0lBbFFDLDBDQUE4Qjs7SUFDOUIsNkNBQTRDOztJQUU1QyxtREFBMkQ7O0lBQzNELDRDQUEwQzs7SUFDMUMsNkNBQTJDOztJQUMzQyx5Q0FBdUM7O0lBRXZDLG1DQUEyQzs7SUFDM0Msc0NBQW1COztJQUNuQixzQ0FBcUI7O0lBQ3JCLDZDQUFpQzs7Ozs7SUFDakMsZ0VBQXNFOzs7OztJQUN0RSx1Q0FBNkI7Ozs7O0lBQzdCLG1EQUF5RDs7Ozs7SUFDekQsMENBQThEOzs7OztJQUc1RCx3Q0FBZ0M7Ozs7O0lBQ2hDLDhDQUE0Qzs7SUFDNUMsaUNBQTZCOzs7OztJQUM3QixvQ0FBMkI7Ozs7O0lBQzNCLGtDQUFzQjs7Ozs7SUFDdEIsd0NBQWdDOztJQUNoQyxvQ0FBMkI7Ozs7O0lBRTNCLDJDQUFnQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBBbmltYXRpb25FdmVudCB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgRm9jdXNUcmFwLCBGb2N1c1RyYXBGYWN0b3J5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2ExMXknO1xuaW1wb3J0IHsgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IEJhc2VQb3J0YWxPdXRsZXQsIENka1BvcnRhbE91dGxldCwgQ29tcG9uZW50UG9ydGFsLCBUZW1wbGF0ZVBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudFJlZiwgRWxlbWVudFJlZiwgRW1iZWRkZWRWaWV3UmVmLCBFdmVudEVtaXR0ZXIsIE5nWm9uZSwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgZ2V0RWxlbWVudE9mZnNldCB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS91dGlsJztcblxuaW1wb3J0IHsgTnpNb2RhbFJlZiB9IGZyb20gJy4vbW9kYWwtcmVmJztcbmltcG9ydCB7IE1vZGFsT3B0aW9ucyB9IGZyb20gJy4vbW9kYWwtdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gdGhyb3dOek1vZGFsQ29udGVudEFscmVhZHlBdHRhY2hlZEVycm9yKCk6IG5ldmVyIHtcbiAgdGhyb3cgRXJyb3IoJ0F0dGVtcHRpbmcgdG8gYXR0YWNoIG1vZGFsIGNvbnRlbnQgYWZ0ZXIgY29udGVudCBpcyBhbHJlYWR5IGF0dGFjaGVkJyk7XG59XG5cbmNvbnN0IFpPT01fQ0xBU1NfTkFNRV9NQVAgPSB7XG4gIGVudGVyOiAnem9vbS1lbnRlcicsXG4gIGVudGVyQWN0aXZlOiAnem9vbS1lbnRlci1hY3RpdmUnLFxuICBsZWF2ZTogJ3pvb20tbGVhdmUnLFxuICBsZWF2ZUFjdGl2ZTogJ3pvb20tbGVhdmUtYWN0aXZlJ1xufTtcblxuY29uc3QgRkFERV9DTEFTU19OQU1FX01BUCA9IHtcbiAgZW50ZXI6ICdmYWRlLWVudGVyJyxcbiAgZW50ZXJBY3RpdmU6ICdmYWRlLWVudGVyLWFjdGl2ZScsXG4gIGxlYXZlOiAnZmFkZS1sZWF2ZScsXG4gIGxlYXZlQWN0aXZlOiAnZmFkZS1sZWF2ZS1hY3RpdmUnXG59O1xuXG5leHBvcnQgY2xhc3MgQmFzZU1vZGFsQ29udGFpbmVyIGV4dGVuZHMgQmFzZVBvcnRhbE91dGxldCB7XG4gIHBvcnRhbE91dGxldDogQ2RrUG9ydGFsT3V0bGV0O1xuICBtb2RhbEVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIGFuaW1hdGlvblN0YXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8QW5pbWF0aW9uRXZlbnQ+KCk7XG4gIGNvbnRhaW5lckNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBjYW5jZWxUcmlnZ2VyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIG9rVHJpZ2dlcmVkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuXG4gIHN0YXRlOiAndm9pZCcgfCAnZW50ZXInIHwgJ2V4aXQnID0gJ2VudGVyJztcbiAgZG9jdW1lbnQ6IERvY3VtZW50O1xuICBtb2RhbFJlZjogTnpNb2RhbFJlZjtcbiAgaXNTdHJpbmdDb250ZW50OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgZWxlbWVudEZvY3VzZWRCZWZvcmVNb2RhbFdhc09wZW5lZDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBmb2N1c1RyYXA6IEZvY3VzVHJhcDtcbiAgcHJpdmF0ZSBsYXRlc3RNb3VzZWRvd25UYXJnZXQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgb2xkTWFza1N0eWxlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHJvdGVjdGVkIGZvY3VzVHJhcEZhY3Rvcnk6IEZvY3VzVHJhcEZhY3RvcnksXG4gICAgcHVibGljIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHJvdGVjdGVkIHJlbmRlcjogUmVuZGVyZXIyLFxuICAgIHByb3RlY3RlZCB6b25lOiBOZ1pvbmUsXG4gICAgcHJvdGVjdGVkIG92ZXJsYXlSZWY6IE92ZXJsYXlSZWYsXG4gICAgcHVibGljIGNvbmZpZzogTW9kYWxPcHRpb25zLFxuICAgIGRvY3VtZW50PzogTnpTYWZlQW55LFxuICAgIHByb3RlY3RlZCBhbmltYXRpb25UeXBlPzogc3RyaW5nXG4gICkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50O1xuICAgIHRoaXMuaXNTdHJpbmdDb250ZW50ID0gdHlwZW9mIGNvbmZpZy5uekNvbnRlbnQgPT09ICdzdHJpbmcnO1xuICAgIHRoaXMuc2V0Q29udGFpbmVyKCk7XG4gIH1cblxuICBvbk1vdXNlZG93bihlOiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5sYXRlc3RNb3VzZWRvd25UYXJnZXQgPSAoZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQpIHx8IG51bGw7XG4gIH1cblxuICBvbk1vdXNldXAoZTogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGlmIChlLnRhcmdldCA9PT0gdGhpcy5sYXRlc3RNb3VzZWRvd25UYXJnZXQgJiYgZS50YXJnZXQgPT09IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSB7XG4gICAgICB0aGlzLmNvbnRhaW5lckNsaWNrLmVtaXQoKTtcbiAgICB9XG4gICAgdGhpcy5sYXRlc3RNb3VzZWRvd25UYXJnZXQgPSBudWxsO1xuICB9XG5cbiAgb25DbG9zZUNsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMuY2FuY2VsVHJpZ2dlcmVkLmVtaXQoKTtcbiAgfVxuXG4gIG9uT2tDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLm9rVHJpZ2dlcmVkLmVtaXQoKTtcbiAgfVxuXG4gIGF0dGFjaENvbXBvbmVudFBvcnRhbDxUPihwb3J0YWw6IENvbXBvbmVudFBvcnRhbDxUPik6IENvbXBvbmVudFJlZjxUPiB7XG4gICAgaWYgKHRoaXMucG9ydGFsT3V0bGV0Lmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgIHRocm93TnpNb2RhbENvbnRlbnRBbHJlYWR5QXR0YWNoZWRFcnJvcigpO1xuICAgIH1cbiAgICB0aGlzLnNhdmVQcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQoKTtcbiAgICB0aGlzLnNldE1vZGFsVHJhbnNmb3JtT3JpZ2luKCk7XG4gICAgcmV0dXJuIHRoaXMucG9ydGFsT3V0bGV0LmF0dGFjaENvbXBvbmVudFBvcnRhbChwb3J0YWwpO1xuICB9XG5cbiAgYXR0YWNoVGVtcGxhdGVQb3J0YWw8Qz4ocG9ydGFsOiBUZW1wbGF0ZVBvcnRhbDxDPik6IEVtYmVkZGVkVmlld1JlZjxDPiB7XG4gICAgaWYgKHRoaXMucG9ydGFsT3V0bGV0Lmhhc0F0dGFjaGVkKCkpIHtcbiAgICAgIHRocm93TnpNb2RhbENvbnRlbnRBbHJlYWR5QXR0YWNoZWRFcnJvcigpO1xuICAgIH1cbiAgICB0aGlzLnNhdmVQcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQoKTtcbiAgICByZXR1cm4gdGhpcy5wb3J0YWxPdXRsZXQuYXR0YWNoVGVtcGxhdGVQb3J0YWwocG9ydGFsKTtcbiAgfVxuXG4gIGdldE5hdGl2ZUVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgYW5pbWF0aW9uRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLm56Tm9BbmltYXRpb24gfHwgdGhpcy5hbmltYXRpb25UeXBlID09PSAnTm9vcEFuaW1hdGlvbnMnO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRNb2RhbFRyYW5zZm9ybU9yaWdpbigpOiB2b2lkIHtcbiAgICBjb25zdCBtb2RhbEVsZW1lbnQgPSB0aGlzLm1vZGFsRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgIGlmICh0aGlzLmVsZW1lbnRGb2N1c2VkQmVmb3JlTW9kYWxXYXNPcGVuZWQgYXMgSFRNTEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzbHlET01SZWN0ID0gdGhpcy5lbGVtZW50Rm9jdXNlZEJlZm9yZU1vZGFsV2FzT3BlbmVkIS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGxhc3RQb3NpdGlvbiA9IGdldEVsZW1lbnRPZmZzZXQodGhpcy5lbGVtZW50Rm9jdXNlZEJlZm9yZU1vZGFsV2FzT3BlbmVkISk7XG4gICAgICBjb25zdCB4ID0gbGFzdFBvc2l0aW9uLmxlZnQgKyBwcmV2aW91c2x5RE9NUmVjdC53aWR0aCAvIDI7XG4gICAgICBjb25zdCB5ID0gbGFzdFBvc2l0aW9uLnRvcCArIHByZXZpb3VzbHlET01SZWN0LmhlaWdodCAvIDI7XG4gICAgICBjb25zdCB0cmFuc2Zvcm1PcmlnaW4gPSBgJHt4IC0gbW9kYWxFbGVtZW50Lm9mZnNldExlZnR9cHggJHt5IC0gbW9kYWxFbGVtZW50Lm9mZnNldFRvcH1weCAwcHhgO1xuICAgICAgdGhpcy5yZW5kZXIuc2V0U3R5bGUobW9kYWxFbGVtZW50LCAndHJhbnNmb3JtLW9yaWdpbicsIHRyYW5zZm9ybU9yaWdpbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzYXZlUHJldmlvdXNseUZvY3VzZWRFbGVtZW50KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRvY3VtZW50KSB7XG4gICAgICB0aGlzLmVsZW1lbnRGb2N1c2VkQmVmb3JlTW9kYWxXYXNPcGVuZWQgPSB0aGlzLmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMpIHtcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRyYXBGb2N1cygpOiB2b2lkIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoIXRoaXMuZm9jdXNUcmFwKSB7XG4gICAgICB0aGlzLmZvY3VzVHJhcCA9IHRoaXMuZm9jdXNUcmFwRmFjdG9yeS5jcmVhdGUoZWxlbWVudCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29uZmlnLm56QXV0b2ZvY3VzKSB7XG4gICAgICB0aGlzLmZvY3VzVHJhcC5mb2N1c0luaXRpYWxFbGVtZW50V2hlblJlYWR5KCkudGhlbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgaWYgKGFjdGl2ZUVsZW1lbnQgIT09IGVsZW1lbnQgJiYgIWVsZW1lbnQuY29udGFpbnMoYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgZWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzdG9yZUZvY3VzKCk6IHZvaWQge1xuICAgIGNvbnN0IHRvRm9jdXMgPSB0aGlzLmVsZW1lbnRGb2N1c2VkQmVmb3JlTW9kYWxXYXNPcGVuZWQgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAvLyBXZSBuZWVkIHRoZSBleHRyYSBjaGVjaywgYmVjYXVzZSBJRSBjYW4gc2V0IHRoZSBgYWN0aXZlRWxlbWVudGAgdG8gbnVsbCBpbiBzb21lIGNhc2VzLlxuICAgIGlmICh0b0ZvY3VzICYmIHR5cGVvZiB0b0ZvY3VzLmZvY3VzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5hY3RpdmVFbGVtZW50IGFzIEVsZW1lbnQ7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICAgIGlmICghYWN0aXZlRWxlbWVudCB8fCBhY3RpdmVFbGVtZW50ID09PSB0aGlzLmRvY3VtZW50LmJvZHkgfHwgYWN0aXZlRWxlbWVudCA9PT0gZWxlbWVudCB8fCBlbGVtZW50LmNvbnRhaW5zKGFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICAgIHRvRm9jdXMuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5mb2N1c1RyYXApIHtcbiAgICAgIHRoaXMuZm9jdXNUcmFwLmRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldEVudGVyQW5pbWF0aW9uQ2xhc3MoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uRGlzYWJsZWQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgLy8gTWFrZSBzdXJlIHRvIHNldCB0aGUgYFRyYW5zZm9ybU9yaWdpbmAgc3R5bGUgYmVmb3JlIHNldCB0aGUgbW9kZWxFbGVtZW50J3MgY2xhc3MgbmFtZXNcbiAgICAgIHRoaXMuc2V0TW9kYWxUcmFuc2Zvcm1PcmlnaW4oKTtcbiAgICAgIGNvbnN0IG1vZGFsRWxlbWVudCA9IHRoaXMubW9kYWxFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBiYWNrZHJvcEVsZW1lbnQgPSB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50O1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3MobW9kYWxFbGVtZW50LCBaT09NX0NMQVNTX05BTUVfTUFQLmVudGVyKTtcbiAgICAgIHRoaXMucmVuZGVyLmFkZENsYXNzKG1vZGFsRWxlbWVudCwgWk9PTV9DTEFTU19OQU1FX01BUC5lbnRlckFjdGl2ZSk7XG4gICAgICB0aGlzLnJlbmRlci5hZGRDbGFzcyhiYWNrZHJvcEVsZW1lbnQsIEZBREVfQ0xBU1NfTkFNRV9NQVAuZW50ZXIpO1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3MoYmFja2Ryb3BFbGVtZW50LCBGQURFX0NMQVNTX05BTUVfTUFQLmVudGVyQWN0aXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0RXhpdEFuaW1hdGlvbkNsYXNzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFuaW1hdGlvbkRpc2FibGVkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGNvbnN0IG1vZGFsRWxlbWVudCA9IHRoaXMubW9kYWxFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICBjb25zdCBiYWNrZHJvcEVsZW1lbnQgPSB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50O1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3MobW9kYWxFbGVtZW50LCBaT09NX0NMQVNTX05BTUVfTUFQLmxlYXZlKTtcbiAgICAgIHRoaXMucmVuZGVyLmFkZENsYXNzKG1vZGFsRWxlbWVudCwgWk9PTV9DTEFTU19OQU1FX01BUC5sZWF2ZUFjdGl2ZSk7XG4gICAgICB0aGlzLnJlbmRlci5hZGRDbGFzcyhiYWNrZHJvcEVsZW1lbnQsIEZBREVfQ0xBU1NfTkFNRV9NQVAubGVhdmUpO1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3MoYmFja2Ryb3BFbGVtZW50LCBGQURFX0NMQVNTX05BTUVfTUFQLmxlYXZlQWN0aXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY2xlYW5BbmltYXRpb25DbGFzcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hbmltYXRpb25EaXNhYmxlZCgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBjb25zdCBiYWNrZHJvcEVsZW1lbnQgPSB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50O1xuICAgICAgY29uc3QgbW9kYWxFbGVtZW50ID0gdGhpcy5tb2RhbEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICAgIHRoaXMucmVuZGVyLnJlbW92ZUNsYXNzKG1vZGFsRWxlbWVudCwgWk9PTV9DTEFTU19OQU1FX01BUC5lbnRlcik7XG4gICAgICB0aGlzLnJlbmRlci5yZW1vdmVDbGFzcyhtb2RhbEVsZW1lbnQsIFpPT01fQ0xBU1NfTkFNRV9NQVAuZW50ZXJBY3RpdmUpO1xuICAgICAgdGhpcy5yZW5kZXIucmVtb3ZlQ2xhc3MobW9kYWxFbGVtZW50LCBaT09NX0NMQVNTX05BTUVfTUFQLmxlYXZlKTtcbiAgICAgIHRoaXMucmVuZGVyLnJlbW92ZUNsYXNzKG1vZGFsRWxlbWVudCwgWk9PTV9DTEFTU19OQU1FX01BUC5sZWF2ZUFjdGl2ZSk7XG4gICAgICB0aGlzLnJlbmRlci5yZW1vdmVDbGFzcyhiYWNrZHJvcEVsZW1lbnQsIEZBREVfQ0xBU1NfTkFNRV9NQVAuZW50ZXIpO1xuICAgICAgdGhpcy5yZW5kZXIucmVtb3ZlQ2xhc3MoYmFja2Ryb3BFbGVtZW50LCBGQURFX0NMQVNTX05BTUVfTUFQLmVudGVyQWN0aXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYmluZEJhY2tkcm9wU3R5bGUoKTogdm9pZCB7XG4gICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLm9sZE1hc2tTdHlsZSkge1xuICAgICAgICBjb25zdCBiYWNrZHJvcEVsZW1lbnQgPSB0aGlzLm92ZXJsYXlSZWYuYmFja2Ryb3BFbGVtZW50O1xuICAgICAgICBjb25zdCBzdHlsZXMgPSB0aGlzLm9sZE1hc2tTdHlsZSBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuICAgICAgICBPYmplY3Qua2V5cyhzdHlsZXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICB0aGlzLnJlbmRlci5yZW1vdmVTdHlsZShiYWNrZHJvcEVsZW1lbnQsIGtleSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm9sZE1hc2tTdHlsZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWcubnpNYXNrU3R5bGUgPT09ICdvYmplY3QnICYmIE9iamVjdC5rZXlzKHRoaXMuY29uZmlnLm56TWFza1N0eWxlKS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgYmFja2Ryb3BFbGVtZW50ID0gdGhpcy5vdmVybGF5UmVmLmJhY2tkcm9wRWxlbWVudDtcbiAgICAgICAgY29uc3Qgc3R5bGVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0geyAuLi50aGlzLmNvbmZpZy5uek1hc2tTdHlsZSB9O1xuICAgICAgICBPYmplY3Qua2V5cyhzdHlsZXMpLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgICB0aGlzLnJlbmRlci5zZXRTdHlsZShiYWNrZHJvcEVsZW1lbnQsIGtleSwgc3R5bGVzW2tleV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5vbGRNYXNrU3R5bGUgPSBzdHlsZXM7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBjb250YWluZXIgZWxlbWVudC5cbiAgICogQGRlcHJlY2F0ZWQgTm90IHN1cHBvcnRlZC5cbiAgICogQGJyZWFraW5nLWNoYW5nZSAxMC4wLjBcbiAgICovXG4gIHByaXZhdGUgc2V0Q29udGFpbmVyKCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuZ2V0Q29udGFpbmVyKCk7XG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgdGhpcy5yZW5kZXIuYXBwZW5kQ2hpbGQoY29udGFpbmVyLCB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSBjb250YWluZXIgZWxlbWVudC5cbiAgICogQGRlcHJlY2F0ZWQgTm90IHN1cHBvcnRlZC5cbiAgICogQGJyZWFraW5nLWNoYW5nZSAxMC4wLjBcbiAgICovXG4gIHByaXZhdGUgcmVzZXRDb250YWluZXIoKTogdm9pZCB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXIoKTtcbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICB0aGlzLnJlbmRlci5hcHBlbmRDaGlsZCh0aGlzLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQsIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRhaW5lcigpOiBIVE1MRWxlbWVudCB8IG51bGwge1xuICAgIGNvbnN0IHsgbnpHZXRDb250YWluZXIgfSA9IHRoaXMuY29uZmlnO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHR5cGVvZiBuekdldENvbnRhaW5lciA9PT0gJ2Z1bmN0aW9uJyA/IG56R2V0Q29udGFpbmVyKCkgOiBuekdldENvbnRhaW5lcjtcbiAgICByZXR1cm4gY29udGFpbmVyIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyBjb250YWluZXIgOiBudWxsO1xuICB9XG5cbiAgb25BbmltYXRpb25Eb25lKGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC50b1N0YXRlID09PSAnZW50ZXInKSB7XG4gICAgICB0aGlzLnNldENvbnRhaW5lcigpO1xuICAgICAgdGhpcy50cmFwRm9jdXMoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnRvU3RhdGUgPT09ICdleGl0Jykge1xuICAgICAgdGhpcy5yZXN0b3JlRm9jdXMoKTtcbiAgICB9XG4gICAgdGhpcy5jbGVhbkFuaW1hdGlvbkNsYXNzKCk7XG4gICAgdGhpcy5hbmltYXRpb25TdGF0ZUNoYW5nZWQuZW1pdChldmVudCk7XG4gIH1cblxuICBvbkFuaW1hdGlvblN0YXJ0KGV2ZW50OiBBbmltYXRpb25FdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC50b1N0YXRlID09PSAnZW50ZXInKSB7XG4gICAgICB0aGlzLnNldEVudGVyQW5pbWF0aW9uQ2xhc3MoKTtcbiAgICAgIHRoaXMuYmluZEJhY2tkcm9wU3R5bGUoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LnRvU3RhdGUgPT09ICdleGl0Jykge1xuICAgICAgdGhpcy5yZXNldENvbnRhaW5lcigpO1xuICAgICAgdGhpcy5zZXRFeGl0QW5pbWF0aW9uQ2xhc3MoKTtcbiAgICB9XG4gICAgdGhpcy5hbmltYXRpb25TdGF0ZUNoYW5nZWQuZW1pdChldmVudCk7XG4gIH1cblxuICBzdGFydEV4aXRBbmltYXRpb24oKTogdm9pZCB7XG4gICAgdGhpcy5zdGF0ZSA9ICdleGl0JztcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxufVxuIl19