UNPKG

cfc-ds

Version:

Design System do Conselho Federal de Contabilidade baseado no govbr-ds

142 lines 21.5 kB
import { Component, Input, HostBinding, } from '@angular/core'; import { MessageState } from '../../enums/message-state.enum'; import { MessageType } from '../../enums/message-type.enum'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "@angular/flex-layout/extended"; export class MessageComponent { elementRef; message; description; state = MessageState.warning; type = MessageType.alert; horizontalPosition = 'right'; verticalPosition = 'top'; verticalOffset = '0.1rem'; horizontalOffset = '0.1rem'; displayTime = 5000; isTemporary; position = 'fixed'; zIndex = 1000; display = 'none'; get topPosition() { return this.verticalPosition === 'top' ? this.verticalOffset : null; } get bottomPosition() { return this.verticalPosition === 'bottom' ? this.verticalOffset : null; } get leftPosition() { return this.horizontalPosition === 'left' ? this.horizontalOffset : null; } get rightPosition() { return this.horizontalPosition === 'right' ? this.horizontalOffset : null; } isVisible = false; messageTypes = MessageType; closeTimeoutId; ngOnInit() { if (this.isTemporary === undefined) { this.isTemporary = this.type === this.messageTypes.feedback; } } constructor(elementRef) { this.elementRef = elementRef; } ngOnChanges(changes) { if (changes['type']) { if (this.type === this.messageTypes.alert) { this.elementRef.nativeElement.style.width = '100%'; } else { this.elementRef.nativeElement.style.width = 'auto'; } } } get icon() { switch (this.state) { case MessageState.danger: return 'fas fa-times-circle'; case MessageState.info: return 'fas fa-info-circle'; case MessageState.success: return 'fas fa-check-circle'; default: return 'fas fa-exclamation-triangle'; } } /** * Método público para abrir a mensagem. * Reinicia o temporizador de fechamento caso a mensagem seja temporária. */ openMessage() { this.isVisible = true; this.display = 'flex'; if (this.isTemporary) { this.restartCloseTimer(); } } /** * Método público para fechar a mensagem manualmente. */ closeMessage() { this.isVisible = false; if (this.isTemporary) { clearTimeout(this.closeTimeoutId); } setTimeout(() => this.display = 'none', 200); } restartCloseTimer() { clearTimeout(this.closeTimeoutId); this.closeTimeoutId = setTimeout(() => { this.closeMessage(); }, this.displayTime); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MessageComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MessageComponent, selector: "cfc-message", inputs: { message: "message", description: "description", state: "state", type: "type", horizontalPosition: "horizontalPosition", verticalPosition: "verticalPosition", verticalOffset: "verticalOffset", horizontalOffset: "horizontalOffset", displayTime: "displayTime", isTemporary: "isTemporary" }, host: { properties: { "style.position": "this.position", "style.zIndex": "this.zIndex", "style.display": "this.display", "style.top": "this.topPosition", "style.bottom": "this.bottomPosition", "style.left": "this.leftPosition", "style.right": "this.rightPosition" } }, usesOnChanges: true, ngImport: i0, template: "<ng-container *ngIf=\"isTemporary || isVisible\">\r\n <ng-container *ngIf=\"type === messageTypes.alert; else feedback\">\r\n <div\r\n class=\"br-message message-container\"\r\n style=\"width: 100%;\"\r\n [class.fade-out]=\"!isVisible\"\r\n [ngClass]=\"state\">\r\n <div\r\n class=\"icon\">\r\n <i\r\n [ngClass]=\"icon\"\r\n aria-hidden=\"true\">\r\n </i>\r\n </div>\r\n <div\r\n class=\"content\"\r\n [ariaLabel]=\"message + ' ' + description\"\r\n role=\"alert\">\r\n <span\r\n class=\"message-title\">\r\n {{ message }}\r\n </span>\r\n <span\r\n *ngIf=\"description\"\r\n class=\"message-body\">\r\n {{ description }}\r\n </span>\r\n </div>\r\n <div class=\"close\">\r\n <button\r\n class=\"br-button circle small\"\r\n type=\"button\"\r\n aria-label=\"Fechar a messagem alterta\"\r\n (click)=\"closeMessage()\"\r\n >\r\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #feedback>\r\n <div\r\n class=\"message-container mb-3\"\r\n [class.fade-out]=\"!isVisible\">\r\n <span\r\n class=\"feedback\"\r\n [ngClass]=\"state\"\r\n role=\"alert\">\r\n <i\r\n [ngClass]=\"icon\"\r\n aria-hidden=\"true\">\r\n </i>\r\n {{ message }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n</ng-container>\r\n", styles: ["@keyframes slideDown{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.message-container{animation:slideDown .3s ease-out}.fade-out{animation:fadeOut .3s ease-out}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultClassDirective, selector: " [ngClass], [ngClass.xs], [ngClass.sm], [ngClass.md], [ngClass.lg], [ngClass.xl], [ngClass.lt-sm], [ngClass.lt-md], [ngClass.lt-lg], [ngClass.lt-xl], [ngClass.gt-xs], [ngClass.gt-sm], [ngClass.gt-md], [ngClass.gt-lg]", inputs: ["ngClass", "ngClass.xs", "ngClass.sm", "ngClass.md", "ngClass.lg", "ngClass.xl", "ngClass.lt-sm", "ngClass.lt-md", "ngClass.lt-lg", "ngClass.lt-xl", "ngClass.gt-xs", "ngClass.gt-sm", "ngClass.gt-md", "ngClass.gt-lg"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MessageComponent, decorators: [{ type: Component, args: [{ selector: 'cfc-message', template: "<ng-container *ngIf=\"isTemporary || isVisible\">\r\n <ng-container *ngIf=\"type === messageTypes.alert; else feedback\">\r\n <div\r\n class=\"br-message message-container\"\r\n style=\"width: 100%;\"\r\n [class.fade-out]=\"!isVisible\"\r\n [ngClass]=\"state\">\r\n <div\r\n class=\"icon\">\r\n <i\r\n [ngClass]=\"icon\"\r\n aria-hidden=\"true\">\r\n </i>\r\n </div>\r\n <div\r\n class=\"content\"\r\n [ariaLabel]=\"message + ' ' + description\"\r\n role=\"alert\">\r\n <span\r\n class=\"message-title\">\r\n {{ message }}\r\n </span>\r\n <span\r\n *ngIf=\"description\"\r\n class=\"message-body\">\r\n {{ description }}\r\n </span>\r\n </div>\r\n <div class=\"close\">\r\n <button\r\n class=\"br-button circle small\"\r\n type=\"button\"\r\n aria-label=\"Fechar a messagem alterta\"\r\n (click)=\"closeMessage()\"\r\n >\r\n <i class=\"fas fa-times\" aria-hidden=\"true\"></i>\r\n </button>\r\n </div>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #feedback>\r\n <div\r\n class=\"message-container mb-3\"\r\n [class.fade-out]=\"!isVisible\">\r\n <span\r\n class=\"feedback\"\r\n [ngClass]=\"state\"\r\n role=\"alert\">\r\n <i\r\n [ngClass]=\"icon\"\r\n aria-hidden=\"true\">\r\n </i>\r\n {{ message }}\r\n </span>\r\n </div>\r\n </ng-template>\r\n</ng-container>\r\n", styles: ["@keyframes slideDown{0%{opacity:0;transform:translateY(-20px)}to{opacity:1;transform:translateY(0)}}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.message-container{animation:slideDown .3s ease-out}.fade-out{animation:fadeOut .3s ease-out}\n"] }] }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { message: [{ type: Input }], description: [{ type: Input }], state: [{ type: Input }], type: [{ type: Input }], horizontalPosition: [{ type: Input }], verticalPosition: [{ type: Input }], verticalOffset: [{ type: Input }], horizontalOffset: [{ type: Input }], displayTime: [{ type: Input }], isTemporary: [{ type: Input }], position: [{ type: HostBinding, args: ['style.position'] }], zIndex: [{ type: HostBinding, args: ['style.zIndex'] }], display: [{ type: HostBinding, args: ['style.display'] }], topPosition: [{ type: HostBinding, args: ['style.top'] }], bottomPosition: [{ type: HostBinding, args: ['style.bottom'] }], leftPosition: [{ type: HostBinding, args: ['style.left'] }], rightPosition: [{ type: HostBinding, args: ['style.right'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL21lc3NhZ2UvbWVzc2FnZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL21lc3NhZ2UvbWVzc2FnZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFFTCxXQUFXLEdBSVosTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzlELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7OztBQU81RCxNQUFNLE9BQU8sZ0JBQWdCO0lBaURQO0lBL0NYLE9BQU8sQ0FBVTtJQUNqQixXQUFXLENBQVU7SUFDckIsS0FBSyxHQUFpQixZQUFZLENBQUMsT0FBTyxDQUFDO0lBQzNDLElBQUksR0FBZ0IsV0FBVyxDQUFDLEtBQUssQ0FBQztJQUN0QyxrQkFBa0IsR0FBZ0MsT0FBTyxDQUFDO0lBQzFELGdCQUFnQixHQUFnQyxLQUFLLENBQUM7SUFDdEQsY0FBYyxHQUFXLFFBQVEsQ0FBQztJQUNsQyxnQkFBZ0IsR0FBVyxRQUFRLENBQUM7SUFDcEMsV0FBVyxHQUFXLElBQUksQ0FBQztJQUMzQixXQUFXLENBQVc7SUFFQSxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBRXJCLE1BQU0sR0FBRyxJQUFJLENBQUM7SUFFYixPQUFPLEdBQUcsTUFBTSxDQUFDO0lBRS9DLElBQ0ksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3RFLENBQUM7SUFF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QWdCOzRGQUFoQixnQkFBZ0IsK25CQ2pCN0IsbWxEQTBEQTs7NEZEekNhLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxhQUFhOytFQU1kLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRXlCLFFBQVE7c0JBQXRDLFdBQVc7dUJBQUMsZ0JBQWdCO2dCQUVBLE1BQU07c0JBQWxDLFdBQVc7dUJBQUMsY0FBYztnQkFFRyxPQUFPO3NCQUFwQyxXQUFXO3VCQUFDLGVBQWU7Z0JBR3hCLFdBQVc7c0JBRGQsV0FBVzt1QkFBQyxXQUFXO2dCQU1wQixjQUFjO3NCQURqQixXQUFXO3VCQUFDLGNBQWM7Z0JBTXZCLFlBQVk7c0JBRGYsV0FBVzt1QkFBQyxZQUFZO2dCQU1yQixhQUFhO3NCQURoQixXQUFXO3VCQUFDLGFBQWEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBPbkluaXQsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgRWxlbWVudFJlZixcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWVzc2FnZVN0YXRlIH0gZnJvbSAnLi4vLi4vZW51bXMvbWVzc2FnZS1zdGF0ZS5lbnVtJztcclxuaW1wb3J0IHsgTWVzc2FnZVR5cGUgfSBmcm9tICcuLi8uLi9lbnVtcy9tZXNzYWdlLXR5cGUuZW51bSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NmYy1tZXNzYWdlJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vbWVzc2FnZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL21lc3NhZ2UuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNZXNzYWdlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG5cclxuICBASW5wdXQoKSBtZXNzYWdlITogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHN0YXRlOiBNZXNzYWdlU3RhdGUgPSBNZXNzYWdlU3RhdGUud2FybmluZztcclxuICBASW5wdXQoKSB0eXBlOiBNZXNzYWdlVHlwZSA9IE1lc3NhZ2VUeXBlLmFsZXJ0O1xyXG4gIEBJbnB1dCgpIGhvcml6b250YWxQb3NpdGlvbjogJ2xlZnQnIHwgJ2NlbnRlcicgfCAncmlnaHQnID0gJ3JpZ2h0JztcclxuICBASW5wdXQoKSB2ZXJ0aWNhbFBvc2l0aW9uOiAndG9wJyB8ICdjZW50ZXInIHwgJ2JvdHRvbScgPSAndG9wJztcclxuICBASW5wdXQoKSB2ZXJ0aWNhbE9mZnNldDogc3RyaW5nID0gJzAuMXJlbSc7XHJcbiAgQElucHV0KCkgaG9yaXpvbnRhbE9mZnNldDogc3RyaW5nID0gJzAuMXJlbSc7XHJcbiAgQElucHV0KCkgZGlzcGxheVRpbWU6IG51bWJlciA9IDUwMDA7XHJcbiAgQElucHV0KCkgaXNUZW1wb3Jhcnk/OiBib29sZWFuO1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLnBvc2l0aW9uJykgcG9zaXRpb24gPSAnZml4ZWQnO1xyXG5cclxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLnpJbmRleCcpIHpJbmRleCA9IDEwMDA7XHJcblxyXG4gIEBIb3N0QmluZGluZygnc3R5bGUuZGlzcGxheScpIGRpc3BsYXkgPSAnbm9uZSc7XHJcblxyXG4gIEBIb3N0QmluZGluZygnc3R5bGUudG9wJylcclxuICBnZXQgdG9wUG9zaXRpb24oKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy52ZXJ0aWNhbFBvc2l0aW9uID09PSAndG9wJyA/IHRoaXMudmVydGljYWxPZmZzZXQgOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS5ib3R0b20nKVxyXG4gIGdldCBib3R0b21Qb3NpdGlvbigpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLnZlcnRpY2FsUG9zaXRpb24gPT09ICdib3R0b20nID8gdGhpcy52ZXJ0aWNhbE9mZnNldCA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLmxlZnQnKVxyXG4gIGdldCBsZWZ0UG9zaXRpb24oKTogc3RyaW5nIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5ob3Jpem9udGFsUG9zaXRpb24gPT09ICdsZWZ0JyA/IHRoaXMuaG9yaXpvbnRhbE9mZnNldCA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLnJpZ2h0JylcclxuICBnZXQgcmlnaHRQb3NpdGlvbigpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLmhvcml6b250YWxQb3NpdGlvbiA9PT0gJ3JpZ2h0JyA/IHRoaXMuaG9yaXpvbnRhbE9mZnNldCA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBpc1Zpc2libGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICByZWFkb25seSBtZXNzYWdlVHlwZXM6IHR5cGVvZiBNZXNzYWdlVHlwZSA9IE1lc3NhZ2VUeXBlO1xyXG4gIHByaXZhdGUgY2xvc2VUaW1lb3V0SWQ6IGFueTtcclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pc1RlbXBvcmFyeSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMuaXNUZW1wb3JhcnkgPSB0aGlzLnR5cGUgPT09IHRoaXMubWVzc2FnZVR5cGVzLmZlZWRiYWNrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7IH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ3R5cGUnXSkge1xyXG4gICAgICBpZiAodGhpcy50eXBlID09PSB0aGlzLm1lc3NhZ2VUeXBlcy5hbGVydCkge1xyXG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gJ2F1dG8nO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgaWNvbigpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoICh0aGlzLnN0YXRlKSB7XHJcbiAgICAgIGNhc2UgTWVzc2FnZVN0YXRlLmRhbmdlcjpcclxuICAgICAgICByZXR1cm4gJ2ZhcyBmYS10aW1lcy1jaXJjbGUnO1xyXG4gICAgICBjYXNlIE1lc3NhZ2VTdGF0ZS5pbmZvOlxyXG4gICAgICAgIHJldHVybiAnZmFzIGZhLWluZm8tY2lyY2xlJztcclxuICAgICAgY2FzZSBNZXNzYWdlU3RhdGUuc3VjY2VzczpcclxuICAgICAgICByZXR1cm4gJ2ZhcyBmYS1jaGVjay1jaXJjbGUnO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnZmFzIGZhLWV4Y2xhbWF0aW9uLXRyaWFuZ2xlJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE3DqXRvZG8gcMO6YmxpY28gcGFyYSBhYnJpciBhIG1lbnNhZ2VtLlxyXG4gICAqIFJlaW5pY2lhIG8gdGVtcG9yaXphZG9yIGRlIGZlY2hhbWVudG8gY2FzbyBhIG1lbnNhZ2VtIHNlamEgdGVtcG9yw6FyaWEuXHJcbiAgICovXHJcbiAgb3Blbk1lc3NhZ2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzVmlzaWJsZSA9IHRydWU7XHJcbiAgICB0aGlzLmRpc3BsYXkgPSAnZmxleCc7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNUZW1wb3JhcnkpIHtcclxuICAgICAgdGhpcy5yZXN0YXJ0Q2xvc2VUaW1lcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTcOpdG9kbyBww7pibGljbyBwYXJhIGZlY2hhciBhIG1lbnNhZ2VtIG1hbnVhbG1lbnRlLlxyXG4gICAqL1xyXG4gIGNsb3NlTWVzc2FnZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNWaXNpYmxlID0gZmFsc2U7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNUZW1wb3JhcnkpIHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuY2xvc2VUaW1lb3V0SWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5kaXNwbGF5ID0gJ25vbmUnLCAyMDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXN0YXJ0Q2xvc2VUaW1lcigpOiB2b2lkIHtcclxuICAgIGNsZWFyVGltZW91dCh0aGlzLmNsb3NlVGltZW91dElkKTtcclxuICAgIHRoaXMuY2xvc2VUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5jbG9zZU1lc3NhZ2UoKTtcclxuICAgIH0sIHRoaXMuZGlzcGxheVRpbWUpO1xyXG4gIH1cclxufVxyXG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiaXNUZW1wb3JhcnkgfHwgaXNWaXNpYmxlXCI+XHJcbiAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInR5cGUgPT09IG1lc3NhZ2VUeXBlcy5hbGVydDsgZWxzZSBmZWVkYmFja1wiPlxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzcz1cImJyLW1lc3NhZ2UgbWVzc2FnZS1jb250YWluZXJcIlxyXG4gICAgICBzdHlsZT1cIndpZHRoOiAxMDAlO1wiXHJcbiAgICAgIFtjbGFzcy5mYWRlLW91dF09XCIhaXNWaXNpYmxlXCJcclxuICAgICAgW25nQ2xhc3NdPVwic3RhdGVcIj5cclxuICAgICAgPGRpdlxyXG4gICAgICAgIGNsYXNzPVwiaWNvblwiPlxyXG4gICAgICAgIDxpXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJpY29uXCJcclxuICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICAgIDwvaT5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXZcclxuICAgICAgICBjbGFzcz1cImNvbnRlbnRcIlxyXG4gICAgICAgIFthcmlhTGFiZWxdPVwibWVzc2FnZSArICcgJyArIGRlc2NyaXB0aW9uXCJcclxuICAgICAgICByb2xlPVwiYWxlcnRcIj5cclxuICAgICAgICA8c3BhblxyXG4gICAgICAgICAgY2xhc3M9XCJtZXNzYWdlLXRpdGxlXCI+XHJcbiAgICAgICAgICB7eyBtZXNzYWdlIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICAqbmdJZj1cImRlc2NyaXB0aW9uXCJcclxuICAgICAgICAgIGNsYXNzPVwibWVzc2FnZS1ib2R5XCI+XHJcbiAgICAgICAgICB7eyBkZXNjcmlwdGlvbiB9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjbG9zZVwiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIGNsYXNzPVwiYnItYnV0dG9uIGNpcmNsZSBzbWFsbFwiXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIGFyaWEtbGFiZWw9XCJGZWNoYXIgYSBtZXNzYWdlbSBhbHRlcnRhXCJcclxuICAgICAgICAgIChjbGljayk9XCJjbG9zZU1lc3NhZ2UoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGkgY2xhc3M9XCJmYXMgZmEtdGltZXNcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gIDxuZy10ZW1wbGF0ZSAjZmVlZGJhY2s+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGNsYXNzPVwibWVzc2FnZS1jb250YWluZXIgbWItM1wiXHJcbiAgICAgIFtjbGFzcy5mYWRlLW91dF09XCIhaXNWaXNpYmxlXCI+XHJcbiAgICAgIDxzcGFuXHJcbiAgICAgICAgY2xhc3M9XCJmZWVkYmFja1wiXHJcbiAgICAgICAgW25nQ2xhc3NdPVwic3RhdGVcIlxyXG4gICAgICAgIHJvbGU9XCJhbGVydFwiPlxyXG4gICAgICAgIDxpXHJcbiAgICAgICAgICBbbmdDbGFzc109XCJpY29uXCJcclxuICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICAgIDwvaT5cclxuICAgICAgICB7eyBtZXNzYWdlIH19XHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbjwvbmctY29udGFpbmVyPlxyXG4iXX0=