UNPKG

@edugouvfr/ngx-dsfr-ext

Version:

NgxDsfrExt est une extension au package @edugouvfr/ngx-dsfr (portage Angular des éléments DSFR)

123 lines 19.1 kB
import { animate, style, transition, trigger } from '@angular/animations'; import { CommonModule } from '@angular/common'; import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core'; import { Subscription } from 'rxjs'; import { DEFAULT_DURATION, ToastItemComponent } from './item/toast-item.component'; import { DsfrToastPositionConst } from './toast.model'; import * as i0 from "@angular/core"; import * as i1 from "./toast.service"; import * as i2 from "@angular/common"; export const DEFAULT_POSITION = DsfrToastPositionConst.BOTTOM_CENTER; const fromBottom = style({ opacity: 0, transform: 'translateY(100%)', }); const fromTop = style({ opacity: 0, transform: 'translateY(-100%)', }); const idle = style({ opacity: 1, transform: 'translateY(0%)', }); const faded = style({ opacity: 0, transform: 'translateY(0%)', }); export class DsfrToastComponent { /** @internal */ constructor(toastService) { this.toastService = toastService; /** * La durée d'affichage en ms des notifications avant fermeture. * * Chaque notification peut recevoir elle même une durée d'affichage spécifique * à l'appel de la méthode show du ToastService. * * Valeur par défaut: 5000 ms. */ this.duration = DEFAULT_DURATION; /** * Position par défaut des notifications. * * Valeur par défaut: 'bottom-center'. */ this.position = DEFAULT_POSITION; /** * Propriété z-index du toaster. * * Le toaster crée un nouveau contexte d'empilement qui peut nécessiter des * ajustement en fonction des autres composants du contexte cible. * * Valeur par défaut: 2500 */ this.zIndex = 2500; /** * Notifie la fermeture d'une notification. */ this.itemClose = new EventEmitter(); /** * Liste des toasts. */ this.toasts = new Array(); this.bottomPositions = [ DsfrToastPositionConst.BOTTOM_CENTER.toString(), DsfrToastPositionConst.BOTTOM_LEFT.toString(), DsfrToastPositionConst.BOTTOM_RIGHT.toString(), DsfrToastPositionConst.CENTER.toString(), ]; this.subscription = new Subscription(); } /** @internal */ ngAfterViewInit() { const toast$ = this.toastService.toasts().subscribe((toast) => { this.add(toast); }); this.subscription.add(toast$); } /** @internal */ ngOnDestroy() { this.subscription.unsubscribe(); } add(toast) { this.toasts.unshift(toast); } onToastClose(toast) { const index = this.toasts.indexOf(toast); this.toasts.splice(index, 1); this.itemClose.emit(toast); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrToastComponent, deps: [{ token: i1.DsfrToastService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DsfrToastComponent, isStandalone: true, selector: "dsfr-ext-toaster, dsfrx-toaster", inputs: { duration: "duration", position: "position", zIndex: "zIndex" }, outputs: { itemClose: "itemClose" }, ngImport: i0, template: "<div\n class=\"dsfrx-toast-container\"\n role=\"status\"\n aria-live=\"polite\"\n [class]=\"position\"\n [ngStyle]=\"{ 'z-index': zIndex }\">\n @for (toast of toasts; track toast) {\n @if (bottomPositions.includes(position)) {\n <div [@slideFromBottom]>\n <ng-container [ngTemplateOutlet]=\"toastTemplate\" [ngTemplateOutletContext]=\"{ toast: toast }\"></ng-container>\n </div>\n } @else {\n <div [@slideFromTop]>\n <ng-container [ngTemplateOutlet]=\"toastTemplate\" [ngTemplateOutletContext]=\"{ toast: toast }\"></ng-container>\n </div>\n }\n }\n</div>\n\n<ng-template #toastTemplate let-toast=\"toast\">\n <edu-toast-item\n [@slideFromTop]\n [toastId]=\"toast.toastId\"\n [heading]=\"toast.heading\"\n [content]=\"toast.content\"\n [severity]=\"toast.severity ?? 'info'\"\n [duration]=\"toast.duration ?? duration\"\n (itemClose)=\"onToastClose(toast)\"></edu-toast-item>\n</ng-template>\n", styles: [".dsfrx-toast-container{position:fixed;width:100%;max-width:35rem}.dsfrx-toast-container.center{top:50%;left:50%;transform:translate(-50%,-50%)}.dsfrx-toast-container.top-left{top:1rem;left:1rem}.dsfrx-toast-container.top-center{top:1rem;left:50%;transform:translate(-50%)}.dsfrx-toast-container.top-right{top:1rem;right:1rem}.dsfrx-toast-container.bottom-left{bottom:1rem;left:1rem}.dsfrx-toast-container.bottom-center{bottom:1rem;left:50%;transform:translate(-50%)}.dsfrx-toast-container.bottom-right{bottom:1rem;right:1rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: ToastItemComponent, selector: "edu-toast-item", inputs: ["toastId", "heading", "content", "severity", "duration"], outputs: ["itemClose"] }], animations: [ trigger('slideFromBottom', [ transition(':enter', [fromBottom, animate('300ms ease-in-out', idle)]), transition(':leave', [idle, animate('250ms ease-in-out', faded)]), ]), trigger('slideFromTop', [ transition(':enter', [fromTop, animate('300ms ease-in-out', idle)]), transition(':leave', [idle, animate('250ms ease-in-out', faded)]), ]), ], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DsfrToastComponent, decorators: [{ type: Component, args: [{ selector: 'dsfr-ext-toaster, dsfrx-toaster', encapsulation: ViewEncapsulation.None, standalone: true, imports: [CommonModule, ToastItemComponent], animations: [ trigger('slideFromBottom', [ transition(':enter', [fromBottom, animate('300ms ease-in-out', idle)]), transition(':leave', [idle, animate('250ms ease-in-out', faded)]), ]), trigger('slideFromTop', [ transition(':enter', [fromTop, animate('300ms ease-in-out', idle)]), transition(':leave', [idle, animate('250ms ease-in-out', faded)]), ]), ], template: "<div\n class=\"dsfrx-toast-container\"\n role=\"status\"\n aria-live=\"polite\"\n [class]=\"position\"\n [ngStyle]=\"{ 'z-index': zIndex }\">\n @for (toast of toasts; track toast) {\n @if (bottomPositions.includes(position)) {\n <div [@slideFromBottom]>\n <ng-container [ngTemplateOutlet]=\"toastTemplate\" [ngTemplateOutletContext]=\"{ toast: toast }\"></ng-container>\n </div>\n } @else {\n <div [@slideFromTop]>\n <ng-container [ngTemplateOutlet]=\"toastTemplate\" [ngTemplateOutletContext]=\"{ toast: toast }\"></ng-container>\n </div>\n }\n }\n</div>\n\n<ng-template #toastTemplate let-toast=\"toast\">\n <edu-toast-item\n [@slideFromTop]\n [toastId]=\"toast.toastId\"\n [heading]=\"toast.heading\"\n [content]=\"toast.content\"\n [severity]=\"toast.severity ?? 'info'\"\n [duration]=\"toast.duration ?? duration\"\n (itemClose)=\"onToastClose(toast)\"></edu-toast-item>\n</ng-template>\n", styles: [".dsfrx-toast-container{position:fixed;width:100%;max-width:35rem}.dsfrx-toast-container.center{top:50%;left:50%;transform:translate(-50%,-50%)}.dsfrx-toast-container.top-left{top:1rem;left:1rem}.dsfrx-toast-container.top-center{top:1rem;left:50%;transform:translate(-50%)}.dsfrx-toast-container.top-right{top:1rem;right:1rem}.dsfrx-toast-container.bottom-left{bottom:1rem;left:1rem}.dsfrx-toast-container.bottom-center{bottom:1rem;left:50%;transform:translate(-50%)}.dsfrx-toast-container.bottom-right{bottom:1rem;right:1rem}\n"] }] }], ctorParameters: () => [{ type: i1.DsfrToastService }], propDecorators: { duration: [{ type: Input }], position: [{ type: Input }], zIndex: [{ type: Input }], itemClose: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItZXh0L3NyYy9saWIvdG9hc3QvdG9hc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWRzZnItZXh0L3NyYy9saWIvdG9hc3QvdG9hc3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQWlCLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ25GLE9BQU8sRUFBZ0Msc0JBQXNCLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7QUFHckYsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsc0JBQXNCLENBQUMsYUFBYSxDQUFDO0FBRXJFLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQztJQUN2QixPQUFPLEVBQUUsQ0FBQztJQUNWLFNBQVMsRUFBRSxrQkFBa0I7Q0FDOUIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLE9BQU8sRUFBRSxDQUFDO0lBQ1YsU0FBUyxFQUFFLG1CQUFtQjtDQUMvQixDQUFDLENBQUM7QUFFSCxNQUFNLElBQUksR0FBRyxLQUFLLENBQUM7SUFDakIsT0FBTyxFQUFFLENBQUM7SUFDVixTQUFTLEVBQUUsZ0JBQWdCO0NBQzVCLENBQUMs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LFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxjQUMvQjt3QkFDVixPQUFPLENBQUMsaUJBQWlCLEVBQUU7NEJBQ3pCLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7NEJBQ3RFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7eUJBQ2xFLENBQUM7d0JBQ0YsT0FBTyxDQUFDLGNBQWMsRUFBRTs0QkFDdEIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQzs0QkFDbkUsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzt5QkFDbEUsQ0FBQztxQkFDSDtxRkFXUSxRQUFRO3NCQUFoQixLQUFLO2dCQU9HLFFBQVE7c0JBQWhCLEtBQUs7Z0JBVUcsTUFBTTtzQkFBZCxLQUFLO2dCQUtJLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBhbmltYXRlLCBzdHlsZSwgdHJhbnNpdGlvbiwgdHJpZ2dlciB9IGZyb20gJ0Bhbmd1bGFyL2FuaW1hdGlvbnMnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERFRkFVTFRfRFVSQVRJT04sIFRvYXN0SXRlbUNvbXBvbmVudCB9IGZyb20gJy4vaXRlbS90b2FzdC1pdGVtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEc2ZyVG9hc3QsIERzZnJUb2FzdFBvc2l0aW9uLCBEc2ZyVG9hc3RQb3NpdGlvbkNvbnN0IH0gZnJvbSAnLi90b2FzdC5tb2RlbCc7XG5pbXBvcnQgeyBEc2ZyVG9hc3RTZXJ2aWNlIH0gZnJvbSAnLi90b2FzdC5zZXJ2aWNlJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUE9TSVRJT04gPSBEc2ZyVG9hc3RQb3NpdGlvbkNvbnN0LkJPVFRPTV9DRU5URVI7XG5cbmNvbnN0IGZyb21Cb3R0b20gPSBzdHlsZSh7XG4gIG9wYWNpdHk6IDAsXG4gIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMTAwJSknLFxufSk7XG5cbmNvbnN0IGZyb21Ub3AgPSBzdHlsZSh7XG4gIG9wYWNpdHk6IDAsXG4gIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTEwMCUpJyxcbn0pO1xuXG5jb25zdCBpZGxlID0gc3R5bGUoe1xuICBvcGFjaXR5OiAxLFxuICB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDAlKScsXG59KTtcblxuY29uc3QgZmFkZWQgPSBzdHlsZSh7XG4gIG9wYWNpdHk6IDAsXG4gIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMCUpJyxcbn0pO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkc2ZyLWV4dC10b2FzdGVyLCBkc2ZyeC10b2FzdGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RvYXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdG9hc3QuY29tcG9uZW50LnNjc3MnXSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgVG9hc3RJdGVtQ29tcG9uZW50XSxcbiAgYW5pbWF0aW9uczogW1xuICAgIHRyaWdnZXIoJ3NsaWRlRnJvbUJvdHRvbScsIFtcbiAgICAgIHRyYW5zaXRpb24oJzplbnRlcicsIFtmcm9tQm90dG9tLCBhbmltYXRlKCczMDBtcyBlYXNlLWluLW91dCcsIGlkbGUpXSksXG4gICAgICB0cmFuc2l0aW9uKCc6bGVhdmUnLCBbaWRsZSwgYW5pbWF0ZSgnMjUwbXMgZWFzZS1pbi1vdXQnLCBmYWRlZCldKSxcbiAgICBdKSxcbiAgICB0cmlnZ2VyKCdzbGlkZUZyb21Ub3AnLCBbXG4gICAgICB0cmFuc2l0aW9uKCc6ZW50ZXInLCBbZnJvbVRvcCwgYW5pbWF0ZSgnMzAwbXMgZWFzZS1pbi1vdXQnLCBpZGxlKV0pLFxuICAgICAgdHJhbnNpdGlvbignOmxlYXZlJywgW2lkbGUsIGFuaW1hdGUoJzI1MG1zIGVhc2UtaW4tb3V0JywgZmFkZWQpXSksXG4gICAgXSksXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIERzZnJUb2FzdENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIC8qKlxuICAgKiBMYSBkdXLDqWUgZCdhZmZpY2hhZ2UgZW4gbXMgZGVzIG5vdGlmaWNhdGlvbnMgYXZhbnQgZmVybWV0dXJlLlxuICAgKlxuICAgKiBDaGFxdWUgbm90aWZpY2F0aW9uIHBldXQgcmVjZXZvaXIgZWxsZSBtw6ptZSB1bmUgZHVyw6llIGQnYWZmaWNoYWdlIHNww6ljaWZpcXVlXG4gICAqIMOgIGwnYXBwZWwgZGUgbGEgbcOpdGhvZGUgc2hvdyBkdSBUb2FzdFNlcnZpY2UuXG4gICAqXG4gICAqIFZhbGV1ciBwYXIgZMOpZmF1dDogNTAwMCBtcy5cbiAgICovXG4gIEBJbnB1dCgpIGR1cmF0aW9uOiBudW1iZXIgPSBERUZBVUxUX0RVUkFUSU9OO1xuXG4gIC8qKlxuICAgKiBQb3NpdGlvbiBwYXIgZMOpZmF1dCBkZXMgbm90aWZpY2F0aW9ucy5cbiAgICpcbiAgICogVmFsZXVyIHBhciBkw6lmYXV0OiAnYm90dG9tLWNlbnRlcicuXG4gICAqL1xuICBASW5wdXQoKSBwb3NpdGlvbjogRHNmclRvYXN0UG9zaXRpb24gPSBERUZBVUxUX1BPU0lUSU9OO1xuXG4gIC8qKlxuICAgKiBQcm9wcmnDqXTDqSB6LWluZGV4IGR1IHRvYXN0ZXIuXG4gICAqXG4gICAqIExlIHRvYXN0ZXIgY3LDqWUgdW4gbm91dmVhdSBjb250ZXh0ZSBkJ2VtcGlsZW1lbnQgcXVpIHBldXQgbsOpY2Vzc2l0ZXIgZGVzXG4gICAqIGFqdXN0ZW1lbnQgZW4gZm9uY3Rpb24gZGVzIGF1dHJlcyBjb21wb3NhbnRzIGR1IGNvbnRleHRlIGNpYmxlLlxuICAgKlxuICAgKiBWYWxldXIgcGFyIGTDqWZhdXQ6IDI1MDBcbiAgICovXG4gIEBJbnB1dCgpIHpJbmRleDogbnVtYmVyID0gMjUwMDtcblxuICAvKipcbiAgICogTm90aWZpZSBsYSBmZXJtZXR1cmUgZCd1bmUgbm90aWZpY2F0aW9uLlxuICAgKi9cbiAgQE91dHB1dCgpIGl0ZW1DbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8RHNmclRvYXN0PigpO1xuXG4gIC8qKlxuICAgKiBMaXN0ZSBkZXMgdG9hc3RzLlxuICAgKi9cbiAgcHJvdGVjdGVkIHRvYXN0cyA9IG5ldyBBcnJheTxEc2ZyVG9hc3Q+KCk7XG5cbiAgcHJvdGVjdGVkIGJvdHRvbVBvc2l0aW9ucyA9IFtcbiAgICBEc2ZyVG9hc3RQb3NpdGlvbkNvbnN0LkJPVFRPTV9DRU5URVIudG9TdHJpbmcoKSxcbiAgICBEc2ZyVG9hc3RQb3NpdGlvbkNvbnN0LkJPVFRPTV9MRUZULnRvU3RyaW5nKCksXG4gICAgRHNmclRvYXN0UG9zaXRpb25Db25zdC5CT1RUT01fUklHSFQudG9TdHJpbmcoKSxcbiAgICBEc2ZyVG9hc3RQb3NpdGlvbkNvbnN0LkNFTlRFUi50b1N0cmluZygpLFxuICBdO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB0b2FzdFNlcnZpY2U6IERzZnJUb2FzdFNlcnZpY2UpIHt9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgY29uc3QgdG9hc3QkID0gdGhpcy50b2FzdFNlcnZpY2UudG9hc3RzKCkuc3Vic2NyaWJlKCh0b2FzdCkgPT4ge1xuICAgICAgdGhpcy5hZGQodG9hc3QpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb24uYWRkKHRvYXN0JCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkKHRvYXN0OiBEc2ZyVG9hc3QpOiB2b2lkIHtcbiAgICB0aGlzLnRvYXN0cy51bnNoaWZ0KHRvYXN0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblRvYXN0Q2xvc2UodG9hc3Q6IERzZnJUb2FzdCkge1xuICAgIGNvbnN0IGluZGV4ID0gdGhpcy50b2FzdHMuaW5kZXhPZih0b2FzdCk7XG4gICAgdGhpcy50b2FzdHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB0aGlzLml0ZW1DbG9zZS5lbWl0KHRvYXN0KTtcbiAgfVxufVxuIiwiPGRpdlxuICBjbGFzcz1cImRzZnJ4LXRvYXN0LWNvbnRhaW5lclwiXG4gIHJvbGU9XCJzdGF0dXNcIlxuICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICBbY2xhc3NdPVwicG9zaXRpb25cIlxuICBbbmdTdHlsZV09XCJ7ICd6LWluZGV4JzogekluZGV4IH1cIj5cbiAgQGZvciAodG9hc3Qgb2YgdG9hc3RzOyB0cmFjayB0b2FzdCkge1xuICAgIEBpZiAoYm90dG9tUG9zaXRpb25zLmluY2x1ZGVzKHBvc2l0aW9uKSkge1xuICAgICAgPGRpdiBbQHNsaWRlRnJvbUJvdHRvbV0+XG4gICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwidG9hc3RUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IHRvYXN0OiB0b2FzdCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICB9IEBlbHNlIHtcbiAgICAgIDxkaXYgW0BzbGlkZUZyb21Ub3BdPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInRvYXN0VGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyB0b2FzdDogdG9hc3QgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICB9XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICN0b2FzdFRlbXBsYXRlIGxldC10b2FzdD1cInRvYXN0XCI+XG4gIDxlZHUtdG9hc3QtaXRlbVxuICAgIFtAc2xpZGVGcm9tVG9wXVxuICAgIFt0b2FzdElkXT1cInRvYXN0LnRvYXN0SWRcIlxuICAgIFtoZWFkaW5nXT1cInRvYXN0LmhlYWRpbmdcIlxuICAgIFtjb250ZW50XT1cInRvYXN0LmNvbnRlbnRcIlxuICAgIFtzZXZlcml0eV09XCJ0b2FzdC5zZXZlcml0eSA/PyAnaW5mbydcIlxuICAgIFtkdXJhdGlvbl09XCJ0b2FzdC5kdXJhdGlvbiA/PyBkdXJhdGlvblwiXG4gICAgKGl0ZW1DbG9zZSk9XCJvblRvYXN0Q2xvc2UodG9hc3QpXCI+PC9lZHUtdG9hc3QtaXRlbT5cbjwvbmctdGVtcGxhdGU+XG4iXX0=