cfc-ds
Version:
Design System do Conselho Federal de Contabilidade baseado no govbr-ds
173 lines • 31.4 kB
JavaScript
import { Component, Input, Output, EventEmitter, ViewChild } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class ItemComponent {
elementRef;
cdr;
expandedContent;
interactive = false;
disabled = false;
selected = false;
active = false;
dragged = false;
hasDivider = false;
expandable = false;
expanded = false;
orientation = 'horizontal';
density = 'medium';
allowMediaBleeding = false;
iconPosition = 'end';
selectedChange = new EventEmitter();
expandedChange = new EventEmitter();
itemClick = new EventEmitter();
isExpanded = false;
constructor(elementRef, cdr) {
this.elementRef = elementRef;
this.cdr = cdr;
}
ngOnChanges(changes) {
if (changes['expanded']) {
this.isExpanded = this.expanded;
// Aguarde a próxima renderização para manipular o DOM
setTimeout(() => {
if (this.expandedContent && this.expandable) {
if (this.isExpanded) {
this.open();
}
else {
this.close();
}
}
});
}
}
ngAfterViewInit() {
this.isExpanded = this.expanded;
// Aguarde a próxima renderização para manipular o DOM
setTimeout(() => {
if (this.expandable && this.expandedContent) {
if (this.isExpanded) {
this.open();
}
else {
this.close();
}
this.cdr.detectChanges();
}
});
}
toggleExpanded(event) {
if (this.expandable && !this.disabled) {
event.stopPropagation(); // Impede propagação para evitar o clique no item
this.isExpanded = !this.isExpanded;
this.expanded = this.isExpanded;
if (this.isExpanded) {
this.open();
}
else {
this.close();
}
this.expandedChange.emit(this.isExpanded);
}
}
open() {
if (this.expandedContent && this.expandedContent.nativeElement) {
const content = this.expandedContent.nativeElement;
const contentHeight = content.scrollHeight;
// Ajuste explícito da altura para iniciar a transição
content.style.height = contentHeight + 'px';
content.classList.add('expanded');
// Após a transição, defina para 'auto' para permitir redimensionamento
setTimeout(() => {
if (content.classList.contains('expanded')) {
content.style.height = 'auto';
}
}, 200);
}
}
close() {
if (this.expandedContent && this.expandedContent.nativeElement) {
const content = this.expandedContent.nativeElement;
// Defina a altura exata atual para iniciar a partir dela
const height = content.offsetHeight;
content.style.height = height + 'px';
// Force um reflow antes de mudar para 0
void content.offsetHeight;
// Feche o conteúdo
content.style.height = '0';
content.classList.remove('expanded');
}
}
handleClick(event) {
if (!this.disabled && this.interactive) {
this.itemClick.emit(event);
}
}
toggleSelected(event) {
if (!this.disabled) {
event.stopPropagation();
this.selected = !this.selected;
this.selectedChange.emit(this.selected);
}
}
// Verifica se há conteúdo em áreas específicas usando contentProjection
get hasLeadingContent() {
const element = this.elementRef.nativeElement;
return !!element.querySelector('[cfc-item-leading]');
}
get hasTrailingContent() {
const element = this.elementRef.nativeElement;
return !!element.querySelector('[cfc-item-trailing]');
}
get hasExpandedContent() {
const element = this.elementRef.nativeElement;
return !!element.querySelector('[cfc-item-expanded]');
}
// Verifica a posição do ícone de expansão
get showIconAtStart() {
return this.iconPosition === 'start';
}
get showIconAtEnd() {
return this.iconPosition === 'end';
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ItemComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ItemComponent, selector: "cfc-item", inputs: { interactive: "interactive", disabled: "disabled", selected: "selected", active: "active", dragged: "dragged", hasDivider: "hasDivider", expandable: "expandable", expanded: "expanded", orientation: "orientation", density: "density", allowMediaBleeding: "allowMediaBleeding", iconPosition: "iconPosition" }, outputs: { selectedChange: "selectedChange", expandedChange: "expandedChange", itemClick: "itemClick" }, viewQueries: [{ propertyName: "expandedContent", first: true, predicate: ["expandedContent"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"cfc-item\" \r\n [class.interactive]=\"interactive && !disabled\" \r\n [class.selected]=\"selected\" \r\n [class.active]=\"active\" \r\n [class.disabled]=\"disabled\"\r\n [class.dragged]=\"dragged\"\r\n [class.has-divider]=\"hasDivider\"\r\n [class.vertical]=\"orientation === 'vertical'\"\r\n [class.horizontal]=\"orientation === 'horizontal'\"\r\n [class.density-high]=\"density === 'high'\"\r\n [class.density-medium]=\"density === 'medium'\"\r\n [class.density-low]=\"density === 'low'\"\r\n [class.allow-media-bleeding]=\"allowMediaBleeding\"\r\n (click)=\"handleClick($event)\">\r\n \r\n <!-- \u00CDcone de expans\u00E3o (posi\u00E7\u00E3o inicial) -->\r\n <div *ngIf=\"expandable && showIconAtStart\" \r\n class=\"cfc-item-expand-icon start\"\r\n [class.expanded]=\"isExpanded\"\r\n (click)=\"toggleExpanded($event)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\r\n <path d=\"M7 10l5 5 5-5z\"/>\r\n </svg>\r\n </div>\r\n \r\n <!-- Conte\u00FAdo principal -->\r\n <div class=\"cfc-item-content\">\r\n <!-- Leading content -->\r\n <div class=\"cfc-item-leading\" *ngIf=\"hasLeadingContent\">\r\n <ng-content select=\"[cfc-item-leading]\"></ng-content>\r\n </div>\r\n \r\n <!-- Primary content -->\r\n <div class=\"cfc-item-primary\">\r\n <ng-content></ng-content>\r\n </div>\r\n \r\n <!-- Trailing content -->\r\n <div class=\"cfc-item-trailing\" *ngIf=\"hasTrailingContent\">\r\n <ng-content select=\"[cfc-item-trailing]\"></ng-content>\r\n </div>\r\n \r\n <!-- \u00CDcone de expans\u00E3o (posi\u00E7\u00E3o final) -->\r\n <div *ngIf=\"expandable && showIconAtEnd\" \r\n class=\"cfc-item-expand-icon end\"\r\n [class.expanded]=\"isExpanded\"\r\n (click)=\"toggleExpanded($event)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\r\n <path d=\"M7 10l5 5 5-5z\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n \r\n <!-- Conte\u00FAdo expans\u00EDvel -->\r\n <div *ngIf=\"expandable\" \r\n class=\"cfc-item-expanded-wrapper\" \r\n [class.expanded]=\"isExpanded\"\r\n #expandedContent>\r\n <div class=\"cfc-item-expanded-content\">\r\n <ng-content select=\"[cfc-item-expanded]\"></ng-content>\r\n </div>\r\n </div>\r\n</div>", styles: [":host{display:block;width:100%}.cfc-item{display:flex;flex-direction:column;position:relative;box-sizing:border-box;width:100%}.cfc-item.density-high{padding:4px 8px}.cfc-item.density-medium{padding:8px 16px}.cfc-item.density-low{padding:12px 24px}.cfc-item.horizontal .cfc-item-content{flex-direction:row}.cfc-item.vertical .cfc-item-content{flex-direction:column}.cfc-item.interactive{cursor:pointer;transition:background-color .15s ease}.cfc-item.interactive:hover{background-color:#0000000a}.cfc-item.interactive:active,.cfc-item.selected{background-color:#00000014}.cfc-item.disabled{opacity:.5;pointer-events:none;cursor:default}.cfc-item.dragged{box-shadow:0 2px 8px #0003;z-index:1}.cfc-item.has-divider:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:1px;background-color:#0000001f}.cfc-item-content{display:flex;align-items:center;width:100%}.cfc-item-leading{margin-right:16px}.vertical .cfc-item-leading{margin-right:0;margin-bottom:8px}.cfc-item-primary{flex:1;min-width:0}.cfc-item-trailing{margin-left:16px}.vertical .cfc-item-trailing{margin-left:0;margin-top:8px}.cfc-item-expand-icon{display:flex;align-items:center;justify-content:center;width:24px;height:24px;cursor:pointer;transition:transform .2s ease}.cfc-item-expand-icon.start{margin-right:8px}.cfc-item-expand-icon.end{margin-left:8px}.cfc-item-expand-icon.expanded{transform:rotate(180deg)}.cfc-item-expand-icon svg{width:24px;height:24px;fill:currentColor}.cfc-item-expanded-wrapper{overflow:hidden;height:0;transition:height .2s ease}.cfc-item-expanded-wrapper.expanded{height:auto}.cfc-item-expanded-content{padding:8px 16px 16px}.cfc-item-expand-icon.start+.cfc-item-expanded-content{padding-left:32px}.allow-media-bleeding .cfc-item-expanded-content img,.allow-media-bleeding .cfc-item-expanded-content video{margin-left:-16px;margin-right:-16px;max-width:calc(100% + 32px);width:calc(100% + 32px)}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ItemComponent, decorators: [{
type: Component,
args: [{ selector: 'cfc-item', template: "<div class=\"cfc-item\" \r\n [class.interactive]=\"interactive && !disabled\" \r\n [class.selected]=\"selected\" \r\n [class.active]=\"active\" \r\n [class.disabled]=\"disabled\"\r\n [class.dragged]=\"dragged\"\r\n [class.has-divider]=\"hasDivider\"\r\n [class.vertical]=\"orientation === 'vertical'\"\r\n [class.horizontal]=\"orientation === 'horizontal'\"\r\n [class.density-high]=\"density === 'high'\"\r\n [class.density-medium]=\"density === 'medium'\"\r\n [class.density-low]=\"density === 'low'\"\r\n [class.allow-media-bleeding]=\"allowMediaBleeding\"\r\n (click)=\"handleClick($event)\">\r\n \r\n <!-- \u00CDcone de expans\u00E3o (posi\u00E7\u00E3o inicial) -->\r\n <div *ngIf=\"expandable && showIconAtStart\" \r\n class=\"cfc-item-expand-icon start\"\r\n [class.expanded]=\"isExpanded\"\r\n (click)=\"toggleExpanded($event)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\r\n <path d=\"M7 10l5 5 5-5z\"/>\r\n </svg>\r\n </div>\r\n \r\n <!-- Conte\u00FAdo principal -->\r\n <div class=\"cfc-item-content\">\r\n <!-- Leading content -->\r\n <div class=\"cfc-item-leading\" *ngIf=\"hasLeadingContent\">\r\n <ng-content select=\"[cfc-item-leading]\"></ng-content>\r\n </div>\r\n \r\n <!-- Primary content -->\r\n <div class=\"cfc-item-primary\">\r\n <ng-content></ng-content>\r\n </div>\r\n \r\n <!-- Trailing content -->\r\n <div class=\"cfc-item-trailing\" *ngIf=\"hasTrailingContent\">\r\n <ng-content select=\"[cfc-item-trailing]\"></ng-content>\r\n </div>\r\n \r\n <!-- \u00CDcone de expans\u00E3o (posi\u00E7\u00E3o final) -->\r\n <div *ngIf=\"expandable && showIconAtEnd\" \r\n class=\"cfc-item-expand-icon end\"\r\n [class.expanded]=\"isExpanded\"\r\n (click)=\"toggleExpanded($event)\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\r\n <path d=\"M7 10l5 5 5-5z\"/>\r\n </svg>\r\n </div>\r\n </div>\r\n \r\n <!-- Conte\u00FAdo expans\u00EDvel -->\r\n <div *ngIf=\"expandable\" \r\n class=\"cfc-item-expanded-wrapper\" \r\n [class.expanded]=\"isExpanded\"\r\n #expandedContent>\r\n <div class=\"cfc-item-expanded-content\">\r\n <ng-content select=\"[cfc-item-expanded]\"></ng-content>\r\n </div>\r\n </div>\r\n</div>", styles: [":host{display:block;width:100%}.cfc-item{display:flex;flex-direction:column;position:relative;box-sizing:border-box;width:100%}.cfc-item.density-high{padding:4px 8px}.cfc-item.density-medium{padding:8px 16px}.cfc-item.density-low{padding:12px 24px}.cfc-item.horizontal .cfc-item-content{flex-direction:row}.cfc-item.vertical .cfc-item-content{flex-direction:column}.cfc-item.interactive{cursor:pointer;transition:background-color .15s ease}.cfc-item.interactive:hover{background-color:#0000000a}.cfc-item.interactive:active,.cfc-item.selected{background-color:#00000014}.cfc-item.disabled{opacity:.5;pointer-events:none;cursor:default}.cfc-item.dragged{box-shadow:0 2px 8px #0003;z-index:1}.cfc-item.has-divider:after{content:\"\";position:absolute;bottom:0;left:0;right:0;height:1px;background-color:#0000001f}.cfc-item-content{display:flex;align-items:center;width:100%}.cfc-item-leading{margin-right:16px}.vertical .cfc-item-leading{margin-right:0;margin-bottom:8px}.cfc-item-primary{flex:1;min-width:0}.cfc-item-trailing{margin-left:16px}.vertical .cfc-item-trailing{margin-left:0;margin-top:8px}.cfc-item-expand-icon{display:flex;align-items:center;justify-content:center;width:24px;height:24px;cursor:pointer;transition:transform .2s ease}.cfc-item-expand-icon.start{margin-right:8px}.cfc-item-expand-icon.end{margin-left:8px}.cfc-item-expand-icon.expanded{transform:rotate(180deg)}.cfc-item-expand-icon svg{width:24px;height:24px;fill:currentColor}.cfc-item-expanded-wrapper{overflow:hidden;height:0;transition:height .2s ease}.cfc-item-expanded-wrapper.expanded{height:auto}.cfc-item-expanded-content{padding:8px 16px 16px}.cfc-item-expand-icon.start+.cfc-item-expanded-content{padding-left:32px}.allow-media-bleeding .cfc-item-expanded-content img,.allow-media-bleeding .cfc-item-expanded-content video{margin-left:-16px;margin-right:-16px;max-width:calc(100% + 32px);width:calc(100% + 32px)}\n"] }]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { expandedContent: [{
type: ViewChild,
args: ['expandedContent']
}], interactive: [{
type: Input
}], disabled: [{
type: Input
}], selected: [{
type: Input
}], active: [{
type: Input
}], dragged: [{
type: Input
}], hasDivider: [{
type: Input
}], expandable: [{
type: Input
}], expanded: [{
type: Input
}], orientation: [{
type: Input
}], density: [{
type: Input
}], allowMediaBleeding: [{
type: Input
}], iconPosition: [{
type: Input
}], selectedChange: [{
type: Output
}], expandedChange: [{
type: Output
}], itemClick: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2l0ZW0vaXRlbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL2l0ZW0vaXRlbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUVaLFNBQVMsRUFLVixNQUFNLGVBQWUsQ0FBQzs7O0FBT3ZCLE1BQU0sT0FBTyxhQUFhO0lBdUJkO0lBQ0E7SUF2Qm9CLGVBQWUsQ0FBYztJQUVsRCxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakIsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ2YsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQ25CLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDbkIsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUNqQixXQUFXLEdBQThCLFlBQVksQ0FBQztJQUN0RCxPQUFPLEdBQThCLFFBQVEsQ0FBQztJQUM5QyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFDM0IsWUFBWSxHQUFvQixLQUFLLENBQUM7SUFFckMsY0FBYyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFDN0MsY0FBYyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFDN0MsU0FBUyxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7SUFFckQsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUVuQixZQUNVLFVBQXNCLEVBQ3RCLEdBQXNCO1FBRHRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsUUFBRyxHQUFI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QyxhQUFhLENBQUM7UUFDOUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxJQUFJLGtCQUFrQjtRQUNwQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQztRQUM5QyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELDBDQUEwQztJQUMxQyxJQUFJLGVBQWU7UUFDakIsT0FBTyxJQUFJLENBQUMsWUFBWSxLQUFLLE9BQU8sQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsT0FBTyxJQUFJLENBQUMsWUFBWSxLQUFLLEtBQUssQ0FBQztJQUNyQyxDQUFDO3dHQXBKVSxhQUFhOzRGQUFiLGFBQWEsOGxCQ2xCMUIsbTJFQThETTs7NEZENUNPLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0UsVUFBVTsrR0FLVSxlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFFbkIsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFFSSxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFxyXG4gIENvbXBvbmVudCwgXHJcbiAgSW5wdXQsIFxyXG4gIE91dHB1dCwgXHJcbiAgRXZlbnRFbWl0dGVyLCBcclxuICBFbGVtZW50UmVmLCBcclxuICBWaWV3Q2hpbGQsIFxyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFNpbXBsZUNoYW5nZXNcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnY2ZjLWl0ZW0nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9pdGVtLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9pdGVtLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEl0ZW1Db21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xyXG4gIEBWaWV3Q2hpbGQoJ2V4cGFuZGVkQ29udGVudCcpIGV4cGFuZGVkQ29udGVudCE6IEVsZW1lbnRSZWY7XHJcblxyXG4gIEBJbnB1dCgpIGludGVyYWN0aXZlID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBzZWxlY3RlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGFjdGl2ZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGRyYWdnZWQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBoYXNEaXZpZGVyID0gZmFsc2U7XHJcbiAgQElucHV0KCkgZXhwYW5kYWJsZSA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGV4cGFuZGVkID0gZmFsc2U7XHJcbiAgQElucHV0KCkgb3JpZW50YXRpb246ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCcgPSAnaG9yaXpvbnRhbCc7XHJcbiAgQElucHV0KCkgZGVuc2l0eTogJ2hpZ2gnIHwgJ21lZGl1bScgfCAnbG93JyA9ICdtZWRpdW0nO1xyXG4gIEBJbnB1dCgpIGFsbG93TWVkaWFCbGVlZGluZyA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGljb25Qb3NpdGlvbjogJ3N0YXJ0JyB8ICdlbmQnID0gJ2VuZCc7XHJcblxyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcclxuICBAT3V0cHV0KCkgZXhwYW5kZWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcbiAgQE91dHB1dCgpIGl0ZW1DbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8TW91c2VFdmVudD4oKTtcclxuXHJcbiAgaXNFeHBhbmRlZCA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZixcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxyXG4gICkge31cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG4gICAgaWYgKGNoYW5nZXNbJ2V4cGFuZGVkJ10pIHtcclxuICAgICAgdGhpcy5pc0V4cGFuZGVkID0gdGhpcy5leHBhbmRlZDtcclxuICAgICAgXHJcbiAgICAgIC8vIEFndWFyZGUgYSBwcsOzeGltYSByZW5kZXJpemHDp8OjbyBwYXJhIG1hbmlwdWxhciBvIERPTVxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5leHBhbmRlZENvbnRlbnQgJiYgdGhpcy5leHBhbmRhYmxlKSB7XHJcbiAgICAgICAgICBpZiAodGhpcy5pc0V4cGFuZGVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub3BlbigpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlzRXhwYW5kZWQgPSB0aGlzLmV4cGFuZGVkO1xyXG4gICAgXHJcbiAgICAvLyBBZ3VhcmRlIGEgcHLDs3hpbWEgcmVuZGVyaXphw6fDo28gcGFyYSBtYW5pcHVsYXIgbyBET01cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAodGhpcy5leHBhbmRhYmxlICYmIHRoaXMuZXhwYW5kZWRDb250ZW50KSB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXNFeHBhbmRlZCkge1xyXG4gICAgICAgICAgdGhpcy5vcGVuKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvZ2dsZUV4cGFuZGVkKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5leHBhbmRhYmxlICYmICF0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyAvLyBJbXBlZGUgcHJvcGFnYcOnw6NvIHBhcmEgZXZpdGFyIG8gY2xpcXVlIG5vIGl0ZW1cclxuICAgICAgdGhpcy5pc0V4cGFuZGVkID0gIXRoaXMuaXNFeHBhbmRlZDtcclxuICAgICAgdGhpcy5leHBhbmRlZCA9IHRoaXMuaXNFeHBhbmRlZDtcclxuICAgICAgXHJcbiAgICAgIGlmICh0aGlzLmlzRXhwYW5kZWQpIHtcclxuICAgICAgICB0aGlzLm9wZW4oKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLmNsb3NlKCk7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIHRoaXMuZXhwYW5kZWRDaGFuZ2UuZW1pdCh0aGlzLmlzRXhwYW5kZWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb3BlbigpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmV4cGFuZGVkQ29udGVudCAmJiB0aGlzLmV4cGFuZGVkQ29udGVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmV4cGFuZGVkQ29udGVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICBjb25zdCBjb250ZW50SGVpZ2h0ID0gY29udGVudC5zY3JvbGxIZWlnaHQ7XHJcbiAgICAgIFxyXG4gICAgICAvLyBBanVzdGUgZXhwbMOtY2l0byBkYSBhbHR1cmEgcGFyYSBpbmljaWFyIGEgdHJhbnNpw6fDo29cclxuICAgICAgY29udGVudC5zdHlsZS5oZWlnaHQgPSBjb250ZW50SGVpZ2h0ICsgJ3B4JztcclxuICAgICAgY29udGVudC5jbGFzc0xpc3QuYWRkKCdleHBhbmRlZCcpO1xyXG4gICAgICBcclxuICAgICAgLy8gQXDDs3MgYSB0cmFuc2nDp8OjbywgZGVmaW5hIHBhcmEgJ2F1dG8nIHBhcmEgcGVybWl0aXIgcmVkaW1lbnNpb25hbWVudG9cclxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgaWYgKGNvbnRlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdleHBhbmRlZCcpKSB7XHJcbiAgICAgICAgICBjb250ZW50LnN0eWxlLmhlaWdodCA9ICdhdXRvJztcclxuICAgICAgICB9XHJcbiAgICAgIH0sIDIwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZSgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmV4cGFuZGVkQ29udGVudCAmJiB0aGlzLmV4cGFuZGVkQ29udGVudC5uYXRpdmVFbGVtZW50KSB7XHJcbiAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLmV4cGFuZGVkQ29udGVudC5uYXRpdmVFbGVtZW50O1xyXG4gICAgICBcclxuICAgICAgLy8gRGVmaW5hIGEgYWx0dXJhIGV4YXRhIGF0dWFsIHBhcmEgaW5pY2lhciBhIHBhcnRpciBkZWxhXHJcbiAgICAgIGNvbnN0IGhlaWdodCA9IGNvbnRlbnQub2Zmc2V0SGVpZ2h0O1xyXG4gICAgICBjb250ZW50LnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XHJcbiAgICAgIFxyXG4gICAgICAvLyBGb3JjZSB1bSByZWZsb3cgYW50ZXMgZGUgbXVkYXIgcGFyYSAwXHJcbiAgICAgIHZvaWQgY29udGVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgICAgIFxyXG4gICAgICAvLyBGZWNoZSBvIGNvbnRlw7pkb1xyXG4gICAgICBjb250ZW50LnN0eWxlLmhlaWdodCA9ICcwJztcclxuICAgICAgY29udGVudC5jbGFzc0xpc3QucmVtb3ZlKCdleHBhbmRlZCcpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiB0aGlzLmludGVyYWN0aXZlKSB7XHJcbiAgICAgIHRoaXMuaXRlbUNsaWNrLmVtaXQoZXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlU2VsZWN0ZWQoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xyXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZCA9ICF0aGlzLnNlbGVjdGVkO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBWZXJpZmljYSBzZSBow6EgY29udGXDumRvIGVtIMOhcmVhcyBlc3BlY8OtZmljYXMgdXNhbmRvIGNvbnRlbnRQcm9qZWN0aW9uXHJcbiAgZ2V0IGhhc0xlYWRpbmdDb250ZW50KCk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgcmV0dXJuICEhZWxlbWVudC5xdWVyeVNlbGVjdG9yKCdbY2ZjLWl0ZW0tbGVhZGluZ10nKTtcclxuICB9XHJcblxyXG4gIGdldCBoYXNUcmFpbGluZ0NvbnRlbnQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICByZXR1cm4gISFlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tjZmMtaXRlbS10cmFpbGluZ10nKTtcclxuICB9XHJcblxyXG4gIGdldCBoYXNFeHBhbmRlZENvbnRlbnQoKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICByZXR1cm4gISFlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ1tjZmMtaXRlbS1leHBhbmRlZF0nKTtcclxuICB9XHJcbiAgXHJcbiAgLy8gVmVyaWZpY2EgYSBwb3Npw6fDo28gZG8gw61jb25lIGRlIGV4cGFuc8Ojb1xyXG4gIGdldCBzaG93SWNvbkF0U3RhcnQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pY29uUG9zaXRpb24gPT09ICdzdGFydCc7XHJcbiAgfVxyXG4gIFxyXG4gIGdldCBzaG93SWNvbkF0RW5kKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaWNvblBvc2l0aW9uID09PSAnZW5kJztcclxuICB9XHJcbn0iLCI8ZGl2IGNsYXNzPVwiY2ZjLWl0ZW1cIiBcclxuICAgICBbY2xhc3MuaW50ZXJhY3RpdmVdPVwiaW50ZXJhY3RpdmUgJiYgIWRpc2FibGVkXCIgXHJcbiAgICAgW2NsYXNzLnNlbGVjdGVkXT1cInNlbGVjdGVkXCIgXHJcbiAgICAgW2NsYXNzLmFjdGl2ZV09XCJhY3RpdmVcIiBcclxuICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgIFtjbGFzcy5kcmFnZ2VkXT1cImRyYWdnZWRcIlxyXG4gICAgIFtjbGFzcy5oYXMtZGl2aWRlcl09XCJoYXNEaXZpZGVyXCJcclxuICAgICBbY2xhc3MudmVydGljYWxdPVwib3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCdcIlxyXG4gICAgIFtjbGFzcy5ob3Jpem9udGFsXT1cIm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCdcIlxyXG4gICAgIFtjbGFzcy5kZW5zaXR5LWhpZ2hdPVwiZGVuc2l0eSA9PT0gJ2hpZ2gnXCJcclxuICAgICBbY2xhc3MuZGVuc2l0eS1tZWRpdW1dPVwiZGVuc2l0eSA9PT0gJ21lZGl1bSdcIlxyXG4gICAgIFtjbGFzcy5kZW5zaXR5LWxvd109XCJkZW5zaXR5ID09PSAnbG93J1wiXHJcbiAgICAgW2NsYXNzLmFsbG93LW1lZGlhLWJsZWVkaW5nXT1cImFsbG93TWVkaWFCbGVlZGluZ1wiXHJcbiAgICAgKGNsaWNrKT1cImhhbmRsZUNsaWNrKCRldmVudClcIj5cclxuICBcclxuICA8IS0tIMONY29uZSBkZSBleHBhbnPDo28gKHBvc2nDp8OjbyBpbmljaWFsKSAtLT5cclxuICA8ZGl2ICpuZ0lmPVwiZXhwYW5kYWJsZSAmJiBzaG93SWNvbkF0U3RhcnRcIiBcclxuICAgICAgIGNsYXNzPVwiY2ZjLWl0ZW0tZXhwYW5kLWljb24gc3RhcnRcIlxyXG4gICAgICAgW2NsYXNzLmV4cGFuZGVkXT1cImlzRXhwYW5kZWRcIlxyXG4gICAgICAgKGNsaWNrKT1cInRvZ2dsZUV4cGFuZGVkKCRldmVudClcIj5cclxuICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIj5cclxuICAgICAgPHBhdGggZD1cIk03IDEwbDUgNSA1LTV6XCIvPlxyXG4gICAgPC9zdmc+XHJcbiAgPC9kaXY+XHJcbiAgXHJcbiAgPCEtLSBDb250ZcO6ZG8gcHJpbmNpcGFsIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJjZmMtaXRlbS1jb250ZW50XCI+XHJcbiAgICA8IS0tIExlYWRpbmcgY29udGVudCAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJjZmMtaXRlbS1sZWFkaW5nXCIgKm5nSWY9XCJoYXNMZWFkaW5nQ29udGVudFwiPlxyXG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbY2ZjLWl0ZW0tbGVhZGluZ11cIj48L25nLWNvbnRlbnQ+XHJcbiAgICA8L2Rpdj5cclxuICAgIFxyXG4gICAgPCEtLSBQcmltYXJ5IGNvbnRlbnQgLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2ZjLWl0ZW0tcHJpbWFyeVwiPlxyXG4gICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XHJcbiAgICA8L2Rpdj5cclxuICAgIFxyXG4gICAgPCEtLSBUcmFpbGluZyBjb250ZW50IC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cImNmYy1pdGVtLXRyYWlsaW5nXCIgKm5nSWY9XCJoYXNUcmFpbGluZ0NvbnRlbnRcIj5cclxuICAgICAgPG5nLWNvbnRlbnQgc2VsZWN0PVwiW2NmYy1pdGVtLXRyYWlsaW5nXVwiPjwvbmctY29udGVudD5cclxuICAgIDwvZGl2PlxyXG4gICAgXHJcbiAgICA8IS0tIMONY29uZSBkZSBleHBhbnPDo28gKHBvc2nDp8OjbyBmaW5hbCkgLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiZXhwYW5kYWJsZSAmJiBzaG93SWNvbkF0RW5kXCIgXHJcbiAgICAgICAgIGNsYXNzPVwiY2ZjLWl0ZW0tZXhwYW5kLWljb24gZW5kXCJcclxuICAgICAgICAgW2NsYXNzLmV4cGFuZGVkXT1cImlzRXhwYW5kZWRcIlxyXG4gICAgICAgICAoY2xpY2spPVwidG9nZ2xlRXhwYW5kZWQoJGV2ZW50KVwiPlxyXG4gICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCI+XHJcbiAgICAgICAgPHBhdGggZD1cIk03IDEwbDUgNSA1LTV6XCIvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIFxyXG4gIDwhLS0gQ29udGXDumRvIGV4cGFuc8OtdmVsIC0tPlxyXG4gIDxkaXYgKm5nSWY9XCJleHBhbmRhYmxlXCIgXHJcbiAgICAgICBjbGFzcz1cImNmYy1pdGVtLWV4cGFuZGVkLXdyYXBwZXJcIiBcclxuICAgICAgIFtjbGFzcy5leHBhbmRlZF09XCJpc0V4cGFuZGVkXCJcclxuICAgICAgICNleHBhbmRlZENvbnRlbnQ+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2ZjLWl0ZW0tZXhwYW5kZWQtY29udGVudFwiPlxyXG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbY2ZjLWl0ZW0tZXhwYW5kZWRdXCI+PC9uZy1jb250ZW50PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==