UNPKG

@wizco/fenixds-ngx

Version:

Componentes fenix design system para Angular.

88 lines 29.3 kB
import { CommonModule } from '@angular/common'; import { Component, Input } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/platform-browser"; import * as i2 from "@angular/common"; export class WcoToastComponent { sanitizer; position = 'bottom-right'; configManual; toasts = []; constructor(sanitizer) { this.sanitizer = sanitizer; } ngOnInit() { } ngOnDestroy() { this.toasts.forEach((t) => { if (t.timer) clearTimeout(t.timer); }); } add(config) { const id = 'wco-toast-' + Math.random().toString(36).substring(7); const duration = config.duration ?? 4000; const item = { id, config: { showIcon: true, type: 'info', ...config }, visible: true, }; this.toasts.push(item); setTimeout(() => { const el = document.getElementById(id); if (el && el.offsetHeight > 55) item.tall = true; }, 50); if (duration > 0) { item.timer = setTimeout(() => this.dismiss(id), duration); } return id; } dismiss(id) { const item = this.toasts.find((t) => t.id === id); if (!item) return; if (item.timer) clearTimeout(item.timer); item.visible = false; setTimeout(() => { this.toasts = this.toasts.filter((t) => t.id !== id); }, 300); } getSafeHtml(value) { return this.sanitizer.bypassSecurityTrustHtml(value || ''); } getIconMaterial(config) { switch (config.type) { case 'error': return { icon: 'error_outline', color: 'error' }; case 'warning': return { icon: 'warning_amber', color: 'warning' }; case 'success': return { icon: 'check_circle_outline', color: 'success' }; case 'loading': return { icon: 'autorenew', color: 'loading' }; default: return { icon: 'info', color: 'info' }; } } getButtonClass(action) { const extraClasse = action.extraClasse ?? 'wco-btn btn-sm btn-outline btn-link wco-toast-btn'; return `${extraClasse}`.trim(); } trackById(_, item) { return item.id; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WcoToastComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: WcoToastComponent, isStandalone: true, selector: "wco-toast", inputs: { position: "position", configManual: "configManual", toasts: "toasts" }, ngImport: i0, template: "<dialog open class=\"wco-toast-container\" [class]=\"'wco-toast-container--' + position\">\n <span class=\"wco-toast__hover-zone\"></span>\n <div\n *ngFor=\"let toast of toasts; trackBy: trackById;let i = index\"\n class=\"wco-toast\"\n [id]=\"toast.id\"\n [class.wco-toast--visible]=\"toast.visible\"\n [class.wco-toast--start]=\"toast.tall\"\n [attr.data-position]=\"i\"\n [class]=\"'wco-toast wco-toast--mini wco-toast--' + getIconMaterial(toast.config).color + (toast.visible ? ' wco-toast--visible' : '')\"\n >\n <div class=\"wco-toast__body\">\n <ng-container *ngIf=\"toast.config.showIcon\">\n <span class=\"wco-toast__icon material-icons-round\">\n <ng-container *ngIf=\"toast.config.materialIcon; else defaultIcon\">\n {{ toast.config.materialIcon }}\n </ng-container>\n <ng-template #defaultIcon>\n {{ getIconMaterial(toast.config).icon }}\n </ng-template>\n </span>\n </ng-container>\n\n <div class=\"wco-toast__content\">\n <span>\n <p class=\"wco-toast__title\" *ngIf=\"toast.config.title\" [innerHTML]=\"getSafeHtml(toast.config.title)\"></p>\n <p class=\"wco-toast__message\" *ngIf=\"toast.config.message && toast.config.message.length \" [innerHTML]=\"getSafeHtml(toast.config.message)\"></p>\n </span>\n <div class=\"wco-toast__actions\" *ngIf=\"toast.config.actions && toast.config.actions.length > 0\">\n <button\n type=\"button\"\n *ngFor=\"let action of toast.config.actions\"\n [class]=\"getButtonClass(action)\"\n (click)=\"action.action(); dismiss(toast.id)\"\n >\n <span class=\"material-icons-round\" *ngIf=\"action.materialIconLeft\">{{ action.materialIconLeft }}</span>\n {{ action.text }}\n <span class=\"material-icons-round\" *ngIf=\"action.materialIconRight\">{{ action.materialIconRight }}</span>\n </button>\n </div>\n </div>\n </div>\n\n <button class=\"wco-toast__close\" *ngIf=\"toast.config.close !== false\" (click)=\"dismiss(toast.id)\" aria-label=\"Fechar\">\n <span class=\"material-icons\">close</span>\n </button>\n </div>\n \n</dialog>\n", styles: ["@layer state{.wco-toast-container{--wco-toast-padding: var(--wco-spacing-nano, 8px);--wco-toast-gap: var(--wco-spacing-nano, 8px);--wco-toast-radius: var(--wco-radius-md, 8px);--wco-toast-w-clamp: clamp(250px, 280px, 420px);--wco-toast-bg: var(--wco-color-panel) }}.wco-toast-container{margin:0;padding:0;border:none;background:transparent;max-width:none;max-height:none;overflow:visible;top:unset;right:unset;bottom:unset;left:unset;transition:all .1s linear .3s;opacity:1;transform:translateY(0);position:fixed;z-index:9999;display:flex;flex-direction:column;gap:var(--wco-spacing-xs);pointer-events:none}@starting-style{.wco-toast-container{opacity:0;transform:scaleY(12px)}}.wco-toast-container:has(.wco-toast-btn){--wco-toast-align-flex: flex- --wc-toast-align-direction: }.wco-toast-container::backdrop{display:none}.wco-toast-container--top-right{top:var(--wco-spacing-md);right:var(--wco-spacing-md);align-items:flex-end}.wco-toast-container--top-left{top:var(--wco-spacing-md);left:var(--wco-spacing-md);align-items:flex-start}.wco-toast-container--bottom-right{bottom:var(--wco-spacing-md);right:var(--wco-spacing-md);align-items:flex-end}.wco-toast-container--bottom-left{bottom:var(--wco-spacing-md);left:var(--wco-spacing-md);align-items:flex-start}.wco-toast-container--top-center{top:var(--wco-spacing-md);left:50%;transform:translate(-50%);align-items:center}.wco-toast-container--bottom-center{bottom:var(--wco-spacing-md);left:50%;transform:translate(-50%);align-items:center}@media (max-width: 600px){.wco-toast-container--top-right,.wco-toast-container--top-left,.wco-toast-container--top-center,.wco-toast-container--bottom-right,.wco-toast-container--bottom-left,.wco-toast-container--bottom-center{top:unset;right:unset;left:50%;bottom:var(--wco-spacing-xxs);transform:translate(-50%);align-items:center;width:calc(100vw - var(--wco-spacing-xxxs))}.wco-toast-container--top-right .wco-toast,.wco-toast-container--top-left .wco-toast,.wco-toast-container--top-center .wco-toast,.wco-toast-container--bottom-right .wco-toast,.wco-toast-container--bottom-left .wco-toast,.wco-toast-container--bottom-center .wco-toast{width:100%}}.wco-toast{pointer-events:all;display:flex;align-items:center;gap:var(--wco-toast-gap, 8px);width:var(--wco-toast-w-clamp, 250px);padding:var(--wco-toast-padding, 8px);border-radius:var(--wco-toast-radius, 8px);background:var(--wco-toast-bg, #fff);box-shadow:var(--wco-shadow-level-1);opacity:0;transform:translateY(-8px);transition:opacity .3s ease,transform .3s ease}.wco-toast.wco-toast--start{align-items:flex-start}.wco-toast.wco-toast--start:has(.btn-link) .wco-toast__close{margin-top:var(--wco-spacing-nano)}.wco-toast.wco-toast--start>.wco-toast__body,.wco-toast.wco-toast--start .wco-toast__content{align-items:flex-start}.wco-toast:has(.wco-toast__message) .wco-toast__title{font-weight:600}.wco-toast.wco-toast--mini{--wco-toast-w-clamp: fit-content;max-width:570px}.wco-toast--visible{opacity:1;transform:translateY(0)}.wco-toast--info{--wco-toast-color-type: var(--wco-color-info-600)}.wco-toast--success{--wco-toast-color-type: var(--wco-color-success-600)}.wco-toast--warning{--wco-toast-color-type: var(--wco-color-warning-600)}.wco-toast--error{--wco-toast-color-type: var(--wco-color-danger-600)}.wco-toast--loading{--wco-toast-color-type: var(--wco-color-secondary-600)}.wco-toast--loading .wco-toast__icon{animation:wco-toast-spin 1s linear infinite}@keyframes wco-toast-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.wco-toast__body{display:flex;align-items:center;gap:var(--wco-toast-gap, 8px);flex:1;min-width:0}.wco-toast__icon{font-size:var(--wco-iconography-size-xs);color:var(--wco-toast-color-type);flex-shrink:0;margin-top:0}.wco-toast__content{display:flex;flex-direction:row;align-items:center;gap:var(--wco-toast-gap, 8px);flex:1;min-width:0}.wco-toast__title{font-size:var(--wco-font-size-xs, 14px);font-weight:300;color:var(--wco-color-neutral-900);line-height:1.4;margin:0}.wco-toast__message{font-size:var(--wco-font-size-xxs, 12px);font-weight:400;color:var(--wco-color-neutral-700);line-height:1.5;margin:0}.wco-toast__actions{display:flex;flex-wrap:wrap;gap:var(--wco-spacing-nano)}.wco-toast__close{background:none;border:none;cursor:pointer;padding:0;color:var(--wco-color-neutral-500);display:flex;align-items:center;flex-shrink:0;line-height:1}.wco-toast__close span{font-size:18px}.wco-toast__close:hover{color:var(--wco-color-neutral-900)}.wco-toast-container .wco-toast__hover-zone{position:absolute;inset:-16px;pointer-events:auto;z-index:0}.wco-toast-container .wco-toast{position:relative;z-index:1;transition:transform .2s ease,opacity .2s ease,top .2s ease}@starting-style{.wco-toast-container .wco-toast{transform:translateY(24px)}}.wco-toast-container:not(:hover) .wco-toast:not(:last-child){position:absolute;box-shadow:none;width:100%;height:50px;overflow:hidden;transform:scale(.95)}.wco-toast-container:not(:hover) .wco-toast:not(:last-child)>*{opacity:0;transition:opacity .15s ease}.wco-toast-container:not(:hover) .wco-toast:nth-last-child(2){top:-10px;transform:scale(.95);box-shadow:var(--wco-shadow-level-3)}.wco-toast-container:not(:hover) .wco-toast:nth-last-child(3){top:-20px;transform:scale(.85);box-shadow:var(--wco-shadow-level-2)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WcoToastComponent, decorators: [{ type: Component, args: [{ selector: 'wco-toast', standalone: true, imports: [CommonModule], template: "<dialog open class=\"wco-toast-container\" [class]=\"'wco-toast-container--' + position\">\n <span class=\"wco-toast__hover-zone\"></span>\n <div\n *ngFor=\"let toast of toasts; trackBy: trackById;let i = index\"\n class=\"wco-toast\"\n [id]=\"toast.id\"\n [class.wco-toast--visible]=\"toast.visible\"\n [class.wco-toast--start]=\"toast.tall\"\n [attr.data-position]=\"i\"\n [class]=\"'wco-toast wco-toast--mini wco-toast--' + getIconMaterial(toast.config).color + (toast.visible ? ' wco-toast--visible' : '')\"\n >\n <div class=\"wco-toast__body\">\n <ng-container *ngIf=\"toast.config.showIcon\">\n <span class=\"wco-toast__icon material-icons-round\">\n <ng-container *ngIf=\"toast.config.materialIcon; else defaultIcon\">\n {{ toast.config.materialIcon }}\n </ng-container>\n <ng-template #defaultIcon>\n {{ getIconMaterial(toast.config).icon }}\n </ng-template>\n </span>\n </ng-container>\n\n <div class=\"wco-toast__content\">\n <span>\n <p class=\"wco-toast__title\" *ngIf=\"toast.config.title\" [innerHTML]=\"getSafeHtml(toast.config.title)\"></p>\n <p class=\"wco-toast__message\" *ngIf=\"toast.config.message && toast.config.message.length \" [innerHTML]=\"getSafeHtml(toast.config.message)\"></p>\n </span>\n <div class=\"wco-toast__actions\" *ngIf=\"toast.config.actions && toast.config.actions.length > 0\">\n <button\n type=\"button\"\n *ngFor=\"let action of toast.config.actions\"\n [class]=\"getButtonClass(action)\"\n (click)=\"action.action(); dismiss(toast.id)\"\n >\n <span class=\"material-icons-round\" *ngIf=\"action.materialIconLeft\">{{ action.materialIconLeft }}</span>\n {{ action.text }}\n <span class=\"material-icons-round\" *ngIf=\"action.materialIconRight\">{{ action.materialIconRight }}</span>\n </button>\n </div>\n </div>\n </div>\n\n <button class=\"wco-toast__close\" *ngIf=\"toast.config.close !== false\" (click)=\"dismiss(toast.id)\" aria-label=\"Fechar\">\n <span class=\"material-icons\">close</span>\n </button>\n </div>\n \n</dialog>\n", styles: ["@layer state{.wco-toast-container{--wco-toast-padding: var(--wco-spacing-nano, 8px);--wco-toast-gap: var(--wco-spacing-nano, 8px);--wco-toast-radius: var(--wco-radius-md, 8px);--wco-toast-w-clamp: clamp(250px, 280px, 420px);--wco-toast-bg: var(--wco-color-panel) }}.wco-toast-container{margin:0;padding:0;border:none;background:transparent;max-width:none;max-height:none;overflow:visible;top:unset;right:unset;bottom:unset;left:unset;transition:all .1s linear .3s;opacity:1;transform:translateY(0);position:fixed;z-index:9999;display:flex;flex-direction:column;gap:var(--wco-spacing-xs);pointer-events:none}@starting-style{.wco-toast-container{opacity:0;transform:scaleY(12px)}}.wco-toast-container:has(.wco-toast-btn){--wco-toast-align-flex: flex- --wc-toast-align-direction: }.wco-toast-container::backdrop{display:none}.wco-toast-container--top-right{top:var(--wco-spacing-md);right:var(--wco-spacing-md);align-items:flex-end}.wco-toast-container--top-left{top:var(--wco-spacing-md);left:var(--wco-spacing-md);align-items:flex-start}.wco-toast-container--bottom-right{bottom:var(--wco-spacing-md);right:var(--wco-spacing-md);align-items:flex-end}.wco-toast-container--bottom-left{bottom:var(--wco-spacing-md);left:var(--wco-spacing-md);align-items:flex-start}.wco-toast-container--top-center{top:var(--wco-spacing-md);left:50%;transform:translate(-50%);align-items:center}.wco-toast-container--bottom-center{bottom:var(--wco-spacing-md);left:50%;transform:translate(-50%);align-items:center}@media (max-width: 600px){.wco-toast-container--top-right,.wco-toast-container--top-left,.wco-toast-container--top-center,.wco-toast-container--bottom-right,.wco-toast-container--bottom-left,.wco-toast-container--bottom-center{top:unset;right:unset;left:50%;bottom:var(--wco-spacing-xxs);transform:translate(-50%);align-items:center;width:calc(100vw - var(--wco-spacing-xxxs))}.wco-toast-container--top-right .wco-toast,.wco-toast-container--top-left .wco-toast,.wco-toast-container--top-center .wco-toast,.wco-toast-container--bottom-right .wco-toast,.wco-toast-container--bottom-left .wco-toast,.wco-toast-container--bottom-center .wco-toast{width:100%}}.wco-toast{pointer-events:all;display:flex;align-items:center;gap:var(--wco-toast-gap, 8px);width:var(--wco-toast-w-clamp, 250px);padding:var(--wco-toast-padding, 8px);border-radius:var(--wco-toast-radius, 8px);background:var(--wco-toast-bg, #fff);box-shadow:var(--wco-shadow-level-1);opacity:0;transform:translateY(-8px);transition:opacity .3s ease,transform .3s ease}.wco-toast.wco-toast--start{align-items:flex-start}.wco-toast.wco-toast--start:has(.btn-link) .wco-toast__close{margin-top:var(--wco-spacing-nano)}.wco-toast.wco-toast--start>.wco-toast__body,.wco-toast.wco-toast--start .wco-toast__content{align-items:flex-start}.wco-toast:has(.wco-toast__message) .wco-toast__title{font-weight:600}.wco-toast.wco-toast--mini{--wco-toast-w-clamp: fit-content;max-width:570px}.wco-toast--visible{opacity:1;transform:translateY(0)}.wco-toast--info{--wco-toast-color-type: var(--wco-color-info-600)}.wco-toast--success{--wco-toast-color-type: var(--wco-color-success-600)}.wco-toast--warning{--wco-toast-color-type: var(--wco-color-warning-600)}.wco-toast--error{--wco-toast-color-type: var(--wco-color-danger-600)}.wco-toast--loading{--wco-toast-color-type: var(--wco-color-secondary-600)}.wco-toast--loading .wco-toast__icon{animation:wco-toast-spin 1s linear infinite}@keyframes wco-toast-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.wco-toast__body{display:flex;align-items:center;gap:var(--wco-toast-gap, 8px);flex:1;min-width:0}.wco-toast__icon{font-size:var(--wco-iconography-size-xs);color:var(--wco-toast-color-type);flex-shrink:0;margin-top:0}.wco-toast__content{display:flex;flex-direction:row;align-items:center;gap:var(--wco-toast-gap, 8px);flex:1;min-width:0}.wco-toast__title{font-size:var(--wco-font-size-xs, 14px);font-weight:300;color:var(--wco-color-neutral-900);line-height:1.4;margin:0}.wco-toast__message{font-size:var(--wco-font-size-xxs, 12px);font-weight:400;color:var(--wco-color-neutral-700);line-height:1.5;margin:0}.wco-toast__actions{display:flex;flex-wrap:wrap;gap:var(--wco-spacing-nano)}.wco-toast__close{background:none;border:none;cursor:pointer;padding:0;color:var(--wco-color-neutral-500);display:flex;align-items:center;flex-shrink:0;line-height:1}.wco-toast__close span{font-size:18px}.wco-toast__close:hover{color:var(--wco-color-neutral-900)}.wco-toast-container .wco-toast__hover-zone{position:absolute;inset:-16px;pointer-events:auto;z-index:0}.wco-toast-container .wco-toast{position:relative;z-index:1;transition:transform .2s ease,opacity .2s ease,top .2s ease}@starting-style{.wco-toast-container .wco-toast{transform:translateY(24px)}}.wco-toast-container:not(:hover) .wco-toast:not(:last-child){position:absolute;box-shadow:none;width:100%;height:50px;overflow:hidden;transform:scale(.95)}.wco-toast-container:not(:hover) .wco-toast:not(:last-child)>*{opacity:0;transition:opacity .15s ease}.wco-toast-container:not(:hover) .wco-toast:nth-last-child(2){top:-10px;transform:scale(.95);box-shadow:var(--wco-shadow-level-3)}.wco-toast-container:not(:hover) .wco-toast:nth-last-child(3){top:-20px;transform:scale(.85);box-shadow:var(--wco-shadow-level-2)}\n"] }] }], ctorParameters: () => [{ type: i1.DomSanitizer }], propDecorators: { position: [{ type: Input }], configManual: [{ type: Input }], toasts: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbXBvbmVudHMvc3JjL2xpYi90b2FzdC90b2FzdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tcG9uZW50cy9zcmMvbGliL3RvYXN0L3RvYXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsTUFBTSxlQUFlLENBQUM7Ozs7QUFtQnBFLE1BQU0sT0FBTyxpQkFBaUI7SUFPUjtJQU5YLFFBQVEsR0FBK0IsY0FBYyxDQUFDO0lBRXRELFlBQVksQ0FBaUI7SUFFN0IsTUFBTSxHQUFtQixFQUFFLENBQUM7SUFFckMsWUFBb0IsU0FBdUI7UUFBdkIsY0FBUyxHQUFULFNBQVMsQ0FBYztJQUFHLENBQUM7SUFFL0MsUUFBUSxLQUFVLENBQUM7SUFFbkIsV0FBVztRQUNULElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDeEIsSUFBSSxDQUFDLENBQUMsS0FBSztnQkFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELEdBQUcsQ0FBQyxNQUFzQjtRQUN4QixNQUFNLEVBQUUsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUM7UUFFekMsTUFBTSxJQUFJLEdBQWlCO1lBQ3pCLEVBQUU7WUFDRixNQUFNLEVB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UzsrQkFDRSxXQUFXLGNBQ1QsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDO2lGQUtkLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgV2NvVG9hc3RDb25maWcsIFdjb1RvYXN0Q29uZmlnQWN0aW9uc1R5cGVzIH0gZnJvbSAnLi90b2FzdC50eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2NvVG9hc3RJdGVtIHtcbiAgaWQ6IHN0cmluZztcbiAgY29uZmlnOiBXY29Ub2FzdENvbmZpZztcbiAgdmlzaWJsZTogYm9vbGVhbjtcbiAgdGFsbD86IGJvb2xlYW47XG4gIHRpbWVyPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3djby10b2FzdCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICB0ZW1wbGF0ZVVybDogJy4vdG9hc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi90b2FzdC5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBXY29Ub2FzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgQElucHV0KCkgcG9zaXRpb246IFdjb1RvYXN0Q29uZmlnWydwb3NpdGlvbiddID0gJ2JvdHRvbS1yaWdodCc7XG5cbiAgQElucHV0KCkgY29uZmlnTWFudWFsPzogV2NvVG9hc3RDb25maWdcblxuICBASW5wdXQoKSB0b2FzdHM6IFdjb1RvYXN0SXRlbVtdID0gW107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzYW5pdGl6ZXI6IERvbVNhbml0aXplcikge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHt9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy50b2FzdHMuZm9yRWFjaCgodCkgPT4ge1xuICAgICAgaWYgKHQudGltZXIpIGNsZWFyVGltZW91dCh0LnRpbWVyKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZChjb25maWc6IFdjb1RvYXN0Q29uZmlnKTogc3RyaW5nIHtcbiAgICBjb25zdCBpZCA9ICd3Y28tdG9hc3QtJyArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZyg3KTtcbiAgICBjb25zdCBkdXJhdGlvbiA9IGNvbmZpZy5kdXJhdGlvbiA/PyA0MDAwO1xuXG4gICAgY29uc3QgaXRlbTogV2NvVG9hc3RJdGVtID0ge1xuICAgICAgaWQsXG4gICAgICBjb25maWc6IHsgc2hvd0ljb246IHRydWUsIHR5cGU6ICdpbmZvJywgLi4uY29uZmlnIH0sXG4gICAgICB2aXNpYmxlOiB0cnVlLFxuICAgIH07XG5cbiAgICB0aGlzLnRvYXN0cy5wdXNoKGl0ZW0pO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgIGlmIChlbCAmJiBlbC5vZmZzZXRIZWlnaHQgPiA1NSkgaXRlbS50YWxsID0gdHJ1ZTtcbiAgICB9LCA1MCk7XG5cbiAgICBpZiAoZHVyYXRpb24gPiAwKSB7XG4gICAgICBpdGVtLnRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB0aGlzLmRpc21pc3MoaWQpLCBkdXJhdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGlkO1xuICB9XG5cbiAgZGlzbWlzcyhpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgaXRlbSA9IHRoaXMudG9hc3RzLmZpbmQoKHQpID0+IHQuaWQgPT09IGlkKTtcbiAgICBpZiAoIWl0ZW0pIHJldHVybjtcblxuICAgIGlmIChpdGVtLnRpbWVyKSBjbGVhclRpbWVvdXQoaXRlbS50aW1lcik7XG5cbiAgICBpdGVtLnZpc2libGUgPSBmYWxzZTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy50b2FzdHMgPSB0aGlzLnRvYXN0cy5maWx0ZXIoKHQpID0+IHQuaWQgIT09IGlkKTtcbiAgICB9LCAzMDApO1xuICB9XG5cbiAgZ2V0U2FmZUh0bWwodmFsdWU6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh2YWx1ZSB8fCAnJyk7XG4gIH1cblxuICBnZXRJY29uTWF0ZXJpYWwoY29uZmlnOiBXY29Ub2FzdENvbmZpZykge1xuICAgIHN3aXRjaCAoY29uZmlnLnR5cGUpIHtcbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgICAgcmV0dXJuIHsgaWNvbjogJ2Vycm9yX291dGxpbmUnLCBjb2xvcjogJ2Vycm9yJyB9O1xuICAgICAgY2FzZSAnd2FybmluZyc6XG4gICAgICAgIHJldHVybiB7IGljb246ICd3YXJuaW5nX2FtYmVyJywgY29sb3I6ICd3YXJuaW5nJyB9O1xuICAgICAgY2FzZSAnc3VjY2Vzcyc6XG4gICAgICAgIHJldHVybiB7IGljb246ICdjaGVja19jaXJjbGVfb3V0bGluZScsIGNvbG9yOiAnc3VjY2VzcycgfTtcbiAgICAgIGNhc2UgJ2xvYWRpbmcnOlxuICAgICAgICByZXR1cm4geyBpY29uOiAnYXV0b3JlbmV3JywgY29sb3I6ICdsb2FkaW5nJyB9O1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHsgaWNvbjogJ2luZm8nLCBjb2xvcjogJ2luZm8nIH07XG4gICAgfVxuICB9XG5cbiAgZ2V0QnV0dG9uQ2xhc3MoYWN0aW9uOiBXY29Ub2FzdENvbmZpZ0FjdGlvbnNUeXBlcyk6IHN0cmluZyB7XG4gICAgY29uc3QgZXh0cmFDbGFzc2UgPSBhY3Rpb24uZXh0cmFDbGFzc2UgPz8gJ3djby1idG4gYnRuLXNtIGJ0bi1vdXRsaW5lIGJ0bi1saW5rIHdjby10b2FzdC1idG4nO1xuICAgIHJldHVybiBgJHtleHRyYUNsYXNzZX1gLnRyaW0oKTtcbiAgfVxuXG4gIHRyYWNrQnlJZChfOiBudW1iZXIsIGl0ZW06IFdjb1RvYXN0SXRlbSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGl0ZW0uaWQ7XG4gIH1cbn1cbiIsIjxkaWFsb2cgb3BlbiBjbGFzcz1cIndjby10b2FzdC1jb250YWluZXJcIiBbY2xhc3NdPVwiJ3djby10b2FzdC1jb250YWluZXItLScgKyBwb3NpdGlvblwiPlxuICA8c3BhbiBjbGFzcz1cIndjby10b2FzdF9faG92ZXItem9uZVwiPjwvc3Bhbj5cbiAgPGRpdlxuICAgICpuZ0Zvcj1cImxldCB0b2FzdCBvZiB0b2FzdHM7IHRyYWNrQnk6IHRyYWNrQnlJZDtsZXQgaSA9IGluZGV4XCJcbiAgICBjbGFzcz1cIndjby10b2FzdFwiXG4gICAgW2lkXT1cInRvYXN0LmlkXCJcbiAgICBbY2xhc3Mud2NvLXRvYXN0LS12aXNpYmxlXT1cInRvYXN0LnZpc2libGVcIlxuICAgIFtjbGFzcy53Y28tdG9hc3QtLXN0YXJ0XT1cInRvYXN0LnRhbGxcIlxuICAgIFthdHRyLmRhdGEtcG9zaXRpb25dPVwiaVwiXG4gICAgW2NsYXNzXT1cIid3Y28tdG9hc3Qgd2NvLXRvYXN0LS1taW5pIHdjby10b2FzdC0tJyArIGdldEljb25NYXRlcmlhbCh0b2FzdC5jb25maWcpLmNvbG9yICsgKHRvYXN0LnZpc2libGUgPyAnIHdjby10b2FzdC0tdmlzaWJsZScgOiAnJylcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cIndjby10b2FzdF9fYm9keVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRvYXN0LmNvbmZpZy5zaG93SWNvblwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIndjby10b2FzdF9faWNvbiBtYXRlcmlhbC1pY29ucy1yb3VuZFwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0b2FzdC5jb25maWcubWF0ZXJpYWxJY29uOyBlbHNlIGRlZmF1bHRJY29uXCI+XG4gICAgICAgICAgICB7eyB0b2FzdC5jb25maWcubWF0ZXJpYWxJY29uIH19XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0SWNvbj5cbiAgICAgICAgICAgIHt7IGdldEljb25NYXRlcmlhbCh0b2FzdC5jb25maWcpLmljb24gfX1cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPGRpdiBjbGFzcz1cIndjby10b2FzdF9fY29udGVudFwiPlxuICAgICAgICA8c3Bhbj5cbiAgICAgICAgICA8cCBjbGFzcz1cIndjby10b2FzdF9fdGl0bGVcIiAqbmdJZj1cInRvYXN0LmNvbmZpZy50aXRsZVwiIFtpbm5lckhUTUxdPVwiZ2V0U2FmZUh0bWwodG9hc3QuY29uZmlnLnRpdGxlKVwiPjwvcD5cbiAgICAgICAgICA8cCBjbGFzcz1cIndjby10b2FzdF9fbWVzc2FnZVwiICpuZ0lmPVwidG9hc3QuY29uZmlnLm1lc3NhZ2UgJiYgdG9hc3QuY29uZmlnLm1lc3NhZ2UubGVuZ3RoIFwiIFtpbm5lckhUTUxdPVwiZ2V0U2FmZUh0bWwodG9hc3QuY29uZmlnLm1lc3NhZ2UpXCI+PC9wPlxuICAgICAgICA8L3NwYW4+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3Y28tdG9hc3RfX2FjdGlvbnNcIiAqbmdJZj1cInRvYXN0LmNvbmZpZy5hY3Rpb25zICYmIHRvYXN0LmNvbmZpZy5hY3Rpb25zLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgdG9hc3QuY29uZmlnLmFjdGlvbnNcIlxuICAgICAgICAgICAgW2NsYXNzXT1cImdldEJ1dHRvbkNsYXNzKGFjdGlvbilcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImFjdGlvbi5hY3Rpb24oKTsgZGlzbWlzcyh0b2FzdC5pZClcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtcm91bmRcIiAqbmdJZj1cImFjdGlvbi5tYXRlcmlhbEljb25MZWZ0XCI+e3sgYWN0aW9uLm1hdGVyaWFsSWNvbkxlZnQgfX08L3NwYW4+XG4gICAgICAgICAgICB7eyBhY3Rpb24udGV4dCB9fVxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29ucy1yb3VuZFwiICpuZ0lmPVwiYWN0aW9uLm1hdGVyaWFsSWNvblJpZ2h0XCI+e3sgYWN0aW9uLm1hdGVyaWFsSWNvblJpZ2h0IH19PC9zcGFuPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGJ1dHRvbiBjbGFzcz1cIndjby10b2FzdF9fY2xvc2VcIiAqbmdJZj1cInRvYXN0LmNvbmZpZy5jbG9zZSAhPT0gZmFsc2VcIiAoY2xpY2spPVwiZGlzbWlzcyh0b2FzdC5pZClcIiBhcmlhLWxhYmVsPVwiRmVjaGFyXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLWljb25zXCI+Y2xvc2U8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICBcbjwvZGlhbG9nPlxuIl19