@hestia-earth/ui-components 0.27.6 → 0.27.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -42,16 +42,17 @@ export class NodeLogsFileComponent {
42
42
  this.selectedLevel = signal(Level.info);
43
43
  this.fileToExt = fileToExt;
44
44
  this.nodeLogLines = computed(() => this.allLogs()
45
- .filter(({ level }) => levels.indexOf(level) >= levels.indexOf(this.selectedLevel()))
46
- .filter(({ code }) => (!this.modelFilter() || code.toLocaleLowerCase().includes(`model=${this.modelFilter().toLowerCase()}`)) &&
45
+ ?.filter(({ level }) => levels.indexOf(level) >= levels.indexOf(this.selectedLevel()))
46
+ ?.filter(({ code }) => (!this.modelFilter() || code.toLocaleLowerCase().includes(`model=${this.modelFilter().toLowerCase()}`)) &&
47
47
  (!this.termFilter() || code.toLocaleLowerCase().includes(`term=${this.termFilter().toLowerCase()}`))));
48
48
  this.csvContent = computed(() => this.domSanitizer.bypassSecurityTrustResourceUrl(`data:text/html;charset=utf-8,${encodeURIComponent(logToCsv(this.allLogs()))}`));
49
+ this.csvFilename = computed(() => fileToExt(this.node()?.['@id'], 'csv'));
49
50
  }
50
51
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: NodeLogsFileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
51
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: NodeLogsFileComponent, isStandalone: true, selector: "he-node-logs-file", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, dataState: { classPropertyName: "dataState", publicName: "dataState", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"is-relative\">\n <div class=\"copy-clipboard\">\n <div class=\"field has-addons\">\n @if (showFilters()) {\n <div class=\"control\">\n <input\n class=\"input is-secondary is-small\"\n [ngModel]=\"modelFilter()\"\n id=\"modelFilter\"\n (input)=\"modelFilter.set($event.target.value)\"\n placeholder=\"Filter by Method / Model\" />\n </div>\n <div class=\"control\">\n <input\n class=\"input is-secondary is-small\"\n [ngModel]=\"termFilter()\"\n id=\"termFilter\"\n (input)=\"termFilter.set($event.target.value)\"\n placeholder=\"Filter by Term\" />\n </div>\n <div class=\"control\">\n <div class=\"select is-secondary is-small\">\n <select [ngModel]=\"selectedLevel()\" (change)=\"selectedLevel.set($event.target.value)\" id=\"selectedLevel\">\n @for (level of Level | keys; track level) {\n <option [value]=\"level.value\">{{ level.value }}</option>\n }\n </select>\n </div>\n </div>\n }\n <div class=\"control\">\n <button\n class=\"button is-small\"\n (click)=\"showFilters.set(!showFilters())\"\n [ngbTooltip]=\"showFilters() ? 'Hide filters' : 'Show filters'\"\n placement=\"bottom\"\n container=\"body\">\n <fa-icon [icon]=\"faFilter\"></fa-icon>\n </button>\n </div>\n <div class=\"control\">\n <he-clipboard\n clipboardClass=\"button is-secondary is-small\"\n [value]=\"nodeLog()\"\n [hideText]=\"true\"\n [icon]=\"farClone\"\n size=\"lg\"\n rotate=\"180\"></he-clipboard>\n </div>\n <div class=\"control\">\n <a\n class=\"button is-info is-small\"\n target=\"_blank\"\n [href]=\"csvContent()\"\n [download]=\"fileToExt(node?.['@id'], 'csv')\">\n <fa-icon [icon]=\"faDownload\"></fa-icon>\n </a>\n </div>\n </div>\n </div>\n\n <pre class=\"pl-3 pt-3 ml-3\">@for (line of nodeLogLines(); track line) {\n <code class=\"is-block {{line.class}}\">{{line.data.timestamp}} {{('[' + line.data.level + ']:').padEnd(9, ' ')}} {{line.data.message}}</code>\n }</pre>\n</div>\n", styles: [":host{display:block}pre{background-color:inherit;color:inherit;min-height:38px;max-height:500px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "component", type: ClipboardComponent, selector: "he-clipboard", inputs: ["icon", "value", "disabled", "hideText", "size", "rotate", "clipboardClass"] }, { kind: "pipe", type: KeysPipe, name: "keys" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
52
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: NodeLogsFileComponent, isStandalone: true, selector: "he-node-logs-file", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, dataState: { classPropertyName: "dataState", publicName: "dataState", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"is-relative\">\n <div class=\"copy-clipboard\">\n <div class=\"field has-addons\">\n @if (showFilters()) {\n <div class=\"control\">\n <input\n class=\"input is-secondary is-small\"\n [ngModel]=\"modelFilter()\"\n id=\"modelFilter\"\n (input)=\"modelFilter.set($event.target.value)\"\n placeholder=\"Filter by Method / Model\" />\n </div>\n <div class=\"control\">\n <input\n class=\"input is-secondary is-small\"\n [ngModel]=\"termFilter()\"\n id=\"termFilter\"\n (input)=\"termFilter.set($event.target.value)\"\n placeholder=\"Filter by Term\" />\n </div>\n <div class=\"control\">\n <div class=\"select is-secondary is-small\">\n <select [ngModel]=\"selectedLevel()\" (change)=\"selectedLevel.set($event.target.value)\" id=\"selectedLevel\">\n @for (level of Level | keys; track level) {\n <option [value]=\"level.value\">{{ level.value }}</option>\n }\n </select>\n </div>\n </div>\n }\n <div class=\"control\">\n <button\n class=\"button is-small\"\n (click)=\"showFilters.set(!showFilters())\"\n [ngbTooltip]=\"showFilters() ? 'Hide filters' : 'Show filters'\"\n placement=\"bottom\"\n container=\"body\">\n <fa-icon [icon]=\"faFilter\"></fa-icon>\n </button>\n </div>\n <div class=\"control\">\n <he-clipboard\n clipboardClass=\"button is-secondary is-small\"\n [value]=\"nodeLog()\"\n [hideText]=\"true\"\n [icon]=\"farClone\"\n size=\"lg\"\n rotate=\"180\"></he-clipboard>\n </div>\n <div class=\"control\">\n <a class=\"button is-info is-small\" target=\"_blank\" [href]=\"csvContent()\" [download]=\"csvFilename()\">\n <fa-icon [icon]=\"faDownload\"></fa-icon>\n </a>\n </div>\n </div>\n </div>\n\n <pre class=\"pl-3 pt-3 ml-3\">\n @for (line of nodeLogLines(); track line) {\n <code class=\"is-block {{line.class}}\">{{line.data.timestamp}} {{('[' + line.data.level + ']:').padEnd(9, ' ')}} {{line.data.message}}</code>\n }\n </pre>\n</div>\n", styles: [":host{display:block}pre{background-color:inherit;color:inherit;min-height:38px;max-height:500px;font-size:0}pre>code{font-size:14px;line-height:20px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "component", type: ClipboardComponent, selector: "he-clipboard", inputs: ["icon", "value", "disabled", "hideText", "size", "rotate", "clipboardClass"] }, { kind: "pipe", type: KeysPipe, name: "keys" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
52
53
  }
53
54
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: NodeLogsFileComponent, decorators: [{
54
55
  type: Component,
55
- args: [{ selector: 'he-node-logs-file', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [FormsModule, NgbTooltip, FaIconComponent, ClipboardComponent, AsyncPipe, KeysPipe], template: "<div class=\"is-relative\">\n <div class=\"copy-clipboard\">\n <div class=\"field has-addons\">\n @if (showFilters()) {\n <div class=\"control\">\n <input\n class=\"input is-secondary is-small\"\n [ngModel]=\"modelFilter()\"\n id=\"modelFilter\"\n (input)=\"modelFilter.set($event.target.value)\"\n placeholder=\"Filter by Method / Model\" />\n </div>\n <div class=\"control\">\n <input\n class=\"input is-secondary is-small\"\n [ngModel]=\"termFilter()\"\n id=\"termFilter\"\n (input)=\"termFilter.set($event.target.value)\"\n placeholder=\"Filter by Term\" />\n </div>\n <div class=\"control\">\n <div class=\"select is-secondary is-small\">\n <select [ngModel]=\"selectedLevel()\" (change)=\"selectedLevel.set($event.target.value)\" id=\"selectedLevel\">\n @for (level of Level | keys; track level) {\n <option [value]=\"level.value\">{{ level.value }}</option>\n }\n </select>\n </div>\n </div>\n }\n <div class=\"control\">\n <button\n class=\"button is-small\"\n (click)=\"showFilters.set(!showFilters())\"\n [ngbTooltip]=\"showFilters() ? 'Hide filters' : 'Show filters'\"\n placement=\"bottom\"\n container=\"body\">\n <fa-icon [icon]=\"faFilter\"></fa-icon>\n </button>\n </div>\n <div class=\"control\">\n <he-clipboard\n clipboardClass=\"button is-secondary is-small\"\n [value]=\"nodeLog()\"\n [hideText]=\"true\"\n [icon]=\"farClone\"\n size=\"lg\"\n rotate=\"180\"></he-clipboard>\n </div>\n <div class=\"control\">\n <a\n class=\"button is-info is-small\"\n target=\"_blank\"\n [href]=\"csvContent()\"\n [download]=\"fileToExt(node?.['@id'], 'csv')\">\n <fa-icon [icon]=\"faDownload\"></fa-icon>\n </a>\n </div>\n </div>\n </div>\n\n <pre class=\"pl-3 pt-3 ml-3\">@for (line of nodeLogLines(); track line) {\n <code class=\"is-block {{line.class}}\">{{line.data.timestamp}} {{('[' + line.data.level + ']:').padEnd(9, ' ')}} {{line.data.message}}</code>\n }</pre>\n</div>\n", styles: [":host{display:block}pre{background-color:inherit;color:inherit;min-height:38px;max-height:500px}\n"] }]
56
+ args: [{ selector: 'he-node-logs-file', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [FormsModule, NgbTooltip, FaIconComponent, ClipboardComponent, AsyncPipe, KeysPipe], template: "<div class=\"is-relative\">\n <div class=\"copy-clipboard\">\n <div class=\"field has-addons\">\n @if (showFilters()) {\n <div class=\"control\">\n <input\n class=\"input is-secondary is-small\"\n [ngModel]=\"modelFilter()\"\n id=\"modelFilter\"\n (input)=\"modelFilter.set($event.target.value)\"\n placeholder=\"Filter by Method / Model\" />\n </div>\n <div class=\"control\">\n <input\n class=\"input is-secondary is-small\"\n [ngModel]=\"termFilter()\"\n id=\"termFilter\"\n (input)=\"termFilter.set($event.target.value)\"\n placeholder=\"Filter by Term\" />\n </div>\n <div class=\"control\">\n <div class=\"select is-secondary is-small\">\n <select [ngModel]=\"selectedLevel()\" (change)=\"selectedLevel.set($event.target.value)\" id=\"selectedLevel\">\n @for (level of Level | keys; track level) {\n <option [value]=\"level.value\">{{ level.value }}</option>\n }\n </select>\n </div>\n </div>\n }\n <div class=\"control\">\n <button\n class=\"button is-small\"\n (click)=\"showFilters.set(!showFilters())\"\n [ngbTooltip]=\"showFilters() ? 'Hide filters' : 'Show filters'\"\n placement=\"bottom\"\n container=\"body\">\n <fa-icon [icon]=\"faFilter\"></fa-icon>\n </button>\n </div>\n <div class=\"control\">\n <he-clipboard\n clipboardClass=\"button is-secondary is-small\"\n [value]=\"nodeLog()\"\n [hideText]=\"true\"\n [icon]=\"farClone\"\n size=\"lg\"\n rotate=\"180\"></he-clipboard>\n </div>\n <div class=\"control\">\n <a class=\"button is-info is-small\" target=\"_blank\" [href]=\"csvContent()\" [download]=\"csvFilename()\">\n <fa-icon [icon]=\"faDownload\"></fa-icon>\n </a>\n </div>\n </div>\n </div>\n\n <pre class=\"pl-3 pt-3 ml-3\">\n @for (line of nodeLogLines(); track line) {\n <code class=\"is-block {{line.class}}\">{{line.data.timestamp}} {{('[' + line.data.level + ']:').padEnd(9, ' ')}} {{line.data.message}}</code>\n }\n </pre>\n</div>\n", styles: [":host{display:block}pre{background-color:inherit;color:inherit;min-height:38px;max-height:500px;font-size:0}pre>code{font-size:14px;line-height:20px}\n"] }]
56
57
  }] });
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1sb2dzLWZpbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1sb2dzLWZpbGUvbm9kZS1sb2dzLWZpbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1sb2dzLWZpbGUvbm9kZS1sb2dzLWZpbGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEcsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQWEsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDekUsT0FBTyxFQUFFLE9BQU8sSUFBSSxRQUFRLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENB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QUFFLEVBQUUsQ0FDWCxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdkcsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQ3ZHLENBQ0osQ0FBQztRQUNRLGVBQVUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQ25DLElBQUksQ0FBQyxZQUFZLENBQUMsOEJBQThCLENBQzlDLGdDQUFnQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUMvRSxDQUNGLENBQUM7S0FDSDs4R0F0RFkscUJBQXFCO2tHQUFyQixxQkFBcUIsaVZDNUJsQyw2MEVBaUVBLDJKRHZDWSxXQUFXLDBnQ0FBRSxVQUFVLDJUQUFFLGVBQWUsa1BBQUUsa0JBQWtCLDJJQUFhLFFBQVE7OzJGQUVoRixxQkFBcUI7a0JBUmpDLFNBQVM7K0JBQ0UsbUJBQW1CLG1CQUdaLHVCQUF1QixDQUFDLE1BQU0sY0FDbkMsSUFBSSxXQUNQLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbmplY3QsIGlucHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBBc3luY1BpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgbWVyZ2VNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERhdGFTdGF0ZSwgZmlsZVRvRXh0IH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9hcGknO1xuaW1wb3J0IHsgSlNPTkxELCBOb2RlVHlwZSB9IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcbmltcG9ydCB7IEZhSWNvbkNvbXBvbmVudCB9IGZyb20gJ0Bmb3J0YXdlc29tZS9hbmd1bGFyLWZvbnRhd2Vzb21lJztcbmltcG9ydCB7IGZhRG93bmxvYWQsIGZhRmlsdGVyIH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtc29saWQtc3ZnLWljb25zJztcbmltcG9ydCB7IGZhQ2xvbmUgYXMgZmFyQ2xvbmUgfSBmcm9tICdAZm9ydGF3ZXNvbWUvZnJlZS1yZWd1bGFyLXN2Zy1pY29ucyc7XG5pbXBvcnQgeyBOZ2JUb29sdGlwIH0gZnJvbSAnQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXAnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBpc1VuZGVmaW5lZCB9IGZyb20gJ0BoZXN0aWEtZWFydGgvdXRpbHMnO1xuXG5pbXBvcnQgeyBIZU5vZGVTZXJ2aWNlIH0gZnJvbSAnLi4vbm9kZS5zZXJ2aWNlJztcbmltcG9ydCB7IExldmVsLCBsZXZlbHMsIHBhcnNlTGluZXMsIGxvZ1RvQ3N2IH0gZnJvbSAnLi4vLi4vY29tbW9uL2xvZ3MtdXRpbHMnO1xuaW1wb3J0IHsgS2V5c1BpcGUgfSBmcm9tICcuLi8uLi9jb21tb24va2V5cy5waXBlJztcbmltcG9ydCB7IENsaXBib2FyZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL2NvbW1vbi9jbGlwYm9hcmQvY2xpcGJvYXJkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZERlZXAgfSBmcm9tICcuLi8uLi9jb21tb24vcnhqcy11dGlscyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlLW5vZGUtbG9ncy1maWxlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL25vZGUtbG9ncy1maWxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbm9kZS1sb2dzLWZpbGUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtGb3Jtc01vZHVsZSwgTmdiVG9vbHRpcCwgRmFJY29uQ29tcG9uZW50LCBDbGlwYm9hcmRDb21wb25lbnQsIEFzeW5jUGlwZSwgS2V5c1BpcGVdXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVMb2dzRmlsZUNvbXBvbmVudCB7XG4gIHByaXZhdGUgZG9tU2FuaXRpemVyID0gaW5qZWN0KERvbVNhbml0aXplcik7XG4gIHByaXZhdGUgbm9kZVNlcnZpY2UgPSBpbmplY3QoSGVOb2RlU2VydmljZSk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhRmlsdGVyID0gZmFGaWx0ZXI7XG4gIHByb3RlY3RlZCByZWFkb25seSBmYURvd25sb2FkID0gZmFEb3dubG9hZDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGZhckNsb25lID0gZmFyQ2xvbmU7XG5cbiAgcHJvdGVjdGVkIG5vZGUgPSBpbnB1dC5yZXF1aXJlZDxKU09OTEQ8Tm9kZVR5cGU+PigpO1xuICBwcm90ZWN0ZWQgZGF0YVN0YXRlID0gaW5wdXQ8RGF0YVN0YXRlPigpO1xuXG4gIHByaXZhdGUgbm9kZSQgPSB0b09ic2VydmFibGUodGhpcy5ub2RlKTtcbiAgcHJpdmF0ZSBub2RlTG9nJCA9IHRoaXMubm9kZSQucGlwZShcbiAgICBmaWx0ZXIobm9kZSA9PiAhaXNVbmRlZmluZWQobm9kZSkpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkRGVlcCgpLFxuICAgIHRhcCgoKSA9PiB0aGlzLmxvYWRpbmcuc2V0KHRydWUpKSxcbiAgICBtZXJnZU1hcChub2RlID0+XG4gICAgICB0aGlzLm5vZGVTZXJ2aWNlLmdldExvZyh7XG4gICAgICAgIC4uLm5vZGUsXG4gICAgICAgIGRhdGFTdGF0ZTogdGhpcy5kYXRhU3RhdGUoKVxuICAgICAgfSlcbiAgICApLFxuICAgIG1hcCh2YWx1ZSA9PiB2YWx1ZSB8fCAnTm8gbG9ncy4nKSxcbiAgICB0YXAoKCkgPT4gdGhpcy5sb2FkaW5nLnNldChmYWxzZSkpXG4gICk7XG4gIHByb3RlY3RlZCBub2RlTG9nID0gdG9TaWduYWwodGhpcy5ub2RlTG9nJCk7XG4gIHByaXZhdGUgYWxsTG9ncyQgPSB0aGlzLm5vZGVMb2ckLnBpcGUoXG4gICAgbWFwKHZhbHVlID0+IHBhcnNlTGluZXModmFsdWUpLmZpbHRlcigoeyBkYXRhIH0pID0+IGRhdGEubG9nZ2VyID09PSAnaGVzdGlhX2VhcnRoLm1vZGVscycpKVxuICApO1xuICBwcml2YXRlIGFsbExvZ3MgPSB0b1NpZ25hbCh0aGlzLmFsbExvZ3MkKTtcblxuICBwcm90ZWN0ZWQgTGV2ZWwgPSBMZXZlbDtcbiAgcHJvdGVjdGVkIGxvYWRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICBwcm90ZWN0ZWQgc2hvd0ZpbHRlcnMgPSBzaWduYWwoZmFsc2UpO1xuICBwcm90ZWN0ZWQgbW9kZWxGaWx0ZXIgPSBzaWduYWwoJycpO1xuICBwcm90ZWN0ZWQgdGVybUZpbHRlciA9IHNpZ25hbCgnJyk7XG4gIHByb3RlY3RlZCBzZWxlY3RlZExldmVsID0gc2lnbmFsKExldmVsLmluZm8pO1xuXG4gIHByb3RlY3RlZCBmaWxlVG9FeHQgPSBmaWxlVG9FeHQ7XG5cbiAgcHJvdGVjdGVkIG5vZGVMb2dMaW5lcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5hbGxMb2dzKClcbiAgICAgIC5maWx0ZXIoKHsgbGV2ZWwgfSkgPT4gbGV2ZWxzLmluZGV4T2YobGV2ZWwpID49IGxldmVscy5pbmRleE9mKHRoaXMuc2VsZWN0ZWRMZXZlbCgpKSlcbiAgICAgIC5maWx0ZXIoXG4gICAgICAgICh7IGNvZGUgfSkgPT5cbiAgICAgICAgICAoIXRoaXMubW9kZWxGaWx0ZXIoKSB8fCBjb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoYG1vZGVsPSR7dGhpcy5tb2RlbEZpbHRlcigpLnRvTG93ZXJDYXNlKCl9YCkpICYmXG4gICAgICAgICAgKCF0aGlzLnRlcm1GaWx0ZXIoKSB8fCBjb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoYHRlcm09JHt0aGlzLnRlcm1GaWx0ZXIoKS50b0xvd2VyQ2FzZSgpfWApKVxuICAgICAgKVxuICApO1xuICBwcm90ZWN0ZWQgY3N2Q29udGVudCA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKFxuICAgICAgYGRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgsJHtlbmNvZGVVUklDb21wb25lbnQobG9nVG9Dc3YodGhpcy5hbGxMb2dzKCkpKX1gXG4gICAgKVxuICApO1xufVxuIiwiPGRpdiBjbGFzcz1cImlzLXJlbGF0aXZlXCI+XG4gIDxkaXYgY2xhc3M9XCJjb3B5LWNsaXBib2FyZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zXCI+XG4gICAgICBAaWYgKHNob3dGaWx0ZXJzKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQgaXMtc2Vjb25kYXJ5IGlzLXNtYWxsXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cIm1vZGVsRmlsdGVyKClcIlxuICAgICAgICAgICAgaWQ9XCJtb2RlbEZpbHRlclwiXG4gICAgICAgICAgICAoaW5wdXQpPVwibW9kZWxGaWx0ZXIuc2V0KCRldmVudC50YXJnZXQudmFsdWUpXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmlsdGVyIGJ5IE1ldGhvZCAvIE1vZGVsXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBjbGFzcz1cImlucHV0IGlzLXNlY29uZGFyeSBpcy1zbWFsbFwiXG4gICAgICAgICAgICBbbmdNb2RlbF09XCJ0ZXJtRmlsdGVyKClcIlxuICAgICAgICAgICAgaWQ9XCJ0ZXJtRmlsdGVyXCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJ0ZXJtRmlsdGVyLnNldCgkZXZlbnQudGFyZ2V0LnZhbHVlKVwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZpbHRlciBieSBUZXJtXCIgLz5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdCBpcy1zZWNvbmRhcnkgaXMtc21hbGxcIj5cbiAgICAgICAgICAgIDxzZWxlY3QgW25nTW9kZWxdPVwic2VsZWN0ZWRMZXZlbCgpXCIgKGNoYW5nZSk9XCJzZWxlY3RlZExldmVsLnNldCgkZXZlbnQudGFyZ2V0LnZhbHVlKVwiIGlkPVwic2VsZWN0ZWRMZXZlbFwiPlxuICAgICAgICAgICAgICBAZm9yIChsZXZlbCBvZiBMZXZlbCB8IGtleXM7IHRyYWNrIGxldmVsKSB7XG4gICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwibGV2ZWwudmFsdWVcIj57eyBsZXZlbC52YWx1ZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJidXR0b24gaXMtc21hbGxcIlxuICAgICAgICAgIChjbGljayk9XCJzaG93RmlsdGVycy5zZXQoIXNob3dGaWx0ZXJzKCkpXCJcbiAgICAgICAgICBbbmdiVG9vbHRpcF09XCJzaG93RmlsdGVycygpID8gJ0hpZGUgZmlsdGVycycgOiAnU2hvdyBmaWx0ZXJzJ1wiXG4gICAgICAgICAgcGxhY2VtZW50PVwiYm90dG9tXCJcbiAgICAgICAgICBjb250YWluZXI9XCJib2R5XCI+XG4gICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiZmFGaWx0ZXJcIj48L2ZhLWljb24+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICA8aGUtY2xpcGJvYXJkXG4gICAgICAgICAgY2xpcGJvYXJkQ2xhc3M9XCJidXR0b24gaXMtc2Vjb25kYXJ5IGlzLXNtYWxsXCJcbiAgICAgICAgICBbdmFsdWVdPVwibm9kZUxvZygpXCJcbiAgICAgICAgICBbaGlkZVRleHRdPVwidHJ1ZVwiXG4gICAgICAgICAgW2ljb25dPVwiZmFyQ2xvbmVcIlxuICAgICAgICAgIHNpemU9XCJsZ1wiXG4gICAgICAgICAgcm90YXRlPVwiMTgwXCI+PC9oZS1jbGlwYm9hcmQ+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgIDxhXG4gICAgICAgICAgY2xhc3M9XCJidXR0b24gaXMtaW5mbyBpcy1zbWFsbFwiXG4gICAgICAgICAgdGFyZ2V0PVwiX2JsYW5rXCJcbiAgICAgICAgICBbaHJlZl09XCJjc3ZDb250ZW50KClcIlxuICAgICAgICAgIFtkb3dubG9hZF09XCJmaWxlVG9FeHQobm9kZT8uWydAaWQnXSwgJ2NzdicpXCI+XG4gICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiZmFEb3dubG9hZFwiPjwvZmEtaWNvbj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxwcmUgY2xhc3M9XCJwbC0zIHB0LTMgbWwtM1wiPkBmb3IgKGxpbmUgb2Ygbm9kZUxvZ0xpbmVzKCk7IHRyYWNrIGxpbmUpIHtcbiAgICA8Y29kZSBjbGFzcz1cImlzLWJsb2NrIHt7bGluZS5jbGFzc319XCI+e3tsaW5lLmRhdGEudGltZXN0YW1wfX0ge3soJ1snICsgbGluZS5kYXRhLmxldmVsICsgJ106JykucGFkRW5kKDksICcgJyl9fSB7e2xpbmUuZGF0YS5tZXNzYWdlfX08L2NvZGU+XG4gIH08L3ByZT5cbjwvZGl2PlxuIl19
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1sb2dzLWZpbGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1sb2dzLWZpbGUvbm9kZS1sb2dzLWZpbGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL25vZGUvbm9kZS1sb2dzLWZpbGUvbm9kZS1sb2dzLWZpbGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEcsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNwRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQWEsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDekUsT0FBTyxFQUFFLE9BQU8sSUFBSSxRQUFRLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENB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QUFJLEVBQUUsRUFBRSxFQUFFLENBQ1gsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZHLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLFdBQVcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUN2RyxDQUNKLENBQUM7UUFDUSxlQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUNuQyxJQUFJLENBQUMsWUFBWSxDQUFDLDhCQUE4QixDQUM5QyxnQ0FBZ0Msa0JBQWtCLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FDL0UsQ0FDRixDQUFDO1FBQ1EsZ0JBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7S0FDaEY7OEdBdkRZLHFCQUFxQjtrR0FBckIscUJBQXFCLGlWQzVCbEMsNnhFQStEQSxnTkRyQ1ksV0FBVywwZ0NBQUUsVUFBVSwyVEFBRSxlQUFlLGtQQUFFLGtCQUFrQiwySUFBYSxRQUFROzsyRkFFaEYscUJBQXFCO2tCQVJqQyxTQUFTOytCQUNFLG1CQUFtQixtQkFHWix1QkFBdUIsQ0FBQyxNQUFNLGNBQ25DLElBQUksV0FDUCxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0LCBpbnB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0b09ic2VydmFibGUsIHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgQXN5bmNQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IERvbVNhbml0aXplciB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIG1lcmdlTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBEYXRhU3RhdGUsIGZpbGVUb0V4dCB9IGZyb20gJ0BoZXN0aWEtZWFydGgvYXBpJztcbmltcG9ydCB7IEpTT05MRCwgTm9kZVR5cGUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3NjaGVtYSc7XG5pbXBvcnQgeyBGYUljb25Db21wb25lbnQgfSBmcm9tICdAZm9ydGF3ZXNvbWUvYW5ndWxhci1mb250YXdlc29tZSc7XG5pbXBvcnQgeyBmYURvd25sb2FkLCBmYUZpbHRlciB9IGZyb20gJ0Bmb3J0YXdlc29tZS9mcmVlLXNvbGlkLXN2Zy1pY29ucyc7XG5pbXBvcnQgeyBmYUNsb25lIGFzIGZhckNsb25lIH0gZnJvbSAnQGZvcnRhd2Vzb21lL2ZyZWUtcmVndWxhci1zdmctaWNvbnMnO1xuaW1wb3J0IHsgTmdiVG9vbHRpcCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgaXNVbmRlZmluZWQgfSBmcm9tICdAaGVzdGlhLWVhcnRoL3V0aWxzJztcblxuaW1wb3J0IHsgSGVOb2RlU2VydmljZSB9IGZyb20gJy4uL25vZGUuc2VydmljZSc7XG5pbXBvcnQgeyBMZXZlbCwgbGV2ZWxzLCBwYXJzZUxpbmVzLCBsb2dUb0NzdiB9IGZyb20gJy4uLy4uL2NvbW1vbi9sb2dzLXV0aWxzJztcbmltcG9ydCB7IEtleXNQaXBlIH0gZnJvbSAnLi4vLi4vY29tbW9uL2tleXMucGlwZSc7XG5pbXBvcnQgeyBDbGlwYm9hcmRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb21tb24vY2xpcGJvYXJkL2NsaXBib2FyZC5jb21wb25lbnQnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWREZWVwIH0gZnJvbSAnLi4vLi4vY29tbW9uL3J4anMtdXRpbHMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoZS1ub2RlLWxvZ3MtZmlsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9ub2RlLWxvZ3MtZmlsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25vZGUtbG9ncy1maWxlLmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbRm9ybXNNb2R1bGUsIE5nYlRvb2x0aXAsIEZhSWNvbkNvbXBvbmVudCwgQ2xpcGJvYXJkQ29tcG9uZW50LCBBc3luY1BpcGUsIEtleXNQaXBlXVxufSlcbmV4cG9ydCBjbGFzcyBOb2RlTG9nc0ZpbGVDb21wb25lbnQge1xuICBwcml2YXRlIGRvbVNhbml0aXplciA9IGluamVjdChEb21TYW5pdGl6ZXIpO1xuICBwcml2YXRlIG5vZGVTZXJ2aWNlID0gaW5qZWN0KEhlTm9kZVNlcnZpY2UpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBmYUZpbHRlciA9IGZhRmlsdGVyO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmFEb3dubG9hZCA9IGZhRG93bmxvYWQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBmYXJDbG9uZSA9IGZhckNsb25lO1xuXG4gIHByb3RlY3RlZCBub2RlID0gaW5wdXQucmVxdWlyZWQ8SlNPTkxEPE5vZGVUeXBlPj4oKTtcbiAgcHJvdGVjdGVkIGRhdGFTdGF0ZSA9IGlucHV0PERhdGFTdGF0ZT4oKTtcblxuICBwcml2YXRlIG5vZGUkID0gdG9PYnNlcnZhYmxlKHRoaXMubm9kZSk7XG4gIHByaXZhdGUgbm9kZUxvZyQgPSB0aGlzLm5vZGUkLnBpcGUoXG4gICAgZmlsdGVyKG5vZGUgPT4gIWlzVW5kZWZpbmVkKG5vZGUpKSxcbiAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZERlZXAoKSxcbiAgICB0YXAoKCkgPT4gdGhpcy5sb2FkaW5nLnNldCh0cnVlKSksXG4gICAgbWVyZ2VNYXAobm9kZSA9PlxuICAgICAgdGhpcy5ub2RlU2VydmljZS5nZXRMb2coe1xuICAgICAgICAuLi5ub2RlLFxuICAgICAgICBkYXRhU3RhdGU6IHRoaXMuZGF0YVN0YXRlKClcbiAgICAgIH0pXG4gICAgKSxcbiAgICBtYXAodmFsdWUgPT4gdmFsdWUgfHwgJ05vIGxvZ3MuJyksXG4gICAgdGFwKCgpID0+IHRoaXMubG9hZGluZy5zZXQoZmFsc2UpKVxuICApO1xuICBwcm90ZWN0ZWQgbm9kZUxvZyA9IHRvU2lnbmFsKHRoaXMubm9kZUxvZyQpO1xuICBwcml2YXRlIGFsbExvZ3MkID0gdGhpcy5ub2RlTG9nJC5waXBlKFxuICAgIG1hcCh2YWx1ZSA9PiBwYXJzZUxpbmVzKHZhbHVlKS5maWx0ZXIoKHsgZGF0YSB9KSA9PiBkYXRhLmxvZ2dlciA9PT0gJ2hlc3RpYV9lYXJ0aC5tb2RlbHMnKSlcbiAgKTtcbiAgcHJpdmF0ZSBhbGxMb2dzID0gdG9TaWduYWwodGhpcy5hbGxMb2dzJCk7XG5cbiAgcHJvdGVjdGVkIExldmVsID0gTGV2ZWw7XG4gIHByb3RlY3RlZCBsb2FkaW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJvdGVjdGVkIHNob3dGaWx0ZXJzID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJvdGVjdGVkIG1vZGVsRmlsdGVyID0gc2lnbmFsKCcnKTtcbiAgcHJvdGVjdGVkIHRlcm1GaWx0ZXIgPSBzaWduYWwoJycpO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRMZXZlbCA9IHNpZ25hbChMZXZlbC5pbmZvKTtcblxuICBwcm90ZWN0ZWQgZmlsZVRvRXh0ID0gZmlsZVRvRXh0O1xuXG4gIHByb3RlY3RlZCBub2RlTG9nTGluZXMgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuYWxsTG9ncygpXG4gICAgICA/LmZpbHRlcigoeyBsZXZlbCB9KSA9PiBsZXZlbHMuaW5kZXhPZihsZXZlbCkgPj0gbGV2ZWxzLmluZGV4T2YodGhpcy5zZWxlY3RlZExldmVsKCkpKVxuICAgICAgPy5maWx0ZXIoXG4gICAgICAgICh7IGNvZGUgfSkgPT5cbiAgICAgICAgICAoIXRoaXMubW9kZWxGaWx0ZXIoKSB8fCBjb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoYG1vZGVsPSR7dGhpcy5tb2RlbEZpbHRlcigpLnRvTG93ZXJDYXNlKCl9YCkpICYmXG4gICAgICAgICAgKCF0aGlzLnRlcm1GaWx0ZXIoKSB8fCBjb2RlLnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoYHRlcm09JHt0aGlzLnRlcm1GaWx0ZXIoKS50b0xvd2VyQ2FzZSgpfWApKVxuICAgICAgKVxuICApO1xuICBwcm90ZWN0ZWQgY3N2Q29udGVudCA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5kb21TYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdFJlc291cmNlVXJsKFxuICAgICAgYGRhdGE6dGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgsJHtlbmNvZGVVUklDb21wb25lbnQobG9nVG9Dc3YodGhpcy5hbGxMb2dzKCkpKX1gXG4gICAgKVxuICApO1xuICBwcm90ZWN0ZWQgY3N2RmlsZW5hbWUgPSBjb21wdXRlZCgoKSA9PiBmaWxlVG9FeHQodGhpcy5ub2RlKCk/LlsnQGlkJ10sICdjc3YnKSk7XG59XG4iLCI8ZGl2IGNsYXNzPVwiaXMtcmVsYXRpdmVcIj5cbiAgPGRpdiBjbGFzcz1cImNvcHktY2xpcGJvYXJkXCI+XG4gICAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnNcIj5cbiAgICAgIEBpZiAoc2hvd0ZpbHRlcnMoKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiPlxuICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgY2xhc3M9XCJpbnB1dCBpcy1zZWNvbmRhcnkgaXMtc21hbGxcIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwibW9kZWxGaWx0ZXIoKVwiXG4gICAgICAgICAgICBpZD1cIm1vZGVsRmlsdGVyXCJcbiAgICAgICAgICAgIChpbnB1dCk9XCJtb2RlbEZpbHRlci5zZXQoJGV2ZW50LnRhcmdldC52YWx1ZSlcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJGaWx0ZXIgYnkgTWV0aG9kIC8gTW9kZWxcIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGNsYXNzPVwiaW5wdXQgaXMtc2Vjb25kYXJ5IGlzLXNtYWxsXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInRlcm1GaWx0ZXIoKVwiXG4gICAgICAgICAgICBpZD1cInRlcm1GaWx0ZXJcIlxuICAgICAgICAgICAgKGlucHV0KT1cInRlcm1GaWx0ZXIuc2V0KCRldmVudC50YXJnZXQudmFsdWUpXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRmlsdGVyIGJ5IFRlcm1cIiAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0IGlzLXNlY29uZGFyeSBpcy1zbWFsbFwiPlxuICAgICAgICAgICAgPHNlbGVjdCBbbmdNb2RlbF09XCJzZWxlY3RlZExldmVsKClcIiAoY2hhbmdlKT1cInNlbGVjdGVkTGV2ZWwuc2V0KCRldmVudC50YXJnZXQudmFsdWUpXCIgaWQ9XCJzZWxlY3RlZExldmVsXCI+XG4gICAgICAgICAgICAgIEBmb3IgKGxldmVsIG9mIExldmVsIHwga2V5czsgdHJhY2sgbGV2ZWwpIHtcbiAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJsZXZlbC52YWx1ZVwiPnt7IGxldmVsLnZhbHVlIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiXG4gICAgICAgICAgKGNsaWNrKT1cInNob3dGaWx0ZXJzLnNldCghc2hvd0ZpbHRlcnMoKSlcIlxuICAgICAgICAgIFtuZ2JUb29sdGlwXT1cInNob3dGaWx0ZXJzKCkgPyAnSGlkZSBmaWx0ZXJzJyA6ICdTaG93IGZpbHRlcnMnXCJcbiAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b21cIlxuICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIj5cbiAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJmYUZpbHRlclwiPjwvZmEtaWNvbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb250cm9sXCI+XG4gICAgICAgIDxoZS1jbGlwYm9hcmRcbiAgICAgICAgICBjbGlwYm9hcmRDbGFzcz1cImJ1dHRvbiBpcy1zZWNvbmRhcnkgaXMtc21hbGxcIlxuICAgICAgICAgIFt2YWx1ZV09XCJub2RlTG9nKClcIlxuICAgICAgICAgIFtoaWRlVGV4dF09XCJ0cnVlXCJcbiAgICAgICAgICBbaWNvbl09XCJmYXJDbG9uZVwiXG4gICAgICAgICAgc2l6ZT1cImxnXCJcbiAgICAgICAgICByb3RhdGU9XCIxODBcIj48L2hlLWNsaXBib2FyZD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJidXR0b24gaXMtaW5mbyBpcy1zbWFsbFwiIHRhcmdldD1cIl9ibGFua1wiIFtocmVmXT1cImNzdkNvbnRlbnQoKVwiIFtkb3dubG9hZF09XCJjc3ZGaWxlbmFtZSgpXCI+XG4gICAgICAgICAgPGZhLWljb24gW2ljb25dPVwiZmFEb3dubG9hZFwiPjwvZmEtaWNvbj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxwcmUgY2xhc3M9XCJwbC0zIHB0LTMgbWwtM1wiPlxuICAgIEBmb3IgKGxpbmUgb2Ygbm9kZUxvZ0xpbmVzKCk7IHRyYWNrIGxpbmUpIHtcbiAgICAgIDxjb2RlIGNsYXNzPVwiaXMtYmxvY2sge3tsaW5lLmNsYXNzfX1cIj57e2xpbmUuZGF0YS50aW1lc3RhbXB9fSB7eygnWycgKyBsaW5lLmRhdGEubGV2ZWwgKyAnXTonKS5wYWRFbmQoOSwgJyAnKX19IHt7bGluZS5kYXRhLm1lc3NhZ2V9fTwvY29kZT5cbiAgICB9XG4gIDwvcHJlPlxuPC9kaXY+XG4iXX0=
@@ -7058,17 +7058,18 @@ class NodeLogsFileComponent {
7058
7058
  this.selectedLevel = signal(Level.info);
7059
7059
  this.fileToExt = fileToExt;
7060
7060
  this.nodeLogLines = computed(() => this.allLogs()
7061
- .filter(({ level }) => levels.indexOf(level) >= levels.indexOf(this.selectedLevel()))
7062
- .filter(({ code }) => (!this.modelFilter() || code.toLocaleLowerCase().includes(`model=${this.modelFilter().toLowerCase()}`)) &&
7061
+ ?.filter(({ level }) => levels.indexOf(level) >= levels.indexOf(this.selectedLevel()))
7062
+ ?.filter(({ code }) => (!this.modelFilter() || code.toLocaleLowerCase().includes(`model=${this.modelFilter().toLowerCase()}`)) &&
7063
7063
  (!this.termFilter() || code.toLocaleLowerCase().includes(`term=${this.termFilter().toLowerCase()}`))));
7064
7064
  this.csvContent = computed(() => this.domSanitizer.bypassSecurityTrustResourceUrl(`data:text/html;charset=utf-8,${encodeURIComponent(logToCsv$1(this.allLogs()))}`));
7065
+ this.csvFilename = computed(() => fileToExt(this.node()?.['@id'], 'csv'));
7065
7066
  }
7066
7067
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: NodeLogsFileComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
7067
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: NodeLogsFileComponent, isStandalone: true, selector: "he-node-logs-file", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, dataState: { classPropertyName: "dataState", publicName: "dataState", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"is-relative\">\n <div class=\"copy-clipboard\">\n <div class=\"field has-addons\">\n @if (showFilters()) {\n <div class=\"control\">\n <input\n class=\"input is-secondary is-small\"\n [ngModel]=\"modelFilter()\"\n id=\"modelFilter\"\n (input)=\"modelFilter.set($event.target.value)\"\n placeholder=\"Filter by Method / Model\" />\n </div>\n <div class=\"control\">\n <input\n class=\"input is-secondary is-small\"\n [ngModel]=\"termFilter()\"\n id=\"termFilter\"\n (input)=\"termFilter.set($event.target.value)\"\n placeholder=\"Filter by Term\" />\n </div>\n <div class=\"control\">\n <div class=\"select is-secondary is-small\">\n <select [ngModel]=\"selectedLevel()\" (change)=\"selectedLevel.set($event.target.value)\" id=\"selectedLevel\">\n @for (level of Level | keys; track level) {\n <option [value]=\"level.value\">{{ level.value }}</option>\n }\n </select>\n </div>\n </div>\n }\n <div class=\"control\">\n <button\n class=\"button is-small\"\n (click)=\"showFilters.set(!showFilters())\"\n [ngbTooltip]=\"showFilters() ? 'Hide filters' : 'Show filters'\"\n placement=\"bottom\"\n container=\"body\">\n <fa-icon [icon]=\"faFilter\"></fa-icon>\n </button>\n </div>\n <div class=\"control\">\n <he-clipboard\n clipboardClass=\"button is-secondary is-small\"\n [value]=\"nodeLog()\"\n [hideText]=\"true\"\n [icon]=\"farClone\"\n size=\"lg\"\n rotate=\"180\"></he-clipboard>\n </div>\n <div class=\"control\">\n <a\n class=\"button is-info is-small\"\n target=\"_blank\"\n [href]=\"csvContent()\"\n [download]=\"fileToExt(node?.['@id'], 'csv')\">\n <fa-icon [icon]=\"faDownload\"></fa-icon>\n </a>\n </div>\n </div>\n </div>\n\n <pre class=\"pl-3 pt-3 ml-3\">@for (line of nodeLogLines(); track line) {\n <code class=\"is-block {{line.class}}\">{{line.data.timestamp}} {{('[' + line.data.level + ']:').padEnd(9, ' ')}} {{line.data.message}}</code>\n }</pre>\n</div>\n", styles: [":host{display:block}pre{background-color:inherit;color:inherit;min-height:38px;max-height:500px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "component", type: ClipboardComponent, selector: "he-clipboard", inputs: ["icon", "value", "disabled", "hideText", "size", "rotate", "clipboardClass"] }, { kind: "pipe", type: KeysPipe, name: "keys" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
7068
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.8", type: NodeLogsFileComponent, isStandalone: true, selector: "he-node-logs-file", inputs: { node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null }, dataState: { classPropertyName: "dataState", publicName: "dataState", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"is-relative\">\n <div class=\"copy-clipboard\">\n <div class=\"field has-addons\">\n @if (showFilters()) {\n <div class=\"control\">\n <input\n class=\"input is-secondary is-small\"\n [ngModel]=\"modelFilter()\"\n id=\"modelFilter\"\n (input)=\"modelFilter.set($event.target.value)\"\n placeholder=\"Filter by Method / Model\" />\n </div>\n <div class=\"control\">\n <input\n class=\"input is-secondary is-small\"\n [ngModel]=\"termFilter()\"\n id=\"termFilter\"\n (input)=\"termFilter.set($event.target.value)\"\n placeholder=\"Filter by Term\" />\n </div>\n <div class=\"control\">\n <div class=\"select is-secondary is-small\">\n <select [ngModel]=\"selectedLevel()\" (change)=\"selectedLevel.set($event.target.value)\" id=\"selectedLevel\">\n @for (level of Level | keys; track level) {\n <option [value]=\"level.value\">{{ level.value }}</option>\n }\n </select>\n </div>\n </div>\n }\n <div class=\"control\">\n <button\n class=\"button is-small\"\n (click)=\"showFilters.set(!showFilters())\"\n [ngbTooltip]=\"showFilters() ? 'Hide filters' : 'Show filters'\"\n placement=\"bottom\"\n container=\"body\">\n <fa-icon [icon]=\"faFilter\"></fa-icon>\n </button>\n </div>\n <div class=\"control\">\n <he-clipboard\n clipboardClass=\"button is-secondary is-small\"\n [value]=\"nodeLog()\"\n [hideText]=\"true\"\n [icon]=\"farClone\"\n size=\"lg\"\n rotate=\"180\"></he-clipboard>\n </div>\n <div class=\"control\">\n <a class=\"button is-info is-small\" target=\"_blank\" [href]=\"csvContent()\" [download]=\"csvFilename()\">\n <fa-icon [icon]=\"faDownload\"></fa-icon>\n </a>\n </div>\n </div>\n </div>\n\n <pre class=\"pl-3 pt-3 ml-3\">\n @for (line of nodeLogLines(); track line) {\n <code class=\"is-block {{line.class}}\">{{line.data.timestamp}} {{('[' + line.data.level + ']:').padEnd(9, ' ')}} {{line.data.message}}</code>\n }\n </pre>\n</div>\n", styles: [":host{display:block}pre{background-color:inherit;color:inherit;min-height:38px;max-height:500px;font-size:0}pre>code{font-size:14px;line-height:20px}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "component", type: FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "component", type: ClipboardComponent, selector: "he-clipboard", inputs: ["icon", "value", "disabled", "hideText", "size", "rotate", "clipboardClass"] }, { kind: "pipe", type: KeysPipe, name: "keys" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
7068
7069
  }
7069
7070
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: NodeLogsFileComponent, decorators: [{
7070
7071
  type: Component$1,
7071
- args: [{ selector: 'he-node-logs-file', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [FormsModule, NgbTooltip, FaIconComponent, ClipboardComponent, AsyncPipe, KeysPipe], template: "<div class=\"is-relative\">\n <div class=\"copy-clipboard\">\n <div class=\"field has-addons\">\n @if (showFilters()) {\n <div class=\"control\">\n <input\n class=\"input is-secondary is-small\"\n [ngModel]=\"modelFilter()\"\n id=\"modelFilter\"\n (input)=\"modelFilter.set($event.target.value)\"\n placeholder=\"Filter by Method / Model\" />\n </div>\n <div class=\"control\">\n <input\n class=\"input is-secondary is-small\"\n [ngModel]=\"termFilter()\"\n id=\"termFilter\"\n (input)=\"termFilter.set($event.target.value)\"\n placeholder=\"Filter by Term\" />\n </div>\n <div class=\"control\">\n <div class=\"select is-secondary is-small\">\n <select [ngModel]=\"selectedLevel()\" (change)=\"selectedLevel.set($event.target.value)\" id=\"selectedLevel\">\n @for (level of Level | keys; track level) {\n <option [value]=\"level.value\">{{ level.value }}</option>\n }\n </select>\n </div>\n </div>\n }\n <div class=\"control\">\n <button\n class=\"button is-small\"\n (click)=\"showFilters.set(!showFilters())\"\n [ngbTooltip]=\"showFilters() ? 'Hide filters' : 'Show filters'\"\n placement=\"bottom\"\n container=\"body\">\n <fa-icon [icon]=\"faFilter\"></fa-icon>\n </button>\n </div>\n <div class=\"control\">\n <he-clipboard\n clipboardClass=\"button is-secondary is-small\"\n [value]=\"nodeLog()\"\n [hideText]=\"true\"\n [icon]=\"farClone\"\n size=\"lg\"\n rotate=\"180\"></he-clipboard>\n </div>\n <div class=\"control\">\n <a\n class=\"button is-info is-small\"\n target=\"_blank\"\n [href]=\"csvContent()\"\n [download]=\"fileToExt(node?.['@id'], 'csv')\">\n <fa-icon [icon]=\"faDownload\"></fa-icon>\n </a>\n </div>\n </div>\n </div>\n\n <pre class=\"pl-3 pt-3 ml-3\">@for (line of nodeLogLines(); track line) {\n <code class=\"is-block {{line.class}}\">{{line.data.timestamp}} {{('[' + line.data.level + ']:').padEnd(9, ' ')}} {{line.data.message}}</code>\n }</pre>\n</div>\n", styles: [":host{display:block}pre{background-color:inherit;color:inherit;min-height:38px;max-height:500px}\n"] }]
7072
+ args: [{ selector: 'he-node-logs-file', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [FormsModule, NgbTooltip, FaIconComponent, ClipboardComponent, AsyncPipe, KeysPipe], template: "<div class=\"is-relative\">\n <div class=\"copy-clipboard\">\n <div class=\"field has-addons\">\n @if (showFilters()) {\n <div class=\"control\">\n <input\n class=\"input is-secondary is-small\"\n [ngModel]=\"modelFilter()\"\n id=\"modelFilter\"\n (input)=\"modelFilter.set($event.target.value)\"\n placeholder=\"Filter by Method / Model\" />\n </div>\n <div class=\"control\">\n <input\n class=\"input is-secondary is-small\"\n [ngModel]=\"termFilter()\"\n id=\"termFilter\"\n (input)=\"termFilter.set($event.target.value)\"\n placeholder=\"Filter by Term\" />\n </div>\n <div class=\"control\">\n <div class=\"select is-secondary is-small\">\n <select [ngModel]=\"selectedLevel()\" (change)=\"selectedLevel.set($event.target.value)\" id=\"selectedLevel\">\n @for (level of Level | keys; track level) {\n <option [value]=\"level.value\">{{ level.value }}</option>\n }\n </select>\n </div>\n </div>\n }\n <div class=\"control\">\n <button\n class=\"button is-small\"\n (click)=\"showFilters.set(!showFilters())\"\n [ngbTooltip]=\"showFilters() ? 'Hide filters' : 'Show filters'\"\n placement=\"bottom\"\n container=\"body\">\n <fa-icon [icon]=\"faFilter\"></fa-icon>\n </button>\n </div>\n <div class=\"control\">\n <he-clipboard\n clipboardClass=\"button is-secondary is-small\"\n [value]=\"nodeLog()\"\n [hideText]=\"true\"\n [icon]=\"farClone\"\n size=\"lg\"\n rotate=\"180\"></he-clipboard>\n </div>\n <div class=\"control\">\n <a class=\"button is-info is-small\" target=\"_blank\" [href]=\"csvContent()\" [download]=\"csvFilename()\">\n <fa-icon [icon]=\"faDownload\"></fa-icon>\n </a>\n </div>\n </div>\n </div>\n\n <pre class=\"pl-3 pt-3 ml-3\">\n @for (line of nodeLogLines(); track line) {\n <code class=\"is-block {{line.class}}\">{{line.data.timestamp}} {{('[' + line.data.level + ']:').padEnd(9, ' ')}} {{line.data.message}}</code>\n }\n </pre>\n</div>\n", styles: [":host{display:block}pre{background-color:inherit;color:inherit;min-height:38px;max-height:500px;font-size:0}pre>code{font-size:14px;line-height:20px}\n"] }]
7072
7073
  }] });
7073
7074
 
7074
7075
  class NodeMissingLookupFactorsComponent {