UNPKG

angular2-notifications

Version:

> A light and easy to use notifications library for Angular 2. ~~It features both regular page notifications (toasts) and push notifications.~~

334 lines 54.9 kB
import { animate, state, style, transition, trigger } from '@angular/animations'; import { ChangeDetectionStrategy, Component, Input, TemplateRef, ViewEncapsulation } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "../../services/notifications.service"; import * as i2 from "@angular/platform-browser"; import * as i3 from "@angular/common"; export class NotificationComponent { notificationService; domSanitizer; cd; zone; timeOut; showProgressBar; pauseOnHover; clickToClose; clickIconToClose; maxLength; theClass; rtl; animate; position; item; // Progress bar variables title; content; titleIsTemplate = false; contentIsTemplate = false; htmlIsTemplate = false; progressWidth = 0; safeSvg; safeInputHtml; stopTime = false; timer; framesPerSecond = 40; sleepTime; startTime; endTime; pauseStart; icon; constructor(notificationService, domSanitizer, cd, zone) { this.notificationService = notificationService; this.domSanitizer = domSanitizer; this.cd = cd; this.zone = zone; } ngOnInit() { if (this.item.override) { this.attachOverrides(); } if (this.animate) { this.item.state = this.animate; } if (this.timeOut !== 0) { this.startTimeOut(); } this.contentType(this.item.title, 'title'); this.contentType(this.item.content, 'content'); this.contentType(this.item.html, 'html'); this.safeSvg = this.domSanitizer.bypassSecurityTrustHtml(this.icon || this.item.icon); this.safeInputHtml = this.domSanitizer.bypassSecurityTrustHtml(this.item.html); } ngOnDestroy() { clearTimeout(this.timer); this.cd.detach(); } startTimeOut() { this.sleepTime = 1000 / this.framesPerSecond /* ms */; this.startTime = new Date().getTime(); this.endTime = this.startTime + this.timeOut; this.zone.runOutsideAngular(() => this.timer = setTimeout(this.instance, this.sleepTime)); } onEnter() { if (this.pauseOnHover) { this.stopTime = true; this.pauseStart = new Date().getTime(); } } onLeave() { if (this.pauseOnHover) { this.stopTime = false; this.startTime += (new Date().getTime() - this.pauseStart); this.endTime += (new Date().getTime() - this.pauseStart); this.zone.runOutsideAngular(() => setTimeout(this.instance, this.sleepTime)); } } onClick(event) { this.item.click.emit(event); if (this.clickToClose) { this.remove(); } } onClickIcon(event) { this.item.clickIcon.emit(event); if (this.clickIconToClose) { this.remove(); } } // Attach all the overrides attachOverrides() { Object.keys(this.item.override).forEach(a => { if (this.hasOwnProperty(a)) { this[a] = this.item.override[a]; } }); } instance = () => { const now = new Date().getTime(); if (this.endTime < now) { this.remove(); this.item.timeoutEnd.emit(); } else if (!this.stopTime) { if (this.showProgressBar) { // We add this.sleepTime just to have 100% before close this.progressWidth = Math.min((now - this.startTime + this.sleepTime) * 100 / this.timeOut, 100); } this.timer = setTimeout(this.instance, this.sleepTime); } this.zone.run(() => { if (!this.cd.destroyed) { this.cd.detectChanges(); } }); }; remove() { if (this.animate) { this.item.state = this.animate + 'Out'; setTimeout(() => { this.notificationService.set(this.item, false); }, 310); } else { this.notificationService.set(this.item, false); } } contentType(item, key) { if (item instanceof TemplateRef) { this[key] = item; } else { this[key] = this.domSanitizer.bypassSecurityTrustHtml(item); } this[key + 'IsTemplate'] = item instanceof TemplateRef; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.11", ngImport: i0, type: NotificationComponent, deps: [{ token: i1.NotificationsService }, { token: i2.DomSanitizer }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.11", type: NotificationComponent, selector: "simple-notification", inputs: { timeOut: "timeOut", showProgressBar: "showProgressBar", pauseOnHover: "pauseOnHover", clickToClose: "clickToClose", clickIconToClose: "clickIconToClose", maxLength: "maxLength", theClass: "theClass", rtl: "rtl", animate: "animate", position: "position", item: "item" }, ngImport: i0, template: "<div class=\"simple-notification\"\r\n [@enterLeave]=\"item.state\"\r\n (click)=\"onClick($event)\"\r\n [class]=\"theClass\"\r\n [ngClass]=\"{\r\n 'alert': item.type === 'alert',\r\n 'error': item.type === 'error',\r\n 'warn': item.type === 'warn',\r\n 'success': item.type === 'success',\r\n 'info': item.type === 'info',\r\n 'bare': item.type === 'bare',\r\n 'rtl-mode': rtl,\r\n 'has-icon': item.icon !== 'bare'\r\n }\"\r\n (mouseenter)=\"onEnter()\"\r\n (mouseleave)=\"onLeave()\">\r\n\r\n <div *ngIf=\"!item.html\">\r\n\r\n <div class=\"sn-title\" *ngIf=\"titleIsTemplate; else regularTitle\">\r\n <ng-container *ngTemplateOutlet=\"title; context: item.context\"></ng-container>\r\n </div>\r\n\r\n <ng-template #regularTitle>\r\n <div class=\"sn-title\" [innerHTML]=\"title\"></div>\r\n </ng-template>\r\n\r\n <div class=\"sn-content\" *ngIf=\"contentIsTemplate else regularContent\">\r\n <ng-container *ngTemplateOutlet=\"content; context: item.context\"></ng-container>\r\n </div>\r\n\r\n <ng-template #regularContent>\r\n <div class=\"sn-content\" [innerHTML]=\"content\"></div>\r\n </ng-template>\r\n\r\n <div class=\"icon\" *ngIf=\"item.icon !== 'bare'\" [innerHTML]=\"safeSvg\"></div>\r\n </div>\r\n <div *ngIf=\"item.html\">\r\n <div class=\"sn-html\" *ngIf=\"htmlIsTemplate; else regularHtml\">\r\n <ng-container *ngTemplateOutlet=\"item.html; context: item.context\"></ng-container>\r\n </div>\r\n\r\n <ng-template #regularHtml>\r\n <div class=\"sn-content\" [innerHTML]=\"safeInputHtml\"></div>\r\n </ng-template>\r\n\r\n <div class=\"icon\" [class.icon-hover]=\"clickIconToClose\" *ngIf=\"item.icon\" [innerHTML]=\"safeSvg\" (click)=\"onClickIcon($event)\"></div>\r\n </div>\r\n\r\n <div class=\"sn-progress-loader\" *ngIf=\"showProgressBar\">\r\n <span [ngStyle]=\"{'width': progressWidth + '%'}\"></span>\r\n </div>\r\n\r\n</div>\r\n", styles: [".simple-notification{width:100%;padding:10px 20px;box-sizing:border-box;position:relative;float:left;margin-bottom:10px;color:#fff;cursor:pointer;transition:all .5s;min-height:70px}.simple-notification .sn-title,.simple-notification .sn-content,.simple-notification .sn-html{margin:0}.simple-notification .sn-title{line-height:30px;font-size:20px}.simple-notification .sn-content{font-size:16px;line-height:20px}.simple-notification.has-icon .sn-title,.simple-notification.has-icon .sn-content,.simple-notification.has-icon .sn-html{padding:0 50px 0 0}.simple-notification .icon{position:absolute;box-sizing:border-box;top:0;right:0;width:70px;height:70px;padding:10px}.simple-notification .icon.icon-hover:hover{opacity:.5}.simple-notification .icon svg{fill:#fff;width:100%;height:100%}.simple-notification .icon svg g{fill:#fff}.simple-notification.rtl-mode.has-icon .sn-title,.simple-notification.rtl-mode.has-icon .sn-content,.simple-notification.rtl-mode.has-icon .sn-html{padding:0 0 0 50px}.simple-notification.rtl-mode{direction:rtl}.simple-notification.rtl-mode .sn-content{padding:0 0 0 50px}.simple-notification.rtl-mode svg{left:0;right:auto}.simple-notification.error{background:#F44336}.simple-notification.success{background:#8BC34A}.simple-notification.alert{background:#ffdb5b}.simple-notification.info{background:#03A9F4}.simple-notification.warn{background:#ffdb5b}.simple-notification .sn-progress-loader{position:absolute;top:0;left:0;width:100%;height:5px}.simple-notification .sn-progress-loader span{float:left;height:100%}.simple-notification.success .sn-progress-loader span{background:#689F38}.simple-notification.error .sn-progress-loader span{background:#D32F2F}.simple-notification.alert .sn-progress-loader span{background:#edc242}.simple-notification.info .sn-progress-loader span{background:#0288D1}.simple-notification.warn .sn-progress-loader span{background:#edc242}.simple-notification.bare .sn-progress-loader span{background:#ccc}.simple-notification.warn div .sn-title,.simple-notification.warn div .sn-content,.simple-notification.warn div .sn-html{color:#444}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], animations: [ trigger('enterLeave', [ // Fade state('fade', style({ opacity: 1 })), transition('* => fade', [ style({ opacity: 0 }), animate('400ms ease-in-out') ]), state('fadeOut', style({ opacity: 0 })), transition('fade => fadeOut', [ style({ opacity: 1 }), animate('300ms ease-in-out') ]), // Enter from top state('fromTop', style({ opacity: 1, transform: 'translateY(0)' })), transition('* => fromTop', [ style({ opacity: 0, transform: 'translateY(-5%)' }), animate('400ms ease-in-out') ]), state('fromTopOut', style({ opacity: 0, transform: 'translateY(5%)' })), transition('fromTop => fromTopOut', [ style({ opacity: 1, transform: 'translateY(0)' }), animate('300ms ease-in-out') ]), // Enter from right state('fromRight', style({ opacity: 1, transform: 'translateX(0)' })), transition('* => fromRight', [ style({ opacity: 0, transform: 'translateX(5%)' }), animate('400ms ease-in-out') ]), state('fromRightOut', style({ opacity: 0, transform: 'translateX(-5%)' })), transition('fromRight => fromRightOut', [ style({ opacity: 1, transform: 'translateX(0)' }), animate('300ms ease-in-out') ]), // Enter from bottom state('fromBottom', style({ opacity: 1, transform: 'translateY(0)' })), transition('* => fromBottom', [ style({ opacity: 0, transform: 'translateY(5%)' }), animate('400ms ease-in-out') ]), state('fromBottomOut', style({ opacity: 0, transform: 'translateY(-5%)' })), transition('fromBottom => fromBottomOut', [ style({ opacity: 1, transform: 'translateY(0)' }), animate('300ms ease-in-out') ]), // Enter from left state('fromLeft', style({ opacity: 1, transform: 'translateX(0)' })), transition('* => fromLeft', [ style({ opacity: 0, transform: 'translateX(-5%)' }), animate('400ms ease-in-out') ]), state('fromLeftOut', style({ opacity: 0, transform: 'translateX(5%)' })), transition('fromLeft => fromLeftOut', [ style({ opacity: 1, transform: 'translateX(0)' }), animate('300ms ease-in-out') ]), // Rotate state('scale', style({ opacity: 1, transform: 'scale(1)' })), transition('* => scale', [ style({ opacity: 0, transform: 'scale(0)' }), animate('400ms ease-in-out') ]), state('scaleOut', style({ opacity: 0, transform: 'scale(0)' })), transition('scale => scaleOut', [ style({ opacity: 1, transform: 'scale(1)' }), animate('400ms ease-in-out') ]), // Scale state('rotate', style({ opacity: 1, transform: 'rotate(0deg)' })), transition('* => rotate', [ style({ opacity: 0, transform: 'rotate(5deg)' }), animate('400ms ease-in-out') ]), state('rotateOut', style({ opacity: 0, transform: 'rotate(-5deg)' })), transition('rotate => rotateOut', [ style({ opacity: 1, transform: 'rotate(0deg)' }), animate('400ms ease-in-out') ]) ]) ], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.11", ngImport: i0, type: NotificationComponent, decorators: [{ type: Component, args: [{ selector: 'simple-notification', encapsulation: ViewEncapsulation.None, animations: [ trigger('enterLeave', [ // Fade state('fade', style({ opacity: 1 })), transition('* => fade', [ style({ opacity: 0 }), animate('400ms ease-in-out') ]), state('fadeOut', style({ opacity: 0 })), transition('fade => fadeOut', [ style({ opacity: 1 }), animate('300ms ease-in-out') ]), // Enter from top state('fromTop', style({ opacity: 1, transform: 'translateY(0)' })), transition('* => fromTop', [ style({ opacity: 0, transform: 'translateY(-5%)' }), animate('400ms ease-in-out') ]), state('fromTopOut', style({ opacity: 0, transform: 'translateY(5%)' })), transition('fromTop => fromTopOut', [ style({ opacity: 1, transform: 'translateY(0)' }), animate('300ms ease-in-out') ]), // Enter from right state('fromRight', style({ opacity: 1, transform: 'translateX(0)' })), transition('* => fromRight', [ style({ opacity: 0, transform: 'translateX(5%)' }), animate('400ms ease-in-out') ]), state('fromRightOut', style({ opacity: 0, transform: 'translateX(-5%)' })), transition('fromRight => fromRightOut', [ style({ opacity: 1, transform: 'translateX(0)' }), animate('300ms ease-in-out') ]), // Enter from bottom state('fromBottom', style({ opacity: 1, transform: 'translateY(0)' })), transition('* => fromBottom', [ style({ opacity: 0, transform: 'translateY(5%)' }), animate('400ms ease-in-out') ]), state('fromBottomOut', style({ opacity: 0, transform: 'translateY(-5%)' })), transition('fromBottom => fromBottomOut', [ style({ opacity: 1, transform: 'translateY(0)' }), animate('300ms ease-in-out') ]), // Enter from left state('fromLeft', style({ opacity: 1, transform: 'translateX(0)' })), transition('* => fromLeft', [ style({ opacity: 0, transform: 'translateX(-5%)' }), animate('400ms ease-in-out') ]), state('fromLeftOut', style({ opacity: 0, transform: 'translateX(5%)' })), transition('fromLeft => fromLeftOut', [ style({ opacity: 1, transform: 'translateX(0)' }), animate('300ms ease-in-out') ]), // Rotate state('scale', style({ opacity: 1, transform: 'scale(1)' })), transition('* => scale', [ style({ opacity: 0, transform: 'scale(0)' }), animate('400ms ease-in-out') ]), state('scaleOut', style({ opacity: 0, transform: 'scale(0)' })), transition('scale => scaleOut', [ style({ opacity: 1, transform: 'scale(1)' }), animate('400ms ease-in-out') ]), // Scale state('rotate', style({ opacity: 1, transform: 'rotate(0deg)' })), transition('* => rotate', [ style({ opacity: 0, transform: 'rotate(5deg)' }), animate('400ms ease-in-out') ]), state('rotateOut', style({ opacity: 0, transform: 'rotate(-5deg)' })), transition('rotate => rotateOut', [ style({ opacity: 1, transform: 'rotate(0deg)' }), animate('400ms ease-in-out') ]) ]) ], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"simple-notification\"\r\n [@enterLeave]=\"item.state\"\r\n (click)=\"onClick($event)\"\r\n [class]=\"theClass\"\r\n [ngClass]=\"{\r\n 'alert': item.type === 'alert',\r\n 'error': item.type === 'error',\r\n 'warn': item.type === 'warn',\r\n 'success': item.type === 'success',\r\n 'info': item.type === 'info',\r\n 'bare': item.type === 'bare',\r\n 'rtl-mode': rtl,\r\n 'has-icon': item.icon !== 'bare'\r\n }\"\r\n (mouseenter)=\"onEnter()\"\r\n (mouseleave)=\"onLeave()\">\r\n\r\n <div *ngIf=\"!item.html\">\r\n\r\n <div class=\"sn-title\" *ngIf=\"titleIsTemplate; else regularTitle\">\r\n <ng-container *ngTemplateOutlet=\"title; context: item.context\"></ng-container>\r\n </div>\r\n\r\n <ng-template #regularTitle>\r\n <div class=\"sn-title\" [innerHTML]=\"title\"></div>\r\n </ng-template>\r\n\r\n <div class=\"sn-content\" *ngIf=\"contentIsTemplate else regularContent\">\r\n <ng-container *ngTemplateOutlet=\"content; context: item.context\"></ng-container>\r\n </div>\r\n\r\n <ng-template #regularContent>\r\n <div class=\"sn-content\" [innerHTML]=\"content\"></div>\r\n </ng-template>\r\n\r\n <div class=\"icon\" *ngIf=\"item.icon !== 'bare'\" [innerHTML]=\"safeSvg\"></div>\r\n </div>\r\n <div *ngIf=\"item.html\">\r\n <div class=\"sn-html\" *ngIf=\"htmlIsTemplate; else regularHtml\">\r\n <ng-container *ngTemplateOutlet=\"item.html; context: item.context\"></ng-container>\r\n </div>\r\n\r\n <ng-template #regularHtml>\r\n <div class=\"sn-content\" [innerHTML]=\"safeInputHtml\"></div>\r\n </ng-template>\r\n\r\n <div class=\"icon\" [class.icon-hover]=\"clickIconToClose\" *ngIf=\"item.icon\" [innerHTML]=\"safeSvg\" (click)=\"onClickIcon($event)\"></div>\r\n </div>\r\n\r\n <div class=\"sn-progress-loader\" *ngIf=\"showProgressBar\">\r\n <span [ngStyle]=\"{'width': progressWidth + '%'}\"></span>\r\n </div>\r\n\r\n</div>\r\n", styles: [".simple-notification{width:100%;padding:10px 20px;box-sizing:border-box;position:relative;float:left;margin-bottom:10px;color:#fff;cursor:pointer;transition:all .5s;min-height:70px}.simple-notification .sn-title,.simple-notification .sn-content,.simple-notification .sn-html{margin:0}.simple-notification .sn-title{line-height:30px;font-size:20px}.simple-notification .sn-content{font-size:16px;line-height:20px}.simple-notification.has-icon .sn-title,.simple-notification.has-icon .sn-content,.simple-notification.has-icon .sn-html{padding:0 50px 0 0}.simple-notification .icon{position:absolute;box-sizing:border-box;top:0;right:0;width:70px;height:70px;padding:10px}.simple-notification .icon.icon-hover:hover{opacity:.5}.simple-notification .icon svg{fill:#fff;width:100%;height:100%}.simple-notification .icon svg g{fill:#fff}.simple-notification.rtl-mode.has-icon .sn-title,.simple-notification.rtl-mode.has-icon .sn-content,.simple-notification.rtl-mode.has-icon .sn-html{padding:0 0 0 50px}.simple-notification.rtl-mode{direction:rtl}.simple-notification.rtl-mode .sn-content{padding:0 0 0 50px}.simple-notification.rtl-mode svg{left:0;right:auto}.simple-notification.error{background:#F44336}.simple-notification.success{background:#8BC34A}.simple-notification.alert{background:#ffdb5b}.simple-notification.info{background:#03A9F4}.simple-notification.warn{background:#ffdb5b}.simple-notification .sn-progress-loader{position:absolute;top:0;left:0;width:100%;height:5px}.simple-notification .sn-progress-loader span{float:left;height:100%}.simple-notification.success .sn-progress-loader span{background:#689F38}.simple-notification.error .sn-progress-loader span{background:#D32F2F}.simple-notification.alert .sn-progress-loader span{background:#edc242}.simple-notification.info .sn-progress-loader span{background:#0288D1}.simple-notification.warn .sn-progress-loader span{background:#edc242}.simple-notification.bare .sn-progress-loader span{background:#ccc}.simple-notification.warn div .sn-title,.simple-notification.warn div .sn-content,.simple-notification.warn div .sn-html{color:#444}\n"] }] }], ctorParameters: function () { return [{ type: i1.NotificationsService }, { type: i2.DomSanitizer }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }]; }, propDecorators: { timeOut: [{ type: Input }], showProgressBar: [{ type: Input }], pauseOnHover: [{ type: Input }], clickToClose: [{ type: Input }], clickIconToClose: [{ type: Input }], maxLength: [{ type: Input }], theClass: [{ type: Input }], rtl: [{ type: Input }], animate: [{ type: Input }], position: [{ type: Input }], item: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXIyLW5vdGlmaWNhdGlvbnMvc3JjL2xpYi9jb21wb25lbnRzL25vdGlmaWNhdGlvbi9ub3RpZmljYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhcjItbm90aWZpY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUE2QixXQUFXLEVBQUUsaUJBQWlCLEVBQThCLE1BQU0sZUFBZSxDQUFDOzs7OztBQXNHakssTUFBTSxPQUFPLHFCQUFxQjtJQXNDdEI7SUFDQTtJQUNBO0lBQ0E7SUF2Q0QsT0FBTyxDQUFTO0lBQ2hCLGVBQWUsQ0FBVTtJQUN6QixZQUFZLENBQVU7SUFDdEIsWUFBWSxDQUFVO0lBQ3RCLGdCQUFnQixDQUFVO0lBQzFCLFNBQVMsQ0FBUztJQUNsQixRQUFRLENBQVM7SUFDakIsR0FBRyxDQUFVO0lBQ2IsT0FBTyxDQUE0QjtJQUNuQyxRQUFRLENBQVM7SUFDakIsSUFBSSxDQUFlO0lBRzVCLHlCQUF5QjtJQUN6QixLQUFLLENBQU07SUFDWCxPQUFPLENBQU07SUFFYixlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLGlCQUFpQixHQUFHLEtBQUssQ0FBQztJQUMxQixjQUFjLEdBQUcsS0FBSyxDQUFDO0lBRXZCLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFDbEIsT0FBTyxDQUFXO0lBQ2xCLGFBQWEsQ0FBVztJ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bnQiOlsiaW1wb3J0IHsgYW5pbWF0ZSwgc3RhdGUsIHN0eWxlLCB0cmFuc2l0aW9uLCB0cmlnZ2VyIH0gZnJvbSAnQGFuZ3VsYXIvYW5pbWF0aW9ucyc7XHJcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIElucHV0LCBOZ1pvbmUsIE9uRGVzdHJveSwgT25Jbml0LCBUZW1wbGF0ZVJlZiwgVmlld0VuY2Fwc3VsYXRpb24sIENoYW5nZURldGVjdG9yUmVmLCBWaWV3UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZUh0bWwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgTm90aWZpY2F0aW9uQW5pbWF0aW9uVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL25vdGlmaWNhdGlvbi1hbmltYXRpb24tdHlwZS5lbnVtJztcclxuaW1wb3J0IHsgTm90aWZpY2F0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9ub3RpZmljYXRpb24udHlwZSc7XHJcbmltcG9ydCB7IE5vdGlmaWNhdGlvbnNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvbm90aWZpY2F0aW9ucy5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2ltcGxlLW5vdGlmaWNhdGlvbicsXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcclxuICBhbmltYXRpb25zOiBbXHJcbiAgICB0cmlnZ2VyKCdlbnRlckxlYXZlJywgW1xyXG5cclxuICAgICAgLy8gRmFkZVxyXG4gICAgICBzdGF0ZSgnZmFkZScsIHN0eWxlKHtvcGFjaXR5OiAxfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCcqID0+IGZhZGUnLCBbXHJcbiAgICAgICAgc3R5bGUoe29wYWNpdHk6IDB9KSxcclxuICAgICAgICBhbmltYXRlKCc0MDBtcyBlYXNlLWluLW91dCcpXHJcbiAgICAgIF0pLFxyXG4gICAgICBzdGF0ZSgnZmFkZU91dCcsIHN0eWxlKHtvcGFjaXR5OiAwfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCdmYWRlID0+IGZhZGVPdXQnLCBbXHJcbiAgICAgICAgc3R5bGUoe29wYWNpdHk6IDF9KSxcclxuICAgICAgICBhbmltYXRlKCczMDBtcyBlYXNlLWluLW91dCcpXHJcbiAgICAgIF0pLFxyXG5cclxuICAgICAgLy8gRW50ZXIgZnJvbSB0b3BcclxuICAgICAgc3RhdGUoJ2Zyb21Ub3AnLCBzdHlsZSh7b3BhY2l0eTogMSwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwKSd9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJyogPT4gZnJvbVRvcCcsIFtcclxuICAgICAgICBzdHlsZSh7b3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtNSUpJ30pLFxyXG4gICAgICAgIGFuaW1hdGUoJzQwMG1zIGVhc2UtaW4tb3V0JylcclxuICAgICAgXSksXHJcbiAgICAgIHN0YXRlKCdmcm9tVG9wT3V0Jywgc3R5bGUoe29wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoNSUpJ30pKSxcclxuICAgICAgdHJhbnNpdGlvbignZnJvbVRvcCA9PiBmcm9tVG9wT3V0JywgW1xyXG4gICAgICAgIHN0eWxlKHtvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDApJ30pLFxyXG4gICAgICAgIGFuaW1hdGUoJzMwMG1zIGVhc2UtaW4tb3V0JylcclxuICAgICAgXSksXHJcblxyXG4gICAgICAvLyBFbnRlciBmcm9tIHJpZ2h0XHJcbiAgICAgIHN0YXRlKCdmcm9tUmlnaHQnLCBzdHlsZSh7b3BhY2l0eTogMSwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgwKSd9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJyogPT4gZnJvbVJpZ2h0JywgW1xyXG4gICAgICAgIHN0eWxlKHtvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDUlKSd9KSxcclxuICAgICAgICBhbmltYXRlKCc0MDBtcyBlYXNlLWluLW91dCcpXHJcbiAgICAgIF0pLFxyXG4gICAgICBzdGF0ZSgnZnJvbVJpZ2h0T3V0Jywgc3R5bGUoe29wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoLTUlKSd9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2Zyb21SaWdodCA9PiBmcm9tUmlnaHRPdXQnLCBbXHJcbiAgICAgICAgc3R5bGUoe29wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVgoMCknfSksXHJcbiAgICAgICAgYW5pbWF0ZSgnMzAwbXMgZWFzZS1pbi1vdXQnKVxyXG4gICAgICBdKSxcclxuXHJcbiAgICAgIC8vIEVudGVyIGZyb20gYm90dG9tXHJcbiAgICAgIHN0YXRlKCdmcm9tQm90dG9tJywgc3R5bGUoe29wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMCknfSkpLFxyXG4gICAgICB0cmFuc2l0aW9uKCcqID0+IGZyb21Cb3R0b20nLCBbXHJcbiAgICAgICAgc3R5bGUoe29wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoNSUpJ30pLFxyXG4gICAgICAgIGFuaW1hdGUoJzQwMG1zIGVhc2UtaW4tb3V0JylcclxuICAgICAgXSksXHJcbiAgICAgIHN0YXRlKCdmcm9tQm90dG9tT3V0Jywgc3R5bGUoe29wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTUlKSd9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2Zyb21Cb3R0b20gPT4gZnJvbUJvdHRvbU91dCcsIFtcclxuICAgICAgICBzdHlsZSh7b3BhY2l0eTogMSwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwKSd9KSxcclxuICAgICAgICBhbmltYXRlKCczMDBtcyBlYXNlLWluLW91dCcpXHJcbiAgICAgIF0pLFxyXG5cclxuICAgICAgLy8gRW50ZXIgZnJvbSBsZWZ0XHJcbiAgICAgIHN0YXRlKCdmcm9tTGVmdCcsIHN0eWxlKHtvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDApJ30pKSxcclxuICAgICAgdHJhbnNpdGlvbignKiA9PiBmcm9tTGVmdCcsIFtcclxuICAgICAgICBzdHlsZSh7b3BhY2l0eTogMCwgdHJhbnNmb3JtOiAndHJhbnNsYXRlWCgtNSUpJ30pLFxyXG4gICAgICAgIGFuaW1hdGUoJzQwMG1zIGVhc2UtaW4tb3V0JylcclxuICAgICAgXSksXHJcbiAgICAgIHN0YXRlKCdmcm9tTGVmdE91dCcsIHN0eWxlKHtvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDUlKSd9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJ2Zyb21MZWZ0ID0+IGZyb21MZWZ0T3V0JywgW1xyXG4gICAgICAgIHN0eWxlKHtvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVYKDApJ30pLFxyXG4gICAgICAgIGFuaW1hdGUoJzMwMG1zIGVhc2UtaW4tb3V0JylcclxuICAgICAgXSksXHJcblxyXG4gICAgICAvLyBSb3RhdGVcclxuICAgICAgc3RhdGUoJ3NjYWxlJywgc3R5bGUoe29wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3NjYWxlKDEpJ30pKSxcclxuICAgICAgdHJhbnNpdGlvbignKiA9PiBzY2FsZScsIFtcclxuICAgICAgICBzdHlsZSh7b3BhY2l0eTogMCwgdHJhbnNmb3JtOiAnc2NhbGUoMCknfSksXHJcbiAgICAgICAgYW5pbWF0ZSgnNDAwbXMgZWFzZS1pbi1vdXQnKVxyXG4gICAgICBdKSxcclxuICAgICAgc3RhdGUoJ3NjYWxlT3V0Jywgc3R5bGUoe29wYWNpdHk6IDAsIHRyYW5zZm9ybTogJ3NjYWxlKDApJ30pKSxcclxuICAgICAgdHJhbnNpdGlvbignc2NhbGUgPT4gc2NhbGVPdXQnLCBbXHJcbiAgICAgICAgc3R5bGUoe29wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3NjYWxlKDEpJ30pLFxyXG4gICAgICAgIGFuaW1hdGUoJzQwMG1zIGVhc2UtaW4tb3V0JylcclxuICAgICAgXSksXHJcblxyXG4gICAgICAvLyBTY2FsZVxyXG4gICAgICBzdGF0ZSgncm90YXRlJywgc3R5bGUoe29wYWNpdHk6IDEsIHRyYW5zZm9ybTogJ3JvdGF0ZSgwZGVnKSd9KSksXHJcbiAgICAgIHRyYW5zaXRpb24oJyogPT4gcm90YXRlJywgW1xyXG4gICAgICAgIHN0eWxlKHtvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICdyb3RhdGUoNWRlZyknfSksXHJcbiAgICAgICAgYW5pbWF0ZSgnNDAwbXMgZWFzZS1pbi1vdXQnKVxyXG4gICAgICBdKSxcclxuICAgICAgc3RhdGUoJ3JvdGF0ZU91dCcsIHN0eWxlKHtvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICdyb3RhdGUoLTVkZWcpJ30pKSxcclxuICAgICAgdHJhbnNpdGlvbigncm90YXRlID0+IHJvdGF0ZU91dCcsIFtcclxuICAgICAgICBzdHlsZSh7b3BhY2l0eTogMSwgdHJhbnNmb3JtOiAncm90YXRlKDBkZWcpJ30pLFxyXG4gICAgICAgIGFuaW1hdGUoJzQwMG1zIGVhc2UtaW4tb3V0JylcclxuICAgICAgXSlcclxuICAgIF0pXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vbm90aWZpY2F0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9ub3RpZmljYXRpb24uY29tcG9uZW50LmNzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgTm90aWZpY2F0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICBASW5wdXQoKSB0aW1lT3V0OiBudW1iZXI7XHJcbiAgQElucHV0KCkgc2hvd1Byb2dyZXNzQmFyOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHBhdXNlT25Ib3ZlcjogYm9vbGVhbjtcclxuICBASW5wdXQoKSBjbGlja1RvQ2xvc2U6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgY2xpY2tJY29uVG9DbG9zZTogYm9vbGVhbjtcclxuICBASW5wdXQoKSBtYXhMZW5ndGg6IG51bWJlcjtcclxuICBASW5wdXQoKSB0aGVDbGFzczogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHJ0bDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBhbmltYXRlOiBOb3RpZmljYXRpb25BbmltYXRpb25UeXBlO1xyXG4gIEBJbnB1dCgpIHBvc2l0aW9uOiBudW1iZXI7XHJcbiAgQElucHV0KCkgaXRlbTogTm90aWZpY2F0aW9uO1xyXG5cclxuXHJcbiAgLy8gUHJvZ3Jlc3MgYmFyIHZhcmlhYmxlc1xyXG4gIHRpdGxlOiBhbnk7XHJcbiAgY29udGVudDogYW55O1xyXG5cclxuICB0aXRsZUlzVGVtcGxhdGUgPSBmYWxzZTtcclxuICBjb250ZW50SXNUZW1wbGF0ZSA9IGZhbHNlO1xyXG4gIGh0bWxJc1RlbXBsYXRlID0gZmFsc2U7XHJcblxyXG4gIHByb2dyZXNzV2lkdGggPSAwO1xyXG4gIHNhZmVTdmc6IFNhZmVIdG1sO1xyXG4gIHNhZmVJbnB1dEh0bWw6IFNhZmVIdG1sO1xyXG5cclxuICBwcml2YXRlIHN0b3BUaW1lID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSB0aW1lcjogYW55O1xyXG4gIHByaXZhdGUgZnJhbWVzUGVyU2Vjb25kID0gNDA7XHJcbiAgcHJpdmF0ZSBzbGVlcFRpbWU6IG51bWJlcjtcclxuICBwcml2YXRlIHN0YXJ0VGltZTogbnVtYmVyO1xyXG4gIHByaXZhdGUgZW5kVGltZTogbnVtYmVyO1xyXG4gIHByaXZhdGUgcGF1c2VTdGFydDogbnVtYmVyO1xyXG5cclxuICBwcml2YXRlIGljb246IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvbnNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBkb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcixcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmVcclxuICApIHt9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgaWYgKHRoaXMuaXRlbS5vdmVycmlkZSkge1xyXG4gICAgICB0aGlzLmF0dGFjaE92ZXJyaWRlcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmFuaW1hdGUpIHtcclxuICAgICAgdGhpcy5pdGVtLnN0YXRlID0gdGhpcy5hbmltYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnRpbWVPdXQgIT09IDApIHtcclxuICAgICAgdGhpcy5zdGFydFRpbWVPdXQoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbnRlbnRUeXBlKHRoaXMuaXRlbS50aXRsZSwgJ3RpdGxlJyk7XHJcbiAgICB0aGlzLmNvbnRlbnRUeXBlKHRoaXMuaXRlbS5jb250ZW50LCAnY29udGVudCcpO1xyXG4gICAgdGhpcy5jb250ZW50VHlwZSh0aGlzLml0ZW0uaHRtbCwgJ2h0bWwnKTtcclxuXHJcbiAgICB0aGlzLnNhZmVTdmcgPSB0aGlzLmRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh0aGlzLmljb24gfHwgdGhpcy5pdGVtLmljb24pO1xyXG4gICAgdGhpcy5zYWZlSW5wdXRIdG1sID0gdGhpcy5kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodGhpcy5pdGVtLmh0bWwpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lcik7XHJcbiAgICB0aGlzLmNkLmRldGFjaCgpO1xyXG4gIH1cclxuXHJcbiAgc3RhcnRUaW1lT3V0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zbGVlcFRpbWUgPSAxMDAwIC8gdGhpcy5mcmFtZXNQZXJTZWNvbmQgLyogbXMgKi87XHJcbiAgICB0aGlzLnN0YXJ0VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgdGhpcy5lbmRUaW1lID0gdGhpcy5zdGFydFRpbWUgKyB0aGlzLnRpbWVPdXQ7XHJcbiAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdGhpcy50aW1lciA9IHNldFRpbWVvdXQodGhpcy5pbnN0YW5jZSwgdGhpcy5zbGVlcFRpbWUpKTtcclxuICB9XHJcblxyXG4gIG9uRW50ZXIoKSB7XHJcbiAgICBpZiAodGhpcy5wYXVzZU9uSG92ZXIpIHtcclxuICAgICAgdGhpcy5zdG9wVGltZSA9IHRydWU7XHJcbiAgICAgIHRoaXMucGF1c2VTdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25MZWF2ZSgpIHtcclxuICAgIGlmICh0aGlzLnBhdXNlT25Ib3Zlcikge1xyXG4gICAgICB0aGlzLnN0b3BUaW1lID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc3RhcnRUaW1lICs9IChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHRoaXMucGF1c2VTdGFydCk7XHJcbiAgICAgIHRoaXMuZW5kVGltZSArPSAobmV3IERhdGUoKS5nZXRUaW1lKCkgLSB0aGlzLnBhdXNlU3RhcnQpO1xyXG4gICAgICB0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gc2V0VGltZW91dCh0aGlzLmluc3RhbmNlLCB0aGlzLnNsZWVwVGltZSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25DbGljayhldmVudDogTW91c2VFdmVudCkge1xyXG4gICAgdGhpcy5pdGVtLmNsaWNrIS5lbWl0KGV2ZW50KTtcclxuXHJcbiAgICBpZiAodGhpcy5jbGlja1RvQ2xvc2UpIHtcclxuICAgICAgdGhpcy5yZW1vdmUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uQ2xpY2tJY29uKGV2ZW50OiBNb3VzZUV2ZW50KSB7XHJcbiAgICB0aGlzLml0ZW0uY2xpY2tJY29uIS5lbWl0KGV2ZW50KTtcclxuXHJcbiAgICBpZiAodGhpcy5jbGlja0ljb25Ub0Nsb3NlKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlK