UNPKG

@microsoft/windows-admin-center-sdk

Version:

Microsoft - Windows Admin Center Shell

469 lines 59 kB
import { __decorate, __metadata } from "tslib"; import { ChangeDetectorRef, Component, ElementRef, HostListener, Injector, Input } from '@angular/core'; import { Debounce } from '@microsoft/windows-admin-center-sdk/core/base/decorators/debounce.decorators'; import { Dom } from '@microsoft/windows-admin-center-sdk/core/dom/dom'; import { Subject } from 'rxjs'; import { CoreBaseComponent } from '../common/base.component'; import * as i0 from "@angular/core"; import * as i1 from "../backdrop/backdrop.component"; import * as i2 from "@angular/common"; import * as i3 from "../tooltip/tooltip.directive"; const _c0 = ["*"]; function DialogComponent_sme_backdrop_0_button_2_Template(rf, ctx) { if (rf & 1) { const _r6 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "button", 8); i0.ɵɵlistener("click", function DialogComponent_sme_backdrop_0_button_2_Template_button_click_0_listener() { i0.ɵɵrestoreView(_r6); const ctx_r5 = i0.ɵɵnextContext(2); return i0.ɵɵresetView(ctx_r5.onCloseClicked()); }); i0.ɵɵelement(1, "span", 9); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(2); i0.ɵɵproperty("title", ctx_r1.strings.MsftSmeShell.Angular.Common.close); i0.ɵɵattribute("aria-label", ctx_r1.strings.MsftSmeShell.Angular.Common.close); } } function DialogComponent_sme_backdrop_0_div_7_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div", 10); i0.ɵɵprojection(1, 2); i0.ɵɵelementEnd(); } } function DialogComponent_sme_backdrop_0_span_8_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "span", 11); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r3 = i0.ɵɵnextContext(2); i0.ɵɵproperty("id", ctx_r3.idBag.ariaLabelSpan); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(ctx_r3.ariaLabel); } } function DialogComponent_sme_backdrop_0_span_9_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "span", 11); i0.ɵɵtext(1); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r4 = i0.ɵɵnextContext(2); i0.ɵɵproperty("id", ctx_r4.idBag.ariaDescriptionSpan); i0.ɵɵadvance(1); i0.ɵɵtextInterpolate(ctx_r4.ariaDescription); } } function DialogComponent_sme_backdrop_0_Template(rf, ctx) { if (rf & 1) { const _r8 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "sme-backdrop", 1); i0.ɵɵlistener("clicked", function DialogComponent_sme_backdrop_0_Template_sme_backdrop_clicked_0_listener() { i0.ɵɵrestoreView(_r8); const ctx_r7 = i0.ɵɵnextContext(); return i0.ɵɵresetView(!!ctx_r7.clickBackdrop ? ctx_r7.onBackgroundClicked() : ""); }); i0.ɵɵelementStart(1, "div", 2); i0.ɵɵtemplate(2, DialogComponent_sme_backdrop_0_button_2_Template, 2, 2, "button", 3); i0.ɵɵelementStart(3, "div", 4); i0.ɵɵprojection(4); i0.ɵɵelementEnd(); i0.ɵɵelementStart(5, "div", 5); i0.ɵɵprojection(6, 1); i0.ɵɵelementEnd(); i0.ɵɵtemplate(7, DialogComponent_sme_backdrop_0_div_7_Template, 2, 0, "div", 6); i0.ɵɵelementEnd(); i0.ɵɵtemplate(8, DialogComponent_sme_backdrop_0_span_8_Template, 2, 2, "span", 7); i0.ɵɵtemplate(9, DialogComponent_sme_backdrop_0_span_9_Template, 2, 2, "span", 7); i0.ɵɵelementEnd(); } if (rf & 2) { const ctx_r0 = i0.ɵɵnextContext(); i0.ɵɵproperty("level", ctx_r0.dialogLevel)("showBackdrop", ctx_r0.showBackdrop)("allowBackgroundInteraction", ctx_r0.allowBackgroundInteraction); i0.ɵɵadvance(1); i0.ɵɵproperty("ngClass", ctx_r0.dialogClasses); i0.ɵɵattribute("role", ctx_r0.dialogRole)("aria-hidden", !ctx_r0.visible)("aria-labelledby", ctx_r0.ariaLabel ? ctx_r0.idBag.ariaLabelSpan : "sme-dialog-title")("aria-describedby", ctx_r0.ariaDescription ? ctx_r0.idBag.ariaDescriptionSpan : "sme-dialog-desc"); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r0.closeButton); i0.ɵɵadvance(5); i0.ɵɵproperty("ngIf", !ctx_r0.hideFooter); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r0.ariaLabel); i0.ɵɵadvance(1); i0.ɵɵproperty("ngIf", ctx_r0.ariaDescription); } } const _c1 = [[["sme-dialog-header"]], [["sme-dialog-content"]], [["sme-dialog-footer"]]]; const _c2 = ["sme-dialog-header", "sme-dialog-content", "sme-dialog-footer"]; /** * * @smeDoc {@label Dialog @id sme-dialog} * * @overview * @file {@filepath ./examples/dialog-overview.md} * * @example {@label Basic Usage @id basic-usage} * @file {@filename component.ts @filepath ./examples/dialog-example.component.ts} * @file {@filename component.html @filepath ./examples/dialog-example.component.html} * * @example {@label Dialog Chain @id dialog-chain} * @file {@filename component.ts @filepath ./examples/dialog-example-dialog-chain.component.ts} * @file {@filename component.html @filepath ./examples/dialog-example-dialog-chain.component.html} * * @example {@label Full Screen Dialog @id full-screen-dialog} * @file {@filename component.ts @filepath ./examples/dialog-example-full-screen-dialog.component.ts} * @file {@filename component.html @filepath ./examples/dialog-example-full-screen-dialog.component.html} * */ export class DialogHeaderComponent { } /** @nocollapse */ DialogHeaderComponent.ɵfac = function DialogHeaderComponent_Factory(t) { return new (t || DialogHeaderComponent)(); }; /** @nocollapse */ DialogHeaderComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: DialogHeaderComponent, selectors: [["sme-dialog-header"]], ngContentSelectors: _c0, decls: 2, vars: 0, consts: [[1, "sme-padding-horizontal-lg", "sme-padding-vertical-sm"]], template: function DialogHeaderComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵprojectionDef(); i0.ɵɵelementStart(0, "div", 0); i0.ɵɵprojection(1); i0.ɵɵelementEnd(); } }, encapsulation: 2 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DialogHeaderComponent, [{ type: Component, args: [{ selector: 'sme-dialog-header', template: '<div class="sme-padding-horizontal-lg sme-padding-vertical-sm"><ng-content></ng-content></div>' }] }], null, null); })(); export class DialogContentComponent { } /** @nocollapse */ DialogContentComponent.ɵfac = function DialogContentComponent_Factory(t) { return new (t || DialogContentComponent)(); }; /** @nocollapse */ DialogContentComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: DialogContentComponent, selectors: [["sme-dialog-content"]], ngContentSelectors: _c0, decls: 1, vars: 0, template: function DialogContentComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵprojectionDef(); i0.ɵɵprojection(0); } }, encapsulation: 2 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DialogContentComponent, [{ type: Component, args: [{ selector: 'sme-dialog-content', template: '<ng-content></ng-content>' }] }], null, null); })(); export class DialogFooterComponent { } /** @nocollapse */ DialogFooterComponent.ɵfac = function DialogFooterComponent_Factory(t) { return new (t || DialogFooterComponent)(); }; /** @nocollapse */ DialogFooterComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: DialogFooterComponent, selectors: [["sme-dialog-footer"]], ngContentSelectors: _c0, decls: 2, vars: 0, consts: [[1, "sme-layout-dialog-footer"]], template: function DialogFooterComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵprojectionDef(); i0.ɵɵelementStart(0, "div", 0); i0.ɵɵprojection(1); i0.ɵɵelementEnd(); } }, encapsulation: 2 }); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DialogFooterComponent, [{ type: Component, args: [{ selector: 'sme-dialog-footer', template: `<div class="sme-layout-dialog-footer"> <ng-content></ng-content></div>` }] }], null, null); })(); export var DialogCloseReason; (function (DialogCloseReason) { DialogCloseReason[DialogCloseReason["SoftDismiss"] = 0] = "SoftDismiss"; DialogCloseReason[DialogCloseReason["CloseButton"] = 1] = "CloseButton"; DialogCloseReason[DialogCloseReason["EscapeKey"] = 2] = "EscapeKey"; DialogCloseReason[DialogCloseReason["CompetingDialog"] = 3] = "CompetingDialog"; })(DialogCloseReason || (DialogCloseReason = {})); export class DialogMode { } DialogMode.pane = 'pane'; DialogMode.widePane = 'wide-pane'; DialogMode.compact = 'compact'; DialogMode.compactSquare = 'compact-square'; DialogMode.fullscreen = 'fullscreen'; DialogMode.centered = 'centered'; DialogMode.centeredMedium = 'centered-medium'; DialogMode.centeredLarge = 'centered-large'; DialogMode.notification = 'notification'; export const modalDialog = 'modal'; export const alertDialog = 'alert'; export class DialogComponent extends CoreBaseComponent { constructor(elementRef, changeDetectorRef, injector) { super(injector); this.elementRef = elementRef; this.changeDetectorRef = changeDetectorRef; this.dialogRole = 'alertdialog'; this.strings = MsftSme.getStrings(); this.dialogLevel = 1; /** * Whether to allow interaction with elements from outside the dialog especially to support the hovering events. */ this.allowBackgroundInteraction = false; /** * Whether to render the dialog background. False to hide the dialog container and make the background transparent. * The background color then will be based on the dialog body. */ this.showBackdrop = true; /** * Whether to hide the dialog footer. */ this.hideFooter = false; /** * Whether to enable the feature of clicking outside of the dialog to close the current dialog. * True means clicking outside the dialog will close the dialog. We want this to be set to false when there are forms in the dialog. */ this.clickBackdrop = true; this.ariaLabel = ''; this.ariaDescription = ''; /** * Dialog types. Mostly used for accessibility. Valid values: * @see modalDialog = 'modal'; * @see alertDialog = "alert"; */ this.dialogType = ''; /** * Flag to determine whether the dialog should have a close button in top right or not */ this.closeButton = false; /** * Compact dialog can be full height when displaying on the right side of the screen. * It can also be displayed in the middle of the screen that needs to be having paddings to each direction. * This compactFullHeight to true will always be 100% height. Otherwise css would control the max height. */ this.compactFullHeight = false; this.doAutoFocus = false; this.isVisible = false; this.mode = DialogMode.pane; // Create closeRequested subject to notify dialogs when a close is requested and how it was requested (DialogCloseReason) this.closeRequested = new Subject(); this.setDialogModeFromInput(); // setup dialog id and idBag this.dialogId = DialogComponent.nextDialogId++; this.idBag = this.createIdBag(); MsftSme.forEachKey(this.idBag, (key) => { this.idBag[key] = `dialog-${this.dialogId.toString()}-${key}`; }); } /** * The source name to use for logging */ get logSourceName() { return 'DialogComponent'; } /** * Sets whether this should be an action pane or a centered dialog * * @deprecated Use dialogMode instead * @param newValue if true, uses a left pane dialog, otherwise a centered dialog */ set actionPane(newValue) { if (newValue) { this.dialogMode = DialogMode.pane; } else { this.dialogMode = DialogMode.centered; } this.setDialogModeFromInput(); } /** * Indicates the dialog mode to use * @see DialogMode */ set dialogMode(mode) { this.mode = mode; } get dialogMode() { return this.mode; } set visible(visible) { this.isVisible = visible; this.doAutoFocus = visible; } get visible() { return this.isVisible; } // document:keyup.escape is used so that a dialog is not closed when trying to close a tooltip onKeyUp() { if (this.visible) { this.onEscapePressed(); } } /** * Angular Life Cycle hook for After View Checked. * When the visibility changes, we are going to focus on the first element that has the autofocus attribute */ ngAfterViewChecked() { if (this.doAutoFocus) { this.autoFocus(); } } /** * Completed the closeRequested subject */ ngOnDestroy() { this.closeRequested.complete(); } /** * Auto focus on first element that is focusable */ autoFocus() { this.doAutoFocus = false; if (this.elementRef.nativeElement) { // If the dialog has a loading wheel, focus first goes to the loading wheel then gets lost. // TO avoid this, we get the parent element or native element of the dialog, then get the first // focusable element in that element const element = this.elementRef.nativeElement.parentElement || this.elementRef.nativeElement; const firstFocusable = Dom.getFirstFocusableDescendent(element); if (firstFocusable) { firstFocusable.focus(); } } } /** * Shows the dialog. */ show() { this.visible = true; } /** * Hides the dialog. */ hide() { this.visible = false; this.changeDetectorRef.detectChanges(); } /** * Notifies closeRequested subscribers that the backdrop has been clicked, requesting a soft dismiss */ onBackgroundClicked() { this.closeRequested.next(DialogCloseReason.SoftDismiss); } /** * Notifies closeRequested subscribers that the close button has been pressed, requesting a close button dismiss */ onCloseClicked() { this.closeRequested.next(DialogCloseReason.CloseButton); } onEscapePressed() { this.closeRequested.next(DialogCloseReason.EscapeKey); } ngOnChanges(changes) { const dialogModeChange = changes['dialogMode']; if (dialogModeChange && dialogModeChange.currentValue) { this.setDialogModeFromInput(); } } /** * The function to update the dialog pane width. This function is only available for dialog mode pane. * @param input The input value to set the dialog pane width to. if pass in undefined, it will reset the width to default. * */ updateDialogPaneWidth(input) { if (this.dialogMode !== DialogMode.pane) { return; } const backDropContainer = this.elementRef.nativeElement.querySelector('sme-backdrop'); if (!backDropContainer) { return; } const dialogPaneContainer = this.elementRef.nativeElement.querySelector('div.sme-layout-dialog-pane'); if (!dialogPaneContainer) { return; } if (input === undefined) { backDropContainer.style.removeProperty('width'); backDropContainer.style.removeProperty('right'); dialogPaneContainer.style.removeProperty('width'); return; } backDropContainer.style.setProperty('width', `${input}px`, 'important'); backDropContainer.style.setProperty('right', `-${input}px`, 'important'); dialogPaneContainer.style.setProperty('width', `${input}px`, 'important'); } setDialogModeFromInput() { const newValue = this.dialogMode.toLowerCase().trim(); const classes = ['sme-layout-absolute', 'sme-scheme-dialog', 'sme-animation-transition-width-xs', 'sme-responsive-dialog']; const commonPaneClasses = ['sme-position-vertical-none', 'sme-position-right-none']; if (newValue === DialogMode.pane) { classes.push(...commonPaneClasses, 'sme-layout-dialog-pane', 'sme-shadow-action-pane'); } else if (newValue === DialogMode.widePane) { classes.push(...commonPaneClasses, 'sme-layout-dialog-wide-pane', 'sme-shadow-action-pane'); } else if (newValue === DialogMode.compact) { classes.push(...commonPaneClasses, 'sme-layout-dialog-compact', 'sme-shadow-action-pane'); if (this.compactFullHeight) { classes.push('sme-layout-dialog-compact-full-height'); } } else if (newValue === DialogMode.compactSquare) { classes.push('sme-position-center', 'sme-layout-dialog-centered', 'sme-layout-dialog-compact-square', 'sme-shadow-dialog'); if (this.compactFullHeight) { classes.push('sme-layout-dialog-compact-full-height'); } } else if (newValue === DialogMode.fullscreen) { classes.push(...commonPaneClasses, 'sme-layout-dialog-fullscreen', 'sme-shadow-action-pane'); } else if (newValue === DialogMode.centered) { classes.push('sme-position-center', 'sme-layout-dialog-centered', 'sme-shadow-dialog'); } else if (newValue === DialogMode.centeredMedium) { classes.push('sme-position-center', 'sme-layout-dialog-centered-medium', 'sme-shadow-dialog'); } else if (newValue === DialogMode.centeredLarge) { classes.push('sme-position-center', 'sme-layout-dialog-centered-large', 'sme-shadow-dialog'); } else if (newValue === DialogMode.notification) { classes.push('sme-position-top-sm', 'sme-position-right-sm', 'sme-layout-dialog-notification', 'sme-shadow-dialog'); } classes.push('sme-arrange-stack-v', 'sme-arrange-overflow-auto'); this.dialogClasses = classes; // accessibility if (this.dialogType) { this.dialogRole = this.dialogType === modalDialog ? 'dialog' : 'alertdialog'; } else { // by default centered dialogs are considered as alerts const alertModes = [DialogMode.centered, DialogMode.centeredLarge, DialogMode.compactSquare]; this.dialogRole = alertModes.some(mode => this.dialogMode === mode) ? 'alertdialog' : 'dialog'; } } /** * Creates the idBag used by this component to store unique element ids. */ createIdBag() { return { ariaLabelSpan: '', ariaDescriptionSpan: '' }; } } /** * Static constant to provide unique ids for each master view */ DialogComponent.nextDialogId = 0; /** @nocollapse */ DialogComponent.ɵfac = function DialogComponent_Factory(t) { return new (t || DialogComponent)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef), i0.ɵɵdirectiveInject(i0.Injector)); }; /** @nocollapse */ DialogComponent.ɵcmp = /** @pureOrBreakMyCode */ i0.ɵɵdefineComponent({ type: DialogComponent, selectors: [["sme-dialog"]], hostBindings: function DialogComponent_HostBindings(rf, ctx) { if (rf & 1) { i0.ɵɵlistener("keyup.escape", function DialogComponent_keyup_escape_HostBindingHandler() { return ctx.onKeyUp(); }, false, i0.ɵɵresolveDocument); } }, inputs: { allowBackgroundInteraction: "allowBackgroundInteraction", showBackdrop: "showBackdrop", hideFooter: "hideFooter", clickBackdrop: "clickBackdrop", ariaLabel: "ariaLabel", ariaDescription: "ariaDescription", actionPane: "actionPane", dialogMode: "dialogMode", dialogType: "dialogType", closeButton: "closeButton", compactFullHeight: "compactFullHeight" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], ngContentSelectors: _c2, decls: 1, vars: 1, consts: [["class", "sme-layout-absolute sme-position-inset-none", 3, "level", "showBackdrop", "allowBackgroundInteraction", "clicked", 4, "ngIf"], [1, "sme-layout-absolute", "sme-position-inset-none", 3, "level", "showBackdrop", "allowBackgroundInteraction", "clicked"], ["aria-modal", "true", 3, "ngClass"], ["class", "sme-button-trigger sme-button-auto-width sme-dialog-close-button", 3, "title", "click", 4, "ngIf"], [1, "sme-position-flex-none", "sme-focus-zone"], [1, "sme-layout-relative", "sme-position-flex-auto", "sme-padding-horizontal-lg", "sme-arrange-overflow-auto-y", "sme-arrange-overflow-hide-x", "sme-focus-zone", "sme-layout-responsive-zone-xs", "sme-dialog-content-wrapper"], ["class", "sme-position-flex-none sme-focus-zone sme-padding-horizontal-lg sme-padding-vertical-sm", 4, "ngIf"], ["class", "sme-screen-reader", 3, "id", 4, "ngIf"], [1, "sme-button-trigger", "sme-button-auto-width", "sme-dialog-close-button", 3, "title", "click"], [1, "sme-icon", "sme-icon-cancel"], [1, "sme-position-flex-none", "sme-focus-zone", "sme-padding-horizontal-lg", "sme-padding-vertical-sm"], [1, "sme-screen-reader", 3, "id"]], template: function DialogComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵprojectionDef(_c1); i0.ɵɵtemplate(0, DialogComponent_sme_backdrop_0_Template, 10, 12, "sme-backdrop", 0); } if (rf & 2) { i0.ɵɵproperty("ngIf", ctx.visible); } }, dependencies: [i1.BackdropComponent, i2.NgClass, i2.NgIf, i3.TooltipDirective], encapsulation: 2 }); __decorate([ Debounce(0), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", void 0) ], DialogComponent.prototype, "autoFocus", null); (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(DialogComponent, [{ type: Component, args: [{ selector: 'sme-dialog', template: "<sme-backdrop *ngIf=\"visible\" [level]=\"dialogLevel\" (clicked)=\"!!clickBackdrop ? onBackgroundClicked() : ''\"\r\n [showBackdrop]=\"showBackdrop\" [allowBackgroundInteraction]=\"allowBackgroundInteraction\"\r\n class=\"sme-layout-absolute sme-position-inset-none\">\r\n <div [ngClass]=\"dialogClasses\" [attr.role]=\"dialogRole\" [attr.aria-hidden]=\"!visible\"\r\n [attr.aria-labelledby]=\"ariaLabel ? idBag.ariaLabelSpan :'sme-dialog-title'\"\r\n [attr.aria-describedby]=\"ariaDescription ? idBag.ariaDescriptionSpan : 'sme-dialog-desc'\" aria-modal=\"true\">\r\n <button *ngIf=\"closeButton\" class=\"sme-button-trigger sme-button-auto-width sme-dialog-close-button\"\r\n (click)=\"onCloseClicked()\" [attr.aria-label]=\"strings.MsftSmeShell.Angular.Common.close\"\r\n [title]=\"strings.MsftSmeShell.Angular.Common.close\">\r\n <span class=\"sme-icon sme-icon-cancel\"></span>\r\n </button>\r\n <div class=\"sme-position-flex-none sme-focus-zone\">\r\n <ng-content select=\"sme-dialog-header\"></ng-content>\r\n </div>\r\n <div class=\"sme-layout-relative sme-position-flex-auto sme-padding-horizontal-lg sme-arrange-overflow-auto-y sme-arrange-overflow-hide-x sme-focus-zone sme-layout-responsive-zone-xs sme-dialog-content-wrapper\">\r\n <ng-content select=\"sme-dialog-content\"></ng-content>\r\n </div>\r\n <div *ngIf=\"!hideFooter\" class=\"sme-position-flex-none sme-focus-zone sme-padding-horizontal-lg sme-padding-vertical-sm\">\r\n <ng-content select=\"sme-dialog-footer\"></ng-content>\r\n </div>\r\n </div>\r\n <span *ngIf=\"ariaLabel\" class=\"sme-screen-reader\" [id]=\"idBag.ariaLabelSpan\">{{ariaLabel}}</span>\r\n <span *ngIf=\"ariaDescription\" class=\"sme-screen-reader\" [id]=\"idBag.ariaDescriptionSpan\">{{ariaDescription}}</span>\r\n</sme-backdrop>\r\n" }] }], function () { return [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.Injector }]; }, { allowBackgroundInteraction: [{ type: Input }], showBackdrop: [{ type: Input }], hideFooter: [{ type: Input }], clickBackdrop: [{ type: Input }], ariaLabel: [{ type: Input }], ariaDescription: [{ type: Input }], actionPane: [{ type: Input }], dialogMode: [{ type: Input }], dialogType: [{ type: Input }], closeButton: [{ type: Input }], compactFullHeight: [{ type: Input }], onKeyUp: [{ type: HostListener, args: ['document:keyup.escape'] }], autoFocus: [] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbG9nLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2FuZ3VsYXIvc3JjL2NvbnRyb2xzL2RpYWxvZy9kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vYW5ndWxhci9zcmMvY29udHJvbHMvZGlhbG9nL2RpYWxvZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixRQUFRLEVBQ1IsS0FBSyxFQUlSLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw4RUFBOEUsQ0FBQztBQUN4RyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDdkUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUvQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7Ozs7Ozs7SUNWekQsaUNBRXNEO0lBRHBELCtLQUFTLGVBQUEsdUJBQWdCLENBQUEsSUFBQztJQUUxQiwwQkFBOEM7SUFDaEQsaUJBQVM7OztJQUZQLHdFQUFtRDtJQUR4Qiw4RUFBNkQ7OztJQVUxRiwrQkFBeUg7SUFDdkgscUJBQW9EO0lBQ3RELGlCQUFNOzs7SUFFUixnQ0FBNkU7SUFBQSxZQUFhO0lBQUEsaUJBQU87OztJQUEvQywrQ0FBMEI7SUFBQyxlQUFhO0lBQWIsc0NBQWE7OztJQUMxRixnQ0FBeUY7SUFBQSxZQUFtQjtJQUFBLGlCQUFPOzs7SUFBM0QscURBQWdDO0lBQUMsZUFBbUI7SUFBbkIsNENBQW1COzs7O0lBdEI5Ryx1Q0FFc0Q7SUFGRiwrS0FBVyx3Q0FBa0IsNEJBQXFCLEdBQUcsRUFBRSxDQUFBLElBQUM7SUFHMUcsOEJBRThHO0lBQzVHLHFGQUlTO0lBQ1QsOEJBQW1EO0lBQ2pELGtCQUFvRDtJQUN0RCxpQkFBTTtJQUNOLDhCQUFrTjtJQUNoTixxQkFBcUQ7SUFDdkQsaUJBQU07SUFDTiwrRUFFTTtJQUNSLGlCQUFNO0lBQ04saUZBQWlHO0lBQ2pHLGlGQUFtSDtJQUNySCxpQkFBZTs7O0lBdkJlLDBDQUFxQixxQ0FBQSxpRUFBQTtJQUc1QyxlQUF5QjtJQUF6Qiw4Q0FBeUI7SUFBQyx5Q0FBd0IsZ0NBQUEsdUZBQUEsbUdBQUE7SUFHNUMsZUFBaUI7SUFBakIseUNBQWlCO0lBV3BCLGVBQWlCO0lBQWpCLHlDQUFpQjtJQUlsQixlQUFlO0lBQWYsdUNBQWU7SUFDZixlQUFxQjtJQUFyQiw2Q0FBcUI7Ozs7QURKOUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFLSCxNQUFNLE9BQU8scUJBQXFCOzs2R0FBckIscUJBQXFCO3VHQUFyQixxQkFBcUI7O1FBRm5CLDhCQUErRDtRQUFBLGtCQUF5QjtRQUFBLGlCQUFNOzt1RkFFaEcscUJBQXFCO2NBSmpDLFNBQVM7ZUFBQztnQkFDUCxRQUFRLEVBQUUsbUJBQW1CO2dCQUM3QixRQUFRLEVBQUUsZ0dBQWdHO2FBQzdHOztBQVFELE1BQU0sT0FBTyxzQkFBc0I7OytHQUF0QixzQkFBc0I7d0dBQXRCLHNCQUFzQjs7UUFGcEIsa0JBQXlCOzt1RkFFM0Isc0JBQXNCO2NBSmxDLFNBQVM7ZUFBQztnQkFDUCxRQUFRLEVBQUUsb0JBQW9CO2dCQUM5QixRQUFRLEVBQUUsMkJBQTJCO2FBQ3hDOztBQVNELE1BQU0sT0FBTyxxQkFBcUI7OzZHQUFyQixxQkFBcUI7dUdBQXJCLHFCQUFxQjs7UUFIbkIsOEJBQXNDO1FBQ2pELGtCQUF5QjtRQUFBLGlCQUFNOzt1RkFFdEIscUJBQXFCO2NBTGpDLFNBQVM7ZUFBQztnQkFDUCxRQUFRLEVBQUUsbUJBQW1CO2dCQUM3QixRQUFRLEVBQUU7b0NBQ3NCO2FBQ25DOztBQUlELE1BQU0sQ0FBTixJQUFZLGlCQUtYO0FBTEQsV0FBWSxpQkFBaUI7SUFDekIsdUVBQWUsQ0FBQTtJQUNmLHVFQUFlLENBQUE7SUFDZixtRUFBYSxDQUFBO0lBQ2IsK0VBQW1CLENBQUE7QUFDdkIsQ0FBQyxFQUxXLGlCQUFpQixLQUFqQixpQkFBaUIsUUFLNUI7QUFFRCxNQUFNLE9BQU8sVUFBVTs7QUFDTCxlQUFJLEdBQUcsTUFBTSxDQUFDO0FBQ2QsbUJBQVEsR0FBRyxXQUFXLENBQUM7QUFDdkIsa0JBQU8sR0FBRyxTQUFTLENBQUM7QUFDcEIsd0JBQWEsR0FBRyxnQkFBZ0IsQ0FBQztBQUNqQyxxQkFBVSxHQUFHLFlBQVksQ0FBQztBQUMxQixtQkFBUSxHQUFHLFVBQVUsQ0FBQztBQUN0Qix5QkFBYyxHQUFHLGlCQUFpQixDQUFDO0FBQ25DLHdCQUFhLEdBQUcsZ0JBQWdCLENBQUM7QUFDakMsdUJBQVksR0FBRyxjQUFjLENBQUM7QUFHaEQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQztBQUNuQyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDO0FBTW5DLE1BQU0sT0FBTyxlQUFnQixTQUFRLGlCQUFpQjtJQXdIbEQsWUFDWSxVQUFzQixFQUN0QixpQkFBb0MsRUFDNUMsUUFBa0I7UUFFbEIsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBSlIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBN0d6QyxlQUFVLEdBQUcsYUFBYSxDQUFDO1FBRTNCLFlBQU8sR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFXLENBQUM7UUFFeEMsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFrQnZCOztXQUVHO1FBQ2EsK0JBQTBCLEdBQUcsS0FBSyxDQUFDO1FBRW5EOzs7V0FHRztRQUNhLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBRXBDOztXQUVHO1FBQ2EsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVuQzs7O1dBR0c7UUFDYSxrQkFBYSxHQUFHLElBQUksQ0FBQztRQUNyQixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ2Ysb0JBQWUsR0FBRyxFQUFFLENBQUM7UUErQnJDOzs7O1dBSUc7UUFDYSxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBRWhDOztXQUVHO1FBQ2EsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFcEM7Ozs7V0FJRztRQUNhLHNCQUFpQixHQUFHLEtBQUssQ0FBQztRQUlsQyxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBaUJ0QixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7UUFFNUIseUhBQXlIO1FBQ3pILElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxPQUFPLEVBQXFCLENBQUM7UUFDdkQsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFFOUIsNEJBQTRCO1FBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcsZUFBZSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBQ25DLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsVUFBVSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQTFJRDs7T0FFRztJQUNILElBQWMsYUFBYTtRQUN2QixPQUFPLGlCQUFpQixDQUFDO0lBQzdCLENBQUM7SUFxREQ7Ozs7O09BS0c7SUFDSCxJQUFvQixVQUFVLENBQUMsUUFBaUI7UUFDNUMsSUFBSSxRQUFRLEVBQUU7WUFDVixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUM7U0FDckM7YUFBTTtZQUNILElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQztTQUN6QztRQUVELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUNXLFVBQVUsQ0FBQyxJQUFZO1FBQzlCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUFFRCxJQUFXLFVBQVU7UUFDakIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ3JCLENBQUM7SUF5QkQsSUFBVyxPQUFPLENBQUMsT0FBZ0I7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUM7UUFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQVcsT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBdUJELDhGQUE4RjtJQUV2RixPQUFPO1FBQ1YsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1NBQzFCO0lBQ0wsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGtCQUFrQjtRQUNyQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ3BCO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksV0FBVztRQUNkLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBRUksU0FBUztRQUNaLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUU7WUFDL0IsMkZBQTJGO1lBQzNGLCtGQUErRjtZQUMvRixvQ0FBb0M7WUFDcEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDO1lBQzdGLE1BQU0sY0FBYyxHQUFHLEdBQUcsQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoRSxJQUFJLGNBQWMsRUFBRTtnQkFDaEIsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQzFCO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxJQUFJO1FBQ1AsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDeEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksSUFBSTtRQUNQLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxtQkFBbUI7UUFDdEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksY0FBYztRQUNqQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM1RCxDQUFDO0lBRU0sZUFBZTtRQUNsQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRU0sV0FBVyxDQUFDLE9BQXNCO1FBQ3JDLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9DLElBQUksZ0JBQWdCLElBQUksZ0JBQWdCLENBQUMsWUFBWSxFQUFFO1lBQ25ELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1NBQ2pDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxxQkFBcUIsQ0FBQyxLQUFhO1FBQ3RDLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQ3JDLE9BQU87U0FDVjtRQUVELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUNwQixPQUFPO1NBQ1Y7UUFFRCxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ3RHLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtZQUN0QixPQUFPO1NBQ1Y7UUFFRCxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDckIsaUJBQWlCLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNoRCxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELG1CQUFtQixDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEQsT0FBTztTQUNWO1FBRUQsaUJBQWlCLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxLQUFLLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN4RSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxJQUFJLEtBQUssSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3pFLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEdBQUcsS0FBSyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVTLHNCQUFzQjtRQUM1QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RELE1BQU0sT0FBTyxHQUFHLENBQUMscUJBQXFCLEVBQUUsbUJBQW1CLEVBQUUsbUNBQW1DLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztRQUMzSCxNQUFNLGlCQUFpQixHQUFHLENBQUMsNEJBQTRCLEVBQUUseUJBQXlCLENBQUMsQ0FBQztRQUVwRixJQUFJLFFBQVEsS0FBSyxVQUFVLENBQUMsSUFBSSxFQUFFO1lBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxpQkFBaUIsRUFBRSx3QkFBd0IsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO1NBQzFGO2FBQU0sSUFBSSxRQUFRLEtBQUssVUFBVSxDQUFDLFFBQVEsRUFBRTtZQUN6QyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsaUJBQWlCLEVBQUUsNkJBQTZCLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztTQUMvRjthQUFNLElBQUksUUFBUSxLQUFLLFVBQVUsQ0FBQyxPQUFPLEVBQUU7WUFDeEMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLGlCQUFpQixFQUFFLDJCQUEyQixFQUFFLHdCQUF3QixDQUFDLENBQUM7WUFDMUYsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUNBQXVDLENBQUMsQ0FBQzthQUN6RDtTQUNKO2FBQU0sSUFBSSxRQUFRLEtBQUssVUFBVSxDQUFDLGFBQWEsRUFBRTtZQUM5QyxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLDRCQUE0QixFQUFFLGtDQUFrQyxFQUFFLG1CQUFtQixDQUFDLENBQUM7WUFDM0gsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUNBQXVDLENBQUMsQ0FBQzthQUN6RDtTQUNKO2FBQU0sSUFBSSxRQUFRLEtBQUssVUFBVSxDQUFDLFVBQVUsRUFBRTtZQUMzQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsaUJBQWlCLEVBQUUsOEJBQThCLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztTQUNoRzthQUFNLElBQUksUUFBUSxLQUFLLFVBQVUsQ0FBQyxRQUFRLEVBQUU7WUFDekMsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSw0QkFBNEIsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1NBQzFGO2FBQU0sSUFBSSxRQUFRLEtBQUssVUFBVSxDQUFDLGNBQWMsRUFBRTtZQUMvQyxPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLG1DQUFtQyxFQUFFLG1CQUFtQixDQUFDLENBQUM7U0FDakc7YUFBTSxJQUFJLFFBQVEsS0FBSyxVQUFVLENBQUMsYUFBYSxFQUFFO1lBQzlDLE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLEVBQUUsa0NBQWtDLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztTQUNoRzthQUFNLElBQUksUUFBUSxLQUFLLFVBQVUsQ0FBQyxZQUFZLEVBQUU7WUFDN0MsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSx1QkFBdUIsRUFBRSxnQ0FBZ0MsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3ZIO1FBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1FBRWpFLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDO1FBRTdCLGdCQUFnQjtRQUNoQixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7U0FDaEY7YUFBTTtZQUNILHVEQUF1RDtZQUN2RCxNQUFNLFVBQVUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDN0YsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7U0FDbEc7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxXQUFXO1FBQ2pCLE9BQU87WUFDSCxhQUFhLEVBQUUsRUFBRTtZQUNqQixtQkFBbUIsRUFBRSxFQUFFO1NBQzFCLENBQUM7SUFDTixDQUFDOztBQTdTRDs7R0FFRztBQUNZLDRCQUFZLEdBQUcsQ0FBQyxDQUFDO2lHQVh2QixlQUFlO2lHQUFmLGVBQWU7MEdBQWYsYUFBUzs7O1FDdEZ0QixvRkF1QmU7O1FBdkJBLGtDQUFhOztBRCtQeEI7SUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFDOzs7O2dEQWFYO3VGQXRMUSxlQUFlO2NBSjNCLFNBQVM7MkJBQ0ksWUFBWTtvSEF5Q04sMEJBQTBCO2tCQUF6QyxLQUFLO1lBTVUsWUFBWTtrQkFBM0IsS0FBSztZQUtVLFVBQVU7a0JBQXpCLEtBQUs7WUFNVSxhQUFhO2tCQUE1QixLQUFLO1lBQ1UsU0FBUztrQkFBeEIsS0FBSztZQUNVLGVBQWU7a0JBQTlCLEtBQUs7WUFRYyxVQUFVO2tCQUE3QixLQUFLO1lBZUssVUFBVTtrQkFEcEIsS0FBSztZQWNVLFVBQVU7a0JBQXpCLEtBQUs7WUFLVSxXQUFXO2tCQUExQixLQUFLO1lBT1UsaUJBQWlCO2tCQUFoQyxLQUFLO1lBc0NDLE9BQU87a0JBRGIsWUFBWTttQkFBQyx1QkFBdUI7WUE0QjlCLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgQWZ0ZXJWaWV3Q2hlY2tlZCxcclxuICAgIENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgQ29tcG9uZW50LFxyXG4gICAgRWxlbWVudFJlZixcclxuICAgIEhvc3RMaXN0ZW5lcixcclxuICAgIEluamVjdG9yLFxyXG4gICAgSW5wdXQsXHJcbiAgICBPbkNoYW5nZXMsXHJcbiAgICBPbkRlc3Ryb3ksXHJcbiAgICBTaW1wbGVDaGFuZ2VzXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERlYm91bmNlIH0gZnJvbSAnQG1pY3Jvc29mdC93aW5kb3dzLWFkbWluLWNlbnRlci1zZGsvY29yZS9iYXNlL2RlY29yYXRvcnMvZGVib3VuY2UuZGVjb3JhdG9ycyc7XHJcbmltcG9ydCB7IERvbSB9IGZyb20gJ0BtaWNyb3NvZnQvd2luZG93cy1hZG1pbi1jZW50ZXItc2RrL2NvcmUvZG9tL2RvbSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU3RyaW5ncyB9IGZyb20gJy4uLy4uL2dlbmVyYXRlZC9zdHJpbmdzJztcclxuaW1wb3J0IHsgQ29yZUJhc2VDb21wb25lbnQgfSBmcm9tICcuLi9jb21tb24vYmFzZS5jb21wb25lbnQnO1xyXG5cclxuLyoqXHJcbiAqXHJcbiAqIEBzbWVEb2Mge0BsYWJlbCBEaWFsb2cgQGlkIHNtZS1kaWFsb2d9XHJcbiAqXHJcbiAqIEBvdmVydmlld1xyXG4gKiBAZmlsZSB7QGZpbGVwYXRoIC4vZXhhbXBsZXMvZGlhbG9nLW92ZXJ2aWV3Lm1kfVxyXG4gKlxyXG4gKiBAZXhhbXBsZSB7QGxhYmVsIEJhc2ljIFVzYWdlIEBpZCBiYXNpYy11c2FnZX1cclxuICogQGZpbGUge0BmaWxlbmFtZSBjb21wb25lbnQudHMgQGZpbGVwYXRoIC4vZXhhbXBsZXMvZGlhbG9nLWV4YW1wbGUuY29tcG9uZW50LnRzfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC5odG1sIEBmaWxlcGF0aCAuL2V4YW1wbGVzL2RpYWxvZy1leGFtcGxlLmNvbXBvbmVudC5odG1sfVxyXG4gKlxyXG4gKiBAZXhhbXBsZSB7QGxhYmVsIERpYWxvZyBDaGFpbiBAaWQgZGlhbG9nLWNoYWlufVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC50cyBAZmlsZXBhdGggLi9leGFtcGxlcy9kaWFsb2ctZXhhbXBsZS1kaWFsb2ctY2hhaW4uY29tcG9uZW50LnRzfVxyXG4gKiBAZmlsZSB7QGZpbGVuYW1lIGNvbXBvbmVudC5odG1sIEBmaWxlcGF0aCAuL2V4YW1wbGVzL2RpYWxvZy1leGFtcGxlLWRpYWxvZy1jaGFpbi5jb21wb25lbnQuaHRtbH1cclxuICpcclxuICogQGV4YW1wbGUge0BsYWJlbCBGdWxsIFNjcmVlbiBEaWFsb2cgQGlkIGZ1bGwtc2NyZWVuLWRpYWxvZ31cclxuICogQGZpbGUge0BmaWxlbmFtZSBjb21wb25lbnQudHMgQGZpbGVwYXRoIC4vZXhhbXBsZXMvZGlhbG9nLWV4YW1wbGUtZnVsbC1zY3JlZW4tZGlhbG9nLmNvbXBvbmVudC50c31cclxuICogQGZpbGUge0BmaWxlbmFtZSBjb21wb25lbnQuaHRtbCBAZmlsZXBhdGggLi9leGFtcGxlcy9kaWFsb2ctZXhhbXBsZS1mdWxsLXNjcmVlbi1kaWFsb2cuY29tcG9uZW50Lmh0bWx9XHJcbiAqXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLWRpYWxvZy1oZWFkZXInLFxyXG4gICAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwic21lLXBhZGRpbmctaG9yaXpvbnRhbC1sZyBzbWUtcGFkZGluZy12ZXJ0aWNhbC1zbVwiPjxuZy1jb250ZW50PjwvbmctY29udGVudD48L2Rpdj4nXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEaWFsb2dIZWFkZXJDb21wb25lbnQge1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLWRpYWxvZy1jb250ZW50JyxcclxuICAgIHRlbXBsYXRlOiAnPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PidcclxufSlcclxuZXhwb3J0IGNsYXNzIERpYWxvZ0NvbnRlbnRDb21wb25lbnQge1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLWRpYWxvZy1mb290ZXInLFxyXG4gICAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPVwic21lLWxheW91dC1kaWFsb2ctZm9vdGVyXCI+XHJcbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+PC9kaXY+YFxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGlhbG9nRm9vdGVyQ29tcG9uZW50IHtcclxufVxyXG5cclxuZXhwb3J0IGVudW0gRGlhbG9nQ2xvc2VSZWFzb24ge1xyXG4gICAgU29mdERpc21pc3MgPSAwLFxyXG4gICAgQ2xvc2VCdXR0b24gPSAxLFxyXG4gICAgRXNjYXBlS2V5ID0gMixcclxuICAgIENvbXBldGluZ0RpYWxvZyA9IDNcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIERpYWxvZ01vZGUge1xyXG4gICAgcHVibGljIHN0YXRpYyBwYW5lID0gJ3BhbmUnO1xyXG4gICAgcHVibGljIHN0YXRpYyB3aWRlUGFuZSA9ICd3aWRlLXBhbmUnO1xyXG4gICAgcHVibGljIHN0YXRpYyBjb21wYWN0ID0gJ2NvbXBhY3QnO1xyXG4gICAgcHVibGljIHN0YXRpYyBjb21wYWN0U3F1YXJlID0gJ2NvbXBhY3Qtc3F1YXJlJztcclxuICAgIHB1YmxpYyBzdGF0aWMgZnVsbHNjcmVlbiA9ICdmdWxsc2NyZWVuJztcclxuICAgIHB1YmxpYyBzdGF0aWMgY2VudGVyZWQgPSAnY2VudGVyZWQnO1xyXG4gICAgcHVibGljIHN0YXRpYyBjZW50ZXJlZE1lZGl1bSA9ICdjZW50ZXJlZC1tZWRpdW0nO1xyXG4gICAgcHVibGljIHN0YXRpYyBjZW50ZXJlZExhcmdlID0gJ2NlbnRlcmVkLWxhcmdlJztcclxuICAgIHB1YmxpYyBzdGF0aWMgbm90aWZpY2F0aW9uID0gJ25vdGlmaWNhdGlvbic7XHJcbn1cclxuXHJcbmV4cG9ydCBjb25zdCBtb2RhbERpYWxvZyA9ICdtb2RhbCc7XHJcbmV4cG9ydCBjb25zdCBhbGVydERpYWxvZyA9ICdhbGVydCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnc21lLWRpYWxvZycsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vZGlhbG9nLmNvbXBvbmVudC5odG1sJ1xyXG59KVxyXG5leHBvcnQgY2xhc3MgRGlhbG9nQ29tcG9uZW50IGV4dGVuZHMgQ29yZUJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3Q2hlY2tlZCB7XHJcbiAgICAvKipcclxuICAgICAqIFRoZSBzb3VyY2UgbmFtZSB0byB1c2UgZm9yIGxvZ2dpbmdcclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIGdldCBsb2dTb3VyY2VOYW1lKCkge1xyXG4gICAgICAgIHJldHVybiAnRGlhbG9nQ29tcG9uZW50JztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFN0YXRpYyBjb25zdGFudCB0byBwcm92aWRlIHVuaXF1ZSBpZHMgZm9yIGVhY2ggbWFzdGVyIHZpZXdcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdGF0aWMgbmV4dERpYWxvZ0lkID0gMDtcclxuICAgIHB1YmxpYyBkaWFsb2dDbGFzc2VzOiBzdHJpbmdbXTtcclxuICAgIHB1YmxpYyBkaWFsb2dSb2xlID0gJ2FsZXJ0ZGlhbG9nJztcclxuXHJcbiAgICBwdWJsaWMgc3RyaW5ncyA9IE1zZnRTbWUuZ2V0U3RyaW5nczxTdHJpbmdzPigpO1xyXG5cclxuICAgIHB1YmxpYyBkaWFsb2dMZXZlbCA9IDE7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGJhZyBvZiBpZHMgZ2VuZXJhdGVkIHVzaW5nIEBzZWUge21hc3RlclZpZXdJZH0gYW5kIHRoZSBtYXAgcmV0dXJuZWQgZnJvbSBAc2VlIHtjcmVhdGVJZEJhZ31cclxuICAgICAqL1xyXG4gICAgZGVjbGFyZSBwdWJsaWMgaWRCYWc6IE1zZnRTbWUuU3RyaW5nTWFwPHN0cmluZz47XHJcbiAgICAvKipcclxuICAgICAqIFRoZSB1bmlxdWUgaWQgb2YgdGhpcyBtYXN0ZXIgdmlldy5cclxuICAgICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gbWFzdGVyVmlld3MgbmVlZCB0byB1c2UgYW4gSUQgYnV0IG1heSBhcHBlYXIgbXVsdGlwbGUgdGltZXMgb24gdGhlIHNhbWUgcGFnZS5cclxuICAgICAqIFVzaW5nIHRoaXMgSUQgYXMgdGhlIGJhc2lzIGZvciB0aGUgY29udHJvbHMgaW50ZXJuYWwgSURzIGdlbmVyYXRlZCBpbiBAc2VlIHtjcmVhdGVJZEJhZ30ga2VlcHMgdGhlIElEcyB1bmlxdWUuXHJcbiAgICAgKi9cclxuICAgIHByb3RlY3RlZCBkaWFsb2dJZDogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGhlIGRpYWxvZyBtb2RlIHRvIHVzZS5cclxuICAgICAqL1xyXG4gICAgcHJvdGVjdGVkIG1vZGU6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdG8gYWxsb3cgaW50ZXJhY3Rpb24gd2l0aCBlbGVtZW50cyBmcm9tIG91dHNpZGUgdGhlIGRpYWxvZyBlc3BlY2lhbGx5IHRvIHN1cHBvcnQgdGhlIGhvdmVyaW5nIGV2ZW50cy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGFsbG93QmFja2dyb3VuZEludGVyYWN0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIHRvIHJlbmRlciB0aGUgZGlhbG9nIGJhY2tncm91bmQuIEZhbHNlIHRvIGhpZGUgdGhlIGRpYWxvZyBjb250YWluZXIgYW5kIG1ha2UgdGhlIGJhY2tncm91bmQgdHJhbnNwYXJlbnQuXHJcbiAgICAgKiBUaGUgYmFja2dyb3VuZCBjb2xvciB0aGVuIHdpbGwgYmUgYmFzZWQgb24gdGhlIGRpYWxvZyBib2R5LlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd0JhY2tkcm9wID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdG8gaGlkZSB0aGUgZGlhbG9nIGZvb3Rlci5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGhpZGVGb290ZXIgPSBmYWxzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIHRoZSBmZWF0dXJlIG9mIGNsaWNraW5nIG91dHNpZGUgb2YgdGhlIGRpYWxvZyB0byBjbG9zZSB0aGUgY3VycmVudCBkaWFsb2cuXHJcbiAgICAgKiBUcnVlIG1lYW5zIGNsaWNraW5nIG91dHNpZGUgdGhlIGRpYWxvZyB3aWxsIGNsb3NlIHRoZSBkaWFsb2cuIFdlIHdhbnQgdGhpcyB0byBiZSBzZXQgdG8gZmFsc2Ugd2hlbiB0aGVyZSBhcmUgZm9ybXMgaW4gdGhlIGRpYWxvZy5cclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGNsaWNrQmFja2Ryb3AgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgcHVibGljIGFyaWFMYWJlbCA9ICcnO1xyXG4gICAgQElucHV0KCkgcHVibGljIGFyaWFEZXNjcmlwdGlvbiA9ICcnO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB3aGV0aGVyIHRoaXMgc2hvdWxkIGJlIGFuIGFjdGlvbiBwYW5lIG9yIGEgY2VudGVyZWQgZGlhbG9nXHJcbiAgICAgKlxyXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGRpYWxvZ01vZGUgaW5zdGVhZFxyXG4gICAgICogQHBhcmFtIG5ld1ZhbHVlIGlmIHRydWUsIHVzZXMgYSBsZWZ0IHBhbmUgZGlhbG9nLCBvdGhlcndpc2UgYSBjZW50ZXJlZCBkaWFsb2dcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIHNldCBhY3Rpb25QYW5lKG5ld1ZhbHVlOiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKG5ld1ZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nTW9kZSA9IERpYWxvZ01vZGUucGFuZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRpYWxvZ01vZGUgPSBEaWFsb2dNb2RlLmNlbnRlcmVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZXREaWFsb2dNb2RlRnJvbUlucHV0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbmRpY2F0ZXMgdGhlIGRpYWxvZyBtb2RlIHRvIHVzZVxyXG4gICAgICogQHNlZSBEaWFsb2dNb2RlXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpXHJcbiAgICBwdWJsaWMgc2V0IGRpYWxvZ01vZGUobW9kZTogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5tb2RlID0gbW9kZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IGRpYWxvZ01vZGUoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERpYWxvZyB0eXBlcy4gTW9zdGx5IHVzZWQgZm9yIGFjY2Vzc2liaWxpdHkuIFZhbGlkIHZhbHVlczpcclxuICAgICAqIEBzZWUgbW9kYWxEaWFsb2cgPSAnbW9kYWwnO1xyXG4gICAgICogQHNlZSBhbGVydERpYWxvZyA9IFwiYWxlcnRcIjtcclxuICAgICAqL1xyXG4gICAgQElucHV0KCkgcHVibGljIGRpYWxvZ1R5cGUgPSAnJztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEZsYWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRpYWxvZyBzaG91bGQgaGF2ZSBhIGNsb3NlIGJ1dHRvbiBpbiB0b3AgcmlnaHQgb3Igbm90XHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHB1YmxpYyBjbG9zZUJ1dHRvbiA9IGZhbHNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcGFjdCBkaWFsb2cgY2FuIGJlIGZ1bGwgaGVpZ2h0IHdoZW4gZGlzcGxheWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgc2NyZWVuLlxyXG4gICAgICogSXQgY2FuIGFsc28gYmUgZGlzcGxheWVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIHNjcmVlbiB0aGF0IG5lZWRzIHRvIGJlIGhhdmluZyBwYWRkaW5ncyB0byBlYWNoIGRpcmVjdGlvbi5cclxuICAgICAqIFRoaXMgY29tcGFjdEZ1bGxIZWlnaHQgdG8gdHJ1ZSB3aWxsIGFsd2F5cyBiZSAxMDAlIGhlaWdodC4gT3RoZXJ3aXNlIGNzcyB3b3VsZCBjb250cm9sIHRoZSBtYXggaGVpZ2h0LlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBwdWJsaWMgY29tcGFjdEZ1bGxIZWlnaHQgPSBmYWxzZTtcclxuXHJcbiAgICBwdWJsaWMgY2xvc2VSZXF1ZXN0ZWQ6IFN1YmplY3Q8RGlhbG9nQ2xvc2VSZWFzb24+O1xyXG5cclxuICAgIHByaXZhdGUgZG9BdXRvRm9jdXMgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgaXNWaXNpYmxlID0gZmFsc2U7XHJcbiAgICBwdWJsaWMgc2V0IHZpc2libGUodmlzaWJsZTogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuaXNWaXNpYmxlID0gdmlzaWJsZTtcclxuICAgICAgICB0aGlzLmRvQXV0b0ZvY3VzID0gdmlzaWJsZTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZ2V0IHZpc2libGUoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWaXNpYmxlO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3JcclxuICAgICkge1xyXG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcclxuXHJcbiAgICAgICAgdGhpcy5tb2RlID0gRGlhbG9nTW9kZS5wYW5lO1xyXG5cclxuICAgICAgICAvLyBDcmVhdGUgY2xvc2VSZXF1ZXN0ZWQgc3ViamVjdCB0byBub3RpZnkgZGlhbG9ncyB3aGVuIGEgY2xvc2UgaXMgcmVxdWVzdGVkIGFuZCBob3cgaXQgd2FzIHJlcXVlc3RlZCAoRGlhbG9nQ2xvc2VSZWFzb24pXHJcbiAgICAgICAgdGhpcy5jbG9zZVJlcXVlc3RlZCA9IG5ldyBTdWJqZWN0PERpYWxvZ0Nsb3NlUmVhc29uPigpO1xyXG4gICAgICAgIHRoaXMuc2V0RGlhbG9nTW9kZUZyb21JbnB1dCgpO1xyXG5cclxuICAgICAgICAvLyBzZXR1cCBkaWFsb2cgaWQgYW5kIGlkQmFnXHJcbiAgICAgICAgdGhpcy5kaWFsb2dJZCA9IERpYWxvZ0NvbXBvbmVudC5uZXh0RGlhbG9nSWQrKztcclxuICAgICAgICB0aGlzLmlkQmFnID0gdGhpcy5jcmVhdGVJZEJhZygpO1xyXG4gICAgICAgIE1zZnRTbWUuZm9yRWFjaEtleSh0aGlzLmlkQmFnLCAoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaWRCYWdba2V5XSA9IGBkaWFsb2ctJHt0aGlzLmRpYWxvZ0lkLnRvU3RyaW5nKCl9LSR7a2V5fWA7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZG9jdW1lbnQ6a2V5dXAuZXNjYXBlIGlzIHVzZWQgc28gdGhhdCBhIGRpYWxvZyBpcyBub3QgY2xvc2VkIHdoZW4gdHJ5aW5nIHRvIGNsb3NlIGEgdG9vbHRpcFxyXG4gICAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5dXAuZXNjYXBlJylcclxuICAgIHB1YmxpYyBvbktleVVwKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnZpc2libGUpIHtcclxuICAgICAgICAgICAgdGhpcy5vbkVzY2FwZVByZXNzZWQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbmd1bGFyIExpZmUgQ3ljbGUgaG9vayBmb3IgQWZ0ZXIgVmlldyBDaGVja2VkLlxyXG4gICAgICogV2hlbiB0aGUgdmlzaWJpbGl0eSBjaGFuZ2VzLCB3ZSBhcmUgZ29pbmcgdG8gZm9jdXMgb24gdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBoYXMgdGhlIGF1dG9mb2N1cyBhdHRyaWJ1dGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5kb0F1dG9Gb2N1cykge1xyXG4gICAgICAgICAgICB0aGlzLmF1dG9Gb2N1cygpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENvbXBsZXRlZCB0aGUgY2xvc2VSZXF1ZXN0ZWQgc3ViamVjdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jbG9zZVJlcXVlc3RlZC5jb21wbGV0ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXV0byBmb2N1cyBvbiBmaXJzdCBlbGVtZW50IHRoYXQgaXMgZm9jdXNhYmxlXHJcbiAgICAgKi9cclxuICAgIEBEZWJvdW5jZSgwKVxyXG4gICAgcHVibGljIGF1dG9Gb2N1cygpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmRvQXV0b0ZvY3VzID0gZmFsc2U7XHJcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIC8vIElmIHRoZSBkaWFsb2cgaGFzIGEgbG9hZGluZyB3aGVlbCwgZm9jdXMgZmlyc3QgZ29lcyB0byB0aGUgbG9hZGluZyB3aGVlbCB0aGVuIGdldHMgbG9zdC5cclxuICAgICAgICAgICAgLy8gVE8gYXZvaWQgdGhpcywgd2UgZ2V0IHRoZSBwYXJlbnQgZWxlbWVudCBvciBuYXRpdmUgZWxlbWVudCBvZiB0aGUgZGlhbG9nLCB0aGVuIGdldCB0aGUgZmlyc3RcclxuICAgICAgICAgICAgLy8gZm9jdXNhYmxlIGVsZW1lbnQgaW4gdGhhdCBlbGVtZW50XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50IHx8IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgICAgICAgICBjb25zdCBmaXJzdEZvY3VzYWJsZSA9IERvbS5nZXRGaXJzdEZvY3VzYWJsZURlc2NlbmRlbnQoZWxlbWVudCk7XHJcbiAgICAgICAgICAgIGlmIChmaXJzdEZvY3VzYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgZmlyc3RGb2N1c2FibGUuZm9jdXMoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3dzIHRoZSBkaWFsb2cuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaG93KCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIaWRlcyB0aGUgZGlhbG9nLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGlkZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE5vdGlmaWVzIGNsb3NlUmVxdWVzdGVkIHN1YnNjcmliZXJzIHRoYXQgdGhlIGJhY2tkcm9wIGhhcyBiZWVuIGNsaWNrZWQsIHJlcXVlc3RpbmcgYSBzb2Z0IGRpc21pc3NcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQmFja2dyb3VuZENsaWNrZWQoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jbG9zZVJlcXVlc3RlZC5uZXh0KERpYWxvZ0Nsb3NlUmVhc29uLlNvZnREaXNtaXNzKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE5vdGlmaWVzIGNsb3NlUmVxdWVzdGVkIHN1YnNjcmliZXJzIHRoYXQgdGhlIGNsb3NlIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLCByZXF1ZXN0aW5nIGEgY2xvc2UgYnV0dG9uIGRpc21pc3NcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQ2xvc2VDbGlja2VkKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY2xvc2VSZXF1ZXN0ZWQubmV4dChEaWFsb2dDbG9zZVJlYXNvbi5DbG9zZUJ1dHRvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIG9uRXNjYXBlUHJlc3NlZCgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNsb3NlU