@hestia-earth/ui-components 0.25.5 → 0.25.6

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.
@@ -198,11 +198,11 @@ export class CyclesNodesComponent {
198
198
  this.selectedIndex.set(+value);
199
199
  }
200
200
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.8", ngImport: i0, type: CyclesNodesComponent, deps: [{ token: i1.HeNodeStoreService }], target: i0.ɵɵFactoryTarget.Component }); }
201
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.8", type: CyclesNodesComponent, selector: "he-cycles-nodes", inputs: { dataState: "dataState", nodeKeys: "nodeKeys", nodeKeyGroup: "nodeKeyGroup" }, ngImport: i0, template: "<div class=\"tabs is-mb-1\" *ngIf=\"isGroupNode()\">\n <ul>\n <li *ngFor=\"let term of groupNodeTerms()\" [class.is-active]=\"selectedGroupTerm() === term\">\n <a (click)=\"selectedGroupTerm.set(term)\">{{ term.name }}</a>\n </li>\n </ul>\n</div>\n\n<div class=\"columns is-variable is-align-items-center is-2 is-m-0\" *ngIf=\"hasData()\">\n <div class=\"column\">\n <ng-container *ngIf=\"selectedView() === View.table\">\n <button\n class=\"button is-small is-ghost\"\n (click)=\"showDownload = true\"\n ngbTooltip=\"Download as CSV\"\n placement=\"bottom\">\n <fa-icon icon=\"download\" size=\"lg\"></fa-icon>\n </button>\n </ng-container>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"selectedView() === View.table\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter terms by name\"\n (search)=\"filterByTerm($event)\"></he-search-extend>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"views()?.length > 1\">\n <div class=\"field has-addons\">\n <div class=\"control\" *ngFor=\"let view of views()\">\n <button class=\"button is-small\" [class.is-selected]=\"selectedView() === view\" (click)=\"selectedView.set(view)\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"viewIcon[view]\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">{{ view }}</span>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<ng-container *ngIf=\"isNodeKeyAllowed()\">\n <ng-container [ngSwitch]=\"selectedView()\">\n <div class=\"is-px-3 is-pb-3\" *ngSwitchCase=\"View.table\">\n <ng-container *ngIf=\"hasData(); else emptyTable\">\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr class=\"has-text-weight-bold\" *ngIf=\"dataKeys().length > 1\">\n <th class=\"width-auto\"></th>\n <th [class.is-hidden]=\"isGroupNode()\"></th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <ng-container *ngIf=\"data()[dataKey]?.length\">\n <th [attr.colspan]=\"data()[dataKey].length\" [class.has-border-right]=\"!dataKeyLast\">\n <span>{{ dataKey | keyToLabel }}</span>\n </th>\n </ng-container>\n </ng-container>\n </tr>\n\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\"></th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <th\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [attr.title]=\"node.value.term.name\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <he-node-link [node]=\"node.value.term\">\n <span [innerHtml]=\"node.value.term.name | ellipsis: 30 | compound\"></span>\n </he-node-link>\n </th>\n </ng-container>\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <a [href]=\"baseUrl + '/schema/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <th\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [attr.title]=\"node.value.term.units\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span [innerHtml]=\"node.value.term.units | compound\"></span>\n <he-terms-units-description\n class=\"is-inline-block is-ml-2\"\n [term]=\"node.value.term\"></he-terms-units-description>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let cycle of cycles(); trackBy: trackById; let cycleIndex = index\">\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycle.term || cycle\">\n <span>{{ cycleIndex + 1 }}. {{ defaultLabel(cycle) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <he-cycles-functional-unit-measure [cycle]=\"cycles()[0]\"></he-cycles-functional-unit-measure>\n </td>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <td\n class=\"is-nowrap\"\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span\n *ngIf=\"node.value.values[cycle['@id']]; else emptyValue\"\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"\n togglePopover(p, { data: node.value.values[cycle['@id']], cycle: cycle, key: dataKey })\n \">\n <span pointer>\n {{\n propertyValue(node.value.values[cycle['@id']].value, node.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"_dataState()\"\n [node]=\"node.value.values[cycle['@id']].node\"\n key=\"value\"></he-blank-node-state>\n </span>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </ng-container>\n </div>\n\n <ng-container *ngSwitchCase=\"View.chart\">\n <ng-container [ngSwitch]=\"firstNodeKey()\">\n <he-cycles-result *ngSwitchCase=\"BlankNodesKey.inputs\" [cycles]=\"cycles()\"></he-cycles-result>\n <he-cycles-emissions-chart\n *ngSwitchCase=\"BlankNodesKey.emissions\"\n [cycles]=\"cycles()\"></he-cycles-emissions-chart>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"View.timeline\">\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n\n <div class=\"is-px-3 is-pb-3\">\n <he-cycles-nodes-timeline\n [recalculatedValues]=\"timelineValues()\"\n [dataState]=\"_dataState()\"></he-cycles-nodes-timeline>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"View.logs\">\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n\n <div class=\"tabs is-mb-2\" *ngIf=\"_nodeKeys().length > 1\">\n <ul>\n <li *ngFor=\"let nodeKey of _nodeKeys()\" [class.is-active]=\"selectedNodeKey() === nodeKey\">\n <a (click)=\"selectedNodeKey.set(nodeKey)\">{{ nodeKey | keyToLabel }}</a>\n </li>\n </ul>\n </div>\n\n <he-node-logs-models\n *ngIf=\"selectedNode()\"\n [node]=\"selectedNode()\"\n [nodeKey]=\"selectedNodeKey()\"\n [logsKey]=\"selectedLogsKey()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [filterTermTypes]=\"filterTermTypes()\"></he-node-logs-models>\n </ng-container>\n </ng-container>\n</ng-container>\n\n<he-node-csv-export-confirm\n *ngIf=\"showDownload\"\n [nodes]=\"cycles()\"\n [filename]=\"csvFilename()\"\n [isUpload]=\"false\"\n [headerKeys]=\"headerKeys()\"\n (closed)=\"showDownload = false\"></he-node-csv-export-confirm>\n\n<ng-template #emptyTable>\n <div class=\"is-pt-3 has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n <span *ngIf=\"showSwitchToRecalculated()\">\n Switch to\n <code>recalculated</code>\n version.\n </span>\n </div>\n</ng-template>\n\n<ng-template #emptyValue>\n <span>-</span>\n</ng-template>\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p>\n <b>{{ defaultLabel(node) }}</b>\n </p>\n <he-node-value-details\n [data]=\"data\"\n [dataState]=\"_dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"key\"></he-node-value-details>\n</ng-template>\n\n<ng-template #selectCycle>\n <div class=\"field has-addons is-py-2 is-px-3\" *ngIf=\"cycles().length > 1\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select a Cycle</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n <option *ngFor=\"let value of cycles(); let cycleIndex = index\" [value]=\"cycleIndex\">\n {{ cycleIndex + 1 }}. {{ defaultLabel(value) }}\n </option>\n </select>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i4.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: i5.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: i6.BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["dataState", "nodeType", "dataKey", "key", "node", "state", "linkClass"] }, { kind: "component", type: i7.BlankNodeStateNoticeComponent, selector: "he-blank-node-state-notice", inputs: ["dataState", "showAggregated", "showDeleted"] }, { kind: "component", type: i8.DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "small"] }, { kind: "component", type: i9.SearchExtendComponent, selector: "he-search-extend", inputs: ["value", "disabled", "placeholder", "class"], outputs: ["search"] }, { kind: "component", type: i10.NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink", "linkClass"] }, { kind: "component", type: i11.NodeCsvExportConfirmComponent, selector: "he-node-csv-export-confirm", inputs: ["nodes", "filename", "headerKeys", "extension", "isUpload"], outputs: ["closed"] }, { kind: "component", type: i12.NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: ["node", "nodeKey", "originalValues", "recalculatedValues", "terms", "filterTermTypes", "filterTermTypesLabel", "logsKey", "noDataMessage"] }, { kind: "component", type: i13.NodeValueDetailsComponent, selector: "he-node-value-details", inputs: ["data", "nodeType", "dataKey", "dataState"] }, { kind: "component", type: i14.TermsUnitsDescriptionComponent, selector: "he-terms-units-description", inputs: ["term", "iconTemplate"] }, { kind: "component", type: i15.CyclesEmissionsChartComponent, selector: "he-cycles-emissions-chart", inputs: ["cycles"] }, { kind: "component", type: i16.CyclesFunctionalUnitMeasureComponent, selector: "he-cycles-functional-unit-measure", inputs: ["cycle"] }, { kind: "component", type: i17.CyclesNodesTimelineComponent, selector: "he-cycles-nodes-timeline", inputs: ["recalculatedValues", "dataState"] }, { kind: "component", type: i18.CyclesResultComponent, selector: "he-cycles-result", inputs: ["cycles"] }, { kind: "pipe", type: i19.CompoundPipe, name: "compound" }, { kind: "pipe", type: i20.DefaultPipe, name: "default" }, { kind: "pipe", type: i21.EllipsisPipe, name: "ellipsis" }, { kind: "pipe", type: i22.KeyToLabelPipe, name: "keyToLabel" }, { kind: "pipe", type: i23.PrecisionPipe, name: "precision" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
201
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.8", type: CyclesNodesComponent, selector: "he-cycles-nodes", inputs: { dataState: "dataState", nodeKeys: "nodeKeys", nodeKeyGroup: "nodeKeyGroup" }, ngImport: i0, template: "<div class=\"tabs is-mb-1\" *ngIf=\"isGroupNode()\">\n <ul>\n <li *ngFor=\"let term of groupNodeTerms()\" [class.is-active]=\"selectedGroupTerm() === term\">\n <a (click)=\"selectedGroupTerm.set(term)\">{{ term.name }}</a>\n </li>\n </ul>\n</div>\n\n<div class=\"columns is-variable is-align-items-center is-2 is-m-0\" *ngIf=\"hasData()\">\n <div class=\"column\">\n <ng-container *ngIf=\"selectedView() === View.table\">\n <button\n class=\"button is-small is-ghost\"\n (click)=\"showDownload = true\"\n ngbTooltip=\"Download as CSV\"\n placement=\"bottom\">\n <fa-icon icon=\"download\" size=\"lg\"></fa-icon>\n </button>\n </ng-container>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"selectedView() === View.table\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter terms by name\"\n (search)=\"filterByTerm($event)\"></he-search-extend>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"views()?.length > 1\">\n <div class=\"field has-addons\">\n <div class=\"control\" *ngFor=\"let view of views()\">\n <button class=\"button is-small\" [class.is-selected]=\"selectedView() === view\" (click)=\"selectedView.set(view)\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"viewIcon[view]\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">{{ view }}</span>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<ng-container *ngIf=\"isNodeKeyAllowed()\">\n <ng-container [ngSwitch]=\"selectedView()\">\n <div class=\"is-px-3 is-pb-3\" *ngSwitchCase=\"View.table\">\n <ng-container *ngIf=\"hasData(); else emptyTable\">\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr class=\"has-text-weight-bold\" *ngIf=\"dataKeys().length > 1\">\n <th class=\"width-auto\"></th>\n <th [class.is-hidden]=\"isGroupNode()\"></th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <ng-container *ngIf=\"data()[dataKey]?.length\">\n <th [attr.colspan]=\"data()[dataKey].length\" [class.has-border-right]=\"!dataKeyLast\">\n <span>{{ dataKey | keyToLabel }}</span>\n </th>\n </ng-container>\n </ng-container>\n </tr>\n\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\"></th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <th\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [attr.title]=\"node.value.term.name\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <he-node-link [node]=\"node.value.term\">\n <span [innerHtml]=\"node.value.term.name | ellipsis: 30 | compound\"></span>\n </he-node-link>\n </th>\n </ng-container>\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <a [href]=\"baseUrl + '/schema/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <th\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [attr.title]=\"node.value.term.units\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span [innerHtml]=\"node.value.term.units | compound\"></span>\n <he-terms-units-description\n class=\"is-inline-block is-ml-2\"\n [term]=\"node.value.term\"></he-terms-units-description>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let cycle of cycles(); trackBy: trackById; let cycleIndex = index\">\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycle.term || cycle\">\n <span>{{ cycleIndex + 1 }}. {{ defaultLabel(cycle) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <he-cycles-functional-unit-measure [cycle]=\"cycle\"></he-cycles-functional-unit-measure>\n </td>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <td\n class=\"is-nowrap\"\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span\n *ngIf=\"node.value.values[cycle['@id']]; else emptyValue\"\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"\n togglePopover(p, { data: node.value.values[cycle['@id']], cycle: cycle, key: dataKey })\n \">\n <span pointer>\n {{\n propertyValue(node.value.values[cycle['@id']].value, node.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"_dataState()\"\n [node]=\"node.value.values[cycle['@id']].node\"\n key=\"value\"></he-blank-node-state>\n </span>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </ng-container>\n </div>\n\n <ng-container *ngSwitchCase=\"View.chart\">\n <ng-container [ngSwitch]=\"firstNodeKey()\">\n <he-cycles-result *ngSwitchCase=\"BlankNodesKey.inputs\" [cycles]=\"cycles()\"></he-cycles-result>\n <he-cycles-emissions-chart\n *ngSwitchCase=\"BlankNodesKey.emissions\"\n [cycles]=\"cycles()\"></he-cycles-emissions-chart>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"View.timeline\">\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n\n <div class=\"is-px-3 is-pb-3\">\n <he-cycles-nodes-timeline\n [recalculatedValues]=\"timelineValues()\"\n [dataState]=\"_dataState()\"></he-cycles-nodes-timeline>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"View.logs\">\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n\n <div class=\"tabs is-mb-2\" *ngIf=\"_nodeKeys().length > 1\">\n <ul>\n <li *ngFor=\"let nodeKey of _nodeKeys()\" [class.is-active]=\"selectedNodeKey() === nodeKey\">\n <a (click)=\"selectedNodeKey.set(nodeKey)\">{{ nodeKey | keyToLabel }}</a>\n </li>\n </ul>\n </div>\n\n <he-node-logs-models\n *ngIf=\"selectedNode()\"\n [node]=\"selectedNode()\"\n [nodeKey]=\"selectedNodeKey()\"\n [logsKey]=\"selectedLogsKey()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [filterTermTypes]=\"filterTermTypes()\"></he-node-logs-models>\n </ng-container>\n </ng-container>\n</ng-container>\n\n<he-node-csv-export-confirm\n *ngIf=\"showDownload\"\n [nodes]=\"cycles()\"\n [filename]=\"csvFilename()\"\n [isUpload]=\"false\"\n [headerKeys]=\"headerKeys()\"\n (closed)=\"showDownload = false\"></he-node-csv-export-confirm>\n\n<ng-template #emptyTable>\n <div class=\"is-pt-3 has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n <span *ngIf=\"showSwitchToRecalculated()\">\n Switch to\n <code>recalculated</code>\n version.\n </span>\n </div>\n</ng-template>\n\n<ng-template #emptyValue>\n <span>-</span>\n</ng-template>\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p>\n <b>{{ defaultLabel(node) }}</b>\n </p>\n <he-node-value-details\n [data]=\"data\"\n [dataState]=\"_dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"key\"></he-node-value-details>\n</ng-template>\n\n<ng-template #selectCycle>\n <div class=\"field has-addons is-py-2 is-px-3\" *ngIf=\"cycles().length > 1\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select a Cycle</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n <option *ngFor=\"let value of cycles(); let cycleIndex = index\" [value]=\"cycleIndex\">\n {{ cycleIndex + 1 }}. {{ defaultLabel(value) }}\n </option>\n </select>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i4.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: i5.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: i6.BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["dataState", "nodeType", "dataKey", "key", "node", "state", "linkClass"] }, { kind: "component", type: i7.BlankNodeStateNoticeComponent, selector: "he-blank-node-state-notice", inputs: ["dataState", "showAggregated", "showDeleted"] }, { kind: "component", type: i8.DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "small"] }, { kind: "component", type: i9.SearchExtendComponent, selector: "he-search-extend", inputs: ["value", "disabled", "placeholder", "class"], outputs: ["search"] }, { kind: "component", type: i10.NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink", "linkClass"] }, { kind: "component", type: i11.NodeCsvExportConfirmComponent, selector: "he-node-csv-export-confirm", inputs: ["nodes", "filename", "headerKeys", "extension", "isUpload"], outputs: ["closed"] }, { kind: "component", type: i12.NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: ["node", "nodeKey", "originalValues", "recalculatedValues", "terms", "filterTermTypes", "filterTermTypesLabel", "logsKey", "noDataMessage"] }, { kind: "component", type: i13.NodeValueDetailsComponent, selector: "he-node-value-details", inputs: ["data", "nodeType", "dataKey", "dataState"] }, { kind: "component", type: i14.TermsUnitsDescriptionComponent, selector: "he-terms-units-description", inputs: ["term", "iconTemplate"] }, { kind: "component", type: i15.CyclesEmissionsChartComponent, selector: "he-cycles-emissions-chart", inputs: ["cycles"] }, { kind: "component", type: i16.CyclesFunctionalUnitMeasureComponent, selector: "he-cycles-functional-unit-measure", inputs: ["cycle"] }, { kind: "component", type: i17.CyclesNodesTimelineComponent, selector: "he-cycles-nodes-timeline", inputs: ["recalculatedValues", "dataState"] }, { kind: "component", type: i18.CyclesResultComponent, selector: "he-cycles-result", inputs: ["cycles"] }, { kind: "pipe", type: i19.CompoundPipe, name: "compound" }, { kind: "pipe", type: i20.DefaultPipe, name: "default" }, { kind: "pipe", type: i21.EllipsisPipe, name: "ellipsis" }, { kind: "pipe", type: i22.KeyToLabelPipe, name: "keyToLabel" }, { kind: "pipe", type: i23.PrecisionPipe, name: "precision" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
202
202
  }
203
203
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.8", ngImport: i0, type: CyclesNodesComponent, decorators: [{
204
204
  type: Component,
