ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
702 lines • 56.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: drawer.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { __decorate, __extends, __metadata } 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 { FocusTrapFactory } from '@angular/cdk/a11y';
import { ESCAPE } from '@angular/cdk/keycodes';
import { Overlay, OverlayConfig, OverlayKeyboardDispatcher } from '@angular/cdk/overlay';
import { CdkPortalOutlet, ComponentPortal, PortalInjector, TemplatePortal } from '@angular/cdk/portal';
import { DOCUMENT } from '@angular/common';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Inject, Injector, Input, Optional, Output, Renderer2, TemplateRef, Type, ViewChild, ViewContainerRef } from '@angular/core';
import { NzConfigService, WithConfig } from 'ng-zorro-antd/core/config';
import { InputBoolean, toCssPixel } from 'ng-zorro-antd/core/util';
import { Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import { NzDrawerRef } from './drawer-ref';
/** @type {?} */
export var DRAWER_ANIMATE_DURATION = 300;
/** @type {?} */
var NZ_CONFIG_COMPONENT_NAME = 'drawer';
/**
* @template T, R, D
*/
var NzDrawerComponent = /** @class */ (function (_super) {
__extends(NzDrawerComponent, _super);
function NzDrawerComponent(document, nzConfigService, renderer, overlay, injector, changeDetectorRef, focusTrapFactory, viewContainerRef, overlayKeyboardDispatcher) {
var _this = _super.call(this) || this;
_this.document = document;
_this.nzConfigService = nzConfigService;
_this.renderer = renderer;
_this.overlay = overlay;
_this.injector = injector;
_this.changeDetectorRef = changeDetectorRef;
_this.focusTrapFactory = focusTrapFactory;
_this.viewContainerRef = viewContainerRef;
_this.overlayKeyboardDispatcher = overlayKeyboardDispatcher;
_this.nzClosable = true;
_this.nzNoAnimation = false;
_this.nzKeyboard = true;
_this.nzPlacement = 'right';
_this.nzMaskStyle = {};
_this.nzBodyStyle = {};
_this.nzWidth = 256;
_this.nzHeight = 256;
_this.nzZIndex = 1000;
_this.nzOffsetX = 0;
_this.nzOffsetY = 0;
_this.nzOnViewInit = new EventEmitter();
_this.nzOnClose = new EventEmitter();
_this.destroy$ = new Subject();
_this.placementChanging = false;
_this.placementChangeTimeoutId = -1;
_this.isOpen = false;
_this.templateContext = {
$implicit: undefined,
drawerRef: (/** @type {?} */ (_this))
};
_this.nzAfterOpen = new Subject();
_this.nzAfterClose = new Subject();
return _this;
}
Object.defineProperty(NzDrawerComponent.prototype, "nzVisible", {
get: /**
* @return {?}
*/
function () {
return this.isOpen;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this.isOpen = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NzDrawerComponent.prototype, "offsetTransform", {
get: /**
* @return {?}
*/
function () {
if (!this.isOpen || this.nzOffsetX + this.nzOffsetY === 0) {
return null;
}
switch (this.nzPlacement) {
case 'left':
return "translateX(" + this.nzOffsetX + "px)";
case 'right':
return "translateX(-" + this.nzOffsetX + "px)";
case 'top':
return "translateY(" + this.nzOffsetY + "px)";
case 'bottom':
return "translateY(-" + this.nzOffsetY + "px)";
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(NzDrawerComponent.prototype, "transform", {
get: /**
* @return {?}
*/
function () {
if (this.isOpen) {
return null;
}
switch (this.nzPlacement) {
case 'left':
return "translateX(-100%)";
case 'right':
return "translateX(100%)";
case 'top':
return "translateY(-100%)";
case 'bottom':
return "translateY(100%)";
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(NzDrawerComponent.prototype, "width", {
get: /**
* @return {?}
*/
function () {
return this.isLeftOrRight ? toCssPixel(this.nzWidth) : null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NzDrawerComponent.prototype, "height", {
get: /**
* @return {?}
*/
function () {
return !this.isLeftOrRight ? toCssPixel(this.nzHeight) : null;
},
enumerable: true,
configurable: true
});
Object.defineProperty(NzDrawerComponent.prototype, "isLeftOrRight", {
get: /**
* @return {?}
*/
function () {
return this.nzPlacement === 'left' || this.nzPlacement === 'right';
},
enumerable: true,
configurable: true
});
Object.defineProperty(NzDrawerComponent.prototype, "afterOpen", {
get: /**
* @return {?}
*/
function () {
return this.nzAfterOpen.asObservable();
},
enumerable: true,
configurable: true
});
Object.defineProperty(NzDrawerComponent.prototype, "afterClose", {
get: /**
* @return {?}
*/
function () {
return this.nzAfterClose.asObservable();
},
enumerable: true,
configurable: true
});
/**
* @param {?} value
* @return {?}
*/
NzDrawerComponent.prototype.isTemplateRef = /**
* @param {?} value
* @return {?}
*/
function (value) {
return value instanceof TemplateRef;
};
/**
* @return {?}
*/
NzDrawerComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
this.attachOverlay();
this.updateOverlayStyle();
this.updateBodyOverflow();
this.templateContext = { $implicit: this.nzContentParams, drawerRef: (/** @type {?} */ (this)) };
this.changeDetectorRef.detectChanges();
};
/**
* @return {?}
*/
NzDrawerComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
var _this = this;
this.attachBodyContent();
setTimeout((/**
* @return {?}
*/
function () {
_this.nzOnViewInit.emit();
}));
};
/**
* @param {?} changes
* @return {?}
*/
NzDrawerComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
var nzPlacement = changes.nzPlacement, nzVisible = changes.nzVisible;
if (nzVisible) {
/** @type {?} */
var value = changes.nzVisible.currentValue;
if (value) {
this.open();
}
else {
this.close();
}
}
if (nzPlacement && !nzPlacement.isFirstChange()) {
this.triggerPlacementChangeCycleOnce();
}
};
/**
* @return {?}
*/
NzDrawerComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.destroy$.next();
this.destroy$.complete();
clearTimeout(this.placementChangeTimeoutId);
this.disposeOverlay();
};
/**
* @private
* @return {?}
*/
NzDrawerComponent.prototype.getAnimationDuration = /**
* @private
* @return {?}
*/
function () {
return this.nzNoAnimation ? 0 : DRAWER_ANIMATE_DURATION;
};
// Disable the transition animation temporarily when the placement changing
// Disable the transition animation temporarily when the placement changing
/**
* @private
* @return {?}
*/
NzDrawerComponent.prototype.triggerPlacementChangeCycleOnce =
// Disable the transition animation temporarily when the placement changing
/**
* @private
* @return {?}
*/
function () {
var _this = this;
if (!this.nzNoAnimation) {
this.placementChanging = true;
this.changeDetectorRef.markForCheck();
clearTimeout(this.placementChangeTimeoutId);
this.placementChangeTimeoutId = setTimeout((/**
* @return {?}
*/
function () {
_this.placementChanging = false;
_this.changeDetectorRef.markForCheck();
}), this.getAnimationDuration());
}
};
/**
* @param {?=} result
* @return {?}
*/
NzDrawerComponent.prototype.close = /**
* @param {?=} result
* @return {?}
*/
function (result) {
var _this = this;
this.isOpen = false;
this.updateOverlayStyle();
this.overlayKeyboardDispatcher.remove((/** @type {?} */ (this.overlayRef)));
this.changeDetectorRef.detectChanges();
setTimeout((/**
* @return {?}
*/
function () {
_this.updateBodyOverflow();
_this.restoreFocus();
_this.nzAfterClose.next(result);
_this.nzAfterClose.complete();
}), this.getAnimationDuration());
};
/**
* @return {?}
*/
NzDrawerComponent.prototype.open = /**
* @return {?}
*/
function () {
var _this = this;
this.isOpen = true;
this.overlayKeyboardDispatcher.add((/** @type {?} */ (this.overlayRef)));
this.updateOverlayStyle();
this.updateBodyOverflow();
this.savePreviouslyFocusedElement();
this.trapFocus();
this.changeDetectorRef.detectChanges();
setTimeout((/**
* @return {?}
*/
function () {
_this.nzAfterOpen.next();
}), this.getAnimationDuration());
};
/**
* @return {?}
*/
NzDrawerComponent.prototype.closeClick = /**
* @return {?}
*/
function () {
this.nzOnClose.emit();
};
/**
* @return {?}
*/
NzDrawerComponent.prototype.maskClick = /**
* @return {?}
*/
function () {
if (this.nzMaskClosable && this.nzMask) {
this.nzOnClose.emit();
}
};
/**
* @private
* @return {?}
*/
NzDrawerComponent.prototype.attachBodyContent = /**
* @private
* @return {?}
*/
function () {
this.bodyPortalOutlet.dispose();
if (this.nzContent instanceof Type) {
/** @type {?} */
var childInjector = new PortalInjector(this.injector, new WeakMap([[NzDrawerRef, this]]));
/** @type {?} */
var componentPortal = new ComponentPortal(this.nzContent, null, childInjector);
/** @type {?} */
var componentRef = this.bodyPortalOutlet.attachComponentPortal(componentPortal);
Object.assign(componentRef.instance, this.nzContentParams);
componentRef.changeDetectorRef.detectChanges();
}
};
/**
* @private
* @return {?}
*/
NzDrawerComponent.prototype.attachOverlay = /**
* @private
* @return {?}
*/
function () {
var _this = this;
if (!this.overlayRef) {
this.portal = new TemplatePortal(this.drawerTemplate, this.viewContainerRef);
this.overlayRef = this.overlay.create(this.getOverlayConfig());
}
if (this.overlayRef && !this.overlayRef.hasAttached()) {
this.overlayRef.attach(this.portal);
(/** @type {?} */ (this.overlayRef)).keydownEvents()
.pipe(takeUntil(this.destroy$))
.subscribe((/**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.keyCode === ESCAPE && _this.isOpen && _this.nzKeyboard) {
_this.nzOnClose.emit();
}
}));
}
};
/**
* @private
* @return {?}
*/
NzDrawerComponent.prototype.disposeOverlay = /**
* @private
* @return {?}
*/
function () {
if (this.overlayRef) {
this.overlayRef.dispose();
}
this.overlayRef = null;
};
/**
* @private
* @return {?}
*/
NzDrawerComponent.prototype.getOverlayConfig = /**
* @private
* @return {?}
*/
function () {
return new OverlayConfig({
disposeOnNavigation: true,
positionStrategy: this.overlay.position().global(),
scrollStrategy: this.overlay.scrollStrategies.block()
});
};
/**
* @private
* @return {?}
*/
NzDrawerComponent.prototype.updateOverlayStyle = /**
* @private
* @return {?}
*/
function () {
if (this.overlayRef && this.overlayRef.overlayElement) {
this.renderer.setStyle(this.overlayRef.overlayElement, 'pointer-events', this.isOpen ? 'auto' : 'none');
}
};
/**
* @private
* @return {?}
*/
NzDrawerComponent.prototype.updateBodyOverflow = /**
* @private
* @return {?}
*/
function () {
if (this.overlayRef) {
if (this.isOpen) {
(/** @type {?} */ (this.overlayRef.getConfig().scrollStrategy)).enable();
}
else {
(/** @type {?} */ (this.overlayRef.getConfig().scrollStrategy)).disable();
}
}
};
/**
* @return {?}
*/
NzDrawerComponent.prototype.savePreviouslyFocusedElement = /**
* @return {?}
*/
function () {
if (this.document && !this.previouslyFocusedElement) {
this.previouslyFocusedElement = (/** @type {?} */ (this.document.activeElement));
// We need the extra check, because IE's svg element has no blur method.
if (this.previouslyFocusedElement && typeof this.previouslyFocusedElement.blur === 'function') {
this.previouslyFocusedElement.blur();
}
}
};
/**
* @private
* @return {?}
*/
NzDrawerComponent.prototype.trapFocus = /**
* @private
* @return {?}
*/
function () {
if (!this.focusTrap && this.overlayRef && this.overlayRef.overlayElement) {
this.focusTrap = this.focusTrapFactory.create((/** @type {?} */ (this.overlayRef)).overlayElement);
this.focusTrap.focusInitialElement();
}
};
/**
* @private
* @return {?}
*/
NzDrawerComponent.prototype.restoreFocus = /**
* @private
* @return {?}
*/
function () {
// We need the extra check, because IE can set the `activeElement` to null in some cases.
if (this.previouslyFocusedElement && typeof this.previouslyFocusedElement.focus === 'function') {
this.previouslyFocusedElement.focus();
}
if (this.focusTrap) {
this.focusTrap.destroy();
}
};
NzDrawerComponent.decorators = [
{ type: Component, args: [{
selector: 'nz-drawer',
exportAs: 'nzDrawer',
template: "\n <ng-template #drawerTemplate>\n <div\n class=\"ant-drawer\"\n [nzNoAnimation]=\"nzNoAnimation\"\n [class.ant-drawer-open]=\"isOpen\"\n [class.ant-drawer-top]=\"nzPlacement === 'top'\"\n [class.ant-drawer-bottom]=\"nzPlacement === 'bottom'\"\n [class.ant-drawer-right]=\"nzPlacement === 'right'\"\n [class.ant-drawer-left]=\"nzPlacement === 'left'\"\n [style.transform]=\"offsetTransform\"\n [style.transition]=\"placementChanging ? 'none' : null\"\n [style.zIndex]=\"nzZIndex\"\n >\n <div class=\"ant-drawer-mask\" (click)=\"maskClick()\" *ngIf=\"nzMask\" [ngStyle]=\"nzMaskStyle\"></div>\n <div\n class=\"ant-drawer-content-wrapper {{ nzWrapClassName }}\"\n [style.width]=\"width\"\n [style.height]=\"height\"\n [style.transform]=\"transform\"\n [style.transition]=\"placementChanging ? 'none' : null\"\n >\n <div class=\"ant-drawer-content\">\n <div class=\"ant-drawer-wrapper-body\" [style.height]=\"isLeftOrRight ? '100%' : null\">\n <div *ngIf=\"nzTitle || nzClosable\" [class.ant-drawer-header]=\"!!nzTitle\" [class.ant-drawer-header-no-title]=\"!nzTitle\">\n <div *ngIf=\"nzTitle\" class=\"ant-drawer-title\">\n <ng-container *nzStringTemplateOutlet=\"nzTitle\"><div [innerHTML]=\"nzTitle\"></div></ng-container>\n </div>\n <button *ngIf=\"nzClosable\" (click)=\"closeClick()\" aria-label=\"Close\" class=\"ant-drawer-close\" style=\"--scroll-bar: 0px;\">\n <i nz-icon nzType=\"close\"></i>\n </button>\n </div>\n <div class=\"ant-drawer-body\" [ngStyle]=\"nzBodyStyle\">\n <ng-template cdkPortalOutlet></ng-template>\n <ng-container *ngIf=\"isTemplateRef(nzContent)\">\n <ng-container *ngTemplateOutlet=\"nzContent; context: templateContext\"></ng-container>\n </ng-container>\n <ng-content *ngIf=\"!nzContent\"></ng-content>\n </div>\n </div>\n </div>\n </div>\n </div>\n </ng-template>\n ",
preserveWhitespaces: false,
changeDetection: ChangeDetectionStrategy.OnPush
}] }
];
/** @nocollapse */
NzDrawerComponent.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DOCUMENT,] }] },
{ type: NzConfigService },
{ type: Renderer2 },
{ type: Overlay },
{ type: Injector },
{ type: ChangeDetectorRef },
{ type: FocusTrapFactory },
{ type: ViewContainerRef },
{ type: OverlayKeyboardDispatcher }
]; };
NzDrawerComponent.propDecorators = {
nzContent: [{ type: Input }],
nzClosable: [{ type: Input }],
nzMaskClosable: [{ type: Input }],
nzMask: [{ type: Input }],
nzNoAnimation: [{ type: Input }],
nzKeyboard: [{ type: Input }],
nzTitle: [{ type: Input }],
nzPlacement: [{ type: Input }],
nzMaskStyle: [{ type: Input }],
nzBodyStyle: [{ type: Input }],
nzWrapClassName: [{ type: Input }],
nzWidth: [{ type: Input }],
nzHeight: [{ type: Input }],
nzZIndex: [{ type: Input }],
nzOffsetX: [{ type: Input }],
nzOffsetY: [{ type: Input }],
nzVisible: [{ type: Input }],
nzOnViewInit: [{ type: Output }],
nzOnClose: [{ type: Output }],
drawerTemplate: [{ type: ViewChild, args: ['drawerTemplate', { static: true },] }],
bodyPortalOutlet: [{ type: ViewChild, args: [CdkPortalOutlet, { static: false },] }]
};
__decorate([
InputBoolean(),
__metadata("design:type", Boolean)
], NzDrawerComponent.prototype, "nzClosable", void 0);
__decorate([
WithConfig(NZ_CONFIG_COMPONENT_NAME, true), InputBoolean(),
__metadata("design:type", Boolean)
], NzDrawerComponent.prototype, "nzMaskClosable", void 0);
__decorate([
WithConfig(NZ_CONFIG_COMPONENT_NAME, true), InputBoolean(),
__metadata("design:type", Boolean)
], NzDrawerComponent.prototype, "nzMask", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Object)
], NzDrawerComponent.prototype, "nzNoAnimation", void 0);
__decorate([
InputBoolean(),
__metadata("design:type", Boolean)
], NzDrawerComponent.prototype, "nzKeyboard", void 0);
return NzDrawerComponent;
}(NzDrawerRef));
export { NzDrawerComponent };
if (false) {
/** @type {?} */
NzDrawerComponent.ngAcceptInputType_nzClosable;
/** @type {?} */
NzDrawerComponent.ngAcceptInputType_nzMaskClosable;
/** @type {?} */
NzDrawerComponent.ngAcceptInputType_nzMask;
/** @type {?} */
NzDrawerComponent.ngAcceptInputType_nzNoAnimation;
/** @type {?} */
NzDrawerComponent.ngAcceptInputType_nzKeyboard;
/** @type {?} */
NzDrawerComponent.prototype.nzContent;
/** @type {?} */
NzDrawerComponent.prototype.nzClosable;
/** @type {?} */
NzDrawerComponent.prototype.nzMaskClosable;
/** @type {?} */
NzDrawerComponent.prototype.nzMask;
/** @type {?} */
NzDrawerComponent.prototype.nzNoAnimation;
/** @type {?} */
NzDrawerComponent.prototype.nzKeyboard;
/** @type {?} */
NzDrawerComponent.prototype.nzTitle;
/** @type {?} */
NzDrawerComponent.prototype.nzPlacement;
/** @type {?} */
NzDrawerComponent.prototype.nzMaskStyle;
/** @type {?} */
NzDrawerComponent.prototype.nzBodyStyle;
/** @type {?} */
NzDrawerComponent.prototype.nzWrapClassName;
/** @type {?} */
NzDrawerComponent.prototype.nzWidth;
/** @type {?} */
NzDrawerComponent.prototype.nzHeight;
/** @type {?} */
NzDrawerComponent.prototype.nzZIndex;
/** @type {?} */
NzDrawerComponent.prototype.nzOffsetX;
/** @type {?} */
NzDrawerComponent.prototype.nzOffsetY;
/** @type {?} */
NzDrawerComponent.prototype.nzOnViewInit;
/** @type {?} */
NzDrawerComponent.prototype.nzOnClose;
/** @type {?} */
NzDrawerComponent.prototype.drawerTemplate;
/** @type {?} */
NzDrawerComponent.prototype.bodyPortalOutlet;
/** @type {?} */
NzDrawerComponent.prototype.destroy$;
/** @type {?} */
NzDrawerComponent.prototype.previouslyFocusedElement;
/** @type {?} */
NzDrawerComponent.prototype.placementChanging;
/** @type {?} */
NzDrawerComponent.prototype.placementChangeTimeoutId;
/** @type {?} */
NzDrawerComponent.prototype.nzContentParams;
/** @type {?} */
NzDrawerComponent.prototype.overlayRef;
/** @type {?} */
NzDrawerComponent.prototype.portal;
/** @type {?} */
NzDrawerComponent.prototype.focusTrap;
/** @type {?} */
NzDrawerComponent.prototype.isOpen;
/** @type {?} */
NzDrawerComponent.prototype.templateContext;
/** @type {?} */
NzDrawerComponent.prototype.nzAfterOpen;
/** @type {?} */
NzDrawerComponent.prototype.nzAfterClose;
/**
* @type {?}
* @private
*/
NzDrawerComponent.prototype.document;
/** @type {?} */
NzDrawerComponent.prototype.nzConfigService;
/**
* @type {?}
* @private
*/
NzDrawerComponent.prototype.renderer;
/**
* @type {?}
* @private
*/
NzDrawerComponent.prototype.overlay;
/**
* @type {?}
* @private
*/
NzDrawerComponent.prototype.injector;
/**
* @type {?}
* @private
*/
NzDrawerComponent.prototype.changeDetectorRef;
/**
* @type {?}
* @private
*/
NzDrawerComponent.prototype.focusTrapFactory;
/**
* @type {?}
* @private
*/
NzDrawerComponent.prototype.viewContainerRef;
/**
* @type {?}
* @private
*/
NzDrawerComponent.prototype.overlayKeyboardDispatcher;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25nLXpvcnJvLWFudGQvZHJhd2VyLyIsInNvdXJjZXMiOlsiZHJhd2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUFhLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLHlCQUF5QixFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDckcsT0FBTyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsS0FBSyxFQUlMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUVULFdBQVcsRUFDWCxJQUFJLEVBQ0osU0FBUyxFQUNULGdCQUFnQixFQUNqQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRXhFLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFbkUsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQzs7QUFFM0MsTUFBTSxLQUFPLHVCQUF1QixHQUFHLEdBQUc7O0lBRXBDLHdCQUF3QixHQUFHLFFBQVE7Ozs7QUFFekM7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QUM3RixtQ0FBcUY7O0lBQ3JGLDBDQUErQzs7SUFDL0MsdUNBQW9EOztJQUNwRCxvQ0FBMkM7O0lBQzNDLHdDQUFrRDs7SUFDbEQsd0NBQWtDOztJQUNsQyx3Q0FBa0M7O0lBQ2xDLDRDQUFpQzs7SUFDakMsb0NBQXdDOztJQUN4QyxxQ0FBeUM7O0lBQ3pDLHFDQUF5Qjs7SUFDekIsc0NBQXVCOztJQUN2QixzQ0FBdUI7O0lBV3ZCLHlDQUEyRDs7SUFDM0Qsc0NBQThEOztJQUU5RCwyQ0FBaUY7O0lBQ2pGLDZDQUFpRjs7SUFFakYscUNBQStCOztJQUMvQixxREFBc0M7O0lBQ3RDLDhDQUEwQjs7SUFDMUIscURBQThCOztJQUM5Qiw0Q0FBbUI7O0lBQ25CLHVDQUE4Qjs7SUFDOUIsbUNBQXVCOztJQUN2QixzQ0FBcUI7O0lBQ3JCLG1DQUFlOztJQUNmLDRDQUdFOztJQStDRix3Q0FBa0M7O0lBQ2xDLHlDQUFnQzs7Ozs7SUFlOUIscUNBQXlEOztJQUN6RCw0Q0FBdUM7Ozs7O0lBQ3ZDLHFDQUEyQjs7Ozs7SUFDM0Isb0NBQXdCOzs7OztJQUN4QixxQ0FBMEI7Ozs7O0lBQzFCLDhDQUE0Qzs7Ozs7SUFDNUMsNkNBQTBDOzs7OztJQUMxQyw2Q0FBMEM7Ozs7O0lBQzFDLHNEQUE0RCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBBbGliYWJhLmNvbSBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBGb2N1c1RyYXAsIEZvY3VzVHJhcEZhY3RvcnkgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBFU0NBUEUgfSBmcm9tICdAYW5ndWxhci9jZGsva2V5Y29kZXMnO1xuaW1wb3J0IHsgT3ZlcmxheSwgT3ZlcmxheUNvbmZpZywgT3ZlcmxheUtleWJvYXJkRGlzcGF0Y2hlciwgT3ZlcmxheVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IENka1BvcnRhbE91dGxldCwgQ29tcG9uZW50UG9ydGFsLCBQb3J0YWxJbmplY3RvciwgVGVtcGxhdGVQb3J0YWwgfSBmcm9tICdAYW5ndWxhci9jZGsvcG9ydGFsJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0b3IsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgT3V0cHV0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBUeXBlLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdDb250YWluZXJSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOekNvbmZpZ1NlcnZpY2UsIFdpdGhDb25maWcgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvY29uZmlnJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgTnpTYWZlQW55IH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IElucHV0Qm9vbGVhbiwgdG9Dc3NQaXhlbCB9IGZyb20gJ25nLXpvcnJvLWFudGQvY29yZS91dGlsJztcblxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTnpEcmF3ZXJPcHRpb25zT2ZDb21wb25lbnQsIE56RHJhd2VyUGxhY2VtZW50IH0gZnJvbSAnLi9kcmF3ZXItb3B0aW9ucyc7XG5pbXBvcnQgeyBOekRyYXdlclJlZiB9IGZyb20gJy4vZHJhd2VyLXJlZic7XG5cbmV4cG9ydCBjb25zdCBEUkFXRVJfQU5JTUFURV9EVVJBVElPTiA9IDMwMDtcblxuY29uc3QgTlpfQ09ORklHX0NPTVBPTkVOVF9OQU1FID0gJ2RyYXdlcic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ256LWRyYXdlcicsXG4gIGV4cG9ydEFzOiAnbnpEcmF3ZXInLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxuZy10ZW1wbGF0ZSAjZHJhd2VyVGVtcGxhdGU+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwiYW50LWRyYXdlclwiXG4gICAgICAgIFtuek5vQW5pbWF0aW9uXT1cIm56Tm9BbmltYXRpb25cIlxuICAgICAgICBbY2xhc3MuYW50LWRyYXdlci1vcGVuXT1cImlzT3BlblwiXG4gICAgICAgIFtjbGFzcy5hbnQtZHJhd2VyLXRvcF09XCJuelBsYWNlbWVudCA9PT0gJ3RvcCdcIlxuICAgICAgICBbY2xhc3MuYW50LWRyYXdlci1ib3R0b21dPVwibnpQbGFjZW1lbnQgPT09ICdib3R0b20nXCJcbiAgICAgICAgW2NsYXNzLmFudC1kcmF3ZXItcmlnaHRdPVwibnpQbGFjZW1lbnQgPT09ICdyaWdodCdcIlxuICAgICAgICBbY2xhc3MuYW50LWRyYXdlci1sZWZ0XT1cIm56UGxhY2VtZW50ID09PSAnbGVmdCdcIlxuICAgICAgICBbc3R5bGUudHJhbnNmb3JtXT1cIm9mZnNldFRyYW5zZm9ybVwiXG4gICAgICAgIFtzdHlsZS50cmFuc2l0aW9uXT1cInBsYWNlbWVudENoYW5naW5nID8gJ25vbmUnIDogbnVsbFwiXG4gICAgICAgIFtzdHlsZS56SW5kZXhdPVwibnpaSW5kZXhcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYW50LWRyYXdlci1tYXNrXCIgKGNsaWNrKT1cIm1hc2tDbGljaygpXCIgKm5nSWY9XCJuek1hc2tcIiBbbmdTdHlsZV09XCJuek1hc2tTdHlsZVwiPjwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJhbnQtZHJhd2VyLWNvbnRlbnQtd3JhcHBlciB7eyBueldyYXBDbGFzc05hbWUgfX1cIlxuICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJ3aWR0aFwiXG4gICAgICAgICAgW3N0eWxlLmhlaWdodF09XCJoZWlnaHRcIlxuICAgICAgICAgIFtzdHlsZS50cmFuc2Zvcm1dPVwidHJhbnNmb3JtXCJcbiAgICAgICAgICBbc3R5bGUudHJhbnNpdGlvbl09XCJwbGFjZW1lbnRDaGFuZ2luZyA/ICdub25lJyA6IG51bGxcIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFudC1kcmF3ZXItY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFudC1kcmF3ZXItd3JhcHBlci1ib2R5XCIgW3N0eWxlLmhlaWdodF09XCJpc0xlZnRPclJpZ2h0ID8gJzEwMCUnIDogbnVsbFwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwibnpUaXRsZSB8fCBuekNsb3NhYmxlXCIgW2NsYXNzLmFudC1kcmF3ZXItaGVhZGVyXT1cIiEhbnpUaXRsZVwiIFtjbGFzcy5hbnQtZHJhd2VyLWhlYWRlci1uby10aXRsZV09XCIhbnpUaXRsZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJuelRpdGxlXCIgY2xhc3M9XCJhbnQtZHJhd2VyLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuelN0cmluZ1RlbXBsYXRlT3V0bGV0PVwibnpUaXRsZVwiPjxkaXYgW2lubmVySFRNTF09XCJuelRpdGxlXCI+PC9kaXY+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIm56Q2xvc2FibGVcIiAoY2xpY2spPVwiY2xvc2VDbGljaygpXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgY2xhc3M9XCJhbnQtZHJhd2VyLWNsb3NlXCIgc3R5bGU9XCItLXNjcm9sbC1iYXI6IDBweDtcIj5cbiAgICAgICAgICAgICAgICAgIDxpIG56LWljb24gbnpUeXBlPVwiY2xvc2VcIj48L2k+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYW50LWRyYXdlci1ib2R5XCIgW25nU3R5bGVdPVwibnpCb2R5U3R5bGVcIj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgY2RrUG9ydGFsT3V0bGV0PjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzVGVtcGxhdGVSZWYobnpDb250ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm56Q29udGVudDsgY29udGV4dDogdGVtcGxhdGVDb250ZXh0XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRlbnQgKm5nSWY9XCIhbnpDb250ZW50XCI+PC9uZy1jb250ZW50PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIGAsXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBOekRyYXdlckNvbXBvbmVudDxUID0gTnpTYWZlQW55LCBSID0gTnpTYWZlQW55LCBEID0gTnpTYWZlQW55PiBleHRlbmRzIE56RHJhd2VyUmVmPFI+XG4gIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgTnpEcmF3ZXJPcHRpb25zT2ZDb21wb25lbnQge1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpDbG9zYWJsZTogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpNYXNrQ2xvc2FibGU6IEJvb2xlYW5JbnB1dDtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX256TWFzazogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpOb0FuaW1hdGlvbjogQm9vbGVhbklucHV0O1xuICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfbnpLZXlib2FyZDogQm9vbGVhbklucHV0O1xuXG4gIEBJbnB1dCgpIG56Q29udGVudDogVGVtcGxhdGVSZWY8eyAkaW1wbGljaXQ6IEQ7IGRyYXdlclJlZjogTnpEcmF3ZXJSZWY8Uj4gfT4gfCBUeXBlPFQ+O1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgbnpDbG9zYWJsZTogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIEBXaXRoQ29uZmlnKE5aX0NPTkZJR19DT01QT05FTlRfTkFNRSwgdHJ1ZSkgQElucHV0Qm9vbGVhbigpIG56TWFza0Nsb3NhYmxlOiBib29sZWFuO1xuICBASW5wdXQoKSBAV2l0aENvbmZpZyhOWl9DT05GSUdfQ09NUE9ORU5UX05BTUUsIHRydWUpIEBJbnB1dEJvb2xlYW4oKSBuek1hc2s6IGJvb2xlYW47XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuek5vQW5pbWF0aW9uID0gZmFsc2U7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuektleWJvYXJkOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgbnpUaXRsZTogc3RyaW5nIHwgVGVtcGxhdGVSZWY8e30+O1xuICBASW5wdXQoKSBuelBsYWNlbWVudDogTnpEcmF3ZXJQbGFjZW1lbnQgPSAncmlnaHQnO1xuICBASW5wdXQoKSBuek1hc2tTdHlsZTogb2JqZWN0ID0ge307XG4gIEBJbnB1dCgpIG56Qm9keVN0eWxlOiBvYmplY3QgPSB7fTtcbiAgQElucHV0KCkgbnpXcmFwQ2xhc3NOYW1lOiBzdHJpbmc7XG4gIEBJbnB1dCgpIG56V2lkdGg6IG51bWJlciB8IHN0cmluZyA9IDI1NjtcbiAgQElucHV0KCkgbnpIZWlnaHQ6IG51bWJlciB8IHN0cmluZyA9IDI1NjtcbiAgQElucHV0KCkgbnpaSW5kZXggPSAxMDAwO1xuICBASW5wdXQoKSBuek9mZnNldFggPSAwO1xuICBASW5wdXQoKSBuek9mZnNldFkgPSAwO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBuelZpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlzT3BlbiA9IHZhbHVlO1xuICB9XG5cbiAgZ2V0IG56VmlzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc09wZW47XG4gIH1cblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPblZpZXdJbml0ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgcmVhZG9ubHkgbnpPbkNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcjxNb3VzZUV2ZW50PigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2RyYXdlclRlbXBsYXRlJywgeyBzdGF0aWM6IHRydWUgfSkgZHJhd2VyVGVtcGxhdGU6IFRlbXBsYXRlUmVmPHZvaWQ+O1xuICBAVmlld0NoaWxkKENka1BvcnRhbE91dGxldCwgeyBzdGF0aWM6IGZhbHNlIH0pIGJvZHlQb3J0YWxPdXRsZXQ6IENka1BvcnRhbE91dGxldDtcblxuICBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByZXZpb3VzbHlGb2N1c2VkRWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gIHBsYWNlbWVudENoYW5naW5nID0gZmFsc2U7XG4gIHBsYWNlbWVudENoYW5nZVRpbWVvdXRJZCA9IC0xO1xuICBuekNvbnRlbnRQYXJhbXM6IEQ7IC8vIG9ubHkgc2VydmljZVxuICBvdmVybGF5UmVmOiBPdmVybGF5UmVmIHwgbnVsbDtcbiAgcG9ydGFsOiBUZW1wbGF0ZVBvcnRhbDtcbiAgZm9jdXNUcmFwOiBGb2N1c1RyYXA7XG4gIGlzT3BlbiA9IGZhbHNlO1xuICB0ZW1wbGF0ZUNvbnRleHQ6IHsgJGltcGxpY2l0OiBEIHwgdW5kZWZpbmVkOyBkcmF3ZXJSZWY6IE56RHJhd2VyUmVmPFI+IH0gPSB7XG4gICAgJGltcGxpY2l0OiB1bmRlZmluZWQsXG4gICAgZHJhd2VyUmVmOiB0aGlzIGFzIE56RHJhd2VyUmVmPFI+XG4gIH07XG5cbiAgZ2V0IG9mZnNldFRyYW5zZm9ybSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuaXNPcGVuIHx8IHRoaXMubnpPZmZzZXRYICsgdGhpcy5uek9mZnNldFkgPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBzd2l0Y2ggKHRoaXMubnpQbGFjZW1lbnQpIHtcbiAgICAgIGNhc2UgJ2xlZnQnOlxuICAgICAgICByZXR1cm4gYHRyYW5zbGF0ZVgoJHt0aGlzLm56T2Zmc2V0WH1weClgO1xuICAgICAgY2FzZSAncmlnaHQnOlxuICAgICAgICByZXR1cm4gYHRyYW5zbGF0ZVgoLSR7dGhpcy5uek9mZnNldFh9cHgpYDtcbiAgICAgIGNhc2UgJ3RvcCc6XG4gICAgICAgIHJldHVybiBgdHJhbnNsYXRlWSgke3RoaXMubnpPZmZzZXRZfXB4KWA7XG4gICAgICBjYXNlICdib3R0b20nOlxuICAgICAgICByZXR1cm4gYHRyYW5zbGF0ZVkoLSR7dGhpcy5uek9mZnNldFl9cHgpYDtcbiAgICB9XG4gIH1cblxuICBnZXQgdHJhbnNmb3JtKCk6IHN0cmluZyB8IG51bGwge1xuICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0aGlzLm56UGxhY2VtZW50KSB7XG4gICAgICBjYXNlICdsZWZ0JzpcbiAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGVYKC0xMDAlKWA7XG4gICAgICBjYXNlICdyaWdodCc6XG4gICAgICAgIHJldHVybiBgdHJhbnNsYXRlWCgxMDAlKWA7XG4gICAgICBjYXNlICd0b3AnOlxuICAgICAgICByZXR1cm4gYHRyYW5zbGF0ZVkoLTEwMCUpYDtcbiAgICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICAgIHJldHVybiBgdHJhbnNsYXRlWSgxMDAlKWA7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHdpZHRoKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmlzTGVmdE9yUmlnaHQgPyB0b0Nzc1BpeGVsKHRoaXMubnpXaWR0aCkgOiBudWxsO1xuICB9XG5cbiAgZ2V0IGhlaWdodCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gIXRoaXMuaXNMZWZ0T3JSaWdodCA/IHRvQ3NzUGl4ZWwodGhpcy5uekhlaWdodCkgOiBudWxsO1xuICB9XG5cbiAgZ2V0IGlzTGVmdE9yUmlnaHQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubnpQbGFjZW1lbnQgPT09ICdsZWZ0JyB8fCB0aGlzLm56UGxhY2VtZW50ID09PSAncmlnaHQnO1xuICB9XG5cbiAgbnpBZnRlck9wZW4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBuekFmdGVyQ2xvc2UgPSBuZXcgU3ViamVjdDxSPigpO1xuXG4gIGdldCBhZnRlck9wZW4oKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMubnpBZnRlck9wZW4uYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBnZXQgYWZ0ZXJDbG9zZSgpOiBPYnNlcnZhYmxlPFI+IHtcbiAgICByZXR1cm4gdGhpcy5uekFmdGVyQ2xvc2UuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBpc1RlbXBsYXRlUmVmKHZhbHVlOiB7fSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFRlbXBsYXRlUmVmO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogTnpTYWZlQW55LFxuICAgIHB1YmxpYyBuekNvbmZpZ1NlcnZpY2U6IE56Q29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBvdmVybGF5OiBPdmVybGF5LFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgZm9jdXNUcmFwRmFjdG9yeTogRm9jdXNUcmFwRmFjdG9yeSxcbiAgICBwcml2YXRlIHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYsXG4gICAgcHJpdmF0ZSBvdmVybGF5S2V5Ym9hcmREaXNwYXRjaGVyOiBPdmVybGF5S2V5Ym9hcmREaXNwYXRjaGVyXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmF0dGFjaE92ZXJsYXkoKTtcbiAgICB0aGlzLnVwZGF0ZU92ZXJsYXlTdHlsZSgpO1xuICAgIHRoaXMudXBkYXRlQm9keU92ZXJmbG93KCk7XG4gICAgdGhpcy50ZW1wbGF0ZUNvbnRleHQgPSB7ICRpbXBsaWNpdDogdGhpcy5uekNvbnRlbnRQYXJhbXMsIGRyYXdlclJlZjogdGhpcyBhcyBOekRyYXdlclJlZjxSPiB9O1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuYXR0YWNoQm9keUNvbnRlbnQoKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubnpPblZpZXdJbml0LmVtaXQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBjb25zdCB7IG56UGxhY2VtZW50LCBuelZpc2libGUgfSA9IGNoYW5nZXM7XG4gICAgaWYgKG56VmlzaWJsZSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBjaGFuZ2VzLm56VmlzaWJsZS5jdXJyZW50VmFsdWU7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChuelBsYWNlbWVudCAmJiAhbnpQbGFjZW1lbnQuaXNGaXJzdENoYW5nZSgpKSB7XG4gICAgICB0aGlzLnRyaWdnZXJQbGFjZW1lbnRDaGFuZ2VDeWNsZU9uY2UoKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMucGxhY2VtZW50Q2hhbmdlVGltZW91dElkKTtcbiAgICB0aGlzLmRpc3Bvc2VPdmVybGF5KCk