UNPKG

@angular-mdl/core

Version:

Angular components, directives and styles based on material design lite https://getmdl.io.

171 lines 28.5 kB
import { Component, ElementRef, forwardRef, HostBinding, Inject, NgZone, Renderer2, ViewChild, ViewContainerRef, ViewEncapsulation, } from "@angular/core"; import { MDL_CONFIGUARTION, MIN_DIALOG_Z_INDEX } from "./config"; import { MdlButtonComponent } from "../button/mdl-button.component"; import { InternalMdlDialogReference } from "./internal-dialog-reference"; import { Animations } from "../common/animations"; import * as i0 from "@angular/core"; import * as i1 from "../common/animations"; import * as i2 from "./internal-dialog-reference"; const enterTransitionDuration = 300; const leaveTransitionDuration = 250; const enterTransitionEasingCurve = "cubic-bezier(0.0, 0.0, 0.2, 1)"; const leaveTransitionEasingCurve = "cubic-bezier(0.0, 0.0, 0.2, 1)"; const createOpenCloseRect = (rect) => ({ height: rect.top - rect.bottom, left: rect.left, top: rect.top, width: rect.right - rect.left, }); const getCenterInScreen = (rect) => ({ cx: Math.round(rect.left + rect.width / 2), cy: Math.round(rect.top + rect.height / 2), }); const getClientRect = (input) => { if (input instanceof MdlButtonComponent) { const elRef = input.elementRef; const rect = elRef.nativeElement.getBoundingClientRect(); return createOpenCloseRect(rect); } else if (input instanceof MouseEvent) { const evt = input; // just to make it possible to test this code with a fake event - target is // readonly and con not be mutated. // eslint-disable-next-line const htmlElement = (evt.target || evt.testtarget); const rect = htmlElement.getBoundingClientRect(); return createOpenCloseRect(rect); } return input; }; // @experimental export class MdlDialogHostComponent { constructor(ngZone, renderer, animations, elementRef, config, internalDialogRef) { this.ngZone = ngZone; this.renderer = renderer; this.animations = animations; this.elementRef = elementRef; this.config = config; this.internalDialogRef = internalDialogRef; this.isDialog = true; this.visible = false; this.zIndex = MIN_DIALOG_Z_INDEX + 1; this.showAnimationStartStyle = { top: "38%", opacity: "0", }; this.showStyle = { top: "50%", opacity: "1", }; this.hideAnimationEndStyle = { top: "63%", opacity: "0", }; } show() { this.visible = true; // give the dialogs time to draw so that a focus can be set setTimeout(() => { this.internalDialogRef.visible(); }); if (this.isAnimateEnabled()) { if (this.config.openFrom || this.config.closeTo) { // transform is modified during anmiation and must be part of each animation keyframe. this.showStyle["transform"] = "translate(0, -50%) scale(1.0)"; const targetClientRect = this.elementRef.nativeElement.getBoundingClientRect(); const openFromRect = getClientRect(this.config?.openFrom); const closeToRect = this.config.closeTo ? getClientRect(this.config.closeTo) : openFromRect; const centerTarget = getCenterInScreen(targetClientRect); const centerFrom = getCenterInScreen(openFromRect); const centerTo = getCenterInScreen(closeToRect); const translationFrom = { x: Math.round(centerFrom.cx - centerTarget.cx), y: Math.round(centerFrom.cy - centerTarget.cy), scaleX: Math.round(100 * Math.min(0.25, openFromRect.width / targetClientRect.width)) / 100, scaleY: Math.round(100 * Math.min(0.25, openFromRect.height / targetClientRect.height)) / 100, }; this.showAnimationStartStyle = { top: `${targetClientRect.top}px`, opacity: "0", transform: `translate(${translationFrom.x}px, ${translationFrom.y}px) scale(${translationFrom.scaleX}, ${translationFrom.scaleY})`, }; const translationTo = { x: Math.round(centerTo.cx - centerTarget.cx), y: Math.round(centerTo.cy - centerTarget.cy), scaleX: Math.round(100 * Math.min(0.25, closeToRect.width / targetClientRect.width)) / 100, scaleY: Math.round(100 * Math.min(0.25, closeToRect.height / targetClientRect.height)) / 100, }; this.hideAnimationEndStyle = { top: `${targetClientRect.top}px`, opacity: "0", transform: `translate(${translationTo.x}px, ${translationTo.y}px) scale(${translationTo.scaleX}, ${translationTo.scaleY})`, }; } const animation = this.animations.animate(this.elementRef.nativeElement, [this.showAnimationStartStyle, this.showStyle], this.config.enterTransitionDuration || enterTransitionDuration, this.config.enterTransitionEasingCurve || enterTransitionEasingCurve); animation.play(); } } hide(selfComponentRef) { if (this.isAnimateEnabled()) { const animation = this.animations.animate(this.elementRef.nativeElement, [this.showStyle, this.hideAnimationEndStyle], this.config.leaveTransitionDuration || leaveTransitionDuration, this.config.leaveTransitionEasingCurve || leaveTransitionEasingCurve); animation.onDone(() => { selfComponentRef.destroy(); }); animation.play(); } else { selfComponentRef.destroy(); } } ngOnInit() { this.applyStyle(this.config.styles); this.applyClasses(this.config.classes ? this.config.classes : ""); } applyStyle(styles) { if (styles) { for (const style of Object.keys(styles)) { this.renderer.setStyle(this.elementRef.nativeElement, style, styles[style]); } } } applyClasses(classes) { classes .split(" ") .filter((cssClass) => !!cssClass) .forEach((cssClass) => { this.renderer.addClass(this.elementRef.nativeElement, cssClass); }); } isAnimateEnabled() { // not present? assume it is true. if (typeof this.config.animate === "undefined") { return true; } return this.config.animate; } } MdlDialogHostComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MdlDialogHostComponent, deps: [{ token: i0.NgZone }, { token: i0.Renderer2 }, { token: i1.Animations }, { token: i0.ElementRef }, { token: forwardRef(() => MDL_CONFIGUARTION) }, { token: i2.InternalMdlDialogReference }], target: i0.ɵɵFactoryTarget.Component }); MdlDialogHostComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: MdlDialogHostComponent, selector: "mdl-dialog-host-component", host: { properties: { "class.mdl-dialog": "this.isDialog", "class.open": "this.visible", "style.zIndex": "this.zIndex" } }, viewQueries: [{ propertyName: "dialogTarget", first: true, predicate: ["dialogTarget"], descendants: true, read: ViewContainerRef, static: true }], ngImport: i0, template: ` <div #dialogTarget></div>`, isInline: true, styles: ["mdl-dialog-host-component{width:-moz-fit-content;width:fit-content;height:-moz-fit-content;height:fit-content;padding:1em;background:white;color:#000;opacity:1;visibility:hidden;display:block;position:fixed;margin:auto;left:0;right:0;transition:all;top:50%;transform:translateY(-50%)}mdl-dialog-host-component.open{visibility:visible}\n"], encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MdlDialogHostComponent, decorators: [{ type: Component, args: [{ selector: "mdl-dialog-host-component", template: ` <div #dialogTarget></div>`, encapsulation: ViewEncapsulation.None, styles: ["mdl-dialog-host-component{width:-moz-fit-content;width:fit-content;height:-moz-fit-content;height:fit-content;padding:1em;background:white;color:#000;opacity:1;visibility:hidden;display:block;position:fixed;margin:auto;left:0;right:0;transition:all;top:50%;transform:translateY(-50%)}mdl-dialog-host-component.open{visibility:visible}\n"] }] }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i0.Renderer2 }, { type: i1.Animations }, { type: i0.ElementRef }, { type: undefined, decorators: [{ type: Inject, args: [forwardRef(() => MDL_CONFIGUARTION)] }] }, { type: i2.InternalMdlDialogReference }]; }, propDecorators: { dialogTarget: [{ type: ViewChild, args: ["dialogTarget", { read: ViewContainerRef, static: true }] }], isDialog: [{ type: HostBinding, args: ["class.mdl-dialog"] }], visible: [{ type: HostBinding, args: ["class.open"] }], zIndex: [{ type: HostBinding, args: ["style.zIndex"] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRsLWRpYWxvZy1ob3N0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9kaWFsb2cvbWRsLWRpYWxvZy1ob3N0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFVBQVUsRUFDVixVQUFVLEVBQ1YsV0FBVyxFQUNYLE1BQU0sRUFDTixNQUFNLEVBRU4sU0FBUyxFQUNULFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsaUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUtqRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUN6RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFFbEQsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFDcEMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFFcEMsTUFBTSwwQkFBMEIsR0FBRyxnQ0FBZ0MsQ0FBQztBQUNwRSxNQUFNLDBCQUEwQixHQUFHLGdDQUFnQyxDQUFDO0FBRXBFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxJQUFnQixFQUFrQixFQUFFLENBQUMsQ0FBQztJQUNqRSxNQUFNLEVBQUUsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTTtJQUM5QixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7SUFDZixHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUc7SUFDYixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSTtDQUM5QixDQUFDLENBQUM7QUFFSCxNQUFNLGlCQUFpQixHQUFHLENBQUMsSUFBb0IsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNuRCxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQzFDLEVBQUUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7Q0FDM0MsQ0FBQyxDQUFDO0FBRUgsTUFBTSxhQUFhLEdBQUcsQ0FDcEIsS0FBbUUsRUFDbkQsRUFBRTtJQUNsQixJQUFJLEtBQUssWUFBWSxrQkFBa0IsRUFBRTtRQUN2QyxNQUFNLEtBQUssR0FBSSxLQUE0QixDQUFDLFVBQVUsQ0FBQztRQUN2RCxNQUFNLElBQUksR0FBZSxLQUFLLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDckUsT0FBTyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNsQztTQUFNLElBQUksS0FBSyxZQUFZLFVBQVUsRUFBRTtRQUN0QyxNQUFNLEdBQUcsR0FBZSxLQUFtQixDQUFDO1FBQzVDLDJFQUEyRTtRQUMzRSxtQ0FBbUM7UUFDbkMsMkJBQTJCO1FBQzNCLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sSUFBSyxHQUFXLENBQUMsVUFBVSxDQUFnQixDQUFDO1FBQzNFLE1BQU0sSUFBSSxHQUFlLFdBQVcsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdELE9BQU8sbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbEM7SUFDRCxPQUFPLEtBQXVCLENBQUM7QUFDakMsQ0FBQyxDQUFDO0FBRUYsZ0JBQWdCO0FBK0JoQixNQUFNLE9BQU8sc0JBQXNCO0lBMEJqQyxZQUNVLE1BQWMsRUFDZCxRQUFtQixFQUNuQixVQUFzQixFQUN0QixVQUFzQixFQUV0QixNQUErQixFQUMvQixpQkFBNkM7UUFON0MsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBRXRCLFdBQU0sR0FBTixNQUFNLENBQXlCO1FBQy9CLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBNEI7UUE1QnZELGFBQVEsR0FBRyxJQUFJLENBQUM7UUFHaEIsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUdoQixXQUFNLEdBQVcsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO1FBRWhDLDRCQUF1QixHQUE4QjtZQUMzRCxHQUFHLEVBQUUsS0FBSztZQUNWLE9BQU8sRUFBRSxHQUFHO1NBQ2IsQ0FBQztRQUNNLGNBQVMsR0FBOEI7WUFDN0MsR0FBRyxFQUFFLEtBQUs7WUFDVixPQUFPLEVBQUUsR0FBRztTQUNiLENBQUM7UUFDTSwwQkFBcUIsR0FBOEI7WUFDekQsR0FBRyxFQUFFLEtBQUs7WUFDVixPQUFPLEVBQUUsR0FBRztTQUNiLENBQUM7SUFVQyxDQUFDO0lBRUosSUFBSTtRQUNGLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLDJEQUEyRDtRQUMzRCxVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25DLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRTtZQUMzQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFO2dCQUMvQyxzRkFBc0Y7Z0JBQ3RGLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEdBQUcsK0JBQStCLENBQUM7Z0JBRTlELE1BQU0sZ0JBQWdCLEdBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLHFCQUFxQixFQUFFLENBQUM7Z0JBRXhELE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUMxRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87b0JBQ3JDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7b0JBQ3BDLENBQUMsQ0FBQyxZQUFZLENBQUM7Z0JBRWpCLE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQ3pELE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO2dCQUNuRCxNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFFaEQsTUFBTSxlQUFlLEdBQUc7b0JBQ3RCLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLEVBQUUsQ0FBQztvQkFDOUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsRUFBRSxDQUFDO29CQUM5QyxNQUFNLEVBQ0osSUFBSSxDQUFDLEtBQUssQ0FDUixHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FDbEUsR0FBRyxHQUFHO29CQUNULE1BQU0sRUFDSixJQUFJLENBQUMsS0FBSyxDQUNSLEdBQUc7d0JBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLE1BQU0sR0FBRyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FDaEUsR0FBRyxHQUFHO2lCQUNWLENBQUM7Z0JBRUYsSUFBSSxDQUFDLHVCQUF1QixHQUFHO29CQUM3QixHQUFHLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLElBQUk7b0JBQ2hDLE9BQU8sRUFBRSxHQUFHO29CQUNaLFNBQVMsRUFBRSxhQUFhLGVBQWUsQ0FBQyxDQUFDLE9BQU8sZUFBZSxDQUFDLENBQUMsYUFBYSxlQUFlLENBQUMsTUFBTSxLQUFLLGVBQWUsQ0FBQyxNQUFNLEdBQUc7aUJBQ25JLENBQUM7Z0JBRUYsTUFBTSxhQUFhLEdBQUc7b0JBQ3BCLENBQUMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsWUFBWSxDQUFDLEVBQUUsQ0FBQztvQkFDNUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxZQUFZLENBQUMsRUFBRSxDQUFDO29CQUM1QyxNQUFNLEVBQ0osSUFBSSxDQUFDLEtBQUssQ0FDUixHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FDakUsR0FBRyxHQUFHO29CQUNULE1BQU0sRUFDSixJQUFJLENBQUMsS0FBSyxDQUNSLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsTUFBTSxHQUFHLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUNuRSxHQUFHLEdBQUc7aUJBQ1YsQ0FBQztnQkFFRixJQUFJLENBQUMscUJBQXFCLEdBQUc7b0JBQzNCLEdBQUcsRUFBRSxHQUFHLGdCQUFnQixDQUFDLEdBQUcsSUFBSTtvQkFDaEMsT0FBTyxFQUFFLEdBQUc7b0JBQ1osU0FBUyxFQUFFLGFBQWEsYUFBYSxDQUFDLENBQUMsT0FBTyxhQUFhLENBQUMsQ0FBQyxhQUFhLGFBQWEsQ0FBQyxNQUFNLEtBQUssYUFBYSxDQUFDLE1BQU0sR0FBRztpQkFDM0gsQ0FBQzthQUNIO1lBRUQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQ3ZDLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUM3QixDQUFDLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsdUJBQXVCLElBQUksdUJBQXVCLEVBQzlELElBQUksQ0FBQyxNQUFNLENBQUMsMEJBQTBCLElBQUksMEJBQTBCLENBQ3JFLENBQUM7WUFFRixTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDbEI7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLGdCQUFzRDtRQUN6RCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFO1lBQzNCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUN2QyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsRUFDN0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxFQUM1QyxJQUFJLENBQUMsTUFBTSxDQUFDLHVCQUF1QixJQUFJLHVCQUF1QixFQUM5RCxJQUFJLENBQUMsTUFBTSxDQUFDLDBCQUEwQixJQUFJLDBCQUEwQixDQUNyRSxDQUFDO1lBRUYsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ3BCLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzdCLENBQUMsQ0FBQyxDQUFDO1lBRUgsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ2xCO2FBQU07WUFDTCxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUM1QjtJQUNILENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRU8sVUFBVSxDQUFDLE1BQTJDO1FBQzVELElBQUksTUFBTSxFQUFFO1lBQ1YsS0FBSyxNQUFNLEtBQUssSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FDcEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQzdCLEtBQUssRUFDTCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQ2QsQ0FBQzthQUNIO1NBQ0Y7SUFDSCxDQUFDO0lBRU8sWUFBWSxDQUFDLE9BQWU7UUFDbEMsT0FBTzthQUNKLEtBQUssQ0FBQyxHQUFHLENBQUM7YUFDVixNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7YUFDaEMsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbEUsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLG1DQUFtQztRQUNuQyxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEtBQUssV0FBVyxFQUFFO1lBQzlDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFDRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQzdCLENBQUM7O21IQWxLVSxzQkFBc0IscUhBK0J2QixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQUM7dUdBL0JsQyxzQkFBc0Isc1JBQ0UsZ0JBQWdCLDJDQTdCekMsNEJBQTRCOzJGQTRCM0Isc0JBQXNCO2tCQTlCbEMsU0FBUzsrQkFDRSwyQkFBMkIsWUFDM0IsNEJBQTRCLGlCQTBCdkIsaUJBQWlCLENBQUMsSUFBSTs7MEJBaUNsQyxNQUFNOzJCQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQztxRkE3QjdDLFlBQVk7c0JBRFgsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJbkUsUUFBUTtzQkFEUCxXQUFXO3VCQUFDLGtCQUFrQjtnQkFJL0IsT0FBTztzQkFETixXQUFXO3VCQUFDLFlBQVk7Z0JBSXpCLE1BQU07c0JBREwsV0FBVzt1QkFBQyxjQUFjIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBDb21wb25lbnRSZWYsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBJbmplY3QsXG4gIE5nWm9uZSxcbiAgT25Jbml0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbmltcG9ydCB7IE1ETF9DT05GSUdVQVJUSU9OLCBNSU5fRElBTE9HX1pfSU5ERVggfSBmcm9tIFwiLi9jb25maWdcIjtcbmltcG9ydCB7XG4gIElNZGxEaWFsb2dDb25maWd1cmF0aW9uLFxuICBJT3BlbkNsb3NlUmVjdCxcbn0gZnJvbSBcIi4vbWRsLWRpYWxvZy1jb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgeyBNZGxCdXR0b25Db21wb25lbnQgfSBmcm9tIFwiLi4vYnV0dG9uL21kbC1idXR0b24uY29tcG9uZW50XCI7XG5pbXBvcnQgeyBJbnRlcm5hbE1kbERpYWxvZ1JlZmVyZW5jZSB9IGZyb20gXCIuL2ludGVybmFsLWRpYWxvZy1yZWZlcmVuY2VcIjtcbmltcG9ydCB7IEFuaW1hdGlvbnMgfSBmcm9tIFwiLi4vY29tbW9uL2FuaW1hdGlvbnNcIjtcblxuY29uc3QgZW50ZXJUcmFuc2l0aW9uRHVyYXRpb24gPSAzMDA7XG5jb25zdCBsZWF2ZVRyYW5zaXRpb25EdXJhdGlvbiA9IDI1MDtcblxuY29uc3QgZW50ZXJUcmFuc2l0aW9uRWFzaW5nQ3VydmUgPSBcImN1YmljLWJlemllcigwLjAsIDAuMCwgMC4yLCAxKVwiO1xuY29uc3QgbGVhdmVUcmFuc2l0aW9uRWFzaW5nQ3VydmUgPSBcImN1YmljLWJlemllcigwLjAsIDAuMCwgMC4yLCAxKVwiO1xuXG5jb25zdCBjcmVhdGVPcGVuQ2xvc2VSZWN0ID0gKHJlY3Q6IENsaWVudFJlY3QpOiBJT3BlbkNsb3NlUmVjdCA9PiAoe1xuICBoZWlnaHQ6IHJlY3QudG9wIC0gcmVjdC5ib3R0b20sXG4gIGxlZnQ6IHJlY3QubGVmdCxcbiAgdG9wOiByZWN0LnRvcCxcbiAgd2lkdGg6IHJlY3QucmlnaHQgLSByZWN0LmxlZnQsXG59KTtcblxuY29uc3QgZ2V0Q2VudGVySW5TY3JlZW4gPSAocmVjdDogSU9wZW5DbG9zZVJlY3QpID0+ICh7XG4gIGN4OiBNYXRoLnJvdW5kKHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyAyKSxcbiAgY3k6IE1hdGgucm91bmQocmVjdC50b3AgKyByZWN0LmhlaWdodCAvIDIpLFxufSk7XG5cbmNvbnN0IGdldENsaWVudFJlY3QgPSAoXG4gIGlucHV0OiBNZGxCdXR0b25Db21wb25lbnQgfCBNb3VzZUV2ZW50IHwgSU9wZW5DbG9zZVJlY3QgfCB1bmRlZmluZWRcbik6IElPcGVuQ2xvc2VSZWN0ID0+IHtcbiAgaWYgKGlucHV0IGluc3RhbmNlb2YgTWRsQnV0dG9uQ29tcG9uZW50KSB7XG4gICAgY29uc3QgZWxSZWYgPSAoaW5wdXQgYXMgTWRsQnV0dG9uQ29tcG9uZW50KS5lbGVtZW50UmVmO1xuICAgIGNvbnN0IHJlY3Q6IENsaWVudFJlY3QgPSBlbFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiBjcmVhdGVPcGVuQ2xvc2VSZWN0KHJlY3QpO1xuICB9IGVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgTW91c2VFdmVudCkge1xuICAgIGNvbnN0IGV2dDogTW91c2VFdmVudCA9IGlucHV0IGFzIE1vdXNlRXZlbnQ7XG4gICAgLy8ganVzdCB0byBtYWtlIGl0IHBvc3NpYmxlIHRvIHRlc3QgdGhpcyBjb2RlIHdpdGggYSBmYWtlIGV2ZW50IC0gdGFyZ2V0IGlzXG4gICAgLy8gcmVhZG9ubHkgYW5kIGNvbiBub3QgYmUgbXV0YXRlZC5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICBjb25zdCBodG1sRWxlbWVudCA9IChldnQudGFyZ2V0IHx8IChldnQgYXMgYW55KS50ZXN0dGFyZ2V0KSBhcyBIVE1MRWxlbWVudDtcbiAgICBjb25zdCByZWN0OiBDbGllbnRSZWN0ID0gaHRtbEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgcmV0dXJuIGNyZWF0ZU9wZW5DbG9zZVJlY3QocmVjdCk7XG4gIH1cbiAgcmV0dXJuIGlucHV0IGFzIElPcGVuQ2xvc2VSZWN0O1xufTtcblxuLy8gQGV4cGVyaW1lbnRhbFxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcIm1kbC1kaWFsb2ctaG9zdC1jb21wb25lbnRcIixcbiAgdGVtcGxhdGU6IGAgPGRpdiAjZGlhbG9nVGFyZ2V0PjwvZGl2PmAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIG1kbC1kaWFsb2ctaG9zdC1jb21wb25lbnQge1xuICAgICAgICB3aWR0aDogZml0LWNvbnRlbnQ7XG4gICAgICAgIGhlaWdodDogZml0LWNvbnRlbnQ7XG4gICAgICAgIHBhZGRpbmc6IDFlbTtcbiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7XG4gICAgICAgIGNvbG9yOiBibGFjaztcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgICBtYXJnaW46IGF1dG87XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICB0cmFuc2l0aW9uOiBhbGw7XG4gICAgICAgIHRvcDogNTAlO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAtNTAlKTtcbiAgICAgIH1cblxuICAgICAgbWRsLWRpYWxvZy1ob3N0LWNvbXBvbmVudC5vcGVuIHtcbiAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBNZGxEaWFsb2dIb3N0Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQFZpZXdDaGlsZChcImRpYWxvZ1RhcmdldFwiLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICBkaWFsb2dUYXJnZXQ6IFZpZXdDb250YWluZXJSZWYgfCB1bmRlZmluZWQ7XG5cbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3MubWRsLWRpYWxvZ1wiKVxuICBpc0RpYWxvZyA9IHRydWU7XG5cbiAgQEhvc3RCaW5kaW5nKFwiY2xhc3Mub3BlblwiKVxuICB2aXNpYmxlID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKFwic3R5bGUuekluZGV4XCIpXG4gIHpJbmRleDogbnVtYmVyID0gTUlOX0RJQUxPR19aX0lOREVYICsgMTtcblxuICBwcml2YXRlIHNob3dBbmltYXRpb25TdGFydFN0eWxlOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIHRvcDogXCIzOCVcIixcbiAgICBvcGFjaXR5OiBcIjBcIixcbiAgfTtcbiAgcHJpdmF0ZSBzaG93U3R5bGU6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XG4gICAgdG9wOiBcIjUwJVwiLFxuICAgIG9wYWNpdHk6IFwiMVwiLFxuICB9O1xuICBwcml2YXRlIGhpZGVBbmltYXRpb25FbmRTdHlsZTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICB0b3A6IFwiNjMlXCIsXG4gICAgb3BhY2l0eTogXCIwXCIsXG4gIH07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXG4gICAgcHJpdmF0ZSBhbmltYXRpb25zOiBBbmltYXRpb25zLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcbiAgICBASW5qZWN0KGZvcndhcmRSZWYoKCkgPT4gTURMX0NPTkZJR1VBUlRJT04pKVxuICAgIHByaXZhdGUgY29uZmlnOiBJTWRsRGlhbG9nQ29uZmlndXJhdGlvbixcbiAgICBwcml2YXRlIGludGVybmFsRGlhbG9nUmVmOiBJbnRlcm5hbE1kbERpYWxvZ1JlZmVyZW5jZVxuICApIHt9XG5cbiAgc2hvdygpOiB2b2lkIHtcbiAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xuICAgIC8vIGdpdmUgdGhlIGRpYWxvZ3MgdGltZSB0byBkcmF3IHNvIHRoYXQgYSBmb2N1cyBjYW4gYmUgc2V0XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmludGVybmFsRGlhbG9nUmVmLnZpc2libGUoKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLmlzQW5pbWF0ZUVuYWJsZWQoKSkge1xuICAgICAgaWYgKHRoaXMuY29uZmlnLm9wZW5Gcm9tIHx8IHRoaXMuY29uZmlnLmNsb3NlVG8pIHtcbiAgICAgICAgLy8gdHJhbnNmb3JtIGlzIG1vZGlmaWVkIGR1cmluZyBhbm1pYXRpb24gYW5kIG11c3QgYmUgcGFydCBvZiBlYWNoIGFuaW1hdGlvbiBrZXlmcmFtZS5cbiAgICAgICAgdGhpcy5zaG93U3R5bGVbXCJ0cmFuc2Zvcm1cIl0gPSBcInRyYW5zbGF0ZSgwLCAtNTAlKSBzY2FsZSgxLjApXCI7XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0Q2xpZW50UmVjdCA9XG4gICAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgY29uc3Qgb3BlbkZyb21SZWN0ID0gZ2V0Q2xpZW50UmVjdCh0aGlzLmNvbmZpZz8ub3BlbkZyb20pO1xuICAgICAgICBjb25zdCBjbG9zZVRvUmVjdCA9IHRoaXMuY29uZmlnLmNsb3NlVG9cbiAgICAgICAgICA/IGdldENsaWVudFJlY3QodGhpcy5jb25maWcuY2xvc2VUbylcbiAgICAgICAgICA6IG9wZW5Gcm9tUmVjdDtcblxuICAgICAgICBjb25zdCBjZW50ZXJUYXJnZXQgPSBnZXRDZW50ZXJJblNjcmVlbih0YXJnZXRDbGllbnRSZWN0KTtcbiAgICAgICAgY29uc3QgY2VudGVyRnJvbSA9IGdldENlbnRlckluU2NyZWVuKG9wZW5Gcm9tUmVjdCk7XG4gICAgICAgIGNvbnN0IGNlbnRlclRvID0gZ2V0Q2VudGVySW5TY3JlZW4oY2xvc2VUb1JlY3QpO1xuXG4gICAgICAgIGNvbnN0IHRyYW5zbGF0aW9uRnJvbSA9IHtcbiAgICAgICAgICB4OiBNYXRoLnJvdW5kKGNlbnRlckZyb20uY3ggLSBjZW50ZXJUYXJnZXQuY3gpLFxuICAgICAgICAgIHk6IE1hdGgucm91bmQoY2VudGVyRnJvbS5jeSAtIGNlbnRlclRhcmdldC5jeSksXG4gICAgICAgICAgc2NhbGVYOlxuICAgICAgICAgICAgTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgMTAwICogTWF0aC5taW4oMC4yNSwgb3BlbkZyb21SZWN0LndpZHRoIC8gdGFyZ2V0Q2xpZW50UmVjdC53aWR0aClcbiAgICAgICAgICAgICkgLyAxMDAsXG4gICAgICAgICAgc2NhbGVZOlxuICAgICAgICAgICAgTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgMTAwICpcbiAgICAgICAgICAgICAgICBNYXRoLm1pbigwLjI1LCBvcGVuRnJvbVJlY3QuaGVpZ2h0IC8gdGFyZ2V0Q2xpZW50UmVjdC5oZWlnaHQpXG4gICAgICAgICAgICApIC8gMTAwLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc2hvd0FuaW1hdGlvblN0YXJ0U3R5bGUgPSB7XG4gICAgICAgICAgdG9wOiBgJHt0YXJnZXRDbGllbnRSZWN0LnRvcH1weGAsXG4gICAgICAgICAgb3BhY2l0eTogXCIwXCIsXG4gICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlKCR7dHJhbnNsYXRpb25Gcm9tLnh9cHgsICR7dHJhbnNsYXRpb25Gcm9tLnl9cHgpIHNjYWxlKCR7dHJhbnNsYXRpb25Gcm9tLnNjYWxlWH0sICR7dHJhbnNsYXRpb25Gcm9tLnNjYWxlWX0pYCxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB0cmFuc2xhdGlvblRvID0ge1xuICAgICAgICAgIHg6IE1hdGgucm91bmQoY2VudGVyVG8uY3ggLSBjZW50ZXJUYXJnZXQuY3gpLFxuICAgICAgICAgIHk6IE1hdGgucm91bmQoY2VudGVyVG8uY3kgLSBjZW50ZXJUYXJnZXQuY3kpLFxuICAgICAgICAgIHNjYWxlWDpcbiAgICAgICAgICAgIE1hdGgucm91bmQoXG4gICAgICAgICAgICAgIDEwMCAqIE1hdGgubWluKDAuMjUsIGNsb3NlVG9SZWN0LndpZHRoIC8gdGFyZ2V0Q2xpZW50UmVjdC53aWR0aClcbiAgICAgICAgICAgICkgLyAxMDAsXG4gICAgICAgICAgc2NhbGVZOlxuICAgICAgICAgICAgTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgMTAwICogTWF0aC5taW4oMC4yNSwgY2xvc2VUb1JlY3QuaGVpZ2h0IC8gdGFyZ2V0Q2xpZW50UmVjdC5oZWlnaHQpXG4gICAgICAgICAgICApIC8gMTAwLFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuaGlkZUFuaW1hdGlvbkVuZFN0eWxlID0ge1xuICAgICAgICAgIHRvcDogYCR7dGFyZ2V0Q2xpZW50UmVjdC50b3B9cHhgLFxuICAgICAgICAgIG9wYWNpdHk6IFwiMFwiLFxuICAgICAgICAgIHRyYW5zZm9ybTogYHRyYW5zbGF0ZSgke3RyYW5zbGF0aW9uVG8ueH1weCwgJHt0cmFuc2xhdGlvblRvLnl9cHgpIHNjYWxlKCR7dHJhbnNsYXRpb25Uby5zY2FsZVh9LCAke3RyYW5zbGF0aW9uVG8uc2NhbGVZfSlgLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhbmltYXRpb24gPSB0aGlzLmFuaW1hdGlvbnMuYW5pbWF0ZShcbiAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgIFt0aGlzLnNob3dBbmltYXRpb25TdGFydFN0eWxlLCB0aGlzLnNob3dTdHlsZV0sXG4gICAgICAgIHRoaXMuY29uZmlnLmVudGVyVHJhbnNpdGlvbkR1cmF0aW9uIHx8IGVudGVyVHJhbnNpdGlvbkR1cmF0aW9uLFxuICAgICAgICB0aGlzLmNvbmZpZy5lbnRlclRyYW5zaXRpb25FYXNpbmdDdXJ2ZSB8fCBlbnRlclRyYW5zaXRpb25FYXNpbmdDdXJ2ZVxuICAgICAgKTtcblxuICAgICAgYW5pbWF0aW9uLnBsYXkoKTtcbiAgICB9XG4gIH1cblxuICBoaWRlKHNlbGZDb21wb25lbnRSZWY6IENvbXBvbmVudFJlZjxNZGxEaWFsb2dIb3N0Q29tcG9uZW50Pik6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzQW5pbWF0ZUVuYWJsZWQoKSkge1xuICAgICAgY29uc3QgYW5pbWF0aW9uID0gdGhpcy5hbmltYXRpb25zLmFuaW1hdGUoXG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICBbdGhpcy5zaG93U3R5bGUsIHRoaXMuaGlkZUFuaW1hdGlvbkVuZFN0eWxlXSxcbiAgICAgICAgdGhpcy5jb25maWcubGVhdmVUcmFuc2l0aW9uRHVyYXRpb24gfHwgbGVhdmVUcmFuc2l0aW9uRHVyYXRpb24sXG4gICAgICAgIHRoaXMuY29uZmlnLmxlYXZlVHJhbnNpdGlvbkVhc2luZ0N1cnZlIHx8IGxlYXZlVHJhbnNpdGlvbkVhc2luZ0N1cnZlXG4gICAgICApO1xuXG4gICAgICBhbmltYXRpb24ub25Eb25lKCgpID0+IHtcbiAgICAgICAgc2VsZkNvbXBvbmVudFJlZi5kZXN0cm95KCk7XG4gICAgICB9KTtcblxuICAgICAgYW5pbWF0aW9uLnBsYXkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VsZkNvbXBvbmVudFJlZi5kZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5hcHBseVN0eWxlKHRoaXMuY29uZmlnLnN0eWxlcyk7XG4gICAgdGhpcy5hcHBseUNsYXNzZXModGhpcy5jb25maWcuY2xhc3NlcyA/IHRoaXMuY29uZmlnLmNsYXNzZXMgOiBcIlwiKTtcbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlTdHlsZShzdHlsZXM6IHsgW3A6IHN0cmluZ106IHN0cmluZyB9IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHN0eWxlcykge1xuICAgICAgZm9yIChjb25zdCBzdHlsZSBvZiBPYmplY3Qua2V5cyhzdHlsZXMpKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICAgICAgdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsXG4gICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgc3R5bGVzW3N0eWxlXVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXBwbHlDbGFzc2VzKGNsYXNzZXM6IHN0cmluZykge1xuICAgIGNsYXNzZXNcbiAgICAgIC5zcGxpdChcIiBcIilcbiAgICAgIC5maWx0ZXIoKGNzc0NsYXNzKSA9PiAhIWNzc0NsYXNzKVxuICAgICAgLmZvckVhY2goKGNzc0NsYXNzKSA9PiB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuYWRkQ2xhc3ModGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIGNzc0NsYXNzKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0FuaW1hdGVFbmFibGVkKCkge1xuICAgIC8vIG5vdCBwcmVzZW50PyAgYXNzdW1lIGl0IGlzIHRydWUuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZy5hbmltYXRlID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLmFuaW1hdGU7XG4gIH1cbn1cbiJdfQ==