@wizco/fenixds-ngx
Version:
Componentes fenix design system para Angular.
149 lines • 27.9 kB
JavaScript
import { CommonModule } from '@angular/common';
import { Component, Input } from '@angular/core';
import * as i0 from "@angular/core";
import * as i1 from "@angular/platform-browser";
import * as i2 from "@angular/common";
export class WcoModalAlertComponent {
sanitizer;
DEFAULT_VALUES = {
show: false,
showIcon: true,
title: '',
message: '',
actions: [],
hideClose: false,
};
set show(value) {
this.changeValues(value, 'show');
}
set showIcon(value) {
this.changeValues(value, 'showIcon');
}
set title(value) {
this.changeValues(value, 'title');
}
set message(value) {
this.changeValues(value, 'message');
}
set materialIcon(value) {
this.changeValues(value, 'materialIcon');
}
set type(value) {
this.changeValues(value, 'type');
}
set hideClose(value) {
this.changeValues(value, 'hideClose');
}
set actions(value) {
this.changeValues(value, 'actions');
}
id = 'wco-modal-alert-' + Math.random().toString(36).substring(7);
config = {
show: false,
showIcon: true,
title: '',
message: '',
actions: [],
hideClose: false,
};
constructor(sanitizer) {
this.sanitizer = sanitizer;
}
ngOnChanges(event) {
if (event['config']?.currentValue['show'] !== undefined) {
this.eventModal();
}
}
get title() {
return this.sanitizer.bypassSecurityTrustHtml(this.config.title || '');
}
get message() {
return this.sanitizer.bypassSecurityTrustHtml(this.config.message || '');
}
getButtonClass(action) {
const classeColor = action.color === 'primary'
? 'btn-primary'
: action.color === 'secondary'
? 'btn-secondary'
: 'btn-neutral';
const classeOutline = action.outline ? 'btn-outline' : '';
const extraClasse = action.extraClasse ? action.extraClasse : '';
return `wco-btn btn-full ${classeColor} ${classeOutline} ${extraClasse}`;
}
get iconMaterial() {
const { type = 'info' } = this.config;
switch (type) {
case 'error':
return { icon: 'error_outline', color: 'error' };
case 'warning':
return { icon: 'warning_amber', color: 'warning' };
case 'success':
return { icon: 'check_circle_outline', color: 'success' };
case 'loading':
return { icon: 'spinner', color: 'loading' };
default:
return { icon: 'info', color: 'info' };
}
}
changeValues(valueUpdate, name) {
this.config = {
...this.DEFAULT_VALUES,
...this.config,
[name]: valueUpdate,
};
this.eventModal();
}
modalClose() {
const element = document.getElementById(this.id);
if (element) {
element.close();
}
}
eventModal() {
const show = this.config.show;
const element = document.getElementById(this.id);
if (show && element) {
if (this.config.hideClose) {
element.addEventListener('keydown', (event) => {
const key = event.key;
if (key === 'Escape') {
event.preventDefault();
}
});
}
element.showModal();
this.config.show = false;
}
else {
this.modalClose();
}
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WcoModalAlertComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: WcoModalAlertComponent, isStandalone: true, selector: "wco-modal-alert", inputs: { show: "show", showIcon: "showIcon", title: "title", message: "message", materialIcon: "materialIcon", type: "type", hideClose: "hideClose", actions: "actions", id: ["setId", "id"], config: "config" }, usesOnChanges: true, ngImport: i0, template: "<dialog class=\"wco-modal\" [id]=\"id\" role=\"dialog\" aria-modal=\"true\">\n <main>\n <ng-container *ngIf=\"!config.hideClose\">\n <button class=\"wco-modal--close\" (click)=\"modalClose()\">\n <span class=\"material-icons\">close</span>\n </button>\n </ng-container>\n <div [class]=\"'wco-modalConfirm ' + iconMaterial.color\">\n <ng-container *ngIf=\"config.showIcon\">\n <span class=\"wco-modalConfirm--icon\">\n <ng-container *ngIf=\"config.type !== 'loading'\">\n <span class=\"material-icons-round\">\n <ng-container *ngIf=\"config.materialIcon; else iconTemplate\">\n {{config.materialIcon}}\n </ng-container>\n <ng-template #iconTemplate>\n {{ iconMaterial.icon}}\n </ng-template>\n </span>\n </ng-container>\n <ng-container *ngIf=\"config.type === 'loading'\">\n <svg class=\"spinner\" viewBox=\"0 0 66 66\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle class=\"loading-icon\" fill=\"none\" stroke=\"var(--wco-modal-color-type)\" stroke-width=\"6\"\n stroke-linecap=\"round\" cx=\"33\" cy=\"33\" r=\"30\"></circle>\n </svg>\n </ng-container>\n </span>\n </ng-container>\n <ng-container *ngIf=\"config.title\">\n <h3 class=\"wco-modalConfirm--title\" [innerHTML]=\"title\"></h3>\n </ng-container>\n <ng-container *ngIf=\"config.message\"> \n <p class=\"wco-modalConfirm--message\" [innerHTML]=\"message\"></p>\n </ng-container>\n <div class=\"wco-modalConfirm--actions\" [class.modalConfirm--actions-size]=\"config.actions.length === 1\"\n *ngIf=\"config.actions && config.actions.length > 0\">\n <button type=\"button\" [class]=\"getButtonClass(action)\" (click)=\"action.action()\"\n *ngFor=\"let action of config.actions; let index = index\">\n <span class=\"material-icons-round\" *ngIf=\"action.materialIconLeft\">{{action.materialIconLeft}}</span>\n {{action.text}}\n <span class=\"material-icons-round\" *ngIf=\"action.materialIconRight\">{{action.materialIconRight}}</span>\n </button>\n </div>\n </div>\n </main>\n</dialog>", styles: [".wco-modalConfirm{width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;--color-type: var(--wco-color-neutral-900)}.wco-modalConfirm.info{--wco-modal-color-type: var(--wco-color-info-600)}.wco-modalConfirm.success{--wco-modal-color-type: var(--wco-color-success-600)}.wco-modalConfirm.warning{--wco-modal-color-type: var(--wco-color-warning-600)}.wco-modalConfirm.error{--wco-modal-color-type: var(--wco-color-danger-600)}.wco-modalConfirm.loading{--wco-modal-color-type: var(--wco-color-primary-600)}.wco-modalConfirm--title{font-size:var(--wco-font-size-lg);line-height:150%;letter-spacing:.4px;font-weight:700;color:var(--wco-color-neutral-900)}.wco-modalConfirm--icon{margin-bottom:var(--wco-spacing-md)}.wco-modalConfirm--icon span{font-size:var(--wco-spacing-xxl);color:var(--wco-modal-color-type)}.wco-modalConfirm--icon .spinner{width:93px}@media screen and (max-width: 768px){.wco-modalConfirm--icon .spinner{width:55px}}.wco-modalConfirm--message{font-size:var(--wco-font-size-xs);line-height:150%;letter-spacing:.4px;font-weight:400;color:var(--wco-color-neutral-700);text-wrap:pretty;margin-top:var(--wco-spacing-nano)}.wco-modalConfirm--actions{display:flex;justify-content:center;align-items:center;gap:var(--wco-spacing-xs);margin-top:var(--wco-spacing-md);width:100%}.wco-modalConfirm--actions.modalConfirm--actions-size{max-width:275px}@media screen and (max-width: 768px){.wco-modalConfirm--actions{flex-direction:column}}.spinner{animation:rotator 1.4s linear infinite}@keyframes rotator{0%{transform:rotate(0)}to{transform:rotate(270deg)}}.loading-icon{stroke-dasharray:187;stroke-dashoffset:12px;transform-origin:center;animation:dash 1.4s ease-in-out infinite}@keyframes dash{0%{stroke-dashoffset:187}50%{stroke-dashoffset:46.75;transform:rotate(135deg)}to{stroke-dashoffset:187;transform:rotate(450deg)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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: WcoModalAlertComponent, decorators: [{
type: Component,
args: [{ selector: 'wco-modal-alert', standalone: true, imports: [CommonModule], template: "<dialog class=\"wco-modal\" [id]=\"id\" role=\"dialog\" aria-modal=\"true\">\n <main>\n <ng-container *ngIf=\"!config.hideClose\">\n <button class=\"wco-modal--close\" (click)=\"modalClose()\">\n <span class=\"material-icons\">close</span>\n </button>\n </ng-container>\n <div [class]=\"'wco-modalConfirm ' + iconMaterial.color\">\n <ng-container *ngIf=\"config.showIcon\">\n <span class=\"wco-modalConfirm--icon\">\n <ng-container *ngIf=\"config.type !== 'loading'\">\n <span class=\"material-icons-round\">\n <ng-container *ngIf=\"config.materialIcon; else iconTemplate\">\n {{config.materialIcon}}\n </ng-container>\n <ng-template #iconTemplate>\n {{ iconMaterial.icon}}\n </ng-template>\n </span>\n </ng-container>\n <ng-container *ngIf=\"config.type === 'loading'\">\n <svg class=\"spinner\" viewBox=\"0 0 66 66\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle class=\"loading-icon\" fill=\"none\" stroke=\"var(--wco-modal-color-type)\" stroke-width=\"6\"\n stroke-linecap=\"round\" cx=\"33\" cy=\"33\" r=\"30\"></circle>\n </svg>\n </ng-container>\n </span>\n </ng-container>\n <ng-container *ngIf=\"config.title\">\n <h3 class=\"wco-modalConfirm--title\" [innerHTML]=\"title\"></h3>\n </ng-container>\n <ng-container *ngIf=\"config.message\"> \n <p class=\"wco-modalConfirm--message\" [innerHTML]=\"message\"></p>\n </ng-container>\n <div class=\"wco-modalConfirm--actions\" [class.modalConfirm--actions-size]=\"config.actions.length === 1\"\n *ngIf=\"config.actions && config.actions.length > 0\">\n <button type=\"button\" [class]=\"getButtonClass(action)\" (click)=\"action.action()\"\n *ngFor=\"let action of config.actions; let index = index\">\n <span class=\"material-icons-round\" *ngIf=\"action.materialIconLeft\">{{action.materialIconLeft}}</span>\n {{action.text}}\n <span class=\"material-icons-round\" *ngIf=\"action.materialIconRight\">{{action.materialIconRight}}</span>\n </button>\n </div>\n </div>\n </main>\n</dialog>", styles: [".wco-modalConfirm{width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;--color-type: var(--wco-color-neutral-900)}.wco-modalConfirm.info{--wco-modal-color-type: var(--wco-color-info-600)}.wco-modalConfirm.success{--wco-modal-color-type: var(--wco-color-success-600)}.wco-modalConfirm.warning{--wco-modal-color-type: var(--wco-color-warning-600)}.wco-modalConfirm.error{--wco-modal-color-type: var(--wco-color-danger-600)}.wco-modalConfirm.loading{--wco-modal-color-type: var(--wco-color-primary-600)}.wco-modalConfirm--title{font-size:var(--wco-font-size-lg);line-height:150%;letter-spacing:.4px;font-weight:700;color:var(--wco-color-neutral-900)}.wco-modalConfirm--icon{margin-bottom:var(--wco-spacing-md)}.wco-modalConfirm--icon span{font-size:var(--wco-spacing-xxl);color:var(--wco-modal-color-type)}.wco-modalConfirm--icon .spinner{width:93px}@media screen and (max-width: 768px){.wco-modalConfirm--icon .spinner{width:55px}}.wco-modalConfirm--message{font-size:var(--wco-font-size-xs);line-height:150%;letter-spacing:.4px;font-weight:400;color:var(--wco-color-neutral-700);text-wrap:pretty;margin-top:var(--wco-spacing-nano)}.wco-modalConfirm--actions{display:flex;justify-content:center;align-items:center;gap:var(--wco-spacing-xs);margin-top:var(--wco-spacing-md);width:100%}.wco-modalConfirm--actions.modalConfirm--actions-size{max-width:275px}@media screen and (max-width: 768px){.wco-modalConfirm--actions{flex-direction:column}}.spinner{animation:rotator 1.4s linear infinite}@keyframes rotator{0%{transform:rotate(0)}to{transform:rotate(270deg)}}.loading-icon{stroke-dasharray:187;stroke-dashoffset:12px;transform-origin:center;animation:dash 1.4s ease-in-out infinite}@keyframes dash{0%{stroke-dashoffset:187}50%{stroke-dashoffset:46.75;transform:rotate(135deg)}to{stroke-dashoffset:187;transform:rotate(450deg)}}\n"] }]
}], ctorParameters: () => [{ type: i1.DomSanitizer }], propDecorators: { show: [{
type: Input
}], showIcon: [{
type: Input
}], title: [{
type: Input
}], message: [{
type: Input
}], materialIcon: [{
type: Input
}], type: [{
type: Input
}], hideClose: [{
type: Input
}], actions: [{
type: Input
}], id: [{
type: Input,
args: [{ alias: 'setId' }]
}], config: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtYWxlcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWNvbXBvbmVudHMvc3JjL2xpYi9tb2RhbC1hbGVydC9tb2RhbC1hbGVydC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtY29tcG9uZW50cy9zcmMvbGliL21vZGFsLWFsZXJ0L21vZGFsLWFsZXJ0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFVLEtBQUssRUFBNEIsTUFBTSxlQUFlLENBQUM7Ozs7QUFXbkYsTUFBTSxPQUFPLHNCQUFzQjtJQXFEYjtJQXBEWixjQUFjLEdBQUc7UUFDdkIsSUFBSSxFQUFFLEtBQUs7UUFDWCxRQUFRLEVBQUUsSUFBSTtRQUNkLEtBQUssRUFBRSxFQUFFO1FBQ1QsT0FBTyxFQUFFLEVBQUU7UUFDWCxPQUFPLEVBQUUsRUFBRTtRQUNYLFNBQVMsRUFBRSxLQUFLO0tBQ2pCLENBQUM7SUFFRixJQUFhLElBQUksQ0FBQyxLQUFjO1FBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFDRCxJQUFhLFFBQVEsQ0FBQyxLQUFjO1FBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFDRCxJQUFhLEtBQUssQ0FBQyxLQUFhO1FBQzlCLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFDRCxJQUFhLE9BQU8sQ0FBQyxLQUFhO1FBQ2hDLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJ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WUFDRCxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQzNCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO3dHQWxJVSxzQkFBc0I7NEZBQXRCLHNCQUFzQixtVENabkMsbXZFQTZDUyxrNUREckNHLFlBQVk7OzRGQUlYLHNCQUFzQjtrQkFQbEMsU0FBUzsrQkFDRSxpQkFBaUIsY0FDZixJQUFJLFdBQ1AsQ0FBQyxZQUFZLENBQUM7aUZBY1YsSUFBSTtzQkFBaEIsS0FBSztnQkFHTyxRQUFRO3NCQUFwQixLQUFLO2dCQUdPLEtBQUs7c0JBQWpCLEtBQUs7Z0JBR08sT0FBTztzQkFBbkIsS0FBSztnQkFJTyxZQUFZO3NCQUF4QixLQUFLO2dCQUlPLElBQUk7c0JBQWhCLEtBQUs7Z0JBTU8sU0FBUztzQkFBckIsS0FBSztnQkFJTyxPQUFPO3NCQUFuQixLQUFLO2dCQUlxQixFQUFFO3NCQUE1QixLQUFLO3VCQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRTtnQkFHaEIsTUFBTTtzQkFBZCxLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBXY29Nb2RhbEFsZXJ0Q29uZmlnQWN0aW9uc1R5cGVzLCBXY29Nb2RhbEFsZXJ0Q29uZmlnVHlwZXMgfSBmcm9tICcuL21vZGFsLWFsZXJ0LnR5cGVzJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd3Y28tbW9kYWwtYWxlcnQnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL21vZGFsLWFsZXJ0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbW9kYWwtYWxlcnQuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgV2NvTW9kYWxBbGVydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIHByaXZhdGUgREVGQVVMVF9WQUxVRVMgPSB7XG4gICAgc2hvdzogZmFsc2UsXG4gICAgc2hvd0ljb246IHRydWUsXG4gICAgdGl0bGU6ICcnLFxuICAgIG1lc3NhZ2U6ICcnLFxuICAgIGFjdGlvbnM6IFtdLFxuICAgIGhpZGVDbG9zZTogZmFsc2UsXG4gIH07XG5cbiAgQElucHV0KCkgc2V0IHNob3codmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNoYW5nZVZhbHVlcyh2YWx1ZSwgJ3Nob3cnKTtcbiAgfVxuICBASW5wdXQoKSBzZXQgc2hvd0ljb24odmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNoYW5nZVZhbHVlcyh2YWx1ZSwgJ3Nob3dJY29uJyk7XG4gIH1cbiAgQElucHV0KCkgc2V0IHRpdGxlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNoYW5nZVZhbHVlcyh2YWx1ZSwgJ3RpdGxlJyk7XG4gIH1cbiAgQElucHV0KCkgc2V0IG1lc3NhZ2UodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuY2hhbmdlVmFsdWVzKHZhbHVlLCAnbWVzc2FnZScpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IG1hdGVyaWFsSWNvbih2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5jaGFuZ2VWYWx1ZXModmFsdWUsICdtYXRlcmlhbEljb24nKTtcbiAgfVxuXG4gIEBJbnB1dCgpIHNldCB0eXBlKFxuICAgIHZhbHVlOiAnZXJyb3InIHwgJ3dhcm5pbmcnIHwgJ3N1Y2Nlc3MnIHwgJ2luZm8nIHwgJ2xvYWRpbmcnXG4gICkge1xuICAgIHRoaXMuY2hhbmdlVmFsdWVzKHZhbHVlLCAndHlwZScpO1xuICB9XG5cbiAgQElucHV0KCkgc2V0IGhpZGVDbG9zZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuY2hhbmdlVmFsdWVzKHZhbHVlLCAnaGlkZUNsb3NlJyk7XG4gIH1cblxuICBASW5wdXQoKSBzZXQgYWN0aW9ucyh2YWx1ZTogV2NvTW9kYWxBbGVydENvbmZpZ0FjdGlvbnNUeXBlc1tdKSB7XG4gICAgdGhpcy5jaGFuZ2VWYWx1ZXModmFsdWUsICdhY3Rpb25zJyk7XG4gIH1cblxuICBASW5wdXQoeyBhbGlhczogJ3NldElkJyB9KSBpZCA9XG4gICAgJ3djby1tb2RhbC1hbGVydC0nICsgTWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDcpO1xuXG4gIEBJbnB1dCgpIGNvbmZpZzogV2NvTW9kYWxBbGVydENvbmZpZ1R5cGVzID0ge1xuICAgIHNob3c6IGZhbHNlLFxuICAgIHNob3dJY29uOiB0cnVlLFxuICAgIHRpdGxlOiAnJyxcbiAgICBtZXNzYWdlOiAnJyxcbiAgICBhY3Rpb25zOiBbXSxcbiAgICBoaWRlQ2xvc2U6IGZhbHNlLFxuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHt9XG5cbiAgbmdPbkNoYW5nZXMoZXZlbnQ6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnRbJ2NvbmZpZyddPy5jdXJyZW50VmFsdWVbJ3Nob3cnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmV2ZW50TW9kYWwoKTtcbiAgICB9XG4gIH1cblxuICBnZXQgdGl0bGUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodGhpcy5jb25maWcudGl0bGUgfHwgJycpO1xuICB9XG5cbiAgZ2V0IG1lc3NhZ2UoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodGhpcy5jb25maWcubWVzc2FnZSB8fCAnJyk7XG4gIH1cblxuICBnZXRCdXR0b25DbGFzcyhhY3Rpb246IFdjb01vZGFsQWxlcnRDb25maWdBY3Rpb25zVHlwZXMpIHtcbiAgICBjb25zdCBjbGFzc2VDb2xvciA9XG4gICAgICBhY3Rpb24uY29sb3IgPT09ICdwcmltYXJ5J1xuICAgICAgICA/ICdidG4tcHJpbWFyeSdcbiAgICAgICAgOiBhY3Rpb24uY29sb3IgPT09ICdzZWNvbmRhcnknXG4gICAgICAgID8gJ2J0bi1zZWNvbmRhcnknXG4gICAgICAgIDogJ2J0bi1uZXV0cmFsJztcbiAgICBjb25zdCBjbGFzc2VPdXRsaW5lID0gYWN0aW9uLm91dGxpbmUgPyAnYnRuLW91dGxpbmUnIDogJyc7XG4gICAgY29uc3QgZXh0cmFDbGFzc2UgPSBhY3Rpb24uZXh0cmFDbGFzc2UgPyBhY3Rpb24uZXh0cmFDbGFzc2UgOiAnJztcbiAgICByZXR1cm4gYHdjby1idG4gYnRuLWZ1bGwgJHtjbGFzc2VDb2xvcn0gJHtjbGFzc2VPdXRsaW5lfSAke2V4dHJhQ2xhc3NlfWA7XG4gIH1cblxuICBnZXQgaWNvbk1hdGVyaWFsKCkge1xuICAgIGNvbnN0IHsgdHlwZSA9ICdpbmZvJyB9ID0gdGhpcy5jb25maWc7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgIHJldHVybiB7IGljb246ICdlcnJvcl9vdXRsaW5lJywgY29sb3I6ICdlcnJvcicgfTtcbiAgICAgIGNhc2UgJ3dhcm5pbmcnOlxuICAgICAgICByZXR1cm4geyBpY29uOiAnd2FybmluZ19hbWJlcicsIGNvbG9yOiAnd2FybmluZycgfTtcbiAgICAgIGNhc2UgJ3N1Y2Nlc3MnOlxuICAgICAgICByZXR1cm4geyBpY29uOiAnY2hlY2tfY2lyY2xlX291dGxpbmUnLCBjb2xvcjogJ3N1Y2Nlc3MnIH07XG4gICAgICBjYXNlICdsb2FkaW5nJzpcbiAgICAgICAgcmV0dXJuIHsgaWNvbjogJ3NwaW5uZXInLCBjb2xvcjogJ2xvYWRpbmcnIH07XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geyBpY29uOiAnaW5mbycsIGNvbG9yOiAnaW5mbycgfTtcbiAgICB9XG4gIH1cblxuICBjaGFuZ2VWYWx1ZXModmFsdWVVcGRhdGU6IGFueSwgbmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5jb25maWcgPSB7XG4gICAgICAuLi50aGlzLkRFRkFVTFRfVkFMVUVTLFxuICAgICAgLi4udGhpcy5jb25maWcsXG4gICAgICBbbmFtZV06IHZhbHVlVXBkYXRlLFxuICAgIH07XG4gICAgdGhpcy5ldmVudE1vZGFsKCk7XG4gIH1cblxuICBtb2RhbENsb3NlKCkge1xuICAgIGNvbnN0IGVsZW1lbnQ6IGFueSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMuaWQpO1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICBlbGVtZW50LmNsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgZXZlbnRNb2RhbCgpIHtcbiAgICBjb25zdCBzaG93ID0gdGhpcy5jb25maWcuc2hvdztcbiAgICBjb25zdCBlbGVtZW50OiBhbnkgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmlkKTtcbiAgICBpZiAoc2hvdyAmJiBlbGVtZW50KSB7XG4gICAgICBpZiAodGhpcy5jb25maWcuaGlkZUNsb3NlKSB7XG4gICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gZXZlbnQua2V5O1xuICAgICAgICAgIGlmIChrZXkgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBlbGVtZW50LnNob3dNb2RhbCgpO1xuICAgICAgdGhpcy5jb25maWcuc2hvdyA9IGZhbHNlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1vZGFsQ2xvc2UoKTtcbiAgICB9XG4gIH1cbn1cbiIsIjxkaWFsb2cgY2xhc3M9XCJ3Y28tbW9kYWxcIiBbaWRdPVwiaWRcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1tb2RhbD1cInRydWVcIj5cbiAgPG1haW4+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb25maWcuaGlkZUNsb3NlXCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwid2NvLW1vZGFsLS1jbG9zZVwiIChjbGljayk9XCJtb2RhbENsb3NlKClcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiPmNsb3NlPC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPGRpdiBbY2xhc3NdPVwiJ3djby1tb2RhbENvbmZpcm0gJyArIGljb25NYXRlcmlhbC5jb2xvclwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbmZpZy5zaG93SWNvblwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIndjby1tb2RhbENvbmZpcm0tLWljb25cIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZmlnLnR5cGUgIT09ICdsb2FkaW5nJ1wiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtcm91bmRcIj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbmZpZy5tYXRlcmlhbEljb247IGVsc2UgaWNvblRlbXBsYXRlXCI+XG4gICAgICAgICAgICAgICAge3tjb25maWcubWF0ZXJpYWxJY29ufX1cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaWNvblRlbXBsYXRlPlxuICAgICAgICAgICAgICAgIHt7IGljb25NYXRlcmlhbC5pY29ufX1cbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29uZmlnLnR5cGUgPT09ICdsb2FkaW5nJ1wiPlxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cInNwaW5uZXJcIiB2aWV3Qm94PVwiMCAwIDY2IDY2XCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwibG9hZGluZy1pY29uXCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJ2YXIoLS13Y28tbW9kYWwtY29sb3ItdHlwZSlcIiBzdHJva2Utd2lkdGg9XCI2XCJcbiAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgY3g9XCIzM1wiIGN5PVwiMzNcIiByPVwiMzBcIj48L2NpcmNsZT5cbiAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb25maWcudGl0bGVcIj5cbiAgICAgICAgPGgzIGNsYXNzPVwid2NvLW1vZGFsQ29uZmlybS0tdGl0bGVcIiBbaW5uZXJIVE1MXT1cInRpdGxlXCI+PC9oMz5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbmZpZy5tZXNzYWdlXCI+ICBcbiAgICAgICAgPHAgY2xhc3M9XCJ3Y28tbW9kYWxDb25maXJtLS1tZXNzYWdlXCIgW2lubmVySFRNTF09XCJtZXNzYWdlXCI+PC9wPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwid2NvLW1vZGFsQ29uZmlybS0tYWN0aW9uc1wiIFtjbGFzcy5tb2RhbENvbmZpcm0tLWFjdGlvbnMtc2l6ZV09XCJjb25maWcuYWN0aW9ucy5sZW5ndGggPT09IDFcIlxuICAgICAgICAqbmdJZj1cImNvbmZpZy5hY3Rpb25zICYmIGNvbmZpZy5hY3Rpb25zLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgW2NsYXNzXT1cImdldEJ1dHRvbkNsYXNzKGFjdGlvbilcIiAoY2xpY2spPVwiYWN0aW9uLmFjdGlvbigpXCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgYWN0aW9uIG9mIGNvbmZpZy5hY3Rpb25zOyBsZXQgaW5kZXggPSBpbmRleFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtcm91bmRcIiAqbmdJZj1cImFjdGlvbi5tYXRlcmlhbEljb25MZWZ0XCI+e3thY3Rpb24ubWF0ZXJpYWxJY29uTGVmdH19PC9zcGFuPlxuICAgICAgICAgIHt7YWN0aW9uLnRleHR9fVxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtaWNvbnMtcm91bmRcIiAqbmdJZj1cImFjdGlvbi5tYXRlcmlhbEljb25SaWdodFwiPnt7YWN0aW9uLm1hdGVyaWFsSWNvblJpZ2h0fX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbWFpbj5cbjwvZGlhbG9nPiJdfQ==