UNPKG

cfc-ds

Version:

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

109 lines 18 kB
import { Component } from '@angular/core'; import { NavigationEnd } from '@angular/router'; import { filter } from 'rxjs'; import * as i0 from "@angular/core"; import * as i1 from "@angular/router"; import * as i2 from "@angular/common"; export class BreadcrumbComponent { router; activatedRoute; /** Lista de breadcrumbs gerados */ links = []; /** Inscrição para monitorar mudanças na rota */ routeSubscription; constructor(router, activatedRoute) { this.router = router; this.activatedRoute = activatedRoute; } /** Inicializa o componente e observa mudanças de rota */ ngOnInit() { this.updateBreadcrumbs(); this.routeSubscription = this.router.events.pipe(filter(event => event instanceof NavigationEnd)).subscribe(() => { this.updateBreadcrumbs(); }); } /** Atualiza os breadcrumbs com base na rota ativa */ updateBreadcrumbs() { const breadcrumbs = this.buildBreadcrumbs(this.router.routerState.root); this.removeLastBreadcrumbUrl(breadcrumbs); this.links = breadcrumbs; } /** * Constrói os breadcrumbs recursivamente com base nas rotas ativadas. * @param route Rota ativa. * @param breadcrumbs Lista de breadcrumbs acumulada. * @returns Lista de BreadcrumbLink atualizada. */ buildBreadcrumbs(route, breadcrumbs = []) { route.children.forEach((child) => { const routeSegment = this.getRouteURL(child); const label = this.getBreadcrumbLabel(child.snapshot.data); const fullPath = this.buildFullPath(routeSegment, breadcrumbs); if (label && !this.isDuplicateBreadcrumb(breadcrumbs, label)) { breadcrumbs.push({ label, url: fullPath, target: '_self' }); } this.buildBreadcrumbs(child, breadcrumbs); }); return breadcrumbs; } /** * Obtém o segmento da URL da rota atual. * @param route Rota atual. * @returns Segmento da URL ou string vazia. */ getRouteURL(route) { return route.snapshot.url.length > 0 ? route.snapshot.url.map(segment => segment.path).join('/') : ''; } /** * Constrói o caminho completo concatenando segmentos anteriores. * @param routeSegment Segmento atual da rota. * @param breadcrumbs Lista de breadcrumbs acumulada. * @returns Caminho completo da URL. */ buildFullPath(routeSegment, breadcrumbs) { if (!routeSegment) return ''; const previousPath = breadcrumbs.length > 0 ? breadcrumbs[breadcrumbs.length - 1].url : ''; return previousPath ? `${previousPath}/${routeSegment}` : `/${routeSegment}`; } /** * Obtém o rótulo do breadcrumb a partir dos dados da rota. * @param data Dados da rota. * @returns Rótulo do breadcrumb ou null. */ getBreadcrumbLabel(data) { const label = data['breadcrumb']; return label && typeof label === 'string' && label.trim() ? label.trim() : null; } /** * Remove a URL do último breadcrumb para evitar que seja clicável. * @param breadcrumbs Lista de breadcrumbs. */ removeLastBreadcrumbUrl(breadcrumbs) { if (breadcrumbs.length > 0) { breadcrumbs[breadcrumbs.length - 1].url = undefined; } } /** * Verifica se um breadcrumb já existe na lista para evitar duplicatas. * @param breadcrumbs Lista de breadcrumbs acumulada. * @param label Nome do breadcrumb a verificar. * @returns Verdadeiro se o breadcrumb já existir, falso caso contrário. */ isDuplicateBreadcrumb(breadcrumbs, label) { return breadcrumbs.some(bc => bc.label === label); } /** Cancela a inscrição ao destruir o componente */ ngOnDestroy() { this.routeSubscription?.unsubscribe(); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BreadcrumbComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BreadcrumbComponent, selector: "cfc-breadcrumb", ngImport: i0, template: "<nav\r\n class=\"br-breadcrumb\"\r\n aria-label=\"Breadcrumbs\">\r\n <ul\r\n class=\"crumb-list\"\r\n style=\"padding-left: 0;\"\r\n role=\"list\">\r\n <li\r\n class=\"crumb\">\r\n <a\r\n class=\"br-button circle\"\r\n href=\"/\"\r\n target=\"_self\">\r\n <i class=\"fas fa-home\"></i>\r\n </a>\r\n </li>\r\n\r\n <li\r\n class=\"crumb\"\r\n *ngFor=\"let link of links; let last = last\">\r\n <i\r\n class=\"icon fas fa-chevron-right\">\r\n </i>\r\n\r\n <a\r\n *ngIf=\"!last\"\r\n [href]=\"link.url\"\r\n [target]=\"link.target\">\r\n <span>\r\n {{ link.label | titlecase }}\r\n </span>\r\n </a>\r\n\r\n\r\n <span\r\n *ngIf=\"last\"\r\n tabindex=\"0\"\r\n aria-current=\"page\">\r\n {{ link.label | titlecase }}\r\n </span>\r\n\r\n </li>\r\n </ul>\r\n</nav>\r\n", styles: [""], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.TitleCasePipe, name: "titlecase" }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BreadcrumbComponent, decorators: [{ type: Component, args: [{ selector: 'cfc-breadcrumb', template: "<nav\r\n class=\"br-breadcrumb\"\r\n aria-label=\"Breadcrumbs\">\r\n <ul\r\n class=\"crumb-list\"\r\n style=\"padding-left: 0;\"\r\n role=\"list\">\r\n <li\r\n class=\"crumb\">\r\n <a\r\n class=\"br-button circle\"\r\n href=\"/\"\r\n target=\"_self\">\r\n <i class=\"fas fa-home\"></i>\r\n </a>\r\n </li>\r\n\r\n <li\r\n class=\"crumb\"\r\n *ngFor=\"let link of links; let last = last\">\r\n <i\r\n class=\"icon fas fa-chevron-right\">\r\n </i>\r\n\r\n <a\r\n *ngIf=\"!last\"\r\n [href]=\"link.url\"\r\n [target]=\"link.target\">\r\n <span>\r\n {{ link.label | titlecase }}\r\n </span>\r\n </a>\r\n\r\n\r\n <span\r\n *ngIf=\"last\"\r\n tabindex=\"0\"\r\n aria-current=\"page\">\r\n {{ link.label | titlecase }}\r\n </span>\r\n\r\n </li>\r\n </ul>\r\n</nav>\r\n" }] }], ctorParameters: () => [{ type: i1.Router }, { type: i1.ActivatedRoute }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJlYWRjcnVtYi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2JyZWFkY3J1bWIvYnJlYWRjcnVtYi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQTBCLGFBQWEsRUFBUSxNQUFNLGlCQUFpQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxNQUFNLEVBQWdCLE1BQU0sTUFBTSxDQUFDOzs7O0FBUTVDLE1BQU0sT0FBTyxtQkFBbUI7SUFRcEI7SUFDQTtJQVJWLG1DQUFtQztJQUNuQyxLQUFLLEdBQXFCLEVBQUUsQ0FBQztJQUU3QixnREFBZ0Q7SUFDeEMsaUJBQWlCLENBQWdCO0lBRXpDLFlBQ1UsTUFBYyxFQUNkLGNBQThCO1FBRDlCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7SUFDckMsQ0FBQztJQUVKLHlEQUF5RDtJQUN6RCxRQUFRO1FBQ04sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFFekIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FDOUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxZQUFZLGFBQWEsQ0FBQyxDQUNoRCxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZixJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxxREFBcUQ7SUFDN0MsaUJBQWlCO1FB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LElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELG1EQUFtRDtJQUNuRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxDQUFDO0lBQ3hDLENBQUM7d0dBNUdVLG1CQUFtQjs0RkFBbkIsbUJBQW1CLHNEQ1ZoQyxxN0JBNENBOzs0RkRsQ2EsbUJBQW1CO2tCQUwvQixTQUFTOytCQUNFLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgUm91dGVyLCBBY3RpdmF0ZWRSb3V0ZSwgTmF2aWdhdGlvbkVuZCwgRGF0YSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IGZpbHRlciwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IEJyZWFkY3J1bWJMaW5rIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2JyZWFkY3J1bWIubW9kZWwnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjZmMtYnJlYWRjcnVtYicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2JyZWFkY3J1bWIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2JyZWFkY3J1bWIuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQnJlYWRjcnVtYkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAvKiogTGlzdGEgZGUgYnJlYWRjcnVtYnMgZ2VyYWRvcyAqL1xyXG4gIGxpbmtzOiBCcmVhZGNydW1iTGlua1tdID0gW107XHJcblxyXG4gIC8qKiBJbnNjcmnDp8OjbyBwYXJhIG1vbml0b3JhciBtdWRhbsOnYXMgbmEgcm90YSAqL1xyXG4gIHByaXZhdGUgcm91dGVTdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlXHJcbiAgKSB7fVxyXG5cclxuICAvKiogSW5pY2lhbGl6YSBvIGNvbXBvbmVudGUgZSBvYnNlcnZhIG11ZGFuw6dhcyBkZSByb3RhICovXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnVwZGF0ZUJyZWFkY3J1bWJzKCk7XHJcblxyXG4gICAgdGhpcy5yb3V0ZVN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGVyLmV2ZW50cy5waXBlKFxyXG4gICAgICBmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBOYXZpZ2F0aW9uRW5kKVxyXG4gICAgKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLnVwZGF0ZUJyZWFkY3J1bWJzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBBdHVhbGl6YSBvcyBicmVhZGNydW1icyBjb20gYmFzZSBuYSByb3RhIGF0aXZhICovXHJcbiAgcHJpdmF0ZSB1cGRhdGVCcmVhZGNydW1icygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGJyZWFkY3J1bWJzID0gdGhpcy5idWlsZEJyZWFkY3J1bWJzKHRoaXMucm91dGVyLnJvdXRlclN0YXRlLnJvb3QpO1xyXG4gICAgdGhpcy5yZW1vdmVMYXN0QnJlYWRjcnVtYlVybChicmVhZGNydW1icyk7XHJcbiAgICB0aGlzLmxpbmtzID0gYnJlYWRjcnVtYnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb25zdHLDs2kgb3MgYnJlYWRjcnVtYnMgcmVjdXJzaXZhbWVudGUgY29tIGJhc2UgbmFzIHJvdGFzIGF0aXZhZGFzLlxyXG4gICAqIEBwYXJhbSByb3V0ZSBSb3RhIGF0aXZhLlxyXG4gICAqIEBwYXJhbSBicmVhZGNydW1icyBMaXN0YSBkZSBicmVhZGNydW1icyBhY3VtdWxhZGEuXHJcbiAgICogQHJldHVybnMgTGlzdGEgZGUgQnJlYWRjcnVtYkxpbmsgYXR1YWxpemFkYS5cclxuICAgKi9cclxuICBwcml2YXRlIGJ1aWxkQnJlYWRjcnVtYnMocm91dGU6IEFjdGl2YXRlZFJvdXRlLCBicmVhZGNydW1iczogQnJlYWRjcnVtYkxpbmtbXSA9IFtdKTogQnJlYWRjcnVtYkxpbmtbXSB7XHJcbiAgICByb3V0ZS5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgICBjb25zdCByb3V0ZVNlZ21lbnQgPSB0aGlzLmdldFJvdXRlVVJMKGNoaWxkKTtcclxuICAgICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldEJyZWFkY3J1bWJMYWJlbChjaGlsZC5zbmFwc2hvdC5kYXRhKTtcclxuICAgICAgY29uc3QgZnVsbFBhdGggPSB0aGlzLmJ1aWxkRnVsbFBhdGgocm91dGVTZWdtZW50LCBicmVhZGNydW1icyk7XHJcblxyXG4gICAgICBpZiAobGFiZWwgJiYgIXRoaXMuaXNEdXBsaWNhdGVCcmVhZGNydW1iKGJyZWFkY3J1bWJzLCBsYWJlbCkpIHtcclxuICAgICAgICBicmVhZGNydW1icy5wdXNoKHsgbGFiZWwsIHVybDogZnVsbFBhdGgsIHRhcmdldDogJ19zZWxmJyB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5idWlsZEJyZWFkY3J1bWJzKGNoaWxkLCBicmVhZGNydW1icyk7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gYnJlYWRjcnVtYnM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPYnTDqW0gbyBzZWdtZW50byBkYSBVUkwgZGEgcm90YSBhdHVhbC5cclxuICAgKiBAcGFyYW0gcm91dGUgUm90YSBhdHVhbC5cclxuICAgKiBAcmV0dXJucyBTZWdtZW50byBkYSBVUkwgb3Ugc3RyaW5nIHZhemlhLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0Um91dGVVUkwocm91dGU6IEFjdGl2YXRlZFJvdXRlKTogc3RyaW5nIHtcclxuICAgIHJldHVybiByb3V0ZS5zbmFwc2hvdC51cmwubGVuZ3RoID4gMFxyXG4gICAgICA/IHJvdXRlLnNuYXBzaG90LnVybC5tYXAoc2VnbWVudCA9PiBzZWdtZW50LnBhdGgpLmpvaW4oJy8nKVxyXG4gICAgICA6ICcnO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29uc3Ryw7NpIG8gY2FtaW5obyBjb21wbGV0byBjb25jYXRlbmFuZG8gc2VnbWVudG9zIGFudGVyaW9yZXMuXHJcbiAgICogQHBhcmFtIHJvdXRlU2VnbWVudCBTZWdtZW50byBhdHVhbCBkYSByb3RhLlxyXG4gICAqIEBwYXJhbSBicmVhZGNydW1icyBMaXN0YSBkZSBicmVhZGNydW1icyBhY3VtdWxhZGEuXHJcbiAgICogQHJldHVybnMgQ2FtaW5obyBjb21wbGV0byBkYSBVUkwuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBidWlsZEZ1bGxQYXRoKHJvdXRlU2VnbWVudDogc3RyaW5nLCBicmVhZGNydW1iczogQnJlYWRjcnVtYkxpbmtbXSk6IHN0cmluZyB7XHJcbiAgICBpZiAoIXJvdXRlU2VnbWVudCkgcmV0dXJuICcnO1xyXG4gICAgY29uc3QgcHJldmlvdXNQYXRoID0gYnJlYWRjcnVtYnMubGVuZ3RoID4gMCA/IGJyZWFkY3J1bWJzW2JyZWFkY3J1bWJzLmxlbmd0aCAtIDFdLnVybCA6ICcnO1xyXG4gICAgcmV0dXJuIHByZXZpb3VzUGF0aCA/IGAke3ByZXZpb3VzUGF0aH0vJHtyb3V0ZVNlZ21lbnR9YCA6IGAvJHtyb3V0ZVNlZ21lbnR9YDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9idMOpbSBvIHLDs3R1bG8gZG8gYnJlYWRjcnVtYiBhIHBhcnRpciBkb3MgZGFkb3MgZGEgcm90YS5cclxuICAgKiBAcGFyYW0gZGF0YSBEYWRvcyBkYSByb3RhLlxyXG4gICAqIEByZXR1cm5zIFLDs3R1bG8gZG8gYnJlYWRjcnVtYiBvdSBudWxsLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0QnJlYWRjcnVtYkxhYmVsKGRhdGE6IERhdGEpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIGNvbnN0IGxhYmVsID0gZGF0YVsnYnJlYWRjcnVtYiddO1xyXG4gICAgcmV0dXJuIGxhYmVsICYmIHR5cGVvZiBsYWJlbCA9PT0gJ3N0cmluZycgJiYgbGFiZWwudHJpbSgpID8gbGFiZWwudHJpbSgpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlbW92ZSBhIFVSTCBkbyDDumx0aW1vIGJyZWFkY3J1bWIgcGFyYSBldml0YXIgcXVlIHNlamEgY2xpY8OhdmVsLlxyXG4gICAqIEBwYXJhbSBicmVhZGNydW1icyBMaXN0YSBkZSBicmVhZGNydW1icy5cclxuICAgKi9cclxuICBwcml2YXRlIHJlbW92ZUxhc3RCcmVhZGNydW1iVXJsKGJyZWFkY3J1bWJzOiBCcmVhZGNydW1iTGlua1tdKTogdm9pZCB7XHJcbiAgICBpZiAoYnJlYWRjcnVtYnMubGVuZ3RoID4gMCkge1xyXG4gICAgICBicmVhZGNydW1ic1ticmVhZGNydW1icy5sZW5ndGggLSAxXS51cmwgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWZXJpZmljYSBzZSB1bSBicmVhZGNydW1iIGrDoSBleGlzdGUgbmEgbGlzdGEgcGFyYSBldml0YXIgZHVwbGljYXRhcy5cclxuICAgKiBAcGFyYW0gYnJlYWRjcnVtYnMgTGlzdGEgZGUgYnJlYWRjcnVtYnMgYWN1bXVsYWRhLlxyXG4gICAqIEBwYXJhbSBsYWJlbCBOb21lIGRvIGJyZWFkY3J1bWIgYSB2ZXJpZmljYXIuXHJcbiAgICogQHJldHVybnMgVmVyZGFkZWlybyBzZSBvIGJyZWFkY3J1bWIgasOhIGV4aXN0aXIsIGZhbHNvIGNhc28gY29udHLDoXJpby5cclxuICAgKi9cclxuICBwcml2YXRlIGlzRHVwbGljYXRlQnJlYWRjcnVtYihicmVhZGNydW1iczogQnJlYWRjcnVtYkxpbmtbXSwgbGFiZWw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGJyZWFkY3J1bWJzLnNvbWUoYmMgPT4gYmMubGFiZWwgPT09IGxhYmVsKTtcclxuICB9XHJcblxyXG4gIC8qKiBDYW5jZWxhIGEgaW5zY3Jpw6fDo28gYW8gZGVzdHJ1aXIgbyBjb21wb25lbnRlICovXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnJvdXRlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxufVxyXG4iLCI8bmF2XHJcbiAgY2xhc3M9XCJici1icmVhZGNydW1iXCJcclxuICBhcmlhLWxhYmVsPVwiQnJlYWRjcnVtYnNcIj5cclxuICA8dWxcclxuICAgIGNsYXNzPVwiY3J1bWItbGlzdFwiXHJcbiAgICBzdHlsZT1cInBhZGRpbmctbGVmdDogMDtcIlxyXG4gICAgcm9sZT1cImxpc3RcIj5cclxuICAgIDxsaVxyXG4gICAgICBjbGFzcz1cImNydW1iXCI+XHJcbiAgICAgIDxhXHJcbiAgICAgICAgY2xhc3M9XCJici1idXR0b24gY2lyY2xlXCJcclxuICAgICAgICBocmVmPVwiL1wiXHJcbiAgICAgICAgdGFyZ2V0PVwiX3NlbGZcIj5cclxuICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1ob21lXCI+PC9pPlxyXG4gICAgICA8L2E+XHJcbiAgICA8L2xpPlxyXG5cclxuICAgIDxsaVxyXG4gICAgICBjbGFzcz1cImNydW1iXCJcclxuICAgICAgKm5nRm9yPVwibGV0IGxpbmsgb2YgbGlua3M7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICA8aVxyXG4gICAgICAgIGNsYXNzPVwiaWNvbiBmYXMgZmEtY2hldnJvbi1yaWdodFwiPlxyXG4gICAgICA8L2k+XHJcblxyXG4gICAgICA8YVxyXG4gICAgICAgICpuZ0lmPVwiIWxhc3RcIlxyXG4gICAgICAgIFtocmVmXT1cImxpbmsudXJsXCJcclxuICAgICAgICBbdGFyZ2V0XT1cImxpbmsudGFyZ2V0XCI+XHJcbiAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICB7eyBsaW5rLmxhYmVsIHwgdGl0bGVjYXNlIH19XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2E+XHJcblxyXG5cclxuICAgICAgPHNwYW5cclxuICAgICAgICAqbmdJZj1cImxhc3RcIlxyXG4gICAgICAgIHRhYmluZGV4PVwiMFwiXHJcbiAgICAgICAgYXJpYS1jdXJyZW50PVwicGFnZVwiPlxyXG4gICAgICAgIHt7IGxpbmsubGFiZWwgfCB0aXRsZWNhc2UgfX1cclxuICAgICAgPC9zcGFuPlxyXG5cclxuICAgIDwvbGk+XHJcbiAgPC91bD5cclxuPC9uYXY+XHJcbiJdfQ==