UNPKG

cfc-ds

Version:

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

202 lines 64.6 kB
import { Component, Input, Output, EventEmitter } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "../../services/cookie-bar.service"; import * as i2 from "@angular/common"; export class CookieBarComponent { cookieBarService; set config(value) { if (value) { this.cookieBarService.setConfig(value); } } cookieSettingsChange = new EventEmitter(); acceptCookies = new EventEmitter(); cookieConfig; isOpen = false; expandedGroups = {}; constructor(cookieBarService) { this.cookieBarService = cookieBarService; } ngOnInit() { // Inscreve para mudanças na configuração this.cookieBarService.getConfig(); this.cookieConfig = this.cookieBarService.getConfig(); // Inscreve para mudanças no estado aberto/fechado this.cookieBarService.getIsOpen().subscribe(isOpen => { this.isOpen = isOpen; }); // Inscreve para mudanças no output this.cookieBarService.getCookieOutput().subscribe(output => { if (output) { this.cookieSettingsChange.emit(output); } }); } get acceptButtonLabel() { return this.cookieConfig?.acceptButton || 'Aceitar'; } get secondaryButtonLabel() { if (this.cookieConfig?.allOptOut) { return this.cookieConfig?.optOutButton || 'Definir Cookies'; } return this.cookieConfig?.optInButton || 'Ver Política de Cookies'; } get lastUpdateLabel() { return this.cookieConfig?.lastUpdateLabel || 'Última atualização'; } get cookieGroupsLabel() { return this.cookieConfig?.cookieGroupsLabel || 'Classes de cookies'; } get selectAllLabel() { return this.isSelectAllChecked() ? (this.cookieConfig?.selectAllLabel || 'Selecionar tudo') : (this.cookieConfig?.unselectAllLabel || 'Desselecionar tudo'); } getSelectGroupLabel(group) { return this.isGroupChecked(group) ? (this.cookieConfig?.selectAllGroupLabel || 'Selecionar toda classe') : (this.cookieConfig?.unselectAllGroupLabel || 'Desselecionar toda classe'); } get onLabel() { return this.cookieConfig?.onLabel || 'Ligado'; } get offLabel() { return this.cookieConfig?.offLabel || 'Desligado'; } get alwaysActiveLabel() { return this.cookieConfig?.alwaysActiveLabel || 'Sempre ativo'; } get cookieNameLabel() { return this.cookieConfig?.cookieNameLabel || 'Cookies'; } get expiresLabel() { return this.cookieConfig?.expiresLabel || 'Vencimento'; } get domainLabel() { return this.cookieConfig?.domainLabel || 'Domínio'; } get enterpriseLabel() { return this.cookieConfig?.enterpriseLabel || 'Empresa'; } get purposeLabel() { return this.cookieConfig?.purposeLabel || 'Finalidade'; } get descriptionLabel() { return this.cookieConfig?.descriptionLabel || 'Descrição'; } toggleCookieBar() { if (this.isOpen) { this.cookieBarService.closeCookieBar(); } else { this.cookieBarService.openCookieBar(); } } toggleGroup(groupId) { this.expandedGroups[groupId] = !this.expandedGroups[groupId]; } isGroupExpanded(groupId) { return this.expandedGroups[groupId] === true; } onSelectAllChange(event) { this.cookieBarService.updateSelectAll(event.target.checked); } onGroupSelectionChange(groupId, event) { this.cookieBarService.updateGroupSelection(groupId, event.target.checked); } onCookieSelectionChange(groupId, cookieId, event) { this.cookieBarService.updateCookieSelection(groupId, cookieId, event.target.checked); } isSelectAllChecked() { return this.cookieConfig?.selectAll === true; } isSelectAllIndeterminate() { if (!this.cookieConfig) return false; const optOutGroups = this.cookieConfig.cookieGroups.filter(g => g.groupOptOut); if (optOutGroups.length === 0) return false; const selectedGroups = optOutGroups.filter(g => g.groupSelected); // Verifica se todos os grupos estão selecionados if (selectedGroups.length === optOutGroups.length) { // Verifica se algum grupo está parcialmente selecionado const hasPartiallySelectedGroup = optOutGroups.some(group => this.isGroupIndeterminate(group)); return hasPartiallySelectedGroup; } // Se alguns grupos estão selecionados, mas não todos return selectedGroups.length > 0; } isGroupChecked(group) { return group.groupSelected === true; } isGroupIndeterminate(group) { if (!group.groupSelected) return false; const optOutCookies = group.cookieList.filter(c => c.cookieOptOut); if (optOutCookies.length === 0) return false; const selectedCookies = optOutCookies.filter(c => c.cookieSelected); return selectedCookies.length > 0 && selectedCookies.length < optOutCookies.length; } isCookieOptOut(cookie) { return cookie.cookieOptOut; } isGroupOptOut(group) { return group.groupOptOut; } accept() { const output = { selectAll: this.getSelectAllState(), cookieGroups: this.cookieConfig.cookieGroups.map(group => ({ groupId: group.groupId, groupSelected: this.getGroupState(group), cookieList: group.cookieList.map(cookie => ({ cookieId: cookie.cookieId, cookieSelected: cookie.cookieSelected })) })) }; this.cookieBarService.accept(); this.acceptCookies.emit(output); } openDetailedView() { this.cookieBarService.openCookieBar(); } getSelectAllState() { if (this.isSelectAllIndeterminate()) { return 'indeterminated'; } return this.isSelectAllChecked(); } getGroupState(group) { if (this.isGroupIndeterminate(group)) { return 'indeterminated'; } return this.isGroupChecked(group); } getGroupCookieCount(group) { return group.cookieList.length; } getSelectedCookieCount(group) { return group.cookieList.filter(cookie => cookie.cookieSelected).length; } getTotalCookieCount() { return this.cookieConfig?.cookieGroups.reduce((count, group) => count + group.cookieList.length, 0) || 0; } getTotalSelectedCookieCount() { return this.cookieConfig?.cookieGroups.reduce((count, group) => count + group.cookieList.filter(cookie => cookie.cookieSelected).length, 0) || 0; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CookieBarComponent, deps: [{ token: i1.CookieBarService }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CookieBarComponent, selector: "cfc-cookie-bar", inputs: { config: "config" }, outputs: { cookieSettingsChange: "cookieSettingsChange", acceptCookies: "acceptCookies" }, ngImport: i0, template: "<!-- Barra de cookie minimizada -->\r\n<div class=\"cookie-bar\" *ngIf=\"cookieConfig && !isOpen\">\r\n <div class=\"cookie-bar__content\">\r\n <p class=\"cookie-bar__text\">{{ cookieConfig.infoText }}</p>\r\n </div>\r\n <div class=\"cookie-bar__actions\">\r\n <button class=\"cookie-bar__button cookie-bar__button--secondary\" (click)=\"openDetailedView()\">\r\n {{ secondaryButtonLabel }}\r\n </button>\r\n <button class=\"cookie-bar__button cookie-bar__button--primary\" (click)=\"accept()\">\r\n {{ acceptButtonLabel }}\r\n </button>\r\n </div>\r\n </div>\r\n \r\n <!-- Barra de cookie expandida -->\r\n <div class=\"cookie-bar-expanded\" *ngIf=\"cookieConfig && isOpen\">\r\n <div class=\"cookie-bar-expanded__header\">\r\n <h1 class=\"cookie-bar-expanded__title\">{{ cookieConfig.mainTitle }}</h1>\r\n <button \r\n class=\"cookie-bar-expanded__close\" \r\n (click)=\"toggleCookieBar()\" \r\n [attr.aria-label]=\"cookieConfig.closeLabel || 'fechar'\">\r\n <span class=\"cookie-bar-expanded__close-icon\">\u00D7</span>\r\n </button>\r\n </div>\r\n \r\n <div class=\"cookie-bar-expanded__intro\">\r\n <div class=\"cookie-bar-expanded__last-update\" *ngIf=\"cookieConfig.lastUpdate\">\r\n <span>{{ lastUpdateLabel }}: {{ cookieConfig.lastUpdate }}</span>\r\n </div>\r\n <div class=\"cookie-bar-expanded__description\">\r\n <p>{{ cookieConfig.entryText }}</p>\r\n </div>\r\n </div>\r\n \r\n <div class=\"cookie-bar-expanded__main\">\r\n <div class=\"cookie-bar-expanded__select-all\">\r\n <h2>{{ cookieGroupsLabel }}</h2>\r\n <div class=\"cookie-bar-expanded__checkbox\">\r\n <input \r\n type=\"checkbox\" \r\n id=\"select-all\" \r\n [checked]=\"isSelectAllChecked()\"\r\n [indeterminate]=\"isSelectAllIndeterminate()\" \r\n (change)=\"onSelectAllChange($event)\"\r\n [disabled]=\"!cookieConfig.allOptOut\">\r\n <label for=\"select-all\">{{ selectAllLabel }} ({{ getTotalSelectedCookieCount() }}/{{ getTotalCookieCount() }})</label>\r\n </div>\r\n <p *ngIf=\"cookieConfig.allAlertMessage && !isSelectAllChecked()\" class=\"cookie-bar-expanded__alert\">\r\n {{ cookieConfig.allAlertMessage }}\r\n </p>\r\n </div>\r\n \r\n <div class=\"cookie-bar-expanded__groups\">\r\n <div class=\"cookie-group\" *ngFor=\"let group of cookieConfig.cookieGroups\">\r\n <div class=\"cookie-group__header\" (click)=\"toggleGroup(group.groupId)\">\r\n <h3 class=\"cookie-group__name\">\r\n {{ group.groupName }} ({{ getGroupCookieCount(group) }})\r\n </h3>\r\n <div class=\"cookie-group__actions\">\r\n <div *ngIf=\"isGroupOptOut(group); else alwaysActive\" class=\"cookie-group__selection\">\r\n <input \r\n type=\"checkbox\" \r\n [id]=\"'group-' + group.groupId\" \r\n [checked]=\"isGroupChecked(group)\" \r\n [indeterminate]=\"isGroupIndeterminate(group)\"\r\n (change)=\"onGroupSelectionChange(group.groupId, $event)\"\r\n [disabled]=\"!group.groupOptOut\">\r\n <label [for]=\"'group-' + group.groupId\">\r\n {{ getSelectGroupLabel(group) }}\r\n </label>\r\n </div>\r\n <ng-template #alwaysActive>\r\n <span class=\"cookie-group__always-active\">{{ alwaysActiveLabel }}</span>\r\n </ng-template>\r\n <button class=\"cookie-group__toggle\">\r\n <span *ngIf=\"!isGroupExpanded(group.groupId)\">&#9660;</span>\r\n <span *ngIf=\"isGroupExpanded(group.groupId)\">&#9650;</span>\r\n </button>\r\n </div>\r\n </div>\r\n \r\n <div class=\"cookie-group__description\">\r\n {{ group.groupText }}\r\n </div>\r\n \r\n <p *ngIf=\"group.groupAlertMessage && !isGroupChecked(group)\" class=\"cookie-group__alert\">\r\n {{ group.groupAlertMessage }}\r\n </p>\r\n \r\n <div class=\"cookie-group__cookies\" *ngIf=\"isGroupExpanded(group.groupId)\">\r\n <div class=\"cookie\" *ngFor=\"let cookie of group.cookieList\">\r\n <div class=\"cookie__header\">\r\n <div class=\"cookie__info\">\r\n <h4>{{ cookie.cookieName }}</h4>\r\n <div *ngIf=\"isCookieOptOut(cookie) && group.groupOptOut\" class=\"cookie__toggle\">\r\n <div class=\"cookie__switch\">\r\n <input \r\n type=\"checkbox\" \r\n [id]=\"'cookie-' + cookie.cookieId\" \r\n [checked]=\"cookie.cookieSelected\"\r\n (change)=\"onCookieSelectionChange(group.groupId, cookie.cookieId, $event)\">\r\n <label [for]=\"'cookie-' + cookie.cookieId\">\r\n {{ cookie.cookieSelected ? onLabel : offLabel }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <p *ngIf=\"cookie.alertMessage && !cookie.cookieSelected\" class=\"cookie__alert\">\r\n {{ cookie.alertMessage }}\r\n </p>\r\n \r\n <div class=\"cookie__details\">\r\n <div class=\"cookie__detail\">\r\n <strong>{{ cookieNameLabel }}:</strong> {{ cookie.cookieName }}\r\n </div>\r\n <div class=\"cookie__detail\">\r\n <strong>{{ expiresLabel }}:</strong> {{ cookie.expires }}\r\n </div>\r\n <div class=\"cookie__detail\">\r\n <strong>{{ domainLabel }}:</strong> {{ cookie.domain }}\r\n </div>\r\n <div class=\"cookie__detail\">\r\n <strong>{{ enterpriseLabel }}:</strong> {{ cookie.entreprise }}\r\n </div>\r\n <div class=\"cookie__detail\">\r\n <strong>{{ purposeLabel }}:</strong> {{ cookie.purpose }}\r\n </div>\r\n <div class=\"cookie__detail\">\r\n <strong>{{ descriptionLabel }}:</strong> {{ cookie.description }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Notas adicionais se existirem -->\r\n <div class=\"cookie-bar-expanded__notes\" *ngIf=\"cookieConfig.noteTitle && cookieConfig.noteList?.length\">\r\n <h3>{{ cookieConfig.noteTitle }}</h3>\r\n <div class=\"cookie-bar-expanded__note-item\" *ngFor=\"let note of cookieConfig.noteList\">\r\n <h4>{{ note.question }}</h4>\r\n <p>{{ note.answer }}</p>\r\n </div>\r\n </div>\r\n \r\n <!-- Links externos se existirem -->\r\n <div class=\"cookie-bar-expanded__links\" *ngIf=\"cookieConfig.links?.length\">\r\n <div class=\"cookie-bar-expanded__link\" *ngFor=\"let link of cookieConfig.links\">\r\n <a [href]=\"link.url\" target=\"_blank\" rel=\"noopener noreferrer\">{{ link.name }}</a>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"cookie-bar-expanded__footer\">\r\n <div class=\"cookie-bar-expanded__actions\">\r\n <button class=\"cookie-bar-expanded__button cookie-bar-expanded__button--primary\" (click)=\"accept()\">\r\n {{ acceptButtonLabel }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>", styles: [".cookie-bar{position:fixed;bottom:0;left:0;width:100%;background-color:#fff;border-top:1px solid #ddd;padding:16px;display:flex;justify-content:space-between;align-items:center;z-index:1000;box-shadow:0 -2px 10px #0000001a}.cookie-bar__content{flex:1;padding-right:24px}.cookie-bar__text{margin:0;color:#333;font-size:14px}.cookie-bar__actions{display:flex;gap:16px}.cookie-bar__button{padding:8px 16px;border-radius:4px;border:none;cursor:pointer;font-weight:500;transition:all .3s ease}.cookie-bar__button--primary{background-color:#1351b4;color:#fff}.cookie-bar__button--primary:hover{background-color:#0e3c86}.cookie-bar__button--secondary{background-color:transparent;color:#1351b4;border:1px solid #1351B4}.cookie-bar__button--secondary:hover{background-color:#1351b41a}.cookie-bar-expanded{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#fff;z-index:1001;overflow-y:auto;display:flex;flex-direction:column}.cookie-bar-expanded__header{padding:16px;border-bottom:1px solid #ddd;display:flex;justify-content:space-between;align-items:center;position:sticky;top:0;background-color:#fff;z-index:2}.cookie-bar-expanded__title{margin:0;font-size:24px;color:#333}.cookie-bar-expanded__close{background:none;border:none;cursor:pointer;font-size:24px;color:#333;padding:4px 8px}.cookie-bar-expanded__close:hover{color:#1351b4}.cookie-bar-expanded__intro{padding:16px;border-bottom:1px solid #ddd}.cookie-bar-expanded__last-update{font-size:12px;color:#666;margin-bottom:8px}.cookie-bar-expanded__description{font-size:14px;line-height:1.5;color:#333}.cookie-bar-expanded__main{flex:1;padding:16px}.cookie-bar-expanded__select-all{margin-bottom:24px}.cookie-bar-expanded__checkbox{display:flex;align-items:center;gap:8px;margin-top:8px}.cookie-bar-expanded__checkbox input,.cookie-bar-expanded__checkbox label{cursor:pointer}.cookie-bar-expanded__alert{margin-top:8px;padding:8px;background-color:#ffcd0733;color:#6d5700;border-left:4px solid #FFCD07;font-size:14px}.cookie-bar-expanded__groups{margin-bottom:24px}.cookie-bar-expanded__notes{margin-bottom:24px;padding-top:16px;border-top:1px solid #ddd}.cookie-bar-expanded__note-item{margin-bottom:16px}.cookie-bar-expanded__note-item h4{margin-bottom:8px}.cookie-bar-expanded__links{margin-bottom:24px;padding-top:16px;border-top:1px solid #ddd}.cookie-bar-expanded__link{margin-bottom:8px}.cookie-bar-expanded__link a{color:#1351b4;text-decoration:none}.cookie-bar-expanded__link a:hover{text-decoration:underline}.cookie-bar-expanded__footer{padding:16px;border-top:1px solid #ddd;display:flex;justify-content:flex-end;position:sticky;bottom:0;background-color:#fff;z-index:2}.cookie-bar-expanded__actions{display:flex;gap:16px}.cookie-bar-expanded__button{padding:12px 24px;border-radius:4px;border:none;cursor:pointer;font-weight:500;transition:all .3s ease}.cookie-bar-expanded__button--primary{background-color:#1351b4;color:#fff}.cookie-bar-expanded__button--primary:hover{background-color:#0e3c86}.cookie-group{margin-bottom:16px;border:1px solid #ddd;border-radius:4px;overflow:hidden}.cookie-group__header{padding:12px 16px;background-color:#f8f8f8;display:flex;justify-content:space-between;align-items:center;cursor:pointer}.cookie-group__header:hover{background-color:#f0f0f0}.cookie-group__name{margin:0;font-size:16px;color:#333}.cookie-group__actions{display:flex;align-items:center;gap:16px}.cookie-group__selection{display:flex;align-items:center;gap:8px}.cookie-group__always-active{color:#168821;font-weight:500}.cookie-group__toggle{background:none;border:none;cursor:pointer;color:#333;font-size:12px;padding:4px}.cookie-group__description{padding:12px 16px;font-size:14px;color:#333;border-bottom:1px solid #ddd}.cookie-group__alert{margin:0;padding:8px 16px;background-color:#ffcd0733;color:#6d5700;border-left:4px solid #FFCD07;font-size:14px}.cookie-group__cookies{padding:0 16px}.cookie{padding:16px 0;border-bottom:1px solid #eee}.cookie:last-child{border-bottom:none}.cookie__header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.cookie__info{display:flex;justify-content:space-between;align-items:center;width:100%}.cookie__info h4{margin:0;font-size:14px;color:#333}.cookie__toggle{display:flex;align-items:center}.cookie__switch{position:relative;display:inline-block;width:46px;height:24px}.cookie__switch input{opacity:0;width:0;height:0}.cookie__switch input:checked+label{background-color:#1351b4}.cookie__switch input:checked+label:before{transform:translate(22px)}.cookie__switch label{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.3s;border-radius:24px}.cookie__switch label:before{position:absolute;content:\"\";height:20px;width:20px;left:2px;bottom:2px;background-color:#fff;transition:.3s;border-radius:50%}.cookie__alert{margin:8px 0;padding:8px;background-color:#ffcd0733;color:#6d5700;border-left:4px solid #FFCD07;font-size:14px}.cookie__details{font-size:14px;color:#333}.cookie__detail{margin-bottom:8px}.cookie__detail:last-child{margin-bottom:0}.cookie__detail strong{font-weight:600}@media (max-width: 768px){.cookie-bar{flex-direction:column}.cookie-bar__content{padding-right:0;margin-bottom:16px}.cookie-bar__actions{width:100%;justify-content:space-between}.cookie-bar__button{flex:1;text-align:center}.cookie-group__header{flex-direction:column;align-items:flex-start}.cookie-group__actions{margin-top:12px;width:100%;justify-content:space-between}.cookie__info{flex-direction:column;align-items:flex-start}.cookie__toggle{margin-top:8px}}\n"], dependencies: [{ 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: CookieBarComponent, decorators: [{ type: Component, args: [{ selector: 'cfc-cookie-bar', template: "<!-- Barra de cookie minimizada -->\r\n<div class=\"cookie-bar\" *ngIf=\"cookieConfig && !isOpen\">\r\n <div class=\"cookie-bar__content\">\r\n <p class=\"cookie-bar__text\">{{ cookieConfig.infoText }}</p>\r\n </div>\r\n <div class=\"cookie-bar__actions\">\r\n <button class=\"cookie-bar__button cookie-bar__button--secondary\" (click)=\"openDetailedView()\">\r\n {{ secondaryButtonLabel }}\r\n </button>\r\n <button class=\"cookie-bar__button cookie-bar__button--primary\" (click)=\"accept()\">\r\n {{ acceptButtonLabel }}\r\n </button>\r\n </div>\r\n </div>\r\n \r\n <!-- Barra de cookie expandida -->\r\n <div class=\"cookie-bar-expanded\" *ngIf=\"cookieConfig && isOpen\">\r\n <div class=\"cookie-bar-expanded__header\">\r\n <h1 class=\"cookie-bar-expanded__title\">{{ cookieConfig.mainTitle }}</h1>\r\n <button \r\n class=\"cookie-bar-expanded__close\" \r\n (click)=\"toggleCookieBar()\" \r\n [attr.aria-label]=\"cookieConfig.closeLabel || 'fechar'\">\r\n <span class=\"cookie-bar-expanded__close-icon\">\u00D7</span>\r\n </button>\r\n </div>\r\n \r\n <div class=\"cookie-bar-expanded__intro\">\r\n <div class=\"cookie-bar-expanded__last-update\" *ngIf=\"cookieConfig.lastUpdate\">\r\n <span>{{ lastUpdateLabel }}: {{ cookieConfig.lastUpdate }}</span>\r\n </div>\r\n <div class=\"cookie-bar-expanded__description\">\r\n <p>{{ cookieConfig.entryText }}</p>\r\n </div>\r\n </div>\r\n \r\n <div class=\"cookie-bar-expanded__main\">\r\n <div class=\"cookie-bar-expanded__select-all\">\r\n <h2>{{ cookieGroupsLabel }}</h2>\r\n <div class=\"cookie-bar-expanded__checkbox\">\r\n <input \r\n type=\"checkbox\" \r\n id=\"select-all\" \r\n [checked]=\"isSelectAllChecked()\"\r\n [indeterminate]=\"isSelectAllIndeterminate()\" \r\n (change)=\"onSelectAllChange($event)\"\r\n [disabled]=\"!cookieConfig.allOptOut\">\r\n <label for=\"select-all\">{{ selectAllLabel }} ({{ getTotalSelectedCookieCount() }}/{{ getTotalCookieCount() }})</label>\r\n </div>\r\n <p *ngIf=\"cookieConfig.allAlertMessage && !isSelectAllChecked()\" class=\"cookie-bar-expanded__alert\">\r\n {{ cookieConfig.allAlertMessage }}\r\n </p>\r\n </div>\r\n \r\n <div class=\"cookie-bar-expanded__groups\">\r\n <div class=\"cookie-group\" *ngFor=\"let group of cookieConfig.cookieGroups\">\r\n <div class=\"cookie-group__header\" (click)=\"toggleGroup(group.groupId)\">\r\n <h3 class=\"cookie-group__name\">\r\n {{ group.groupName }} ({{ getGroupCookieCount(group) }})\r\n </h3>\r\n <div class=\"cookie-group__actions\">\r\n <div *ngIf=\"isGroupOptOut(group); else alwaysActive\" class=\"cookie-group__selection\">\r\n <input \r\n type=\"checkbox\" \r\n [id]=\"'group-' + group.groupId\" \r\n [checked]=\"isGroupChecked(group)\" \r\n [indeterminate]=\"isGroupIndeterminate(group)\"\r\n (change)=\"onGroupSelectionChange(group.groupId, $event)\"\r\n [disabled]=\"!group.groupOptOut\">\r\n <label [for]=\"'group-' + group.groupId\">\r\n {{ getSelectGroupLabel(group) }}\r\n </label>\r\n </div>\r\n <ng-template #alwaysActive>\r\n <span class=\"cookie-group__always-active\">{{ alwaysActiveLabel }}</span>\r\n </ng-template>\r\n <button class=\"cookie-group__toggle\">\r\n <span *ngIf=\"!isGroupExpanded(group.groupId)\">&#9660;</span>\r\n <span *ngIf=\"isGroupExpanded(group.groupId)\">&#9650;</span>\r\n </button>\r\n </div>\r\n </div>\r\n \r\n <div class=\"cookie-group__description\">\r\n {{ group.groupText }}\r\n </div>\r\n \r\n <p *ngIf=\"group.groupAlertMessage && !isGroupChecked(group)\" class=\"cookie-group__alert\">\r\n {{ group.groupAlertMessage }}\r\n </p>\r\n \r\n <div class=\"cookie-group__cookies\" *ngIf=\"isGroupExpanded(group.groupId)\">\r\n <div class=\"cookie\" *ngFor=\"let cookie of group.cookieList\">\r\n <div class=\"cookie__header\">\r\n <div class=\"cookie__info\">\r\n <h4>{{ cookie.cookieName }}</h4>\r\n <div *ngIf=\"isCookieOptOut(cookie) && group.groupOptOut\" class=\"cookie__toggle\">\r\n <div class=\"cookie__switch\">\r\n <input \r\n type=\"checkbox\" \r\n [id]=\"'cookie-' + cookie.cookieId\" \r\n [checked]=\"cookie.cookieSelected\"\r\n (change)=\"onCookieSelectionChange(group.groupId, cookie.cookieId, $event)\">\r\n <label [for]=\"'cookie-' + cookie.cookieId\">\r\n {{ cookie.cookieSelected ? onLabel : offLabel }}\r\n </label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <p *ngIf=\"cookie.alertMessage && !cookie.cookieSelected\" class=\"cookie__alert\">\r\n {{ cookie.alertMessage }}\r\n </p>\r\n \r\n <div class=\"cookie__details\">\r\n <div class=\"cookie__detail\">\r\n <strong>{{ cookieNameLabel }}:</strong> {{ cookie.cookieName }}\r\n </div>\r\n <div class=\"cookie__detail\">\r\n <strong>{{ expiresLabel }}:</strong> {{ cookie.expires }}\r\n </div>\r\n <div class=\"cookie__detail\">\r\n <strong>{{ domainLabel }}:</strong> {{ cookie.domain }}\r\n </div>\r\n <div class=\"cookie__detail\">\r\n <strong>{{ enterpriseLabel }}:</strong> {{ cookie.entreprise }}\r\n </div>\r\n <div class=\"cookie__detail\">\r\n <strong>{{ purposeLabel }}:</strong> {{ cookie.purpose }}\r\n </div>\r\n <div class=\"cookie__detail\">\r\n <strong>{{ descriptionLabel }}:</strong> {{ cookie.description }}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- Notas adicionais se existirem -->\r\n <div class=\"cookie-bar-expanded__notes\" *ngIf=\"cookieConfig.noteTitle && cookieConfig.noteList?.length\">\r\n <h3>{{ cookieConfig.noteTitle }}</h3>\r\n <div class=\"cookie-bar-expanded__note-item\" *ngFor=\"let note of cookieConfig.noteList\">\r\n <h4>{{ note.question }}</h4>\r\n <p>{{ note.answer }}</p>\r\n </div>\r\n </div>\r\n \r\n <!-- Links externos se existirem -->\r\n <div class=\"cookie-bar-expanded__links\" *ngIf=\"cookieConfig.links?.length\">\r\n <div class=\"cookie-bar-expanded__link\" *ngFor=\"let link of cookieConfig.links\">\r\n <a [href]=\"link.url\" target=\"_blank\" rel=\"noopener noreferrer\">{{ link.name }}</a>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <div class=\"cookie-bar-expanded__footer\">\r\n <div class=\"cookie-bar-expanded__actions\">\r\n <button class=\"cookie-bar-expanded__button cookie-bar-expanded__button--primary\" (click)=\"accept()\">\r\n {{ acceptButtonLabel }}\r\n </button>\r\n </div>\r\n </div>\r\n </div>", styles: [".cookie-bar{position:fixed;bottom:0;left:0;width:100%;background-color:#fff;border-top:1px solid #ddd;padding:16px;display:flex;justify-content:space-between;align-items:center;z-index:1000;box-shadow:0 -2px 10px #0000001a}.cookie-bar__content{flex:1;padding-right:24px}.cookie-bar__text{margin:0;color:#333;font-size:14px}.cookie-bar__actions{display:flex;gap:16px}.cookie-bar__button{padding:8px 16px;border-radius:4px;border:none;cursor:pointer;font-weight:500;transition:all .3s ease}.cookie-bar__button--primary{background-color:#1351b4;color:#fff}.cookie-bar__button--primary:hover{background-color:#0e3c86}.cookie-bar__button--secondary{background-color:transparent;color:#1351b4;border:1px solid #1351B4}.cookie-bar__button--secondary:hover{background-color:#1351b41a}.cookie-bar-expanded{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#fff;z-index:1001;overflow-y:auto;display:flex;flex-direction:column}.cookie-bar-expanded__header{padding:16px;border-bottom:1px solid #ddd;display:flex;justify-content:space-between;align-items:center;position:sticky;top:0;background-color:#fff;z-index:2}.cookie-bar-expanded__title{margin:0;font-size:24px;color:#333}.cookie-bar-expanded__close{background:none;border:none;cursor:pointer;font-size:24px;color:#333;padding:4px 8px}.cookie-bar-expanded__close:hover{color:#1351b4}.cookie-bar-expanded__intro{padding:16px;border-bottom:1px solid #ddd}.cookie-bar-expanded__last-update{font-size:12px;color:#666;margin-bottom:8px}.cookie-bar-expanded__description{font-size:14px;line-height:1.5;color:#333}.cookie-bar-expanded__main{flex:1;padding:16px}.cookie-bar-expanded__select-all{margin-bottom:24px}.cookie-bar-expanded__checkbox{display:flex;align-items:center;gap:8px;margin-top:8px}.cookie-bar-expanded__checkbox input,.cookie-bar-expanded__checkbox label{cursor:pointer}.cookie-bar-expanded__alert{margin-top:8px;padding:8px;background-color:#ffcd0733;color:#6d5700;border-left:4px solid #FFCD07;font-size:14px}.cookie-bar-expanded__groups{margin-bottom:24px}.cookie-bar-expanded__notes{margin-bottom:24px;padding-top:16px;border-top:1px solid #ddd}.cookie-bar-expanded__note-item{margin-bottom:16px}.cookie-bar-expanded__note-item h4{margin-bottom:8px}.cookie-bar-expanded__links{margin-bottom:24px;padding-top:16px;border-top:1px solid #ddd}.cookie-bar-expanded__link{margin-bottom:8px}.cookie-bar-expanded__link a{color:#1351b4;text-decoration:none}.cookie-bar-expanded__link a:hover{text-decoration:underline}.cookie-bar-expanded__footer{padding:16px;border-top:1px solid #ddd;display:flex;justify-content:flex-end;position:sticky;bottom:0;background-color:#fff;z-index:2}.cookie-bar-expanded__actions{display:flex;gap:16px}.cookie-bar-expanded__button{padding:12px 24px;border-radius:4px;border:none;cursor:pointer;font-weight:500;transition:all .3s ease}.cookie-bar-expanded__button--primary{background-color:#1351b4;color:#fff}.cookie-bar-expanded__button--primary:hover{background-color:#0e3c86}.cookie-group{margin-bottom:16px;border:1px solid #ddd;border-radius:4px;overflow:hidden}.cookie-group__header{padding:12px 16px;background-color:#f8f8f8;display:flex;justify-content:space-between;align-items:center;cursor:pointer}.cookie-group__header:hover{background-color:#f0f0f0}.cookie-group__name{margin:0;font-size:16px;color:#333}.cookie-group__actions{display:flex;align-items:center;gap:16px}.cookie-group__selection{display:flex;align-items:center;gap:8px}.cookie-group__always-active{color:#168821;font-weight:500}.cookie-group__toggle{background:none;border:none;cursor:pointer;color:#333;font-size:12px;padding:4px}.cookie-group__description{padding:12px 16px;font-size:14px;color:#333;border-bottom:1px solid #ddd}.cookie-group__alert{margin:0;padding:8px 16px;background-color:#ffcd0733;color:#6d5700;border-left:4px solid #FFCD07;font-size:14px}.cookie-group__cookies{padding:0 16px}.cookie{padding:16px 0;border-bottom:1px solid #eee}.cookie:last-child{border-bottom:none}.cookie__header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.cookie__info{display:flex;justify-content:space-between;align-items:center;width:100%}.cookie__info h4{margin:0;font-size:14px;color:#333}.cookie__toggle{display:flex;align-items:center}.cookie__switch{position:relative;display:inline-block;width:46px;height:24px}.cookie__switch input{opacity:0;width:0;height:0}.cookie__switch input:checked+label{background-color:#1351b4}.cookie__switch input:checked+label:before{transform:translate(22px)}.cookie__switch label{position:absolute;cursor:pointer;inset:0;background-color:#ccc;transition:.3s;border-radius:24px}.cookie__switch label:before{position:absolute;content:\"\";height:20px;width:20px;left:2px;bottom:2px;background-color:#fff;transition:.3s;border-radius:50%}.cookie__alert{margin:8px 0;padding:8px;background-color:#ffcd0733;color:#6d5700;border-left:4px solid #FFCD07;font-size:14px}.cookie__details{font-size:14px;color:#333}.cookie__detail{margin-bottom:8px}.cookie__detail:last-child{margin-bottom:0}.cookie__detail strong{font-weight:600}@media (max-width: 768px){.cookie-bar{flex-direction:column}.cookie-bar__content{padding-right:0;margin-bottom:16px}.cookie-bar__actions{width:100%;justify-content:space-between}.cookie-bar__button{flex:1;text-align:center}.cookie-group__header{flex-direction:column;align-items:flex-start}.cookie-group__actions{margin-top:12px;width:100%;justify-content:space-between}.cookie__info{flex-direction:column;align-items:flex-start}.cookie__toggle{margin-top:8px}}\n"] }] }], ctorParameters: () => [{ type: i1.CookieBarService }], propDecorators: { config: [{ type: Input }], cookieSettingsChange: [{ type: Output }], acceptCookies: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29va2llLWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2Nvb2tpZS1iYXIvY29va2llLWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2Nvb2tpZS1iYXIvY29va2llLWJhci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7O0FBVy9FLE1BQU0sT0FBTyxrQkFBa0I7SUFjVDtJQWJwQixJQUFhLE1BQU0sQ0FBQyxLQUFhO1FBQy9CLElBQUksS0FBSyxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBRVMsb0JBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQW1CLENBQUM7SUFDM0QsYUFBYSxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO0lBRXZELFlBQVksQ0FBbUI7SUFDL0IsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUNmLGNBQWMsR0FBK0IsRUFBRSxDQUFDO0lBRXZELFlBQW9CLGdCQUFrQztRQUFsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO0lBQUcsQ0FBQztJQUUxRCxRQUFRO1FBQ04seUNBQXlDO1FBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUV0RCxrREFBa0Q7UUFDbEQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDLFNBQVMs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Z0JBQWdCO3FGQUtiLE1BQU07c0JBQWxCLEtBQUs7Z0JBTUksb0JBQW9CO3NCQUE3QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvb2tpZUJhclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9jb29raWUtYmFyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb29raWVCYXJDb25maWcsIENvb2tpZUJhck91dHB1dCB9IGZyb20gJy4uLy4uL21vZGVscy9jb29raWUtYmFyLm1vZGVsJztcclxuaW1wb3J0IHsgQ29va2llR3JvdXAgfSBmcm9tICcuLi8uLi9tb2RlbHMvY29va2llLWdyb3VwLm1vZGVsJztcclxuaW1wb3J0IHsgQ29va2llIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2Nvb2tpZS5tb2RlbCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NmYy1jb29raWUtYmFyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY29va2llLWJhci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY29va2llLWJhci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb29raWVCYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIHNldCBjb25maWcodmFsdWU6IHN0cmluZykge1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIHRoaXMuY29va2llQmFyU2VydmljZS5zZXRDb25maWcodmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgpIGNvb2tpZVNldHRpbmdzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDb29raWVCYXJPdXRwdXQ+KCk7XHJcbiAgQE91dHB1dCgpIGFjY2VwdENvb2tpZXMgPSBuZXcgRXZlbnRFbWl0dGVyPENvb2tpZUJhck91dHB1dD4oKTtcclxuXHJcbiAgcHVibGljIGNvb2tpZUNvbmZpZyE6IENvb2tpZUJhckNvbmZpZztcclxuICBwdWJsaWMgaXNPcGVuID0gZmFsc2U7XHJcbiAgcHVibGljIGV4cGFuZGVkR3JvdXBzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IHt9O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvb2tpZUJhclNlcnZpY2U6IENvb2tpZUJhclNlcnZpY2UpIHt9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgLy8gSW5zY3JldmUgcGFyYSBtdWRhbsOnYXMgbmEgY29uZmlndXJhw6fDo29cclxuICAgIHRoaXMuY29va2llQmFyU2VydmljZS5nZXRDb25maWcoKTtcclxuICAgIHRoaXMuY29va2llQ29uZmlnID0gdGhpcy5jb29raWVCYXJTZXJ2aWNlLmdldENvbmZpZygpO1xyXG5cclxuICAgIC8vIEluc2NyZXZlIHBhcmEgbXVkYW7Dp2FzIG5vIGVzdGFkbyBhYmVydG8vZmVjaGFkb1xyXG4gICAgdGhpcy5jb29raWVCYXJTZXJ2aWNlLmdldElzT3BlbigpLnN1YnNjcmliZShpc09wZW4gPT4ge1xyXG4gICAgICB0aGlzLmlzT3BlbiA9IGlzT3BlbjtcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIEluc2NyZXZlIHBhcmEgbXVkYW7Dp2FzIG5vIG91dHB1dFxyXG4gICAgdGhpcy5jb29raWVCYXJTZXJ2aWNlLmdldENvb2tpZU91dHB1dCgpLnN1YnNjcmliZShvdXRwdXQgPT4ge1xyXG4gICAgICBpZiAob3V0cHV0KSB7XHJcbiAgICAgICAgdGhpcy5jb29raWVTZXR0aW5nc0NoYW5nZS5lbWl0KG91dHB1dCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBhY2NlcHRCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29va2llQ29uZmlnPy5hY2NlcHRCdXR0b24gfHwgJ0FjZWl0YXInO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBzZWNvbmRhcnlCdXR0b25MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMuY29va2llQ29uZmlnPy5hbGxPcHRPdXQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuY29va2llQ29uZmlnPy5vcHRPdXRCdXR0b24gfHwgJ0RlZmluaXIgQ29va2llcyc7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5jb29raWVDb25maWc/Lm9wdEluQnV0dG9uIHx8ICdWZXIgUG9sw610aWNhIGRlIENvb2tpZXMnO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBsYXN0VXBkYXRlTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmNvb2tpZUNvbmZpZz8ubGFzdFVwZGF0ZUxhYmVsIHx8ICfDmmx0aW1hIGF0dWFsaXphw6fDo28nO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjb29raWVHcm91cHNMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29va2llQ29uZmlnPy5jb29raWVHcm91cHNMYWJlbCB8fCAnQ2xhc3NlcyBkZSBjb29raWVzJztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgc2VsZWN0QWxsTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmlzU2VsZWN0QWxsQ2hlY2tlZCgpIFxyXG4gICAgICA/ICh0aGlzLmNvb2tpZUNvbmZpZz8uc2VsZWN0QWxsTGFiZWwgfHwgJ1NlbGVjaW9uYXIgdHVkbycpXHJcbiAgICAgIDogKHRoaXMuY29va2llQ29uZmlnPy51bnNlbGVjdEFsbExhYmVsIHx8ICdEZXNzZWxlY2lvbmFyIHR1ZG8nKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTZWxlY3RHcm91cExhYmVsKGdyb3VwOiBDb29raWVHcm91cCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0dyb3VwQ2hlY2tlZChncm91cClcclxuICAgICAgPyAodGhpcy5jb29raWVDb25maWc/LnNlbGVjdEFsbEdyb3VwTGFiZWwgfHwgJ1NlbGVjaW9uYXIgdG9kYSBjbGFzc2UnKVxyXG4gICAgICA6ICh0aGlzLmNvb2tpZUNvbmZpZz8udW5zZWxlY3RBbGxHcm91cExhYmVsIHx8ICdEZXNzZWxlY2lvbmFyIHRvZGEgY2xhc3NlJyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IG9uTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmNvb2tpZUNvbmZpZz8ub25MYWJlbCB8fCAnTGlnYWRvJztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgb2ZmTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmNvb2tpZUNvbmZpZz8ub2ZmTGFiZWwgfHwgJ0Rlc2xpZ2Fkbyc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGFsd2F5c0FjdGl2ZUxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5jb29raWVDb25maWc/LmFsd2F5c0FjdGl2ZUxhYmVsIHx8ICdTZW1wcmUgYXRpdm8nO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjb29raWVOYW1lTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmNvb2tpZUNvbmZpZz8uY29va2llTmFtZUxhYmVsIHx8ICdDb29raWVzJztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZXhwaXJlc0xhYmVsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5jb29raWVDb25maWc/LmV4cGlyZXNMYWJlbCB8fCAnVmVuY2ltZW50byc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGRvbWFpbkxhYmVsKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5jb29raWVDb25maWc/LmRvbWFpbkxhYmVsIHx8ICdEb23DrW5pbyc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGVudGVycHJpc2VMYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29va2llQ29uZmlnPy5lbnRlcnByaXNlTGFiZWwgfHwgJ0VtcHJlc2EnO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBwdXJwb3NlTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmNvb2tpZUNvbmZpZz8ucHVycG9zZUxhYmVsIHx8ICdGaW5hbGlkYWRlJztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb25MYWJlbCgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuY29va2llQ29uZmlnPy5kZXNjcmlwdGlvbkxhYmVsIHx8ICdEZXNjcmnDp8Ojbyc7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgdG9nZ2xlQ29va2llQmFyKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuaXNPcGVuKSB7XHJcbiAgICAgIHRoaXMuY29va2llQmFyU2VydmljZS5jbG9zZUNvb2tpZUJhcigpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jb29raWVCYXJTZXJ2aWNlLm9wZW5Db29raWVCYXIoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyB0b2dnbGVHcm91cChncm91cElkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuZXhwYW5kZWRHcm91cHNbZ3JvdXBJZF0gPSAhdGhpcy5leHBhbmRlZEdyb3Vwc1tncm91cElkXTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0dyb3VwRXhwYW5kZWQoZ3JvdXBJZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5leHBhbmRlZEdyb3Vwc1tncm91cElkXSA9PT0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblNlbGVjdEFsbENoYW5nZShldmVudDogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLmNvb2tpZUJhclNlcnZpY2UudXBkYXRlU2VsZWN0QWxsKGV2ZW50LnRhcmdldC5jaGVja2VkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkdyb3VwU2VsZWN0aW9uQ2hhbmdlKGdyb3VwSWQ6IHN0cmluZywgZXZlbnQ6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5jb29raWVCYXJTZXJ2aWNlLnVwZGF0ZUdyb3VwU2VsZWN0aW9uKGdyb3VwSWQsIGV2ZW50LnRhcmdldC5jaGVja2VkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNvb2tpZVNlbGVjdGlvbkNoYW5nZShncm91cElkOiBzdHJpbmcsIGNvb2tpZUlkOiBzdHJpbmcsIGV2ZW50OiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMuY29va2llQmFyU2VydmljZS51cGRhdGVDb29raWVTZWxlY3Rpb24oZ3JvdXBJZCwgY29va2llSWQsIGV2ZW50LnRhcmdldC5jaGVja2VkKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1NlbGVjdEFsbENoZWNrZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb29raWVDb25maWc/LnNlbGVjdEFsbCA9PT0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1NlbGVjdEFsbEluZGV0ZXJtaW5hdGUoKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoIXRoaXMuY29va2llQ29uZmlnKSByZXR1cm4gZmFsc2U7XHJcbiAgICBcclxuICAgIGNvbnN0IG9wdE91dEdyb3VwcyA9IHRo