205
- args: [{ selector: 'he-cycles-nodes', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"tabs is-mb-1\" *ngIf=\"isGroupNode()\">\n <ul>\n <li *ngFor=\"let term of groupNodeTerms()\" [class.is-active]=\"selectedGroupTerm() === term\">\n <a (click)=\"selectedGroupTerm.set(term)\">{{ term.name }}</a>\n </li>\n </ul>\n</div>\n\n<div class=\"columns is-variable is-align-items-center is-2 is-m-0\" *ngIf=\"hasData()\">\n <div class=\"column\">\n <ng-container *ngIf=\"selectedView() === View.table\">\n <button\n class=\"button is-small is-ghost\"\n (click)=\"showDownload = true\"\n ngbTooltip=\"Download as CSV\"\n placement=\"bottom\">\n <fa-icon icon=\"download\" size=\"lg\"></fa-icon>\n </button>\n </ng-container>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"selectedView() === View.table\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter terms by name\"\n (search)=\"filterByTerm($event)\"></he-search-extend>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"views()?.length > 1\">\n <div class=\"field has-addons\">\n <div class=\"control\" *ngFor=\"let view of views()\">\n <button class=\"button is-small\" [class.is-selected]=\"selectedView() === view\" (click)=\"selectedView.set(view)\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"viewIcon[view]\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">{{ view }}</span>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<ng-container *ngIf=\"isNodeKeyAllowed()\">\n <ng-container [ngSwitch]=\"selectedView()\">\n <div class=\"is-px-3 is-pb-3\" *ngSwitchCase=\"View.table\">\n <ng-container *ngIf=\"hasData(); else emptyTable\">\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr class=\"has-text-weight-bold\" *ngIf=\"dataKeys().length > 1\">\n <th class=\"width-auto\"></th>\n <th [class.is-hidden]=\"isGroupNode()\"></th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <ng-container *ngIf=\"data()[dataKey]?.length\">\n <th [attr.colspan]=\"data()[dataKey].length\" [class.has-border-right]=\"!dataKeyLast\">\n <span>{{ dataKey | keyToLabel }}</span>\n </th>\n </ng-container>\n </ng-container>\n </tr>\n\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\"></th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <th\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [attr.title]=\"node.value.term.name\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <he-node-link [node]=\"node.value.term\">\n <span [innerHtml]=\"node.value.term.name | ellipsis: 30 | compound\"></span>\n </he-node-link>\n </th>\n </ng-container>\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <a [href]=\"baseUrl + '/schema/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <th\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [attr.title]=\"node.value.term.units\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span [innerHtml]=\"node.value.term.units | compound\"></span>\n <he-terms-units-description\n class=\"is-inline-block is-ml-2\"\n [term]=\"node.value.term\"></he-terms-units-description>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let cycle of cycles(); trackBy: trackById; let cycleIndex = index\">\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycle.term || cycle\">\n <span>{{ cycleIndex + 1 }}. {{ defaultLabel(cycle) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <he-cycles-functional-unit-measure [cycle]=\"cycles()[0]\"></he-cycles-functional-unit-measure>\n </td>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <td\n class=\"is-nowrap\"\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span\n *ngIf=\"node.value.values[cycle['@id']]; else emptyValue\"\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"\n togglePopover(p, { data: node.value.values[cycle['@id']], cycle: cycle, key: dataKey })\n \">\n <span pointer>\n {{\n propertyValue(node.value.values[cycle['@id']].value, node.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"_dataState()\"\n [node]=\"node.value.values[cycle['@id']].node\"\n key=\"value\"></he-blank-node-state>\n </span>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </ng-container>\n </div>\n\n <ng-container *ngSwitchCase=\"View.chart\">\n <ng-container [ngSwitch]=\"firstNodeKey()\">\n <he-cycles-result *ngSwitchCase=\"BlankNodesKey.inputs\" [cycles]=\"cycles()\"></he-cycles-result>\n <he-cycles-emissions-chart\n *ngSwitchCase=\"BlankNodesKey.emissions\"\n [cycles]=\"cycles()\"></he-cycles-emissions-chart>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"View.timeline\">\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n\n <div class=\"is-px-3 is-pb-3\">\n <he-cycles-nodes-timeline\n [recalculatedValues]=\"timelineValues()\"\n [dataState]=\"_dataState()\"></he-cycles-nodes-timeline>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"View.logs\">\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n\n <div class=\"tabs is-mb-2\" *ngIf=\"_nodeKeys().length > 1\">\n <ul>\n <li *ngFor=\"let nodeKey of _nodeKeys()\" [class.is-active]=\"selectedNodeKey() === nodeKey\">\n <a (click)=\"selectedNodeKey.set(nodeKey)\">{{ nodeKey | keyToLabel }}</a>\n </li>\n </ul>\n </div>\n\n <he-node-logs-models\n *ngIf=\"selectedNode()\"\n [node]=\"selectedNode()\"\n [nodeKey]=\"selectedNodeKey()\"\n [logsKey]=\"selectedLogsKey()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [filterTermTypes]=\"filterTermTypes()\"></he-node-logs-models>\n </ng-container>\n </ng-container>\n</ng-container>\n\n<he-node-csv-export-confirm\n *ngIf=\"showDownload\"\n [nodes]=\"cycles()\"\n [filename]=\"csvFilename()\"\n [isUpload]=\"false\"\n [headerKeys]=\"headerKeys()\"\n (closed)=\"showDownload = false\"></he-node-csv-export-confirm>\n\n<ng-template #emptyTable>\n <div class=\"is-pt-3 has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n <span *ngIf=\"showSwitchToRecalculated()\">\n Switch to\n <code>recalculated</code>\n version.\n </span>\n </div>\n</ng-template>\n\n<ng-template #emptyValue>\n <span>-</span>\n</ng-template>\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p>\n <b>{{ defaultLabel(node) }}</b>\n </p>\n <he-node-value-details\n [data]=\"data\"\n [dataState]=\"_dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"key\"></he-node-value-details>\n</ng-template>\n\n<ng-template #selectCycle>\n <div class=\"field has-addons is-py-2 is-px-3\" *ngIf=\"cycles().length > 1\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select a Cycle</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n <option *ngFor=\"let value of cycles(); let cycleIndex = index\" [value]=\"cycleIndex\">\n {{ cycleIndex + 1 }}. {{ defaultLabel(value) }}\n </option>\n </select>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}\n"] }]
205
+ args: [{ selector: 'he-cycles-nodes', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"tabs is-mb-1\" *ngIf=\"isGroupNode()\">\n <ul>\n <li *ngFor=\"let term of groupNodeTerms()\" [class.is-active]=\"selectedGroupTerm() === term\">\n <a (click)=\"selectedGroupTerm.set(term)\">{{ term.name }}</a>\n </li>\n </ul>\n</div>\n\n<div class=\"columns is-variable is-align-items-center is-2 is-m-0\" *ngIf=\"hasData()\">\n <div class=\"column\">\n <ng-container *ngIf=\"selectedView() === View.table\">\n <button\n class=\"button is-small is-ghost\"\n (click)=\"showDownload = true\"\n ngbTooltip=\"Download as CSV\"\n placement=\"bottom\">\n <fa-icon icon=\"download\" size=\"lg\"></fa-icon>\n </button>\n </ng-container>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"selectedView() === View.table\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter terms by name\"\n (search)=\"filterByTerm($event)\"></he-search-extend>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"views()?.length > 1\">\n <div class=\"field has-addons\">\n <div class=\"control\" *ngFor=\"let view of views()\">\n <button class=\"button is-small\" [class.is-selected]=\"selectedView() === view\" (click)=\"selectedView.set(view)\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"viewIcon[view]\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">{{ view }}</span>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<ng-container *ngIf=\"isNodeKeyAllowed()\">\n <ng-container [ngSwitch]=\"selectedView()\">\n <div class=\"is-px-3 is-pb-3\" *ngSwitchCase=\"View.table\">\n <ng-container *ngIf=\"hasData(); else emptyTable\">\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr class=\"has-text-weight-bold\" *ngIf=\"dataKeys().length > 1\">\n <th class=\"width-auto\"></th>\n <th [class.is-hidden]=\"isGroupNode()\"></th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <ng-container *ngIf=\"data()[dataKey]?.length\">\n <th [attr.colspan]=\"data()[dataKey].length\" [class.has-border-right]=\"!dataKeyLast\">\n <span>{{ dataKey | keyToLabel }}</span>\n </th>\n </ng-container>\n </ng-container>\n </tr>\n\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\"></th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <th\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [attr.title]=\"node.value.term.name\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <he-node-link [node]=\"node.value.term\">\n <span [innerHtml]=\"node.value.term.name | ellipsis: 30 | compound\"></span>\n </he-node-link>\n </th>\n </ng-container>\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <a [href]=\"baseUrl + '/schema/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <th\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [attr.title]=\"node.value.term.units\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span [innerHtml]=\"node.value.term.units | compound\"></span>\n <he-terms-units-description\n class=\"is-inline-block is-ml-2\"\n [term]=\"node.value.term\"></he-terms-units-description>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let cycle of cycles(); trackBy: trackById; let cycleIndex = index\">\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycle.term || cycle\">\n <span>{{ cycleIndex + 1 }}. {{ defaultLabel(cycle) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <he-cycles-functional-unit-measure [cycle]=\"cycle\"></he-cycles-functional-unit-measure>\n </td>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <td\n class=\"is-nowrap\"\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span\n *ngIf=\"node.value.values[cycle['@id']]; else emptyValue\"\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"\n togglePopover(p, { data: node.value.values[cycle['@id']], cycle: cycle, key: dataKey })\n \">\n <span pointer>\n {{\n propertyValue(node.value.values[cycle['@id']].value, node.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"_dataState()\"\n [node]=\"node.value.values[cycle['@id']].node\"\n key=\"value\"></he-blank-node-state>\n </span>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </ng-container>\n </div>\n\n <ng-container *ngSwitchCase=\"View.chart\">\n <ng-container [ngSwitch]=\"firstNodeKey()\">\n <he-cycles-result *ngSwitchCase=\"BlankNodesKey.inputs\" [cycles]=\"cycles()\"></he-cycles-result>\n <he-cycles-emissions-chart\n *ngSwitchCase=\"BlankNodesKey.emissions\"\n [cycles]=\"cycles()\"></he-cycles-emissions-chart>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"View.timeline\">\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n\n <div class=\"is-px-3 is-pb-3\">\n <he-cycles-nodes-timeline\n [recalculatedValues]=\"timelineValues()\"\n [dataState]=\"_dataState()\"></he-cycles-nodes-timeline>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"View.logs\">\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n\n <div class=\"tabs is-mb-2\" *ngIf=\"_nodeKeys().length > 1\">\n <ul>\n <li *ngFor=\"let nodeKey of _nodeKeys()\" [class.is-active]=\"selectedNodeKey() === nodeKey\">\n <a (click)=\"selectedNodeKey.set(nodeKey)\">{{ nodeKey | keyToLabel }}</a>\n </li>\n </ul>\n </div>\n\n <he-node-logs-models\n *ngIf=\"selectedNode()\"\n [node]=\"selectedNode()\"\n [nodeKey]=\"selectedNodeKey()\"\n [logsKey]=\"selectedLogsKey()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [filterTermTypes]=\"filterTermTypes()\"></he-node-logs-models>\n </ng-container>\n </ng-container>\n</ng-container>\n\n<he-node-csv-export-confirm\n *ngIf=\"showDownload\"\n [nodes]=\"cycles()\"\n [filename]=\"csvFilename()\"\n [isUpload]=\"false\"\n [headerKeys]=\"headerKeys()\"\n (closed)=\"showDownload = false\"></he-node-csv-export-confirm>\n\n<ng-template #emptyTable>\n <div class=\"is-pt-3 has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n <span *ngIf=\"showSwitchToRecalculated()\">\n Switch to\n <code>recalculated</code>\n version.\n </span>\n </div>\n</ng-template>\n\n<ng-template #emptyValue>\n <span>-</span>\n</ng-template>\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p>\n <b>{{ defaultLabel(node) }}</b>\n </p>\n <he-node-value-details\n [data]=\"data\"\n [dataState]=\"_dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"key\"></he-node-value-details>\n</ng-template>\n\n<ng-template #selectCycle>\n <div class=\"field has-addons is-py-2 is-px-3\" *ngIf=\"cycles().length > 1\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select a Cycle</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n <option *ngFor=\"let value of cycles(); let cycleIndex = index\" [value]=\"cycleIndex\">\n {{ cycleIndex + 1 }}. {{ defaultLabel(value) }}\n </option>\n </select>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}\n"] }]
206
206
  }], ctorParameters: function () { return [{ type: i1.HeNodeStoreService }]; }, propDecorators: { dataState: [{
207
207
  type: Input
208
208
  }], nodeKeys: [{
@@ -210,4 +210,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.8", ngImpor
210
210
  }], nodeKeyGroup: [{
211
211
  type: Input
212
212
  }] } });
213
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3ljbGVzLW5vZGVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jeWNsZXMvY3ljbGVzLW5vZGVzL2N5Y2xlcy1ub2Rlcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvY3ljbGVzL2N5Y2xlcy1ub2Rlcy9jeWNsZXMtbm9kZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBSUwsUUFBUSxFQUlSLFlBQVksRUFJYixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sT0FBTyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFN0MsT0FBTyxFQUFFLGFBQWEsRUFBYSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBZ0IsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkYsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUUzRCxJQUFLLElBS0o7QUFMRCxXQUFLLElBQUk7SUFDUCw0QkFBb0IsQ0FBQTtJQUNwQiw0QkFBb0IsQ0FBQTtJQUNwQix3Q0FBZ0MsQ0FBQTtJQUNoQyxvQ0FBNEIsQ0FBQTtBQUM5QixDQUFDLEVBTEksSUFBSSxLQUFKLElBQUksUUFLUjtBQUVELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7QUFzQmxELE1BQU0sUUFBUSxHQUVWO0lBQ0YsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsV0FBVztJQUN6QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxZQUFZO0lBQ3pCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU07SUFDcEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVTtDQUM1QixDQUFDO0FBRUYsTUFBTSxZQUFZLEdBRWQ7SUFDRixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDckMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztJQUM5RCxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzNELENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDN0QsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztDQUNsRSxDQUFDO0FBRUYsTUFBTSxzQkFBc0IsR0FFeEI7SUFDRixDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7Q0FDbkQsQ0FBQztBQUVGLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxNQUFtQixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztBQU10SCxNQUFNLENBQU4sSUFBWSxrQkFHWDtBQUhELFdBQVksa0JBQWtCO0lBQzVCLHlDQUFtQixDQUFBO0lBQ25CLHlEQUFtQyxDQUFBO0FBQ3JDLENBQUMsRUFIVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRzdCO0FBSUQsTUFBTSxjQUFjLEdBQ2xCLENBQUMsS0FBb0IsRUFBRSxFQUFFLENBQ3pCLENBQUMsSUFBa0IsRUFBaUQsRUFBRSxDQUFDLENBQUM7SUFDdEUsR0FBRyxJQUFJO0lBQ1AsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJO0lBQ2pCLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxrREFBa0Q7Q0FDekUsQ0FBQyxDQUFDO0FBRUwsTUFBTSxlQUFlLEdBQUcsQ0FBQyxRQUE0QixFQUFFLEtBQW9CLEVBQWlCLEVBQUUsQ0FDNUYsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFFdkQsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLFFBQTRCLEVBQUUsTUFBc0IsRUFBRSxJQUFXLEVBQWlCLEVBQUUsQ0FDbEgsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUNqQixjQUFjLENBQUMsS0FBSyxDQUFDLENBQ25CLENBQUUsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFtQixJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksS0FBSyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQzFHLENBQ0YsQ0FBQztBQVFKLE1BQU0sT0FBTyxvQkFBb0I7SUFFL0IsSUFDSSxTQUFTLENBQUMsS0FBZ0I7UUFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQU9ELElBQ0ksUUFBUSxDQUFDLEtBQXNCO1FBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFJRCxJQUNJLFlBQVksQ0FBQyxLQUF5QjtRQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBOEZELFlBQW9CLGdCQUFvQztRQUFwQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQW9CO1FBbkg5QyxlQUFVLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQU14QyxrQkFBYSxHQUFHLGFBQWEsQ0FBQztRQUM5QixpQkFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JELG9CQUFlLEdBQUcsTUFBTSxDQUFDLFNBQTBCLENBQUMsQ0FBQztRQUVyRCxjQUFTLEdBQUcsTUFBTSxDQUFDLEVBQXFCLENBQUMsQ0FBQztRQU0xQyxzQkFBaUIsR0FBRyxNQUFNLENBQUMsU0FBaUIsQ0FBQyxDQUFDO1FBQzlDLGtCQUFhLEdBQUcsTUFBTSxDQUFDLFNBQStCLENBQUMsQ0FBQztRQU14RCxZQUFPLEdBQUcsT0FBTyxFQUFFLENBQUM7UUFDcEIsa0JBQWEsR0FBRyxhQUFhLENBQUM7UUFDOUIsaUJBQVksR0FBRyxZQUFZLENBQUM7UUFDNUIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFFckIsZUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNwQyxVQUFVO1lBQ1YsV0FBVztZQUNYLG1CQUFtQjtZQUNuQixvQkFBb0I7WUFDcEIsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLEdBQUcsR0FBRyxFQUFFLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyxDQUFDO1NBQ2hGLENBQUMsQ0FBQztRQUVPLFNBQUksR0FBRyxJQUFJLENBQUM7UUFDWixhQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3RCLGFBQVEsR0FBRyxRQUFRLENBQ3pCLEdBQUcsRUFBRSxDQUNILENBQUM7WUFDQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDbEcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzlELENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUk7WUFDbEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRTtTQUN2QyxDQUFnQyxDQUNwQyxDQUFDO1FBQ1EsVUFBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUcsaUJBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBDLGNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBZSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNoRixrQkFBYSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlGLGlCQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVwRyxpQ0FBaUM7UUFDdkIsbUJBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQ3ZDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbEIsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDOUYsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FDekIsQ0FBQztRQUNRLFdBQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQy9CLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbEIsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDN0YsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FDeEIsQ0FBQztRQUVNLGtCQUFhLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLDBCQUFxQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLGtCQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsb0JBQWUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEUsMkJBQXNCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEcsK0JBQTBCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVHLDBEQUEwRDtRQUNoRCxpQkFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FDckMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQixDQUFDLENBQUM7Z0JBQ0UsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUN2QixPQUFPLEVBQUUsUUFBUSxDQUFDLEtBQUs7Z0JBQ3ZCLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSztnQkFDcEIsU0FBUyxFQUFFLFNBQVMsQ0FBQyxZQUFZO2FBQ2xDO1lBQ0gsQ0FBQyxDQUFDLElBQUksQ0FDVCxDQUFDO1FBRU0sZUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RFLG1CQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTFGLHlCQUFvQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUNwRiw2QkFBd0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFFNUYsbUJBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5RyxtQkFBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRWhFLHFCQUFnQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFckcsaUJBQVksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUYsbUJBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsZ0JBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFdEYsZUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWhGLFNBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQzdCLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3RHLENBQUM7UUFDUSxhQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVwRCxZQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXZFLG9CQUFlLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakYsZUFBVSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV4QixnQkFBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRzFFLE1BQU0sQ0FDSixHQUFHLEVBQUU7WUFDSCwyQ0FBMkM7WUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRTtnQkFDM0csSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ25DO1FBQ0gsQ0FBQyxFQUNELEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQzVCLENBQUM7UUFFRixNQUFNLENBQ0osR0FBRyxFQUFFO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLEVBQUU7Z0JBQ2pGLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbkM7UUFDSCxDQUFDLEVBQ0QsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FDNUIsQ0FBQztRQUVGLE1BQU0sQ0FDSixHQUFHLEVBQUU7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEVBQUU7Z0JBQzFGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEQ7UUFDSCxDQUFDLEVBQ0QsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FDNUIsQ0FBQztJQUNKLENBQUM7SUFFTyxlQUFlLENBV3JCLEVBQUUsT0FBTyxFQUFLO1FBQ2QsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQ3BDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFDYixPQUFPLEVBQ1AsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUNyQixlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQ25DLENBQUM7UUFDRixPQUFPLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVPLGNBQWM7UUFDcEIsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FDeEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUNiLGFBQWEsQ0FBQyxTQUFTLEVBQ3ZCLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFDckIsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUNuQyxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQTZCLE9BQU8sQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQ3pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyRSxVQUFVO1lBQ1YsZUFBZSxFQUFFLGVBQWUsQ0FBQyxVQUFVLENBQUM7U0FDN0MsQ0FBQyxDQUFDLEVBQ0gsQ0FBQyxpQkFBaUIsQ0FBQyxFQUNuQixDQUFDLEtBQUssQ0FBQyxDQUNSLENBQUM7UUFDRixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQzdGLENBQUM7SUFDeEIsQ0FBQztJQUVTLFNBQVMsQ0FBQyxNQUFjLEVBQUUsSUFBa0I7UUFDcEQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVTLGFBQWEsQ0FBQyxPQUFZLEVBQUUsT0FBWTtRQUNoRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFUyxZQUFZLENBQUMsSUFBWTtRQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRVMsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDOzhHQTNNVSxvQkFBb0I7a0dBQXBCLG9CQUFvQiwrSUNySGpDLDh6VUFxUEE7OzJGRGhJYSxvQkFBb0I7a0JBTmhDLFNBQVM7K0JBQ0UsaUJBQWlCLG1CQUdWLHVCQUF1QixDQUFDLE1BQU07eUdBSzNDLFNBQVM7c0JBRFosS0FBSztnQkFXRixRQUFRO3NCQURYLEtBQUs7Z0JBUUYsWUFBWTtzQkFEZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIGNvbXB1dGVkLCBlZmZlY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBEYXRhU3RhdGUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL2FwaSc7XG5pbXBvcnQge1xuICBJQ3ljbGVKU09OTEQsXG4gIElucHV0IGFzIEhlc3RpYUlucHV0LFxuICBQcm9kdWN0LFxuICBOb2RlVHlwZSxcbiAgQW5pbWFsLFxuICBFbWlzc2lvbixcbiAgUHJhY3RpY2UsXG4gIFRlcm1UZXJtVHlwZSxcbiAgRW1pc3Npb25NZXRob2RUaWVyLFxuICBUZXJtLFxuICBUcmFuc2Zvcm1hdGlvblxufSBmcm9tICdAaGVzdGlhLWVhcnRoL3NjaGVtYSc7XG5pbXBvcnQgb3JkZXJCeSBmcm9tICdsb2Rhc2gub3JkZXJieSc7XG5pbXBvcnQgeyBwcm9wZXJ0eVZhbHVlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscy9kaXN0L3Rlcm0nO1xuaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscyc7XG5cbmltcG9ydCB7IEJsYW5rTm9kZXNLZXksIGJsYW5rTm9kZSwgZmlsdGVyQmxhbmtOb2RlLCBtZXRob2RUaWVyT3JkZXIgfSBmcm9tICcuLi8uLi9jb21tb24vbm9kZS11dGlscyc7XG5pbXBvcnQgeyBsb2dzS2V5IH0gZnJvbSAnLi4vY3ljbGVzLm1vZGVsJztcbmltcG9ydCB7IEhlTm9kZVN0b3JlU2VydmljZSB9IGZyb20gJy4uLy4uL25vZGUvbm9kZS1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IGdyb3VwTm9kZXNCeVRlcm0sIElHcm91cGVkS2V5cywgZ3JvdXBwZWRLZXlzIH0gZnJvbSAnLi4vLi4vY29tbW9uL25vZGUtdXRpbHMnO1xuaW1wb3J0IHsgYmFzZVVybCwgZGVmYXVsdExhYmVsIH0gZnJvbSAnLi4vLi4vY29tbW9uL3V0aWxzJztcblxuZW51bSBWaWV3IHtcbiAgdGFibGUgPSAnVGFibGUgdmlldycsXG4gIGNoYXJ0ID0gJ0NoYXJ0IHZpZXcnLFxuICB0aW1lbGluZSA9ICdPcGVyYXRpb25zIFRpbWVsaW5lJyxcbiAgbG9ncyA9ICdSZWNhbGN1bGF0aW9ucyBsb2dzJ1xufVxuXG5jb25zdCB0aW1lbGluZVRlcm1UeXBlID0gW1Rlcm1UZXJtVHlwZS5vcGVyYXRpb25dO1xuXG5pbnRlcmZhY2UgSUN5Y2xlQ29uZmlnIHtcbiAgbm9kZUtleTogQmxhbmtOb2Rlc0tleTtcbn1cblxuaW50ZXJmYWNlIElDeWNsZUNvbmZpZ0FuaW1hbCBleHRlbmRzIElDeWNsZUNvbmZpZyB7XG4gIG5vZGVLZXk6IEJsYW5rTm9kZXNLZXkuYW5pbWFscztcbn1cblxuaW50ZXJmYWNlIElDeWNsZUNvbmZpZ0VtaXNzaW9uIGV4dGVuZHMgSUN5Y2xlQ29uZmlnIHtcbiAgbm9kZUtleTogQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnM7XG59XG5cbmludGVyZmFjZSBJQ3ljbGVDb25maWdJbnB1dCBleHRlbmRzIElDeWNsZUNvbmZpZyB7XG4gIG5vZGVLZXk6IEJsYW5rTm9kZXNLZXkuaW5wdXRzO1xufVxuXG5pbnRlcmZhY2UgSUN5Y2xlQ29uZmlnUHJhY3RpY2UgZXh0ZW5kcyBJQ3ljbGVDb25maWcge1xuICBub2RlS2V5OiBCbGFua05vZGVzS2V5LnByYWN0aWNlcztcbn1cblxuY29uc3Qgdmlld0ljb246IHtcbiAgW3ZpZXcgaW4gVmlld106IHN0cmluZztcbn0gPSB7XG4gIFtWaWV3LmNoYXJ0XTogJ2NoYXJ0LWJhcicsXG4gIFtWaWV3LmxvZ3NdOiAnY2FsY3VsYXRvcicsXG4gIFtWaWV3LnRhYmxlXTogJ2xpc3QnLFxuICBbVmlldy50aW1lbGluZV06ICdsaXN0LWFsdCdcbn07XG5cbmNvbnN0IG5vZGVLZXlWaWV3czoge1xuICBbdHlwZSBpbiBCbGFua05vZGVzS2V5XT86IFZpZXdbXTtcbn0gPSB7XG4gIFtCbGFua05vZGVzS2V5LmFuaW1hbHNdOiBbVmlldy50YWJsZV0sXG4gIFtCbGFua05vZGVzS2V5LmVtaXNzaW9uc106IFtWaWV3LnRhYmxlLCBWaWV3LmNoYXJ0LCBWaWV3LmxvZ3NdLFxuICBbQmxhbmtOb2Rlc0tleS5pbnB1dHNdOiBbVmlldy50YWJsZSwgVmlldy5jaGFydCwgVmlldy5sb2dzXSxcbiAgW0JsYW5rTm9kZXNLZXkucHJvZHVjdHNdOiBbVmlldy50YWJsZSwgVmlldy5jaGFydCwgVmlldy5sb2dzXSxcbiAgW0JsYW5rTm9kZXNLZXkucHJhY3RpY2VzXTogW1ZpZXcudGFibGUsIFZpZXcudGltZWxpbmUsIFZpZXcubG9nc11cbn07XG5cbmNvbnN0IG5vZGVLZXlGaWx0ZXJUZXJtVHlwZXM6IHtcbiAgW3R5cGUgaW4gQmxhbmtOb2Rlc0tleV0/OiBUZXJtVGVybVR5cGVbXTtcbn0gPSB7XG4gIFtCbGFua05vZGVzS2V5LmVtaXNzaW9uc106IFtUZXJtVGVybVR5cGUuZW1pc3Npb25dXG59O1xuXG5jb25zdCBmaWx0ZXJWYWx1ZXNUaW1lbGluZSA9ICh2YWx1ZXM6IGJsYW5rTm9kZVtdKSA9PiB2YWx1ZXMuZmlsdGVyKHAgPT4gdGltZWxpbmVUZXJtVHlwZS5pbmNsdWRlcyhwLnRlcm0/LnRlcm1UeXBlKSk7XG5cbnR5cGUgZ3JvdXBlZEVtaXNzaW9ucyA9IHtcbiAgW21ldGhvZFRpZXIgaW4gRW1pc3Npb25NZXRob2RUaWVyXTogSUdyb3VwZWRLZXlzPEVtaXNzaW9uPltdO1xufTtcblxuZXhwb3J0IGVudW0gQ3ljbGVOb2Rlc0tleUdyb3VwIHtcbiAgYW5pbWFscyA9ICdhbmltYWxzJyxcbiAgdHJhbnNmb3JtYXRpb25zID0gJ3RyYW5zZm9ybWF0aW9ucydcbn1cblxudHlwZSBncm91cGVkTm9kZSA9IEFuaW1hbCB8IFRyYW5zZm9ybWF0aW9uO1xuXG5jb25zdCBjeWNsZUdyb3VwTm9kZSA9XG4gIChjeWNsZT86IElDeWNsZUpTT05MRCkgPT5cbiAgKG5vZGU/OiBncm91cGVkTm9kZSk6IGdyb3VwZWROb2RlICYgeyBuYW1lOiBzdHJpbmc7ICdAaWQnOiBzdHJpbmcgfSA9PiAoe1xuICAgIC4uLm5vZGUsXG4gICAgbmFtZTogY3ljbGU/Lm5hbWUsXG4gICAgJ0BpZCc6IGN5Y2xlPy5bJ0BpZCddIC8vIHNldCBAaWQgc28gd2UgY2FuIGZldGNoIHRoZSBsb2dzIGZyb20gdGhlIEN5Y2xlXG4gIH0pO1xuXG5jb25zdCBjeWNsZUdyb3VwTm9kZXMgPSAoZ3JvdXBLZXk6IEN5Y2xlTm9kZXNLZXlHcm91cCwgY3ljbGU/OiBJQ3ljbGVKU09OTEQpOiBncm91cGVkTm9kZVtdID0+XG4gIChjeWNsZT8uW2dyb3VwS2V5XSB8fCBbXSkubWFwKGN5Y2xlR3JvdXBOb2RlKGN5Y2xlKSk7XG5cbmNvbnN0IGZpbHRlckdyb3VwTm9kZXNCeVRlcm0gPSAoZ3JvdXBLZXk6IEN5Y2xlTm9kZXNLZXlHcm91cCwgY3ljbGVzOiBJQ3ljbGVKU09OTERbXSwgdGVybT86IFRlcm0pOiBncm91cGVkTm9kZVtdID0+XG4gIGN5Y2xlcy5tYXAoY3ljbGUgPT5cbiAgICBjeWNsZUdyb3VwTm9kZShjeWNsZSkoXG4gICAgICAoKGN5Y2xlPy5bZ3JvdXBLZXldIGFzIGdyb3VwZWROb2RlW10pIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZmluZChub2RlID0+IG5vZGUudGVybT8ubmFtZSA9PT0gdGVybT8ubmFtZSlcbiAgICApXG4gICk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlLWN5Y2xlcy1ub2RlcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jeWNsZXMtbm9kZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jeWNsZXMtbm9kZXMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQ3ljbGVzTm9kZXNDb21wb25lbnQge1xuICBwcm90ZWN0ZWQgX2RhdGFTdGF0ZSA9IHNpZ25hbChEYXRhU3RhdGUub3JpZ2luYWwpO1xuICBASW5wdXQoKVxuICBzZXQgZGF0YVN0YXRlKHZhbHVlOiBEYXRhU3RhdGUpIHtcbiAgICB0aGlzLl9kYXRhU3RhdGUuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBCbGFua05vZGVzS2V5ID0gQmxhbmtOb2Rlc0tleTtcbiAgcHJvdGVjdGVkIGZpcnN0Tm9kZUtleSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX25vZGVLZXlzKCk/LlswXSk7XG4gIHByb3RlY3RlZCBzZWxlY3RlZE5vZGVLZXkgPSBzaWduYWwodW5kZWZpbmVkIGFzIEJsYW5rTm9kZXNLZXkpO1xuXG4gIHByb3RlY3RlZCBfbm9kZUtleXMgPSBzaWduYWwoW10gYXMgQmxhbmtOb2Rlc0tleVtdKTtcbiAgQElucHV0KClcbiAgc2V0IG5vZGVLZXlzKHZhbHVlOiBCbGFua05vZGVzS2V5W10pIHtcbiAgICB0aGlzLl9ub2RlS2V5cy5zZXQodmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNlbGVjdGVkR3JvdXBUZXJtID0gc2lnbmFsKHVuZGVmaW5lZCBhcyBUZXJtKTtcbiAgcHJvdGVjdGVkIF9ub2RlS2V5R3JvdXAgPSBzaWduYWwodW5kZWZpbmVkIGFzIEN5Y2xlTm9kZXNLZXlHcm91cCk7XG4gIEBJbnB1dCgpXG4gIHNldCBub2RlS2V5R3JvdXAodmFsdWU6IEN5Y2xlTm9kZXNLZXlHcm91cCkge1xuICAgIHRoaXMuX25vZGVLZXlHcm91cC5zZXQodmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJhc2VVcmwgPSBiYXNlVXJsKCk7XG4gIHByb3RlY3RlZCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZTtcbiAgcHJvdGVjdGVkIGRlZmF1bHRMYWJlbCA9IGRlZmF1bHRMYWJlbDtcbiAgcHJvdGVjdGVkIHNob3dEb3dubG9hZCA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBoZWFkZXJLZXlzID0gY29tcHV0ZWQoKCkgPT4gW1xuICAgICdjeWNsZS5pZCcsXG4gICAgJ2N5Y2xlLkBpZCcsXG4gICAgJ3RyYW5zZm9ybWF0aW9uLmlkJyxcbiAgICAndHJhbnNmb3JtYXRpb24uQGlkJyxcbiAgICAuLi50aGlzLl9ub2RlS2V5cygpLmZsYXRNYXAoa2V5ID0+IFtgY3ljbGUuJHtrZXl9LmAsIGB0cmFuc2Zvcm1hdGlvbi4ke2tleX0uYF0pXG4gIF0pO1xuXG4gIHByb3RlY3RlZCBWaWV3ID0gVmlldztcbiAgcHJvdGVjdGVkIHZpZXdJY29uID0gdmlld0ljb247XG4gIHByaXZhdGUgc2hvd1ZpZXcgPSBjb21wdXRlZChcbiAgICAoKSA9PlxuICAgICAgKHtcbiAgICAgICAgW1ZpZXcuY2hhcnRdOiB0aGlzLnNlbGVjdGVkTm9kZUtleSgpID09PSBCbGFua05vZGVzS2V5LmVtaXNzaW9ucyA/IHRoaXMuY3ljbGVzKCkubGVuZ3RoID4gMSA6IHRydWUsXG4gICAgICAgIFtWaWV3LmxvZ3NdOiAhdGhpcy5pc09yaWdpbmFsKCkgJiYgdGhpcy5oYXNSZWNhbGN1bGF0ZWROb2RlcygpLFxuICAgICAgICBbVmlldy50YWJsZV06IHRydWUsXG4gICAgICAgIFtWaWV3LnRpbWVsaW5lXTogdGhpcy5lbmFibGVUaW1lbGluZSgpXG4gICAgICB9KSBhcyB7IFt2aWV3IGluIFZpZXddOiBib29sZWFuIH1cbiAgKTtcbiAgcHJvdGVjdGVkIHZpZXdzID0gY29tcHV0ZWQoKCkgPT4gbm9kZUtleVZpZXdzW3RoaXMuc2VsZWN0ZWROb2RlS2V5KCldPy5maWx0ZXIodmlldyA9PiB0aGlzLnNob3dWaWV3KClbdmlld10pID8/IFtdKTtcbiAgcHJvdGVjdGVkIHNlbGVjdGVkVmlldyA9IHNpZ25hbChWaWV3LnRhYmxlKTtcblxuICBwcml2YXRlIF9hbGxOb2RlcyA9IHRvU2lnbmFsKHRoaXMubm9kZVN0b3JlU2VydmljZS5maW5kJDxJQ3ljbGVKU09OTEQ+KE5vZGVUeXBlLkN5Y2xlKSk7XG4gIHByaXZhdGUgb3JpZ2luYWxOb2RlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2FsbE5vZGVzKCk/Lm1hcChkYXRhID0+IGRhdGFbRGF0YVN0YXRlLm9yaWdpbmFsXSkgfHwgW10pO1xuICBwcml2YXRlIGN1cnJlbnROb2RlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2FsbE5vZGVzKCk/Lm1hcChkYXRhID0+IGRhdGFbdGhpcy5fZGF0YVN0YXRlKCldKSB8fCBbXSk7XG5cbiAgLy8gY2FuIGJlIEN5Y2xlIG9yIFRyYW5zZm9ybWF0aW9uXG4gIHByb3RlY3RlZCBvcmlnaW5hbEN5Y2xlcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5fbm9kZUtleUdyb3VwKClcbiAgICAgID8gZmlsdGVyR3JvdXBOb2Rlc0J5VGVybSh0aGlzLl9ub2RlS2V5R3JvdXAoKSwgdGhpcy5vcmlnaW5hbE5vZGVzKCksIHRoaXMuc2VsZWN0ZWRHcm91cFRlcm0oKSlcbiAgICAgIDogdGhpcy5vcmlnaW5hbE5vZGVzKClcbiAgKTtcbiAgcHJvdGVjdGVkIGN5Y2xlcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5fbm9kZUtleUdyb3VwKClcbiAgICAgID8gZmlsdGVyR3JvdXBOb2Rlc0J5VGVybSh0aGlzLl9ub2RlS2V5R3JvdXAoKSwgdGhpcy5jdXJyZW50Tm9kZXMoKSwgdGhpcy5zZWxlY3RlZEdyb3VwVGVybSgpKVxuICAgICAgOiB0aGlzLmN1cnJlbnROb2RlcygpXG4gICk7XG5cbiAgcHJpdmF0ZSBzZWxlY3RlZEluZGV4ID0gc2lnbmFsKDApO1xuICBwcml2YXRlIG9naXJpbmFsU2VsZWN0ZWRDeWNsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3JpZ2luYWxDeWNsZXMoKT8uW3RoaXMuc2VsZWN0ZWRJbmRleCgpXSk7XG4gIHByaXZhdGUgc2VsZWN0ZWRDeWNsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY3ljbGVzKCk/Llt0aGlzLnNlbGVjdGVkSW5kZXgoKV0pO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRMb2dzS2V5ID0gY29tcHV0ZWQoKCkgPT4gbG9nc0tleSh0aGlzLnNlbGVjdGVkQ3ljbGUoKSkpO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRPcmlnaW5hbFZhbHVlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMub2dpcmluYWxTZWxlY3RlZEN5Y2xlKCk/Llt0aGlzLnNlbGVjdGVkTm9kZUtleSgpXSB8fCBbXSk7XG4gIHByb3RlY3RlZCBzZWxlY3RlZFJlY2FsY3VsYXRlZFZhbHVlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0ZWRDeWNsZSgpPy5bdGhpcy5zZWxlY3RlZE5vZGVLZXkoKV0gfHwgW10pO1xuICAvLyBUT0RPOiBoYW5kbGUgdHJhbnNmb3JtYXRpb24gYW5kIG5vbi1pbmRleGVkIG5vZGVzIG9uIENFXG4gIHByb3RlY3RlZCBzZWxlY3RlZE5vZGUgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuc2VsZWN0ZWRDeWNsZSgpXG4gICAgICA/IHtcbiAgICAgICAgICAuLi50aGlzLnNlbGVjdGVkQ3ljbGUoKSxcbiAgICAgICAgICAnQHR5cGUnOiBOb2RlVHlwZS5DeWNsZSxcbiAgICAgICAgICB0eXBlOiBOb2RlVHlwZS5DeWNsZSxcbiAgICAgICAgICBkYXRhU3RhdGU6IERhdGFTdGF0ZS5yZWNhbGN1bGF0ZWRcbiAgICAgICAgfVxuICAgICAgOiBudWxsXG4gICk7XG5cbiAgcHJpdmF0ZSBpc09yaWdpbmFsID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fZGF0YVN0YXRlKCkgPT09IERhdGFTdGF0ZS5vcmlnaW5hbCk7XG4gIHByaXZhdGUgb3JpZ2luYWxWYWx1ZXMgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5pc09yaWdpbmFsKCkgPyBudWxsIDogdGhpcy5vcmlnaW5hbEN5Y2xlcygpKSB8fCBbXSk7XG5cbiAgcHJpdmF0ZSBoYXNSZWNhbGN1bGF0ZWROb2RlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY3ljbGVzKCkuc29tZShjeWNsZSA9PiAhY3ljbGUuYWdncmVnYXRlZCkpO1xuICBwcm90ZWN0ZWQgc2hvd1N3aXRjaFRvUmVjYWxjdWxhdGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5pc09yaWdpbmFsKCkgJiYgdGhpcy5oYXNSZWNhbGN1bGF0ZWROb2RlcygpKTtcblxuICBwcm90ZWN0ZWQgdGltZWxpbmVWYWx1ZXMgPSBjb21wdXRlZCgoKSA9PiBmaWx0ZXJWYWx1ZXNUaW1lbGluZSh0aGlzLnNlbGVjdGVkQ3ljbGUoKT8uW3RoaXMuc2VsZWN0ZWROb2RlS2V5KCldIHx8IFtdKSk7XG4gIHByaXZhdGUgZW5hYmxlVGltZWxpbmUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnRpbWVsaW5lVmFsdWVzKCkubGVuZ3RoID4gMCk7XG5cbiAgcHJvdGVjdGVkIGlzTm9kZUtleUFsbG93ZWQgPSBjb21wdXRlZCgoKSA9PiBub2RlS2V5Vmlld3NbdGhpcy5maXJzdE5vZGVLZXkoKV0uaW5jbHVkZXModGhpcy5zZWxlY3RlZFZpZXcoKSkpO1xuXG4gIHByaXZhdGUgZ3JvdXBlZE5vZGVzID0gY29tcHV0ZWQoKCkgPT4gY3ljbGVHcm91cE5vZGVzKHRoaXMuX25vZGVLZXlHcm91cCgpLCB0aGlzLm9yaWdpbmFsTm9kZXMoKT8uWzBdKSk7XG4gIHByb3RlY3RlZCBncm91cE5vZGVUZXJtcyA9IGNvbXB1dGVkKCgpID0+IHVuaXF1ZSh0aGlzLmdyb3VwZWROb2RlcygpLm1hcCgoeyB0ZXJtIH0pID0+IHRlcm0pKSk7XG4gIHByb3RlY3RlZCBpc0dyb3VwTm9kZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX25vZGVLZXlHcm91cCgpICYmIHRoaXMuZ3JvdXBlZE5vZGVzKCk/Lmxlbmd0aCA+IDApO1xuXG4gIHByb3RlY3RlZCBpc0VtaXNzaW9uID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zZWxlY3RlZE5vZGVLZXkoKSA9PT0gQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnMpO1xuXG4gIHByb3RlY3RlZCBkYXRhID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLmlzRW1pc3Npb24oKVxuICAgICAgPyB0aGlzLmdyb3VwRW1pc3Npb25zKClcbiAgICAgIDogT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuX25vZGVLZXlzKCkubWFwKG5vZGVLZXkgPT4gW25vZGVLZXksIHRoaXMuZ3JvdXBOb2Rlc0J5S2V5KHsgbm9kZUtleSB9KV0pKVxuICApO1xuICBwcm90ZWN0ZWQgZGF0YUtleXMgPSBjb21wdXRlZCgoKSA9PiBPYmplY3Qua2V5cyh0aGlzLmRhdGEoKSkpO1xuXG4gIHByb3RlY3RlZCBoYXNEYXRhID0gY29tcHV0ZWQoKCkgPT4gT2JqZWN0LnZhbHVlcyh0aGlzLmRhdGEoKSkuZmxhdCgpLmxlbmd0aCA+IDApO1xuXG4gIHByb3RlY3RlZCBmaWx0ZXJUZXJtVHlwZXMgPSBjb21wdXRlZCgoKSA9PiBub2RlS2V5RmlsdGVyVGVybVR5cGVzW3RoaXMuc2VsZWN0ZWROb2RlS2V5KCldKTtcbiAgcHJvdGVjdGVkIGZpbHRlclRlcm0gPSBzaWduYWwoJycpO1xuXG4gIHByb3RlY3RlZCBjc3ZGaWxlbmFtZSA9IGNvbXB1dGVkKCgpID0+IGAke3RoaXMuX25vZGVLZXlzKCkuam9pbignLScpfS5jc3ZgKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5vZGVTdG9yZVNlcnZpY2U6IEhlTm9kZVN0b3JlU2VydmljZSkge1xuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgLy8gbWFrZSBzdXJlIGxvZ3MgZG9lcyBub3QgcmVtYWluIGRpc3BsYXllZFxuICAgICAgICBpZiAoKHRoaXMuaXNPcmlnaW5hbCgpICYmIHRoaXMuc2VsZWN0ZWRWaWV3KCkgPT09IFZpZXcubG9ncykgfHwgIXRoaXMudmlld3MoKS5pbmNsdWRlcyh0aGlzLnNlbGVjdGVkVmlldygpKSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3LnNldChWaWV3LnRhYmxlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG5cbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZE5vZGVLZXkoKSB8fCAhdGhpcy5fbm9kZUtleXMoKS5pbmNsdWRlcyh0aGlzLnNlbGVjdGVkTm9kZUtleSgpKSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlS2V5LnNldCh0aGlzLmZpcnN0Tm9kZUtleSgpKTtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVmlldy5zZXQoVmlldy50YWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuXG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRHcm91cFRlcm0oKSB8fCAhdGhpcy5ncm91cE5vZGVUZXJtcygpLmluY2x1ZGVzKHRoaXMuc2VsZWN0ZWRHcm91cFRlcm0oKSkpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkR3JvdXBUZXJtLnNldCh0aGlzLmdyb3VwTm9kZVRlcm1zKClbMF0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ3JvdXBOb2Rlc0J5S2V5PFxuICAgIFQgZXh0ZW5kcyBJQ3ljbGVDb25maWcsXG4gICAgUiA9IFQgZXh0ZW5kcyBJQ3ljbGVDb25maWdBbmltYWxcbiAgICAgID8gQW5pbWFsXG4gICAgICA6IFQgZXh0ZW5kcyBJQ3ljbGVDb25maWdFbWlzc2lvblxuICAgICAgPyBFbWlzc2lvblxuICAgICAgOiBUIGV4dGVuZHMgSUN5Y2xlQ29uZmlnSW5wdXRcbiAgICAgID8gSGVzdGlhSW5wdXRcbiAgICAgIDogVCBleHRlbmRzIElDeWNsZUNvbmZpZ1ByYWN0aWNlXG4gICAgICA/IFByYWN0aWNlXG4gICAgICA6IFByb2R1Y3RcbiAgPih7IG5vZGVLZXkgfTogVCk6IElHcm91cGVkS2V5czxSPltdIHtcbiAgICBjb25zdCBub2Rlc1BlckN5Y2xlID0gZ3JvdXBOb2Rlc0J5VGVybTxJQ3ljbGVKU09OTEQgfCBncm91cGVkTm9kZSwgUj4oXG4gICAgICB0aGlzLmN5Y2xlcygpLFxuICAgICAgbm9kZUtleSxcbiAgICAgIHRoaXMub3JpZ2luYWxWYWx1ZXMoKSxcbiAgICAgIGZpbHRlckJsYW5rTm9kZSh0aGlzLmZpbHRlclRlcm0oKSlcbiAgICApO1xuICAgIHJldHVybiBvcmRlckJ5KGdyb3VwcGVkS2V5cyhub2Rlc1BlckN5Y2xlKSwgWydrZXknXSwgWydhc2MnXSk7XG4gIH1cblxuICBwcml2YXRlIGdyb3VwRW1pc3Npb25zKCkge1xuICAgIGNvbnN0IGVtaXNzaW9uc1BlckN5Y2xlID0gZ3JvdXBOb2Rlc0J5VGVybTxJQ3ljbGVKU09OTEQgfCBncm91cGVkTm9kZSwgRW1pc3Npb24+KFxuICAgICAgdGhpcy5jeWNsZXMoKSxcbiAgICAgIEJsYW5rTm9kZXNLZXkuZW1pc3Npb25zLFxuICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlcygpLFxuICAgICAgZmlsdGVyQmxhbmtOb2RlKHRoaXMuZmlsdGVyVGVybSgpKVxuICAgICk7XG4gICAgY29uc3QgdmFsdWVzOiBJR3JvdXBlZEtleXM8RW1pc3Npb24+W10gPSBvcmRlckJ5KGdyb3VwcGVkS2V5cyhlbWlzc2lvbnNQZXJDeWNsZSksIFsna2V5J10sIFsnYXNjJ10pO1xuICAgIGNvbnN0IG1ldGhvZFRpZXJzID0gb3JkZXJCeShcbiAgICAgIHVuaXF1ZSh2YWx1ZXMubWFwKCh7IHZhbHVlIH0pID0+IHZhbHVlLm1ldGhvZFRpZXIpKS5tYXAobWV0aG9kVGllciA9PiAoe1xuICAgICAgICBtZXRob2RUaWVyLFxuICAgICAgICBtZXRob2RUaWVyT3JkZXI6IG1ldGhvZFRpZXJPcmRlcihtZXRob2RUaWVyKVxuICAgICAgfSkpLFxuICAgICAgWydtZXRob2RUaWVyT3JkZXInXSxcbiAgICAgIFsnYXNjJ11cbiAgICApO1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBtZXRob2RUaWVycy5tYXAoKHsgbWV0aG9kVGllciB9KSA9PiBbbWV0aG9kVGllciwgdmFsdWVzLmZpbHRlcigoeyB2YWx1ZSB9KSA9PiB2YWx1ZS5tZXRob2RUaWVyID09PSBtZXRob2RUaWVyKV0pXG4gICAgKSBhcyBncm91cGVkRW1pc3Npb25zO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRyYWNrQnlJZChfaW5kZXg6IG51bWJlciwgaXRlbTogSUN5Y2xlSlNPTkxEKSB7XG4gICAgcmV0dXJuIGl0ZW1bJ0BpZCddO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZVBvcG92ZXIocG9wb3ZlcjogYW55LCBjb250ZXh0OiBhbnkpIHtcbiAgICByZXR1cm4gcG9wb3Zlci5pc09wZW4oKSA/IHBvcG92ZXIuY2xvc2UoKSA6IHBvcG92ZXIub3Blbihjb250ZXh0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaWx0ZXJCeVRlcm0odGVybTogc3RyaW5nKSB7XG4gICAgdGhpcy5maWx0ZXJUZXJtLnNldCh0ZXJtKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZWxlY3RJbmRleCh7IHRhcmdldDogeyB2YWx1ZSB9IH0pIHtcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXguc2V0KCt2YWx1ZSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0YWJzIGlzLW1iLTFcIiAqbmdJZj1cImlzR3JvdXBOb2RlKClcIj5cbiAgPHVsPlxuICAgIDxsaSAqbmdGb3I9XCJsZXQgdGVybSBvZiBncm91cE5vZGVUZXJtcygpXCIgW2NsYXNzLmlzLWFjdGl2ZV09XCJzZWxlY3RlZEdyb3VwVGVybSgpID09PSB0ZXJtXCI+XG4gICAgICA8YSAoY2xpY2spPVwic2VsZWN0ZWRHcm91cFRlcm0uc2V0KHRlcm0pXCI+e3sgdGVybS5uYW1lIH19PC9hPlxuICAgIDwvbGk+XG4gIDwvdWw+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImNvbHVtbnMgaXMtdmFyaWFibGUgaXMtYWxpZ24taXRlbXMtY2VudGVyIGlzLTIgaXMtbS0wXCIgKm5nSWY9XCJoYXNEYXRhKClcIj5cbiAgPGRpdiBjbGFzcz1cImNvbHVtblwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFZpZXcoKSA9PT0gVmlldy50YWJsZVwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbCBpcy1naG9zdFwiXG4gICAgICAgIChjbGljayk9XCJzaG93RG93bmxvYWQgPSB0cnVlXCJcbiAgICAgICAgbmdiVG9vbHRpcD1cIkRvd25sb2FkIGFzIENTVlwiXG4gICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiPlxuICAgICAgICA8ZmEtaWNvbiBpY29uPVwiZG93bmxvYWRcIiBzaXplPVwibGdcIj48L2ZhLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93XCIgKm5nSWY9XCJzZWxlY3RlZFZpZXcoKSA9PT0gVmlldy50YWJsZVwiPlxuICAgIDxoZS1zZWFyY2gtZXh0ZW5kXG4gICAgICBjbGFzcz1cImlzLXNlY29uZGFyeSBpcy1zbWFsbFwiXG4gICAgICBwbGFjZWhvbGRlcj1cIkZpbHRlciB0ZXJtcyBieSBuYW1lXCJcbiAgICAgIChzZWFyY2gpPVwiZmlsdGVyQnlUZXJtKCRldmVudClcIj48L2hlLXNlYXJjaC1leHRlbmQ+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvd1wiICpuZ0lmPVwidmlld3MoKT8ubGVuZ3RoID4gMVwiPlxuICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0Zvcj1cImxldCB2aWV3IG9mIHZpZXdzKClcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJzZWxlY3RlZFZpZXcoKSA9PT0gdmlld1wiIChjbGljayk9XCJzZWxlY3RlZFZpZXcuc2V0KHZpZXcpXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIGlzLXNtYWxsXCI+XG4gICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJ2aWV3SWNvblt2aWV3XVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1oaWRkZW4tbW9iaWxlXCI+e3sgdmlldyB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTm9kZUtleUFsbG93ZWQoKVwiPlxuICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJzZWxlY3RlZFZpZXcoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJpcy1weC0zIGlzLXBiLTNcIiAqbmdTd2l0Y2hDYXNlPVwiVmlldy50YWJsZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0RhdGEoKTsgZWxzZSBlbXB0eVRhYmxlXCI+XG4gICAgICAgIDxoZS1kYXRhLXRhYmxlIGNsYXNzPVwibWItMSBpcy1zbWFsbFwiIFtzbWFsbF09XCJ0cnVlXCIgbWF4SGVpZ2h0PVwiMzIwXCI+XG4gICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtZnVsbHdpZHRoIGlzLW5hcnJvdyBpcy1zdHJpcGVkXCI+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0ciBjbGFzcz1cImhhcy10ZXh0LXdlaWdodC1ib2xkXCIgKm5nSWY9XCJkYXRhS2V5cygpLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ3aWR0aC1hdXRvXCI+PC90aD5cbiAgICAgICAgICAgICAgICA8dGggW2NsYXNzLmlzLWhpZGRlbl09XCJpc0dyb3VwTm9kZSgpXCI+PC90aD5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRhdGFLZXkgb2YgZGF0YUtleXMoKTsgbGV0IGRhdGFLZXlMYXN0ID0gbGFzdFwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGEoKVtkYXRhS2V5XT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBbYXR0ci5jb2xzcGFuXT1cImRhdGEoKVtkYXRhS2V5XS5sZW5ndGhcIiBbY2xhc3MuaGFzLWJvcmRlci1yaWdodF09XCIhZGF0YUtleUxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBkYXRhS2V5IHwga2V5VG9MYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L3RyPlxuXG4gICAgICAgICAgICAgIDx0ciBjbGFzcz1cImhhcy10ZXh0LXdlaWdodC1zZW1pYm9sZFwiPlxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiaGFzLWJvcmRlci1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiaXNHcm91cE5vZGUoKVwiPjwvdGg+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkYXRhS2V5IG9mIGRhdGFLZXlzKCk7IGxldCBkYXRhS2V5TGFzdCA9IGxhc3RcIj5cbiAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbm9kZSBvZiBkYXRhKClbZGF0YUtleV07IGxldCBub2RlTGFzdCA9IGxhc3RcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJub2RlLnZhbHVlLnRlcm0ubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5oYXMtYm9yZGVyLXJpZ2h0XT1cImRhdGFLZXlzKCkubGVuZ3RoID4gMSAmJiAhZGF0YUtleUxhc3QgJiYgbm9kZUxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGhlLW5vZGUtbGluayBbbm9kZV09XCJub2RlLnZhbHVlLnRlcm1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cIm5vZGUudmFsdWUudGVybS5uYW1lIHwgZWxsaXBzaXM6IDMwIHwgY29tcG91bmRcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvaGUtbm9kZS1saW5rPlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiaXMtaXRhbGljIGhhcy10ZXh0LXdlaWdodC1zZW1pYm9sZFwiPlxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiaGFzLWJvcmRlci1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiaXNHcm91cE5vZGUoKVwiPlxuICAgICAgICAgICAgICAgICAgPGEgW2hyZWZdPVwiYmFzZVVybCArICcvc2NoZW1hL0N5Y2xlI2Z1bmN0aW9uYWxVbml0J1wiIHRhcmdldD1cIl9ibGFua1wiPkZ1bmN0aW9uYWwgdW5pdDwvYT5cbiAgICAgICAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZGF0YUtleSBvZiBkYXRhS2V5cygpOyBsZXQgZGF0YUtleUxhc3QgPSBsYXN0XCI+XG4gICAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG5vZGUgb2YgZGF0YSgpW2RhdGFLZXldOyBsZXQgbm9kZUxhc3QgPSBsYXN0XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwibm9kZS52YWx1ZS50ZXJtLnVuaXRzXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmhhcy1ib3JkZXItcmlnaHRdPVwiZGF0YUtleXMoKS5sZW5ndGggPiAxICYmICFkYXRhS2V5TGFzdCAmJiBub2RlTGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cIm5vZGUudmFsdWUudGVybS51bml0cyB8IGNvbXBvdW5kXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8aGUtdGVybXMtdW5pdHMtZGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1tbC0yXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGVybV09XCJub2RlLnZhbHVlLnRlcm1cIj48L2hlLXRlcm1zLXVuaXRzLWRlc2NyaXB0aW9uPlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGN5Y2xlIG9mIGN5Y2xlcygpOyB0cmFja0J5OiB0cmFja0J5SWQ7IGxldCBjeWNsZUluZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3aWR0aC1hdXRvIGhhcy1ib3JkZXItcmlnaHRcIiBbYXR0ci50aXRsZV09XCJkZWZhdWx0TGFiZWwoY3ljbGUpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoZS1ub2RlLWxpbmsgW25vZGVdPVwiY3ljbGUudGVybSB8fCBjeWNsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGN5Y2xlSW5kZXggKyAxIH19LiB7eyBkZWZhdWx0TGFiZWwoY3ljbGUpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2hlLW5vZGUtbGluaz5cbiAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJoYXMtYm9yZGVyLXJpZ2h0XCIgW2NsYXNzLmlzLWhpZGRlbl09XCJpc0dyb3VwTm9kZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoZS1jeWNsZXMtZnVuY3Rpb25hbC11bml0LW1lYXN1cmUgW2N5Y2xlXT1cImN5Y2xlcygpWzBdXCI+PC9oZS1jeWNsZXMtZnVuY3Rpb25hbC11bml0LW1lYXN1cmU+XG4gICAgICAgICAgICAgICAgICA8L3RkPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkYXRhS2V5IG9mIGRhdGFLZXlzKCk7IGxldCBkYXRhS2V5TGFzdCA9IGxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpcy1ub3dyYXBcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBub2RlIG9mIGRhdGEoKVtkYXRhS2V5XTsgbGV0IG5vZGVMYXN0ID0gbGFzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmhhcy1ib3JkZXItcmlnaHRdPVwiZGF0YUtleXMoKS5sZW5ndGggPiAxICYmICFkYXRhS2V5TGFzdCAmJiBub2RlTGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm5vZGUudmFsdWUudmFsdWVzW2N5Y2xlWydAaWQnXV07IGVsc2UgZW1wdHlWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRyaWdnZXItcG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdiUG9wb3Zlcl09XCJkZXRhaWxzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcG92ZXJDbGFzcz1cImlzLW5hcnJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAjcD1cIm5nYlBvcG92ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwibGVmdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUG9wb3ZlcihwLCB7IGRhdGE6IG5vZGUudmFsdWUudmFsdWVzW2N5Y2xlWydAaWQnXV0sIGN5Y2xlOiBjeWNsZSwga2V5OiBkYXRhS2V5IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHBvaW50ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZShub2RlLnZhbHVlLnZhbHVlc1tjeWNsZVsnQGlkJ11dLnZhbHVlLCBub2RlLnZhbHVlLnRlcm1bJ0BpZCddKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcmVjaXNpb246IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGVmYXVsdDogJy0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aGUtYmxhbmstbm9kZS1zdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YVN0YXRlXT1cIl9kYXRhU3RhdGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtub2RlXT1cIm5vZGUudmFsdWUudmFsdWVzW2N5Y2xlWydAaWQnXV0ubm9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleT1cInZhbHVlXCI+PC9oZS1ibGFuay1ub2RlLXN0YXRlPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2hlLWRhdGEtdGFibGU+XG5cbiAgICAgICAgPGhlLWJsYW5rLW5vZGUtc3RhdGUtbm90aWNlIFtkYXRhU3RhdGVdPVwiX2RhdGFTdGF0ZSgpXCI+PC9oZS1ibGFuay1ub2RlLXN0YXRlLW5vdGljZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiVmlldy5jaGFydFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZmlyc3ROb2RlS2V5KClcIj5cbiAgICAgICAgPGhlLWN5Y2xlcy1yZXN1bHQgKm5nU3dpdGNoQ2FzZT1cIkJsYW5rTm9kZXNLZXkuaW5wdXRzXCIgW2N5Y2xlc109XCJjeWNsZXMoKVwiPjwvaGUtY3ljbGVzLXJlc3VsdD5cbiAgICAgICAgPGhlLWN5Y2xlcy1lbWlzc2lvbnMtY2hhcnRcbiAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnNcIlxuICAgICAgICAgIFtjeWNsZXNdPVwiY3ljbGVzKClcIj48L2hlLWN5Y2xlcy1lbWlzc2lvbnMtY2hhcnQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlZpZXcudGltZWxpbmVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWxlY3RDeWNsZVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiaXMtcHgtMyBpcy1wYi0zXCI+XG4gICAgICAgIDxoZS1jeWNsZXMtbm9kZXMtdGltZWxpbmVcbiAgICAgICAgICBbcmVjYWxjdWxhdGVkVmFsdWVzXT1cInRpbWVsaW5lVmFsdWVzKClcIlxuICAgICAgICAgIFtkYXRhU3RhdGVdPVwiX2RhdGFTdGF0ZSgpXCI+PC9oZS1jeWNsZXMtbm9kZXMtdGltZWxpbmU+XG5cbiAgICAgICAgPGhlLWJsYW5rLW5vZGUtc3RhdGUtbm90aWNlIFtkYXRhU3RhdGVdPVwiX2RhdGFTdGF0ZSgpXCI+PC9oZS1ibGFuay1ub2RlLXN0YXRlLW5vdGljZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiVmlldy5sb2dzXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VsZWN0Q3ljbGVcIj48L25nLWNvbnRhaW5lcj5cblxuICAgICAgPGRpdiBjbGFzcz1cInRhYnMgaXMtbWItMlwiICpuZ0lmPVwiX25vZGVLZXlzKCkubGVuZ3RoID4gMVwiPlxuICAgICAgICA8dWw+XG4gICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBub2RlS2V5IG9mIF9ub2RlS2V5cygpXCIgW2NsYXNzLmlzLWFjdGl2ZV09XCJzZWxlY3RlZE5vZGVLZXkoKSA9PT0gbm9kZUtleVwiPlxuICAgICAgICAgICAgPGEgKGNsaWNrKT1cInNlbGVjdGVkTm9kZUtleS5zZXQobm9kZUtleSlcIj57eyBub2RlS2V5IHwga2V5VG9MYWJlbCB9fTwvYT5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxoZS1ub2RlLWxvZ3MtbW9kZWxzXG4gICAgICAgICpuZ0lmPVwic2VsZWN0ZWROb2RlKClcIlxuICAgICAgICBbbm9kZV09XCJzZWxlY3RlZE5vZGUoKVwiXG4gICAgICAgIFtub2RlS2V5XT1cInNlbGVjdGVkTm9kZUtleSgpXCJcbiAgICAgICAgW2xvZ3NLZXldPVwic2VsZWN0ZWRMb2dzS2V5KClcIlxuICAgICAgICBbb3JpZ2luYWxWYWx1ZXNdPVwic2VsZWN0ZWRPcmlnaW5hbFZhbHVlcygpXCJcbiAgICAgICAgW3JlY2FsY3VsYXRlZFZhbHVlc109XCJzZWxlY3RlZFJlY2FsY3VsYXRlZFZhbHVlcygpXCJcbiAgICAgICAgW2ZpbHRlclRlcm1UeXBlc109XCJmaWx0ZXJUZXJtVHlwZXMoKVwiPjwvaGUtbm9kZS1sb2dzLW1vZGVscz5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPGhlLW5vZGUtY3N2LWV4cG9ydC1jb25maXJtXG4gICpuZ0lmPVwic2hvd0Rvd25sb2FkXCJcbiAgW25vZGVzXT1cImN5Y2xlcygpXCJcbiAgW2ZpbGVuYW1lXT1cImNzdkZpbGVuYW1lKClcIlxuICBbaXNVcGxvYWRdPVwiZmFsc2VcIlxuICBbaGVhZGVyS2V5c109XCJoZWFkZXJLZXlzKClcIlxuICAoY2xvc2VkKT1cInNob3dEb3dubG9hZCA9IGZhbHNlXCI+PC9oZS1ub2RlLWNzdi1leHBvcnQtY29uZmlybT5cblxuPG5nLXRlbXBsYXRlICNlbXB0eVRhYmxlPlxuICA8ZGl2IGNsYXNzPVwiaXMtcHQtMyBoYXMtdGV4dC1jZW50ZXJlZFwiPlxuICAgIDxzcGFuPk5vIGRhdGEgYXZhaWxhYmxlPC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMVwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIWZpbHRlclRlcm0oKVwiPm1hdGNoaW5nIHlvdXIgc2VhcmNoIGNyaXRlcmlhPC9zcGFuPlxuICAgIDxzcGFuPi48L3NwYW4+XG4gICAgPHNwYW4gKm5nSWY9XCJzaG93U3dpdGNoVG9SZWNhbGN1bGF0ZWQoKVwiPlxuICAgICAgU3dpdGNoIHRvXG4gICAgICA8Y29kZT5yZWNhbGN1bGF0ZWQ8L2NvZGU+XG4gICAgICB2ZXJzaW9uLlxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2VtcHR5VmFsdWU+XG4gIDxzcGFuPi08L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RldGFpbHMgbGV0LW5vZGU9XCJjeWNsZVwiIGxldC1kYXRhPVwiZGF0YVwiIGxldC1rZXk9XCJrZXlcIj5cbiAgPHA+XG4gICAgPGI+e3sgZGVmYXVsdExhYmVsKG5vZGUpIH19PC9iPlxuICA8L3A+XG4gIDxoZS1ub2RlLXZhbHVlLWRldGFpbHNcbiAgICBbZGF0YV09XCJkYXRhXCJcbiAgICBbZGF0YVN0YXRlXT1cIl9kYXRhU3RhdGUoKVwiXG4gICAgW25vZGVUeXBlXT1cIm5vZGVbJ0B0eXBlJ11cIlxuICAgIFtkYXRhS2V5XT1cImtleVwiPjwvaGUtbm9kZS12YWx1ZS1kZXRhaWxzPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzZWxlY3RDeWNsZT5cbiAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnMgaXMtcHktMiBpcy1weC0zXCIgKm5nSWY9XCJjeWNsZXMoKS5sZW5ndGggPiAxXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsIGlzLXN0YXRpYyBpcy1zZWNvbmRhcnlcIj5TZWxlY3QgYSBDeWNsZTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdCBpcy1zbWFsbCBpcy1mdWxsd2lkdGggaXMtc2Vjb25kYXJ5XCI+XG4gICAgICAgIDxzZWxlY3QgKGNoYW5nZSk9XCJzZWxlY3RJbmRleCgkZXZlbnQpXCI+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdmFsdWUgb2YgY3ljbGVzKCk7IGxldCBjeWNsZUluZGV4ID0gaW5kZXhcIiBbdmFsdWVdPVwiY3ljbGVJbmRleFwiPlxuICAgICAgICAgICAge3sgY3ljbGVJbmRleCArIDEgfX0uIHt7IGRlZmF1bHRMYWJlbCh2YWx1ZSkgfX1cbiAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
213
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3ljbGVzLW5vZGVzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jeWNsZXMvY3ljbGVzLW5vZGVzL2N5Y2xlcy1ub2Rlcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvY3ljbGVzL2N5Y2xlcy1ub2Rlcy9jeWNsZXMtbm9kZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEcsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBSUwsUUFBUSxFQUlSLFlBQVksRUFJYixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sT0FBTyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFN0MsT0FBTyxFQUFFLGFBQWEsRUFBYSxlQUFlLEVBQUUsZUFBZSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBZ0IsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkYsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUUzRCxJQUFLLElBS0o7QUFMRCxXQUFLLElBQUk7SUFDUCw0QkFBb0IsQ0FBQTtJQUNwQiw0QkFBb0IsQ0FBQTtJQUNwQix3Q0FBZ0MsQ0FBQTtJQUNoQyxvQ0FBNEIsQ0FBQTtBQUM5QixDQUFDLEVBTEksSUFBSSxLQUFKLElBQUksUUFLUjtBQUVELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7QUFzQmxELE1BQU0sUUFBUSxHQUVWO0lBQ0YsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsV0FBVztJQUN6QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxZQUFZO0lBQ3pCLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU07SUFDcEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsVUFBVTtDQUM1QixDQUFDO0FBRUYsTUFBTSxZQUFZLEdBRWQ7SUFDRixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDckMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztJQUM5RCxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQzNELENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDN0QsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQztDQUNsRSxDQUFDO0FBRUYsTUFBTSxzQkFBc0IsR0FFeEI7SUFDRixDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUM7Q0FDbkQsQ0FBQztBQUVGLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxNQUFtQixFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztBQU10SCxNQUFNLENBQU4sSUFBWSxrQkFHWDtBQUhELFdBQVksa0JBQWtCO0lBQzVCLHlDQUFtQixDQUFBO0lBQ25CLHlEQUFtQyxDQUFBO0FBQ3JDLENBQUMsRUFIVyxrQkFBa0IsS0FBbEIsa0JBQWtCLFFBRzdCO0FBSUQsTUFBTSxjQUFjLEdBQ2xCLENBQUMsS0FBb0IsRUFBRSxFQUFFLENBQ3pCLENBQUMsSUFBa0IsRUFBaUQsRUFBRSxDQUFDLENBQUM7SUFDdEUsR0FBRyxJQUFJO0lBQ1AsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJO0lBQ2pCLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxrREFBa0Q7Q0FDekUsQ0FBQyxDQUFDO0FBRUwsTUFBTSxlQUFlLEdBQUcsQ0FBQyxRQUE0QixFQUFFLEtBQW9CLEVBQWlCLEVBQUUsQ0FDNUYsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFFdkQsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLFFBQTRCLEVBQUUsTUFBc0IsRUFBRSxJQUFXLEVBQWlCLEVBQUUsQ0FDbEgsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUNqQixjQUFjLENBQUMsS0FBSyxDQUFDLENBQ25CLENBQUUsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFtQixJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksS0FBSyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQzFHLENBQ0YsQ0FBQztBQVFKLE1BQU0sT0FBTyxvQkFBb0I7SUFFL0IsSUFDSSxTQUFTLENBQUMsS0FBZ0I7UUFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQU9ELElBQ0ksUUFBUSxDQUFDLEtBQXNCO1FBQ2pDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFJRCxJQUNJLFlBQVksQ0FBQyxLQUF5QjtRQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBOEZELFlBQW9CLGdCQUFvQztRQUFwQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQW9CO1FBbkg5QyxlQUFVLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQU14QyxrQkFBYSxHQUFHLGFBQWEsQ0FBQztRQUM5QixpQkFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JELG9CQUFlLEdBQUcsTUFBTSxDQUFDLFNBQTBCLENBQUMsQ0FBQztRQUVyRCxjQUFTLEdBQUcsTUFBTSxDQUFDLEVBQXFCLENBQUMsQ0FBQztRQU0xQyxzQkFBaUIsR0FBRyxNQUFNLENBQUMsU0FBaUIsQ0FBQyxDQUFDO1FBQzlDLGtCQUFhLEdBQUcsTUFBTSxDQUFDLFNBQStCLENBQUMsQ0FBQztRQU14RCxZQUFPLEdBQUcsT0FBTyxFQUFFLENBQUM7UUFDcEIsa0JBQWEsR0FBRyxhQUFhLENBQUM7UUFDOUIsaUJBQVksR0FBRyxZQUFZLENBQUM7UUFDNUIsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFFckIsZUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNwQyxVQUFVO1lBQ1YsV0FBVztZQUNYLG1CQUFtQjtZQUNuQixvQkFBb0I7WUFDcEIsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLEdBQUcsR0FBRyxFQUFFLGtCQUFrQixHQUFHLEdBQUcsQ0FBQyxDQUFDO1NBQ2hGLENBQUMsQ0FBQztRQUVPLFNBQUksR0FBRyxJQUFJLENBQUM7UUFDWixhQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3RCLGFBQVEsR0FBRyxRQUFRLENBQ3pCLEdBQUcsRUFBRSxDQUNILENBQUM7WUFDQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDbEcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFO1lBQzlELENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUk7WUFDbEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRTtTQUN2QyxDQUFnQyxDQUNwQyxDQUFDO1FBQ1EsVUFBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDMUcsaUJBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXBDLGNBQVMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBZSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNoRixrQkFBYSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlGLGlCQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUVwRyxpQ0FBaUM7UUFDdkIsbUJBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQ3ZDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbEIsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDOUYsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FDekIsQ0FBQztRQUNRLFdBQU0sR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQy9CLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDbEIsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDN0YsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FDeEIsQ0FBQztRQUVNLGtCQUFhLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLDBCQUFxQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLGtCQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEUsb0JBQWUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEUsMkJBQXNCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEcsK0JBQTBCLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVHLDBEQUEwRDtRQUNoRCxpQkFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FDckMsSUFBSSxDQUFDLGFBQWEsRUFBRTtZQUNsQixDQUFDLENBQUM7Z0JBQ0UsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUN2QixPQUFPLEVBQUUsUUFBUSxDQUFDLEtBQUs7Z0JBQ3ZCLElBQUksRUFBRSxRQUFRLENBQUMsS0FBSztnQkFDcEIsU0FBUyxFQUFFLFNBQVMsQ0FBQyxZQUFZO2FBQ2xDO1lBQ0gsQ0FBQyxDQUFDLElBQUksQ0FDVCxDQUFDO1FBRU0sZUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3RFLG1CQUFjLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTFGLHlCQUFvQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUNwRiw2QkFBd0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7UUFFNUYsbUJBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5RyxtQkFBYyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRWhFLHFCQUFnQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFckcsaUJBQVksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUYsbUJBQWMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckYsZ0JBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFdEYsZUFBVSxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEtBQUssYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRWhGLFNBQUksR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQzdCLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUN2QixDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3RHLENBQUM7UUFDUSxhQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUVwRCxZQUFPLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXZFLG9CQUFlLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDakYsZUFBVSxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV4QixnQkFBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRzFFLE1BQU0sQ0FDSixHQUFHLEVBQUU7WUFDSCwyQ0FBMkM7WUFDM0MsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRTtnQkFDM0csSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ25DO1FBQ0gsQ0FBQyxFQUNELEVBQUUsaUJBQWlCLEVBQUUsSUFBSSxFQUFFLENBQzVCLENBQUM7UUFFRixNQUFNLENBQ0osR0FBRyxFQUFFO1lBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDLEVBQUU7Z0JBQ2pGLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDbkM7UUFDSCxDQUFDLEVBQ0QsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FDNUIsQ0FBQztRQUVGLE1BQU0sQ0FDSixHQUFHLEVBQUU7WUFDSCxJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEVBQUU7Z0JBQzFGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEQ7UUFDSCxDQUFDLEVBQ0QsRUFBRSxpQkFBaUIsRUFBRSxJQUFJLEVBQUUsQ0FDNUIsQ0FBQztJQUNKLENBQUM7SUFFTyxlQUFlLENBV3JCLEVBQUUsT0FBTyxFQUFLO1FBQ2QsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQ3BDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFDYixPQUFPLEVBQ1AsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUNyQixlQUFlLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQ25DLENBQUM7UUFDRixPQUFPLE9BQU8sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVPLGNBQWM7UUFDcEIsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FDeEMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUNiLGFBQWEsQ0FBQyxTQUFTLEVBQ3ZCLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFDckIsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUNuQyxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQTZCLE9BQU8sQ0FBQyxZQUFZLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQ3pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNyRSxVQUFVO1lBQ1YsZUFBZSxFQUFFLGVBQWUsQ0FBQyxVQUFVLENBQUM7U0FDN0MsQ0FBQyxDQUFDLEVBQ0gsQ0FBQyxpQkFBaUIsQ0FBQyxFQUNuQixDQUFDLEtBQUssQ0FBQyxDQUNSLENBQUM7UUFDRixPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQzdGLENBQUM7SUFDeEIsQ0FBQztJQUVTLFNBQVMsQ0FBQyxNQUFjLEVBQUUsSUFBa0I7UUFDcEQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQUVTLGFBQWEsQ0FBQyxPQUFZLEVBQUUsT0FBWTtRQUNoRCxPQUFPLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFUyxZQUFZLENBQUMsSUFBWTtRQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRVMsV0FBVyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUU7UUFDekMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDOzhHQTNNVSxvQkFBb0I7a0dBQXBCLG9CQUFvQiwrSUNySGpDLHd6VUFxUEE7OzJGRGhJYSxvQkFBb0I7a0JBTmhDLFNBQVM7K0JBQ0UsaUJBQWlCLG1CQUdWLHVCQUF1QixDQUFDLE1BQU07eUdBSzNDLFNBQVM7c0JBRFosS0FBSztnQkFXRixRQUFRO3NCQURYLEtBQUs7Z0JBUUYsWUFBWTtzQkFEZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgSW5wdXQsIGNvbXB1dGVkLCBlZmZlY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBEYXRhU3RhdGUgfSBmcm9tICdAaGVzdGlhLWVhcnRoL2FwaSc7XG5pbXBvcnQge1xuICBJQ3ljbGVKU09OTEQsXG4gIElucHV0IGFzIEhlc3RpYUlucHV0LFxuICBQcm9kdWN0LFxuICBOb2RlVHlwZSxcbiAgQW5pbWFsLFxuICBFbWlzc2lvbixcbiAgUHJhY3RpY2UsXG4gIFRlcm1UZXJtVHlwZSxcbiAgRW1pc3Npb25NZXRob2RUaWVyLFxuICBUZXJtLFxuICBUcmFuc2Zvcm1hdGlvblxufSBmcm9tICdAaGVzdGlhLWVhcnRoL3NjaGVtYSc7XG5pbXBvcnQgb3JkZXJCeSBmcm9tICdsb2Rhc2gub3JkZXJieSc7XG5pbXBvcnQgeyBwcm9wZXJ0eVZhbHVlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscy9kaXN0L3Rlcm0nO1xuaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscyc7XG5cbmltcG9ydCB7IEJsYW5rTm9kZXNLZXksIGJsYW5rTm9kZSwgZmlsdGVyQmxhbmtOb2RlLCBtZXRob2RUaWVyT3JkZXIgfSBmcm9tICcuLi8uLi9jb21tb24vbm9kZS11dGlscyc7XG5pbXBvcnQgeyBsb2dzS2V5IH0gZnJvbSAnLi4vY3ljbGVzLm1vZGVsJztcbmltcG9ydCB7IEhlTm9kZVN0b3JlU2VydmljZSB9IGZyb20gJy4uLy4uL25vZGUvbm9kZS1zdG9yZS5zZXJ2aWNlJztcbmltcG9ydCB7IGdyb3VwTm9kZXNCeVRlcm0sIElHcm91cGVkS2V5cywgZ3JvdXBwZWRLZXlzIH0gZnJvbSAnLi4vLi4vY29tbW9uL25vZGUtdXRpbHMnO1xuaW1wb3J0IHsgYmFzZVVybCwgZGVmYXVsdExhYmVsIH0gZnJvbSAnLi4vLi4vY29tbW9uL3V0aWxzJztcblxuZW51bSBWaWV3IHtcbiAgdGFibGUgPSAnVGFibGUgdmlldycsXG4gIGNoYXJ0ID0gJ0NoYXJ0IHZpZXcnLFxuICB0aW1lbGluZSA9ICdPcGVyYXRpb25zIFRpbWVsaW5lJyxcbiAgbG9ncyA9ICdSZWNhbGN1bGF0aW9ucyBsb2dzJ1xufVxuXG5jb25zdCB0aW1lbGluZVRlcm1UeXBlID0gW1Rlcm1UZXJtVHlwZS5vcGVyYXRpb25dO1xuXG5pbnRlcmZhY2UgSUN5Y2xlQ29uZmlnIHtcbiAgbm9kZUtleTogQmxhbmtOb2Rlc0tleTtcbn1cblxuaW50ZXJmYWNlIElDeWNsZUNvbmZpZ0FuaW1hbCBleHRlbmRzIElDeWNsZUNvbmZpZyB7XG4gIG5vZGVLZXk6IEJsYW5rTm9kZXNLZXkuYW5pbWFscztcbn1cblxuaW50ZXJmYWNlIElDeWNsZUNvbmZpZ0VtaXNzaW9uIGV4dGVuZHMgSUN5Y2xlQ29uZmlnIHtcbiAgbm9kZUtleTogQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnM7XG59XG5cbmludGVyZmFjZSBJQ3ljbGVDb25maWdJbnB1dCBleHRlbmRzIElDeWNsZUNvbmZpZyB7XG4gIG5vZGVLZXk6IEJsYW5rTm9kZXNLZXkuaW5wdXRzO1xufVxuXG5pbnRlcmZhY2UgSUN5Y2xlQ29uZmlnUHJhY3RpY2UgZXh0ZW5kcyBJQ3ljbGVDb25maWcge1xuICBub2RlS2V5OiBCbGFua05vZGVzS2V5LnByYWN0aWNlcztcbn1cblxuY29uc3Qgdmlld0ljb246IHtcbiAgW3ZpZXcgaW4gVmlld106IHN0cmluZztcbn0gPSB7XG4gIFtWaWV3LmNoYXJ0XTogJ2NoYXJ0LWJhcicsXG4gIFtWaWV3LmxvZ3NdOiAnY2FsY3VsYXRvcicsXG4gIFtWaWV3LnRhYmxlXTogJ2xpc3QnLFxuICBbVmlldy50aW1lbGluZV06ICdsaXN0LWFsdCdcbn07XG5cbmNvbnN0IG5vZGVLZXlWaWV3czoge1xuICBbdHlwZSBpbiBCbGFua05vZGVzS2V5XT86IFZpZXdbXTtcbn0gPSB7XG4gIFtCbGFua05vZGVzS2V5LmFuaW1hbHNdOiBbVmlldy50YWJsZV0sXG4gIFtCbGFua05vZGVzS2V5LmVtaXNzaW9uc106IFtWaWV3LnRhYmxlLCBWaWV3LmNoYXJ0LCBWaWV3LmxvZ3NdLFxuICBbQmxhbmtOb2Rlc0tleS5pbnB1dHNdOiBbVmlldy50YWJsZSwgVmlldy5jaGFydCwgVmlldy5sb2dzXSxcbiAgW0JsYW5rTm9kZXNLZXkucHJvZHVjdHNdOiBbVmlldy50YWJsZSwgVmlldy5jaGFydCwgVmlldy5sb2dzXSxcbiAgW0JsYW5rTm9kZXNLZXkucHJhY3RpY2VzXTogW1ZpZXcudGFibGUsIFZpZXcudGltZWxpbmUsIFZpZXcubG9nc11cbn07XG5cbmNvbnN0IG5vZGVLZXlGaWx0ZXJUZXJtVHlwZXM6IHtcbiAgW3R5cGUgaW4gQmxhbmtOb2Rlc0tleV0/OiBUZXJtVGVybVR5cGVbXTtcbn0gPSB7XG4gIFtCbGFua05vZGVzS2V5LmVtaXNzaW9uc106IFtUZXJtVGVybVR5cGUuZW1pc3Npb25dXG59O1xuXG5jb25zdCBmaWx0ZXJWYWx1ZXNUaW1lbGluZSA9ICh2YWx1ZXM6IGJsYW5rTm9kZVtdKSA9PiB2YWx1ZXMuZmlsdGVyKHAgPT4gdGltZWxpbmVUZXJtVHlwZS5pbmNsdWRlcyhwLnRlcm0/LnRlcm1UeXBlKSk7XG5cbnR5cGUgZ3JvdXBlZEVtaXNzaW9ucyA9IHtcbiAgW21ldGhvZFRpZXIgaW4gRW1pc3Npb25NZXRob2RUaWVyXTogSUdyb3VwZWRLZXlzPEVtaXNzaW9uPltdO1xufTtcblxuZXhwb3J0IGVudW0gQ3ljbGVOb2Rlc0tleUdyb3VwIHtcbiAgYW5pbWFscyA9ICdhbmltYWxzJyxcbiAgdHJhbnNmb3JtYXRpb25zID0gJ3RyYW5zZm9ybWF0aW9ucydcbn1cblxudHlwZSBncm91cGVkTm9kZSA9IEFuaW1hbCB8IFRyYW5zZm9ybWF0aW9uO1xuXG5jb25zdCBjeWNsZUdyb3VwTm9kZSA9XG4gIChjeWNsZT86IElDeWNsZUpTT05MRCkgPT5cbiAgKG5vZGU/OiBncm91cGVkTm9kZSk6IGdyb3VwZWROb2RlICYgeyBuYW1lOiBzdHJpbmc7ICdAaWQnOiBzdHJpbmcgfSA9PiAoe1xuICAgIC4uLm5vZGUsXG4gICAgbmFtZTogY3ljbGU/Lm5hbWUsXG4gICAgJ0BpZCc6IGN5Y2xlPy5bJ0BpZCddIC8vIHNldCBAaWQgc28gd2UgY2FuIGZldGNoIHRoZSBsb2dzIGZyb20gdGhlIEN5Y2xlXG4gIH0pO1xuXG5jb25zdCBjeWNsZUdyb3VwTm9kZXMgPSAoZ3JvdXBLZXk6IEN5Y2xlTm9kZXNLZXlHcm91cCwgY3ljbGU/OiBJQ3ljbGVKU09OTEQpOiBncm91cGVkTm9kZVtdID0+XG4gIChjeWNsZT8uW2dyb3VwS2V5XSB8fCBbXSkubWFwKGN5Y2xlR3JvdXBOb2RlKGN5Y2xlKSk7XG5cbmNvbnN0IGZpbHRlckdyb3VwTm9kZXNCeVRlcm0gPSAoZ3JvdXBLZXk6IEN5Y2xlTm9kZXNLZXlHcm91cCwgY3ljbGVzOiBJQ3ljbGVKU09OTERbXSwgdGVybT86IFRlcm0pOiBncm91cGVkTm9kZVtdID0+XG4gIGN5Y2xlcy5tYXAoY3ljbGUgPT5cbiAgICBjeWNsZUdyb3VwTm9kZShjeWNsZSkoXG4gICAgICAoKGN5Y2xlPy5bZ3JvdXBLZXldIGFzIGdyb3VwZWROb2RlW10pIHx8IFtdKS5maWx0ZXIoQm9vbGVhbikuZmluZChub2RlID0+IG5vZGUudGVybT8ubmFtZSA9PT0gdGVybT8ubmFtZSlcbiAgICApXG4gICk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2hlLWN5Y2xlcy1ub2RlcycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jeWNsZXMtbm9kZXMuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9jeWNsZXMtbm9kZXMuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgQ3ljbGVzTm9kZXNDb21wb25lbnQge1xuICBwcm90ZWN0ZWQgX2RhdGFTdGF0ZSA9IHNpZ25hbChEYXRhU3RhdGUub3JpZ2luYWwpO1xuICBASW5wdXQoKVxuICBzZXQgZGF0YVN0YXRlKHZhbHVlOiBEYXRhU3RhdGUpIHtcbiAgICB0aGlzLl9kYXRhU3RhdGUuc2V0KHZhbHVlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBCbGFua05vZGVzS2V5ID0gQmxhbmtOb2Rlc0tleTtcbiAgcHJvdGVjdGVkIGZpcnN0Tm9kZUtleSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX25vZGVLZXlzKCk/LlswXSk7XG4gIHByb3RlY3RlZCBzZWxlY3RlZE5vZGVLZXkgPSBzaWduYWwodW5kZWZpbmVkIGFzIEJsYW5rTm9kZXNLZXkpO1xuXG4gIHByb3RlY3RlZCBfbm9kZUtleXMgPSBzaWduYWwoW10gYXMgQmxhbmtOb2Rlc0tleVtdKTtcbiAgQElucHV0KClcbiAgc2V0IG5vZGVLZXlzKHZhbHVlOiBCbGFua05vZGVzS2V5W10pIHtcbiAgICB0aGlzLl9ub2RlS2V5cy5zZXQodmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHNlbGVjdGVkR3JvdXBUZXJtID0gc2lnbmFsKHVuZGVmaW5lZCBhcyBUZXJtKTtcbiAgcHJvdGVjdGVkIF9ub2RlS2V5R3JvdXAgPSBzaWduYWwodW5kZWZpbmVkIGFzIEN5Y2xlTm9kZXNLZXlHcm91cCk7XG4gIEBJbnB1dCgpXG4gIHNldCBub2RlS2V5R3JvdXAodmFsdWU6IEN5Y2xlTm9kZXNLZXlHcm91cCkge1xuICAgIHRoaXMuX25vZGVLZXlHcm91cC5zZXQodmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGJhc2VVcmwgPSBiYXNlVXJsKCk7XG4gIHByb3RlY3RlZCBwcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZTtcbiAgcHJvdGVjdGVkIGRlZmF1bHRMYWJlbCA9IGRlZmF1bHRMYWJlbDtcbiAgcHJvdGVjdGVkIHNob3dEb3dubG9hZCA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBoZWFkZXJLZXlzID0gY29tcHV0ZWQoKCkgPT4gW1xuICAgICdjeWNsZS5pZCcsXG4gICAgJ2N5Y2xlLkBpZCcsXG4gICAgJ3RyYW5zZm9ybWF0aW9uLmlkJyxcbiAgICAndHJhbnNmb3JtYXRpb24uQGlkJyxcbiAgICAuLi50aGlzLl9ub2RlS2V5cygpLmZsYXRNYXAoa2V5ID0+IFtgY3ljbGUuJHtrZXl9LmAsIGB0cmFuc2Zvcm1hdGlvbi4ke2tleX0uYF0pXG4gIF0pO1xuXG4gIHByb3RlY3RlZCBWaWV3ID0gVmlldztcbiAgcHJvdGVjdGVkIHZpZXdJY29uID0gdmlld0ljb247XG4gIHByaXZhdGUgc2hvd1ZpZXcgPSBjb21wdXRlZChcbiAgICAoKSA9PlxuICAgICAgKHtcbiAgICAgICAgW1ZpZXcuY2hhcnRdOiB0aGlzLnNlbGVjdGVkTm9kZUtleSgpID09PSBCbGFua05vZGVzS2V5LmVtaXNzaW9ucyA/IHRoaXMuY3ljbGVzKCkubGVuZ3RoID4gMSA6IHRydWUsXG4gICAgICAgIFtWaWV3LmxvZ3NdOiAhdGhpcy5pc09yaWdpbmFsKCkgJiYgdGhpcy5oYXNSZWNhbGN1bGF0ZWROb2RlcygpLFxuICAgICAgICBbVmlldy50YWJsZV06IHRydWUsXG4gICAgICAgIFtWaWV3LnRpbWVsaW5lXTogdGhpcy5lbmFibGVUaW1lbGluZSgpXG4gICAgICB9KSBhcyB7IFt2aWV3IGluIFZpZXddOiBib29sZWFuIH1cbiAgKTtcbiAgcHJvdGVjdGVkIHZpZXdzID0gY29tcHV0ZWQoKCkgPT4gbm9kZUtleVZpZXdzW3RoaXMuc2VsZWN0ZWROb2RlS2V5KCldPy5maWx0ZXIodmlldyA9PiB0aGlzLnNob3dWaWV3KClbdmlld10pID8/IFtdKTtcbiAgcHJvdGVjdGVkIHNlbGVjdGVkVmlldyA9IHNpZ25hbChWaWV3LnRhYmxlKTtcblxuICBwcml2YXRlIF9hbGxOb2RlcyA9IHRvU2lnbmFsKHRoaXMubm9kZVN0b3JlU2VydmljZS5maW5kJDxJQ3ljbGVKU09OTEQ+KE5vZGVUeXBlLkN5Y2xlKSk7XG4gIHByaXZhdGUgb3JpZ2luYWxOb2RlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2FsbE5vZGVzKCk/Lm1hcChkYXRhID0+IGRhdGFbRGF0YVN0YXRlLm9yaWdpbmFsXSkgfHwgW10pO1xuICBwcml2YXRlIGN1cnJlbnROb2RlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX2FsbE5vZGVzKCk/Lm1hcChkYXRhID0+IGRhdGFbdGhpcy5fZGF0YVN0YXRlKCldKSB8fCBbXSk7XG5cbiAgLy8gY2FuIGJlIEN5Y2xlIG9yIFRyYW5zZm9ybWF0aW9uXG4gIHByb3RlY3RlZCBvcmlnaW5hbEN5Y2xlcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5fbm9kZUtleUdyb3VwKClcbiAgICAgID8gZmlsdGVyR3JvdXBOb2Rlc0J5VGVybSh0aGlzLl9ub2RlS2V5R3JvdXAoKSwgdGhpcy5vcmlnaW5hbE5vZGVzKCksIHRoaXMuc2VsZWN0ZWRHcm91cFRlcm0oKSlcbiAgICAgIDogdGhpcy5vcmlnaW5hbE5vZGVzKClcbiAgKTtcbiAgcHJvdGVjdGVkIGN5Y2xlcyA9IGNvbXB1dGVkKCgpID0+XG4gICAgdGhpcy5fbm9kZUtleUdyb3VwKClcbiAgICAgID8gZmlsdGVyR3JvdXBOb2Rlc0J5VGVybSh0aGlzLl9ub2RlS2V5R3JvdXAoKSwgdGhpcy5jdXJyZW50Tm9kZXMoKSwgdGhpcy5zZWxlY3RlZEdyb3VwVGVybSgpKVxuICAgICAgOiB0aGlzLmN1cnJlbnROb2RlcygpXG4gICk7XG5cbiAgcHJpdmF0ZSBzZWxlY3RlZEluZGV4ID0gc2lnbmFsKDApO1xuICBwcml2YXRlIG9naXJpbmFsU2VsZWN0ZWRDeWNsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMub3JpZ2luYWxDeWNsZXMoKT8uW3RoaXMuc2VsZWN0ZWRJbmRleCgpXSk7XG4gIHByaXZhdGUgc2VsZWN0ZWRDeWNsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY3ljbGVzKCk/Llt0aGlzLnNlbGVjdGVkSW5kZXgoKV0pO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRMb2dzS2V5ID0gY29tcHV0ZWQoKCkgPT4gbG9nc0tleSh0aGlzLnNlbGVjdGVkQ3ljbGUoKSkpO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRPcmlnaW5hbFZhbHVlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMub2dpcmluYWxTZWxlY3RlZEN5Y2xlKCk/Llt0aGlzLnNlbGVjdGVkTm9kZUtleSgpXSB8fCBbXSk7XG4gIHByb3RlY3RlZCBzZWxlY3RlZFJlY2FsY3VsYXRlZFZhbHVlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuc2VsZWN0ZWRDeWNsZSgpPy5bdGhpcy5zZWxlY3RlZE5vZGVLZXkoKV0gfHwgW10pO1xuICAvLyBUT0RPOiBoYW5kbGUgdHJhbnNmb3JtYXRpb24gYW5kIG5vbi1pbmRleGVkIG5vZGVzIG9uIENFXG4gIHByb3RlY3RlZCBzZWxlY3RlZE5vZGUgPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuc2VsZWN0ZWRDeWNsZSgpXG4gICAgICA/IHtcbiAgICAgICAgICAuLi50aGlzLnNlbGVjdGVkQ3ljbGUoKSxcbiAgICAgICAgICAnQHR5cGUnOiBOb2RlVHlwZS5DeWNsZSxcbiAgICAgICAgICB0eXBlOiBOb2RlVHlwZS5DeWNsZSxcbiAgICAgICAgICBkYXRhU3RhdGU6IERhdGFTdGF0ZS5yZWNhbGN1bGF0ZWRcbiAgICAgICAgfVxuICAgICAgOiBudWxsXG4gICk7XG5cbiAgcHJpdmF0ZSBpc09yaWdpbmFsID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5fZGF0YVN0YXRlKCkgPT09IERhdGFTdGF0ZS5vcmlnaW5hbCk7XG4gIHByaXZhdGUgb3JpZ2luYWxWYWx1ZXMgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5pc09yaWdpbmFsKCkgPyBudWxsIDogdGhpcy5vcmlnaW5hbEN5Y2xlcygpKSB8fCBbXSk7XG5cbiAgcHJpdmF0ZSBoYXNSZWNhbGN1bGF0ZWROb2RlcyA9IGNvbXB1dGVkKCgpID0+IHRoaXMuY3ljbGVzKCkuc29tZShjeWNsZSA9PiAhY3ljbGUuYWdncmVnYXRlZCkpO1xuICBwcm90ZWN0ZWQgc2hvd1N3aXRjaFRvUmVjYWxjdWxhdGVkID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5pc09yaWdpbmFsKCkgJiYgdGhpcy5oYXNSZWNhbGN1bGF0ZWROb2RlcygpKTtcblxuICBwcm90ZWN0ZWQgdGltZWxpbmVWYWx1ZXMgPSBjb21wdXRlZCgoKSA9PiBmaWx0ZXJWYWx1ZXNUaW1lbGluZSh0aGlzLnNlbGVjdGVkQ3ljbGUoKT8uW3RoaXMuc2VsZWN0ZWROb2RlS2V5KCldIHx8IFtdKSk7XG4gIHByaXZhdGUgZW5hYmxlVGltZWxpbmUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnRpbWVsaW5lVmFsdWVzKCkubGVuZ3RoID4gMCk7XG5cbiAgcHJvdGVjdGVkIGlzTm9kZUtleUFsbG93ZWQgPSBjb21wdXRlZCgoKSA9PiBub2RlS2V5Vmlld3NbdGhpcy5maXJzdE5vZGVLZXkoKV0uaW5jbHVkZXModGhpcy5zZWxlY3RlZFZpZXcoKSkpO1xuXG4gIHByaXZhdGUgZ3JvdXBlZE5vZGVzID0gY29tcHV0ZWQoKCkgPT4gY3ljbGVHcm91cE5vZGVzKHRoaXMuX25vZGVLZXlHcm91cCgpLCB0aGlzLm9yaWdpbmFsTm9kZXMoKT8uWzBdKSk7XG4gIHByb3RlY3RlZCBncm91cE5vZGVUZXJtcyA9IGNvbXB1dGVkKCgpID0+IHVuaXF1ZSh0aGlzLmdyb3VwZWROb2RlcygpLm1hcCgoeyB0ZXJtIH0pID0+IHRlcm0pKSk7XG4gIHByb3RlY3RlZCBpc0dyb3VwTm9kZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMuX25vZGVLZXlHcm91cCgpICYmIHRoaXMuZ3JvdXBlZE5vZGVzKCk/Lmxlbmd0aCA+IDApO1xuXG4gIHByb3RlY3RlZCBpc0VtaXNzaW9uID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5zZWxlY3RlZE5vZGVLZXkoKSA9PT0gQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnMpO1xuXG4gIHByb3RlY3RlZCBkYXRhID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLmlzRW1pc3Npb24oKVxuICAgICAgPyB0aGlzLmdyb3VwRW1pc3Npb25zKClcbiAgICAgIDogT2JqZWN0LmZyb21FbnRyaWVzKHRoaXMuX25vZGVLZXlzKCkubWFwKG5vZGVLZXkgPT4gW25vZGVLZXksIHRoaXMuZ3JvdXBOb2Rlc0J5S2V5KHsgbm9kZUtleSB9KV0pKVxuICApO1xuICBwcm90ZWN0ZWQgZGF0YUtleXMgPSBjb21wdXRlZCgoKSA9PiBPYmplY3Qua2V5cyh0aGlzLmRhdGEoKSkpO1xuXG4gIHByb3RlY3RlZCBoYXNEYXRhID0gY29tcHV0ZWQoKCkgPT4gT2JqZWN0LnZhbHVlcyh0aGlzLmRhdGEoKSkuZmxhdCgpLmxlbmd0aCA+IDApO1xuXG4gIHByb3RlY3RlZCBmaWx0ZXJUZXJtVHlwZXMgPSBjb21wdXRlZCgoKSA9PiBub2RlS2V5RmlsdGVyVGVybVR5cGVzW3RoaXMuc2VsZWN0ZWROb2RlS2V5KCldKTtcbiAgcHJvdGVjdGVkIGZpbHRlclRlcm0gPSBzaWduYWwoJycpO1xuXG4gIHByb3RlY3RlZCBjc3ZGaWxlbmFtZSA9IGNvbXB1dGVkKCgpID0+IGAke3RoaXMuX25vZGVLZXlzKCkuam9pbignLScpfS5jc3ZgKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5vZGVTdG9yZVNlcnZpY2U6IEhlTm9kZVN0b3JlU2VydmljZSkge1xuICAgIGVmZmVjdChcbiAgICAgICgpID0+IHtcbiAgICAgICAgLy8gbWFrZSBzdXJlIGxvZ3MgZG9lcyBub3QgcmVtYWluIGRpc3BsYXllZFxuICAgICAgICBpZiAoKHRoaXMuaXNPcmlnaW5hbCgpICYmIHRoaXMuc2VsZWN0ZWRWaWV3KCkgPT09IFZpZXcubG9ncykgfHwgIXRoaXMudmlld3MoKS5pbmNsdWRlcyh0aGlzLnNlbGVjdGVkVmlldygpKSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3LnNldChWaWV3LnRhYmxlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxuICAgICk7XG5cbiAgICBlZmZlY3QoXG4gICAgICAoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3RlZE5vZGVLZXkoKSB8fCAhdGhpcy5fbm9kZUtleXMoKS5pbmNsdWRlcyh0aGlzLnNlbGVjdGVkTm9kZUtleSgpKSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlS2V5LnNldCh0aGlzLmZpcnN0Tm9kZUtleSgpKTtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVmlldy5zZXQoVmlldy50YWJsZSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB7IGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlIH1cbiAgICApO1xuXG4gICAgZWZmZWN0KFxuICAgICAgKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRHcm91cFRlcm0oKSB8fCAhdGhpcy5ncm91cE5vZGVUZXJtcygpLmluY2x1ZGVzKHRoaXMuc2VsZWN0ZWRHcm91cFRlcm0oKSkpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkR3JvdXBUZXJtLnNldCh0aGlzLmdyb3VwTm9kZVRlcm1zKClbMF0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgeyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ3JvdXBOb2Rlc0J5S2V5PFxuICAgIFQgZXh0ZW5kcyBJQ3ljbGVDb25maWcsXG4gICAgUiA9IFQgZXh0ZW5kcyBJQ3ljbGVDb25maWdBbmltYWxcbiAgICAgID8gQW5pbWFsXG4gICAgICA6IFQgZXh0ZW5kcyBJQ3ljbGVDb25maWdFbWlzc2lvblxuICAgICAgPyBFbWlzc2lvblxuICAgICAgOiBUIGV4dGVuZHMgSUN5Y2xlQ29uZmlnSW5wdXRcbiAgICAgID8gSGVzdGlhSW5wdXRcbiAgICAgIDogVCBleHRlbmRzIElDeWNsZUNvbmZpZ1ByYWN0aWNlXG4gICAgICA/IFByYWN0aWNlXG4gICAgICA6IFByb2R1Y3RcbiAgPih7IG5vZGVLZXkgfTogVCk6IElHcm91cGVkS2V5czxSPltdIHtcbiAgICBjb25zdCBub2Rlc1BlckN5Y2xlID0gZ3JvdXBOb2Rlc0J5VGVybTxJQ3ljbGVKU09OTEQgfCBncm91cGVkTm9kZSwgUj4oXG4gICAgICB0aGlzLmN5Y2xlcygpLFxuICAgICAgbm9kZUtleSxcbiAgICAgIHRoaXMub3JpZ2luYWxWYWx1ZXMoKSxcbiAgICAgIGZpbHRlckJsYW5rTm9kZSh0aGlzLmZpbHRlclRlcm0oKSlcbiAgICApO1xuICAgIHJldHVybiBvcmRlckJ5KGdyb3VwcGVkS2V5cyhub2Rlc1BlckN5Y2xlKSwgWydrZXknXSwgWydhc2MnXSk7XG4gIH1cblxuICBwcml2YXRlIGdyb3VwRW1pc3Npb25zKCkge1xuICAgIGNvbnN0IGVtaXNzaW9uc1BlckN5Y2xlID0gZ3JvdXBOb2Rlc0J5VGVybTxJQ3ljbGVKU09OTEQgfCBncm91cGVkTm9kZSwgRW1pc3Npb24+KFxuICAgICAgdGhpcy5jeWNsZXMoKSxcbiAgICAgIEJsYW5rTm9kZXNLZXkuZW1pc3Npb25zLFxuICAgICAgdGhpcy5vcmlnaW5hbFZhbHVlcygpLFxuICAgICAgZmlsdGVyQmxhbmtOb2RlKHRoaXMuZmlsdGVyVGVybSgpKVxuICAgICk7XG4gICAgY29uc3QgdmFsdWVzOiBJR3JvdXBlZEtleXM8RW1pc3Npb24+W10gPSBvcmRlckJ5KGdyb3VwcGVkS2V5cyhlbWlzc2lvbnNQZXJDeWNsZSksIFsna2V5J10sIFsnYXNjJ10pO1xuICAgIGNvbnN0IG1ldGhvZFRpZXJzID0gb3JkZXJCeShcbiAgICAgIHVuaXF1ZSh2YWx1ZXMubWFwKCh7IHZhbHVlIH0pID0+IHZhbHVlLm1ldGhvZFRpZXIpKS5tYXAobWV0aG9kVGllciA9PiAoe1xuICAgICAgICBtZXRob2RUaWVyLFxuICAgICAgICBtZXRob2RUaWVyT3JkZXI6IG1ldGhvZFRpZXJPcmRlcihtZXRob2RUaWVyKVxuICAgICAgfSkpLFxuICAgICAgWydtZXRob2RUaWVyT3JkZXInXSxcbiAgICAgIFsnYXNjJ11cbiAgICApO1xuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICBtZXRob2RUaWVycy5tYXAoKHsgbWV0aG9kVGllciB9KSA9PiBbbWV0aG9kVGllciwgdmFsdWVzLmZpbHRlcigoeyB2YWx1ZSB9KSA9PiB2YWx1ZS5tZXRob2RUaWVyID09PSBtZXRob2RUaWVyKV0pXG4gICAgKSBhcyBncm91cGVkRW1pc3Npb25zO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRyYWNrQnlJZChfaW5kZXg6IG51bWJlciwgaXRlbTogSUN5Y2xlSlNPTkxEKSB7XG4gICAgcmV0dXJuIGl0ZW1bJ0BpZCddO1xuICB9XG5cbiAgcHJvdGVjdGVkIHRvZ2dsZVBvcG92ZXIocG9wb3ZlcjogYW55LCBjb250ZXh0OiBhbnkpIHtcbiAgICByZXR1cm4gcG9wb3Zlci5pc09wZW4oKSA/IHBvcG92ZXIuY2xvc2UoKSA6IHBvcG92ZXIub3Blbihjb250ZXh0KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBmaWx0ZXJCeVRlcm0odGVybTogc3RyaW5nKSB7XG4gICAgdGhpcy5maWx0ZXJUZXJtLnNldCh0ZXJtKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzZWxlY3RJbmRleCh7IHRhcmdldDogeyB2YWx1ZSB9IH0pIHtcbiAgICB0aGlzLnNlbGVjdGVkSW5kZXguc2V0KCt2YWx1ZSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0YWJzIGlzLW1iLTFcIiAqbmdJZj1cImlzR3JvdXBOb2RlKClcIj5cbiAgPHVsPlxuICAgIDxsaSAqbmdGb3I9XCJsZXQgdGVybSBvZiBncm91cE5vZGVUZXJtcygpXCIgW2NsYXNzLmlzLWFjdGl2ZV09XCJzZWxlY3RlZEdyb3VwVGVybSgpID09PSB0ZXJtXCI+XG4gICAgICA8YSAoY2xpY2spPVwic2VsZWN0ZWRHcm91cFRlcm0uc2V0KHRlcm0pXCI+e3sgdGVybS5uYW1lIH19PC9hPlxuICAgIDwvbGk+XG4gIDwvdWw+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImNvbHVtbnMgaXMtdmFyaWFibGUgaXMtYWxpZ24taXRlbXMtY2VudGVyIGlzLTIgaXMtbS0wXCIgKm5nSWY9XCJoYXNEYXRhKClcIj5cbiAgPGRpdiBjbGFzcz1cImNvbHVtblwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFZpZXcoKSA9PT0gVmlldy50YWJsZVwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbCBpcy1naG9zdFwiXG4gICAgICAgIChjbGljayk9XCJzaG93RG93bmxvYWQgPSB0cnVlXCJcbiAgICAgICAgbmdiVG9vbHRpcD1cIkRvd25sb2FkIGFzIENTVlwiXG4gICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiPlxuICAgICAgICA8ZmEtaWNvbiBpY29uPVwiZG93bmxvYWRcIiBzaXplPVwibGdcIj48L2ZhLWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJjb2x1bW4gaXMtbmFycm93XCIgKm5nSWY9XCJzZWxlY3RlZFZpZXcoKSA9PT0gVmlldy50YWJsZVwiPlxuICAgIDxoZS1zZWFyY2gtZXh0ZW5kXG4gICAgICBjbGFzcz1cImlzLXNlY29uZGFyeSBpcy1zbWFsbFwiXG4gICAgICBwbGFjZWhvbGRlcj1cIkZpbHRlciB0ZXJtcyBieSBuYW1lXCJcbiAgICAgIChzZWFyY2gpPVwiZmlsdGVyQnlUZXJtKCRldmVudClcIj48L2hlLXNlYXJjaC1leHRlbmQ+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiY29sdW1uIGlzLW5hcnJvd1wiICpuZ0lmPVwidmlld3MoKT8ubGVuZ3RoID4gMVwiPlxuICAgIDxkaXYgY2xhc3M9XCJmaWVsZCBoYXMtYWRkb25zXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29udHJvbFwiICpuZ0Zvcj1cImxldCB2aWV3IG9mIHZpZXdzKClcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbiBpcy1zbWFsbFwiIFtjbGFzcy5pcy1zZWxlY3RlZF09XCJzZWxlY3RlZFZpZXcoKSA9PT0gdmlld1wiIChjbGljayk9XCJzZWxlY3RlZFZpZXcuc2V0KHZpZXcpXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpY29uIGlzLXNtYWxsXCI+XG4gICAgICAgICAgICA8ZmEtaWNvbiBbaWNvbl09XCJ2aWV3SWNvblt2aWV3XVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZmEtaWNvbj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpcy1oaWRkZW4tbW9iaWxlXCI+e3sgdmlldyB9fTwvc3Bhbj5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzTm9kZUtleUFsbG93ZWQoKVwiPlxuICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJzZWxlY3RlZFZpZXcoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJpcy1weC0zIGlzLXBiLTNcIiAqbmdTd2l0Y2hDYXNlPVwiVmlldy50YWJsZVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImhhc0RhdGEoKTsgZWxzZSBlbXB0eVRhYmxlXCI+XG4gICAgICAgIDxoZS1kYXRhLXRhYmxlIGNsYXNzPVwibWItMSBpcy1zbWFsbFwiIFtzbWFsbF09XCJ0cnVlXCIgbWF4SGVpZ2h0PVwiMzIwXCI+XG4gICAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgaXMtZnVsbHdpZHRoIGlzLW5hcnJvdyBpcy1zdHJpcGVkXCI+XG4gICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgIDx0ciBjbGFzcz1cImhhcy10ZXh0LXdlaWdodC1ib2xkXCIgKm5nSWY9XCJkYXRhS2V5cygpLmxlbmd0aCA+IDFcIj5cbiAgICAgICAgICAgICAgICA8dGggY2xhc3M9XCJ3aWR0aC1hdXRvXCI+PC90aD5cbiAgICAgICAgICAgICAgICA8dGggW2NsYXNzLmlzLWhpZGRlbl09XCJpc0dyb3VwTm9kZSgpXCI+PC90aD5cblxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGRhdGFLZXkgb2YgZGF0YUtleXMoKTsgbGV0IGRhdGFLZXlMYXN0ID0gbGFzdFwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRhdGEoKVtkYXRhS2V5XT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgIDx0aCBbYXR0ci5jb2xzcGFuXT1cImRhdGEoKVtkYXRhS2V5XS5sZW5ndGhcIiBbY2xhc3MuaGFzLWJvcmRlci1yaWdodF09XCIhZGF0YUtleUxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBkYXRhS2V5IHwga2V5VG9MYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L3RyPlxuXG4gICAgICAgICAgICAgIDx0ciBjbGFzcz1cImhhcy10ZXh0LXdlaWdodC1zZW1pYm9sZFwiPlxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiaGFzLWJvcmRlci1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiaXNHcm91cE5vZGUoKVwiPjwvdGg+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkYXRhS2V5IG9mIGRhdGFLZXlzKCk7IGxldCBkYXRhS2V5TGFzdCA9IGxhc3RcIj5cbiAgICAgICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbm9kZSBvZiBkYXRhKClbZGF0YUtleV07IGxldCBub2RlTGFzdCA9IGxhc3RcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci50aXRsZV09XCJub2RlLnZhbHVlLnRlcm0ubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5oYXMtYm9yZGVyLXJpZ2h0XT1cImRhdGFLZXlzKCkubGVuZ3RoID4gMSAmJiAhZGF0YUtleUxhc3QgJiYgbm9kZUxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGhlLW5vZGUtbGluayBbbm9kZV09XCJub2RlLnZhbHVlLnRlcm1cIj5cbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cIm5vZGUudmFsdWUudGVybS5uYW1lIHwgZWxsaXBzaXM6IDMwIHwgY29tcG91bmRcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvaGUtbm9kZS1saW5rPlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgPHRyIGNsYXNzPVwiaXMtaXRhbGljIGhhcy10ZXh0LXdlaWdodC1zZW1pYm9sZFwiPlxuICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cIndpZHRoLWF1dG8gaGFzLWJvcmRlci1yaWdodFwiPjwvdGg+XG4gICAgICAgICAgICAgICAgPHRoIGNsYXNzPVwiaGFzLWJvcmRlci1yaWdodFwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiaXNHcm91cE5vZGUoKVwiPlxuICAgICAgICAgICAgICAgICAgPGEgW2hyZWZdPVwiYmFzZVVybCArICcvc2NoZW1hL0N5Y2xlI2Z1bmN0aW9uYWxVbml0J1wiIHRhcmdldD1cIl9ibGFua1wiPkZ1bmN0aW9uYWwgdW5pdDwvYT5cbiAgICAgICAgICAgICAgICA8L3RoPlxuXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZGF0YUtleSBvZiBkYXRhS2V5cygpOyBsZXQgZGF0YUtleUxhc3QgPSBsYXN0XCI+XG4gICAgICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IG5vZGUgb2YgZGF0YSgpW2RhdGFLZXldOyBsZXQgbm9kZUxhc3QgPSBsYXN0XCJcbiAgICAgICAgICAgICAgICAgICAgW2F0dHIudGl0bGVdPVwibm9kZS52YWx1ZS50ZXJtLnVuaXRzXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmhhcy1ib3JkZXItcmlnaHRdPVwiZGF0YUtleXMoKS5sZW5ndGggPiAxICYmICFkYXRhS2V5TGFzdCAmJiBub2RlTGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBbaW5uZXJIdG1sXT1cIm5vZGUudmFsdWUudGVybS51bml0cyB8IGNvbXBvdW5kXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8aGUtdGVybXMtdW5pdHMtZGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImlzLWlubGluZS1ibG9jayBpcy1tbC0yXCJcbiAgICAgICAgICAgICAgICAgICAgICBbdGVybV09XCJub2RlLnZhbHVlLnRlcm1cIj48L2hlLXRlcm1zLXVuaXRzLWRlc2NyaXB0aW9uPlxuICAgICAgICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGN5Y2xlIG9mIGN5Y2xlcygpOyB0cmFja0J5OiB0cmFja0J5SWQ7IGxldCBjeWNsZUluZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgICAgICA8dHI+XG4gICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJ3aWR0aC1hdXRvIGhhcy1ib3JkZXItcmlnaHRcIiBbYXR0ci50aXRsZV09XCJkZWZhdWx0TGFiZWwoY3ljbGUpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoZS1ub2RlLWxpbmsgW25vZGVdPVwiY3ljbGUudGVybSB8fCBjeWNsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IGN5Y2xlSW5kZXggKyAxIH19LiB7eyBkZWZhdWx0TGFiZWwoY3ljbGUpIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2hlLW5vZGUtbGluaz5cbiAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJoYXMtYm9yZGVyLXJpZ2h0XCIgW2NsYXNzLmlzLWhpZGRlbl09XCJpc0dyb3VwTm9kZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoZS1jeWNsZXMtZnVuY3Rpb25hbC11bml0LW1lYXN1cmUgW2N5Y2xlXT1cImN5Y2xlXCI+PC9oZS1jeWNsZXMtZnVuY3Rpb25hbC11bml0LW1lYXN1cmU+XG4gICAgICAgICAgICAgICAgICA8L3RkPlxuXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBkYXRhS2V5IG9mIGRhdGFLZXlzKCk7IGxldCBkYXRhS2V5TGFzdCA9IGxhc3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpcy1ub3dyYXBcIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBub2RlIG9mIGRhdGEoKVtkYXRhS2V5XTsgbGV0IG5vZGVMYXN0ID0gbGFzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmhhcy1ib3JkZXItcmlnaHRdPVwiZGF0YUtleXMoKS5sZW5ndGggPiAxICYmICFkYXRhS2V5TGFzdCAmJiBub2RlTGFzdFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm5vZGUudmFsdWUudmFsdWVzW2N5Y2xlWydAaWQnXV07IGVsc2UgZW1wdHlWYWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRyaWdnZXItcG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdiUG9wb3Zlcl09XCJkZXRhaWxzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdXRvQ2xvc2VdPVwiJ291dHNpZGUnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvcG92ZXJDbGFzcz1cImlzLW5hcnJvd1wiXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cIm1hbnVhbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAjcD1cIm5nYlBvcG92ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwibGVmdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUG9wb3ZlcihwLCB7IGRhdGE6IG5vZGUudmFsdWUudmFsdWVzW2N5Y2xlWydAaWQnXV0sIGN5Y2xlOiBjeWNsZSwga2V5OiBkYXRhS2V5IH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHBvaW50ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlWYWx1ZShub2RlLnZhbHVlLnZhbHVlc1tjeWNsZVsnQGlkJ11dLnZhbHVlLCBub2RlLnZhbHVlLnRlcm1bJ0BpZCddKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBwcmVjaXNpb246IDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZGVmYXVsdDogJy0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aGUtYmxhbmstbm9kZS1zdGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1sLTFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF0YVN0YXRlXT1cIl9kYXRhU3RhdGUoKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFtub2RlXT1cIm5vZGUudmFsdWUudmFsdWVzW2N5Y2xlWydAaWQnXV0ubm9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleT1cInZhbHVlXCI+PC9oZS1ibGFuay1ub2RlLXN0YXRlPlxuICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICA8L2hlLWRhdGEtdGFibGU+XG5cbiAgICAgICAgPGhlLWJsYW5rLW5vZGUtc3RhdGUtbm90aWNlIFtkYXRhU3RhdGVdPVwiX2RhdGFTdGF0ZSgpXCI+PC9oZS1ibGFuay1ub2RlLXN0YXRlLW5vdGljZT5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiVmlldy5jaGFydFwiPlxuICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiZmlyc3ROb2RlS2V5KClcIj5cbiAgICAgICAgPGhlLWN5Y2xlcy1yZXN1bHQgKm5nU3dpdGNoQ2FzZT1cIkJsYW5rTm9kZXNLZXkuaW5wdXRzXCIgW2N5Y2xlc109XCJjeWNsZXMoKVwiPjwvaGUtY3ljbGVzLXJlc3VsdD5cbiAgICAgICAgPGhlLWN5Y2xlcy1lbWlzc2lvbnMtY2hhcnRcbiAgICAgICAgICAqbmdTd2l0Y2hDYXNlPVwiQmxhbmtOb2Rlc0tleS5lbWlzc2lvbnNcIlxuICAgICAgICAgIFtjeWNsZXNdPVwiY3ljbGVzKClcIj48L2hlLWN5Y2xlcy1lbWlzc2lvbnMtY2hhcnQ+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIlZpZXcudGltZWxpbmVcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZWxlY3RDeWNsZVwiPjwvbmctY29udGFpbmVyPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiaXMtcHgtMyBpcy1wYi0zXCI+XG4gICAgICAgIDxoZS1jeWNsZXMtbm9kZXMtdGltZWxpbmVcbiAgICAgICAgICBbcmVjYWxjdWxhdGVkVmFsdWVzXT1cInRpbWVsaW5lVmFsdWVzKClcIlxuICAgICAgICAgIFtkYXRhU3RhdGVdPVwiX2RhdGFTdGF0ZSgpXCI+PC9oZS1jeWNsZXMtbm9kZXMtdGltZWxpbmU+XG5cbiAgICAgICAgPGhlLWJsYW5rLW5vZGUtc3RhdGUtbm90aWNlIFtkYXRhU3RhdGVdPVwiX2RhdGFTdGF0ZSgpXCI+PC9oZS1ibGFuay1ub2RlLXN0YXRlLW5vdGljZT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiVmlldy5sb2dzXCI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VsZWN0Q3ljbGVcIj48L25nLWNvbnRhaW5lcj5cblxuICAgICAgPGRpdiBjbGFzcz1cInRhYnMgaXMtbWItMlwiICpuZ0lmPVwiX25vZGVLZXlzKCkubGVuZ3RoID4gMVwiPlxuICAgICAgICA8dWw+XG4gICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBub2RlS2V5IG9mIF9ub2RlS2V5cygpXCIgW2NsYXNzLmlzLWFjdGl2ZV09XCJzZWxlY3RlZE5vZGVLZXkoKSA9PT0gbm9kZUtleVwiPlxuICAgICAgICAgICAgPGEgKGNsaWNrKT1cInNlbGVjdGVkTm9kZUtleS5zZXQobm9kZUtleSlcIj57eyBub2RlS2V5IHwga2V5VG9MYWJlbCB9fTwvYT5cbiAgICAgICAgICA8L2xpPlxuICAgICAgICA8L3VsPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxoZS1ub2RlLWxvZ3MtbW9kZWxzXG4gICAgICAgICpuZ0lmPVwic2VsZWN0ZWROb2RlKClcIlxuICAgICAgICBbbm9kZV09XCJzZWxlY3RlZE5vZGUoKVwiXG4gICAgICAgIFtub2RlS2V5XT1cInNlbGVjdGVkTm9kZUtleSgpXCJcbiAgICAgICAgW2xvZ3NLZXldPVwic2VsZWN0ZWRMb2dzS2V5KClcIlxuICAgICAgICBbb3JpZ2luYWxWYWx1ZXNdPVwic2VsZWN0ZWRPcmlnaW5hbFZhbHVlcygpXCJcbiAgICAgICAgW3JlY2FsY3VsYXRlZFZhbHVlc109XCJzZWxlY3RlZFJlY2FsY3VsYXRlZFZhbHVlcygpXCJcbiAgICAgICAgW2ZpbHRlclRlcm1UeXBlc109XCJmaWx0ZXJUZXJtVHlwZXMoKVwiPjwvaGUtbm9kZS1sb2dzLW1vZGVscz5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLWNvbnRhaW5lcj5cblxuPGhlLW5vZGUtY3N2LWV4cG9ydC1jb25maXJtXG4gICpuZ0lmPVwic2hvd0Rvd25sb2FkXCJcbiAgW25vZGVzXT1cImN5Y2xlcygpXCJcbiAgW2ZpbGVuYW1lXT1cImNzdkZpbGVuYW1lKClcIlxuICBbaXNVcGxvYWRdPVwiZmFsc2VcIlxuICBbaGVhZGVyS2V5c109XCJoZWFkZXJLZXlzKClcIlxuICAoY2xvc2VkKT1cInNob3dEb3dubG9hZCA9IGZhbHNlXCI+PC9oZS1ub2RlLWNzdi1leHBvcnQtY29uZmlybT5cblxuPG5nLXRlbXBsYXRlICNlbXB0eVRhYmxlPlxuICA8ZGl2IGNsYXNzPVwiaXMtcHQtMyBoYXMtdGV4dC1jZW50ZXJlZFwiPlxuICAgIDxzcGFuPk5vIGRhdGEgYXZhaWxhYmxlPC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwiaXMtcGwtMVwiIFtjbGFzcy5pcy1oaWRkZW5dPVwiIWZpbHRlclRlcm0oKVwiPm1hdGNoaW5nIHlvdXIgc2VhcmNoIGNyaXRlcmlhPC9zcGFuPlxuICAgIDxzcGFuPi48L3NwYW4+XG4gICAgPHNwYW4gKm5nSWY9XCJzaG93U3dpdGNoVG9SZWNhbGN1bGF0ZWQoKVwiPlxuICAgICAgU3dpdGNoIHRvXG4gICAgICA8Y29kZT5yZWNhbGN1bGF0ZWQ8L2NvZGU+XG4gICAgICB2ZXJzaW9uLlxuICAgIDwvc3Bhbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2VtcHR5VmFsdWU+XG4gIDxzcGFuPi08L3NwYW4+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2RldGFpbHMgbGV0LW5vZGU9XCJjeWNsZVwiIGxldC1kYXRhPVwiZGF0YVwiIGxldC1rZXk9XCJrZXlcIj5cbiAgPHA+XG4gICAgPGI+e3sgZGVmYXVsdExhYmVsKG5vZGUpIH19PC9iPlxuICA8L3A+XG4gIDxoZS1ub2RlLXZhbHVlLWRldGFpbHNcbiAgICBbZGF0YV09XCJkYXRhXCJcbiAgICBbZGF0YVN0YXRlXT1cIl9kYXRhU3RhdGUoKVwiXG4gICAgW25vZGVUeXBlXT1cIm5vZGVbJ0B0eXBlJ11cIlxuICAgIFtkYXRhS2V5XT1cImtleVwiPjwvaGUtbm9kZS12YWx1ZS1kZXRhaWxzPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNzZWxlY3RDeWNsZT5cbiAgPGRpdiBjbGFzcz1cImZpZWxkIGhhcy1hZGRvbnMgaXMtcHktMiBpcy1weC0zXCIgKm5nSWY9XCJjeWNsZXMoKS5sZW5ndGggPiAxXCI+XG4gICAgPGRpdiBjbGFzcz1cImNvbnRyb2xcIj5cbiAgICAgIDxzcGFuIGNsYXNzPVwiYnV0dG9uIGlzLXNtYWxsIGlzLXN0YXRpYyBpcy1zZWNvbmRhcnlcIj5TZWxlY3QgYSBDeWNsZTwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY29udHJvbCBpcy1leHBhbmRlZFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdCBpcy1zbWFsbCBpcy1mdWxsd2lkdGggaXMtc2Vjb25kYXJ5XCI+XG4gICAgICAgIDxzZWxlY3QgKGNoYW5nZSk9XCJzZWxlY3RJbmRleCgkZXZlbnQpXCI+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdmFsdWUgb2YgY3ljbGVzKCk7IGxldCBjeWNsZUluZGV4ID0gaW5kZXhcIiBbdmFsdWVdPVwiY3ljbGVJbmRleFwiPlxuICAgICAgICAgICAge3sgY3ljbGVJbmRleCArIDEgfX0uIHt7IGRlZmF1bHRMYWJlbCh2YWx1ZSkgfX1cbiAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgPC9zZWxlY3Q+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -7670,11 +7670,11 @@ class CyclesNodesComponent {
7670
7670
  this.selectedIndex.set(+value);
7671
7671
  }
7672
7672
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.8", ngImport: i0, type: CyclesNodesComponent, deps: [{ token: HeNodeStoreService }], target: i0.ɵɵFactoryTarget.Component }); }
7673
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.8", type: CyclesNodesComponent, selector: "he-cycles-nodes", inputs: { dataState: "dataState", nodeKeys: "nodeKeys", nodeKeyGroup: "nodeKeyGroup" }, ngImport: i0, template: "<div class=\"tabs is-mb-1\" *ngIf=\"isGroupNode()\">\n <ul>\n <li *ngFor=\"let term of groupNodeTerms()\" [class.is-active]=\"selectedGroupTerm() === term\">\n <a (click)=\"selectedGroupTerm.set(term)\">{{ term.name }}</a>\n </li>\n </ul>\n</div>\n\n<div class=\"columns is-variable is-align-items-center is-2 is-m-0\" *ngIf=\"hasData()\">\n <div class=\"column\">\n <ng-container *ngIf=\"selectedView() === View.table\">\n <button\n class=\"button is-small is-ghost\"\n (click)=\"showDownload = true\"\n ngbTooltip=\"Download as CSV\"\n placement=\"bottom\">\n <fa-icon icon=\"download\" size=\"lg\"></fa-icon>\n </button>\n </ng-container>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"selectedView() === View.table\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter terms by name\"\n (search)=\"filterByTerm($event)\"></he-search-extend>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"views()?.length > 1\">\n <div class=\"field has-addons\">\n <div class=\"control\" *ngFor=\"let view of views()\">\n <button class=\"button is-small\" [class.is-selected]=\"selectedView() === view\" (click)=\"selectedView.set(view)\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"viewIcon[view]\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">{{ view }}</span>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<ng-container *ngIf=\"isNodeKeyAllowed()\">\n <ng-container [ngSwitch]=\"selectedView()\">\n <div class=\"is-px-3 is-pb-3\" *ngSwitchCase=\"View.table\">\n <ng-container *ngIf=\"hasData(); else emptyTable\">\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr class=\"has-text-weight-bold\" *ngIf=\"dataKeys().length > 1\">\n <th class=\"width-auto\"></th>\n <th [class.is-hidden]=\"isGroupNode()\"></th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <ng-container *ngIf=\"data()[dataKey]?.length\">\n <th [attr.colspan]=\"data()[dataKey].length\" [class.has-border-right]=\"!dataKeyLast\">\n <span>{{ dataKey | keyToLabel }}</span>\n </th>\n </ng-container>\n </ng-container>\n </tr>\n\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\"></th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <th\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [attr.title]=\"node.value.term.name\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <he-node-link [node]=\"node.value.term\">\n <span [innerHtml]=\"node.value.term.name | ellipsis: 30 | compound\"></span>\n </he-node-link>\n </th>\n </ng-container>\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <a [href]=\"baseUrl + '/schema/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <th\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [attr.title]=\"node.value.term.units\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span [innerHtml]=\"node.value.term.units | compound\"></span>\n <he-terms-units-description\n class=\"is-inline-block is-ml-2\"\n [term]=\"node.value.term\"></he-terms-units-description>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let cycle of cycles(); trackBy: trackById; let cycleIndex = index\">\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycle.term || cycle\">\n <span>{{ cycleIndex + 1 }}. {{ defaultLabel(cycle) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <he-cycles-functional-unit-measure [cycle]=\"cycles()[0]\"></he-cycles-functional-unit-measure>\n </td>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <td\n class=\"is-nowrap\"\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span\n *ngIf=\"node.value.values[cycle['@id']]; else emptyValue\"\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"\n togglePopover(p, { data: node.value.values[cycle['@id']], cycle: cycle, key: dataKey })\n \">\n <span pointer>\n {{\n propertyValue(node.value.values[cycle['@id']].value, node.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"_dataState()\"\n [node]=\"node.value.values[cycle['@id']].node\"\n key=\"value\"></he-blank-node-state>\n </span>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </ng-container>\n </div>\n\n <ng-container *ngSwitchCase=\"View.chart\">\n <ng-container [ngSwitch]=\"firstNodeKey()\">\n <he-cycles-result *ngSwitchCase=\"BlankNodesKey.inputs\" [cycles]=\"cycles()\"></he-cycles-result>\n <he-cycles-emissions-chart\n *ngSwitchCase=\"BlankNodesKey.emissions\"\n [cycles]=\"cycles()\"></he-cycles-emissions-chart>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"View.timeline\">\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n\n <div class=\"is-px-3 is-pb-3\">\n <he-cycles-nodes-timeline\n [recalculatedValues]=\"timelineValues()\"\n [dataState]=\"_dataState()\"></he-cycles-nodes-timeline>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"View.logs\">\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n\n <div class=\"tabs is-mb-2\" *ngIf=\"_nodeKeys().length > 1\">\n <ul>\n <li *ngFor=\"let nodeKey of _nodeKeys()\" [class.is-active]=\"selectedNodeKey() === nodeKey\">\n <a (click)=\"selectedNodeKey.set(nodeKey)\">{{ nodeKey | keyToLabel }}</a>\n </li>\n </ul>\n </div>\n\n <he-node-logs-models\n *ngIf=\"selectedNode()\"\n [node]=\"selectedNode()\"\n [nodeKey]=\"selectedNodeKey()\"\n [logsKey]=\"selectedLogsKey()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [filterTermTypes]=\"filterTermTypes()\"></he-node-logs-models>\n </ng-container>\n </ng-container>\n</ng-container>\n\n<he-node-csv-export-confirm\n *ngIf=\"showDownload\"\n [nodes]=\"cycles()\"\n [filename]=\"csvFilename()\"\n [isUpload]=\"false\"\n [headerKeys]=\"headerKeys()\"\n (closed)=\"showDownload = false\"></he-node-csv-export-confirm>\n\n<ng-template #emptyTable>\n <div class=\"is-pt-3 has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n <span *ngIf=\"showSwitchToRecalculated()\">\n Switch to\n <code>recalculated</code>\n version.\n </span>\n </div>\n</ng-template>\n\n<ng-template #emptyValue>\n <span>-</span>\n</ng-template>\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p>\n <b>{{ defaultLabel(node) }}</b>\n </p>\n <he-node-value-details\n [data]=\"data\"\n [dataState]=\"_dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"key\"></he-node-value-details>\n</ng-template>\n\n<ng-template #selectCycle>\n <div class=\"field has-addons is-py-2 is-px-3\" *ngIf=\"cycles().length > 1\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select a Cycle</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n <option *ngFor=\"let value of cycles(); let cycleIndex = index\" [value]=\"cycleIndex\">\n {{ cycleIndex + 1 }}. {{ defaultLabel(value) }}\n </option>\n </select>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4$1.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i4$1.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: i3.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: BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["dataState", "nodeType", "dataKey", "key", "node", "state", "linkClass"] }, { kind: "component", type: BlankNodeStateNoticeComponent, selector: "he-blank-node-state-notice", inputs: ["dataState", "showAggregated", "showDeleted"] }, { kind: "component", type: DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "small"] }, { kind: "component", type: SearchExtendComponent, selector: "he-search-extend", inputs: ["value", "disabled", "placeholder", "class"], outputs: ["search"] }, { kind: "component", type: NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink", "linkClass"] }, { kind: "component", type: NodeCsvExportConfirmComponent, selector: "he-node-csv-export-confirm", inputs: ["nodes", "filename", "headerKeys", "extension", "isUpload"], outputs: ["closed"] }, { kind: "component", type: NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: ["node", "nodeKey", "originalValues", "recalculatedValues", "terms", "filterTermTypes", "filterTermTypesLabel", "logsKey", "noDataMessage"] }, { kind: "component", type: NodeValueDetailsComponent, selector: "he-node-value-details", inputs: ["data", "nodeType", "dataKey", "dataState"] }, { kind: "component", type: TermsUnitsDescriptionComponent, selector: "he-terms-units-description", inputs: ["term", "iconTemplate"] }, { kind: "component", type: CyclesEmissionsChartComponent, selector: "he-cycles-emissions-chart", inputs: ["cycles"] }, { kind: "component", type: CyclesFunctionalUnitMeasureComponent, selector: "he-cycles-functional-unit-measure", inputs: ["cycle"] }, { kind: "component", type: CyclesNodesTimelineComponent, selector: "he-cycles-nodes-timeline", inputs: ["recalculatedValues", "dataState"] }, { kind: "component", type: CyclesResultComponent, selector: "he-cycles-result", inputs: ["cycles"] }, { kind: "pipe", type: CompoundPipe, name: "compound" }, { kind: "pipe", type: DefaultPipe, name: "default" }, { kind: "pipe", type: EllipsisPipe, name: "ellipsis" }, { kind: "pipe", type: KeyToLabelPipe, name: "keyToLabel" }, { kind: "pipe", type: PrecisionPipe, name: "precision" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
7673
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.8", type: CyclesNodesComponent, selector: "he-cycles-nodes", inputs: { dataState: "dataState", nodeKeys: "nodeKeys", nodeKeyGroup: "nodeKeyGroup" }, ngImport: i0, template: "<div class=\"tabs is-mb-1\" *ngIf=\"isGroupNode()\">\n <ul>\n <li *ngFor=\"let term of groupNodeTerms()\" [class.is-active]=\"selectedGroupTerm() === term\">\n <a (click)=\"selectedGroupTerm.set(term)\">{{ term.name }}</a>\n </li>\n </ul>\n</div>\n\n<div class=\"columns is-variable is-align-items-center is-2 is-m-0\" *ngIf=\"hasData()\">\n <div class=\"column\">\n <ng-container *ngIf=\"selectedView() === View.table\">\n <button\n class=\"button is-small is-ghost\"\n (click)=\"showDownload = true\"\n ngbTooltip=\"Download as CSV\"\n placement=\"bottom\">\n <fa-icon icon=\"download\" size=\"lg\"></fa-icon>\n </button>\n </ng-container>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"selectedView() === View.table\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter terms by name\"\n (search)=\"filterByTerm($event)\"></he-search-extend>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"views()?.length > 1\">\n <div class=\"field has-addons\">\n <div class=\"control\" *ngFor=\"let view of views()\">\n <button class=\"button is-small\" [class.is-selected]=\"selectedView() === view\" (click)=\"selectedView.set(view)\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"viewIcon[view]\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">{{ view }}</span>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<ng-container *ngIf=\"isNodeKeyAllowed()\">\n <ng-container [ngSwitch]=\"selectedView()\">\n <div class=\"is-px-3 is-pb-3\" *ngSwitchCase=\"View.table\">\n <ng-container *ngIf=\"hasData(); else emptyTable\">\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr class=\"has-text-weight-bold\" *ngIf=\"dataKeys().length > 1\">\n <th class=\"width-auto\"></th>\n <th [class.is-hidden]=\"isGroupNode()\"></th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <ng-container *ngIf=\"data()[dataKey]?.length\">\n <th [attr.colspan]=\"data()[dataKey].length\" [class.has-border-right]=\"!dataKeyLast\">\n <span>{{ dataKey | keyToLabel }}</span>\n </th>\n </ng-container>\n </ng-container>\n </tr>\n\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\"></th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <th\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [attr.title]=\"node.value.term.name\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <he-node-link [node]=\"node.value.term\">\n <span [innerHtml]=\"node.value.term.name | ellipsis: 30 | compound\"></span>\n </he-node-link>\n </th>\n </ng-container>\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <a [href]=\"baseUrl + '/schema/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <th\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [attr.title]=\"node.value.term.units\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span [innerHtml]=\"node.value.term.units | compound\"></span>\n <he-terms-units-description\n class=\"is-inline-block is-ml-2\"\n [term]=\"node.value.term\"></he-terms-units-description>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let cycle of cycles(); trackBy: trackById; let cycleIndex = index\">\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycle.term || cycle\">\n <span>{{ cycleIndex + 1 }}. {{ defaultLabel(cycle) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <he-cycles-functional-unit-measure [cycle]=\"cycle\"></he-cycles-functional-unit-measure>\n </td>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <td\n class=\"is-nowrap\"\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span\n *ngIf=\"node.value.values[cycle['@id']]; else emptyValue\"\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"\n togglePopover(p, { data: node.value.values[cycle['@id']], cycle: cycle, key: dataKey })\n \">\n <span pointer>\n {{\n propertyValue(node.value.values[cycle['@id']].value, node.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"_dataState()\"\n [node]=\"node.value.values[cycle['@id']].node\"\n key=\"value\"></he-blank-node-state>\n </span>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </ng-container>\n </div>\n\n <ng-container *ngSwitchCase=\"View.chart\">\n <ng-container [ngSwitch]=\"firstNodeKey()\">\n <he-cycles-result *ngSwitchCase=\"BlankNodesKey.inputs\" [cycles]=\"cycles()\"></he-cycles-result>\n <he-cycles-emissions-chart\n *ngSwitchCase=\"BlankNodesKey.emissions\"\n [cycles]=\"cycles()\"></he-cycles-emissions-chart>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"View.timeline\">\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n\n <div class=\"is-px-3 is-pb-3\">\n <he-cycles-nodes-timeline\n [recalculatedValues]=\"timelineValues()\"\n [dataState]=\"_dataState()\"></he-cycles-nodes-timeline>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"View.logs\">\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n\n <div class=\"tabs is-mb-2\" *ngIf=\"_nodeKeys().length > 1\">\n <ul>\n <li *ngFor=\"let nodeKey of _nodeKeys()\" [class.is-active]=\"selectedNodeKey() === nodeKey\">\n <a (click)=\"selectedNodeKey.set(nodeKey)\">{{ nodeKey | keyToLabel }}</a>\n </li>\n </ul>\n </div>\n\n <he-node-logs-models\n *ngIf=\"selectedNode()\"\n [node]=\"selectedNode()\"\n [nodeKey]=\"selectedNodeKey()\"\n [logsKey]=\"selectedLogsKey()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [filterTermTypes]=\"filterTermTypes()\"></he-node-logs-models>\n </ng-container>\n </ng-container>\n</ng-container>\n\n<he-node-csv-export-confirm\n *ngIf=\"showDownload\"\n [nodes]=\"cycles()\"\n [filename]=\"csvFilename()\"\n [isUpload]=\"false\"\n [headerKeys]=\"headerKeys()\"\n (closed)=\"showDownload = false\"></he-node-csv-export-confirm>\n\n<ng-template #emptyTable>\n <div class=\"is-pt-3 has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n <span *ngIf=\"showSwitchToRecalculated()\">\n Switch to\n <code>recalculated</code>\n version.\n </span>\n </div>\n</ng-template>\n\n<ng-template #emptyValue>\n <span>-</span>\n</ng-template>\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p>\n <b>{{ defaultLabel(node) }}</b>\n </p>\n <he-node-value-details\n [data]=\"data\"\n [dataState]=\"_dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"key\"></he-node-value-details>\n</ng-template>\n\n<ng-template #selectCycle>\n <div class=\"field has-addons is-py-2 is-px-3\" *ngIf=\"cycles().length > 1\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select a Cycle</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n <option *ngFor=\"let value of cycles(); let cycleIndex = index\" [value]=\"cycleIndex\">\n {{ cycleIndex + 1 }}. {{ defaultLabel(value) }}\n </option>\n </select>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}\n"], dependencies: [{ kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4$1.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i4$1.NgbPopover, selector: "[ngbPopover]", inputs: ["animation", "autoClose", "ngbPopover", "popoverTitle", "placement", "popperOptions", "triggers", "positionTarget", "container", "disablePopover", "popoverClass", "popoverContext", "openDelay", "closeDelay"], outputs: ["shown", "hidden"], exportAs: ["ngbPopover"] }, { kind: "component", type: i3.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: BlankNodeStateComponent, selector: "he-blank-node-state", inputs: ["dataState", "nodeType", "dataKey", "key", "node", "state", "linkClass"] }, { kind: "component", type: BlankNodeStateNoticeComponent, selector: "he-blank-node-state-notice", inputs: ["dataState", "showAggregated", "showDeleted"] }, { kind: "component", type: DataTableComponent, selector: "he-data-table", inputs: ["minHeight", "maxHeight", "small"] }, { kind: "component", type: SearchExtendComponent, selector: "he-search-extend", inputs: ["value", "disabled", "placeholder", "class"], outputs: ["search"] }, { kind: "component", type: NodeLinkComponent, selector: "he-node-link", inputs: ["node", "showExternalLink", "linkClass"] }, { kind: "component", type: NodeCsvExportConfirmComponent, selector: "he-node-csv-export-confirm", inputs: ["nodes", "filename", "headerKeys", "extension", "isUpload"], outputs: ["closed"] }, { kind: "component", type: NodeLogsModelsComponent, selector: "he-node-logs-models", inputs: ["node", "nodeKey", "originalValues", "recalculatedValues", "terms", "filterTermTypes", "filterTermTypesLabel", "logsKey", "noDataMessage"] }, { kind: "component", type: NodeValueDetailsComponent, selector: "he-node-value-details", inputs: ["data", "nodeType", "dataKey", "dataState"] }, { kind: "component", type: TermsUnitsDescriptionComponent, selector: "he-terms-units-description", inputs: ["term", "iconTemplate"] }, { kind: "component", type: CyclesEmissionsChartComponent, selector: "he-cycles-emissions-chart", inputs: ["cycles"] }, { kind: "component", type: CyclesFunctionalUnitMeasureComponent, selector: "he-cycles-functional-unit-measure", inputs: ["cycle"] }, { kind: "component", type: CyclesNodesTimelineComponent, selector: "he-cycles-nodes-timeline", inputs: ["recalculatedValues", "dataState"] }, { kind: "component", type: CyclesResultComponent, selector: "he-cycles-result", inputs: ["cycles"] }, { kind: "pipe", type: CompoundPipe, name: "compound" }, { kind: "pipe", type: DefaultPipe, name: "default" }, { kind: "pipe", type: EllipsisPipe, name: "ellipsis" }, { kind: "pipe", type: KeyToLabelPipe, name: "keyToLabel" }, { kind: "pipe", type: PrecisionPipe, name: "precision" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
7674
7674
  }
7675
7675
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.8", ngImport: i0, type: CyclesNodesComponent, decorators: [{
7676
7676
  type: Component$1,
7677
- args: [{ selector: 'he-cycles-nodes', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"tabs is-mb-1\" *ngIf=\"isGroupNode()\">\n <ul>\n <li *ngFor=\"let term of groupNodeTerms()\" [class.is-active]=\"selectedGroupTerm() === term\">\n <a (click)=\"selectedGroupTerm.set(term)\">{{ term.name }}</a>\n </li>\n </ul>\n</div>\n\n<div class=\"columns is-variable is-align-items-center is-2 is-m-0\" *ngIf=\"hasData()\">\n <div class=\"column\">\n <ng-container *ngIf=\"selectedView() === View.table\">\n <button\n class=\"button is-small is-ghost\"\n (click)=\"showDownload = true\"\n ngbTooltip=\"Download as CSV\"\n placement=\"bottom\">\n <fa-icon icon=\"download\" size=\"lg\"></fa-icon>\n </button>\n </ng-container>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"selectedView() === View.table\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter terms by name\"\n (search)=\"filterByTerm($event)\"></he-search-extend>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"views()?.length > 1\">\n <div class=\"field has-addons\">\n <div class=\"control\" *ngFor=\"let view of views()\">\n <button class=\"button is-small\" [class.is-selected]=\"selectedView() === view\" (click)=\"selectedView.set(view)\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"viewIcon[view]\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">{{ view }}</span>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<ng-container *ngIf=\"isNodeKeyAllowed()\">\n <ng-container [ngSwitch]=\"selectedView()\">\n <div class=\"is-px-3 is-pb-3\" *ngSwitchCase=\"View.table\">\n <ng-container *ngIf=\"hasData(); else emptyTable\">\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr class=\"has-text-weight-bold\" *ngIf=\"dataKeys().length > 1\">\n <th class=\"width-auto\"></th>\n <th [class.is-hidden]=\"isGroupNode()\"></th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <ng-container *ngIf=\"data()[dataKey]?.length\">\n <th [attr.colspan]=\"data()[dataKey].length\" [class.has-border-right]=\"!dataKeyLast\">\n <span>{{ dataKey | keyToLabel }}</span>\n </th>\n </ng-container>\n </ng-container>\n </tr>\n\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\"></th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <th\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [attr.title]=\"node.value.term.name\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <he-node-link [node]=\"node.value.term\">\n <span [innerHtml]=\"node.value.term.name | ellipsis: 30 | compound\"></span>\n </he-node-link>\n </th>\n </ng-container>\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <a [href]=\"baseUrl + '/schema/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <th\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [attr.title]=\"node.value.term.units\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span [innerHtml]=\"node.value.term.units | compound\"></span>\n <he-terms-units-description\n class=\"is-inline-block is-ml-2\"\n [term]=\"node.value.term\"></he-terms-units-description>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let cycle of cycles(); trackBy: trackById; let cycleIndex = index\">\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycle.term || cycle\">\n <span>{{ cycleIndex + 1 }}. {{ defaultLabel(cycle) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <he-cycles-functional-unit-measure [cycle]=\"cycles()[0]\"></he-cycles-functional-unit-measure>\n </td>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <td\n class=\"is-nowrap\"\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span\n *ngIf=\"node.value.values[cycle['@id']]; else emptyValue\"\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"\n togglePopover(p, { data: node.value.values[cycle['@id']], cycle: cycle, key: dataKey })\n \">\n <span pointer>\n {{\n propertyValue(node.value.values[cycle['@id']].value, node.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"_dataState()\"\n [node]=\"node.value.values[cycle['@id']].node\"\n key=\"value\"></he-blank-node-state>\n </span>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </ng-container>\n </div>\n\n <ng-container *ngSwitchCase=\"View.chart\">\n <ng-container [ngSwitch]=\"firstNodeKey()\">\n <he-cycles-result *ngSwitchCase=\"BlankNodesKey.inputs\" [cycles]=\"cycles()\"></he-cycles-result>\n <he-cycles-emissions-chart\n *ngSwitchCase=\"BlankNodesKey.emissions\"\n [cycles]=\"cycles()\"></he-cycles-emissions-chart>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"View.timeline\">\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n\n <div class=\"is-px-3 is-pb-3\">\n <he-cycles-nodes-timeline\n [recalculatedValues]=\"timelineValues()\"\n [dataState]=\"_dataState()\"></he-cycles-nodes-timeline>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"View.logs\">\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n\n <div class=\"tabs is-mb-2\" *ngIf=\"_nodeKeys().length > 1\">\n <ul>\n <li *ngFor=\"let nodeKey of _nodeKeys()\" [class.is-active]=\"selectedNodeKey() === nodeKey\">\n <a (click)=\"selectedNodeKey.set(nodeKey)\">{{ nodeKey | keyToLabel }}</a>\n </li>\n </ul>\n </div>\n\n <he-node-logs-models\n *ngIf=\"selectedNode()\"\n [node]=\"selectedNode()\"\n [nodeKey]=\"selectedNodeKey()\"\n [logsKey]=\"selectedLogsKey()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [filterTermTypes]=\"filterTermTypes()\"></he-node-logs-models>\n </ng-container>\n </ng-container>\n</ng-container>\n\n<he-node-csv-export-confirm\n *ngIf=\"showDownload\"\n [nodes]=\"cycles()\"\n [filename]=\"csvFilename()\"\n [isUpload]=\"false\"\n [headerKeys]=\"headerKeys()\"\n (closed)=\"showDownload = false\"></he-node-csv-export-confirm>\n\n<ng-template #emptyTable>\n <div class=\"is-pt-3 has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n <span *ngIf=\"showSwitchToRecalculated()\">\n Switch to\n <code>recalculated</code>\n version.\n </span>\n </div>\n</ng-template>\n\n<ng-template #emptyValue>\n <span>-</span>\n</ng-template>\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p>\n <b>{{ defaultLabel(node) }}</b>\n </p>\n <he-node-value-details\n [data]=\"data\"\n [dataState]=\"_dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"key\"></he-node-value-details>\n</ng-template>\n\n<ng-template #selectCycle>\n <div class=\"field has-addons is-py-2 is-px-3\" *ngIf=\"cycles().length > 1\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select a Cycle</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n <option *ngFor=\"let value of cycles(); let cycleIndex = index\" [value]=\"cycleIndex\">\n {{ cycleIndex + 1 }}. {{ defaultLabel(value) }}\n </option>\n </select>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}\n"] }]
7677
+ args: [{ selector: 'he-cycles-nodes', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"tabs is-mb-1\" *ngIf=\"isGroupNode()\">\n <ul>\n <li *ngFor=\"let term of groupNodeTerms()\" [class.is-active]=\"selectedGroupTerm() === term\">\n <a (click)=\"selectedGroupTerm.set(term)\">{{ term.name }}</a>\n </li>\n </ul>\n</div>\n\n<div class=\"columns is-variable is-align-items-center is-2 is-m-0\" *ngIf=\"hasData()\">\n <div class=\"column\">\n <ng-container *ngIf=\"selectedView() === View.table\">\n <button\n class=\"button is-small is-ghost\"\n (click)=\"showDownload = true\"\n ngbTooltip=\"Download as CSV\"\n placement=\"bottom\">\n <fa-icon icon=\"download\" size=\"lg\"></fa-icon>\n </button>\n </ng-container>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"selectedView() === View.table\">\n <he-search-extend\n class=\"is-secondary is-small\"\n placeholder=\"Filter terms by name\"\n (search)=\"filterByTerm($event)\"></he-search-extend>\n </div>\n <div class=\"column is-narrow\" *ngIf=\"views()?.length > 1\">\n <div class=\"field has-addons\">\n <div class=\"control\" *ngFor=\"let view of views()\">\n <button class=\"button is-small\" [class.is-selected]=\"selectedView() === view\" (click)=\"selectedView.set(view)\">\n <span class=\"icon is-small\">\n <fa-icon [icon]=\"viewIcon[view]\" aria-hidden=\"true\"></fa-icon>\n </span>\n <span class=\"is-hidden-mobile\">{{ view }}</span>\n </button>\n </div>\n </div>\n </div>\n</div>\n\n<ng-container *ngIf=\"isNodeKeyAllowed()\">\n <ng-container [ngSwitch]=\"selectedView()\">\n <div class=\"is-px-3 is-pb-3\" *ngSwitchCase=\"View.table\">\n <ng-container *ngIf=\"hasData(); else emptyTable\">\n <he-data-table class=\"mb-1 is-small\" [small]=\"true\" maxHeight=\"320\">\n <table class=\"table is-fullwidth is-narrow is-striped\">\n <thead>\n <tr class=\"has-text-weight-bold\" *ngIf=\"dataKeys().length > 1\">\n <th class=\"width-auto\"></th>\n <th [class.is-hidden]=\"isGroupNode()\"></th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <ng-container *ngIf=\"data()[dataKey]?.length\">\n <th [attr.colspan]=\"data()[dataKey].length\" [class.has-border-right]=\"!dataKeyLast\">\n <span>{{ dataKey | keyToLabel }}</span>\n </th>\n </ng-container>\n </ng-container>\n </tr>\n\n <tr class=\"has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\"></th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <th\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [attr.title]=\"node.value.term.name\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <he-node-link [node]=\"node.value.term\">\n <span [innerHtml]=\"node.value.term.name | ellipsis: 30 | compound\"></span>\n </he-node-link>\n </th>\n </ng-container>\n </tr>\n <tr class=\"is-italic has-text-weight-semibold\">\n <th class=\"width-auto has-border-right\"></th>\n <th class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <a [href]=\"baseUrl + '/schema/Cycle#functionalUnit'\" target=\"_blank\">Functional unit</a>\n </th>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <th\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [attr.title]=\"node.value.term.units\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span [innerHtml]=\"node.value.term.units | compound\"></span>\n <he-terms-units-description\n class=\"is-inline-block is-ml-2\"\n [term]=\"node.value.term\"></he-terms-units-description>\n </th>\n </ng-container>\n </tr>\n </thead>\n <tbody>\n <ng-container *ngFor=\"let cycle of cycles(); trackBy: trackById; let cycleIndex = index\">\n <tr>\n <td class=\"width-auto has-border-right\" [attr.title]=\"defaultLabel(cycle)\">\n <he-node-link [node]=\"cycle.term || cycle\">\n <span>{{ cycleIndex + 1 }}. {{ defaultLabel(cycle) }}</span>\n </he-node-link>\n </td>\n <td class=\"has-border-right\" [class.is-hidden]=\"isGroupNode()\">\n <he-cycles-functional-unit-measure [cycle]=\"cycle\"></he-cycles-functional-unit-measure>\n </td>\n\n <ng-container *ngFor=\"let dataKey of dataKeys(); let dataKeyLast = last\">\n <td\n class=\"is-nowrap\"\n *ngFor=\"let node of data()[dataKey]; let nodeLast = last\"\n [class.has-border-right]=\"dataKeys().length > 1 && !dataKeyLast && nodeLast\">\n <span\n *ngIf=\"node.value.values[cycle['@id']]; else emptyValue\"\n class=\"trigger-popover\"\n [ngbPopover]=\"details\"\n [autoClose]=\"'outside'\"\n popoverClass=\"is-narrow\"\n triggers=\"manual\"\n #p=\"ngbPopover\"\n placement=\"left\"\n container=\"body\"\n (click)=\"\n togglePopover(p, { data: node.value.values[cycle['@id']], cycle: cycle, key: dataKey })\n \">\n <span pointer>\n {{\n propertyValue(node.value.values[cycle['@id']].value, node.value.term['@id'])\n | precision: 3\n | default: '-'\n }}\n </span>\n <he-blank-node-state\n class=\"ml-1\"\n [dataState]=\"_dataState()\"\n [node]=\"node.value.values[cycle['@id']].node\"\n key=\"value\"></he-blank-node-state>\n </span>\n </td>\n </ng-container>\n </tr>\n </ng-container>\n </tbody>\n </table>\n </he-data-table>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </ng-container>\n </div>\n\n <ng-container *ngSwitchCase=\"View.chart\">\n <ng-container [ngSwitch]=\"firstNodeKey()\">\n <he-cycles-result *ngSwitchCase=\"BlankNodesKey.inputs\" [cycles]=\"cycles()\"></he-cycles-result>\n <he-cycles-emissions-chart\n *ngSwitchCase=\"BlankNodesKey.emissions\"\n [cycles]=\"cycles()\"></he-cycles-emissions-chart>\n </ng-container>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"View.timeline\">\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n\n <div class=\"is-px-3 is-pb-3\">\n <he-cycles-nodes-timeline\n [recalculatedValues]=\"timelineValues()\"\n [dataState]=\"_dataState()\"></he-cycles-nodes-timeline>\n\n <he-blank-node-state-notice [dataState]=\"_dataState()\"></he-blank-node-state-notice>\n </div>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"View.logs\">\n <ng-container *ngTemplateOutlet=\"selectCycle\"></ng-container>\n\n <div class=\"tabs is-mb-2\" *ngIf=\"_nodeKeys().length > 1\">\n <ul>\n <li *ngFor=\"let nodeKey of _nodeKeys()\" [class.is-active]=\"selectedNodeKey() === nodeKey\">\n <a (click)=\"selectedNodeKey.set(nodeKey)\">{{ nodeKey | keyToLabel }}</a>\n </li>\n </ul>\n </div>\n\n <he-node-logs-models\n *ngIf=\"selectedNode()\"\n [node]=\"selectedNode()\"\n [nodeKey]=\"selectedNodeKey()\"\n [logsKey]=\"selectedLogsKey()\"\n [originalValues]=\"selectedOriginalValues()\"\n [recalculatedValues]=\"selectedRecalculatedValues()\"\n [filterTermTypes]=\"filterTermTypes()\"></he-node-logs-models>\n </ng-container>\n </ng-container>\n</ng-container>\n\n<he-node-csv-export-confirm\n *ngIf=\"showDownload\"\n [nodes]=\"cycles()\"\n [filename]=\"csvFilename()\"\n [isUpload]=\"false\"\n [headerKeys]=\"headerKeys()\"\n (closed)=\"showDownload = false\"></he-node-csv-export-confirm>\n\n<ng-template #emptyTable>\n <div class=\"is-pt-3 has-text-centered\">\n <span>No data available</span>\n <span class=\"is-pl-1\" [class.is-hidden]=\"!filterTerm()\">matching your search criteria</span>\n <span>.</span>\n <span *ngIf=\"showSwitchToRecalculated()\">\n Switch to\n <code>recalculated</code>\n version.\n </span>\n </div>\n</ng-template>\n\n<ng-template #emptyValue>\n <span>-</span>\n</ng-template>\n\n<ng-template #details let-node=\"cycle\" let-data=\"data\" let-key=\"key\">\n <p>\n <b>{{ defaultLabel(node) }}</b>\n </p>\n <he-node-value-details\n [data]=\"data\"\n [dataState]=\"_dataState()\"\n [nodeType]=\"node['@type']\"\n [dataKey]=\"key\"></he-node-value-details>\n</ng-template>\n\n<ng-template #selectCycle>\n <div class=\"field has-addons is-py-2 is-px-3\" *ngIf=\"cycles().length > 1\">\n <div class=\"control\">\n <span class=\"button is-small is-static is-secondary\">Select a Cycle</span>\n </div>\n <div class=\"control is-expanded\">\n <div class=\"select is-small is-fullwidth is-secondary\">\n <select (change)=\"selectIndex($event)\">\n <option *ngFor=\"let value of cycles(); let cycleIndex = index\" [value]=\"cycleIndex\">\n {{ cycleIndex + 1 }}. {{ defaultLabel(value) }}\n </option>\n </select>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: ["fa-icon{display:inline-block;width:10px}he-data-table ::ng-deep .table thead tr th:nth-child(2),he-data-table ::ng-deep .table tbody tr td:nth-child(2){max-width:102px;width:102px}\n"] }]
7678
7678
  }], ctorParameters: function () { return [{ type: HeNodeStoreService }]; }, propDecorators: { dataState: [{
7679
7679
  type: Input
7680
7680
  }], nodeKeys: [{