UNPKG

cfc-ds

Version:

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

225 lines 31.8 kB
// step.component.ts import { Component, Input, Output, EventEmitter } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class StepComponent { steps = []; labelPosition = 'bottom'; // Padrão para horizontal indicatorType = 'numeric'; showHiddenSteps = false; currentStep = 1; allowClickOnCompleted = true; allowClickOnUpcoming = false; type = 'horizontal'; // Nova propriedade para controlar o layout scroll = false; // Habilita rolagem horizontal (data-scroll do GovBR-DS) stepClick = new EventEmitter(); constructor() { } onStepClick(stepId, step) { if (this.isStepClickable(step)) { this.stepClick.emit(stepId); } } // Hover event handlers onStepMouseEnter(step) { if (!step.disabled) { step.hovered = true; } } onStepMouseLeave(step) { step.hovered = false; } isStepClickable(step) { if (step.disabled) { return false; } if (this.isCurrentStep(step)) { return false; } if (this.isCompletedStep(step) && this.allowClickOnCompleted) { return true; } if (this.isUpcomingStep(step) && this.allowClickOnUpcoming) { return true; } return false; } getStepCursorClass(step) { return this.isStepClickable(step) ? 'clickable' : ''; } isCompletedStep(step) { return step.status === 'completed'; } isCurrentStep(step) { return step.status === 'current' || step.id === this.currentStep; } isUpcomingStep(step) { return step.status === 'upcoming'; } isErrorStep(step) { return step.status === 'error' || (!!step.errorMessage && step.errorMessage.length > 0); } hasHiddenStepsBefore() { if (!this.showHiddenSteps) { return this.steps.some(step => step.id < this.currentStep && step.disabled); } return false; } hasHiddenStepsAfter() { if (!this.showHiddenSteps) { return this.steps.some(step => step.id > this.currentStep && step.disabled); } return false; } hasTag(step) { return !!step.tagType && step.tagType !== 'none'; } hasAlertTag(step) { return step.tagType === 'alert'; } hasErrorTag(step) { return step.tagType === 'error'; } hasSuccessTag(step) { return step.tagType === 'success'; } getTooltipMessage(step) { if (step.errorMessage && step.errorMessage.length > 0) { return step.errorMessage; } else if (step.alertMessage && step.alertMessage.length > 0) { return step.alertMessage; } else if (step.tooltip && step.tooltip.length > 0) { return step.tooltip; } return ''; } shouldReplaceIndicatorWithTag(step) { return this.indicatorType === 'empty' && this.hasTag(step); } isCurrentStepWithTag(step) { return this.isCurrentStep(step) && this.hasTag(step); } getPreviousStepStatus(currentId) { const previousStep = this.steps.find(step => step.id === currentId - 1); return previousStep ? previousStep.status : null; } isLast(index) { return index === this.steps.length - 1; } // Métodos auxiliares para verificar o tipo de layout isHorizontal() { return this.type === 'horizontal'; } isVertical() { return this.type === 'vertical'; } // Ícone exibido dentro do indicador (GovBR-DS step-icon) getStepIcon(step) { if (this.isErrorStep(step)) { return 'fas fa-times'; } if (step.icon) { return step.icon; } if (this.isCompletedStep(step)) { return 'fas fa-check'; } return null; } // Número do indicador (atributo step-num). Quando há ícone, o círculo fica vazio. getStepNum(step) { if (this.indicatorType === 'empty' || this.getStepIcon(step)) { return null; } return step.id; } // Mapeia o status/tag do step para o data-alert do GovBR-DS getStepAlert(step) { if (this.isErrorStep(step) || step.tagType === 'error') { return 'danger'; } if (step.tagType === 'success') { return 'success'; } if (step.tagType === 'alert') { return 'warning'; } if (step.alertMessage && step.alertMessage.length > 0) { return 'info'; } return null; } // Método para obter a classe de tooltip baseado no layout getTooltipClass(step) { let baseClass = 'ds-step-tooltip'; if (this.isVertical()) { baseClass += ' ds-vertical-step-tooltip'; } else { baseClass += ' ds-horizontal-step-tooltip'; } if (this.hasAlertTag(step)) { baseClass += ' alert-tooltip'; } else if (this.hasErrorTag(step)) { baseClass += ' error-tooltip'; } else { baseClass += ' info-tooltip'; } return baseClass; } // Método para selecionar a posição adequada do label com base no layout getLabelClass(step) { let baseClass = ''; if (this.isVertical()) { baseClass = this.labelPosition === 'left' ? 'ds-vertical-step-label-left' : 'ds-vertical-step-label-right'; } else { baseClass = this.labelPosition === 'top' ? 'ds-step-label-top' : 'ds-step-label-bottom'; } if (this.isCompletedStep(step)) baseClass += ' completed'; if (this.isCurrentStep(step)) baseClass += ' current'; if (this.isUpcomingStep(step)) baseClass += ' upcoming'; if (this.isErrorStep(step)) baseClass += ' error'; if (step.hovered) baseClass += ' hovered'; return baseClass; } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StepComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StepComponent, selector: "cfc-step", inputs: { steps: "steps", labelPosition: "labelPosition", indicatorType: "indicatorType", showHiddenSteps: "showHiddenSteps", currentStep: "currentStep", allowClickOnCompleted: "allowClickOnCompleted", allowClickOnUpcoming: "allowClickOnUpcoming", type: "type", scroll: "scroll" }, outputs: { stepClick: "stepClick" }, ngImport: i0, template: "<!-- step.component.html -->\r\n<nav class=\"br-step\"\r\n [class.vertical]=\"isVertical()\"\r\n [attr.data-initial]=\"currentStep\"\r\n [attr.data-label]=\"labelPosition\"\r\n [attr.data-scroll]=\"scroll ? 'data-scroll' : null\"\r\n role=\"none\">\r\n <div class=\"step-progress\"\r\n role=\"listbox\"\r\n [attr.aria-orientation]=\"isVertical() ? 'vertical' : 'horizontal'\"\r\n aria-label=\"Lista de Op\u00E7\u00F5es\">\r\n\r\n <button *ngFor=\"let step of steps; let i = index\"\r\n class=\"step-progress-btn\"\r\n type=\"button\"\r\n role=\"option\"\r\n [class.active]=\"isCurrentStep(step)\"\r\n [class.clickable]=\"isStepClickable(step)\"\r\n [attr.step-num]=\"getStepNum(step)\"\r\n [attr.aria-posinset]=\"i + 1\"\r\n [attr.aria-setsize]=\"steps.length\"\r\n [attr.aria-selected]=\"isCurrentStep(step)\"\r\n [attr.active]=\"isCurrentStep(step) ? '' : null\"\r\n [attr.disabled]=\"step.disabled ? 'disabled' : null\"\r\n [attr.data-alert]=\"getStepAlert(step)\"\r\n [attr.title]=\"getTooltipMessage(step) || null\"\r\n (click)=\"onStepClick(step.id, step)\"\r\n (mouseenter)=\"onStepMouseEnter(step)\"\r\n (mouseleave)=\"onStepMouseLeave(step)\">\r\n <span class=\"step-info\">{{ step.label }}</span>\r\n <i *ngIf=\"getStepIcon(step)\" class=\"step-icon\" [class]=\"getStepIcon(step)\" aria-hidden=\"true\"></i>\r\n <span *ngIf=\"getStepAlert(step)\" class=\"step-alert\"></span>\r\n </button>\r\n\r\n </div>\r\n</nav>\r\n", styles: [":host{display:block}.br-step .step-progress-btn.clickable:not([disabled]){cursor:pointer}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StepComponent, decorators: [{ type: Component, args: [{ selector: 'cfc-step', template: "<!-- step.component.html -->\r\n<nav class=\"br-step\"\r\n [class.vertical]=\"isVertical()\"\r\n [attr.data-initial]=\"currentStep\"\r\n [attr.data-label]=\"labelPosition\"\r\n [attr.data-scroll]=\"scroll ? 'data-scroll' : null\"\r\n role=\"none\">\r\n <div class=\"step-progress\"\r\n role=\"listbox\"\r\n [attr.aria-orientation]=\"isVertical() ? 'vertical' : 'horizontal'\"\r\n aria-label=\"Lista de Op\u00E7\u00F5es\">\r\n\r\n <button *ngFor=\"let step of steps; let i = index\"\r\n class=\"step-progress-btn\"\r\n type=\"button\"\r\n role=\"option\"\r\n [class.active]=\"isCurrentStep(step)\"\r\n [class.clickable]=\"isStepClickable(step)\"\r\n [attr.step-num]=\"getStepNum(step)\"\r\n [attr.aria-posinset]=\"i + 1\"\r\n [attr.aria-setsize]=\"steps.length\"\r\n [attr.aria-selected]=\"isCurrentStep(step)\"\r\n [attr.active]=\"isCurrentStep(step) ? '' : null\"\r\n [attr.disabled]=\"step.disabled ? 'disabled' : null\"\r\n [attr.data-alert]=\"getStepAlert(step)\"\r\n [attr.title]=\"getTooltipMessage(step) || null\"\r\n (click)=\"onStepClick(step.id, step)\"\r\n (mouseenter)=\"onStepMouseEnter(step)\"\r\n (mouseleave)=\"onStepMouseLeave(step)\">\r\n <span class=\"step-info\">{{ step.label }}</span>\r\n <i *ngIf=\"getStepIcon(step)\" class=\"step-icon\" [class]=\"getStepIcon(step)\" aria-hidden=\"true\"></i>\r\n <span *ngIf=\"getStepAlert(step)\" class=\"step-alert\"></span>\r\n </button>\r\n\r\n </div>\r\n</nav>\r\n", styles: [":host{display:block}.br-step .step-progress-btn.clickable:not([disabled]){cursor:pointer}\n"] }] }], ctorParameters: () => [], propDecorators: { steps: [{ type: Input }], labelPosition: [{ type: Input }], indicatorType: [{ type: Input }], showHiddenSteps: [{ type: Input }], currentStep: [{ type: Input }], allowClickOnCompleted: [{ type: Input }], allowClickOnUpcoming: [{ type: Input }], type: [{ type: Input }], scroll: [{ type: Input }], stepClick: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL3N0ZXAvc3RlcC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jZmMtZHMvc3JjL2xpYi9jb21wb25lbnRzL3N0ZXAvc3RlcC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxvQkFBb0I7QUFDcEIsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBZSxNQUFNLGVBQWUsQ0FBQzs7O0FBY3BGLE1BQU0sT0FBTyxhQUFhO0lBQ2YsS0FBSyxHQUFlLEVBQUUsQ0FBQztJQUN2QixhQUFhLEdBQWlCLFFBQVEsQ0FBQyxDQUFFLHlCQUF5QjtJQUNsRSxhQUFhLEdBQXNCLFNBQVMsQ0FBQztJQUM3QyxlQUFlLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDaEIscUJBQXFCLEdBQUcsSUFBSSxDQUFDO0lBQzdCLG9CQUFvQixHQUFHLEtBQUssQ0FBQztJQUM3QixJQUFJLEdBQW1CLFlBQVksQ0FBQyxDQUFFLDJDQUEyQztJQUNqRixNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUUsd0RBQXdEO0lBQ3hFLFNBQVMsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBRWpELGdCQUFlLENBQUM7SUFFaEIsV0FBVyxDQUFDLE1BQWMsRUFBRSxJQUFjO1FBQ3hDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRUQsdUJBQXVCO0lBQ3ZCLGdCQUFnQixDQUFDLElBQWM7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxR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WUFDTixTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsS0FBSyxLQUFLO2dCQUN0QyxDQUFDLENBQUMsbUJBQW1CO2dCQUNyQixDQUFDLENBQUMsc0JBQXNCLENBQUM7UUFDN0IsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUM7WUFBRSxTQUFTLElBQUksWUFBWSxDQUFDO1FBQzFELElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7WUFBRSxTQUFTLElBQUksVUFBVSxDQUFDO1FBQ3RELElBQUksSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUM7WUFBRSxTQUFTLElBQUksV0FBVyxDQUFDO1FBQ3hELElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7WUFBRSxTQUFTLElBQUksUUFBUSxDQUFDO1FBQ2xELElBQUksSUFBSSxDQUFDLE9BQU87WUFBRSxTQUFTLElBQUksVUFBVSxDQUFDO1FBRTFDLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7d0dBM05VLGFBQWE7NEZBQWIsYUFBYSwrV0NmMUIsbW9EQW9DQTs7NEZEckJhLGFBQWE7a0JBTHpCLFNBQVM7K0JBQ0UsVUFBVTt3REFLWCxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0ksU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8vIHN0ZXAuY29tcG9uZW50LnRzXHJcbmltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTdGVwSXRlbSB9IGZyb20gJy4uLy4uL21vZGVscy9zdGVwLWl0ZW0ubW9kZWwnO1xyXG5cclxuZXhwb3J0IHR5cGUgU3RlcFN0YXR1cyA9ICdjb21wbGV0ZWQnIHwgJ2N1cnJlbnQnIHwgJ3VwY29taW5nJyB8ICdlcnJvcic7XHJcbmV4cG9ydCB0eXBlIFN0ZXBQb3NpdGlvbiA9ICdyaWdodCcgfCAnbGVmdCcgfCAndG9wJyB8ICdib3R0b20nO1xyXG5leHBvcnQgdHlwZSBTdGVwSW5kaWNhdG9yVHlwZSA9ICdudW1lcmljJyB8ICdpY29uJyB8ICdjdXN0b20nIHwgJ2VtcHR5JztcclxuZXhwb3J0IHR5cGUgU3RlcFRhZ1R5cGUgPSAnYWxlcnQnIHwgJ2Vycm9yJyB8ICdzdWNjZXNzJyB8ICdub25lJztcclxuZXhwb3J0IHR5cGUgU3RlcExheW91dFR5cGUgPSAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnOyAvLyBOb3ZhIHByb3ByaWVkYWRlIGRlIHRpcG8gZGUgbGF5b3V0XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2NmYy1zdGVwJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc3RlcC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vc3RlcC5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTdGVwQ29tcG9uZW50IHtcclxuICBASW5wdXQoKSBzdGVwczogU3RlcEl0ZW1bXSA9IFtdO1xyXG4gIEBJbnB1dCgpIGxhYmVsUG9zaXRpb246IFN0ZXBQb3NpdGlvbiA9ICdib3R0b20nOyAgLy8gUGFkcsOjbyBwYXJhIGhvcml6b250YWxcclxuICBASW5wdXQoKSBpbmRpY2F0b3JUeXBlOiBTdGVwSW5kaWNhdG9yVHlwZSA9ICdudW1lcmljJztcclxuICBASW5wdXQoKSBzaG93SGlkZGVuU3RlcHMgPSBmYWxzZTtcclxuICBASW5wdXQoKSBjdXJyZW50U3RlcCA9IDE7XHJcbiAgQElucHV0KCkgYWxsb3dDbGlja09uQ29tcGxldGVkID0gdHJ1ZTtcclxuICBASW5wdXQoKSBhbGxvd0NsaWNrT25VcGNvbWluZyA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHR5cGU6IFN0ZXBMYXlvdXRUeXBlID0gJ2hvcml6b250YWwnOyAgLy8gTm92YSBwcm9wcmllZGFkZSBwYXJhIGNvbnRyb2xhciBvIGxheW91dFxyXG4gIEBJbnB1dCgpIHNjcm9sbCA9IGZhbHNlOyAgLy8gSGFiaWxpdGEgcm9sYWdlbSBob3Jpem9udGFsIChkYXRhLXNjcm9sbCBkbyBHb3ZCUi1EUylcclxuICBAT3V0cHV0KCkgc3RlcENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgb25TdGVwQ2xpY2soc3RlcElkOiBudW1iZXIsIHN0ZXA6IFN0ZXBJdGVtKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pc1N0ZXBDbGlja2FibGUoc3RlcCkpIHtcclxuICAgICAgdGhpcy5zdGVwQ2xpY2suZW1pdChzdGVwSWQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gSG92ZXIgZXZlbnQgaGFuZGxlcnNcclxuICBvblN0ZXBNb3VzZUVudGVyKHN0ZXA6IFN0ZXBJdGVtKTogdm9pZCB7XHJcbiAgICBpZiAoIXN0ZXAuZGlzYWJsZWQpIHtcclxuICAgICAgc3RlcC5ob3ZlcmVkID0gdHJ1ZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uU3RlcE1vdXNlTGVhdmUoc3RlcDogU3RlcEl0ZW0pOiB2b2lkIHtcclxuICAgIHN0ZXAuaG92ZXJlZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgaXNTdGVwQ2xpY2thYmxlKHN0ZXA6IFN0ZXBJdGVtKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoc3RlcC5kaXNhYmxlZCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNDdXJyZW50U3RlcChzdGVwKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaXNDb21wbGV0ZWRTdGVwKHN0ZXApICYmIHRoaXMuYWxsb3dDbGlja09uQ29tcGxldGVkKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzVXBjb21pbmdTdGVwKHN0ZXApICYmIHRoaXMuYWxsb3dDbGlja09uVXBjb21pbmcpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgZ2V0U3RlcEN1cnNvckNsYXNzKHN0ZXA6IFN0ZXBJdGVtKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmlzU3RlcENsaWNrYWJsZShzdGVwKSA/ICdjbGlja2FibGUnIDogJyc7XHJcbiAgfVxyXG5cclxuICBpc0NvbXBsZXRlZFN0ZXAoc3RlcDogU3RlcEl0ZW0pOiBib29sZWFuIHtcclxuICAgIHJldHVybiBzdGVwLnN0YXR1cyA9PT0gJ2NvbXBsZXRlZCc7XHJcbiAgfVxyXG5cclxuICBpc0N1cnJlbnRTdGVwKHN0ZXA6IFN0ZXBJdGVtKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gc3RlcC5zdGF0dXMgPT09ICdjdXJyZW50JyB8fCBzdGVwLmlkID09PSB0aGlzLmN1cnJlbnRTdGVwO1xyXG4gIH1cclxuXHJcbiAgaXNVcGNvbWluZ1N0ZXAoc3RlcDogU3RlcEl0ZW0pOiBib29sZWFuIHtcclxuICAgIHJldHVybiBzdGVwLnN0YXR1cyA9PT0gJ3VwY29taW5nJztcclxuICB9XHJcblxyXG4gIGlzRXJyb3JTdGVwKHN0ZXA6IFN0ZXBJdGVtKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gc3RlcC5zdGF0dXMgPT09ICdlcnJvcicgfHwgKCEhc3RlcC5lcnJvck1lc3NhZ2UgJiYgc3RlcC5lcnJvck1lc3NhZ2UubGVuZ3RoID4gMCk7XHJcbiAgfVxyXG5cclxuICBoYXNIaWRkZW5TdGVwc0JlZm9yZSgpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5zaG93SGlkZGVuU3RlcHMpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc3RlcHMuc29tZShzdGVwID0+IHN0ZXAuaWQgPCB0aGlzLmN1cnJlbnRTdGVwICYmIHN0ZXAuZGlzYWJsZWQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgaGFzSGlkZGVuU3RlcHNBZnRlcigpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5zaG93SGlkZGVuU3RlcHMpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuc3RlcHMuc29tZShzdGVwID0+IHN0ZXAuaWQgPiB0aGlzLmN1cnJlbnRTdGVwICYmIHN0ZXAuZGlzYWJsZWQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgaGFzVGFnKHN0ZXA6IFN0ZXBJdGVtKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gISFzdGVwLnRhZ1R5cGUgJiYgc3RlcC50YWdUeXBlICE9PSAnbm9uZSc7XHJcbiAgfVxyXG5cclxuICBoYXNBbGVydFRhZyhzdGVwOiBTdGVwSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHN0ZXAudGFnVHlwZSA9PT0gJ2FsZXJ0JztcclxuICB9XHJcblxyXG4gIGhhc0Vycm9yVGFnKHN0ZXA6IFN0ZXBJdGVtKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gc3RlcC50YWdUeXBlID09PSAnZXJyb3InO1xyXG4gIH1cclxuXHJcbiAgaGFzU3VjY2Vzc1RhZyhzdGVwOiBTdGVwSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHN0ZXAudGFnVHlwZSA9PT0gJ3N1Y2Nlc3MnO1xyXG4gIH1cclxuXHJcbiAgZ2V0VG9vbHRpcE1lc3NhZ2Uoc3RlcDogU3RlcEl0ZW0pOiBzdHJpbmcge1xyXG4gICAgaWYgKHN0ZXAuZXJyb3JNZXNzYWdlICYmIHN0ZXAuZXJyb3JNZXNzYWdlLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuIHN0ZXAuZXJyb3JNZXNzYWdlO1xyXG4gICAgfSBlbHNlIGlmIChzdGVwLmFsZXJ0TWVzc2FnZSAmJiBzdGVwLmFsZXJ0TWVzc2FnZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiBzdGVwLmFsZXJ0TWVzc2FnZTtcclxuICAgIH0gZWxzZSBpZiAoc3RlcC50b29sdGlwICYmIHN0ZXAudG9vbHRpcC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHJldHVybiBzdGVwLnRvb2x0aXA7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gJyc7XHJcbiAgfVxyXG5cclxuICBzaG91bGRSZXBsYWNlSW5kaWNhdG9yV2l0aFRhZyhzdGVwOiBTdGVwSXRlbSk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaW5kaWNhdG9yVHlwZSA9PT0gJ2VtcHR5JyAmJiB0aGlzLmhhc1RhZyhzdGVwKTtcclxuICB9XHJcblxyXG4gIGlzQ3VycmVudFN0ZXBXaXRoVGFnKHN0ZXA6IFN0ZXBJdGVtKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc0N1cnJlbnRTdGVwKHN0ZXApICYmIHRoaXMuaGFzVGFnKHN0ZXApO1xyXG4gIH1cclxuXHJcbiAgZ2V0UHJldmlvdXNTdGVwU3RhdHVzKGN1cnJlbnRJZDogbnVtYmVyKTogU3RlcFN0YXR1cyB8IG51bGwge1xyXG4gICAgY29uc3QgcHJldmlvdXNTdGVwID0gdGhpcy5zdGVwcy5maW5kKHN0ZXAgPT4gc3RlcC5pZCA9PT0gY3VycmVudElkIC0gMSk7XHJcbiAgICByZXR1cm4gcHJldmlvdXNTdGVwID8gcHJldmlvdXNTdGVwLnN0YXR1cyA6IG51bGw7XHJcbiAgfVxyXG5cclxuICBpc0xhc3QoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIGluZGV4ID09PSB0aGlzLnN0ZXBzLmxlbmd0aCAtIDE7XHJcbiAgfVxyXG5cclxuICAvLyBNw6l0b2RvcyBhdXhpbGlhcmVzIHBhcmEgdmVyaWZpY2FyIG8gdGlwbyBkZSBsYXlvdXRcclxuICBpc0hvcml6b250YWwoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy50eXBlID09PSAnaG9yaXpvbnRhbCc7XHJcbiAgfVxyXG5cclxuICBpc1ZlcnRpY2FsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ3ZlcnRpY2FsJztcclxuICB9XHJcblxyXG4gIC8vIMONY29uZSBleGliaWRvIGRlbnRybyBkbyBpbmRpY2Fkb3IgKEdvdkJSLURTIHN0ZXAtaWNvbilcclxuICBnZXRTdGVwSWNvbihzdGVwOiBTdGVwSXRlbSk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgaWYgKHRoaXMuaXNFcnJvclN0ZXAoc3RlcCkpIHtcclxuICAgICAgcmV0dXJuICdmYXMgZmEtdGltZXMnO1xyXG4gICAgfVxyXG4gICAgaWYgKHN0ZXAuaWNvbikge1xyXG4gICAgICByZXR1cm4gc3RlcC5pY29uO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNDb21wbGV0ZWRTdGVwKHN0ZXApKSB7XHJcbiAgICAgIHJldHVybiAnZmFzIGZhLWNoZWNrJztcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8gTsO6bWVybyBkbyBpbmRpY2Fkb3IgKGF0cmlidXRvIHN0ZXAtbnVtKS4gUXVhbmRvIGjDoSDDrWNvbmUsIG8gY8OtcmN1bG8gZmljYSB2YXppby5cclxuICBnZXRTdGVwTnVtKHN0ZXA6IFN0ZXBJdGVtKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBpZiAodGhpcy5pbmRpY2F0b3JUeXBlID09PSAnZW1wdHknIHx8IHRoaXMuZ2V0U3RlcEljb24oc3RlcCkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3RlcC5pZDtcclxuICB9XHJcblxyXG4gIC8vIE1hcGVpYSBvIHN0YXR1cy90YWcgZG8gc3RlcCBwYXJhIG8gZGF0YS1hbGVydCBkbyBHb3ZCUi1EU1xyXG4gIGdldFN0ZXBBbGVydChzdGVwOiBTdGVwSXRlbSk6ICdzdWNjZXNzJyB8ICdpbmZvJyB8ICd3YXJuaW5nJyB8ICdkYW5nZXInIHwgbnVsbCB7XHJcbiAgICBpZiAodGhpcy5pc0Vycm9yU3RlcChzdGVwKSB8fCBzdGVwLnRhZ1R5cGUgPT09ICdlcnJvcicpIHtcclxuICAgICAgcmV0dXJuICdkYW5nZXInO1xyXG4gICAgfVxyXG4gICAgaWYgKHN0ZXAudGFnVHlwZSA9PT0gJ3N1Y2Nlc3MnKSB7XHJcbiAgICAgIHJldHVybiAnc3VjY2Vzcyc7XHJcbiAgICB9XHJcbiAgICBpZiAoc3RlcC50YWdUeXBlID09PSAnYWxlcnQnKSB7XHJcbiAgICAgIHJldHVybiAnd2FybmluZyc7XHJcbiAgICB9XHJcbiAgICBpZiAoc3RlcC5hbGVydE1lc3NhZ2UgJiYgc3RlcC5hbGVydE1lc3NhZ2UubGVuZ3RoID4gMCkge1xyXG4gICAgICByZXR1cm4gJ2luZm8nO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICAvLyBNw6l0b2RvIHBhcmEgb2J0ZXIgYSBjbGFzc2UgZGUgdG9vbHRpcCBiYXNlYWRvIG5vIGxheW91dFxyXG4gIGdldFRvb2x0aXBDbGFzcyhzdGVwOiBTdGVwSXRlbSk6IHN0cmluZyB7XHJcbiAgICBsZXQgYmFzZUNsYXNzID0gJ2RzLXN0ZXAtdG9vbHRpcCc7XHJcblxyXG4gICAgaWYgKHRoaXMuaXNWZXJ0aWNhbCgpKSB7XHJcbiAgICAgIGJhc2VDbGFzcyArPSAnIGRzLXZlcnRpY2FsLXN0ZXAtdG9vbHRpcCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBiYXNlQ2xhc3MgKz0gJyBkcy1ob3Jpem9udGFsLXN0ZXAtdG9vbHRpcCc7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuaGFzQWxlcnRUYWcoc3RlcCkpIHtcclxuICAgICAgYmFzZUNsYXNzICs9ICcgYWxlcnQtdG9vbHRpcCc7XHJcbiAgICB9IGVsc2UgaWYgKHRoaXMuaGFzRXJyb3JUYWcoc3RlcCkpIHtcclxuICAgICAgYmFzZUNsYXNzICs9ICcgZXJyb3ItdG9vbHRpcCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBiYXNlQ2xhc3MgKz0gJyBpbmZvLXRvb2x0aXAnO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBiYXNlQ2xhc3M7XHJcbiAgfVxyXG5cclxuICAvLyBNw6l0b2RvIHBhcmEgc2VsZWNpb25hciBhIHBvc2nDp8OjbyBhZGVxdWFkYSBkbyBsYWJlbCBjb20gYmFzZSBubyBsYXlvdXRcclxuICBnZXRMYWJlbENsYXNzKHN0ZXA6IFN0ZXBJdGVtKTogc3RyaW5nIHtcclxuICAgIGxldCBiYXNlQ2xhc3MgPSAnJztcclxuXHJcbiAgICBpZiAodGhpcy5pc1ZlcnRpY2FsKCkpIHtcclxuICAgICAgYmFzZUNsYXNzID0gdGhpcy5sYWJlbFBvc2l0aW9uID09PSAnbGVmdCdcclxuICAgICAgICA/ICdkcy12ZXJ0aWNhbC1zdGVwLWxhYmVsLWxlZnQnXHJcbiAgICAgICAgOiAnZHMtdmVydGljYWwtc3RlcC1sYWJlbC1yaWdodCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBiYXNlQ2xhc3MgPSB0aGlzLmxhYmVsUG9zaXRpb24gPT09ICd0b3AnXHJcbiAgICAgICAgPyAnZHMtc3RlcC1sYWJlbC10b3AnXHJcbiAgICAgICAgOiAnZHMtc3RlcC1sYWJlbC1ib3R0b20nO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzQ29tcGxldGVkU3RlcChzdGVwKSkgYmFzZUNsYXNzICs9ICcgY29tcGxldGVkJztcclxuICAgIGlmICh0aGlzLmlzQ3VycmVudFN0ZXAoc3RlcCkpIGJhc2VDbGFzcyArPSAnIGN1cnJlbnQnO1xyXG4gICAgaWYgKHRoaXMuaXNVcGNvbWluZ1N0ZXAoc3RlcCkpIGJhc2VDbGFzcyArPSAnIHVwY29taW5nJztcclxuICAgIGlmICh0aGlzLmlzRXJyb3JTdGVwKHN0ZXApKSBiYXNlQ2xhc3MgKz0gJyBlcnJvcic7XHJcbiAgICBpZiAoc3RlcC5ob3ZlcmVkKSBiYXNlQ2xhc3MgKz0gJyBob3ZlcmVkJztcclxuXHJcbiAgICByZXR1cm4gYmFzZUNsYXNzO1xyXG4gIH1cclxufVxyXG4iLCI8IS0tIHN0ZXAuY29tcG9uZW50Lmh0bWwgLS0+XHJcbjxuYXYgY2xhc3M9XCJici1zdGVwXCJcclxuICAgICBbY2xhc3MudmVydGljYWxdPVwiaXNWZXJ0aWNhbCgpXCJcclxuICAgICBbYXR0ci5kYXRhLWluaXRpYWxdPVwiY3VycmVudFN0ZXBcIlxyXG4gICAgIFthdHRyLmRhdGEtbGFiZWxdPVwibGFiZWxQb3NpdGlvblwiXHJcbiAgICAgW2F0dHIuZGF0YS1zY3JvbGxdPVwic2Nyb2xsID8gJ2RhdGEtc2Nyb2xsJyA6IG51bGxcIlxyXG4gICAgIHJvbGU9XCJub25lXCI+XHJcbiAgPGRpdiBjbGFzcz1cInN0ZXAtcHJvZ3Jlc3NcIlxyXG4gICAgICAgcm9sZT1cImxpc3Rib3hcIlxyXG4gICAgICAgW2F0dHIuYXJpYS1vcmllbnRhdGlvbl09XCJpc1ZlcnRpY2FsKCkgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnXCJcclxuICAgICAgIGFyaWEtbGFiZWw9XCJMaXN0YSBkZSBPcMOnw7Vlc1wiPlxyXG5cclxuICAgIDxidXR0b24gKm5nRm9yPVwibGV0IHN0ZXAgb2Ygc3RlcHM7IGxldCBpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICBjbGFzcz1cInN0ZXAtcHJvZ3Jlc3MtYnRuXCJcclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIHJvbGU9XCJvcHRpb25cIlxyXG4gICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImlzQ3VycmVudFN0ZXAoc3RlcClcIlxyXG4gICAgICAgICAgICBbY2xhc3MuY2xpY2thYmxlXT1cImlzU3RlcENsaWNrYWJsZShzdGVwKVwiXHJcbiAgICAgICAgICAgIFthdHRyLnN0ZXAtbnVtXT1cImdldFN0ZXBOdW0oc3RlcClcIlxyXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXBvc2luc2V0XT1cImkgKyAxXCJcclxuICAgICAgICAgICAgW2F0dHIuYXJpYS1zZXRzaXplXT1cInN0ZXBzLmxlbmd0aFwiXHJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtc2VsZWN0ZWRdPVwiaXNDdXJyZW50U3RlcChzdGVwKVwiXHJcbiAgICAgICAgICAgIFthdHRyLmFjdGl2ZV09XCJpc0N1cnJlbnRTdGVwKHN0ZXApID8gJycgOiBudWxsXCJcclxuICAgICAgICAgICAgW2F0dHIuZGlzYWJsZWRdPVwic3RlcC5kaXNhYmxlZCA/ICdkaXNhYmxlZCcgOiBudWxsXCJcclxuICAgICAgICAgICAgW2F0dHIuZGF0YS1hbGVydF09XCJnZXRTdGVwQWxlcnQoc3RlcClcIlxyXG4gICAgICAgICAgICBbYXR0ci50aXRsZV09XCJnZXRUb29sdGlwTWVzc2FnZShzdGVwKSB8fCBudWxsXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm9uU3RlcENsaWNrKHN0ZXAuaWQsIHN0ZXApXCJcclxuICAgICAgICAgICAgKG1vdXNlZW50ZXIpPVwib25TdGVwTW91c2VFbnRlcihzdGVwKVwiXHJcbiAgICAgICAgICAgIChtb3VzZWxlYXZlKT1cIm9uU3RlcE1vdXNlTGVhdmUoc3RlcClcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJzdGVwLWluZm9cIj57eyBzdGVwLmxhYmVsIH19PC9zcGFuPlxyXG4gICAgICA8aSAqbmdJZj1cImdldFN0ZXBJY29uKHN0ZXApXCIgY2xhc3M9XCJzdGVwLWljb25cIiBbY2xhc3NdPVwiZ2V0U3RlcEljb24oc3RlcClcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgIDxzcGFuICpuZ0lmPVwiZ2V0U3RlcEFsZXJ0KHN0ZXApXCIgY2xhc3M9XCJzdGVwLWFsZXJ0XCI+PC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gIDwvZGl2PlxyXG48L25hdj5cclxuIl19