cfc-ds
Version:
Design System do Conselho Federal de Contabilidade baseado no govbr-ds
186 lines • 48 kB
JavaScript
import { Component, EventEmitter, Input, Output } from '@angular/core';
import { HeaderViewMode } from '../../enums/header-view-mode.enum';
import { SignInType } from '../../enums/sign-in-type.enum';
import { ButtonType } from '../../enums/button-type.enum';
import { DividerMode } from '../../enums/divider-mode.enum';
import { DividerAxis } from '../../enums/divider-axis.enum';
import { DividerDensity } from '../../enums/divider-density.enum';
import { DividerType } from '../../enums/divider-type.enum';
import { TimerType } from '../../enums/timer-type.enum';
import { SignInMode } from '../../enums/sign-in-mode.enum';
import * as i0 from "@angular/core";
import * as i1 from "@angular/router";
import * as i2 from "@angular/common";
import * as i3 from "@angular/flex-layout/flex";
import * as i4 from "@angular/flex-layout/extended";
import * as i5 from "../button/button.component";
import * as i6 from "../divider/divider.component";
import * as i7 from "../sign-in/sign-in.component";
import * as i8 from "../timer/timer.component";
export class HeaderComponent {
router;
viewMode = HeaderViewMode.default;
hasMenu = true;
// logo
hasLogo = true;
logoUrl = ''; // URL para logo externa ou caminho para imagem local
logoAlt = 'Logo'; // Texto alternativo para a imagem
// title and description
title;
description;
// timer
hasTimer = false;
timeLogout = 1800;
timeCritical = 300;
// action bar
hasNotificationIcon = true;
userName = 'Entrar';
signinMode = SignInMode.logout;
hasDividerIcon = false;
hasActionIcons = false;
// Language Selector
hasLanguageSelector = true;
languageOptions = []; // Array de opções de idioma
currentLanguageCode = ''; // Código do idioma atual
hasThemeToggle = true;
menuEvent = new EventEmitter;
criticalTimeEvent = new EventEmitter;
timeOutEvent = new EventEmitter;
timeEvent = new EventEmitter;
notificationIconEvent = new EventEmitter;
signinEvent = new EventEmitter;
logoutEvent = new EventEmitter;
themeToggleEvent = new EventEmitter();
languageChangeEvent = new EventEmitter();
viewModeChange = new EventEmitter();
headerViewModes = HeaderViewMode;
dividerModes = DividerMode;
dividerTypes = DividerType;
dividerDensities = DividerDensity;
dividerAxis = DividerAxis;
signinTypes = SignInType;
signinModes = SignInMode;
buttonTypes = ButtonType;
timerTypes = TimerType;
languageDropdownOpen = false;
constructor(router) {
this.router = router;
// Recuperar tema salvo para o header, se existir
const savedHeaderTheme = localStorage.getItem('headerTheme');
if (savedHeaderTheme) {
this.viewMode = savedHeaderTheme;
}
}
toggleMenu() {
this.menuEvent.emit();
}
goToHome() {
if (this.router.url !== '/') {
this.router.navigate(['/']);
}
}
get firstAndLastName() {
const splitedName = this.userName.trim().split(' ');
if (splitedName.length === 1) {
return splitedName[0];
}
else {
return `${splitedName[0]} ${splitedName[splitedName.length - 1]}`;
}
}
toggleLanguageDropdown() {
this.languageDropdownOpen = !this.languageDropdownOpen;
}
selectLanguage(langCode) {
this.currentLanguageCode = langCode;
this.languageDropdownOpen = false;
this.languageChangeEvent.emit(langCode);
}
get currentLanguageDisplay() {
if (!this.currentLanguageCode && this.languageOptions.length > 0) {
this.currentLanguageCode = this.languageOptions[0].code;
}
// Retorna o display name (se disponível) ou o código do idioma
const currentLang = this.languageOptions.find(lang => lang.code === this.currentLanguageCode);
return currentLang ? (currentLang.name || currentLang.code) : this.currentLanguageCode;
}
/**
* Toggle entre os modos de tema do header (claro/escuro)
*/
toggleTheme() {
// Toggle entre os modos default e contrast
this.viewMode = this.viewMode === HeaderViewMode.default
? HeaderViewMode.contrast
: HeaderViewMode.default;
// Emitir eventos para notificar componentes pais
this.viewModeChange.emit(this.viewMode);
this.themeToggleEvent.emit(this.viewMode);
// Salvar preferência apenas para o header
localStorage.setItem('headerTheme', this.viewMode);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeaderComponent, deps: [{ token: i1.Router }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: HeaderComponent, selector: "cfc-header", inputs: { viewMode: "viewMode", hasMenu: "hasMenu", hasLogo: "hasLogo", logoUrl: "logoUrl", logoAlt: "logoAlt", title: "title", description: "description", hasTimer: "hasTimer", timeLogout: "timeLogout", timeCritical: "timeCritical", hasNotificationIcon: "hasNotificationIcon", userName: "userName", signinMode: "signinMode", hasDividerIcon: "hasDividerIcon", hasActionIcons: "hasActionIcons", hasLanguageSelector: "hasLanguageSelector", languageOptions: "languageOptions", currentLanguageCode: "currentLanguageCode", hasThemeToggle: "hasThemeToggle" }, outputs: { menuEvent: "menuEvent", criticalTimeEvent: "criticalTimeEvent", timeOutEvent: "timeOutEvent", timeEvent: "timeEvent", notificationIconEvent: "notificationIconEvent", signinEvent: "signinEvent", logoutEvent: "logoutEvent", themeToggleEvent: "themeToggleEvent", languageChangeEvent: "languageChangeEvent", viewModeChange: "viewModeChange" }, ngImport: i0, template: "<header\r\n class=\"cfc-header\"\r\n [ngClass]=\"{\r\n 'cfc-header--light': viewMode === headerViewModes.default,\r\n 'cfc-header--dark': viewMode === headerViewModes.contrast\r\n }\"\r\n fxLayout=\"row\"\r\n fxLayoutAlign=\"space-between center\">\r\n <div\r\n fxLayout=\"row\"\r\n fxLayoutAlign=\"center center\"\r\n fxLayoutGap=\"1rem\">\r\n\r\n <!-- MENU -->\r\n <cfc-button\r\n *ngIf=\"hasMenu\"\r\n [icon]=\"'bars'\"\r\n [type]=\"buttonTypes.tertiary\"\r\n [circle]=\"true\"\r\n [inverted]=\"viewMode === headerViewModes.contrast\"\r\n aria-label=\"menu\"\r\n data-toggle=\"menu\"\r\n data-target=\"#menu-aside\"\r\n is-push=\"true\"\r\n id=\"push\"\r\n [attr.show-menu]=\"'true'\"\r\n (click)=\"toggleMenu()\">\r\n </cfc-button>\r\n\r\n <!-- LOGO - Sem modifica\u00E7\u00E3o baseada no tema -->\r\n <div *ngIf=\"hasLogo\" class=\"cfc-header__logo-container\" (click)=\"goToHome()\">\r\n <img\r\n [src]=\"logoUrl\"\r\n [alt]=\"logoAlt\"\r\n class=\"cfc-header__logo\"\r\n [ngClass]=\"{\r\n 'cfc-header__logo--clickable': router.url !== '/'\r\n }\">\r\n </div>\r\n\r\n <!-- TITLE AND DESCRIPTION -->\r\n <div\r\n fxLayout=\"column\"\r\n fxLayoutAlign=\"center start\">\r\n <h4\r\n class=\"cfc-header__title\">\r\n {{ title }}\r\n </h4>\r\n <p\r\n *ngIf=\"description\"\r\n class=\"cfc-header__description\">\r\n {{ description }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- ACTION BAR -->\r\n <div\r\n fxLayout=\"row\"\r\n fxLayoutAlign=\"center center\"\r\n fxLayoutGap=\"0.5rem\">\r\n\r\n <!-- Divider antes do Timer -->\r\n <cfc-divider\r\n *ngIf=\"hasTimer\"\r\n [mode]=\"dividerModes.line\"\r\n [type]=\"viewMode === headerViewModes.default ? dividerTypes.primary : dividerTypes.secondary\"\r\n [density]=\"dividerDensities.large\"\r\n [axis]=\"dividerAxis.vertical\"\r\n ></cfc-divider>\r\n\r\n <cfc-timer\r\n *ngIf=\"hasTimer\"\r\n [type]=\"viewMode === headerViewModes.default\r\n ? timerTypes.primary\r\n : timerTypes.secondary\r\n \"\r\n [initialTime]=\"timeLogout\"\r\n [criticalTime]=\"timeCritical\"\r\n [isGlobal]=\"true\"\r\n (timeCriticalEvent)=\"criticalTimeEvent.emit()\"\r\n (timeOutEvent)=\"timeOutEvent.emit()\"\r\n (timeEvent)=\"timeEvent.emit()\"\r\n ></cfc-timer>\r\n\r\n <!-- Divider depois do Timer -->\r\n <cfc-divider\r\n *ngIf=\"hasTimer\"\r\n [mode]=\"dividerModes.line\"\r\n [type]=\"viewMode === headerViewModes.default ? dividerTypes.primary : dividerTypes.secondary\"\r\n [density]=\"dividerDensities.large\"\r\n [axis]=\"dividerAxis.vertical\"\r\n ></cfc-divider>\r\n\r\n <cfc-button\r\n *ngIf=\"hasNotificationIcon\"\r\n style=\"min-width: 2.2rem;\"\r\n [icon]=\"'bell'\"\r\n [type]=\"buttonTypes.tertiary\"\r\n [inverted]=\"viewMode === headerViewModes.contrast\"\r\n [circle]=\"true\"\r\n (onClick)=\"notificationIconEvent.emit()\"\r\n data-toggle=\"menu\"\r\n data-target=\"#push\"\r\n ></cfc-button>\r\n\r\n <cfc-divider\r\n *ngIf=\"!hasNotificationIcon && hasDividerIcon\"\r\n [mode]=\"dividerModes.line\"\r\n [type]=\"viewMode === headerViewModes.default\r\n ? dividerTypes.primary\r\n : dividerTypes.secondary\r\n \"\r\n [density]=\"dividerDensities.large\"\r\n [axis]=\"dividerAxis.vertical\"\r\n ></cfc-divider>\r\n\r\n <!-- Theme Toggle Button -->\r\n <cfc-button\r\n *ngIf=\"hasThemeToggle\"\r\n [type]=\"buttonTypes.tertiary\"\r\n [circle]=\"true\"\r\n [inverted]=\"viewMode === headerViewModes.contrast\"\r\n [icon]=\"viewMode === headerViewModes.contrast ? 'sun' : 'moon'\"\r\n (onClick)=\"toggleTheme()\"\r\n aria-label=\"Alternar tema\">\r\n </cfc-button>\r\n\r\n <!-- Language Selector -->\r\n <div *ngIf=\"hasLanguageSelector && languageOptions.length > 0\" class=\"cfc-header__language-selector\">\r\n <button class=\"cfc-header__language-button\"\r\n [ngClass]=\"{'cfc-header__language-button--dark': viewMode === headerViewModes.contrast}\"\r\n (click)=\"toggleLanguageDropdown()\">\r\n <span>{{ currentLanguageDisplay }}</span>\r\n <i class=\"fas fa-chevron-down\"></i>\r\n </button>\r\n <ul *ngIf=\"languageDropdownOpen\" class=\"cfc-header__language-dropdown\">\r\n <li *ngFor=\"let lang of languageOptions\"\r\n (click)=\"selectLanguage(lang.code)\"\r\n [class.active]=\"lang.code === currentLanguageCode\">\r\n {{ lang.name || lang.code }}\r\n </li>\r\n </ul>\r\n </div>\r\n <ng-content *ngIf=\"hasActionIcons\" select=\"[actionIcons]\"></ng-content>\r\n <cfc-sign-in\r\n class=\"cfc-header__signin\"\r\n [label]=\"firstAndLastName\"\r\n [type]=\"signinTypes.secondary\"\r\n [mode]=\"signinMode\"\r\n (onClick)=\"signinEvent.emit()\"\r\n (onLogout)=\"logoutEvent.emit()\"\r\n ></cfc-sign-in>\r\n </div>\r\n</header>\r\n\r\n<div class=\"cfc-header__spacer\"></div>\r\n", styles: ["*{margin:0;padding:0;box-sizing:border-box}:host{display:block;--header-primary-color: #0C326F;--header-text-color-light: #333;--header-text-color-dark: white;--header-background-light: white;--header-background-dark: #0C326F;--header-shadow: 0 0 8px 1px rgba(193, 193, 193, .5);--header-dark-shadow: 0 0 8px 1px rgba(0, 0, 0, .3);--header-transition-time: .3s}.cfc-header{position:fixed;top:0;left:0;width:100%;height:4rem;padding:0 1.5rem;z-index:999;display:flex;justify-content:space-between;align-items:center;transition:background-color var(--header-transition-time),color var(--header-transition-time),box-shadow var(--header-transition-time)}.cfc-header--light{background-color:var(--header-background-light);color:var(--header-text-color-light);box-shadow:var(--header-shadow)}.cfc-header--dark{background-color:var(--header-background-dark);color:var(--header-text-color-dark);box-shadow:var(--header-dark-shadow)}.cfc-header__logo{max-height:2.5rem;max-width:100px;object-fit:contain}.cfc-header__logo--clickable{cursor:pointer}.cfc-header__logo-container{display:flex;align-items:center;justify-content:center;height:100%;cursor:pointer}.cfc-header__title{font-size:1rem;font-weight:600;margin:0}.cfc-header__description{font-size:.75rem;opacity:.7;margin:0}.cfc-header__theme-button{background:none;border:none;cursor:pointer;display:flex;align-items:center;padding:.5rem;border-radius:4px;transition:background-color .2s}.cfc-header__theme-button i{font-size:1.1rem;margin-right:.5rem;transition:transform .3s ease}.cfc-header__theme-button:hover{background-color:#0000000d}.cfc-header--dark .cfc-header__theme-button:hover{background-color:#ffffff1a}.cfc-header__theme-button:hover i{transform:rotate(30deg)}.cfc-header__theme-button--dark{color:var(--header-text-color-dark)}.cfc-header__theme-button--dark:hover{background-color:#ffffff1a}.cfc-header__language-selector{position:relative}.cfc-header__language-button{display:flex;align-items:center;gap:.5rem;background:none;border:none;padding:.5rem;cursor:pointer}.cfc-header__language-button--dark{color:var(--header-text-color-dark)}.cfc-header__language-dropdown{position:absolute;top:100%;right:0;list-style:none;background-color:#fff;border-radius:4px;box-shadow:0 2px 8px #00000026;min-width:100px;z-index:1000}.cfc-header__language-dropdown li{padding:.5rem 1rem;cursor:pointer;transition:background-color .2s}.cfc-header__language-dropdown li:hover{background-color:#f5f5f5}.cfc-header__language-dropdown li.active{background-color:#e6f7ff}.cfc-header__spacer{height:4rem;width:100%}.theme-toggle-text{font-size:.9rem}@media (max-width: 768px){.theme-toggle-text{display:none}}:host ::ng-deep .br-divider.vertical{height:24px!important;min-height:24px;margin:0 4px!important;opacity:.5;display:block!important}:host ::ng-deep .br-divider.vertical.dark-mode{background-color:#ffffff4d!important}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i3.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i4.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"] }, { kind: "component", type: i5.ButtonComponent, selector: "cfc-button", inputs: ["label", "type", "submit", "circle", "density", "disabled", "block", "icon", "active", "inverted", "loading"], outputs: ["onClick"] }, { kind: "component", type: i6.DividerComponent, selector: "cfc-divider", inputs: ["height", "width", "mode", "type", "axis", "density"] }, { kind: "component", type: i7.SignInComponent, selector: "cfc-sign-in", inputs: ["label", "type", "density", "mode", "disabled", "active", "block", "circle", "externalImageUrl", "externalLabel"], outputs: ["onClick", "onLogout"] }, { kind: "component", type: i8.TimerComponent, selector: "cfc-timer", inputs: ["type", "initialTime", "criticalTime", "isGlobal"], outputs: ["timeOutEvent", "timeEvent", "timeCriticalEvent"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: HeaderComponent, decorators: [{
type: Component,
args: [{ selector: 'cfc-header', template: "<header\r\n class=\"cfc-header\"\r\n [ngClass]=\"{\r\n 'cfc-header--light': viewMode === headerViewModes.default,\r\n 'cfc-header--dark': viewMode === headerViewModes.contrast\r\n }\"\r\n fxLayout=\"row\"\r\n fxLayoutAlign=\"space-between center\">\r\n <div\r\n fxLayout=\"row\"\r\n fxLayoutAlign=\"center center\"\r\n fxLayoutGap=\"1rem\">\r\n\r\n <!-- MENU -->\r\n <cfc-button\r\n *ngIf=\"hasMenu\"\r\n [icon]=\"'bars'\"\r\n [type]=\"buttonTypes.tertiary\"\r\n [circle]=\"true\"\r\n [inverted]=\"viewMode === headerViewModes.contrast\"\r\n aria-label=\"menu\"\r\n data-toggle=\"menu\"\r\n data-target=\"#menu-aside\"\r\n is-push=\"true\"\r\n id=\"push\"\r\n [attr.show-menu]=\"'true'\"\r\n (click)=\"toggleMenu()\">\r\n </cfc-button>\r\n\r\n <!-- LOGO - Sem modifica\u00E7\u00E3o baseada no tema -->\r\n <div *ngIf=\"hasLogo\" class=\"cfc-header__logo-container\" (click)=\"goToHome()\">\r\n <img\r\n [src]=\"logoUrl\"\r\n [alt]=\"logoAlt\"\r\n class=\"cfc-header__logo\"\r\n [ngClass]=\"{\r\n 'cfc-header__logo--clickable': router.url !== '/'\r\n }\">\r\n </div>\r\n\r\n <!-- TITLE AND DESCRIPTION -->\r\n <div\r\n fxLayout=\"column\"\r\n fxLayoutAlign=\"center start\">\r\n <h4\r\n class=\"cfc-header__title\">\r\n {{ title }}\r\n </h4>\r\n <p\r\n *ngIf=\"description\"\r\n class=\"cfc-header__description\">\r\n {{ description }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- ACTION BAR -->\r\n <div\r\n fxLayout=\"row\"\r\n fxLayoutAlign=\"center center\"\r\n fxLayoutGap=\"0.5rem\">\r\n\r\n <!-- Divider antes do Timer -->\r\n <cfc-divider\r\n *ngIf=\"hasTimer\"\r\n [mode]=\"dividerModes.line\"\r\n [type]=\"viewMode === headerViewModes.default ? dividerTypes.primary : dividerTypes.secondary\"\r\n [density]=\"dividerDensities.large\"\r\n [axis]=\"dividerAxis.vertical\"\r\n ></cfc-divider>\r\n\r\n <cfc-timer\r\n *ngIf=\"hasTimer\"\r\n [type]=\"viewMode === headerViewModes.default\r\n ? timerTypes.primary\r\n : timerTypes.secondary\r\n \"\r\n [initialTime]=\"timeLogout\"\r\n [criticalTime]=\"timeCritical\"\r\n [isGlobal]=\"true\"\r\n (timeCriticalEvent)=\"criticalTimeEvent.emit()\"\r\n (timeOutEvent)=\"timeOutEvent.emit()\"\r\n (timeEvent)=\"timeEvent.emit()\"\r\n ></cfc-timer>\r\n\r\n <!-- Divider depois do Timer -->\r\n <cfc-divider\r\n *ngIf=\"hasTimer\"\r\n [mode]=\"dividerModes.line\"\r\n [type]=\"viewMode === headerViewModes.default ? dividerTypes.primary : dividerTypes.secondary\"\r\n [density]=\"dividerDensities.large\"\r\n [axis]=\"dividerAxis.vertical\"\r\n ></cfc-divider>\r\n\r\n <cfc-button\r\n *ngIf=\"hasNotificationIcon\"\r\n style=\"min-width: 2.2rem;\"\r\n [icon]=\"'bell'\"\r\n [type]=\"buttonTypes.tertiary\"\r\n [inverted]=\"viewMode === headerViewModes.contrast\"\r\n [circle]=\"true\"\r\n (onClick)=\"notificationIconEvent.emit()\"\r\n data-toggle=\"menu\"\r\n data-target=\"#push\"\r\n ></cfc-button>\r\n\r\n <cfc-divider\r\n *ngIf=\"!hasNotificationIcon && hasDividerIcon\"\r\n [mode]=\"dividerModes.line\"\r\n [type]=\"viewMode === headerViewModes.default\r\n ? dividerTypes.primary\r\n : dividerTypes.secondary\r\n \"\r\n [density]=\"dividerDensities.large\"\r\n [axis]=\"dividerAxis.vertical\"\r\n ></cfc-divider>\r\n\r\n <!-- Theme Toggle Button -->\r\n <cfc-button\r\n *ngIf=\"hasThemeToggle\"\r\n [type]=\"buttonTypes.tertiary\"\r\n [circle]=\"true\"\r\n [inverted]=\"viewMode === headerViewModes.contrast\"\r\n [icon]=\"viewMode === headerViewModes.contrast ? 'sun' : 'moon'\"\r\n (onClick)=\"toggleTheme()\"\r\n aria-label=\"Alternar tema\">\r\n </cfc-button>\r\n\r\n <!-- Language Selector -->\r\n <div *ngIf=\"hasLanguageSelector && languageOptions.length > 0\" class=\"cfc-header__language-selector\">\r\n <button class=\"cfc-header__language-button\"\r\n [ngClass]=\"{'cfc-header__language-button--dark': viewMode === headerViewModes.contrast}\"\r\n (click)=\"toggleLanguageDropdown()\">\r\n <span>{{ currentLanguageDisplay }}</span>\r\n <i class=\"fas fa-chevron-down\"></i>\r\n </button>\r\n <ul *ngIf=\"languageDropdownOpen\" class=\"cfc-header__language-dropdown\">\r\n <li *ngFor=\"let lang of languageOptions\"\r\n (click)=\"selectLanguage(lang.code)\"\r\n [class.active]=\"lang.code === currentLanguageCode\">\r\n {{ lang.name || lang.code }}\r\n </li>\r\n </ul>\r\n </div>\r\n <ng-content *ngIf=\"hasActionIcons\" select=\"[actionIcons]\"></ng-content>\r\n <cfc-sign-in\r\n class=\"cfc-header__signin\"\r\n [label]=\"firstAndLastName\"\r\n [type]=\"signinTypes.secondary\"\r\n [mode]=\"signinMode\"\r\n (onClick)=\"signinEvent.emit()\"\r\n (onLogout)=\"logoutEvent.emit()\"\r\n ></cfc-sign-in>\r\n </div>\r\n</header>\r\n\r\n<div class=\"cfc-header__spacer\"></div>\r\n", styles: ["*{margin:0;padding:0;box-sizing:border-box}:host{display:block;--header-primary-color: #0C326F;--header-text-color-light: #333;--header-text-color-dark: white;--header-background-light: white;--header-background-dark: #0C326F;--header-shadow: 0 0 8px 1px rgba(193, 193, 193, .5);--header-dark-shadow: 0 0 8px 1px rgba(0, 0, 0, .3);--header-transition-time: .3s}.cfc-header{position:fixed;top:0;left:0;width:100%;height:4rem;padding:0 1.5rem;z-index:999;display:flex;justify-content:space-between;align-items:center;transition:background-color var(--header-transition-time),color var(--header-transition-time),box-shadow var(--header-transition-time)}.cfc-header--light{background-color:var(--header-background-light);color:var(--header-text-color-light);box-shadow:var(--header-shadow)}.cfc-header--dark{background-color:var(--header-background-dark);color:var(--header-text-color-dark);box-shadow:var(--header-dark-shadow)}.cfc-header__logo{max-height:2.5rem;max-width:100px;object-fit:contain}.cfc-header__logo--clickable{cursor:pointer}.cfc-header__logo-container{display:flex;align-items:center;justify-content:center;height:100%;cursor:pointer}.cfc-header__title{font-size:1rem;font-weight:600;margin:0}.cfc-header__description{font-size:.75rem;opacity:.7;margin:0}.cfc-header__theme-button{background:none;border:none;cursor:pointer;display:flex;align-items:center;padding:.5rem;border-radius:4px;transition:background-color .2s}.cfc-header__theme-button i{font-size:1.1rem;margin-right:.5rem;transition:transform .3s ease}.cfc-header__theme-button:hover{background-color:#0000000d}.cfc-header--dark .cfc-header__theme-button:hover{background-color:#ffffff1a}.cfc-header__theme-button:hover i{transform:rotate(30deg)}.cfc-header__theme-button--dark{color:var(--header-text-color-dark)}.cfc-header__theme-button--dark:hover{background-color:#ffffff1a}.cfc-header__language-selector{position:relative}.cfc-header__language-button{display:flex;align-items:center;gap:.5rem;background:none;border:none;padding:.5rem;cursor:pointer}.cfc-header__language-button--dark{color:var(--header-text-color-dark)}.cfc-header__language-dropdown{position:absolute;top:100%;right:0;list-style:none;background-color:#fff;border-radius:4px;box-shadow:0 2px 8px #00000026;min-width:100px;z-index:1000}.cfc-header__language-dropdown li{padding:.5rem 1rem;cursor:pointer;transition:background-color .2s}.cfc-header__language-dropdown li:hover{background-color:#f5f5f5}.cfc-header__language-dropdown li.active{background-color:#e6f7ff}.cfc-header__spacer{height:4rem;width:100%}.theme-toggle-text{font-size:.9rem}@media (max-width: 768px){.theme-toggle-text{display:none}}:host ::ng-deep .br-divider.vertical{height:24px!important;min-height:24px;margin:0 4px!important;opacity:.5;display:block!important}:host ::ng-deep .br-divider.vertical.dark-mode{background-color:#ffffff4d!important}\n"] }]
}], ctorParameters: () => [{ type: i1.Router }], propDecorators: { viewMode: [{
type: Input
}], hasMenu: [{
type: Input
}], hasLogo: [{
type: Input
}], logoUrl: [{
type: Input
}], logoAlt: [{
type: Input
}], title: [{
type: Input
}], description: [{
type: Input
}], hasTimer: [{
type: Input
}], timeLogout: [{
type: Input
}], timeCritical: [{
type: Input
}], hasNotificationIcon: [{
type: Input
}], userName: [{
type: Input
}], signinMode: [{
type: Input
}], hasDividerIcon: [{
type: Input
}], hasActionIcons: [{
type: Input
}], hasLanguageSelector: [{
type: Input
}], languageOptions: [{
type: Input
}], currentLanguageCode: [{
type: Input
}], hasThemeToggle: [{
type: Input
}], menuEvent: [{
type: Output
}], criticalTimeEvent: [{
type: Output
}], timeOutEvent: [{
type: Output
}], timeEvent: [{
type: Output
}], notificationIconEvent: [{
type: Output
}], signinEvent: [{
type: Output
}], logoutEvent: [{
type: Output
}], themeToggleEvent: [{
type: Output
}], languageChangeEvent: [{
type: Output
}], viewModeChange: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NmYy1kcy9zcmMvbGliL2NvbXBvbmVudHMvaGVhZGVyL2hlYWRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2hlYWRlci9oZWFkZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUNsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFNUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7Ozs7Ozs7OztBQVkzRCxNQUFNLE9BQU8sZUFBZTtJQW1EUDtJQWpEVixRQUFRLEdBQW1CLGNBQWMsQ0FBQyxPQUFPLENBQUM7SUFDbEQsT0FBTyxHQUFHLElBQUksQ0FBQztJQUN4QixPQUFPO0lBQ0UsT0FBTyxHQUFHLElBQUksQ0FBQztJQUNmLE9BQU8sR0FBVyxFQUFFLENBQUMsQ0FBQyxxREFBcUQ7SUFDM0UsT0FBTyxH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TSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEhlYWRlclZpZXdNb2RlIH0gZnJvbSAnLi4vLi4vZW51bXMvaGVhZGVyLXZpZXctbW9kZS5lbnVtJztcclxuaW1wb3J0IHsgU2lnbkluVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL3NpZ24taW4tdHlwZS5lbnVtJztcclxuaW1wb3J0IHsgQnV0dG9uVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2J1dHRvbi10eXBlLmVudW0nO1xyXG5pbXBvcnQgeyBEaXZpZGVyTW9kZSB9IGZyb20gJy4uLy4uL2VudW1zL2RpdmlkZXItbW9kZS5lbnVtJztcclxuaW1wb3J0IHsgRGl2aWRlckF4aXMgfSBmcm9tICcuLi8uLi9lbnVtcy9kaXZpZGVyLWF4aXMuZW51bSc7XHJcbmltcG9ydCB7IERpdmlkZXJEZW5zaXR5IH0gZnJvbSAnLi4vLi4vZW51bXMvZGl2aWRlci1kZW5zaXR5LmVudW0nO1xyXG5pbXBvcnQgeyBEaXZpZGVyVHlwZSB9IGZyb20gJy4uLy4uL2VudW1zL2RpdmlkZXItdHlwZS5lbnVtJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgVGltZXJUeXBlIH0gZnJvbSAnLi4vLi4vZW51bXMvdGltZXItdHlwZS5lbnVtJztcclxuaW1wb3J0IHsgU2lnbkluTW9kZSB9IGZyb20gJy4uLy4uL2VudW1zL3NpZ24taW4tbW9kZS5lbnVtJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTGFuZ3VhZ2VPcHRpb24ge1xyXG4gIGNvZGU6IHN0cmluZztcclxuICBuYW1lPzogc3RyaW5nO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NmYy1oZWFkZXInLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9oZWFkZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9oZWFkZXIuY29tcG9uZW50LnNjc3MnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBIZWFkZXJDb21wb25lbnQge1xyXG5cclxuICBASW5wdXQoKSB2aWV3TW9kZTogSGVhZGVyVmlld01vZGUgPSBIZWFkZXJWaWV3TW9kZS5kZWZhdWx0O1xyXG4gIEBJbnB1dCgpIGhhc01lbnUgPSB0cnVlO1xyXG4gIC8vIGxvZ29cclxuICBASW5wdXQoKSBoYXNMb2dvID0gdHJ1ZTtcclxuICBASW5wdXQoKSBsb2dvVXJsOiBzdHJpbmcgPSAnJzsgLy8gVVJMIHBhcmEgbG9nbyBleHRlcm5hIG91IGNhbWluaG8gcGFyYSBpbWFnZW0gbG9jYWxcclxuICBASW5wdXQoKSBsb2dvQWx0OiBzdHJpbmcgPSAnTG9nbyc7IC8vIFRleHRvIGFsdGVybmF0aXZvIHBhcmEgYSBpbWFnZW1cclxuICAvLyB0aXRsZSBhbmQgZGVzY3JpcHRpb25cclxuICBASW5wdXQoKSB0aXRsZSE6IHN0cmluZztcclxuICBASW5wdXQoKSBkZXNjcmlwdGlvbj86IHN0cmluZztcclxuICAvLyB0aW1lclxyXG4gIEBJbnB1dCgpIGhhc1RpbWVyID0gZmFsc2U7XHJcbiAgQElucHV0KCkgdGltZUxvZ291dCA9IDE4MDA7XHJcbiAgQElucHV0KCkgdGltZUNyaXRpY2FsID0gMzAwO1xyXG4gIC8vIGFjdGlvbiBiYXJcclxuICBASW5wdXQoKSBoYXNOb3RpZmljYXRpb25JY29uID0gdHJ1ZTtcclxuICBASW5wdXQoKSB1c2VyTmFtZSA9ICdFbnRyYXInO1xyXG4gIEBJbnB1dCgpIHNpZ25pbk1vZGU6IFNpZ25Jbk1vZGUgPSBTaWduSW5Nb2RlLmxvZ291dDtcclxuICBASW5wdXQoKSBoYXNEaXZpZGVySWNvbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGhhc0FjdGlvbkljb25zID0gZmFsc2U7XHJcbiAgLy8gTGFuZ3VhZ2UgU2VsZWN0b3JcclxuICBASW5wdXQoKSBoYXNMYW5ndWFnZVNlbGVjdG9yID0gdHJ1ZTtcclxuICBASW5wdXQoKSBsYW5ndWFnZU9wdGlvbnM6IExhbmd1YWdlT3B0aW9uW10gPSBbXTsgLy8gQXJyYXkgZGUgb3DDp8O1ZXMgZGUgaWRpb21hXHJcbiAgQElucHV0KCkgY3VycmVudExhbmd1YWdlQ29kZSA9ICcnOyAvLyBDw7NkaWdvIGRvIGlkaW9tYSBhdHVhbFxyXG4gIEBJbnB1dCgpIGhhc1RoZW1lVG9nZ2xlID0gdHJ1ZTtcclxuXHJcbiAgQE91dHB1dCgpIG1lbnVFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPjtcclxuICBAT3V0cHV0KCkgY3JpdGljYWxUaW1lRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD47XHJcbiAgQE91dHB1dCgpIHRpbWVPdXRFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPjtcclxuICBAT3V0cHV0KCkgdGltZUV2ZW50OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+O1xyXG4gIEBPdXRwdXQoKSBub3RpZmljYXRpb25JY29uRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD47XHJcbiAgQE91dHB1dCgpIHNpZ25pbkV2ZW50OiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+O1xyXG4gIEBPdXRwdXQoKSBsb2dvdXRFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPjtcclxuICBAT3V0cHV0KCkgdGhlbWVUb2dnbGVFdmVudDogRXZlbnRFbWl0dGVyPEhlYWRlclZpZXdNb2RlPiA9IG5ldyBFdmVudEVtaXR0ZXI8SGVhZGVyVmlld01vZGU+KCk7XHJcbiAgQE91dHB1dCgpIGxhbmd1YWdlQ2hhbmdlRXZlbnQ6IEV2ZW50RW1pdHRlcjxzdHJpbmc+ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIHZpZXdNb2RlQ2hhbmdlOiBFdmVudEVtaXR0ZXI8SGVhZGVyVmlld01vZGU+ID0gbmV3IEV2ZW50RW1pdHRlcjxIZWFkZXJWaWV3TW9kZT4oKTtcclxuXHJcblxyXG4gIHJlYWRvbmx5IGhlYWRlclZpZXdNb2RlcyA9IEhlYWRlclZpZXdNb2RlO1xyXG4gIHJlYWRvbmx5IGRpdmlkZXJNb2RlcyA9IERpdmlkZXJNb2RlO1xyXG4gIHJlYWRvbmx5IGRpdmlkZXJUeXBlcyA9IERpdmlkZXJUeXBlO1xyXG4gIHJlYWRvbmx5IGRpdmlkZXJEZW5zaXRpZXMgPSBEaXZpZGVyRGVuc2l0eTtcclxuICByZWFkb25seSBkaXZpZGVyQXhpcyA9IERpdmlkZXJBeGlzO1xyXG4gIHJlYWRvbmx5IHNpZ25pblR5cGVzID0gU2lnbkluVHlwZTtcclxuICByZWFkb25seSBzaWduaW5Nb2RlcyA9IFNpZ25Jbk1vZGU7XHJcbiAgcmVhZG9ubHkgYnV0dG9uVHlwZXMgPSBCdXR0b25UeXBlO1xyXG4gIHJlYWRvbmx5IHRpbWVyVHlwZXMgPSBUaW1lclR5cGU7XHJcblxyXG4gIGxhbmd1YWdlRHJvcGRvd25PcGVuOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByb3V0ZXI6IFJvdXRlcikge1xyXG4gICAgLy8gUmVjdXBlcmFyIHRlbWEgc2Fsdm8gcGFyYSBvIGhlYWRlciwgc2UgZXhpc3RpclxyXG4gICAgY29uc3Qgc2F2ZWRIZWFkZXJUaGVtZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdoZWFkZXJUaGVtZScpO1xyXG4gICAgaWYgKHNhdmVkSGVhZGVyVGhlbWUpIHtcclxuICAgICAgdGhpcy52aWV3TW9kZSA9IHNhdmVkSGVhZGVyVGhlbWUgYXMgSGVhZGVyVmlld01vZGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVNZW51KCk6IHZvaWQge1xyXG4gICAgdGhpcy5tZW51RXZlbnQuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgZ29Ub0hvbWUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5yb3V0ZXIudXJsICE9PSAnLycpIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvJ10pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGZpcnN0QW5kTGFzdE5hbWUoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IHNwbGl0ZWROYW1lID0gdGhpcy51c2VyTmFtZS50cmltKCkuc3BsaXQoJyAnKTtcclxuICAgIGlmIChzcGxpdGVkTmFtZS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgcmV0dXJuIHNwbGl0ZWROYW1lWzBdO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGAke3NwbGl0ZWROYW1lWzBdfSAke3NwbGl0ZWROYW1lW3NwbGl0ZWROYW1lLmxlbmd0aCAtIDFdfWA7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGVMYW5ndWFnZURyb3Bkb3duKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sYW5ndWFnZURyb3Bkb3duT3BlbiA9ICF0aGlzLmxhbmd1YWdlRHJvcGRvd25PcGVuO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0TGFuZ3VhZ2UobGFuZ0NvZGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5jdXJyZW50TGFuZ3VhZ2VDb2RlID0gbGFuZ0NvZGU7XHJcbiAgICB0aGlzLmxhbmd1YWdlRHJvcGRvd25PcGVuID0gZmFsc2U7XHJcbiAgICB0aGlzLmxhbmd1YWdlQ2hhbmdlRXZlbnQuZW1pdChsYW5nQ29kZSk7XHJcbiAgfVxyXG5cclxuICBnZXQgY3VycmVudExhbmd1YWdlRGlzcGxheSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmN1cnJlbnRMYW5ndWFnZUNvZGUgJiYgdGhpcy5sYW5ndWFnZU9wdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmN1cnJlbnRMYW5ndWFnZUNvZGUgPSB0aGlzLmxhbmd1YWdlT3B0aW9uc1swXS5jb2RlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJldG9ybmEgbyBkaXNwbGF5IG5hbWUgKHNlIGRpc3BvbsOtdmVsKSBvdSBvIGPDs2RpZ28gZG8gaWRpb21hXHJcbiAgICBjb25zdCBjdXJyZW50TGFuZyA9IHRoaXMubGFuZ3VhZ2VPcHRpb25zLmZpbmQobGFuZyA9PiBsYW5nLmNvZGUgPT09IHRoaXMuY3VycmVudExhbmd1YWdlQ29kZSk7XHJcbiAgICByZXR1cm4gY3VycmVudExhbmcgPyAoY3VycmVudExhbmcubmFtZSB8fCBjdXJyZW50TGFuZy5jb2RlKSA6IHRoaXMuY3VycmVudExhbmd1YWdlQ29kZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRvZ2dsZSBlbnRyZSBvcyBtb2RvcyBkZSB0ZW1hIGRvIGhlYWRlciAoY2xhcm8vZXNjdXJvKVxyXG4gICAqL1xyXG4gIHRvZ2dsZVRoZW1lKCk6IHZvaWQge1xyXG4gICAgLy8gVG9nZ2xlIGVudHJlIG9zIG1vZG9zIGRlZmF1bHQgZSBjb250cmFzdFxyXG4gICAgdGhpcy52aWV3TW9kZSA9IHRoaXMudmlld01vZGUgPT09IEhlYWRlclZpZXdNb2RlLmRlZmF1bHRcclxuICAgICAgPyBIZWFkZXJWaWV3TW9kZS5jb250cmFzdFxyXG4gICAgICA6IEhlYWRlclZpZXdNb2RlLmRlZmF1bHQ7XHJcblxyXG4gICAgLy8gRW1pdGlyIGV2ZW50b3MgcGFyYSBub3RpZmljYXIgY29tcG9uZW50ZXMgcGFpc1xyXG4gICAgdGhpcy52aWV3TW9kZUNoYW5nZS5lbWl0KHRoaXMudmlld01vZGUpO1xyXG4gICAgdGhpcy50aGVtZVRvZ2dsZUV2ZW50LmVtaXQodGhpcy52aWV3TW9kZSk7XHJcblxyXG4gICAgLy8gU2FsdmFyIHByZWZlcsOqbmNpYSBhcGVuYXMgcGFyYSBvIGhlYWRlclxyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2hlYWRlclRoZW1lJywgdGhpcy52aWV3TW9kZSk7XHJcbiAgfVxyXG59XHJcbiIsIjxoZWFkZXJcclxuICBjbGFzcz1cImNmYy1oZWFkZXJcIlxyXG4gIFtuZ0NsYXNzXT1cIntcclxuICAgICdjZmMtaGVhZGVyLS1saWdodCc6IHZpZXdNb2RlID09PSBoZWFkZXJWaWV3TW9kZXMuZGVmYXVsdCxcclxuICAgICdjZmMtaGVhZGVyLS1kYXJrJzogdmlld01vZGUgPT09IGhlYWRlclZpZXdNb2Rlcy5jb250cmFzdFxyXG4gIH1cIlxyXG4gIGZ4TGF5b3V0PVwicm93XCJcclxuICBmeExheW91dEFsaWduPVwic3BhY2UtYmV0d2VlbiBjZW50ZXJcIj5cclxuICA8ZGl2XHJcbiAgICBmeExheW91dD1cInJvd1wiXHJcbiAgICBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiXHJcbiAgICBmeExheW91dEdhcD1cIjFyZW1cIj5cclxuXHJcbiAgICA8IS0tIE1FTlUgLS0+XHJcbiAgICA8Y2ZjLWJ1dHRvblxyXG4gICAgICAqbmdJZj1cImhhc01lbnVcIlxyXG4gICAgICBbaWNvbl09XCInYmFycydcIlxyXG4gICAgICBbdHlwZV09XCJidXR0b25UeXBlcy50ZXJ0aWFyeVwiXHJcbiAgICAgIFtjaXJjbGVdPVwidHJ1ZVwiXHJcbiAgICAgIFtpbnZlcnRlZF09XCJ2aWV3TW9kZSA9PT0gaGVhZGVyVmlld01vZGVzLmNvbnRyYXN0XCJcclxuICAgICAgYXJpYS1sYWJlbD1cIm1lbnVcIlxyXG4gICAgICBkYXRhLXRvZ2dsZT1cIm1lbnVcIlxyXG4gICAgICBkYXRhLXRhcmdldD1cIiNtZW51LWFzaWRlXCJcclxuICAgICAgaXMtcHVzaD1cInRydWVcIlxyXG4gICAgICBpZD1cInB1c2hcIlxyXG4gICAgICBbYXR0ci5zaG93LW1lbnVdPVwiJ3RydWUnXCJcclxuICAgICAgKGNsaWNrKT1cInRvZ2dsZU1lbnUoKVwiPlxyXG4gICAgPC9jZmMtYnV0dG9uPlxyXG5cclxuICAgIDwhLS0gTE9HTyAtIFNlbSBtb2RpZmljYcOnw6NvIGJhc2VhZGEgbm8gdGVtYSAtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJoYXNMb2dvXCIgY2xhc3M9XCJjZmMtaGVhZGVyX19sb2dvLWNvbnRhaW5lclwiIChjbGljayk9XCJnb1RvSG9tZSgpXCI+XHJcbiAgICAgIDxpbWdcclxuICAgICAgICBbc3JjXT1cImxvZ29VcmxcIlxyXG4gICAgICAgIFthbHRdPVwibG9nb0FsdFwiXHJcbiAgICAgICAgY2xhc3M9XCJjZmMtaGVhZGVyX19sb2dvXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7XHJcbiAgICAgICAgICAnY2ZjLWhlYWRlcl9fbG9nby0tY2xpY2thYmxlJzogcm91dGVyLnVybCAhPT0gJy8nXHJcbiAgICAgICAgfVwiPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBUSVRMRSBBTkQgREVTQ1JJUFRJT04gLS0+XHJcbiAgICA8ZGl2XHJcbiAgICAgIGZ4TGF5b3V0PVwiY29sdW1uXCJcclxuICAgICAgZnhMYXlvdXRBbGlnbj1cImNlbnRlciBzdGFydFwiPlxyXG4gICAgICA8aDRcclxuICAgICAgICBjbGFzcz1cImNmYy1oZWFkZXJfX3RpdGxlXCI+XHJcbiAgICAgICAge3sgdGl0bGUgfX1cclxuICAgICAgPC9oND5cclxuICAgICAgPHBcclxuICAgICAgICAqbmdJZj1cImRlc2NyaXB0aW9uXCJcclxuICAgICAgICBjbGFzcz1cImNmYy1oZWFkZXJfX2Rlc2NyaXB0aW9uXCI+XHJcbiAgICAgICAge3sgZGVzY3JpcHRpb24gfX1cclxuICAgICAgPC9wPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gQUNUSU9OIEJBUiAtLT5cclxuICA8ZGl2XHJcbiAgICBmeExheW91dD1cInJvd1wiXHJcbiAgICBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiXHJcbiAgICBmeExheW91dEdhcD1cIjAuNXJlbVwiPlxyXG5cclxuICAgIDwhLS0gRGl2aWRlciBhbnRlcyBkbyBUaW1lciAtLT5cclxuICAgIDxjZmMtZGl2aWRlclxyXG4gICAgICAqbmdJZj1cImhhc1RpbWVyXCJcclxuICAgICAgW21vZGVdPVwiZGl2aWRlck1vZGVzLmxpbmVcIlxyXG4gICAgICBbdHlwZV09XCJ2aWV3TW9kZSA9PT0gaGVhZGVyVmlld01vZGVzLmRlZmF1bHQgPyBkaXZpZGVyVHlwZXMucHJpbWFyeSA6IGRpdmlkZXJUeXBlcy5zZWNvbmRhcnlcIlxyXG4gICAgICBbZGVuc2l0eV09XCJkaXZpZGVyRGVuc2l0aWVzLmxhcmdlXCJcclxuICAgICAgW2F4aXNdPVwiZGl2aWRlckF4aXMudmVydGljYWxcIlxyXG4gICAgPjwvY2ZjLWRpdmlkZXI+XHJcblxyXG4gICAgPGNmYy10aW1lclxyXG4gICAgICAqbmdJZj1cImhhc1RpbWVyXCJcclxuICAgICAgW3R5cGVdPVwidmlld01vZGUgPT09IGhlYWRlclZpZXdNb2Rlcy5kZWZhdWx0XHJcbiAgICAgICAgPyB0aW1lclR5cGVzLnByaW1hcnlcclxuICAgICAgICA6IHRpbWVyVHlwZXMuc2Vjb25kYXJ5XHJcbiAgICAgIFwiXHJcbiAgICAgIFtpbml0aWFsVGltZV09XCJ0aW1lTG9nb3V0XCJcclxuICAgICAgW2NyaXRpY2FsVGltZV09XCJ0aW1lQ3JpdGljYWxcIlxyXG4gICAgICBbaXNHbG9iYWxdPVwidHJ1ZVwiXHJcbiAgICAgICh0aW1lQ3JpdGljYWxFdmVudCk9XCJjcml0aWNhbFRpbWVFdmVudC5lbWl0KClcIlxyXG4gICAgICAodGltZU91dEV2ZW50KT1cInRpbWVPdXRFdmVudC5lbWl0KClcIlxyXG4gICAgICAodGltZUV2ZW50KT1cInRpbWVFdmVudC5lbWl0KClcIlxyXG4gICAgPjwvY2ZjLXRpbWVyPlxyXG5cclxuICAgIDwhLS0gRGl2aWRlciBkZXBvaXMgZG8gVGltZXIgLS0+XHJcbiAgICA8Y2ZjLWRpdmlkZXJcclxuICAgICAgKm5nSWY9XCJoYXNUaW1lclwiXHJcbiAgICAgIFttb2RlXT1cImRpdmlkZXJNb2Rlcy5saW5lXCJcclxuICAgICAgW3R5cGVdPVwidmlld01vZGUgPT09IGhlYWRlclZpZXdNb2Rlcy5kZWZhdWx0ID8gZGl2aWRlclR5cGVzLnByaW1hcnkgOiBkaXZpZGVyVHlwZXMuc2Vjb25kYXJ5XCJcclxuICAgICAgW2RlbnNpdHldPVwiZGl2aWRlckRlbnNpdGllcy5sYXJnZVwiXHJcbiAgICAgIFtheGlzXT1cImRpdmlkZXJBeGlzLnZlcnRpY2FsXCJcclxuICAgID48L2NmYy1kaXZpZGVyPlxyXG5cclxuICAgIDxjZmMtYnV0dG9uXHJcbiAgICAgICpuZ0lmPVwiaGFzTm90aWZpY2F0aW9uSWNvblwiXHJcbiAgICAgIHN0eWxlPVwibWluLXdpZHRoOiAyLjJyZW07XCJcclxuICAgICAgW2ljb25dPVwiJ2JlbGwnXCJcclxuICAgICAgW3R5cGVdPVwiYnV0dG9uVHlwZXMudGVydGlhcnlcIlxyXG4gICAgICBbaW52ZXJ0ZWRdPVwidmlld01vZGUgPT09IGhlYWRlclZpZXdNb2Rlcy5jb250cmFzdFwiXHJcbiAgICAgIFtjaXJjbGVdPVwidHJ1ZVwiXHJcbiAgICAgIChvbkNsaWNrKT1cIm5vdGlmaWNhdGlvbkljb25FdmVudC5lbWl0KClcIlxyXG4gICAgICBkYXRhLXRvZ2dsZT1cIm1lbnVcIlxyXG4gICAgICBkYXRhLXRhcmdldD1cIiNwdXNoXCJcclxuICAgID48L2NmYy1idXR0b24+XHJcblxyXG4gICAgPGNmYy1kaXZpZGVyXHJcbiAgICAgICpuZ0lmPVwiIWhhc05vdGlmaWNhdGlvbkljb24gJiYgaGFzRGl2aWRlckljb25cIlxyXG4gICAgICBbbW9kZV09XCJkaXZpZGVyTW9kZXMubGluZVwiXHJcbiAgICAgIFt0eXBlXT1cInZpZXdNb2RlID09PSBoZWFkZXJWaWV3TW9kZXMuZGVmYXVsdFxyXG4gICAgICAgID8gZGl2aWRlclR5cGVzLnByaW1hcnlcclxuICAgICAgICA6IGRpdmlkZXJUeXBlcy5zZWNvbmRhcnlcclxuICAgICAgXCJcclxuICAgICAgW2RlbnNpdHldPVwiZGl2aWRlckRlbnNpdGllcy5sYXJnZVwiXHJcbiAgICAgIFtheGlzXT1cImRpdmlkZXJBeGlzLnZlcnRpY2FsXCJcclxuICAgID48L2NmYy1kaXZpZGVyPlxyXG5cclxuICAgIDwhLS0gVGhlbWUgVG9nZ2xlIEJ1dHRvbiAtLT5cclxuICAgIDxjZmMtYnV0dG9uXHJcbiAgICAgICpuZ0lmPVwiaGFzVGhlbWVUb2dnbGVcIlxyXG4gICAgICBbdHlwZV09XCJidXR0b25UeXBlcy50ZXJ0aWFyeVwiXHJcbiAgICAgIFtjaXJjbGVdPVwidHJ1ZVwiXHJcbiAgICAgIFtpbnZlcnRlZF09XCJ2aWV3TW9kZSA9PT0gaGVhZGVyVmlld01vZGVzLmNvbnRyYXN0XCJcclxuICAgICAgW2ljb25dPVwidmlld01vZGUgPT09IGhlYWRlclZpZXdNb2Rlcy5jb250cmFzdCA/ICdzdW4nIDogJ21vb24nXCJcclxuICAgICAgKG9uQ2xpY2spPVwidG9nZ2xlVGhlbWUoKVwiXHJcbiAgICAgIGFyaWEtbGFiZWw9XCJBbHRlcm5hciB0ZW1hXCI+XHJcbiAgICA8L2NmYy1idXR0b24+XHJcblxyXG4gICAgPCEtLSBMYW5ndWFnZSBTZWxlY3RvciAtLT5cclxuICAgIDxkaXYgKm5nSWY9XCJoYXNMYW5ndWFnZVNlbGVjdG9yICYmIGxhbmd1YWdlT3B0aW9ucy5sZW5ndGggPiAwXCIgY2xhc3M9XCJjZmMtaGVhZGVyX19sYW5ndWFnZS1zZWxlY3RvclwiPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiY2ZjLWhlYWRlcl9fbGFuZ3VhZ2UtYnV0dG9uXCJcclxuICAgICAgICBbbmdDbGFzc109XCJ7J2NmYy1oZWFkZXJfX2xhbmd1YWdlLWJ1dHRvbi0tZGFyayc6IHZpZXdNb2RlID09PSBoZWFkZXJWaWV3TW9kZXMuY29udHJhc3R9XCJcclxuICAgICAgICAoY2xpY2spPVwidG9nZ2xlTGFuZ3VhZ2VEcm9wZG93bigpXCI+XHJcbiAgICAgICAgPHNwYW4+e3sgY3VycmVudExhbmd1YWdlRGlzcGxheSB9fTwvc3Bhbj5cclxuICAgICAgICA8aSBjbGFzcz1cImZhcyBmYS1jaGV2cm9uLWRvd25cIj48L2k+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8dWwgKm5nSWY9XCJsYW5ndWFnZURyb3Bkb3duT3BlblwiIGNsYXNzPVwiY2ZjLWhlYWRlcl9fbGFuZ3VhZ2UtZHJvcGRvd25cIj5cclxuICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGxhbmcgb2YgbGFuZ3VhZ2VPcHRpb25zXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdExhbmd1YWdlKGxhbmcuY29kZSlcIlxyXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImxhbmcuY29kZSA9PT0gY3VycmVudExhbmd1YWdlQ29kZVwiPlxyXG4gICAgICAgICAge3sgbGFuZy5uYW1lIHx8IGxhbmcuY29kZSB9fVxyXG4gICAgICAgIDwvbGk+XHJcbiAgICAgIDwvdWw+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxuZy1jb250ZW50ICpuZ0lmPVwiaGFzQWN0aW9uSWNvbnNcIiBzZWxlY3Q9XCJbYWN0aW9uSWNvbnNdXCI+PC9uZy1jb250ZW50PlxyXG4gICAgPGNmYy1zaWduLWluXHJcbiAgICAgIGNsYXNzPVwiY2ZjLWhlYWRlcl9fc2lnbmluXCJcclxuICAgICAgW2xhYmVsXT1cImZpcnN0QW5kTGFzdE5hbWVcIlxyXG4gICAgICBbdHlwZV09XCJzaWduaW5UeXBlcy5zZWNvbmRhcnlcIlxyXG4gICAgICBbbW9kZV09XCJzaWduaW5Nb2RlXCJcclxuICAgICAgKG9uQ2xpY2spPVwic2lnbmluRXZlbnQuZW1pdCgpXCJcclxuICAgICAgKG9uTG9nb3V0KT1cImxvZ291dEV2ZW50LmVtaXQoKVwiXHJcbiAgICA+PC9jZmMtc2lnbi1pbj5cclxuICA8L2Rpdj5cclxuPC9oZWFkZXI+XHJcblxyXG48ZGl2IGNsYXNzPVwiY2ZjLWhlYWRlcl9fc3BhY2VyXCI+PC9kaXY+XHJcbiJdfQ==