UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

229 lines 40.8 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { Component, HostBinding, HostListener, NgZone, ViewEncapsulation, } from "@angular/core"; import { ToastPackage } from "./toast-package"; import { ToastServiceBase } from "./toast.servicebase"; import * as i0 from "@angular/core"; import * as i1 from "./toast.servicebase"; import * as i2 from "./toast-package"; import * as i3 from "@angular/common"; import * as i4 from "../icon/icon.component"; import * as i5 from "../button/button.component"; var ToastState; (function (ToastState) { ToastState["Inactive"] = "inactive"; ToastState["Active"] = "active"; ToastState["Removed"] = "removed"; })(ToastState || (ToastState = {})); // <example-url>./../examples/index.html#/toast</example-url> /** * /** * __Name : __ * Toast Component * * __Usage :__ * Used to show toast, handle animation and events. Handles progress bar animation. * This component is created dynamically in ToastContainerService */ export class ToastComponent { get role() { return this.toastPackage.toastType === "success" || this.toastPackage.toastType === "info" ? "status" : "alert"; } constructor(toastService, toastPackage, ngZone) { this.toastService = toastService; this.toastPackage = toastPackage; this.ngZone = ngZone; /** width of progress bar */ this.width = -1; /** a combination of toast type and options.toastClass */ this.toastClasses = ""; this.fadeOut = true; this.display = "none"; /** controls animation */ this.state = ToastState.Inactive; this.subscriptions = []; this.animationFadeOutLength = 300; this.toastTypeToSeverityIcon = { error: "severity_critical", warning: "severity_warning", info: "severity_info", success: "severity_ok", }; this.title = toastPackage.title; this.body = toastPackage.body; this.options = toastPackage.config; this.toastClasses = `nui-toast--${toastPackage.toastType} ${toastPackage.config.toastClass} nui-toast--animation`; this.toastIcon = this.toastTypeToSeverityIcon[toastPackage.toastType]; this.closeButton = this.toastPackage.config.closeButton; const activateSubscription = this.toastPackage.toastRef .afterActivate() .subscribe(() => { this.display = "block"; setTimeout(() => this.activateToast()); // Is needed to make "display: none" & "opacity" transitions working }); const closeSubscription = this.toastPackage.toastRef .manualClosed() .subscribe(() => { this.remove(); }); this.subscriptions.push(activateSubscription, closeSubscription); } /** * triggers fade in animation and sets timeout till the toast will be dismissed */ activateToast() { this.state = ToastState.Active; this.fadeOut = false; if (this.options.timeOut) { this.ngZone.runOutsideAngular(() => { this.timeout = setTimeout(() => { this.ngZone.run(() => { this.remove(); }); }, this.options.timeOut); }); this.hideTime = new Date().getTime() + this.options.timeOut; if (this.options.progressBar) { this.intervalId = this.repeatProgressBarChange(); } } } /** * tells toastService to remove this toast after animation time */ remove() { if (this.state === ToastState.Removed) { return; } clearTimeout(this.timeout); this.state = ToastState.Removed; this.fadeOut = true; this.timeout = setTimeout(() => this.toastService.remove(this.toastPackage.toastId), this.animationFadeOutLength); } /** * handles click on toast itself */ clickToast() { if (this.state === ToastState.Removed) { return; } this.toastPackage.triggerClick(); if (this.options.clickToDismiss) { this.remove(); } } /** * disables progressBar and prevents toast from closing */ stickAround() { if (this.state === ToastState.Removed) { return; } clearTimeout(this.timeout); this.options.timeOut = 0; this.hideTime = 0; // disable progressBar clearInterval(this.intervalId); this.width = 0; } /** * using extendedTimeOut value to delay toast's closure */ delayedHideToast() { clearInterval(this.intervalId); if (this.options.extendedTimeOut === 0 || this.state === ToastState.Removed) { return; } this.timeout = setTimeout(() => this.remove(), this.options.extendedTimeOut); this.options.timeOut = this.options.extendedTimeOut; this.hideTime = new Date().getTime() + (this.options.timeOut || 0); this.width = 100; if (this.options.progressBar) { this.intervalId = this.repeatProgressBarChange(); } } repeatProgressBarChange() { let intervalId; this.ngZone.runOutsideAngular(() => { intervalId = setInterval(() => { this.ngZone.run(() => { this.updateProgress(); }); }, (this.options.timeOut || 0) / 100); }); // using type assertion to avoid compile time error // variable intervalId is assigned by clojure / async return intervalId; } /** * updates progress bar width */ updateProgress() { if (this.width === 0 || !this.options.timeOut) { return; } const now = new Date().getTime(); const remaining = this.hideTime - now; this.width = (remaining / this.options.timeOut) * 100; if (this.options.progressAnimation === "increasing") { this.width = 100 - this.width; } if (this.width <= 0) { this.width = 0; } if (this.width >= 100) { this.width = 100; } } ngOnDestroy() { this.subscriptions.forEach((subscription) => subscription.unsubscribe()); clearInterval(this.intervalId); clearTimeout(this.timeout); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToastComponent, deps: [{ token: i1.ToastServiceBase }, { token: i2.ToastPackage }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ToastComponent, selector: "nui-toast-component", host: { listeners: { "click": "clickToast()", "mouseenter": "stickAround()", "mouseleave": "delayedHideToast()" }, properties: { "attr.role": "role", "class": "this.toastClasses", "class.nui-toast--fade-out": "this.fadeOut", "style.display": "this.display" } }, ngImport: i0, template: "<div\n class=\"nui-toast__content d-flex flex-nowrap flex-row justify-content-between align-items-start\"\n [class.nui-toast__content--without-close-button]=\"!closeButton\"\n>\n <nui-icon\n class=\"nui-toast__status-icon\"\n iconSize=\"large\"\n icon=\"{{ toastIcon }}\"\n ></nui-icon>\n <div class=\"nui-toast__content-message flex-grow-1\">\n <span\n *ngIf=\"title\"\n class=\"nui-toast__content-title\"\n [attr.aria-label]=\"title\"\n >{{ title }}</span\n >\n <span\n *ngIf=\"body && options.enableHtml\"\n class=\"nui-toast__content-body\"\n [innerHTML]=\"body\"\n ></span>\n <span\n *ngIf=\"body && !options.enableHtml\"\n class=\"nui-toast__content-body\"\n [attr.aria-label]=\"body\"\n >{{ body }}</span\n >\n </div>\n <button\n *ngIf=\"options.closeButton\"\n nui-button\n type=\"button\"\n class=\"nui-toast__dismiss-button\"\n displayStyle=\"action\"\n size=\"default\"\n icon=\"close\"\n (click)=\"remove()\"\n ></button>\n</div>\n<div\n *ngIf=\"options.progressBar\"\n class=\"nui-toast__progress\"\n [style.width.%]=\"width\"\n></div>\n", styles: [".nui .nui-toast{box-shadow:0 0 5px 0 var(--nui-shadow-color, rgba(17, 17, 17, .3));margin-bottom:5px;max-width:450px;min-width:350px;overflow:hidden;pointer-events:auto;position:relative}.nui .nui-toast:before{content:\" \";height:100%;left:0;position:absolute;top:0;width:100%;z-index:-1;opacity:.8;filter:alpha(opacity=80);background-color:var(--nui-color-bg-light,#fff);-webkit-transition:all .2s linear;-o-transition:all .2s linear;transition:all .2s linear}.nui .nui-toast:hover:before{opacity:1;filter:alpha(opacity=100)}.nui .nui-toast:last-child{margin-bottom:0}.nui .nui-toast--info .nui-toast__content{background-color:var(--nui-color-semantic-info-bg,#e8f4f7);border-color:var(--nui-color-line-info,#1c8eb1)}.nui .nui-toast--info .nui-toast__progress{background-color:var(--nui-color-line-info,#1c8eb1)}.nui .nui-toast--error .nui-toast__content{background-color:var(--nui-color-semantic-critical-bg,#fceae6);border-color:var(--nui-color-line-critical,#dd2c00)}.nui .nui-toast--error .nui-toast__progress{background-color:var(--nui-color-line-critical,#dd2c00)}.nui .nui-toast--warning .nui-toast__content{background-color:var(--nui-color-semantic-warning-bg,#fff9e6);border-color:var(--nui-color-line-warning,#fec405)}.nui .nui-toast--warning .nui-toast__progress{background-color:var(--nui-color-semantic-warning,#fec405)}.nui .nui-toast--success .nui-toast__content{background-color:var(--nui-color-semantic-ok-bg,#e6f6ee);border-color:var(--nui-color-line-ok,#00a753)}.nui .nui-toast--success .nui-toast__progress{background-color:var(--nui-color-semantic-ok,#00a753)}.nui .nui-toast--animation{-webkit-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}.nui .nui-toast--fade-out{opacity:0;filter:alpha(opacity=0)}.nui .nui-toast--fade-out:before{opacity:0;filter:alpha(opacity=0)}.nui .nui-toast__container{pointer-events:none;position:fixed;z-index:1070}.nui .nui-toast__content{border-radius:0;border:1px solid;position:relative;opacity:.8;filter:alpha(opacity=80);color:var(--nui-color-text-default,#111)}.nui .nui-toast__content:hover{opacity:1;filter:alpha(opacity=100)}.nui .nui-toast__content-message{line-height:16px;margin:10px 0}.nui .nui-toast__content-title{font-weight:600}.nui .nui-toast__content-title+.nui-toast__content-body:before{content:\" \"}.nui .nui-toast__content--without-close-button .nui-toast__content-message{margin-right:10px}.nui .nui-toast__status-icon{margin:10px}.nui .nui-toast__dismiss-button{margin:3px}.nui .nui-toast__progress{bottom:0;height:3px;left:0;margin-top:5px;position:absolute}.nui .nui-toast--top-left{left:5px;top:45px}.nui .nui-toast--top-right{right:5px;top:45px}.nui .nui-toast--bottom-left{bottom:5px;left:5px}.nui .nui-toast--bottom-right{bottom:5px;right:5px}.nui .nui-toast--top-center{right:0;top:45px;width:100%}.nui .nui-toast--top-center .nui-toast{margin-left:auto;margin-right:auto}.nui .nui-toast--bottom-center{bottom:5px;right:0;width:100%}.nui .nui-toast--bottom-center .nui-toast{margin-left:auto;margin-right:auto}.nui .nui-toast--top-full-width{right:0;top:0;width:100%}.nui .nui-toast--top-full-width .nui-toast{max-width:100%;width:100%}.nui .nui-toast--bottom-full-width{bottom:0;right:0;width:100%}.nui .nui-toast--bottom-full-width .nui-toast{max-width:100%;width:100%}.nui .nui-toast .nui-toast--centered .nui-toast{margin-left:auto;margin-right:auto}.nui .nui-toast .nui-toast--full-width .nui-toast{max-width:100%;width:100%}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i4.IconComponent, selector: "nui-icon", inputs: ["iconColor", "brushType", "iconHoverColor", "iconSize", "cssClass", "fillContainer", "status", "childStatus", "icon", "counter"] }, { kind: "component", type: i5.ButtonComponent, selector: "[nui-button]", inputs: ["displayStyle", "icon", "iconColor", "iconRight", "isBusy", "isEmpty", "ariaLabel", "isRepeat", "size"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToastComponent, decorators: [{ type: Component, args: [{ selector: "nui-toast-component", encapsulation: ViewEncapsulation.None, host: { "[attr.role]": "role" }, template: "<div\n class=\"nui-toast__content d-flex flex-nowrap flex-row justify-content-between align-items-start\"\n [class.nui-toast__content--without-close-button]=\"!closeButton\"\n>\n <nui-icon\n class=\"nui-toast__status-icon\"\n iconSize=\"large\"\n icon=\"{{ toastIcon }}\"\n ></nui-icon>\n <div class=\"nui-toast__content-message flex-grow-1\">\n <span\n *ngIf=\"title\"\n class=\"nui-toast__content-title\"\n [attr.aria-label]=\"title\"\n >{{ title }}</span\n >\n <span\n *ngIf=\"body && options.enableHtml\"\n class=\"nui-toast__content-body\"\n [innerHTML]=\"body\"\n ></span>\n <span\n *ngIf=\"body && !options.enableHtml\"\n class=\"nui-toast__content-body\"\n [attr.aria-label]=\"body\"\n >{{ body }}</span\n >\n </div>\n <button\n *ngIf=\"options.closeButton\"\n nui-button\n type=\"button\"\n class=\"nui-toast__dismiss-button\"\n displayStyle=\"action\"\n size=\"default\"\n icon=\"close\"\n (click)=\"remove()\"\n ></button>\n</div>\n<div\n *ngIf=\"options.progressBar\"\n class=\"nui-toast__progress\"\n [style.width.%]=\"width\"\n></div>\n", styles: [".nui .nui-toast{box-shadow:0 0 5px 0 var(--nui-shadow-color, rgba(17, 17, 17, .3));margin-bottom:5px;max-width:450px;min-width:350px;overflow:hidden;pointer-events:auto;position:relative}.nui .nui-toast:before{content:\" \";height:100%;left:0;position:absolute;top:0;width:100%;z-index:-1;opacity:.8;filter:alpha(opacity=80);background-color:var(--nui-color-bg-light,#fff);-webkit-transition:all .2s linear;-o-transition:all .2s linear;transition:all .2s linear}.nui .nui-toast:hover:before{opacity:1;filter:alpha(opacity=100)}.nui .nui-toast:last-child{margin-bottom:0}.nui .nui-toast--info .nui-toast__content{background-color:var(--nui-color-semantic-info-bg,#e8f4f7);border-color:var(--nui-color-line-info,#1c8eb1)}.nui .nui-toast--info .nui-toast__progress{background-color:var(--nui-color-line-info,#1c8eb1)}.nui .nui-toast--error .nui-toast__content{background-color:var(--nui-color-semantic-critical-bg,#fceae6);border-color:var(--nui-color-line-critical,#dd2c00)}.nui .nui-toast--error .nui-toast__progress{background-color:var(--nui-color-line-critical,#dd2c00)}.nui .nui-toast--warning .nui-toast__content{background-color:var(--nui-color-semantic-warning-bg,#fff9e6);border-color:var(--nui-color-line-warning,#fec405)}.nui .nui-toast--warning .nui-toast__progress{background-color:var(--nui-color-semantic-warning,#fec405)}.nui .nui-toast--success .nui-toast__content{background-color:var(--nui-color-semantic-ok-bg,#e6f6ee);border-color:var(--nui-color-line-ok,#00a753)}.nui .nui-toast--success .nui-toast__progress{background-color:var(--nui-color-semantic-ok,#00a753)}.nui .nui-toast--animation{-webkit-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear}.nui .nui-toast--fade-out{opacity:0;filter:alpha(opacity=0)}.nui .nui-toast--fade-out:before{opacity:0;filter:alpha(opacity=0)}.nui .nui-toast__container{pointer-events:none;position:fixed;z-index:1070}.nui .nui-toast__content{border-radius:0;border:1px solid;position:relative;opacity:.8;filter:alpha(opacity=80);color:var(--nui-color-text-default,#111)}.nui .nui-toast__content:hover{opacity:1;filter:alpha(opacity=100)}.nui .nui-toast__content-message{line-height:16px;margin:10px 0}.nui .nui-toast__content-title{font-weight:600}.nui .nui-toast__content-title+.nui-toast__content-body:before{content:\" \"}.nui .nui-toast__content--without-close-button .nui-toast__content-message{margin-right:10px}.nui .nui-toast__status-icon{margin:10px}.nui .nui-toast__dismiss-button{margin:3px}.nui .nui-toast__progress{bottom:0;height:3px;left:0;margin-top:5px;position:absolute}.nui .nui-toast--top-left{left:5px;top:45px}.nui .nui-toast--top-right{right:5px;top:45px}.nui .nui-toast--bottom-left{bottom:5px;left:5px}.nui .nui-toast--bottom-right{bottom:5px;right:5px}.nui .nui-toast--top-center{right:0;top:45px;width:100%}.nui .nui-toast--top-center .nui-toast{margin-left:auto;margin-right:auto}.nui .nui-toast--bottom-center{bottom:5px;right:0;width:100%}.nui .nui-toast--bottom-center .nui-toast{margin-left:auto;margin-right:auto}.nui .nui-toast--top-full-width{right:0;top:0;width:100%}.nui .nui-toast--top-full-width .nui-toast{max-width:100%;width:100%}.nui .nui-toast--bottom-full-width{bottom:0;right:0;width:100%}.nui .nui-toast--bottom-full-width .nui-toast{max-width:100%;width:100%}.nui .nui-toast .nui-toast--centered .nui-toast{margin-left:auto;margin-right:auto}.nui .nui-toast .nui-toast--full-width .nui-toast{max-width:100%;width:100%}\n"] }] }], ctorParameters: () => [{ type: i1.ToastServiceBase }, { type: i2.ToastPackage }, { type: i0.NgZone }], propDecorators: { toastClasses: [{ type: HostBinding, args: ["class"] }], fadeOut: [{ type: HostBinding, args: ["class.nui-toast--fade-out"] }], display: [{ type: HostBinding, args: ["style.display"] }], clickToast: [{ type: HostListener, args: ["click"] }], stickAround: [{ type: HostListener, args: ["mouseenter"] }], delayedHideToast: [{ type: HostListener, args: ["mouseleave"] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi90b2FzdC90b2FzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3RvYXN0L3RvYXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBQ0gsU0FBUyxFQUNULFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUVOLGlCQUFpQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUt2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7Ozs7Ozs7QUFFdkQsSUFBSyxVQUlKO0FBSkQsV0FBSyxVQUFVO0lBQ1gsbUNBQXFCLENBQUE7SUFDckIsK0JBQWlCLENBQUE7SUFDakIsaUNBQW1CLENBQUE7QUFDdkIsQ0FBQyxFQUpJLFVBQVUsS0FBVixVQUFVLFFBSWQ7QUFFRCw2REFBNkQ7QUFFN0Q7Ozs7Ozs7O0dBUUc7QUFRSCxNQUFNLE9BQU8sY0FBYztJQVN2QixJQUFJLElBQUk7UUFDSixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxLQUFLLFNBQVM7WUFDNUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEtBQUssTUFBTTtZQUN0QyxDQUFDLENBQUMsUUFBUTtZQUNW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QUFhLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQy9CLFlBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0IsQ0FBQzsrR0FuTlEsY0FBYzttR0FBZCxjQUFjLGlVQzNEM0IsNnlDQTRDQTs7NEZEZWEsY0FBYztrQkFQMUIsU0FBUzsrQkFDSSxxQkFBcUIsaUJBR2hCLGlCQUFpQixDQUFDLElBQUksUUFDL0IsRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFO3FJQW1CVCxZQUFZO3NCQUFqQyxXQUFXO3VCQUFDLE9BQU87Z0JBQ3NCLE9BQU87c0JBQWhELFdBQVc7dUJBQUMsMkJBQTJCO2dCQUNWLE9BQU87c0JBQXBDLFdBQVc7dUJBQUMsZUFBZTtnQkF3RnJCLFVBQVU7c0JBRGhCLFlBQVk7dUJBQUMsT0FBTztnQkFpQmQsV0FBVztzQkFEakIsWUFBWTt1QkFBQyxZQUFZO2dCQWtCbkIsZ0JBQWdCO3NCQUR0QixZQUFZO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIE5nWm9uZSxcbiAgICBPbkRlc3Ryb3ksXG4gICAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBTYWZlSHRtbCB9IGZyb20gXCJAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyXCI7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tIFwicnhqc1wiO1xuXG5pbXBvcnQgeyBJVG9hc3RDb25maWcgfSBmcm9tIFwiLi9wdWJsaWMtYXBpXCI7XG5pbXBvcnQgeyBUb2FzdFBhY2thZ2UgfSBmcm9tIFwiLi90b2FzdC1wYWNrYWdlXCI7XG5pbXBvcnQgeyBUb2FzdFNlcnZpY2VCYXNlIH0gZnJvbSBcIi4vdG9hc3Quc2VydmljZWJhc2VcIjtcblxuZW51bSBUb2FzdFN0YXRlIHtcbiAgICBJbmFjdGl2ZSA9IFwiaW5hY3RpdmVcIixcbiAgICBBY3RpdmUgPSBcImFjdGl2ZVwiLFxuICAgIFJlbW92ZWQgPSBcInJlbW92ZWRcIixcbn1cblxuLy8gPGV4YW1wbGUtdXJsPi4vLi4vZXhhbXBsZXMvaW5kZXguaHRtbCMvdG9hc3Q8L2V4YW1wbGUtdXJsPlxuXG4vKipcbiAqIC8qKlxuICogX19OYW1lIDogX19cbiAqIFRvYXN0IENvbXBvbmVudFxuICpcbiAqIF9fVXNhZ2UgOl9fXG4gKiBVc2VkIHRvIHNob3cgdG9hc3QsIGhhbmRsZSBhbmltYXRpb24gYW5kIGV2ZW50cy4gSGFuZGxlcyBwcm9ncmVzcyBiYXIgYW5pbWF0aW9uLlxuICogVGhpcyBjb21wb25lbnQgaXMgY3JlYXRlZCBkeW5hbWljYWxseSBpbiBUb2FzdENvbnRhaW5lclNlcnZpY2VcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibnVpLXRvYXN0LWNvbXBvbmVudFwiLFxuICAgIHRlbXBsYXRlVXJsOiBcIi4vdG9hc3QuY29tcG9uZW50Lmh0bWxcIixcbiAgICBzdHlsZVVybHM6IFtcIi4vdG9hc3QuY29tcG9uZW50Lmxlc3NcIl0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBob3N0OiB7IFwiW2F0dHIucm9sZV1cIjogXCJyb2xlXCIgfSxcbn0pXG5leHBvcnQgY2xhc3MgVG9hc3RDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIHB1YmxpYyBib2R5Pzogc3RyaW5nIHwgU2FmZUh0bWwgfCBudWxsO1xuICAgIHB1YmxpYyB0aXRsZT86IHN0cmluZztcbiAgICBwdWJsaWMgb3B0aW9uczogSVRvYXN0Q29uZmlnO1xuICAgIC8qKiB3aWR0aCBvZiBwcm9ncmVzcyBiYXIgKi9cbiAgICBwdWJsaWMgd2lkdGggPSAtMTtcbiAgICBwdWJsaWMgdG9hc3RJY29uOiBzdHJpbmc7XG4gICAgcHVibGljIGNsb3NlQnV0dG9uPzogYm9vbGVhbjtcblxuICAgIGdldCByb2xlKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnRvYXN0UGFja2FnZS50b2FzdFR5cGUgPT09IFwic3VjY2Vzc1wiIHx8XG4gICAgICAgICAgICB0aGlzLnRvYXN0UGFja2FnZS50b2FzdFR5cGUgPT09IFwiaW5mb1wiXG4gICAgICAgICAgICA/IFwic3RhdHVzXCJcbiAgICAgICAgICAgIDogXCJhbGVydFwiO1xuICAgIH1cblxuICAgIC8qKiBhIGNvbWJpbmF0aW9uIG9mIHRvYXN0IHR5cGUgYW5kIG9wdGlvbnMudG9hc3RDbGFzcyAqL1xuICAgIEBIb3N0QmluZGluZyhcImNsYXNzXCIpIHRvYXN0Q2xhc3NlcyA9IFwiXCI7XG4gICAgQEhvc3RCaW5kaW5nKFwiY2xhc3MubnVpLXRvYXN0LS1mYWRlLW91dFwiKSBmYWRlT3V0ID0gdHJ1ZTtcbiAgICBASG9zdEJpbmRpbmcoXCJzdHlsZS5kaXNwbGF5XCIpIGRpc3BsYXkgPSBcIm5vbmVcIjtcblxuICAgIC8qKiBjb250cm9scyBhbmltYXRpb24gKi9cbiAgICBwcml2YXRlIHN0YXRlOiBUb2FzdFN0YXRlID0gVG9hc3RTdGF0ZS5JbmFjdGl2ZTtcbiAgICBwcml2YXRlIHRpbWVvdXQ6IGFueTtcbiAgICBwcml2YXRlIGludGVydmFsSWQ6IE5vZGVKUy5UaW1lb3V0O1xuICAgIHByaXZhdGUgaGlkZVRpbWU6IG51bWJlcjtcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IEFycmF5PFN1YnNjcmlwdGlvbj4gPSBbXTtcbiAgICBwcml2YXRlIGFuaW1hdGlvbkZhZGVPdXRMZW5ndGggPSAzMDA7XG4gICAgcHJpdmF0ZSB0b2FzdFR5cGVUb1NldmVyaXR5SWNvbjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgZXJyb3I6IFwic2V2ZXJpdHlfY3JpdGljYWxcIixcbiAgICAgICAgd2FybmluZzogXCJzZXZlcml0eV93YXJuaW5nXCIsXG4gICAgICAgIGluZm86IFwic2V2ZXJpdHlfaW5mb1wiLFxuICAgICAgICBzdWNjZXNzOiBcInNldmVyaXR5X29rXCIsXG4gICAgfTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlQmFzZSxcbiAgICAgICAgcHJpdmF0ZSB0b2FzdFBhY2thZ2U6IFRvYXN0UGFja2FnZSxcbiAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZVxuICAgICkge1xuICAgICAgICB0aGlzLnRpdGxlID0gdG9hc3RQYWNrYWdlLnRpdGxlO1xuICAgICAgICB0aGlzLmJvZHkgPSB0b2FzdFBhY2thZ2UuYm9keTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gdG9hc3RQYWNrYWdlLmNvbmZpZztcbiAgICAgICAgdGhpcy50b2FzdENsYXNzZXMgPSBgbnVpLXRvYXN0LS0ke3RvYXN0UGFja2FnZS50b2FzdFR5cGV9ICR7dG9hc3RQYWNrYWdlLmNvbmZpZy50b2FzdENsYXNzfSBudWktdG9hc3QtLWFuaW1hdGlvbmA7XG4gICAgICAgIHRoaXMudG9hc3RJY29uID0gdGhpcy50b2FzdFR5cGVUb1NldmVyaXR5SWNvblt0b2FzdFBhY2thZ2UudG9hc3RUeXBlXTtcbiAgICAgICAgdGhpcy5jbG9zZUJ1dHRvbiA9IHRoaXMudG9hc3RQYWNrYWdlLmNvbmZpZy5jbG9zZUJ1dHRvbjtcblxuICAgICAgICBjb25zdCBhY3RpdmF0ZVN1YnNjcmlwdGlvbiA9IHRoaXMudG9hc3RQYWNrYWdlLnRvYXN0UmVmXG4gICAgICAgICAgICAuYWZ0ZXJBY3RpdmF0ZSgpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmFjdGl2YXRlVG9hc3QoKSk7IC8vIElzIG5lZWRlZCB0byBtYWtlIFwiZGlzcGxheTogbm9uZVwiICYgXCJvcGFjaXR5XCIgdHJhbnNpdGlvbnMgd29ya2luZ1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgY2xvc2VTdWJzY3JpcHRpb24gPSB0aGlzLnRvYXN0UGFja2FnZS50b2FzdFJlZlxuICAgICAgICAgICAgLm1hbnVhbENsb3NlZCgpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goYWN0aXZhdGVTdWJzY3JpcHRpb24sIGNsb3NlU3Vic2NyaXB0aW9uKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0cmlnZ2VycyBmYWRlIGluIGFuaW1hdGlvbiBhbmQgc2V0cyB0aW1lb3V0IHRpbGwgdGhlIHRvYXN0IHdpbGwgYmUgZGlzbWlzc2VkXG4gICAgICovXG4gICAgcHVibGljIGFjdGl2YXRlVG9hc3QoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBUb2FzdFN0YXRlLkFjdGl2ZTtcbiAgICAgICAgdGhpcy5mYWRlT3V0ID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy50aW1lT3V0KSB7XG4gICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMudGltZU91dCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuaGlkZVRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHRoaXMub3B0aW9ucy50aW1lT3V0O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLnByb2dyZXNzQmFyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnRlcnZhbElkID0gdGhpcy5yZXBlYXRQcm9ncmVzc0JhckNoYW5nZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGVsbHMgdG9hc3RTZXJ2aWNlIHRvIHJlbW92ZSB0aGlzIHRvYXN0IGFmdGVyIGFuaW1hdGlvbiB0aW1lXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09IFRvYXN0U3RhdGUuUmVtb3ZlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMudGltZW91dCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSBUb2FzdFN0YXRlLlJlbW92ZWQ7XG4gICAgICAgIHRoaXMuZmFkZU91dCA9IHRydWU7XG4gICAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnRvYXN0U2VydmljZS5yZW1vdmUodGhpcy50b2FzdFBhY2thZ2UudG9hc3RJZCksXG4gICAgICAgICAgICB0aGlzLmFuaW1hdGlvbkZhZGVPdXRMZW5ndGhcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBoYW5kbGVzIGNsaWNrIG9uIHRvYXN0IGl0c2VsZlxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoXCJjbGlja1wiKVxuICAgIHB1YmxpYyBjbGlja1RvYXN0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gVG9hc3RTdGF0ZS5SZW1vdmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRvYXN0UGFja2FnZS50cmlnZ2VyQ2xpY2soKTtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNsaWNrVG9EaXNtaXNzKSB7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZGlzYWJsZXMgcHJvZ3Jlc3NCYXIgYW5kIHByZXZlbnRzIHRvYXN0IGZyb20gY2xvc2luZ1xuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoXCJtb3VzZWVudGVyXCIpXG4gICAgcHVibGljIHN0aWNrQXJvdW5kKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gVG9hc3RTdGF0ZS5SZW1vdmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0KTtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRpbWVPdXQgPSAwO1xuICAgICAgICB0aGlzLmhpZGVUaW1lID0gMDtcbiAgICAgICAgLy8gZGlzYWJsZSBwcm9ncmVzc0JhclxuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxJZCk7XG4gICAgICAgIHRoaXMud2lkdGggPSAwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICB1c2luZyBleHRlbmRlZFRpbWVPdXQgdmFsdWUgdG8gZGVsYXkgdG9hc3QncyBjbG9zdXJlXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcihcIm1vdXNlbGVhdmVcIilcbiAgICBwdWJsaWMgZGVsYXllZEhpZGVUb2FzdCgpOiB2b2lkIHtcbiAgICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsSWQpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5leHRlbmRlZFRpbWVPdXQgPT09IDAgfHxcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPT09IFRvYXN0U3RhdGUuUmVtb3ZlZFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoXG4gICAgICAgICAgICAoKSA9PiB0aGlzLnJlbW92ZSgpLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmV4dGVuZGVkVGltZU91dFxuICAgICAgICApO1xuICAgICAgICB0aGlzLm9wdGlvbnMudGltZU91dCA9IHRoaXMub3B0aW9ucy5leHRlbmRlZFRpbWVPdXQ7XG4gICAgICAgIHRoaXMuaGlkZVRpbWUgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArICh0aGlzLm9wdGlvbnMudGltZU91dCB8fCAwKTtcbiAgICAgICAgdGhpcy53aWR0aCA9IDEwMDtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnByb2dyZXNzQmFyKSB7XG4gICAgICAgICAgICB0aGlzLmludGVydmFsSWQgPSB0aGlzLnJlcGVhdFByb2dyZXNzQmFyQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHJlcGVhdFByb2dyZXNzQmFyQ2hhbmdlKCk6IE5vZGVKUy5UaW1lb3V0IHtcbiAgICAgICAgbGV0IGludGVydmFsSWQ7XG5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgaW50ZXJ2YWxJZCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVByb2dyZXNzKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCAodGhpcy5vcHRpb25zLnRpbWVPdXQgfHwgMCkgLyAxMDApO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyB1c2luZyB0eXBlIGFzc2VydGlvbiB0byBhdm9pZCBjb21waWxlIHRpbWUgZXJyb3JcbiAgICAgICAgLy8gdmFyaWFibGUgaW50ZXJ2YWxJZCBpcyBhc3NpZ25lZCBieSBjbG9qdXJlIC8gYXN5bmNcbiAgICAgICAgcmV0dXJuIGludGVydmFsSWQgYXMgdW5rbm93biBhcyBOb2RlSlMuVGltZW91dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB1cGRhdGVzIHByb2dyZXNzIGJhciB3aWR0aFxuICAgICAqL1xuICAgIHByaXZhdGUgdXBkYXRlUHJvZ3Jlc3MoKSB7XG4gICAgICAgIGlmICh0aGlzLndpZHRoID09PSAwIHx8ICF0aGlzLm9wdGlvbnMudGltZU91dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIGNvbnN0IHJlbWFpbmluZyA9IHRoaXMuaGlkZVRpbWUgLSBub3c7XG5cbiAgICAgICAgdGhpcy53aWR0aCA9IChyZW1haW5pbmcgLyB0aGlzLm9wdGlvbnMudGltZU91dCkgKiAxMDA7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wcm9ncmVzc0FuaW1hdGlvbiA9PT0gXCJpbmNyZWFzaW5nXCIpIHtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSAxMDAgLSB0aGlzLndpZHRoO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMud2lkdGggPD0gMCkge1xuICAgICAgICAgICAgdGhpcy53aWR0aCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy53aWR0aCA+PSAxMDApIHtcbiAgICAgICAgICAgIHRoaXMud2lkdGggPSAxMDA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWJzY3JpcHRpb24pID0+XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgICAgICApO1xuICAgICAgICBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWxJZCk7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXQpO1xuICAgIH1cbn1cbiIsIjxkaXZcbiAgICBjbGFzcz1cIm51aS10b2FzdF9fY29udGVudCBkLWZsZXggZmxleC1ub3dyYXAgZmxleC1yb3cganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtc3RhcnRcIlxuICAgIFtjbGFzcy5udWktdG9hc3RfX2NvbnRlbnQtLXdpdGhvdXQtY2xvc2UtYnV0dG9uXT1cIiFjbG9zZUJ1dHRvblwiXG4+XG4gICAgPG51aS1pY29uXG4gICAgICAgIGNsYXNzPVwibnVpLXRvYXN0X19zdGF0dXMtaWNvblwiXG4gICAgICAgIGljb25TaXplPVwibGFyZ2VcIlxuICAgICAgICBpY29uPVwie3sgdG9hc3RJY29uIH19XCJcbiAgICA+PC9udWktaWNvbj5cbiAgICA8ZGl2IGNsYXNzPVwibnVpLXRvYXN0X19jb250ZW50LW1lc3NhZ2UgZmxleC1ncm93LTFcIj5cbiAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwidGl0bGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJudWktdG9hc3RfX2NvbnRlbnQtdGl0bGVcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJ0aXRsZVwiXG4gICAgICAgICAgICA+e3sgdGl0bGUgfX08L3NwYW5cbiAgICAgICAgPlxuICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCJib2R5ICYmIG9wdGlvbnMuZW5hYmxlSHRtbFwiXG4gICAgICAgICAgICBjbGFzcz1cIm51aS10b2FzdF9fY29udGVudC1ib2R5XCJcbiAgICAgICAgICAgIFtpbm5lckhUTUxdPVwiYm9keVwiXG4gICAgICAgID48L3NwYW4+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cImJvZHkgJiYgIW9wdGlvbnMuZW5hYmxlSHRtbFwiXG4gICAgICAgICAgICBjbGFzcz1cIm51aS10b2FzdF9fY29udGVudC1ib2R5XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYm9keVwiXG4gICAgICAgICAgICA+e3sgYm9keSB9fTwvc3BhblxuICAgICAgICA+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cIm9wdGlvbnMuY2xvc2VCdXR0b25cIlxuICAgICAgICBudWktYnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cIm51aS10b2FzdF9fZGlzbWlzcy1idXR0b25cIlxuICAgICAgICBkaXNwbGF5U3R5bGU9XCJhY3Rpb25cIlxuICAgICAgICBzaXplPVwiZGVmYXVsdFwiXG4gICAgICAgIGljb249XCJjbG9zZVwiXG4gICAgICAgIChjbGljayk9XCJyZW1vdmUoKVwiXG4gICAgPjwvYnV0dG9uPlxuPC9kaXY+XG48ZGl2XG4gICAgKm5nSWY9XCJvcHRpb25zLnByb2dyZXNzQmFyXCJcbiAgICBjbGFzcz1cIm51aS10b2FzdF9fcHJvZ3Jlc3NcIlxuICAgIFtzdHlsZS53aWR0aC4lXT1cIndpZHRoXCJcbj48L2Rpdj5cbiJdfQ==